44 #define SCALE_AUDIO(x,bits) (bits > 8
? (x) >> (bits - 8
) : (x) << (8
- bits)) 45 #define SCALE_AUDIO_NEAR(x,bits) (bits > 9
? (x) >> (bits - 9
) : (x) << (9
- bits)) 46 #define CLIP_AUDIO(x) constrain((x), -244
,243
) 48 #define SCALE_AUDIO(x,bits) (bits > AUDIO_BITS ? (x) >> (bits - AUDIO_BITS) : (x) << (AUDIO_BITS - bits)) 49 #define SCALE_AUDIO_NEAR(x,bits) SCALE_AUDIO(x,bits) 50 #define CLIP_AUDIO(x) constrain((x), -AUDIO_BIAS, AUDIO_BIAS-1
) 56 #define AudioOutputStorage_t int 59 #define AudioOutput_t void 60 #define AudioOutput StereoOutput 80 #define AudioOutput MonoOutput 92 inline operator
AudioOutput_t()
const __attribute__((deprecated(
"Sketch generates stereo output, but Mozzi is configured for mono. Check mozzi_config.h."))) {
return _l; };
175 #if BYPASS_MOZZI_OUTPUT_BUFFER 177 inline bool canBufferAudioOutput();
185 inline uint32_t pdmCode8(uint16_t sample) {
187 static const byte fast_pdm_table[]{0, 0b00010000, 0b01000100,
188 0b10010010, 0b10101010, 0b10110101,
189 0b11011101, 0b11110111, 0b11111111};
191 static uint32_t lastwritten = 0;
192 static uint32_t nexttarget = 0;
198 nexttarget += sample;
199 nexttarget -= lastwritten;
200 lastwritten = nexttarget & 0b11110000000000000;
201 return fast_pdm_table[lastwritten >> 13];
205 inline uint32_t pdmCode32(uint16_t sample) {
206 uint32_t outbits = 0;
207 for (uint8_t i = 0; i < 4; ++i) {
208 outbits = outbits << 8;
209 outbits |= pdmCode8(sample);
218 #include "AudioConfigSAMD21.h" 219 inline void audioOutput(
const AudioOutput f)
221 analogWrite(AUDIO_CHANNEL_1_PIN, f.l()+AUDIO_BIAS);
228 #include "AudioConfigTeensy3_12bit.h" 229 inline void audioOutput(
const AudioOutput f)
231 analogWrite(AUDIO_CHANNEL_1_PIN, f.l()+AUDIO_BIAS);
238 #include "AudioConfigSTM32.h" 239 inline void audioOutput(
const AudioOutput f)
241 #if (AUDIO_MODE == HIFI) 242 pwmWrite(AUDIO_CHANNEL_1_PIN, (f.l()+AUDIO_BIAS) & ((1 << AUDIO_BITS_PER_CHANNEL) - 1));
243 pwmWrite(AUDIO_CHANNEL_1_PIN_HIGH, (f.l()+AUDIO_BIAS) >> AUDIO_BITS_PER_CHANNEL);
245 pwmWrite(AUDIO_CHANNEL_1_PIN, f.l()+AUDIO_BIAS);
246 #if (STEREO_HACK == true) 247 pwmWrite(AUDIO_CHANNEL_2_PIN, f.r()+AUDIO_BIAS);
256 #include "AudioConfigESP.h" 257 #if (ESP_AUDIO_OUT_MODE == PDM_VIA_I2S) 259 inline bool canBufferAudioOutput() {
260 return (i2s_available() >= PDM_RESOLUTION);
262 inline void audioOutput(
const AudioOutput f) {
263 for (uint8_t words = 0; words < PDM_RESOLUTION; ++words) {
264 i2s_write_sample(pdmCode32(f.l()));
267 #elif (ESP_AUDIO_OUT_MODE == EXTERNAL_DAC_VIA_I2S) 269 inline bool canBufferAudioOutput() {
270 return (i2s_available() >= PDM_RESOLUTION);
272 inline void audioOutput(
const AudioOutput f) {
273 i2s_write_lr(f.l(), f.r());
276 inline void audioOutput(
const AudioOutput f) {
278 for (uint8_t i = 0; i < PDM_RESOLUTION*4; ++i) {
289 #include "AudioConfigESP32.h" 293 static bool _esp32_can_buffer_next =
true;
294 #if (ESP32_AUDIO_OUT_MODE == INTERNAL_DAC) 295 static uint16_t _esp32_prev_sample[2];
296 #define ESP_SAMPLE_SIZE (2
*sizeof(uint16_t)) 297 #elif (ESP32_AUDIO_OUT_MODE == PT8211_DAC) 298 static int16_t _esp32_prev_sample[2];
299 #define ESP_SAMPLE_SIZE (2
*sizeof(int16_t)) 300 #elif (ESP32_AUDIO_OUT_MODE == PDM_VIA_I2S) 301 static uint32_t _esp32_prev_sample[PDM_RESOLUTION];
302 #define ESP_SAMPLE_SIZE (PDM_RESOLUTION*sizeof(uint32_t)) 305 inline bool esp32_tryWriteSample() {
306 size_t bytes_written;
307 i2s_write(i2s_num, &_esp32_prev_sample, ESP_SAMPLE_SIZE, &bytes_written, 0);
308 return (bytes_written != 0);
311 inline bool canBufferAudioOutput() {
312 if (_esp32_can_buffer_next)
return true;
313 _esp32_can_buffer_next = esp32_tryWriteSample();
314 return _esp32_can_buffer_next;
317 inline void audioOutput(
const AudioOutput f) {
318 #if (ESP32_AUDIO_OUT_MODE == INTERNAL_DAC) 319 _esp32_prev_sample[0] = (f.l() + AUDIO_BIAS) << 8;
320 #if (STEREO_HACK == true) 321 _esp32_prev_sample[1] = (f.r() + AUDIO_BIAS) << 8;
324 _esp32_prev_sample[1] = _esp32_prev_sample[0];
326 #elif (ESP32_AUDIO_OUT_MODE == PDM_VIA_I2S) 327 for (uint8_t i=0; i<PDM_RESOLUTION; ++i) {
328 _esp32_prev_sample[i] = pdmCode32(f.l() + AUDIO_BIAS);
332 _esp32_prev_sample[0] = f.l();
333 _esp32_prev_sample[1] = f.r();
335 _esp32_can_buffer_next = esp32_tryWriteSample();
344 #include "AudioConfigStandardPlus.h" 345 inline void audioOutput(
const AudioOutput f)
347 AUDIO_CHANNEL_1_OUTPUT_REGISTER = f.l()+AUDIO_BIAS;
348 #if (STEREO_HACK == true) 349 AUDIO_CHANNEL_2_OUTPUT_REGISTER = f.r()+AUDIO_BIAS;
357 #include "AudioConfigHiSpeed14bitPwm.h" 358 inline void audioOutput(
const AudioOutput f)
383 AUDIO_CHANNEL_1_highByte_REGISTER = (f.l()+AUDIO_BIAS) >> AUDIO_BITS_PER_REGISTER;
384 AUDIO_CHANNEL_1_lowByte_REGISTER = (f.l()+AUDIO_BIAS) & ((1 << AUDIO_BITS_PER_REGISTER) - 1);
390 #warning "Mozzi is configured to use an external void 'audioOutput(const AudioOutput f)' function. Please define one in your sketch" static MonoOutput from16Bit(int16_t l)
Construct an audio frame a zero-centered value known to be in the 16 bit range.
#define SCALE_AUDIO_NEAR(x, bits)
operator StereoOutput() const __attribute__((deprecated("Sketch generates mono output
Conversion to stereo operator: If used in a stereo config, returns identical channels (and gives a co...
StereoOutput()
Default contstructor.
static MonoOutput from8Bit(int16_t l)
Construct an audio frame from a zero-centered value known to be in the 8 bit range.
#define AUDIO_MODE
AUDIO_MODE holds the audio mode setting.
MonoOutput(AudioOutputStorage_t l=0)
Construct an audio frame from raw values (zero-centered)
#define STEREO_HACK
This sets an option for stereo output, a hack which requires variables audio_signal_1 and audio_signa...
static StereoOutput from8Bit(int16_t l, int16_t r)
static MonoOutput fromNBit(uint8_t bits, int32_t l)
32bit overload.
MonoOutput & clip()
Clip frame to supported range.
#define SCALE_AUDIO(x, bits)
This struct encapsulates one frame of mono audio output.
static StereoOutput from16Bit(int16_t l, int16_t r)
static StereoOutput fromNBit(uint8_t bits, int32_t l, int32_t r)
static MonoOutput fromAlmostNBit(uint8_t bits, int32_t l)
32bit overload.
StereoOutput(AudioOutputStorage_t l, AudioOutputStorage_t r)
Construct an audio frame from raw values (zero-centered)
#define STANDARD
Used to set AUDIO_MODE to STANDARD, STANDARD_PLUS, or HIFI.
#define EXTERNAL_AUDIO_OUTPUT
Defining this option as true in mozzi_config.h allows to completely customize the audio output...
static StereoOutput fromAlmostNBit(uint8_t bits, int32_t l, int32_t r)
#define AudioOutputStorage_t
The type used to store a single channel of a single frame, internally.