I2S corrections

This commit is contained in:
Phil Schatzmann 2021-10-18 20:32:01 +02:00
parent 693efb83b9
commit 2a2bbb0e82
10 changed files with 50 additions and 39745 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1,46 +0,0 @@
cmake_minimum_required(VERSION 3.20)
# set the project name
project(mp3)
set (CMAKE_CXX_STANDARD 11)
set (DCMAKE_CXX_FLAGS "-Werror")
include(FetchContent)
option(BUILD_SHARED_LIBS "Build using shared libraries" OFF)
# Build with Portaudio
FetchContent_Declare(portaudio GIT_REPOSITORY "https://github.com/PortAudio/portaudio.git" GIT_TAG master )
FetchContent_GetProperties(portaudio)
if(NOT portaudio_POPULATED)
FetchContent_Populate(portaudio)
add_subdirectory(${portaudio_SOURCE_DIR})
endif()
# Build with Linux Arduino Emulator
FetchContent_Declare(arduino_emulator GIT_REPOSITORY "https://github.com/pschatzmann/Arduino-Emulator.git" GIT_TAG main )
FetchContent_GetProperties(arduino_emulator)
if(NOT arduino_emulator_POPULATED)
FetchContent_Populate(arduino_emulator)
add_subdirectory(${arduino_emulator_SOURCE_DIR})
endif()
# Build with arduino-audio-tools
FetchContent_Declare(arduino_audio_tools GIT_REPOSITORY "https://github.com/pschatzmann/arduino-audio-tools.git" GIT_TAG main )
FetchContent_GetProperties(arduino_audio_tools)
if(NOT arduino_audio_tools_POPULATED)
FetchContent_Populate(arduino_audio_tools)
add_subdirectory(${arduino_audio_tools_SOURCE_DIR})
endif()
# build sketch as executable
add_executable (mp3 mp3.cpp)
# use main() from arduino_emulator
target_compile_definitions(arduino_emulator PUBLIC -DDEFINE_MAIN)
# OS/X might need this setting for core audio
#target_compile_definitions(portaudio PUBLIC -DPA_USE_COREAUDIO=1)
# specify libraries
target_link_libraries(mp3 portaudio_static arduino_emulator arduino-audio-tools)

View File

@ -1,14 +0,0 @@
# Playing Sound on your Desktop
We provide some generic output which will also work on Linux, Windows and OS/X
The cmake is downloading all dependencies and builds an executable from the sketch.
You just need to provide an Arduino Sketch as cpp file. To build the example execute:
```
mkdir build
cd build
cmake ..
make
```

View File

@ -1,47 +0,0 @@
// Simple wrapper for Arduino sketch to compilable with cpp in cmake
#include "Arduino.h"
#include "AudioTools.h"
#include "BabyElephantWalk60_mp3.h"
using namespace audio_tools;
// MemoryStream -> AudioOutputStream -> MP3Decoder -> CsvStream
MemoryStream mp3(BabyElephantWalk60_mp3, BabyElephantWalk60_mp3_len);
PortAudioStream portaudio_stream; // Output of sound on desktop
MP3DecoderMini mp3_decoder(portaudio_stream); // decode wav to pcm and send it to printer
AudioOutputStream out(mp3_decoder); // output to decoder
StreamCopy copier(out, mp3); // copy in to out
/// open portaudio with audio inform provided by mp3
void mp3InfoCallback(MP3MiniAudioInfo &info){
PortAudioConfig pc;
pc = info;
pc.is_output = true;
Serial.print("sample_rate: ");
Serial.println(pc.sample_rate);
Serial.print("channels: ");
Serial.println(pc.channels);
portaudio_stream.begin(pc);
}
void setup(){
Serial.begin(115200);
AudioLogger::instance().begin(Serial, AudioLogger::Info);
// this is not really necessary
mp3_decoder.setMP3InfoCallback(mp3InfoCallback);
mp3_decoder.begin();
}
void loop(){
if (mp3) {
copier.copy();
} else {
auto info = mp3_decoder.audioInfo();
LOGI("The audio rate from the mp3 file is %d", info.sample_rate);
LOGI("The channels from the mp3 file is %d", info.channels);
exit(0);
}
}

View File

