void AudioPlaySdRaw::update(void) { unsigned int i, n; audio_block_t *block; // only update if we're playing if (!playing) return; // allocate the audio blocks to transmit block = allocate(); if (block == NULL) return; if (rawfile.available()) { // we can read more data from the file... n = rawfile.read(block->data, AUDIO_BLOCK_SAMPLES*2); file_offset += n; for (i=n/2; i < AUDIO_BLOCK_SAMPLES; i++) { block->data[i] = 0; } transmit(block); } else { rawfile.close(); AudioStopUsingSPI(); playing = false; } release(block); }
void AudioLoadSdRaw::stop(void) { __disable_irq(); if (playing) { playing = false; __enable_irq(); AudioStopUsingSPI(); } else { __enable_irq(); } }
void AudioPlaySerialflashRaw::stop(void) { __disable_irq(); if (playing) { playing = 0; __enable_irq(); rawfile.close(); AudioStopUsingSPI(); } else { __enable_irq(); } }
bool AudioPlaySerialflashRaw::play(const char *filename) { stop(); AudioStartUsingSPI(); rawfile = SerialFlash.open(filename); if (!rawfile) { //Serial.println("unable to open file"); AudioStopUsingSPI(); return false; } file_size = rawfile.size(); file_offset = 0; //Serial.println("able to open file"); playing = true; return true; }
bool AudioPlaySerialflashRaw::play(const char *filename) { stop(); AudioStartUsingSPI(); rawfile = SerialFlash.open(filename); if (!rawfile) { //Serial.println("unable to open file"); AudioStopUsingSPI(); return false; } file_size = rawfile.size(); file_offset = 0; //Serial.println("able to open file"); if(!strcmp(filename + strlen(filename) - 3, "ULW")) playing = 0x01; //ulaw else playing = 0x81; //PCM 16 bit return true; }
void AudioPlaySdWav::stop(void) { __disable_irq(); if (state != STATE_STOP) { audio_block_t *b1 = block_left; block_left = NULL; audio_block_t *b2 = block_right; block_right = NULL; state = STATE_STOP; __enable_irq(); if (b1) release(b1); if (b2) release(b2); wavfile.close(); AudioStopUsingSPI(); } else { __enable_irq(); } }
void AudioLoadSdRaw::update(void) { bool moreData; unsigned int i, n; audio_block_t *block; // only update if we're playing if (!playing) return; // allocate the audio blocks to transmit block = allocate(); if (block == NULL) return; if (goForward) { moreData = rawfile.available(); } else { moreData = rawfile.position() > 0; rawfile.seek(rawfile.position()-AUDIO_BLOCK_SAMPLES*4); // *2 would take us back to where we just were } // We'll be decimating/interpolating into pending_block here if (moreData) { // we can read more data from the file... n = rawfile.read(block->data, AUDIO_BLOCK_SAMPLES*2); for (i=n/2; i < AUDIO_BLOCK_SAMPLES; i++) { block->data[i] = 0; } if (! goForward) { reverseMem(block->data); } submit(block); } else { flush(); rawfile.close(); AudioStopUsingSPI(); playing = false; } release(block); }
void AudioPlaySdWav::update(void) { int32_t n; // only update if we're playing if (state == STATE_STOP) return; // allocate the audio blocks to transmit block_left = allocate(); if (block_left == NULL) return; if (state < 8 && (state & 1) == 1) { // if we're playing stereo, allocate another // block for the right channel output block_right = allocate(); if (block_right == NULL) { release(block_left); return; } } else { // if we're playing mono or just parsing // the WAV file header, no right-side block block_right = NULL; } block_offset = 0; //Serial.println("update"); // is there buffered data? n = buffer_length - buffer_offset; if (n > 0) { // we have buffered data if (consume(n)) return; // it was enough to transmit audio } // we only get to this point when buffer[512] is empty if (state != STATE_STOP && wavfile.available()) { // we can read more data from the file... readagain: buffer_length = wavfile.read(buffer, 512); if (buffer_length == 0) goto end; buffer_offset = 0; bool parsing = (state >= 8); bool txok = consume(buffer_length); if (txok) { if (state != STATE_STOP) return; } else { if (state != STATE_STOP) { if (parsing && state < 8) goto readagain; else goto cleanup; } } } end: // end of file reached or other reason to stop wavfile.close(); AudioStopUsingSPI(); state_play = STATE_STOP; state = STATE_STOP; cleanup: if (block_left) { if (block_offset > 0) { for (uint32_t i=block_offset; i < AUDIO_BLOCK_SAMPLES; i++) { block_left->data[i] = 0; } transmit(block_left, 0); if (state < 8 && (state & 1) == 0) { transmit(block_left, 1); } } release(block_left); block_left = NULL; } if (block_right) { if (block_offset > 0) { for (uint32_t i=block_offset; i < AUDIO_BLOCK_SAMPLES; i++) { block_right->data[i] = 0; } transmit(block_right, 1); } release(block_right); block_right = NULL; } }