Home | History | Annotate | Download | only in itf
      1 /*
      2  * Copyright (C) 2010 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 /* PrefetchStatus implementation */
     18 
     19 #include "sles_allinclusive.h"
     20 
     21 
     22 static SLresult IPrefetchStatus_GetPrefetchStatus(SLPrefetchStatusItf self, SLuint32 *pStatus)
     23 {
     24     SL_ENTER_INTERFACE
     25 
     26     if (NULL == pStatus) {
     27         result = SL_RESULT_PARAMETER_INVALID;
     28     } else {
     29         IPrefetchStatus *thiz = (IPrefetchStatus *) self;
     30         interface_lock_shared(thiz);
     31         SLuint32 status = thiz->mStatus;
     32         interface_unlock_shared(thiz);
     33         *pStatus = status;
     34         result = SL_RESULT_SUCCESS;
     35     }
     36 
     37     SL_LEAVE_INTERFACE
     38 }
     39 
     40 
     41 static SLresult IPrefetchStatus_GetFillLevel(SLPrefetchStatusItf self, SLpermille *pLevel)
     42 {
     43     SL_ENTER_INTERFACE
     44 
     45     if (NULL == pLevel) {
     46         result = SL_RESULT_PARAMETER_INVALID;
     47     } else {
     48         IPrefetchStatus *thiz = (IPrefetchStatus *) self;
     49         interface_lock_shared(thiz);
     50         SLpermille level = thiz->mLevel;
     51         interface_unlock_shared(thiz);
     52         *pLevel = level;
     53         result = SL_RESULT_SUCCESS;
     54     }
     55 
     56     SL_LEAVE_INTERFACE
     57 }
     58 
     59 
     60 static SLresult IPrefetchStatus_RegisterCallback(SLPrefetchStatusItf self,
     61     slPrefetchCallback callback, void *pContext)
     62 {
     63     SL_ENTER_INTERFACE
     64 
     65     IPrefetchStatus *thiz = (IPrefetchStatus *) self;
     66     interface_lock_exclusive(thiz);
     67     thiz->mCallback = callback;
     68     thiz->mContext = pContext;
     69     interface_unlock_exclusive(thiz);
     70     result = SL_RESULT_SUCCESS;
     71 
     72     SL_LEAVE_INTERFACE
     73 }
     74 
     75 
     76 static SLresult IPrefetchStatus_SetCallbackEventsMask(SLPrefetchStatusItf self, SLuint32 eventFlags)
     77 {
     78     SL_ENTER_INTERFACE
     79 
     80     if (eventFlags & ~(SL_PREFETCHEVENT_STATUSCHANGE | SL_PREFETCHEVENT_FILLLEVELCHANGE)) {
     81         result = SL_RESULT_PARAMETER_INVALID;
     82 
     83     } else {
     84         IPrefetchStatus *thiz = (IPrefetchStatus *) self;
     85         interface_lock_exclusive(thiz);
     86         thiz->mCallbackEventsMask = eventFlags;
     87         interface_unlock_exclusive(thiz);
     88         result = SL_RESULT_SUCCESS;
     89 
     90     }
     91 
     92     SL_LEAVE_INTERFACE
     93 }
     94 
     95 
     96 static SLresult IPrefetchStatus_GetCallbackEventsMask(SLPrefetchStatusItf self,
     97     SLuint32 *pEventFlags)
     98 {
     99     SL_ENTER_INTERFACE
    100 
    101     if (NULL == pEventFlags) {
    102         result = SL_RESULT_PARAMETER_INVALID;
    103     } else {
    104         IPrefetchStatus *thiz = (IPrefetchStatus *) self;
    105         interface_lock_shared(thiz);
    106         SLuint32 callbackEventsMask = thiz->mCallbackEventsMask;
    107         interface_unlock_shared(thiz);
    108         *pEventFlags = callbackEventsMask;
    109         result = SL_RESULT_SUCCESS;
    110     }
    111 
    112     SL_LEAVE_INTERFACE
    113 }
    114 
    115 
    116 static SLresult IPrefetchStatus_SetFillUpdatePeriod(SLPrefetchStatusItf self, SLpermille period)
    117 {
    118     SL_ENTER_INTERFACE
    119 
    120     if (0 == period) {
    121         result = SL_RESULT_PARAMETER_INVALID;
    122     } else {
    123         IPrefetchStatus *thiz = (IPrefetchStatus *) self;
    124         interface_lock_exclusive(thiz);
    125         thiz->mFillUpdatePeriod = period;
    126 #ifdef ANDROID
    127         if (SL_OBJECTID_AUDIOPLAYER == InterfaceToObjectID(thiz)) {
    128             CAudioPlayer *ap = (CAudioPlayer *) thiz->mThis;
    129             android_audioPlayer_setBufferingUpdateThresholdPerMille(ap, period);
    130         }
    131 #endif
    132         interface_unlock_exclusive(thiz);
    133         result = SL_RESULT_SUCCESS;
    134     }
    135 
    136     SL_LEAVE_INTERFACE
    137 }
    138 
    139 
    140 static SLresult IPrefetchStatus_GetFillUpdatePeriod(SLPrefetchStatusItf self, SLpermille *pPeriod)
    141 {
    142     SL_ENTER_INTERFACE
    143 
    144     if (NULL == pPeriod) {
    145         result = SL_RESULT_PARAMETER_INVALID;
    146     } else {
    147         IPrefetchStatus *thiz = (IPrefetchStatus *) self;
    148         interface_lock_shared(thiz);
    149         SLpermille fillUpdatePeriod = thiz->mFillUpdatePeriod;
    150         interface_unlock_shared(thiz);
    151         *pPeriod = fillUpdatePeriod;
    152         result = SL_RESULT_SUCCESS;
    153     }
    154 
    155     SL_LEAVE_INTERFACE
    156 }
    157 
    158 
    159 static const struct SLPrefetchStatusItf_ IPrefetchStatus_Itf = {
    160     IPrefetchStatus_GetPrefetchStatus,
    161     IPrefetchStatus_GetFillLevel,
    162     IPrefetchStatus_RegisterCallback,
    163     IPrefetchStatus_SetCallbackEventsMask,
    164     IPrefetchStatus_GetCallbackEventsMask,
    165     IPrefetchStatus_SetFillUpdatePeriod,
    166     IPrefetchStatus_GetFillUpdatePeriod
    167 };
    168 
    169 void IPrefetchStatus_init(void *self)
    170 {
    171     IPrefetchStatus *thiz = (IPrefetchStatus *) self;
    172     thiz->mItf = &IPrefetchStatus_Itf;
    173     thiz->mStatus = SL_PREFETCHSTATUS_UNDERFLOW;
    174     thiz->mLevel = 0;
    175     thiz->mCallback = NULL;
    176     thiz->mContext = NULL;
    177     thiz->mCallbackEventsMask = 0;
    178     thiz->mFillUpdatePeriod = 100;
    179 #ifdef ANDROID
    180     thiz->mDeferredPrefetchCallback = NULL;
    181     thiz->mDeferredPrefetchContext  = NULL;
    182     thiz->mDeferredPrefetchEvents   = SL_PREFETCHEVENT_NONE;
    183 #endif
    184 }
    185