You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
MicroDexed/third-party/TeensyVariablePlayback/src/playarrayresmp.cpp

92 lines
2.3 KiB

//
// Created by Nicholas Newdigate on 18/07/2020.
//
#include "playarrayresmp.h"
void AudioPlayArrayResmp::begin()
{
file_size = 0;
arrayReader.begin();
}
bool AudioPlayArrayResmp::playRaw(int16_t *data, uint32_t numSamples, uint16_t numChannels)
{
stop();
bool playing = arrayReader.playRaw(data, numSamples, numChannels);
return playing;
}
bool AudioPlayArrayResmp::playRaw(const unsigned int *data, uint32_t numSamples, uint16_t numChannels)
{
return playRaw((int16_t *) data, numSamples, numChannels);
}
bool AudioPlayArrayResmp::playWav(int16_t *data, uint32_t fileSize)
{
stop();
bool playing = arrayReader.playWav(data, fileSize);
return playing;
}
bool AudioPlayArrayResmp::playWav(const unsigned int *data, uint32_t fileSize) {
return playWav((int16_t *) data, fileSize);
}
void AudioPlayArrayResmp::stop()
{
arrayReader.stop();
}
void AudioPlayArrayResmp::update()
{
int _numChannels = arrayReader.getNumChannels();
if (_numChannels == -1)
return;
unsigned int i, n;
audio_block_t *blocks[_numChannels];
int16_t *data[_numChannels];
// only update if we're playing
if (!arrayReader.isPlaying()) return;
// allocate the audio blocks to transmit
for (int i=0; i < _numChannels; i++) {
blocks[i] = allocate();
if (blocks[i] == nullptr) return;
data[i] = blocks[i]->data;
}
if (arrayReader.available()) {
// we can read more data from the file...
n = arrayReader.read((void**)data, AUDIO_BLOCK_SAMPLES);
for (int channel=0; channel < _numChannels; channel++) {
for (i=n; i < AUDIO_BLOCK_SAMPLES; i++) {
blocks[channel]->data[i] = 0;
}
transmit(blocks[channel], channel);
}
if(_numChannels == 1) {
transmit(blocks[0], 1);
}
} else {
arrayReader.close();
}
for (int channel=0; channel < _numChannels; channel++) {
release(blocks[channel]);
}
}
#define B2M (uint32_t)((double)4294967296000.0 / AUDIO_SAMPLE_RATE_EXACT / 2.0) // 97352592
uint32_t AudioPlayArrayResmp::positionMillis()
{
return ((uint64_t)file_size * B2M) >> 32;
}
uint32_t AudioPlayArrayResmp::lengthMillis()
{
return ((uint64_t)file_size * B2M) >> 32;
}