1b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten/* 2b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten * Copyright (C) 2010 The Android Open Source Project 3b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten * 4b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten * Licensed under the Apache License, Version 2.0 (the "License"); 5b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten * you may not use this file except in compliance with the License. 6b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten * You may obtain a copy of the License at 7b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten * 8b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten * http://www.apache.org/licenses/LICENSE-2.0 9b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten * 10b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten * Unless required by applicable law or agreed to in writing, software 11b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten * distributed under the License is distributed on an "AS IS" BASIS, 12b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten * See the License for the specific language governing permissions and 14b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten * limitations under the License. 15b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten */ 16b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten 17369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten/** \file CAudioPlayer.c AudioPlayer class */ 18b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten 19b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten#include "sles_allinclusive.h" 20b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten 21b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten 22369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten/** \brief Hook called by Object::Realize when an audio player is realized */ 230b595cc18d82e41dfab0c686e9e63c30a86e8c80Glenn Kasten 24b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn KastenSLresult CAudioPlayer_Realize(void *self, SLboolean async) 25b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten{ 26bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten CAudioPlayer *thiz = (CAudioPlayer *) self; 27b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten SLresult result = SL_RESULT_SUCCESS; 28b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten 29ef8931ae547cd703e69df9ad350d69825da0f546Jean-Michel Trivi#ifdef ANDROID 30bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten result = android_audioPlayer_realize(thiz, async); 31b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten#endif 32b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten 33b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten#ifdef USE_SNDFILE 34bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten result = SndFile_Realize(thiz); 358c065779232fdd89abace68d2fc7bea786a010d7Glenn Kasten#endif 36a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten 37f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten // At this point the channel count and sample rate might still be unknown, 38f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten // depending on the data source and the platform implementation. 39f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten // If they are unknown here, then they will be determined during prefetch. 40f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten 41b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten return result; 42b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten} 43b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten 440b595cc18d82e41dfab0c686e9e63c30a86e8c80Glenn Kasten 45928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten/** \brief Hook called by Object::Resume when an audio player is resumed */ 46928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten 47928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn KastenSLresult CAudioPlayer_Resume(void *self, SLboolean async) 48928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten{ 49928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten return SL_RESULT_SUCCESS; 50928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten} 51928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten 52928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten 53369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten/** \brief Hook called by Object::Destroy when an audio player is destroyed */ 540b595cc18d82e41dfab0c686e9e63c30a86e8c80Glenn Kasten 55b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kastenvoid CAudioPlayer_Destroy(void *self) 56b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten{ 57bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten CAudioPlayer *thiz = (CAudioPlayer *) self; 5813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi#ifdef ANDROID 5913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi android_audioPlayer_destroy(thiz); 6013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi#endif 61bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten freeDataLocatorFormat(&thiz->mDataSource); 62bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten freeDataLocatorFormat(&thiz->mDataSink); 63b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten#ifdef USE_SNDFILE 64bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SndFile_Destroy(thiz); 65a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten#endif 66b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten} 67928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten 68928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten 69928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten/** \brief Hook called by Object::Destroy before an audio player is about to be destroyed */ 70928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten 711d081e49a10543018e1ae33792bd3d30504719baGlenn Kastenpredestroy_t CAudioPlayer_PreDestroy(void *self) 72928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten{ 73bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten CAudioPlayer *thiz = (CAudioPlayer *) self; 7483ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi#ifdef ANDROID 7583ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi android_audioPlayer_preDestroy(thiz); 7683ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi#endif 7783ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi 7883ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi#ifdef USE_OUTPUTMIXEXT 7943ad61e9e61b332f7d9f2b991954fcac4c11d691Glenn Kasten // Safe to proceed immediately if a track has not yet been assigned 80bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten Track *track = thiz->mTrack; 811d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten if (NULL == track) { 821d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten return predestroy_ok; 831d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten } 8443ad61e9e61b332f7d9f2b991954fcac4c11d691Glenn Kasten CAudioPlayer *audioPlayer = track->mAudioPlayer; 851d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten if (NULL == audioPlayer) { 861d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten return predestroy_ok; 871d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten } 88bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten assert(audioPlayer == thiz); 89928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten // Request the mixer thread to unlink this audio player's track 90bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mDestroyRequested = true; 91bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten while (thiz->mDestroyRequested) { 92928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten object_cond_wait(self); 93928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten } 94928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten // Mixer thread has acknowledged the request 95928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten#endif 961d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten return predestroy_ok; 97928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten} 98f51dba65751107c930759938775b75531ec1f330Glenn Kasten 99f51dba65751107c930759938775b75531ec1f330Glenn Kasten 100f51dba65751107c930759938775b75531ec1f330Glenn Kasten/** \brief Given an audio player, return its data sink, which is guaranteed to be a non-NULL output 101f51dba65751107c930759938775b75531ec1f330Glenn Kasten * mix. This function is used by effect send. 102f51dba65751107c930759938775b75531ec1f330Glenn Kasten */ 103f51dba65751107c930759938775b75531ec1f330Glenn Kasten 104f51dba65751107c930759938775b75531ec1f330Glenn KastenCOutputMix *CAudioPlayer_GetOutputMix(CAudioPlayer *audioPlayer) 105f51dba65751107c930759938775b75531ec1f330Glenn Kasten{ 106f51dba65751107c930759938775b75531ec1f330Glenn Kasten assert(NULL != audioPlayer); 107f51dba65751107c930759938775b75531ec1f330Glenn Kasten assert(SL_DATALOCATOR_OUTPUTMIX == audioPlayer->mDataSink.mLocator.mLocatorType); 108f51dba65751107c930759938775b75531ec1f330Glenn Kasten SLObjectItf outputMix = audioPlayer->mDataSink.mLocator.mOutputMix.outputMix; 109f51dba65751107c930759938775b75531ec1f330Glenn Kasten assert(NULL != outputMix); 110f51dba65751107c930759938775b75531ec1f330Glenn Kasten return (COutputMix *) outputMix; 111f51dba65751107c930759938775b75531ec1f330Glenn Kasten} 112