summaryrefslogtreecommitdiffstats
path: root/services/audioflinger/test-resample.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'services/audioflinger/test-resample.cpp')
-rw-r--r--services/audioflinger/test-resample.cpp71
1 files changed, 61 insertions, 10 deletions
diff --git a/services/audioflinger/test-resample.cpp b/services/audioflinger/test-resample.cpp
index 7a314cf..39018b2 100644
--- a/services/audioflinger/test-resample.cpp
+++ b/services/audioflinger/test-resample.cpp
@@ -29,6 +29,8 @@
using namespace android;
+bool gVerbose = false;
+
struct HeaderWav {
HeaderWav(size_t size, int nc, int sr, int bits) {
strncpy(RIFF, "RIFF", 4);
@@ -62,10 +64,11 @@ struct HeaderWav {
};
static int usage(const char* name) {
- fprintf(stderr,"Usage: %s [-p] [-h] [-s] [-q {dq|lq|mq|hq|vhq}] [-i input-sample-rate] "
+ fprintf(stderr,"Usage: %s [-p] [-h] [-v] [-s] [-q {dq|lq|mq|hq|vhq}] [-i input-sample-rate] "
"[-o output-sample-rate] [<input-file>] <output-file>\n", name);
fprintf(stderr," -p enable profiling\n");
fprintf(stderr," -h create wav file\n");
+ fprintf(stderr," -v verbose : log buffer provider calls\n");
fprintf(stderr," -s stereo\n");
fprintf(stderr," -q resampler quality\n");
fprintf(stderr," dq : default quality\n");
@@ -89,7 +92,7 @@ int main(int argc, char* argv[]) {
AudioResampler::src_quality quality = AudioResampler::DEFAULT_QUALITY;
int ch;
- while ((ch = getopt(argc, argv, "phsq:i:o:")) != -1) {
+ while ((ch = getopt(argc, argv, "phvsq:i:o:")) != -1) {
switch (ch) {
case 'p':
profiling = true;
@@ -97,6 +100,9 @@ int main(int argc, char* argv[]) {
case 'h':
writeHeader = true;
break;
+ case 'v':
+ gVerbose = true;
+ break;
case 's':
channels = 2;
break;
@@ -186,24 +192,59 @@ int main(int argc, char* argv[]) {
// ----------------------------------------------------------
class Provider: public AudioBufferProvider {
- int16_t* mAddr;
- size_t mNumFrames;
+ int16_t* const mAddr; // base address
+ const size_t mNumFrames; // total frames
+ const int mChannels;
+ size_t mNextFrame; // index of next frame to provide
+ size_t mUnrel; // number of frames not yet released
public:
- Provider(const void* addr, size_t size, int channels) {
- mAddr = (int16_t*) addr;
- mNumFrames = size / (channels*sizeof(int16_t));
+ Provider(const void* addr, size_t size, int channels)
+ : mAddr((int16_t*) addr),
+ mNumFrames(size / (channels*sizeof(int16_t))),
+ mChannels(channels),
+ mNextFrame(0), mUnrel(0) {
}
virtual status_t getNextBuffer(Buffer* buffer,
int64_t pts = kInvalidPTS) {
- buffer->frameCount = mNumFrames;
- buffer->i16 = mAddr;
- return NO_ERROR;
+ size_t requestedFrames = buffer->frameCount;
+ if (requestedFrames > mNumFrames - mNextFrame) {
+ buffer->frameCount = mNumFrames - mNextFrame;
+ }
+ if (gVerbose) {
+ printf("getNextBuffer() requested %u frames out of %u frames available,"
+ " and returned %u frames\n",
+ requestedFrames, mNumFrames - mNextFrame, buffer->frameCount);
+ }
+ mUnrel = buffer->frameCount;
+ if (buffer->frameCount > 0) {
+ buffer->i16 = &mAddr[mChannels * mNextFrame];
+ return NO_ERROR;
+ } else {
+ buffer->i16 = NULL;
+ return NOT_ENOUGH_DATA;
+ }
}
virtual void releaseBuffer(Buffer* buffer) {
+ if (buffer->frameCount > mUnrel) {
+ fprintf(stderr, "ERROR releaseBuffer() released %u frames but only %u available "
+ "to release\n", buffer->frameCount, mUnrel);
+ mNextFrame += mUnrel;
+ mUnrel = 0;
+ } else {
+ if (gVerbose) {
+ printf("releaseBuffer() released %u frames out of %u frames available "
+ "to release\n", buffer->frameCount, mUnrel);
+ }
+ mNextFrame += buffer->frameCount;
+ mUnrel -= buffer->frameCount;
+ }
}
} provider(input_vaddr, input_size, channels);
size_t input_frames = input_size / (channels * sizeof(int16_t));
+ if (gVerbose) {
+ printf("%u input frames\n", input_frames);
+ }
size_t output_size = 2 * 4 * ((int64_t) input_frames * output_freq) / input_freq;
output_size &= ~7; // always stereo, 32-bits
@@ -240,7 +281,17 @@ int main(int argc, char* argv[]) {
resampler->setVolume(0x1000, 0x1000);
memset(output_vaddr, 0, output_size);
+ if (gVerbose) {
+ printf("resample() %u output frames\n", out_frames);
+ }
resampler->resample((int*) output_vaddr, out_frames, &provider);
+ if (gVerbose) {
+ printf("resample() complete\n");
+ }
+ resampler->reset();
+ if (gVerbose) {
+ printf("reset() complete\n");
+ }
// down-mix (we just truncate and keep the left channel)
int32_t* out = (int32_t*) output_vaddr;