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/* MIDITempo implementation */ 180b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 190b167267bda99b68346045ccab14e810121d5de4Glenn Kasten#include "sles_allinclusive.h" 200b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 21ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 220b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IMIDITempo_SetTicksPerQuarterNote(SLMIDITempoItf self, SLuint32 tpqn) 230b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 24ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 25ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 26ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (!(1 <= tpqn && tpqn <= 32767)) { 27ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 28ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 29bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IMIDITempo *thiz = (IMIDITempo *) self; 30bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_poke(thiz); 31bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mTicksPerQuarterNote = tpqn; 32bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_poke(thiz); 33ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 34ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 35ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 36ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 370b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 380b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 39ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 400b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IMIDITempo_GetTicksPerQuarterNote(SLMIDITempoItf self, SLuint32 *pTpqn) 410b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 42ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 43ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 44ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pTpqn) { 45ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 46ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 47bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IMIDITempo *thiz = (IMIDITempo *) self; 48bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_peek(thiz); 49bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLuint32 ticksPerQuarterNote = thiz->mTicksPerQuarterNote; 50bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_peek(thiz); 51ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pTpqn = ticksPerQuarterNote; 52ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 53ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 54ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 55ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 560b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 570b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 58ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 590b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IMIDITempo_SetMicrosecondsPerQuarterNote(SLMIDITempoItf self, SLmicrosecond uspqn) 600b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 61ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 62ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 637a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten // spec says zero, is that correct? 64ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (!(1 <= uspqn && uspqn <= 16777215)) { 65ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 66ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 67bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IMIDITempo *thiz = (IMIDITempo *) self; 68bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_poke(thiz); 69bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mMicrosecondsPerQuarterNote = uspqn; 70bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_poke(thiz); 71ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 72ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 73ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 74ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 750b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 760b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 77ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 780b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IMIDITempo_GetMicrosecondsPerQuarterNote(SLMIDITempoItf self, SLmicrosecond *uspqn) 790b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 80ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 81ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 82ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == uspqn) { 83ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 84ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 85bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IMIDITempo *thiz = (IMIDITempo *) self; 86bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_peek(thiz); 87bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLuint32 microsecondsPerQuarterNote = thiz->mMicrosecondsPerQuarterNote; 88bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_peek(thiz); 89ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *uspqn = microsecondsPerQuarterNote; 90ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 91ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 92ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 93ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 940b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 950b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 96ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 970b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic const struct SLMIDITempoItf_ IMIDITempo_Itf = { 980b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IMIDITempo_SetTicksPerQuarterNote, 990b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IMIDITempo_GetTicksPerQuarterNote, 1000b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IMIDITempo_SetMicrosecondsPerQuarterNote, 1010b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IMIDITempo_GetMicrosecondsPerQuarterNote 1020b167267bda99b68346045ccab14e810121d5de4Glenn Kasten}; 1030b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 1040b167267bda99b68346045ccab14e810121d5de4Glenn Kastenvoid IMIDITempo_init(void *self) 1050b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 106bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IMIDITempo *thiz = (IMIDITempo *) self; 107bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mItf = &IMIDITempo_Itf; 108bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mTicksPerQuarterNote = 32; // wrong 109bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mMicrosecondsPerQuarterNote = 100; // wrong 1100b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 111