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 
IMetadataExtraction_GetItemCount(SLMetadataExtractionItf self,SLuint32 * pItemCount)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 
IMetadataExtraction_GetKeySize(SLMetadataExtractionItf self,SLuint32 index,SLuint32 * pKeySize)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 
IMetadataExtraction_GetKey(SLMetadataExtractionItf self,SLuint32 index,SLuint32 keySize,SLMetadataInfo * pKey)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 
IMetadataExtraction_GetValueSize(SLMetadataExtractionItf self,SLuint32 index,SLuint32 * pValueSize)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 
IMetadataExtraction_GetValue(SLMetadataExtractionItf self,SLuint32 index,SLuint32 valueSize,SLMetadataInfo * pValue)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 
IMetadataExtraction_AddKeyFilter(SLMetadataExtractionItf self,SLuint32 keySize,const void * pKey,SLuint32 keyEncoding,const SLchar * pValueLangCountry,SLuint32 valueEncoding,SLuint8 filterMask)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_LANG | SL_METADATA_FILTER_ENCODING))) {
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 
IMetadataExtraction_ClearKeyFilter(SLMetadataExtractionItf self)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 
IMetadataExtraction_init(void * self)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