|
|
|
|
|
|
|
|
#include "play_sd_wav.h" |
|
|
#include "play_sd_wav.h" |
|
|
#include "spi_interrupt.h" |
|
|
#include "spi_interrupt.h" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define STATE_DIRECT_8BIT_MONO 0 // playing mono at native sample rate |
|
|
#define STATE_DIRECT_8BIT_MONO 0 // playing mono at native sample rate |
|
|
#define STATE_DIRECT_8BIT_STEREO 1 // playing stereo at native sample rate |
|
|
#define STATE_DIRECT_8BIT_STEREO 1 // playing stereo at native sample rate |
|
|
#define STATE_DIRECT_16BIT_MONO 2 // playing mono at native sample rate |
|
|
#define STATE_DIRECT_16BIT_MONO 2 // playing mono at native sample rate |
|
|
|
|
|
|
|
|
bool AudioPlaySdWav::play(const char *filename) |
|
|
bool AudioPlaySdWav::play(const char *filename) |
|
|
{ |
|
|
{ |
|
|
stop(); |
|
|
stop(); |
|
|
#if defined(HAS_KINETIS_SDHC) |
|
|
|
|
|
|
|
|
bool irq = false; |
|
|
|
|
|
if (NVIC_IS_ENABLED(IRQ_SOFTWARE)) { |
|
|
|
|
|
NVIC_DISABLE_IRQ(IRQ_SOFTWARE); |
|
|
|
|
|
irq = true; |
|
|
|
|
|
} |
|
|
|
|
|
#if defined(HAS_KINETIS_SDHC) |
|
|
if (!(SIM_SCGC3 & SIM_SCGC3_SDHC)) AudioStartUsingSPI(); |
|
|
if (!(SIM_SCGC3 & SIM_SCGC3_SDHC)) AudioStartUsingSPI(); |
|
|
#else |
|
|
|
|
|
|
|
|
#else |
|
|
AudioStartUsingSPI(); |
|
|
AudioStartUsingSPI(); |
|
|
#endif |
|
|
#endif |
|
|
__disable_irq(); |
|
|
|
|
|
wavfile = SD.open(filename); |
|
|
wavfile = SD.open(filename); |
|
|
__enable_irq(); |
|
|
|
|
|
if (!wavfile) { |
|
|
if (!wavfile) { |
|
|
#if defined(HAS_KINETIS_SDHC) |
|
|
|
|
|
|
|
|
#if defined(HAS_KINETIS_SDHC) |
|
|
if (!(SIM_SCGC3 & SIM_SCGC3_SDHC)) AudioStopUsingSPI(); |
|
|
if (!(SIM_SCGC3 & SIM_SCGC3_SDHC)) AudioStopUsingSPI(); |
|
|
#else |
|
|
|
|
|
|
|
|
#else |
|
|
AudioStopUsingSPI(); |
|
|
AudioStopUsingSPI(); |
|
|
#endif |
|
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
if (irq) NVIC_ENABLE_IRQ(IRQ_SOFTWARE); |
|
|
return false; |
|
|
return false; |
|
|
} |
|
|
} |
|
|
buffer_length = 0; |
|
|
buffer_length = 0; |
|
|
|
|
|
|
|
|
data_length = 20; |
|
|
data_length = 20; |
|
|
header_offset = 0; |
|
|
header_offset = 0; |
|
|
state = STATE_PARSE1; |
|
|
state = STATE_PARSE1; |
|
|
|
|
|
if (irq) NVIC_ENABLE_IRQ(IRQ_SOFTWARE); |
|
|
return true; |
|
|
return true; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void AudioPlaySdWav::stop(void) |
|
|
void AudioPlaySdWav::stop(void) |
|
|
{ |
|
|
{ |
|
|
__disable_irq(); |
|
|
|
|
|
|
|
|
bool irq = false; |
|
|
|
|
|
if (NVIC_IS_ENABLED(IRQ_SOFTWARE)) { |
|
|
|
|
|
NVIC_DISABLE_IRQ(IRQ_SOFTWARE); |
|
|
|
|
|
irq = true; |
|
|
|
|
|
} |
|
|
if (state != STATE_STOP) { |
|
|
if (state != STATE_STOP) { |
|
|
audio_block_t *b1 = block_left; |
|
|
audio_block_t *b1 = block_left; |
|
|
block_left = NULL; |
|
|
block_left = NULL; |
|
|
audio_block_t *b2 = block_right; |
|
|
audio_block_t *b2 = block_right; |
|
|
block_right = NULL; |
|
|
block_right = NULL; |
|
|
state = STATE_STOP; |
|
|
state = STATE_STOP; |
|
|
__enable_irq(); |
|
|
|
|
|
if (b1) release(b1); |
|
|
if (b1) release(b1); |
|
|
if (b2) release(b2); |
|
|
if (b2) release(b2); |
|
|
wavfile.close(); |
|
|
wavfile.close(); |
|
|
#if defined(HAS_KINETIS_SDHC) |
|
|
|
|
|
|
|
|
#if defined(HAS_KINETIS_SDHC) |
|
|
if (!(SIM_SCGC3 & SIM_SCGC3_SDHC)) AudioStopUsingSPI(); |
|
|
if (!(SIM_SCGC3 & SIM_SCGC3_SDHC)) AudioStopUsingSPI(); |
|
|
#else |
|
|
|
|
|
|
|
|
#else |
|
|
AudioStopUsingSPI(); |
|
|
AudioStopUsingSPI(); |
|
|
#endif |
|
|
|
|
|
} else { |
|
|
|
|
|
__enable_irq(); |
|
|
|
|
|
|
|
|
#endif |
|
|
} |
|
|
} |
|
|
|
|
|
if (irq) NVIC_ENABLE_IRQ(IRQ_SOFTWARE); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
end: // end of file reached or other reason to stop |
|
|
end: // end of file reached or other reason to stop |
|
|
wavfile.close(); |
|
|
wavfile.close(); |
|
|
#if defined(HAS_KINETIS_SDHC) |
|
|
|
|
|
|
|
|
#if defined(HAS_KINETIS_SDHC) |
|
|
if (!(SIM_SCGC3 & SIM_SCGC3_SDHC)) AudioStopUsingSPI(); |
|
|
if (!(SIM_SCGC3 & SIM_SCGC3_SDHC)) AudioStopUsingSPI(); |
|
|
#else |
|
|
|
|
|
|
|
|
#else |
|
|
AudioStopUsingSPI(); |
|
|
AudioStopUsingSPI(); |
|
|
#endif |
|
|
|
|
|
|
|
|
#endif |
|
|
state_play = STATE_STOP; |
|
|
state_play = STATE_STOP; |
|
|
state = STATE_STOP; |
|
|
state = STATE_STOP; |
|
|
cleanup: |
|
|
cleanup: |