10b167267bda99b68346045ccab14e810121d5de4Glenn Kasten/* 20b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * Copyright (C) 2010 The Android Open Source Project 30b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * 40b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * Licensed under the Apache License, Version 2.0 (the "License"); 50b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * you may not use this file except in compliance with the License. 60b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * You may obtain a copy of the License at 70b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * 80b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * http://www.apache.org/licenses/LICENSE-2.0 90b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * 100b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * Unless required by applicable law or agreed to in writing, software 110b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * distributed under the License is distributed on an "AS IS" BASIS, 120b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * See the License for the specific language governing permissions and 140b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * limitations under the License. 150b167267bda99b68346045ccab14e810121d5de4Glenn Kasten */ 160b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 170b167267bda99b68346045ccab14e810121d5de4Glenn Kasten/* MIDITime implementation */ 180b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 190b167267bda99b68346045ccab14e810121d5de4Glenn Kasten#include "sles_allinclusive.h" 200b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 21ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 220b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IMIDITime_GetDuration(SLMIDITimeItf self, SLuint32 *pDuration) 230b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 24ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 25ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 26ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pDuration) { 27ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 28ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 29bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IMIDITime *thiz = (IMIDITime *) self; 30bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLuint32 duration = thiz->mDuration; 31ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pDuration = duration; 32ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 33ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 34ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 35ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 360b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 370b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 38ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 390b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IMIDITime_SetPosition(SLMIDITimeItf self, SLuint32 position) 400b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 41ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 42ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 43bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IMIDITime *thiz = (IMIDITime *) self; 44d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten // const, no lock needed 45bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten if (!(position < thiz->mDuration)) { 46ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 47ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 48bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_poke(thiz); 49bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mPosition = position; 50bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_poke(thiz); 51ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 52ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 53ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 54ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 550b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 560b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 57ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 580b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IMIDITime_GetPosition(SLMIDITimeItf self, SLuint32 *pPosition) 590b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 60ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 61ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 62ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pPosition) { 63ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 64ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 65bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IMIDITime *thiz = (IMIDITime *) self; 66bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_peek(thiz); 67bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLuint32 position = thiz->mPosition; 68bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_peek(thiz); 69ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pPosition = position; 70ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 71ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 72ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 73ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 740b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 750b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 76ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 770b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IMIDITime_SetLoopPoints(SLMIDITimeItf self, SLuint32 startTick, SLuint32 numTicks) 780b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 79ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 80ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 81bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IMIDITime *thiz = (IMIDITime *) self; 82d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten // const, no lock needed 83bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLuint32 duration = thiz->mDuration; 84ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (!((startTick < duration) && (numTicks <= duration - startTick))) { 85ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 86ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 87bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_exclusive(thiz); 88bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mStartTick = startTick; 89bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mNumTicks = numTicks; 90bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_exclusive(thiz); 91ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 92ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 93ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 94ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 950b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 960b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 97ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 980b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IMIDITime_GetLoopPoints(SLMIDITimeItf self, SLuint32 *pStartTick, 990b167267bda99b68346045ccab14e810121d5de4Glenn Kasten SLuint32 *pNumTicks) 1000b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 101ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 102ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 103ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pStartTick || NULL == pNumTicks) { 104ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 105ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 106bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IMIDITime *thiz = (IMIDITime *) self; 107bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_shared(thiz); 108bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLuint32 startTick = thiz->mStartTick; 109bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLuint32 numTicks = thiz->mNumTicks; 110bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_shared(thiz); 111ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pStartTick = startTick; 112ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pNumTicks = numTicks; 113ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 114ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 115ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 116ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 1170b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 1180b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 119ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 1200b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic const struct SLMIDITimeItf_ IMIDITime_Itf = { 1210b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IMIDITime_GetDuration, 1220b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IMIDITime_SetPosition, 1230b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IMIDITime_GetPosition, 1240b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IMIDITime_SetLoopPoints, 1250b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IMIDITime_GetLoopPoints 1260b167267bda99b68346045ccab14e810121d5de4Glenn Kasten}; 1270b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 1280b167267bda99b68346045ccab14e810121d5de4Glenn Kastenvoid IMIDITime_init(void *self) 1290b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 130bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IMIDITime *thiz = (IMIDITime *) self; 131bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mItf = &IMIDITime_Itf; 132bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mDuration = 0; 133bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mPosition = 0; 134bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mStartTick = 0; 135bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mNumTicks = 0; 1360b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 137