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