1c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber#include "SineSource.h" 2c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber 3c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber#include <binder/ProcessState.h> 4e7c9cb48fec02697227bd847cd2e69432659adfdAndreas Huber#include <media/mediarecorder.h> 5f1d5aa162c02a16b7195a43a9bcea4d592600ac4James Dong#include <media/stagefright/foundation/ADebug.h> 6e7c9cb48fec02697227bd847cd2e69432659adfdAndreas Huber#include <media/stagefright/AMRWriter.h> 7c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber#include <media/stagefright/AudioPlayer.h> 8e7c9cb48fec02697227bd847cd2e69432659adfdAndreas Huber#include <media/stagefright/AudioSource.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 1464760240f931714858a59c1579f07264d7182ba2Dima Zavin#include <system/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; 27f1d5aa162c02a16b7195a43a9bcea4d592600ac4James Dong CHECK_EQ(client.connect(), (status_t)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, 35ab334fd351ae5a0e18903da123d63e565b536874Glenn Kasten audio_channel_in_mask_from_count(kNumChannels)); 36e7c9cb48fec02697227bd847cd2e69432659adfdAndreas Huber#endif 37c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber 38c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber sp<MetaData> meta = new MetaData; 39c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber 40c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber meta->setCString( 41c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber kKeyMIMEType, 42c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber outputWBAMR ? MEDIA_MIMETYPE_AUDIO_AMR_WB 43c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber : MEDIA_MIMETYPE_AUDIO_AMR_NB); 44c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber 45c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber meta->setInt32(kKeyChannelCount, kNumChannels); 46c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber meta->setInt32(kKeySampleRate, kSampleRate); 47c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber 48c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber int32_t maxInputSize; 49c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber if (source->getFormat()->findInt32(kKeyMaxInputSize, &maxInputSize)) { 50c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber meta->setInt32(kKeyMaxInputSize, maxInputSize); 51c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber } 52c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber 53bf697e37550d9e8376089b0b5e498613bede798cAndreas Huber sp<MediaSource> encoder = OMXCodec::Create( 54c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber client.interface(), 55c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber meta, true /* createEncoder */, 56c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber source); 57c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber 58e7c9cb48fec02697227bd847cd2e69432659adfdAndreas Huber#if 1 59e7c9cb48fec02697227bd847cd2e69432659adfdAndreas Huber sp<AMRWriter> writer = new AMRWriter("/sdcard/out.amr"); 60e7c9cb48fec02697227bd847cd2e69432659adfdAndreas Huber writer->addSource(encoder); 61e7c9cb48fec02697227bd847cd2e69432659adfdAndreas Huber writer->start(); 62e7c9cb48fec02697227bd847cd2e69432659adfdAndreas Huber sleep(10); 63e7c9cb48fec02697227bd847cd2e69432659adfdAndreas Huber writer->stop(); 64e7c9cb48fec02697227bd847cd2e69432659adfdAndreas Huber#else 65bf697e37550d9e8376089b0b5e498613bede798cAndreas Huber sp<MediaSource> decoder = OMXCodec::Create( 66c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber client.interface(), 67c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber meta, false /* createEncoder */, 68c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber encoder); 69c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber 70e7c9cb48fec02697227bd847cd2e69432659adfdAndreas Huber#if 0 71c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber AudioPlayer *player = new AudioPlayer(NULL); 72c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber player->setSource(decoder); 73c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber 74c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber player->start(); 75c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber 76c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber sleep(10); 77c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber 78c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber player->stop(); 79c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber 80c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber delete player; 81c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber player = NULL; 82e7c9cb48fec02697227bd847cd2e69432659adfdAndreas Huber#elif 0 83f1d5aa162c02a16b7195a43a9bcea4d592600ac4James Dong CHECK_EQ(decoder->start(), (status_t)OK); 84c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber 85c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber MediaBuffer *buffer; 86c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber while (decoder->read(&buffer) == OK) { 87c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber // do something with buffer 88c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber 89c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber putchar('.'); 90c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber fflush(stdout); 91c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber 92c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber buffer->release(); 93c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber buffer = NULL; 94c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber } 95c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber 96f1d5aa162c02a16b7195a43a9bcea4d592600ac4James Dong CHECK_EQ(decoder->stop(), (status_t)OK); 97c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber#endif 98e7c9cb48fec02697227bd847cd2e69432659adfdAndreas Huber#endif 99c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber 100c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber return 0; 101c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0fAndreas Huber} 102