comparison libaf/af_format.c @ 14335:8380694ba14f

af_bits2fmt and af_str2fmt_short, also removed the extra FORMAT_BPS control in format.c
author alex
date Mon, 03 Jan 2005 18:59:16 +0000
parents 5a2473f37499
children 1a882e2a419b
comparison
equal deleted inserted replaced
14334:8ba01beafb7e 14335:8380694ba14f
106 case AF_FORMAT_32BIT: return 32; 106 case AF_FORMAT_32BIT: return 32;
107 case AF_FORMAT_48BIT: return 48; 107 case AF_FORMAT_48BIT: return 48;
108 } 108 }
109 #endif 109 #endif
110 return -1; 110 return -1;
111 }
112
113 inline int af_bits2fmt(int bits)
114 {
115 return (bits/8 - 1) << 3;
111 } 116 }
112 117
113 /* Convert format to str input str is a buffer for the 118 /* Convert format to str input str is a buffer for the
114 converted string, size is the size of the buffer */ 119 converted string, size is the size of the buffer */
115 char* af_fmt2str(int format, char* str, int size) 120 char* af_fmt2str(int format, char* str, int size)
192 case AF_FORMAT_FLOAT_BE: return "floatbe"; 197 case AF_FORMAT_FLOAT_BE: return "floatbe";
193 } 198 }
194 return "??"; 199 return "??";
195 } 200 }
196 201
202 int af_str2fmt_short(char* str)
203 {
204 int i;
205 static struct {
206 const char *name;
207 const int format;
208 } table[] = {
209 { "mulaw", AF_FORMAT_MU_LAW },
210 { "alaw", AF_FORMAT_A_LAW },
211 { "mpeg2", AF_FORMAT_MPEG2 },
212 { "ac3", AF_FORMAT_AC3 },
213 { "imaadpcm", AF_FORMAT_IMA_ADPCM },
214
215 { "u8", AF_FORMAT_U8 },
216 { "s8", AF_FORMAT_S8 },
217 { "u16le", AF_FORMAT_U16_LE },
218 { "u16be", AF_FORMAT_U16_BE },
219 { "u16ne", AF_FORMAT_U16_NE },
220 { "s16le", AF_FORMAT_S16_LE },
221 { "s16be", AF_FORMAT_S16_BE },
222 { "s16ne", AF_FORMAT_S16_NE },
223 { "u24le", AF_FORMAT_U24_LE },
224 { "u24be", AF_FORMAT_U24_BE },
225 { "u24ne", AF_FORMAT_U24_NE },
226 { "s24le", AF_FORMAT_S24_LE },
227 { "s24be", AF_FORMAT_S24_BE },
228 { "s24ne", AF_FORMAT_S24_NE },
229 { "u32le", AF_FORMAT_U32_LE },
230 { "u32be", AF_FORMAT_U32_BE },
231 { "u32ne", AF_FORMAT_U32_NE },
232 { "s32le", AF_FORMAT_S32_LE },
233 { "s32be", AF_FORMAT_S32_BE },
234 { "s32ne", AF_FORMAT_S32_NE },
235 { "floatle", AF_FORMAT_FLOAT_LE },
236 { "floatbe", AF_FORMAT_FLOAT_BE },
237 { "floatne", AF_FORMAT_FLOAT_NE },
238
239 { NULL, 0 }
240 };
241
242 for (i = 0; table[i].name; i++)
243 if (!strcasecmp(str, table[i].name))
244 return table[i].format;
245
246 return -1;
247 }
248
197 // Helper functions to check sanity for input arguments 249 // Helper functions to check sanity for input arguments
198 250
199 // Sanity check for bytes per sample 251 // Sanity check for bytes per sample
200 static int check_bps(int bps) 252 static int check_bps(int bps)
201 { 253 {
210 // Check for unsupported formats 262 // Check for unsupported formats
211 static int check_format(int format) 263 static int check_format(int format)
212 { 264 {
213 char buf[256]; 265 char buf[256];
214 switch(format & AF_FORMAT_SPECIAL_MASK){ 266 switch(format & AF_FORMAT_SPECIAL_MASK){
267 case(AF_FORMAT_IMA_ADPCM):
215 case(AF_FORMAT_MPEG2): 268 case(AF_FORMAT_MPEG2):
216 case(AF_FORMAT_AC3): 269 case(AF_FORMAT_AC3):
217 af_msg(AF_MSG_ERROR,"[format] Sample format %s not yet supported \n", 270 af_msg(AF_MSG_ERROR,"[format] Sample format %s not yet supported \n",
218 af_fmt2str(format,buf,255)); 271 af_fmt2str(format,buf,255));
219 return AF_ERROR; 272 return AF_ERROR;
277 af->play = play_s16_float; 330 af->play = play_s16_float;
278 } 331 }
279 return AF_OK; 332 return AF_OK;
280 } 333 }
281 case AF_CONTROL_COMMAND_LINE:{ 334 case AF_CONTROL_COMMAND_LINE:{
282 int bps = 2; 335 int format = af_str2fmt_short(arg);
283 int format = AF_FORMAT_NE; 336 if(AF_OK != af->control(af,AF_CONTROL_FORMAT_FMT | AF_CONTROL_SET,&format))
284 char str[256];
285 str[0] = '\0';
286 sscanf((char*)arg,"%i:%s",&bps,str);
287 // Convert string to format
288 format = af_str2fmt(str);
289
290 // Automatic correction of errors
291 switch(format & AF_FORMAT_SPECIAL_MASK){
292 case(AF_FORMAT_A_LAW):
293 case(AF_FORMAT_MU_LAW):
294 bps=1; break;
295 case(AF_FORMAT_AC3):
296 bps=4; break; // I think
297 }
298 if(AF_FORMAT_F == (format & AF_FORMAT_POINT_MASK))
299 bps=4;
300
301 // set appropriate AF_FORMAT_BITS
302 format |= (bps-1)<<3; // hack
303
304 if((AF_OK != af->control(af,AF_CONTROL_FORMAT_BPS | AF_CONTROL_SET,&bps)) ||
305 (AF_OK != af->control(af,AF_CONTROL_FORMAT_FMT | AF_CONTROL_SET,&format)))
306 return AF_ERROR; 337 return AF_ERROR;
307 return AF_OK; 338 return AF_OK;
308 } 339 }
309 case AF_CONTROL_FORMAT_BPS | AF_CONTROL_SET: 340 case AF_CONTROL_FORMAT_FMT | AF_CONTROL_SET:{
310 // Reinit must be called after this function has been called
311
312 // Check for errors in configuraton
313 if(AF_OK != check_bps(*(int*)arg))
314 return AF_ERROR;
315
316 af->data->bps = *(int*)arg;
317 return AF_OK;
318 case AF_CONTROL_FORMAT_FMT | AF_CONTROL_SET:
319 // Reinit must be called after this function has been called
320
321 // Check for errors in configuraton 341 // Check for errors in configuraton
322 if(AF_OK != check_format(*(int*)arg)) 342 if(AF_OK != check_format(*(int*)arg))
323 return AF_ERROR; 343 return AF_ERROR;
324 344
325 af->data->format = *(int*)arg; 345 af->data->format = *(int*)arg;
346 af->data->bps = af_fmt2bits(af->data->format)/8;
347
326 return AF_OK; 348 return AF_OK;
349 }
327 } 350 }
328 return AF_UNKNOWN; 351 return AF_UNKNOWN;
329 } 352 }
330 353
331 // Deallocate memory 354 // Deallocate memory