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