diff options
author | Andy Hung <hunga@google.com> | 2014-04-23 18:34:02 -0700 |
---|---|---|
committer | Andy Hung <hunga@google.com> | 2014-05-05 16:51:34 -0700 |
commit | f4b0e603d3e27728ca19c02a44342607a54db7d4 (patch) | |
tree | c8e5181c9bd72c2fb77b400a8e69912eb25fa720 /cmds/stagefright | |
parent | 6640d87d1a9263c12bab6d7ded7cc78a3eb50ae9 (diff) | |
download | frameworks_av-f4b0e603d3e27728ca19c02a44342607a54db7d4.zip frameworks_av-f4b0e603d3e27728ca19c02a44342607a54db7d4.tar.gz frameworks_av-f4b0e603d3e27728ca19c02a44342607a54db7d4.tar.bz2 |
Fix audioloop test program
Change-Id: Ic31966095d719cf2b33322675d7d0a2e6a203268
Signed-off-by: Andy Hung <hunga@google.com>
Diffstat (limited to 'cmds/stagefright')
-rw-r--r-- | cmds/stagefright/audioloop.cpp | 170 |
1 files changed, 108 insertions, 62 deletions
diff --git a/cmds/stagefright/audioloop.cpp b/cmds/stagefright/audioloop.cpp index ed7d6cb..96073f1 100644 --- a/cmds/stagefright/audioloop.cpp +++ b/cmds/stagefright/audioloop.cpp @@ -1,4 +1,18 @@ -#include "SineSource.h" +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ #include <binder/ProcessState.h> #include <media/mediarecorder.h> @@ -10,41 +24,79 @@ #include <media/stagefright/MetaData.h> #include <media/stagefright/OMXClient.h> #include <media/stagefright/OMXCodec.h> - -#include <system/audio.h> +#include "SineSource.h" using namespace android; -int main() { - // We only have an AMR-WB encoder on sholes... - static bool outputWBAMR = false; - static const int32_t kSampleRate = outputWBAMR ? 16000 : 8000; - static const int32_t kNumChannels = 1; +static void usage(const char* name) +{ + fprintf(stderr, "Usage: %s [-d duration] [-m] [-w] [<output-file>]\n", name); + fprintf(stderr, "Encodes either a sine wave or microphone input to AMR format\n"); + fprintf(stderr, " -d duration in seconds, default 5 seconds\n"); + fprintf(stderr, " -m use microphone for input, default sine source\n"); + fprintf(stderr, " -w use AMR wideband (default narrowband)\n"); + fprintf(stderr, " <output-file> output file for AMR encoding," + " if unspecified, decode to speaker.\n"); +} - android::ProcessState::self()->startThreadPool(); +int main(int argc, char* argv[]) +{ + static const int channels = 1; // not permitted to be stereo now + unsigned duration = 5; + bool useMic = false; + bool outputWBAMR = false; + bool playToSpeaker = true; + const char* fileOut = NULL; + int ch; + while ((ch = getopt(argc, argv, "d:mw")) != -1) { + switch (ch) { + case 'd': + duration = atoi(optarg); + break; + case 'm': + useMic = true; + break; + case 'w': + outputWBAMR = true; + break; + default: + usage(argv[0]); + return -1; + } + } + argc -= optind; + argv += optind; + if (argc == 1) { + fileOut = argv[0]; + } + const int32_t kSampleRate = outputWBAMR ? 16000 : 8000; + const int32_t kBitRate = outputWBAMR ? 16000 : 8000; + android::ProcessState::self()->startThreadPool(); OMXClient client; CHECK_EQ(client.connect(), (status_t)OK); - -#if 0 - sp<MediaSource> source = new SineSource(kSampleRate, kNumChannels); -#else - sp<MediaSource> source = new AudioSource( - AUDIO_SOURCE_DEFAULT, - kSampleRate, - audio_channel_in_mask_from_count(kNumChannels)); -#endif + sp<MediaSource> source; + + if (useMic) { + // talk into the appropriate microphone for the duration + source = new AudioSource( + AUDIO_SOURCE_MIC, + kSampleRate, + channels); + } else { + // use a sine source at 500 hz. + source = new SineSource(kSampleRate, channels); + } sp<MetaData> meta = new MetaData; - meta->setCString( kKeyMIMEType, outputWBAMR ? MEDIA_MIMETYPE_AUDIO_AMR_WB - : MEDIA_MIMETYPE_AUDIO_AMR_NB); + : MEDIA_MIMETYPE_AUDIO_AMR_NB); - meta->setInt32(kKeyChannelCount, kNumChannels); + meta->setInt32(kKeyChannelCount, channels); meta->setInt32(kKeySampleRate, kSampleRate); - + meta->setInt32(kKeyBitRate, kBitRate); int32_t maxInputSize; if (source->getFormat()->findInt32(kKeyMaxInputSize, &maxInputSize)) { meta->setInt32(kKeyMaxInputSize, maxInputSize); @@ -55,47 +107,41 @@ int main() { meta, true /* createEncoder */, source); -#if 1 - sp<AMRWriter> writer = new AMRWriter("/sdcard/out.amr"); - writer->addSource(encoder); - writer->start(); - sleep(10); - writer->stop(); -#else - sp<MediaSource> decoder = OMXCodec::Create( - client.interface(), - meta, false /* createEncoder */, - encoder); - -#if 0 - AudioPlayer *player = new AudioPlayer(NULL); - player->setSource(decoder); - - player->start(); - - sleep(10); - - player->stop(); - - delete player; - player = NULL; -#elif 0 - CHECK_EQ(decoder->start(), (status_t)OK); - - MediaBuffer *buffer; - while (decoder->read(&buffer) == OK) { - // do something with buffer - - putchar('.'); - fflush(stdout); - - buffer->release(); - buffer = NULL; + if (fileOut != NULL) { + // target file specified, write encoded AMR output + sp<AMRWriter> writer = new AMRWriter(fileOut); + writer->addSource(encoder); + writer->start(); + sleep(duration); + writer->stop(); + } else { + // otherwise decode to speaker + sp<MediaSource> decoder = OMXCodec::Create( + client.interface(), + meta, false /* createEncoder */, + encoder); + + if (playToSpeaker) { + AudioPlayer *player = new AudioPlayer(NULL); + player->setSource(decoder); + player->start(); + sleep(duration); + source->stop(); // must stop source otherwise delete player will hang + delete player; // there is no player->stop()... + } else { + CHECK_EQ(decoder->start(), (status_t)OK); + MediaBuffer* buffer; + while (decoder->read(&buffer) == OK) { + // do something with buffer (save it eventually?) + // need to stop after some count though... + putchar('.'); + fflush(stdout); + buffer->release(); + buffer = NULL; + } + CHECK_EQ(decoder->stop(), (status_t)OK); + } } - CHECK_EQ(decoder->stop(), (status_t)OK); -#endif -#endif - return 0; } |