Problema con control remoto receptor y emisor SOLUCIONADO

Hola, estoy queriendo hacer un amplificador con varias entradas y salidas y también ponerle un modulo de bluetooth y radio. Con arduino quiero manejar las entradas y salidas y reemplazar el control remoto original del bluetooth xq es horrible y sería mas practico tener un solo control.
Para hacer esto agarre 2 códigos que encontré en internet y los modifiqué, por separado me andan bien, pero no encuentro la manera de unirlos. LLevo 3 dias rompiéndome la cabeza y no lo entiendo
pongo los codigos originales que están mas fáciles de entender.

este es el codigo para seleccionar las entradas y salidas

 #include <IRremote.h>
     
    int RECV_PIN = 12; // the pin where you connect the output pin of TSOP4838
    int led1 = 8;
    int led2 = 9;
    int led3 = 10;
    int led4 = 11;
    int itsONled[] = {0,0,0,0,0};
    #define code1  33772 // code received from button A
    #define code2  52972 // code received from button B
    #define code3  3494 // code received from button C
    #define code4  65160 // code received from button D     
    IRrecv irrecv(RECV_PIN);
     
    decode_results results;
     
    void setup()
    {
      Serial.begin(9600);   // you can comment this line
      irrecv.enableIRIn();  // Start the receiver
      pinMode(led1, OUTPUT);
      pinMode(led2, OUTPUT);
      pinMode(led3, OUTPUT);
      pinMode(led4, OUTPUT);
    }
     
    void loop() {
      if (irrecv.decode(&results)) {
        unsigned int value = results.value;
        switch(value) {
           case code1:
             if(itsONled[1] == 1) {        // if first led is on then
                digitalWrite(led1, LOW);   // turn it off when button is pressed
                itsONled[1] = 0;           // and set its state as off
             } else {                      // else if first led is off
                 digitalWrite(led1, HIGH); // turn it on when the button is pressed
                 itsONled[1] = 1;          // and set its state as on
             }
              break; 
           case code2:
             if(itsONled[2] == 1) {
                digitalWrite(led2, LOW);
                itsONled[2] = 0;
             } else {
                 digitalWrite(led2, HIGH);
                 itsONled[2] = 1;
             }
              break;
           case code3:
             if(itsONled[3] == 1) {
                digitalWrite(led3, LOW);
                itsONled[3] = 0;
             } else {
                 digitalWrite(led3, HIGH);
                 itsONled[3] = 1;
             }
              break;    
                case code4:
             if(itsONled[4] == 1) {
                digitalWrite(led4, LOW);
                itsONled[4] = 0;
             } else {
                 digitalWrite(led4, HIGH);
                 itsONled[4] = 1;
             }
              break;      
        }
        Serial.println(value); // you can comment this line
        irrecv.resume(); // Receive the next value
      }
    }

y este es el codigo para reemplazar el control remoto

#include <IRremote.h>

//Mensajes IR del mando universal (NEC)
//Mensajes IR del mando universal (NEC)
const unsigned long OnOff = 0xC2E218E7;           
const unsigned long channelUp = 0xC2E2708F;       
const unsigned long channelDown = 0xC2E2E817;     
const unsigned long volumeUp = 0xC2E2D827;       
const unsigned long volumeDown = 0xC2E2A857;       

//Mensajes IR Samsung TV
const unsigned long tvOnOff = 0xFF629D;
const unsigned long tvChannelUp = 0xFFC23D;
const unsigned long tvChannelDown = 0xFF02FD;
const unsigned long tvVolumeUp = 0xFFB04F;
const unsigned long tvVolumeDown = 0xFFE01F;

const int RECV_PIN = 11;


IRrecv irrecv(RECV_PIN);
decode_results results;
IRsend irsend;

//Prototipos de las funciones
void samsungTVControl(unsigned long IRValue);


void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn();
}

void loop() {
  
  if (irrecv.decode(&results)) { 
    samsungTVControl(results.value);
    //Hay que volver a llamar a enableIRIn
    //porque al utilizar el emisor se desactiva el receptor
    irrecv.enableIRIn();
    delay(200);
    //Después de recibir un mensaje IR, se tiene que volver a llamar
    //a la función resume() para resetear el receptor y prepararlo
    //para recibir el siguiente mensaje IR.
    Serial.println(results.value, HEX);
    irrecv.resume();
  }
  delay(200);
}

