mirror of
https://github.com/arendst/Tasmota.git
synced 2025-07-28 13:16:32 +00:00
Audio change of configuration file format (#19585)
This commit is contained in:
parent
5d97a73ddf
commit
74900edc96
@ -44,36 +44,36 @@
|
|||||||
|
|
||||||
typedef struct{
|
typedef struct{
|
||||||
struct{
|
struct{
|
||||||
uint32_t version : 8 = 0;
|
uint8_t version = 0; // B00
|
||||||
|
|
||||||
// runtime options, will be saved but ignored on setting read
|
// runtime options, will be saved but ignored on setting read
|
||||||
uint32_t duplex : 1 = 0; // depends on GPIO setting and SOC caps, DIN and DOUT on same port in GPIO means -> try to use duplex if possible
|
bool duplex = 0; // B01 - depends on GPIO setting and SOC caps, DIN and DOUT on same port in GPIO means -> try to use duplex if possible
|
||||||
uint32_t tx : 1 = 0; // depends on GPIO setting
|
bool tx = 0; // B02 - depends on GPIO setting
|
||||||
uint32_t rx : 1 = 0; // depends on GPIO setting
|
bool rx = 0; // B03 - depends on GPIO setting
|
||||||
|
uint32_t spare01; // B04-07
|
||||||
} sys;
|
} sys;
|
||||||
struct {
|
struct {
|
||||||
uint32_t mode : 2 = 0; // bit 0+1 STD = 0, PDM = 1, TDM = 2
|
uint8_t mode = 0; // B00 STD = 0, PDM = 1, TDM = 2
|
||||||
uint32_t apll : 1 = 1; // bit 2 - will be ignored on unsupported SOC's
|
bool apll = 1; // B01 - will be ignored on unsupported SOC's
|
||||||
uint32_t mono : 1 = 0; // bit 3 0 = stereo, 1 = mono
|
bool channels = 0; // B02 - 1 = mono, 2 = stereo
|
||||||
uint32_t codec : 1 = 0; // bit 4 - S3 box only, unused for now
|
uint8_t codec = 0; // B03 - S3 box only, unused for now
|
||||||
uint32_t slot_config : 3 = 0; // bit 5-7 - slot configuration MSB = 0, PCM = 1, PHILIPS = 2
|
uint8_t slot_config = 0; // B04 - slot configuration MSB = 0, PCM = 1, PHILIPS = 2
|
||||||
uint32_t volume : 8 = 10; // bit 8-15
|
uint8_t volume = 10; // B05
|
||||||
uint32_t mclk_inv : 1 = 0; // bit 16 - invert mclk
|
bool mclk_inv = 0; // B06 - invert mclk
|
||||||
uint32_t bclk_inv : 1 = 0; // bit 17 - invert bclk
|
bool bclk_inv = 0; // B07 - invert bclk
|
||||||
uint32_t ws_inv : 1 = 0; // bit 18 - invert ws
|
bool ws_inv = 0; // B08 - invert ws
|
||||||
uint32_t spare02 : 13; // bit 19-31
|
uint8_t spare[7]; // B09-0F
|
||||||
} tx;
|
} tx;
|
||||||
struct {
|
struct {
|
||||||
struct{
|
uint32_t sample_rate = 32000; // B00-03
|
||||||
uint16_t sample_rate = 32000;
|
uint8_t gain = 30; // B04
|
||||||
uint8_t gain = 30;
|
uint8_t mode = 0; // B05 - STD = 0, PDM = 1, TDM = 2
|
||||||
uint8_t mode = 0; //STD = 0, PDM = 1, TDM = 2
|
|
||||||
|
|
||||||
uint8_t slot_mask : 2 = 1; // left = 1 /right = 2 /both = 3
|
uint8_t slot_mask = 1; // B06 - left = 1 /right = 2 /both = 3
|
||||||
uint8_t slot_mode : 1 = 0; // mono/stereo - 1 is added for both
|
uint8_t slot_mode = 0; // B07 - mono/stereo - 1 is added for both
|
||||||
uint8_t codec : 1 = 0; // unused for now
|
uint8_t codec = 0; // B08 - unused for now
|
||||||
uint8_t mp3_encoder : 1 = 1; // will be ignored without PS-RAM
|
uint8_t mp3_encoder = 1; // B09 - will be ignored without PS-RAM
|
||||||
};
|
uint8_t spare[6]; // B0A-0F
|
||||||
} rx;
|
} rx;
|
||||||
} tI2SSettings;
|
} tI2SSettings;
|
||||||
|
|
||||||
@ -189,13 +189,13 @@ public:
|
|||||||
// ------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------
|
||||||
// Getters
|
// Getters
|
||||||
inline uint8_t getTxMode(void) const { return _tx_mode; }
|
inline uint8_t getTxMode(void) const { return _tx_mode; }
|
||||||
inline bool getTxMono(void) const { return _tx_mono; }
|
inline uint8_t getTxChannels(void) const { return _tx_channels; }
|
||||||
inline bool getTxEnabled(void) const { return _tx_enabled; }
|
inline bool getTxEnabled(void) const { return _tx_enabled; }
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------
|
||||||
// Setters
|
// Setters
|
||||||
inline void setTxMode(uint8_t mode) { _tx_mode = mode; }
|
inline void setTxMode(uint8_t mode) { _tx_mode = mode; }
|
||||||
inline void setTxMono(bool mono) { _tx_mono = mono; }
|
inline void setTxChannels(uint8_t channels) { _tx_channels = channels; }
|
||||||
inline void setTxEnabled(bool enabled) { _tx_enabled = enabled; }
|
inline void setTxEnabled(bool enabled) { _tx_enabled = enabled; }
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------
|
||||||
@ -231,8 +231,8 @@ protected:
|
|||||||
// TX
|
// TX
|
||||||
uint8_t _tx_mode = EXTERNAL_I2S; // EXTERNAL_I2S = 0, INTERNAL_DAC = 1, INTERNAL_PDM = 2
|
uint8_t _tx_mode = EXTERNAL_I2S; // EXTERNAL_I2S = 0, INTERNAL_DAC = 1, INTERNAL_PDM = 2
|
||||||
bool _tx_enabled = false; // true = enabled, false = disabled
|
bool _tx_enabled = false; // true = enabled, false = disabled
|
||||||
bool _tx_mono = false; // true = mono, false = stereo
|
uint8_t _tx_channels = 2; // true = mono, false = stereo
|
||||||
i2s_chan_handle_t _tx_chan; // I2S channel handle, automatically computed
|
i2s_chan_handle_t _tx_chan; // I2S channel handle, automatically computed
|
||||||
|
|
||||||
// GPIOs for I2S
|
// GPIOs for I2S
|
||||||
gpio_num_t _gpio_mclk = GPIO_NUM_NC; // GPIO for master clock
|
gpio_num_t _gpio_mclk = GPIO_NUM_NC; // GPIO for master clock
|
||||||
@ -254,8 +254,10 @@ void TasmotaAudioOutputI2S::loadSettings(void) {
|
|||||||
hertz = 16000;
|
hertz = 16000;
|
||||||
_i2s_on = false;
|
_i2s_on = false;
|
||||||
bps = I2S_DATA_BIT_WIDTH_16BIT;
|
bps = I2S_DATA_BIT_WIDTH_16BIT;
|
||||||
_tx_mono = audio_i2s.Settings->tx.mono;
|
_tx_channels = audio_i2s.Settings->tx.channels;
|
||||||
channels = _tx_mono ? I2S_SLOT_MODE_MONO : I2S_SLOT_MODE_STEREO;
|
if (_tx_channels == 0) { _tx_channels = 1; } // if zero channel default to mono
|
||||||
|
if (_tx_channels > 2) { _tx_channels = 2; } // if > 2 channels default to stereo
|
||||||
|
channels = (_tx_channels == 1) ? I2S_SLOT_MODE_MONO : I2S_SLOT_MODE_STEREO;
|
||||||
_tx_mode = EXTERNAL_I2S;
|
_tx_mode = EXTERNAL_I2S;
|
||||||
_tx_enabled = false;
|
_tx_enabled = false;
|
||||||
|
|
||||||
@ -309,7 +311,7 @@ int32_t TasmotaAudioOutputI2S::consumeSamples(int16_t *samples, size_t count) {
|
|||||||
int16_t left = samples[i*2 + LEFTCHANNEL];
|
int16_t left = samples[i*2 + LEFTCHANNEL];
|
||||||
int16_t right = samples[i*2 + RIGHTCHANNEL];
|
int16_t right = samples[i*2 + RIGHTCHANNEL];
|
||||||
|
|
||||||
if (this->_tx_mono) {
|
if (this->_tx_channels == 1) { // if mono, average the two samples
|
||||||
// Average the two samples and overwrite
|
// Average the two samples and overwrite
|
||||||
int32_t ttl = left + right;
|
int32_t ttl = left + right;
|
||||||
left = right = (ttl>>1) & 0xffff;
|
left = right = (ttl>>1) & 0xffff;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user