IPrefetchStatus.c revision bcc5c7225e3b7a1dbf2e9e830987f69167acf06f
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;
30bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_lock_peek(thiz);
31bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        SLuint32 status = thiz->mStatus;
32bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_unlock_peek(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;
49bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_lock_peek(thiz);
50bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        SLpermille level = thiz->mLevel;
51bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_unlock_peek(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
80bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    IPrefetchStatus *thiz = (IPrefetchStatus *) self;
81bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    interface_lock_poke(thiz);
82bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mCallbackEventsMask = eventFlags;
83bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    interface_unlock_poke(thiz);
84ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    result = SL_RESULT_SUCCESS;
85ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
86ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
8761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
8861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
89ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
9061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IPrefetchStatus_GetCallbackEventsMask(SLPrefetchStatusItf self,
9161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    SLuint32 *pEventFlags)
9261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
93ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
94ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
95ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (NULL == pEventFlags) {
96ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
97ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
98bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        IPrefetchStatus *thiz = (IPrefetchStatus *) self;
99bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_lock_peek(thiz);
100bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        SLuint32 callbackEventsMask = thiz->mCallbackEventsMask;
101bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_unlock_peek(thiz);
102ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        *pEventFlags = callbackEventsMask;
103ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
104ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
105ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
106ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
10761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
10861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
109ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
110d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IPrefetchStatus_SetFillUpdatePeriod(SLPrefetchStatusItf self, SLpermille period)
11161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
112ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
113ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
114ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (0 == period) {
115ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
116ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
117bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        IPrefetchStatus *thiz = (IPrefetchStatus *) self;
118bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_lock_poke(thiz);
119bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        thiz->mFillUpdatePeriod = period;
120bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_unlock_poke(thiz);
121ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
122ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
123ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
124ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
12561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
12661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
127ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
128d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IPrefetchStatus_GetFillUpdatePeriod(SLPrefetchStatusItf self, SLpermille *pPeriod)
12961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
130ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
131ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
132ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (NULL == pPeriod) {
133ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
134ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
135bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        IPrefetchStatus *thiz = (IPrefetchStatus *) self;
136bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_lock_peek(thiz);
137bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        SLpermille fillUpdatePeriod = thiz->mFillUpdatePeriod;
138bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_unlock_peek(thiz);
139ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        *pPeriod = fillUpdatePeriod;
140ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
141ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
142ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
143ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
14461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
14561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
146ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
14761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic const struct SLPrefetchStatusItf_ IPrefetchStatus_Itf = {
14861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IPrefetchStatus_GetPrefetchStatus,
14961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IPrefetchStatus_GetFillLevel,
15061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IPrefetchStatus_RegisterCallback,
15161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IPrefetchStatus_SetCallbackEventsMask,
15261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IPrefetchStatus_GetCallbackEventsMask,
15361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IPrefetchStatus_SetFillUpdatePeriod,
15461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IPrefetchStatus_GetFillUpdatePeriod
15561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten};
15661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
15761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenvoid IPrefetchStatus_init(void *self)
15861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
159bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    IPrefetchStatus *thiz = (IPrefetchStatus *) self;
160bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mItf = &IPrefetchStatus_Itf;
161bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mStatus = SL_PREFETCHSTATUS_UNDERFLOW;
162bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mLevel = 0;
163bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mCallback = NULL;
164bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mContext = NULL;
165bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mCallbackEventsMask = 0;
166bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mFillUpdatePeriod = 100;
16761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
168