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 /* MIDITime implementation */
18 
19 #include "sles_allinclusive.h"
20 
21 
IMIDITime_GetDuration(SLMIDITimeItf self,SLuint32 * pDuration)22 static SLresult IMIDITime_GetDuration(SLMIDITimeItf self, SLuint32 *pDuration)
23 {
24     SL_ENTER_INTERFACE
25 
26     if (NULL == pDuration) {
27         result = SL_RESULT_PARAMETER_INVALID;
28     } else {
29         IMIDITime *thiz = (IMIDITime *) self;
30         SLuint32 duration = thiz->mDuration;
31         *pDuration = duration;
32         result = SL_RESULT_SUCCESS;
33     }
34 
35     SL_LEAVE_INTERFACE
36 }
37 
38 
IMIDITime_SetPosition(SLMIDITimeItf self,SLuint32 position)39 static SLresult IMIDITime_SetPosition(SLMIDITimeItf self, SLuint32 position)
40 {
41     SL_ENTER_INTERFACE
42 
43     IMIDITime *thiz = (IMIDITime *) self;
44     // const, no lock needed
45     if (!(position < thiz->mDuration)) {
46         result = SL_RESULT_PARAMETER_INVALID;
47     } else {
48         interface_lock_poke(thiz);
49         thiz->mPosition = position;
50         interface_unlock_poke(thiz);
51         result = SL_RESULT_SUCCESS;
52     }
53 
54     SL_LEAVE_INTERFACE
55 }
56 
57 
IMIDITime_GetPosition(SLMIDITimeItf self,SLuint32 * pPosition)58 static SLresult IMIDITime_GetPosition(SLMIDITimeItf self, SLuint32 *pPosition)
59 {
60     SL_ENTER_INTERFACE
61 
62     if (NULL == pPosition) {
63         result = SL_RESULT_PARAMETER_INVALID;
64     } else {
65         IMIDITime *thiz = (IMIDITime *) self;
66         interface_lock_peek(thiz);
67         SLuint32 position = thiz->mPosition;
68         interface_unlock_peek(thiz);
69         *pPosition = position;
70         result = SL_RESULT_SUCCESS;
71     }
72 
73     SL_LEAVE_INTERFACE
74 }
75 
76 
IMIDITime_SetLoopPoints(SLMIDITimeItf self,SLuint32 startTick,SLuint32 numTicks)77 static SLresult IMIDITime_SetLoopPoints(SLMIDITimeItf self, SLuint32 startTick, SLuint32 numTicks)
78 {
79     SL_ENTER_INTERFACE
80 
81     IMIDITime *thiz = (IMIDITime *) self;
82     // const, no lock needed
83     SLuint32 duration = thiz->mDuration;
84     if (!((startTick < duration) && (numTicks <= duration - startTick))) {
85         result = SL_RESULT_PARAMETER_INVALID;
86     } else {
87         interface_lock_exclusive(thiz);
88         thiz->mStartTick = startTick;
89         thiz->mNumTicks = numTicks;
90         interface_unlock_exclusive(thiz);
91         result = SL_RESULT_SUCCESS;
92     }
93 
94     SL_LEAVE_INTERFACE
95 }
96 
97 
IMIDITime_GetLoopPoints(SLMIDITimeItf self,SLuint32 * pStartTick,SLuint32 * pNumTicks)98 static SLresult IMIDITime_GetLoopPoints(SLMIDITimeItf self, SLuint32 *pStartTick,
99     SLuint32 *pNumTicks)
100 {
101     SL_ENTER_INTERFACE
102 
103     if (NULL == pStartTick || NULL == pNumTicks) {
104         result = SL_RESULT_PARAMETER_INVALID;
105     } else {
106         IMIDITime *thiz = (IMIDITime *) self;
107         interface_lock_shared(thiz);
108         SLuint32 startTick = thiz->mStartTick;
109         SLuint32 numTicks = thiz->mNumTicks;
110         interface_unlock_shared(thiz);
111         *pStartTick = startTick;
112         *pNumTicks = numTicks;
113         result = SL_RESULT_SUCCESS;
114     }
115 
116     SL_LEAVE_INTERFACE
117 }
118 
119 
120 static const struct SLMIDITimeItf_ IMIDITime_Itf = {
121     IMIDITime_GetDuration,
122     IMIDITime_SetPosition,
123     IMIDITime_GetPosition,
124     IMIDITime_SetLoopPoints,
125     IMIDITime_GetLoopPoints
126 };
127 
IMIDITime_init(void * self)128 void IMIDITime_init(void *self)
129 {
130     IMIDITime *thiz = (IMIDITime *) self;
131     thiz->mItf = &IMIDITime_Itf;
132     thiz->mDuration = 0;
133     thiz->mPosition = 0;
134     thiz->mStartTick = 0;
135     thiz->mNumTicks = 0;
136 }
137