Skip to content

Add second I2S output #16

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
73 changes: 73 additions & 0 deletions AudioMerge_F32.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
#ifndef _AudioMerge_I16toI32_h
#define _AudioMerge_I16toI32_h

#include <AudioStream_F32.h>

// class AudioMerge_I16toI32 : public AudioStream_F32 //receive Int and transmits Float
class AudioMerge_I16toI32 : public AudioStream //receive Int and transmits Float
{
//GUI: inputs:2, outputs:1 //this line used for automatic generation of GUI node
public:
// AudioMerge_I16toI32(void) : AudioStream_F32(2, inputQueueArray_f32) { }; // specify two inputs here
// AudioMerge_I16toI32(const AudioSettings_F32 &settings) : AudioStream_F32(2, inputQueueArray_f32) { }; // specify 2 inputs here

AudioMerge_I16toI32(void) : AudioStream(2, inputQueueArray) { }; // specify two inputs here
AudioMerge_I16toI32(const AudioSettings_F32 &settings) : AudioStream(2, inputQueueArray) { }; // specify 2 inputs here


void update(void) {
//get the Int16 blocks
audio_block_t *int_block_1;
audio_block_t *int_block_2;
int_block_1 = AudioStream::receiveReadOnly(0); // first int16 data block
int_block_2 = AudioStream::receiveReadOnly(1); // second int16 data block
if (int_block_1 == NULL) return;
if (int_block_2 == NULL) {
AudioStream::release(int_block_1);
return;
}

// Allocate a single float block
audio_block_f32_t *float_block;
float_block = AudioStream_F32::allocate_f32();
if (float_block == NULL) {
AudioStream::release(int_block_1);
AudioStream::release(int_block_2);
return;
}

// Merge two I16 streams into a single F32 stream
mergeAudio_I16toF32(int_block_1, int_block_2, float_block, float_block->length);

//transmit the audio and return it to the system
AudioStream_F32::transmit(float_block, 0);
AudioStream_F32::release(float_block);
AudioStream::transmit(int_block_1);
AudioStream::transmit(int_block_2);
AudioStream::release(int_block_1);
AudioStream::release(int_block_2);
};

static void mergeAudio_I16toF32(audio_block_t *in_1, audio_block_t *in_2, audio_block_f32_t *out, int len) {
// const float MAX_INT_16 = 32768.0;
// const float MAX_INT_32 = 2147483648.0;

for (int i = 0; i < len; i++) {
// Convert to unsigned
uint16_t u1 = (uint16_t)in_1->data[i];
uint16_t u2 = (uint16_t)in_2->data[i];
uint32_t u_combined = (u1 << 16) | u2;
out->data[i] = (float)u_combined; // this will have rounding errors
}
arm_scale_f32(out->data, 1./2147483648., out->data, out->length); // this puts it between 0 and 2.0
arm_offset_f32(out->data, -1., out->data, out->length); // this scales it to -1.0 and +1.0
}

private:
audio_block_f32_t *inputQueueArray_f32[2];
audio_block_t *inputQueueArray[2];

};


#endif
2 changes: 2 additions & 0 deletions OpenAudio_ArduinoLibrary.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include <AudioFilterFIR_F32.h>
#include <AudioFilterIIR_F32.h>
#include "AudioLMSDenoiseNotch_F32.h"
#include "AudioMerge_F32.h"
#include "AudioMixer_F32.h"
#include "AudioMultiply_F32.h"
#include "AudioSettings_F32.h"
Expand All @@ -26,6 +27,7 @@
#include "input_spdif3_f32.h"
#include "async_input_spdif3_F32.h"
#include "output_i2s_f32.h"
#include "output_i2s2_f32.h"
#include "output_spdif3_f32.h"
#include "play_queue_f32.h"
#include "record_queue_f32.h"
Expand Down
34 changes: 34 additions & 0 deletions examples/TestSecondI2SOutput/TestSecondI2SOutput.ino
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
#include <Audio.h>
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include <SerialFlash.h>
#include "OpenAudio_ArduinoLibrary.h"

// GUItool: begin automatically generated code
AudioSynthWaveformSine_F32 sine2; //xy=179,339
AudioSynthWaveformSine_F32 sine1; //xy=184,267
AudioOutputI2S2_F32 audio_out; //xy=600,261
AudioConnection_F32 pc1(sine1, 0, audio_out, 0);
AudioConnection_F32 pc2(sine2, 0, audio_out, 1);
AudioControlSGTL5000 sgtl5000_1; //xy=591,96
// GUItool: end automatically generated code

void setup(void) {

AudioMemory(4);
AudioMemory_F32(4);

sgtl5000_1.enable();

sine1.frequency(300);
sine1.amplitude(0.5);
sine1.begin();

sine2.frequency(600);
sine2.amplitude(0.8);
sine2.begin();

}

void loop() {}
Loading