161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten/* 261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * Copyright (C) 2010 The Android Open Source Project 361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * 461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * Licensed under the Apache License, Version 2.0 (the "License"); 561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * you may not use this file except in compliance with the License. 661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * You may obtain a copy of the License at 761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * 861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * http://www.apache.org/licenses/LICENSE-2.0 961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * 1061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * Unless required by applicable law or agreed to in writing, software 1161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * distributed under the License is distributed on an "AS IS" BASIS, 1261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * See the License for the specific language governing permissions and 1461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * limitations under the License. 1561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten */ 1661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 1761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten/* PrefetchStatus implementation */ 1861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 1961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten#include "sles_allinclusive.h" 2061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 21ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 22d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IPrefetchStatus_GetPrefetchStatus(SLPrefetchStatusItf self, SLuint32 *pStatus) 2361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 24ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 25ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 26ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pStatus) { 27ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 28ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 29bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IPrefetchStatus *thiz = (IPrefetchStatus *) self; 30a60dbf554549d10780f473b6e1373aa07aec3a28Glenn Kasten interface_lock_shared(thiz); 31bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLuint32 status = thiz->mStatus; 32a60dbf554549d10780f473b6e1373aa07aec3a28Glenn Kasten interface_unlock_shared(thiz); 33ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pStatus = status; 34ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 35ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 36ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 37ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 3861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 3961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 40ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 41d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IPrefetchStatus_GetFillLevel(SLPrefetchStatusItf self, SLpermille *pLevel) 4261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 43ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 44ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 45ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pLevel) { 46ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 47ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 48bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IPrefetchStatus *thiz = (IPrefetchStatus *) self; 49a60dbf554549d10780f473b6e1373aa07aec3a28Glenn Kasten interface_lock_shared(thiz); 50bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLpermille level = thiz->mLevel; 51a60dbf554549d10780f473b6e1373aa07aec3a28Glenn Kasten interface_unlock_shared(thiz); 52ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pLevel = level; 53ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 54ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 55ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 56ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 5761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 5861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 59ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 6061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IPrefetchStatus_RegisterCallback(SLPrefetchStatusItf self, 6161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten slPrefetchCallback callback, void *pContext) 6261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 63ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 64ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 65bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IPrefetchStatus *thiz = (IPrefetchStatus *) self; 66bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_exclusive(thiz); 67bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mCallback = callback; 68bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mContext = pContext; 69bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_exclusive(thiz); 70ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 71ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 72ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 7361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 7461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 75ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 76d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IPrefetchStatus_SetCallbackEventsMask(SLPrefetchStatusItf self, SLuint32 eventFlags) 7761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 78ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 79ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 80a60dbf554549d10780f473b6e1373aa07aec3a28Glenn Kasten if (eventFlags & ~(SL_PREFETCHEVENT_STATUSCHANGE | SL_PREFETCHEVENT_FILLLEVELCHANGE)) { 81a60dbf554549d10780f473b6e1373aa07aec3a28Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 82a60dbf554549d10780f473b6e1373aa07aec3a28Glenn Kasten 83a60dbf554549d10780f473b6e1373aa07aec3a28Glenn Kasten } else { 84a60dbf554549d10780f473b6e1373aa07aec3a28Glenn Kasten IPrefetchStatus *thiz = (IPrefetchStatus *) self; 85a60dbf554549d10780f473b6e1373aa07aec3a28Glenn Kasten interface_lock_exclusive(thiz); 86a60dbf554549d10780f473b6e1373aa07aec3a28Glenn Kasten thiz->mCallbackEventsMask = eventFlags; 87a60dbf554549d10780f473b6e1373aa07aec3a28Glenn Kasten interface_unlock_exclusive(thiz); 88a60dbf554549d10780f473b6e1373aa07aec3a28Glenn Kasten result = SL_RESULT_SUCCESS; 89a60dbf554549d10780f473b6e1373aa07aec3a28Glenn Kasten 90a60dbf554549d10780f473b6e1373aa07aec3a28Glenn Kasten } 91ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 92ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 9361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 9461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 95ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 9661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IPrefetchStatus_GetCallbackEventsMask(SLPrefetchStatusItf self, 9761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten SLuint32 *pEventFlags) 9861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 99ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 100ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 101ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pEventFlags) { 102ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 103ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 104bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IPrefetchStatus *thiz = (IPrefetchStatus *) self; 105a60dbf554549d10780f473b6e1373aa07aec3a28Glenn Kasten interface_lock_shared(thiz); 106bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLuint32 callbackEventsMask = thiz->mCallbackEventsMask; 107a60dbf554549d10780f473b6e1373aa07aec3a28Glenn Kasten interface_unlock_shared(thiz); 108ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pEventFlags = callbackEventsMask; 109ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 110ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 111ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 112ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 11361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 11461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 115ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 116d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IPrefetchStatus_SetFillUpdatePeriod(SLPrefetchStatusItf self, SLpermille period) 11761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 118ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 119ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 120ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (0 == period) { 121ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 122ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 123bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IPrefetchStatus *thiz = (IPrefetchStatus *) self; 124a60dbf554549d10780f473b6e1373aa07aec3a28Glenn Kasten interface_lock_exclusive(thiz); 125bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mFillUpdatePeriod = period; 1264ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi#ifdef ANDROID 1274ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (SL_OBJECTID_AUDIOPLAYER == InterfaceToObjectID(thiz)) { 1284ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi CAudioPlayer *ap = (CAudioPlayer *) thiz->mThis; 1294ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi android_audioPlayer_setBufferingUpdateThresholdPerMille(ap, period); 1304ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 1314ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi#endif 132a60dbf554549d10780f473b6e1373aa07aec3a28Glenn Kasten interface_unlock_exclusive(thiz); 133ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 134ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 135ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 136ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 13761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 13861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 139ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 140d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IPrefetchStatus_GetFillUpdatePeriod(SLPrefetchStatusItf self, SLpermille *pPeriod) 14161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 142ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 143ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 144ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pPeriod) { 145ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 146ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 147bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IPrefetchStatus *thiz = (IPrefetchStatus *) self; 148a60dbf554549d10780f473b6e1373aa07aec3a28Glenn Kasten interface_lock_shared(thiz); 149bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLpermille fillUpdatePeriod = thiz->mFillUpdatePeriod; 150a60dbf554549d10780f473b6e1373aa07aec3a28Glenn Kasten interface_unlock_shared(thiz); 151ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pPeriod = fillUpdatePeriod; 152ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 153ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 154ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 155ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 15661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 15761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 158ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 15961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic const struct SLPrefetchStatusItf_ IPrefetchStatus_Itf = { 16061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IPrefetchStatus_GetPrefetchStatus, 16161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IPrefetchStatus_GetFillLevel, 16261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IPrefetchStatus_RegisterCallback, 16361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IPrefetchStatus_SetCallbackEventsMask, 16461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IPrefetchStatus_GetCallbackEventsMask, 16561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IPrefetchStatus_SetFillUpdatePeriod, 16661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IPrefetchStatus_GetFillUpdatePeriod 16761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}; 16861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 16961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenvoid IPrefetchStatus_init(void *self) 17061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 171bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IPrefetchStatus *thiz = (IPrefetchStatus *) self; 172bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mItf = &IPrefetchStatus_Itf; 173bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mStatus = SL_PREFETCHSTATUS_UNDERFLOW; 174bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mLevel = 0; 175bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mCallback = NULL; 176bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mContext = NULL; 177bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mCallbackEventsMask = 0; 178bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mFillUpdatePeriod = 100; 179a60dbf554549d10780f473b6e1373aa07aec3a28Glenn Kasten#ifdef ANDROID 180a60dbf554549d10780f473b6e1373aa07aec3a28Glenn Kasten thiz->mDeferredPrefetchCallback = NULL; 181a60dbf554549d10780f473b6e1373aa07aec3a28Glenn Kasten thiz->mDeferredPrefetchContext = NULL; 182a60dbf554549d10780f473b6e1373aa07aec3a28Glenn Kasten thiz->mDeferredPrefetchEvents = SL_PREFETCHEVENT_NONE; 183a60dbf554549d10780f473b6e1373aa07aec3a28Glenn Kasten#endif 18461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 185