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