Skip to content

Commit 7b3579b

Browse files
committed
ES8388 input volume fix
Modified mapping of the 9 gain settings to 0..100 volume. Fixed error that previously set the gain to max regardless of volume. Minor change in i2c_bus_read_bytes to use global definition of I2C_END
1 parent 8779218 commit 7b3579b

File tree

3 files changed

+40
-23
lines changed

3 files changed

+40
-23
lines changed

src/Driver.h

Lines changed: 36 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,7 @@ class AudioDriverAC101Class : public AudioDriver {
337337
public:
338338
bool setMute(bool mute) { return ac101_set_voice_mute(mute); }
339339
bool setVolume(int volume) {
340-
return ac101_set_voice_volume(limitValue(volume));
340+
return ac101_set_voice_volume(limitValue(volume, 0, 100));
341341
};
342342
int getVolume() {
343343
int vol;
@@ -606,7 +606,7 @@ class AudioDriverES7210Class : public AudioDriver {
606606
bool setMute(bool mute) { return es7210_set_mute(mute) == RESULT_OK; }
607607
bool setVolume(int volume) {
608608
this->volume = volume;
609-
return es7210_adc_set_volume(limitValue(volume)) == RESULT_OK;
609+
return es7210_adc_set_volume(limitValue(volume, 0, 100)) == RESULT_OK;
610610
}
611611
int getVolume() { return volume; }
612612

@@ -637,7 +637,7 @@ class AudioDriverES7243Class : public AudioDriver {
637637
return es7243_adc_set_voice_mute(mute) == RESULT_OK;
638638
}
639639
bool setVolume(int volume) {
640-
return es7243_adc_set_voice_volume(limitValue(volume)) == RESULT_OK;
640+
return es7243_adc_set_voice_volume(limitValue(volume, 0, 100)) == RESULT_OK;
641641
}
642642
int getVolume() {
643643
int vol;
@@ -672,7 +672,7 @@ class AudioDriverES7243eClass : public AudioDriver {
672672
}
673673
bool setVolume(int volume) {
674674
this->volume = volume;
675-
return es7243e_adc_set_voice_volume(limitValue(volume)) == RESULT_OK;
675+
return es7243e_adc_set_voice_volume(limitValue(volume, 0, 100)) == RESULT_OK;
676676
}
677677
int getVolume() {
678678
int vol;
@@ -708,7 +708,7 @@ class AudioDriverES8156Class : public AudioDriver {
708708
}
709709
bool setVolume(int volume) {
710710
AD_LOGD("volume %d", volume);
711-
return es8156_codec_set_voice_volume(limitValue(volume)) == RESULT_OK;
711+
return es8156_codec_set_voice_volume(limitValue(volume, 0, 100)) == RESULT_OK;
712712
}
713713
int getVolume() {
714714
int vol;
@@ -740,7 +740,7 @@ class AudioDriverES8311Class : public AudioDriver {
740740
AudioDriverES8311Class(int i2cAddr = 0) { i2c_address = i2cAddr; }
741741
bool setMute(bool mute) { return es8311_set_voice_mute(mute) == RESULT_OK; }
742742
bool setVolume(int volume) {
743-
return es8311_codec_set_voice_volume(limitValue(volume)) == RESULT_OK;
743+
return es8311_codec_set_voice_volume(limitValue(volume, 0, 100)) == RESULT_OK;
744744
}
745745
int getVolume() {
746746
int vol;
@@ -785,7 +785,7 @@ class AudioDriverES8374Class : public AudioDriver {
785785
bool setMute(bool mute) { return es8374_set_voice_mute(mute) == RESULT_OK; }
786786
bool setVolume(int volume) {
787787
AD_LOGD("volume %d", volume);
788-
return es8374_codec_set_voice_volume(limitValue(volume)) == RESULT_OK;
788+
return es8374_codec_set_voice_volume(limitValue(volume, 0, 100)) == RESULT_OK;
789789
}
790790
int getVolume() {
791791
int vol;
@@ -847,7 +847,7 @@ class AudioDriverES8388Class : public AudioDriver {
847847
}
848848
bool setVolume(int volume) {
849849
AD_LOGD("volume %d", volume);
850-
return es8388_set_voice_volume(limitValue(volume)) == RESULT_OK;
850+
return es8388_set_voice_volume(limitValue(volume, 0, 100)) == RESULT_OK;
851851
}
852852
int getVolume() {
853853
int vol;
@@ -856,14 +856,36 @@ class AudioDriverES8388Class : public AudioDriver {
856856
}
857857

858858
bool setInputVolume(int volume) {
859-
// map values from 0 - 100 to 0 to 9 MIC_GAIN_MIN = -1,
859+
// map values from 0 - 100 to 0 to 8
860+
861+
// es_mic_gain_t: MIC_GAIN_MIN = -1, 0,3,6,9,12,15,18,21,24 MIC_GAIN_MAX = 25
862+
863+
// Vol: 0, 12.5, 25, 37.5, 50, 62.5, 75, 87.5, 100
864+
// idx: 0, 1, 2, 3, 4, 5, 6, 7, 8
865+
// dB/gain: 0, 3, 6, 9, 12, 15, 18, 21, 24
866+
// factor: 1, 2, 4, 8, 16, 32, 63, 126, 252
867+
868+
// es8388 Register 9 – ADC Control 1
869+
//dB MicL MicR
870+
// 0 0000 0000
871+
// 3 0001 0001
872+
// 6 0010 0010
873+
// 9 0011 0011
874+
//12 0100 0100
875+
//15 0101 0101
876+
//18 0110 0110
877+
//21 0111 0111
878+
//24 1000 1000
879+
860880
es_mic_gain_t gains[] = {MIC_GAIN_0DB, MIC_GAIN_3DB, MIC_GAIN_6DB,
861881
MIC_GAIN_9DB, MIC_GAIN_12DB, MIC_GAIN_15DB,
862-
MIC_GAIN_18DB, MIC_GAIN_21DB, MIC_GAIN_24DB,
863-
MIC_GAIN_MAX};
864-
int idx = limitValue(volume / 10, 9);
882+
MIC_GAIN_18DB, MIC_GAIN_21DB, MIC_GAIN_24DB};
883+
884+
int vol = limitValue(volume, 0, 100);
885+
int idx = map(vol, 0, 100, 0, 8);
886+
865887
es_mic_gain_t gain = gains[idx];
866-
AD_LOGD("input volume: %d -> gain %d", volume, gain);
888+
AD_LOGD("input volume: %d -> gain %d [dB] (idx: %d of 0..8)", volume, gain, idx);
867889
return setMicrophoneGain(gain);
868890
}
869891

@@ -899,7 +921,7 @@ class AudioDriverTAS5805MClass : public AudioDriver {
899921
bool setMute(bool mute) { return tas5805m_set_mute(mute) == RESULT_OK; }
900922
bool setVolume(int volume) {
901923
AD_LOGD("volume %d", volume);
902-
return tas5805m_set_volume(limitValue(volume)) == RESULT_OK;
924+
return tas5805m_set_volume(limitValue(volume, 0, 100)) == RESULT_OK;
903925
}
904926
int getVolume() {
905927
int vol;

src/DriverCommon.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@
1515
#define RESULT_OK 0 /*!< error_t value indicating success (no error) */
1616
#define RESULT_FAIL -1 /*!< Generic error_t code indicating failure */
1717
#define ERROR_INVALID_ARG 1
18-
#define I2C_END true
18+
19+
#define I2C_END true // wether to send a stop bit at the end of the transmission
1920

2021
#ifdef __cplusplus
2122
namespace audio_driver {

src/Utils/I2C.cpp

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,10 @@ error_t i2c_bus_write_bytes(i2c_bus_handle_t bus, int addr, uint8_t *reg,
1111
addr, reglen, datalen, reg[0], data[0]);
1212
TwoWire *p_wire = (TwoWire *)bus;
1313
assert(p_wire!=nullptr);
14-
//assert(reglen == 1);
15-
//assert(datalen == 1);
16-
1714
int result = RESULT_OK;
1815
p_wire->beginTransmission(addr);
1916
p_wire->write(reg, reglen);
2017
p_wire->write(data, datalen);
21-
//p_wire->write(reg[0]);
22-
//p_wire->write(data[0]);
23-
2418
int rc = p_wire->endTransmission(I2C_END);
2519
if (rc != 0) {
2620
AD_LOGE("->p_wire->endTransmission: %d", rc);
@@ -45,7 +39,7 @@ error_t i2c_bus_check(i2c_bus_handle_t bus, int addr) {
4539
}
4640

4741

48-
/// This method is used
42+
// this method is used !
4943
error_t i2c_bus_read_bytes(i2c_bus_handle_t bus, int addr, uint8_t *reg,
5044
int reglen, uint8_t *outdata, int datalen) {
5145
AD_LOGD("i2c_bus_read_bytes: addr=%d reglen=%d datalen=%d - reg=%d", addr,
@@ -64,7 +58,7 @@ error_t i2c_bus_read_bytes(i2c_bus_handle_t bus, int addr, uint8_t *reg,
6458
AD_LOGE("->p_wire->endTransmission: %d", rc);
6559
}
6660

67-
uint8_t result_len = p_wire->requestFrom((addr), datalen, (int) true);
61+
uint8_t result_len = p_wire->requestFrom((addr), datalen, I2C_END);
6862
if (result_len > 0) {
6963
result_len = p_wire->readBytes(outdata, datalen);
7064
} else {

0 commit comments

Comments
 (0)