bool AudioControlpcm5242::volumeSetRange(select_wire wires, device dev, channel ch, int setRange)
{
range = setRange;
return true;
}
bool AudioControlpcm5242::volumeSetGain(select_wire wires, device dev, channel ch, float setGain) {
// Save gain and then change the volume
if (ch == 0){
gain1 = setGain;
gain2 = setGain;
if(debugToSerialPCM5242) Serial.print("Digital Gain PCM5242 ch0: "); Serial.println(gain1);
volumePCM5242(wires, dev, both, volume1);
}
if (ch == 1){
gain1 = setGain;
if(debugToSerialPCM5242) Serial.print("Digital Gain PCM5242 ch1: "); Serial.println(gain1);
volumePCM5242(wires, dev, left, volume1);
}
if (ch == 2){
gain2 = setGain;
if(debugToSerialPCM5242) Serial.print("Digital Gain PCM5242 ch2: "); Serial.println(gain2);
volumePCM5242(wires, dev, right, volume2);
}
return true;
}
bool AudioControlpcm5242::volumePCM5242(select_wire wires, device dev, channel_left_right ch, float level)
{
if(debugToSerialPCM5242) Serial.println("AudioControlpcm5242::volumePCM5242(select_wire wires, device dev, channel_left_right ch,float level)");
//normalize 0-1 to 48-255 for digital attenuation | 0 - 47 is digital gain
//int volume = 255 - ((level * (207 + gain1)) );
// if(debugToSerialPCM5242) Serial.print("volumePCM5242: "); Serial.println(volume);
int attenuation;
switch (ch) {
case left:
if(debugToSerialPCM5242) Serial.println("Write Left Volume");
// // Save and set the current volume + gain settings.
volume1 = level; // Save the current Digital Volume Level.
attenuation = (range - ((level * (range + gain1)) -48) );
Serial.print("gain: ");Serial.println(gain1);
Serial.print("range: ");Serial.println(range);
Serial.print("attenuation: ");Serial.println(attenuation);
// // Mute when at the bottom of the range
if (attenuation - 48 == range + gain1)
{
attenuation = 255;
}
writeRegister(wires, dev, Page_00, 0x3C, 0x00); // 00: The volume for Left and right channels are independent
writeRegister(wires, dev, Page_00, 0x3D, attenuation); // REG_DIGITAL_VOLUME_LEFT
break;
case right:
if(debugToSerialPCM5242) Serial.println("Write Right Volume");
// // Save and set the current volume + gain settings.
volume2 = level; // Save the current Digital Volume Level.
attenuation = (range - ((level * (range + gain2)) -48) );
Serial.print("gain: ");Serial.println(gain1);
Serial.print("range: ");Serial.println(range);
Serial.print("attenuation: ");Serial.println(attenuation);
// // Mute when at the bottom of the range
if (attenuation - 48 == range + gain1)
{
attenuation = 255;
}
writeRegister(wires, dev, Page_00, 0x3C, 0x00); // 00: The volume for Left and right channels are independent
writeRegister(wires, dev, Page_00, 0X3E, attenuation); // REG_DIGITAL_VOLUME_RIGHT
break;
case both:
if(debugToSerialPCM5242) Serial.println("Write Left/ Volume");
// // Save and set the current volume + gain settings.
volume1 = level; // Save the current Digital Volume Level.
volume2 = level; // Save the current Digital Volume Level.
attenuation = (range - ((level * (range + gain1)) -48) );
Serial.print("gain: ");Serial.println(gain1);
Serial.print("range: ");Serial.println(range);
Serial.print("attenuation: ");Serial.println(attenuation);
// // Mute when at the bottom of the range
if (attenuation - 48 == range + gain1)
{
attenuation = 255;
}
if(debugToSerialPCM5242) Serial.println("Write Left/Right Volume");
writeRegister(wires, dev, Page_00, 0x3C, 0x01); // 01: Right channel volume follows left channel setting
writeRegister(wires, dev, Page_00, 0x3D, attenuation); // Write Left/Right Volume
break;
}
if(debugToSerialPCM5242) Serial.println("AudioControlpcm5242::volumePCM5242(select_wire wires, device dev, channel_left_right ch,float level)");
if(debugToSerialPCM5242) Serial.println();
return true;
}