void samsungTVControl(unsigned long IRValue){
  switch(IRValue){
    case OnOff:
      irsend.sendNEC(tvOnOff, 32);
      break;

    case channelUp:
      irsend.sendNEC(tvChannelUp, 32);
      break;

    case channelDown:
      irsend.sendNEC(tvChannelDown, 32);
      break;

    case volumeUp:
      irsend.sendNEC(tvVolumeUp, 32);
      break;

    case volumeDown:
      irsend.sendNEC(tvVolumeDown, 32);
      break;
    
    default:
    
          Serial.println("Not Samsung IR Control");   
      break;
  }
}

este ultimo funciona con librería IRremote 2.0.1, con otras mas nuevas no funciona.
Espero se entienda lo que quise decir y que me puedan ayudar. quizas sea muy facil de unirlos pero soy muy principiante, empecé hace menos de un mes y esto me superó

Creo que le encontré la vuelta, todavía no funciona completo pero si en gran parte. toqueteando voy a conseguir que funcione todo. Gracias!

Por si a alguien le sirve lo solucioné sacando lo del void loop del primer código y se lo agregué a la función de abajo en el segundo código y cambié const unsigned long por #define, no se para que es eso y me confundía.
Primero intenté poner todo dentro del void loop y no funcionó, al emitir algún código se colgaba. Después quise hacer otra función abajo y tampoco lo logré. -Tengo que seguir estudiando y practicando mucho.
Saludos

#include <IRremote.h>

//Mensajes IR del mando DVD
#define OnOff  0xC2E218E7              
#define channelUp  0xC2E2708F           
#define channelDown  0xC2E2E817         
#define volumeUp  0xC2E2D827           
#define volumeDown  0xC2E2A857  
        
//Mensajes IR del mando universal (NEC)
 
#define Mode  0xFF629D     
#define Next  0xFFC23D                  
#define Back  0xFF02FD
#define Scan  0xFFB04F
#define EQ  0xFFE01F

    #define code1  33772 // code received from button A
    #define code2  52972 // code received from button B
    #define code3  3494 // code received from button C
    #define code4  65160 // code received from button D 
    int led1 = 8;
    int led2 = 9;
    int led3 = 10;
    int led4 = 12;
    int itsONled[] = {0,0,0,0,0};
        
    const int RECV_PIN = 11;


IRrecv irrecv(RECV_PIN);
decode_results results;
IRsend irsend;

//Prototipos de las funciones
void value(unsigned IRValue);


void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn();
  pinMode(led1, OUTPUT);
      pinMode(led2, OUTPUT);
      pinMode(led3, OUTPUT);
      pinMode(led4, OUTPUT);
}

void loop() {
  
  if (irrecv.decode(&results)) { 
    value(results.value);
     irrecv.enableIRIn();
     delay(100);
     irrecv.resume();
  }
    delay(100);
}

void value(unsigned IRValue){
  switch(IRValue){
    case OnOff:
      irsend.sendNEC(Mode, 32);
      break;

    case channelUp:
      irsend.sendNEC(Next, 32);
      break;

    case channelDown:
      irsend.sendNEC(Back, 32);
      break;

    case volumeUp:
      irsend.sendNEC(Scan, 32);
      break;

    case volumeDown:
      irsend.sendNEC(EQ, 32);
      break;
    
    default:
    
           
      break;
      
    case code1:
             if(itsONled[1] == 1) {        // if first led is on then
                digitalWrite(led1, LOW);   // turn it off when button is pressed
                itsONled[1] = 0;           // and set its state as off
             } else {                      // else if first led is off
                 digitalWrite(led1, HIGH); // turn it on when the button is pressed
                 itsONled[1] = 1;          // and set its state as on
             }
              break; 
           case code2:
             if(itsONled[2] == 1) {
                digitalWrite(led2, LOW);
                itsONled[2] = 0;
             } else {
                 digitalWrite(led2, HIGH);
                 itsONled[2] = 1;
             }
              break;
           case code3:
             if(itsONled[3] == 1) {
                digitalWrite(led3, LOW);
                itsONled[3] = 0;
             } else {
                 digitalWrite(led3, HIGH);
                 itsONled[3] = 1;
             }
              break;    
                case code4:
             if(itsONled[4] == 1) {
                digitalWrite(led4, LOW);
                itsONled[4] = 0;
             } else {
                 digitalWrite(led4, HIGH);
                 itsONled[4] = 1;
             }
              break;      
        }
         
      }