AudioPlayer_to_android.cpp revision c116ab2a033ee7dc78cfd458defe38d4528383a8
1773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi/*
2773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * Copyright (C) 2010 The Android Open Source Project
3773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi *
4773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License");
5773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * you may not use this file except in compliance with the License.
6773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * You may obtain a copy of the License at
7773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi *
8773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi *      http://www.apache.org/licenses/LICENSE-2.0
9773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi *
10773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * Unless required by applicable law or agreed to in writing, software
11773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS,
12773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * See the License for the specific language governing permissions and
14773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * limitations under the License.
15773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi */
16773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
17773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
18773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "sles_to_android.h"
19773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
20c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi#ifdef USE_ANDROID
21c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi
22c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel TriviSLresult sles_to_android_CheckAudioPlayerSourceSink(SLDataSource *pAudioSrc, SLDataSink *pAudioSnk)
23c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi{
24c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    //--------------------------------------
25c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    // Sink check:
26c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    //     currently only OutputMix sinks are supported, regardless of the data source
27c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    if (*(SLuint32 *)pAudioSnk->pLocator != SL_DATALOCATOR_OUTPUTMIX) {
28c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        fprintf(stderr, "Cannot create audio player: data sink is not SL_DATALOCATOR_OUTPUTMIX\n");
29c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        return SL_RESULT_PARAMETER_INVALID;
30c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    }
31c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi
32c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    //--------------------------------------
33c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    // Source check:
34c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    SLuint32 locatorType = *(SLuint32 *)pAudioSrc->pLocator;
35c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    SLuint32 formatType = *(SLuint32 *)pAudioSrc->pFormat;
36c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    SLuint32 numBuffers = 0;
37c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    switch (locatorType) {
38c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    //------------------
39c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    //   Buffer Queues
40c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    case SL_DATALOCATOR_BUFFERQUEUE: {
41c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        SLDataLocator_BufferQueue *dl_bq =  (SLDataLocator_BufferQueue *) pAudioSrc->pLocator;
42c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        numBuffers = dl_bq->numBuffers;
43c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        if (0 == numBuffers) {
44c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            fprintf(stderr, "Cannot create audio player: data source buffer queue has ");
45c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            fprintf(stderr, "a depth of 0");
46c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            return SL_RESULT_PARAMETER_INVALID;
47c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        }
48c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        // Buffer format
49c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        switch (formatType) {
50c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        case SL_DATAFORMAT_PCM: {
51c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            SLDataFormat_PCM *df_pcm = (SLDataFormat_PCM *) pAudioSrc->pFormat;
52c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            switch (df_pcm->numChannels) {
53c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            case 1:
54c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            case 2:
55c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                break;
56c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            default:
57c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                fprintf(stderr, "Cannot create audio player: implementation doesn't ");
58c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                fprintf(stderr, "support buffers with more than 2 channels");
59c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                return SL_RESULT_CONTENT_UNSUPPORTED;
60c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            }
61c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            switch (df_pcm->samplesPerSec) {
62c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            case SL_SAMPLINGRATE_8:
63c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            case SL_SAMPLINGRATE_11_025:
64c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            case SL_SAMPLINGRATE_12:
65c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            case SL_SAMPLINGRATE_16:
66c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            case SL_SAMPLINGRATE_22_05:
67c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            case SL_SAMPLINGRATE_24:
68c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            case SL_SAMPLINGRATE_32:
69c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            case SL_SAMPLINGRATE_44_1:
70c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                break;
71c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                // others
72c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            default:
73c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                fprintf(stderr, "Cannot create audio player: unsupported sample rate");
74c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                return SL_RESULT_CONTENT_UNSUPPORTED;
75c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            }
76c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            switch (df_pcm->bitsPerSample) {
77c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            case SL_PCMSAMPLEFORMAT_FIXED_8:
78c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            case SL_PCMSAMPLEFORMAT_FIXED_16:
79c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                break;
80c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                // others
81c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            default:
82c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                fprintf(stderr, "Cannot create audio player: unsupported sample format %lu",
83c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                        (SLuint32)df_pcm->bitsPerSample);
84c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                return SL_RESULT_CONTENT_UNSUPPORTED;
85c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            }
86c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            switch (df_pcm->containerSize) {
87c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            case 16:
88c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                break;
89c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                // others
90c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            default:
91c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                //FIXME add error message
92c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                return SL_RESULT_CONTENT_UNSUPPORTED;
93c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            }
94c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            switch (df_pcm->channelMask) {
95c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                // FIXME needs work
96c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            default:
97c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                break;
98c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            }
99c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            switch (df_pcm->endianness) {
100c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            case SL_BYTEORDER_LITTLEENDIAN:
101c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                break;
102c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                // others esp. big and native (new not in spec)
103c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            default:
104c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                //FIXME add error message
105c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                return SL_RESULT_CONTENT_UNSUPPORTED;
106c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            }
107c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            } //case SL_DATAFORMAT_PCM
108c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            break;
109c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        case SL_DATAFORMAT_MIME:
110c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        case SL_DATAFORMAT_RESERVED3:
111c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            //FIXME add error message
112c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            return SL_RESULT_CONTENT_UNSUPPORTED;
113c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        default:
114c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            //FIXME add error message
115c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            return SL_RESULT_PARAMETER_INVALID;
116c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        } // switch (formatType)
117c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        } // case SL_DATALOCATOR_BUFFERQUEUE
118c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        break;
119c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    //------------------
120c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    //   Address
121c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    case SL_DATALOCATOR_ADDRESS:
122c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        // FIXME add URI checks
123c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        break;
124c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    case SL_DATALOCATOR_IODEVICE:
125c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    case SL_DATALOCATOR_OUTPUTMIX:
126c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    case SL_DATALOCATOR_RESERVED5:
127c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    case SL_DATALOCATOR_MIDIBUFFERQUEUE:
128c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    case SL_DATALOCATOR_RESERVED8:
129c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        return SL_RESULT_CONTENT_UNSUPPORTED;
130c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    default:
131c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        return SL_RESULT_PARAMETER_INVALID;
132c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    }// switch (locatorType)
133c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi
134c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    return SL_RESULT_SUCCESS;
135c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi}
136c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi
137773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
138c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel TriviSLresult sles_to_android_CreateAudioPlayer(SLDataSource *pAudioSrc,
139773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        SLDataSink *pAudioSnk,
140773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi        AudioPlayer_class *pAudioPlayer) {
141773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
142c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    SLresult result = SL_RESULT_SUCCESS;
143c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi
144c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    // currently only OutputMix sinks are supported
145c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    // this has been verified in sles_to_android_CheckAudioPlayerSourceSink
146c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi
147c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    //--------------------------------------
148c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    // Source check:
149c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    SLuint32 locatorType = *(SLuint32 *)pAudioSrc->pLocator;
150c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    //SLuint32 formatType = *(SLuint32 *)pAudioSrc->pFormat;
151c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    //SLuint32 numBuffers = 0;
152c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    switch (locatorType) {
153c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    case SL_DATALOCATOR_BUFFERQUEUE:
154c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        pAudioPlayer->mAndroidObjType = AUDIOTRACK_PUSH;
155c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        pAudioPlayer->mAudioTrack = //new android::AudioTrack();
156c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            new android::AudioTrack(
157c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                    android::AudioSystem::MUSIC,            // streamType
158c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                    44100,                                  // sampleRate
159c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                    android::AudioSystem::PCM_16_BIT,       // format
160c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                    // FIXME should be stereo, but mono gives more audio output for testing
161c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                    android::AudioSystem::CHANNEL_OUT_MONO, // channels
162c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                    256 * 20,                               // frameCount
163c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                    0,                                      // flags
164c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                    NULL,                    // cbf (callback)
165c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                    NULL,                          // user
166c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                    256 * 20);                              // notificationFrame
167c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        break;
168c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    case SL_DATALOCATOR_ADDRESS:
169c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        pAudioPlayer->mAndroidObjType = MEDIAPLAYER;
170c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        pAudioPlayer->mMediaPlayer = new android::MediaPlayer();
171c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        break;
172c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    default:
173c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        pAudioPlayer->mAndroidObjType = INVALID_TYPE;
174c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        result = SL_RESULT_PARAMETER_INVALID;
175c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    }
176c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi
177c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    return result;
178773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
179773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi}
180773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
181c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi#endif
182