Browse Source

Add status and position functions to AudioPlaySdWav

dds
PaulStoffregen 11 years ago
parent
commit
636bba0723
2 changed files with 56 additions and 30 deletions
  1. +51
    -28
      play_sd_wav.cpp
  2. +5
    -2
      play_sd_wav.h

+ 51
- 28
play_sd_wav.cpp View File

} }
} }


bool AudioPlaySdWav::start(void)
{
__disable_irq();
if (state == STATE_STOP) {
if (state_play == STATE_STOP) {
__enable_irq();
return false;
}
state = state_play;
}
__enable_irq();
return true;
}



void AudioPlaySdWav::update(void) void AudioPlaySdWav::update(void)
{ {
block_right = allocate(); block_right = allocate();
if (!block_right) return false; if (!block_right) return false;
} }
total_length = data_length;
} else { } else {
state = STATE_PARSE4; state = STATE_PARSE4;
} }
// 256 byte chunks, speed is 443272 bytes/sec // 256 byte chunks, speed is 443272 bytes/sec
// 512 byte chunks, speed is 468023 bytes/sec // 512 byte chunks, speed is 468023 bytes/sec


#define B2M_44100 (uint32_t)((double)4294967296000.0 / AUDIO_SAMPLE_RATE_EXACT) // 97352592
#define B2M_22050 (uint32_t)((double)4294967296000.0 / AUDIO_SAMPLE_RATE_EXACT * 2.0)
#define B2M_11025 (uint32_t)((double)4294967296000.0 / AUDIO_SAMPLE_RATE_EXACT * 4.0)


bool AudioPlaySdWav::parse_format(void) bool AudioPlaySdWav::parse_format(void)
{ {
uint8_t num = 0; uint8_t num = 0;
uint16_t format; uint16_t format;
uint16_t channels; uint16_t channels;
uint32_t rate;
uint32_t rate, b2m;
uint16_t bits; uint16_t bits;


format = header[0]; format = header[0];
//Serial.println(format); //Serial.println(format);
if (format != 1) return false; if (format != 1) return false;


rate = header[1];
//Serial.print(" rate = ");
//Serial.println(rate);
if (rate == AUDIO_SAMPLE_RATE) {
b2m = B2M_44100;
} else if (rate == 22050) {
b2m = B2M_22050;
num |= 4;
} else if (rate == 11025) {
b2m = B2M_11025;
num |= 4;
} else {
return false;
}

channels = header[0] >> 16; channels = header[0] >> 16;
//Serial.print(" channels = "); //Serial.print(" channels = ");
//Serial.println(channels); //Serial.println(channels);
if (channels == 1) { if (channels == 1) {
} else if (channels == 2) { } else if (channels == 2) {
num = 1;
b2m >>= 1;
num |= 1;
} else { } else {
return false; return false;
} }
//Serial.println(bits); //Serial.println(bits);
if (bits == 8) { if (bits == 8) {
} else if (bits == 16) { } else if (bits == 16) {
b2m >>= 1;
num |= 2; num |= 2;
} else { } else {
return false; return false;
} }


rate = header[1];
//Serial.print(" rate = ");
//Serial.println(rate);
if (rate == AUDIO_SAMPLE_RATE) {
} else if (rate >= 8000 && rate <= 48000) {
num |= 4;
} else {
return false;
}
bytes2millis = b2m;
//Serial.print(" bytes2millis = ");
//Serial.println(b2m);

// we're not checking the byte rate and block align fields // we're not checking the byte rate and block align fields
// if they're not the expected values, all we could do is // if they're not the expected values, all we could do is
// return false. Do any real wav files have unexpected // return false. Do any real wav files have unexpected
} }




bool AudioPlaySdWav::isPlaying(void)
{
return (state < 8);
}

uint32_t AudioPlaySdWav::positionMillis(void)
{
if (state >= 8) return 0;
uint32_t offset = total_length - data_length;
return ((uint64_t)offset * bytes2millis) >> 32;
}


uint32_t AudioPlaySdWav::lengthMillis(void)
{
if (state >= 8) return 0;
return ((uint64_t)total_length * bytes2millis) >> 32;
}







+ 5
- 2
play_sd_wav.h View File

public: public:
AudioPlaySdWav(void) : AudioStream(0, NULL) { begin(); } AudioPlaySdWav(void) : AudioStream(0, NULL) { begin(); }
void begin(void); void begin(void);

bool play(const char *filename); bool play(const char *filename);
void stop(void); void stop(void);
bool start(void);
bool isPlaying(void);
uint32_t positionMillis(void);
uint32_t lengthMillis(void);
virtual void update(void); virtual void update(void);
private: private:
File wavfile; File wavfile;
bool parse_format(void); bool parse_format(void);
uint32_t header[5]; uint32_t header[5];
uint32_t data_length; // number of bytes remaining in data section uint32_t data_length; // number of bytes remaining in data section
uint32_t total_length; // number of audio data bytes in file
uint32_t bytes2millis;
audio_block_t *block_left; audio_block_t *block_left;
audio_block_t *block_right; audio_block_t *block_right;
uint16_t block_offset; uint16_t block_offset;

Loading…
Cancel
Save