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