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 /* MIDIMessage implementation */ 18 19 #include "sles_allinclusive.h" 20 21 22 static SLresult IMIDIMessage_SendMessage(SLMIDIMessageItf self, const SLuint8 *data, 23 SLuint32 length) 24 { 25 SL_ENTER_INTERFACE 26 27 if (NULL == data) { 28 result = SL_RESULT_PARAMETER_INVALID; 29 } else { 30 //IMIDIMessage *thiz = (IMIDIMessage *) self; 31 result = SL_RESULT_FEATURE_UNSUPPORTED; 32 } 33 34 SL_LEAVE_INTERFACE 35 } 36 37 38 static SLresult IMIDIMessage_RegisterMetaEventCallback(SLMIDIMessageItf self, 39 slMetaEventCallback callback, void *pContext) 40 { 41 SL_ENTER_INTERFACE 42 43 IMIDIMessage *thiz = (IMIDIMessage *) self; 44 interface_lock_exclusive(thiz); 45 thiz->mMetaEventCallback = callback; 46 thiz->mMetaEventContext = pContext; 47 interface_unlock_exclusive(thiz); 48 result = SL_RESULT_SUCCESS; 49 50 SL_LEAVE_INTERFACE 51 } 52 53 54 static SLresult IMIDIMessage_RegisterMIDIMessageCallback(SLMIDIMessageItf self, 55 slMIDIMessageCallback callback, void *pContext) 56 { 57 SL_ENTER_INTERFACE 58 59 IMIDIMessage *thiz = (IMIDIMessage *) self; 60 interface_lock_exclusive(thiz); 61 thiz->mMessageCallback = callback; 62 thiz->mMessageContext = pContext; 63 interface_unlock_exclusive(thiz); 64 result = SL_RESULT_SUCCESS; 65 66 SL_LEAVE_INTERFACE 67 } 68 69 70 static SLresult IMIDIMessage_AddMIDIMessageCallbackFilter(SLMIDIMessageItf self, 71 SLuint32 messageType) 72 { 73 SL_ENTER_INTERFACE 74 75 switch (messageType) { 76 case SL_MIDIMESSAGETYPE_NOTE_ON_OFF: 77 case SL_MIDIMESSAGETYPE_POLY_PRESSURE: 78 case SL_MIDIMESSAGETYPE_CONTROL_CHANGE: 79 case SL_MIDIMESSAGETYPE_PROGRAM_CHANGE: 80 case SL_MIDIMESSAGETYPE_CHANNEL_PRESSURE: 81 case SL_MIDIMESSAGETYPE_PITCH_BEND: 82 case SL_MIDIMESSAGETYPE_SYSTEM_MESSAGE: 83 { 84 SLuint8 messageTypeMask = 1 << messageType; 85 IMIDIMessage *thiz = (IMIDIMessage *) self; 86 interface_lock_exclusive(thiz); 87 thiz->mMessageTypes |= messageTypeMask; 88 interface_unlock_exclusive(thiz); 89 result = SL_RESULT_SUCCESS; 90 } 91 break; 92 default: 93 result = SL_RESULT_PARAMETER_INVALID; 94 break; 95 } 96 97 SL_LEAVE_INTERFACE 98 } 99 100 101 static SLresult IMIDIMessage_ClearMIDIMessageCallbackFilter(SLMIDIMessageItf self) 102 { 103 SL_ENTER_INTERFACE 104 105 IMIDIMessage *thiz = (IMIDIMessage *) self; 106 interface_lock_exclusive(thiz); 107 thiz->mMessageTypes = 0; 108 interface_unlock_exclusive(thiz); 109 result = SL_RESULT_SUCCESS; 110 111 SL_LEAVE_INTERFACE 112 } 113 114 115 static const struct SLMIDIMessageItf_ IMIDIMessage_Itf = { 116 IMIDIMessage_SendMessage, 117 IMIDIMessage_RegisterMetaEventCallback, 118 IMIDIMessage_RegisterMIDIMessageCallback, 119 IMIDIMessage_AddMIDIMessageCallbackFilter, 120 IMIDIMessage_ClearMIDIMessageCallbackFilter 121 }; 122 123 void IMIDIMessage_init(void *self) 124 { 125 IMIDIMessage *thiz = (IMIDIMessage *) self; 126 thiz->mItf = &IMIDIMessage_Itf; 127 thiz->mMetaEventCallback = NULL; 128 thiz->mMetaEventContext = NULL; 129 thiz->mMessageCallback = NULL; 130 thiz->mMessageContext = NULL; 131 thiz->mMessageTypes = 0; 132 } 133