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