- Code: Select all
int main()
{
using namespace android;
inFile = open("/dlpcm.s16", O_RDONLY);
if (!inFile) {
LOGE("inFile open failed: %s", strerror(errno));
return 0;
}
int streamType = AudioSystem::ENFORCED_AUDIBLE;
uint32_t sampleRate = 44100;
uint32_t afLatency;
int afFrameCount, afSampleRate, minBufCount;
AudioSystem::getOutputLatency(&afLatency, streamType);
AudioSystem::getOutputFrameCount(&afFrameCount, streamType);
AudioSystem::getOutputSamplingRate(&afSampleRate, streamType);
minBufCount = afLatency / ((1000 * afFrameCount)/afSampleRate);
if (minBufCount < 2) minBufCount = 2;
int minFrameCount = (afFrameCount*sampleRate*minBufCount)/afSampleRate;
LOGD("afLatency=%u, afFrameCount=%d, afSampleRate=%d, minBufCount=%d, minFrameCount=%d",
afLatency, afFrameCount, afSampleRate, minBufCount, minFrameCount);
AudioTrack *aTrack = new AudioTrack(streamType, sampleRate, AudioSystem::PCM_16_BIT,
AudioTrack::MONO, minFrameCount);
if (aTrack == NULL || aTrack->initCheck() != NO_ERROR/* || aTrack->setSampleRate(sampleRate) != NO_ERROR*/) {
LOGE("!aTrack || initCheck failed");
return 0;
}
aTrack->start();
aTrack->setVolume(0.5f, 0);
//aTrack->setSampleRate(sampleRate/2); // when i uncomment this line, i get normal-speed playback
LOGD("AudioTrack ready");
struct stat fStat;
fstat(inFile, &fStat);
ssize_t bufSize = minFrameCount;
char *buf = new char[fStat.st_size];
ssize_t readed = read(inFile, buf, fStat.st_size);
while(readed > 0) {
ssize_t written = aTrack->write(buf, bufSize);
if (written != bufSize) {
LOGD("written(%ld)!=bufSize(%ld) %s", written, bufSize, strerror(written));
break;
}
readed -= written;
buf += written;
//usleep(1000*19);
}
LOGD("flush&stop");
aTrack->flush();
aTrack->stop();
return 0;
}
This is code for testing Audio HAL (ALSA w/patches) and it's possible error is somewhere in drivers. However, playback from Music app, games etc is correct without 'sampleRate/2' quirk.
Any idea?


