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