@ -33,6 +33,9 @@ void callbackPrintMetaData(MetaDataType type, const char* str, int len){
void setup() {
Serial.begin(115200);
AudioLogger::instance().begin(Serial, AudioLogger::Debug);
// setup output
I2SConfig cfg = i2s.defaultConfig(TX_MODE);
i2s.begin(cfg);

View File

@ -19,6 +19,9 @@ void printMetaData(MetaDataType type, const char* str, int len){
}
void setup() {
Serial.begin(115200);
AudioLogger::instance().begin(Serial, AudioLogger::Debug);
// setup output - We send the test signal via A2DP - so we conect to the MyMusic Bluetooth Speaker
out.begin(TX_MODE, "MyMusic");

View File

@ -29,6 +29,9 @@ void printMetaData(MetaDataType type, const char* str, int len){
}
void setup() {
Serial.begin(115200);
AudioLogger::instance().begin(Serial, AudioLogger::Debug);
// setup output
I2SConfig cfg = i2s.defaultConfig(TX_MODE);
i2s.begin(cfg);

View File

@ -209,10 +209,17 @@ class I2SBase {
// determines the i2s_comm_format_t - by default we use I2S_COMM_FORMAT_STAND_I2S
i2s_comm_format_t toCommFormat(I2SMode mode){
switch(mode){
case I2S_PHILIPS_MODE:
case I2S_STD_MODE:
case I2S_LSB_MODE:
case I2S_RIGHT_JUSTIFIED_MODE:
return (i2s_comm_format_t) I2S_COMM_FORMAT_STAND_I2S;
default:
case I2S_MSB_MODE:
case I2S_LEFT_JUSTIFIED_MODE:
return (i2s_comm_format_t) I2S_COMM_FORMAT_STAND_MSB;
default:
LOGE("unsupported mode");
return (i2s_comm_format_t) I2S_COMM_FORMAT_STAND_I2S;
}
}

View File

@ -39,6 +39,11 @@ class AudioSource {
/// Returns next audio stream
virtual Stream* nextStream(int offset) = 0;
/// Provides the timeout which is triggering to move to the next stream
virtual int timeoutMs() {
return 500;
}
};
/**
@ -214,11 +219,12 @@ class AudioSourceSdFat : public AudioSource {
* @author Phil Schatzmann
* @copyright GPLv3
*/
class AudioSourceURL : public AudioSource{
class AudioSourceURL : public AudioSource {
public:
AudioSourceURL(URLStream &urlSstream, const char *urlArray[], int arraySize=0, int startPos=0) {
AudioSourceURL(URLStream &urlSstream, const char *urlArray[],const char* mime, int arraySize=0, int startPos=0) {
LOGD(LOG_METHOD);
this->actual_stream = &urlSstream;
this->mime = mime;
this->urlArray = urlArray;
this->max = arraySize;
this->startPos = startPos;
@ -244,25 +250,34 @@ class AudioSourceURL : public AudioSource{
/// Opens the next url from the array
Stream* nextStream(int offset){
LOGI("nextStream: %s", urlArray[pos]);
actual_stream->begin(urlArray[pos]);
actual_stream->begin(urlArray[pos], mime);
pos += offset;
if (pos>=max){
pos = 0;
} else if (pos<0){
pos = max -1;
}
return actual_stream;
}
protected:
void setTimeoutMs(int millisec){
timeout = millisec;
}
int timeoutMs() {
return timeout;
}
protected:
URLStream *actual_stream;
const char **urlArray;
int pos;
int max;
int startPos;
const char* network;
const char* password;
const char *mime=nullptr;
int timeout = 60000;
};
#endif
@ -380,7 +395,14 @@ class AudioPlayer: public AudioBaseInfoDependent {
if (active){
LOGD(LOG_METHOD);
// handle sound
if (!copier.copy(scaler)){
if (copier.copy(scaler) || timeout==0){
// reset timeout
timeout = millis() + source->timeoutMs();
}
// move to next stream after timeout
if (millis()>timeout){
LOGI("-> timeout");
// open next stream
input_stream = nextStream(+1);
if (input_stream!=nullptr){
@ -413,6 +435,7 @@ class AudioPlayer: public AudioBaseInfoDependent {
StreamCopy copier; // copies sound into i2s
ConverterScaler<int16_t> scaler; // volume control
AudioBaseInfoDependent *audioInfoTarget=nullptr;
uint32_t timeout = 0;
/// Callback implementation which writes to metadata

View File

@ -136,6 +136,9 @@ enum RxTxMode { TX_MODE, RX_MODE };
enum I2SMode {
I2S_STD_MODE,
I2S_LSB_MODE,
I2S_MSB_MODE,
I2S_PHILIPS_MODE,
I2S_RIGHT_JUSTIFIED_MODE,
I2S_LEFT_JUSTIFIED_MODE