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