mirror of
https://github.com/pschatzmann/arduino-audio-tools.git
synced 2024-09-22 02:47:31 +00:00
I2S corrections
This commit is contained in:
parent
693efb83b9
commit
2a2bbb0e82
File diff suppressed because it is too large
Load Diff
@ -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)
|
||||
|
@ -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
|
||||
```
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
@ -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);
|
||||
|
@ -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");
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user