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 /* MetadataExtraction implementation */ 18 19 #include "sles_allinclusive.h" 20 21 22 static SLresult IMetadataExtraction_GetItemCount(SLMetadataExtractionItf self, SLuint32 *pItemCount) 23 { 24 SL_ENTER_INTERFACE 25 26 if (NULL == pItemCount) { 27 result = SL_RESULT_PARAMETER_INVALID; 28 } else { 29 IMetadataExtraction *thiz = (IMetadataExtraction *) self; 30 if (SL_OBJECTID_AUDIOPLAYER == InterfaceToObjectID(thiz)) { 31 #ifdef ANDROID 32 result = android_audioPlayer_metadata_getItemCount((CAudioPlayer *)thiz->mThis, 33 pItemCount); 34 #else 35 result = SL_RESULT_FEATURE_UNSUPPORTED; 36 #endif 37 } else { 38 result = SL_RESULT_PARAMETER_INVALID; 39 } 40 } 41 42 SL_LEAVE_INTERFACE 43 } 44 45 46 static SLresult IMetadataExtraction_GetKeySize(SLMetadataExtractionItf self, 47 SLuint32 index, SLuint32 *pKeySize) 48 { 49 SL_ENTER_INTERFACE 50 51 if (NULL == pKeySize) { 52 result = SL_RESULT_PARAMETER_INVALID; 53 } else { 54 IMetadataExtraction *thiz = (IMetadataExtraction *) self; 55 if (SL_OBJECTID_AUDIOPLAYER == InterfaceToObjectID(thiz)) { 56 #ifdef ANDROID 57 result = android_audioPlayer_metadata_getKeySize((CAudioPlayer *)thiz->mThis, 58 index, pKeySize); 59 #else 60 result = SL_RESULT_FEATURE_UNSUPPORTED; 61 #endif 62 } else { 63 result = SL_RESULT_PARAMETER_INVALID; 64 } 65 } 66 67 SL_LEAVE_INTERFACE 68 } 69 70 71 static SLresult IMetadataExtraction_GetKey(SLMetadataExtractionItf self, 72 SLuint32 index, SLuint32 keySize, SLMetadataInfo *pKey) 73 { 74 SL_ENTER_INTERFACE 75 76 if (NULL == pKey) { 77 result = SL_RESULT_PARAMETER_INVALID; 78 } else { 79 IMetadataExtraction *thiz = (IMetadataExtraction *) self; 80 if (SL_OBJECTID_AUDIOPLAYER == InterfaceToObjectID(thiz)) { 81 #ifdef ANDROID 82 result = android_audioPlayer_metadata_getKey((CAudioPlayer *)thiz->mThis, 83 index, keySize, pKey); 84 #else 85 result = SL_RESULT_FEATURE_UNSUPPORTED; 86 #endif 87 } else { 88 result = SL_RESULT_PARAMETER_INVALID; 89 } 90 } 91 92 SL_LEAVE_INTERFACE 93 } 94 95 96 static SLresult IMetadataExtraction_GetValueSize(SLMetadataExtractionItf self, 97 SLuint32 index, SLuint32 *pValueSize) 98 { 99 SL_ENTER_INTERFACE 100 101 if (NULL == pValueSize) { 102 result = SL_RESULT_PARAMETER_INVALID; 103 } else { 104 IMetadataExtraction *thiz = (IMetadataExtraction *) self; 105 if (SL_OBJECTID_AUDIOPLAYER == InterfaceToObjectID(thiz)) { 106 #ifdef ANDROID 107 result = android_audioPlayer_metadata_getValueSize((CAudioPlayer *)thiz->mThis, 108 index, pValueSize); 109 #else 110 result = SL_RESULT_FEATURE_UNSUPPORTED; 111 #endif 112 } else { 113 result = SL_RESULT_PARAMETER_INVALID; 114 } 115 } 116 117 SL_LEAVE_INTERFACE 118 } 119 120 121 static SLresult IMetadataExtraction_GetValue(SLMetadataExtractionItf self, 122 SLuint32 index, SLuint32 valueSize, SLMetadataInfo *pValue) 123 { 124 SL_ENTER_INTERFACE 125 126 if (NULL == pValue) { 127 result = SL_RESULT_PARAMETER_INVALID; 128 } else { 129 IMetadataExtraction *thiz = (IMetadataExtraction *) self; 130 if (SL_OBJECTID_AUDIOPLAYER == InterfaceToObjectID(thiz)) { 131 #ifdef ANDROID 132 result = android_audioPlayer_metadata_getValue((CAudioPlayer *)thiz->mThis, 133 index, valueSize, pValue); 134 #else 135 result = SL_RESULT_FEATURE_UNSUPPORTED; 136 #endif 137 } else { 138 result = SL_RESULT_PARAMETER_INVALID; 139 } 140 } 141 142 SL_LEAVE_INTERFACE 143 } 144 145 146 static SLresult IMetadataExtraction_AddKeyFilter(SLMetadataExtractionItf self, 147 SLuint32 keySize, const void *pKey, SLuint32 keyEncoding, 148 const SLchar *pValueLangCountry, SLuint32 valueEncoding, SLuint8 filterMask) 149 { 150 SL_ENTER_INTERFACE 151 152 if (NULL == pKey || NULL == pValueLangCountry || (filterMask & ~(SL_METADATA_FILTER_KEY | 153 SL_METADATA_FILTER_KEY | SL_METADATA_FILTER_KEY))) { 154 result = SL_RESULT_PARAMETER_INVALID; 155 } else { 156 IMetadataExtraction *thiz = (IMetadataExtraction *) self; 157 interface_lock_exclusive(thiz); 158 thiz->mKeySize = keySize; 159 thiz->mKey = pKey; 160 thiz->mKeyEncoding = keyEncoding; 161 thiz->mValueLangCountry = pValueLangCountry; // should make a local copy 162 thiz->mValueEncoding = valueEncoding; 163 thiz->mFilterMask = filterMask; 164 interface_unlock_exclusive(thiz); 165 result = SL_RESULT_SUCCESS; 166 } 167 168 SL_LEAVE_INTERFACE 169 } 170 171 172 static SLresult IMetadataExtraction_ClearKeyFilter(SLMetadataExtractionItf self) 173 { 174 SL_ENTER_INTERFACE 175 176 IMetadataExtraction *thiz = (IMetadataExtraction *) self; 177 thiz->mKeyFilter = 0; 178 result = SL_RESULT_SUCCESS; 179 180 SL_LEAVE_INTERFACE 181 } 182 183 184 static const struct SLMetadataExtractionItf_ IMetadataExtraction_Itf = { 185 IMetadataExtraction_GetItemCount, 186 IMetadataExtraction_GetKeySize, 187 IMetadataExtraction_GetKey, 188 IMetadataExtraction_GetValueSize, 189 IMetadataExtraction_GetValue, 190 IMetadataExtraction_AddKeyFilter, 191 IMetadataExtraction_ClearKeyFilter 192 }; 193 194 void IMetadataExtraction_init(void *self) 195 { 196 IMetadataExtraction *thiz = (IMetadataExtraction *) self; 197 thiz->mItf = &IMetadataExtraction_Itf; 198 thiz->mKeySize = 0; 199 thiz->mKey = NULL; 200 thiz->mKeyEncoding = 0 /*TBD*/; 201 thiz->mValueLangCountry = 0 /*TBD*/; 202 thiz->mValueEncoding = 0 /*TBD*/; 203 thiz->mFilterMask = 0 /*TBD*/; 204 thiz->mKeyFilter = 0; 205 } 206