audioloop.cpp revision fce7a473248381cc83a01855f92581077d3c9ee2
1c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber#include "SineSource.h" 2c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber 3c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber#include <binder/ProcessState.h> 4e7c9cb48fec02697227bd847cd2e69432659adfdAndreas Huber#include <media/mediarecorder.h> 5e7c9cb48fec02697227bd847cd2e69432659adfdAndreas Huber#include <media/stagefright/AMRWriter.h> 6c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber#include <media/stagefright/AudioPlayer.h> 7e7c9cb48fec02697227bd847cd2e69432659adfdAndreas Huber#include <media/stagefright/AudioSource.h> 8c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber#include <media/stagefright/MediaDebug.h> 9c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber#include <media/stagefright/MediaDefs.h> 10c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber#include <media/stagefright/MetaData.h> 11c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber#include <media/stagefright/OMXClient.h> 12c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber#include <media/stagefright/OMXCodec.h> 13c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber 14fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin#include <hardware/audio.h> 15fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin 16c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huberusing namespace android; 17c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber 18c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huberint main() { 19c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber // We only have an AMR-WB encoder on sholes... 20c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber static bool outputWBAMR = false; 21c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber static const int32_t kSampleRate = outputWBAMR ? 16000 : 8000; 22c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber static const int32_t kNumChannels = 1; 23c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber 24c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber android::ProcessState::self()->startThreadPool(); 25c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber 26c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber OMXClient client; 27c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber CHECK_EQ(client.connect(), OK); 28c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber 29e7c9cb48fec02697227bd847cd2e69432659adfdAndreas Huber#if 0 30c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber sp<MediaSource> source = new SineSource(kSampleRate, kNumChannels); 31e7c9cb48fec02697227bd847cd2e69432659adfdAndreas Huber#else 32e7c9cb48fec02697227bd847cd2e69432659adfdAndreas Huber sp<MediaSource> source = new AudioSource( 33e7c9cb48fec02697227bd847cd2e69432659adfdAndreas Huber AUDIO_SOURCE_DEFAULT, 34e7c9cb48fec02697227bd847cd2e69432659adfdAndreas Huber kSampleRate, 35e7c9cb48fec02697227bd847cd2e69432659adfdAndreas Huber kNumChannels == 1 36fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin ? AUDIO_CHANNEL_IN_MONO 37fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin : AUDIO_CHANNEL_IN_STEREO); 38e7c9cb48fec02697227bd847cd2e69432659adfdAndreas Huber#endif 39c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber 40c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber sp<MetaData> meta = new MetaData; 41c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber 42c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber meta->setCString( 43c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber kKeyMIMEType, 44c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber outputWBAMR ? MEDIA_MIMETYPE_AUDIO_AMR_WB 45c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber : MEDIA_MIMETYPE_AUDIO_AMR_NB); 46c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber 47c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber meta->setInt32(kKeyChannelCount, kNumChannels); 48c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber meta->setInt32(kKeySampleRate, kSampleRate); 49c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber 50c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber int32_t maxInputSize; 51c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber if (source->getFormat()->findInt32(kKeyMaxInputSize, &maxInputSize)) { 52c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber meta->setInt32(kKeyMaxInputSize, maxInputSize); 53c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber } 54c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber 55bf697e37550d9e8376089b0b5e498613bede798cAndreas Huber sp<MediaSource> encoder = OMXCodec::Create( 56c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber client.interface(), 57c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber meta, true /* createEncoder */, 58c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber source); 59c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber 60e7c9cb48fec02697227bd847cd2e69432659adfdAndreas Huber#if 1 61e7c9cb48fec02697227bd847cd2e69432659adfdAndreas Huber sp<AMRWriter> writer = new AMRWriter("/sdcard/out.amr"); 62e7c9cb48fec02697227bd847cd2e69432659adfdAndreas Huber writer->addSource(encoder); 63e7c9cb48fec02697227bd847cd2e69432659adfdAndreas Huber writer->start(); 64e7c9cb48fec02697227bd847cd2e69432659adfdAndreas Huber sleep(10); 65e7c9cb48fec02697227bd847cd2e69432659adfdAndreas Huber writer->stop(); 66e7c9cb48fec02697227bd847cd2e69432659adfdAndreas Huber#else 67bf697e37550d9e8376089b0b5e498613bede798cAndreas Huber sp<MediaSource> decoder = OMXCodec::Create( 68c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber client.interface(), 69c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber meta, false /* createEncoder */, 70c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber encoder); 71c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber 72e7c9cb48fec02697227bd847cd2e69432659adfdAndreas Huber#if 0 73c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber AudioPlayer *player = new AudioPlayer(NULL); 74c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber player->setSource(decoder); 75c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber 76c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber player->start(); 77c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber 78c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber sleep(10); 79c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber 80c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber player->stop(); 81c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber 82c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber delete player; 83c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber player = NULL; 84e7c9cb48fec02697227bd847cd2e69432659adfdAndreas Huber#elif 0 85c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber CHECK_EQ(decoder->start(), OK); 86c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber 87c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber MediaBuffer *buffer; 88c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber while (decoder->read(&buffer) == OK) { 89c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber // do something with buffer 90c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber 91c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber putchar('.'); 92c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber fflush(stdout); 93c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber 94c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber buffer->release(); 95c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber buffer = NULL; 96c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber } 97c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber 98c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber CHECK_EQ(decoder->stop(), OK); 99c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber#endif 100e7c9cb48fec02697227bd847cd2e69432659adfdAndreas Huber#endif 101c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber 102c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber return 0; 103c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber} 104