1 /*
2 * Copyright (c) 1999-2000, Eric Moon.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions, and the following disclaimer.
11 *
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions, and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 *
16 * 3. The name of the author may not be used to endorse or promote products
17 * derived from this software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
20 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21 * OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
23 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
26 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
27 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31
32 // AudioAdapterOp.cpp
33
34 #include "AudioAdapterOp.h"
35 #include "IAudioOp.h"
36
37 #include "AudioAdapterParams.h"
38
39 #include "audio_buffer_tools.h"
40
41 #include <Debug.h>
42 #include <ParameterWeb.h>
43
44
45 //// empty parameter-set implementation
46 //// +++++ move to IParameterSet.h!
47 //
48 //class _EmptyParameterSet :
49 // public IParameterSet {
50 //public:
51 // status_t store(
52 // int32 parameterID,
53 // void* data,
54 // size_t size) { return B_ERROR; }
55 //
56 // status_t retrieve(
57 // int32 parameterID,
58 // void* data,
59 // size_t* ioSize) { return B_ERROR; }
60 //
61 // void populateGroup(
62 // BParameterGroup* group) {}
63 //};
64
65 // -------------------------------------------------------- //
66 // _AudioAdapterOp_base
67 // -------------------------------------------------------- //
68
69 class _AudioAdapterOp_base :
70 public IAudioOp {
71 public:
_AudioAdapterOp_base(IAudioOpHost * _host)72 _AudioAdapterOp_base(
73 IAudioOpHost* _host) :
74 IAudioOp(_host) {}
75
replace(IAudioOp * oldOp)76 void replace(
77 IAudioOp* oldOp) {
78 delete oldOp;
79 }
80 };
81
82 // -------------------------------------------------------- //
83 // _AudioAdapterOp implementations
84 // -------------------------------------------------------- //
85
86 // direct conversion:
87 // - source and destination channel_count must be identical
88 // - source and destination must be host-endian
89
90 template <class in_t, class out_t>
91 class _AudioAdapterOp_direct :
92 public _AudioAdapterOp_base {
93
94 public:
_AudioAdapterOp_direct(IAudioOpHost * _host)95 _AudioAdapterOp_direct(
96 IAudioOpHost* _host) :
97 _AudioAdapterOp_base(_host) {
98
99 PRINT(("### _AudioAdapterOp_direct()\n"));
100 }
101
process(const AudioBuffer & source,AudioBuffer & destination,double & sourceFrame,uint32 & destinationFrame,uint32 framesRequired,bigtime_t performanceTime)102 uint32 process(
103 const AudioBuffer& source,
104 AudioBuffer& destination,
105 double& sourceFrame,
106 uint32& destinationFrame,
107 uint32 framesRequired,
108 bigtime_t performanceTime) {
109
110 int32 inChannels = source.format().channel_count;
111 ASSERT(inChannels <= 2);
112 int32 outChannels = destination.format().channel_count;
113 ASSERT(outChannels == inChannels);
114
115 bool stereo = (inChannels == 2);
116
117 in_t* inBuffer =
118 ((in_t*)source.data()) + (uint32)sourceFrame*inChannels;
119
120 out_t* outBuffer =
121 ((out_t*)destination.data()) + destinationFrame*outChannels;
122
123 uint32 frame = framesRequired;
124 while(frame--) {
125
126 float val;
127 convert_sample(
128 *inBuffer,
129 val);
130 convert_sample(
131 val,
132 *outBuffer);
133
134 ++inBuffer;
135 ++outBuffer;
136
137 if(stereo) {
138 convert_sample(
139 *inBuffer,
140 val);
141 convert_sample(
142 val,
143 *outBuffer);
144 ++inBuffer;
145 ++outBuffer;
146 }
147
148 sourceFrame += 1.0;
149 destinationFrame++;
150 }
151
152 return framesRequired;
153 }
154 };
155
156 // direct conversion + incoming data byteswapped
157 // - source and destination channel_count must be identical
158 // - destination must be host-endian
159
160 template <class in_t, class out_t>
161 class _AudioAdapterOp_swap_direct :
162 public _AudioAdapterOp_base {
163
164 public:
_AudioAdapterOp_swap_direct(IAudioOpHost * _host)165 _AudioAdapterOp_swap_direct(
166 IAudioOpHost* _host) :
167 _AudioAdapterOp_base(_host) {
168
169 PRINT(("### _AudioAdapterOp_swap_direct()\n"));
170 }
171
process(const AudioBuffer & source,AudioBuffer & destination,double & sourceFrame,uint32 & destinationFrame,uint32 framesRequired,bigtime_t performanceTime)172 uint32 process(
173 const AudioBuffer& source,
174 AudioBuffer& destination,
175 double& sourceFrame,
176 uint32& destinationFrame,
177 uint32 framesRequired,
178 bigtime_t performanceTime) {
179
180 int32 inChannels = source.format().channel_count;
181 ASSERT(inChannels <= 2);
182 int32 outChannels = destination.format().channel_count;
183 ASSERT(outChannels == inChannels);
184
185 bool stereo = (inChannels == 2);
186
187 in_t* inBuffer =
188 ((in_t*)source.data()) + (uint32)sourceFrame*inChannels;
189
190 out_t* outBuffer =
191 ((out_t*)destination.data()) + destinationFrame*outChannels;
192
193 uint32 frame = framesRequired;
194 while(frame--) {
195
196 float val;
197 swap_convert_sample(
198 *inBuffer,
199 val);
200 convert_sample(
201 val,
202 *outBuffer);
203
204 ++inBuffer;
205 ++outBuffer;
206
207 if(stereo) {
208 swap_convert_sample(
209 *inBuffer,
210 val);
211 convert_sample(
212 val,
213 *outBuffer);
214 ++inBuffer;
215 ++outBuffer;
216 }
217
218 sourceFrame += 1.0;
219 destinationFrame++;
220 }
221
222 return framesRequired;
223 }
224 };
225
226 template <class in_t, class out_t>
227 class _AudioAdapterOp_split :
228 public _AudioAdapterOp_base {
229 public:
_AudioAdapterOp_split(IAudioOpHost * _host)230 _AudioAdapterOp_split(
231 IAudioOpHost* _host) :
232 _AudioAdapterOp_base(_host) {
233
234 PRINT(("### _AudioAdapterOp_split()\n"));
235 }
236
process(const AudioBuffer & source,AudioBuffer & destination,double & sourceFrame,uint32 & destinationFrame,uint32 framesRequired,bigtime_t performanceTime)237 uint32 process(
238 const AudioBuffer& source,
239 AudioBuffer& destination,
240 double& sourceFrame,
241 uint32& destinationFrame,
242 uint32 framesRequired,
243 bigtime_t performanceTime) {
244
245 int32 inChannels = source.format().channel_count;
246 ASSERT(inChannels == 1);
247 int32 outChannels = destination.format().channel_count;
248 ASSERT(outChannels == 2);
249
250 in_t* inBuffer =
251 ((in_t*)source.data()) + (uint32)sourceFrame*inChannels;
252
253 out_t* outBuffer =
254 ((out_t*)destination.data()) + destinationFrame*outChannels;
255
256 uint32 frame = framesRequired;
257 while(frame--) {
258
259 float val;
260 convert_sample(
261 *inBuffer,
262 val);
263 // write channel 0
264 convert_sample(
265 val,
266 *outBuffer);
267
268 // write channel 1
269 ++outBuffer;
270 convert_sample(
271 val,
272 *outBuffer);
273
274 ++inBuffer;
275 ++outBuffer;
276
277 sourceFrame += 1.0;
278 destinationFrame++;
279 }
280
281 return framesRequired;
282 }
283 };
284
285 template <class in_t, class out_t>
286 class _AudioAdapterOp_swap_split :
287 public _AudioAdapterOp_base {
288 public:
_AudioAdapterOp_swap_split(IAudioOpHost * _host)289 _AudioAdapterOp_swap_split(
290 IAudioOpHost* _host) :
291 _AudioAdapterOp_base(_host) {
292
293 PRINT(("### _AudioAdapterOp_swap_split()\n"));
294 }
295
process(const AudioBuffer & source,AudioBuffer & destination,double & sourceFrame,uint32 & destinationFrame,uint32 framesRequired,bigtime_t performanceTime)296 uint32 process(
297 const AudioBuffer& source,
298 AudioBuffer& destination,
299 double& sourceFrame,
300 uint32& destinationFrame,
301 uint32 framesRequired,
302 bigtime_t performanceTime) {
303
304 int32 inChannels = source.format().channel_count;
305 ASSERT(inChannels == 1);
306 int32 outChannels = destination.format().channel_count;
307 ASSERT(outChannels == 2);
308
309 in_t* inBuffer =
310 ((in_t*)source.data()) + (uint32)sourceFrame*inChannels;
311
312 out_t* outBuffer =
313 ((out_t*)destination.data()) + destinationFrame*outChannels;
314
315 uint32 frame = framesRequired;
316 while(frame--) {
317
318 float val;
319 swap_convert_sample(
320 *inBuffer,
321 val);
322 // write channel 0
323 convert_sample(
324 val,
325 *outBuffer);
326
327 // write channel 1
328 ++outBuffer;
329 convert_sample(
330 val,
331 *outBuffer);
332
333 ++inBuffer;
334 ++outBuffer;
335
336 sourceFrame += 1.0;
337 destinationFrame++;
338 }
339
340 return framesRequired;
341 }
342 };
343
344
345 template <class in_t, class out_t>
346 class _AudioAdapterOp_mix :
347 public _AudioAdapterOp_base {
348 public:
_AudioAdapterOp_mix(IAudioOpHost * _host)349 _AudioAdapterOp_mix(
350 IAudioOpHost* _host) :
351 _AudioAdapterOp_base(_host) {
352
353 PRINT(("### _AudioAdapterOp_mix()\n"));
354 }
355
process(const AudioBuffer & source,AudioBuffer & destination,double & sourceFrame,uint32 & destinationFrame,uint32 framesRequired,bigtime_t performanceTime)356 uint32 process(
357 const AudioBuffer& source,
358 AudioBuffer& destination,
359 double& sourceFrame,
360 uint32& destinationFrame,
361 uint32 framesRequired,
362 bigtime_t performanceTime) {
363
364 int32 inChannels = source.format().channel_count;
365 ASSERT(inChannels == 2);
366 int32 outChannels = destination.format().channel_count;
367 ASSERT(outChannels == 1);
368
369 in_t* inBuffer =
370 ((in_t*)source.data()) + (uint32)sourceFrame*inChannels;
371
372 out_t* outBuffer =
373 ((out_t*)destination.data()) + destinationFrame*outChannels;
374
375 uint32 frame = framesRequired;
376 while(frame--) {
377
378 float out, in;
379 convert_sample(
380 *inBuffer,
381 in);
382
383 out = in * 0.5;
384 ++inBuffer;
385
386 convert_sample(
387 *inBuffer,
388 in);
389
390 out += (in * 0.5);
391
392 // write channel 0
393 convert_sample(
394 out,
395 *outBuffer);
396
397 ++inBuffer;
398 ++outBuffer;
399
400 sourceFrame += 1.0;
401 destinationFrame++;
402 }
403
404 return framesRequired;
405 }
406 };
407
408 template <class in_t, class out_t>
409 class _AudioAdapterOp_swap_mix :
410 public _AudioAdapterOp_base {
411 public:
_AudioAdapterOp_swap_mix(IAudioOpHost * _host)412 _AudioAdapterOp_swap_mix(
413 IAudioOpHost* _host) :
414 _AudioAdapterOp_base(_host) {
415
416 PRINT(("### _AudioAdapterOp_swap_mix()\n"));
417 }
418
process(const AudioBuffer & source,AudioBuffer & destination,double & sourceFrame,uint32 & destinationFrame,uint32 framesRequired,bigtime_t performanceTime)419 uint32 process(
420 const AudioBuffer& source,
421 AudioBuffer& destination,
422 double& sourceFrame,
423 uint32& destinationFrame,
424 uint32 framesRequired,
425 bigtime_t performanceTime) {
426
427 int32 inChannels = source.format().channel_count;
428 ASSERT(inChannels == 2);
429 int32 outChannels = destination.format().channel_count;
430 ASSERT(outChannels == 1);
431
432 in_t* inBuffer =
433 ((in_t*)source.data()) + (uint32)sourceFrame*inChannels;
434
435 out_t* outBuffer =
436 ((out_t*)destination.data()) + destinationFrame*outChannels;
437
438 uint32 frame = framesRequired;
439 while(frame--) {
440
441 float out, in;
442 swap_convert_sample(
443 *inBuffer,
444 in);
445
446 out = in * 0.5;
447 ++inBuffer;
448
449 swap_convert_sample(
450 *inBuffer,
451 in);
452
453 out += (in * 0.5);
454
455 // write channel 0
456 convert_sample(
457 out,
458 *outBuffer);
459
460 ++inBuffer;
461 ++outBuffer;
462
463 sourceFrame += 1.0;
464 destinationFrame++;
465 }
466
467 return framesRequired;
468 }
469 };
470
471 // -------------------------------------------------------- //
472 // AudioAdapterOpFactory impl.
473 // -------------------------------------------------------- //
474
475 // [8sep99] yeeechk!
476 // [16sep99] now handles pre-conversion byteswapping
477
createOp(IAudioOpHost * host,const media_raw_audio_format & inputFormat,const media_raw_audio_format & outputFormat)478 IAudioOp* AudioAdapterOpFactory::createOp(
479 IAudioOpHost* host,
480 const media_raw_audio_format& inputFormat,
481 const media_raw_audio_format& outputFormat) {
482
483 // [16sep99] ensure fully-specified input & output formats
484 ASSERT(
485 inputFormat.frame_rate &&
486 inputFormat.byte_order &&
487 inputFormat.channel_count &&
488 inputFormat.format &&
489 inputFormat.buffer_size);
490 ASSERT(
491 outputFormat.frame_rate &&
492 outputFormat.byte_order &&
493 outputFormat.channel_count &&
494 outputFormat.format &&
495 outputFormat.buffer_size);
496
497 int32 inChannels = inputFormat.channel_count;
498 int32 outChannels = outputFormat.channel_count;
499
500 // char fmt_buffer[256];
501 // media_format f;
502 // f.type = B_MEDIA_RAW_AUDIO;
503 // f.u.raw_audio = inputFormat;
504 // string_for_format(f, fmt_buffer, 255);
505
506 bool swapBefore = (inputFormat.byte_order !=
507 ((B_HOST_IS_BENDIAN) ? B_MEDIA_BIG_ENDIAN : B_MEDIA_LITTLE_ENDIAN));
508
509 // PRINT(("### swapBefore: '%s'\n", fmt_buffer));
510
511 bool split = outChannels > inChannels;
512 bool mix = outChannels < inChannels;
513
514 switch(inputFormat.format) {
515 case media_raw_audio_format::B_AUDIO_UCHAR:
516 switch(outputFormat.format) {
517 case media_raw_audio_format::B_AUDIO_UCHAR:
518 return
519 split ? (IAudioOp*)new _AudioAdapterOp_split < uint8, uint8>(host) :
520 mix ? (IAudioOp*)new _AudioAdapterOp_mix < uint8, uint8>(host) :
521 (IAudioOp*)new _AudioAdapterOp_direct < uint8, uint8>(host);
522 break;
523 case media_raw_audio_format::B_AUDIO_SHORT:
524 if(swapBefore) return
525 split ? (IAudioOp*)new _AudioAdapterOp_swap_split< uint8, short>(host) :
526 mix ? (IAudioOp*)new _AudioAdapterOp_swap_mix < uint8, short>(host) :
527 (IAudioOp*)new _AudioAdapterOp_swap_direct < uint8, short>(host);
528 else return
529 split ? (IAudioOp*)new _AudioAdapterOp_split < uint8, short>(host) :
530 mix ? (IAudioOp*)new _AudioAdapterOp_mix < uint8, short>(host) :
531 (IAudioOp*)new _AudioAdapterOp_direct < uint8, short>(host);
532 break;
533 case media_raw_audio_format::B_AUDIO_FLOAT:
534 if(swapBefore) return
535 split ? (IAudioOp*)new _AudioAdapterOp_swap_split< uint8, float>(host) :
536 mix ? (IAudioOp*)new _AudioAdapterOp_swap_mix < uint8, float>(host) :
537 (IAudioOp*)new _AudioAdapterOp_swap_direct < uint8, float>(host);
538 else return
539 split ? (IAudioOp*)new _AudioAdapterOp_split < uint8, float>(host) :
540 mix ? (IAudioOp*)new _AudioAdapterOp_mix < uint8, float>(host) :
541 (IAudioOp*)new _AudioAdapterOp_direct < uint8, float>(host);
542 break;
543 case media_raw_audio_format::B_AUDIO_INT:
544 if(swapBefore) return
545 split ? (IAudioOp*)new _AudioAdapterOp_swap_split< uint8, int32>(host) :
546 mix ? (IAudioOp*)new _AudioAdapterOp_swap_mix < uint8, int32>(host) :
547 (IAudioOp*)new _AudioAdapterOp_swap_direct < uint8, int32>(host);
548 else return
549 split ? (IAudioOp*)new _AudioAdapterOp_split < uint8, int32>(host) :
550 mix ? (IAudioOp*)new _AudioAdapterOp_mix < uint8, int32>(host) :
551 (IAudioOp*)new _AudioAdapterOp_direct < uint8, int32>(host);
552 break;
553 }
554 break;
555
556 case media_raw_audio_format::B_AUDIO_SHORT:
557 switch(outputFormat.format) {
558 case media_raw_audio_format::B_AUDIO_UCHAR:
559 if(swapBefore) return
560 split ? (IAudioOp*)new _AudioAdapterOp_swap_split< short, uint8>(host) :
561 mix ? (IAudioOp*)new _AudioAdapterOp_swap_mix < short, uint8>(host) :
562 (IAudioOp*)new _AudioAdapterOp_swap_direct < short, uint8>(host);
563 else return
564 split ? (IAudioOp*)new _AudioAdapterOp_split < short, uint8>(host) :
565 mix ? (IAudioOp*)new _AudioAdapterOp_mix < short, uint8>(host) :
566 (IAudioOp*)new _AudioAdapterOp_direct < short, uint8>(host);
567 break;
568 case media_raw_audio_format::B_AUDIO_SHORT:
569 if(swapBefore) return
570 split ? (IAudioOp*)new _AudioAdapterOp_swap_split< short, short>(host) :
571 mix ? (IAudioOp*)new _AudioAdapterOp_swap_mix < short, short>(host) :
572 (IAudioOp*)new _AudioAdapterOp_swap_direct < short, short>(host);
573 else return
574 split ? (IAudioOp*)new _AudioAdapterOp_split < short, short>(host) :
575 mix ? (IAudioOp*)new _AudioAdapterOp_mix < short, short>(host) :
576 (IAudioOp*)new _AudioAdapterOp_direct < short, short>(host);
577 break;
578 case media_raw_audio_format::B_AUDIO_FLOAT:
579 if(swapBefore) return
580 split ? (IAudioOp*)new _AudioAdapterOp_swap_split< short, float>(host) :
581 mix ? (IAudioOp*)new _AudioAdapterOp_swap_mix < short, float>(host) :
582 (IAudioOp*)new _AudioAdapterOp_swap_direct < short, float>(host);
583 else return
584 split ? (IAudioOp*)new _AudioAdapterOp_split < short, float>(host) :
585 mix ? (IAudioOp*)new _AudioAdapterOp_mix < short, float>(host) :
586 (IAudioOp*)new _AudioAdapterOp_direct < short, float>(host);
587 break;
588 case media_raw_audio_format::B_AUDIO_INT:
589 if(swapBefore) return
590 split ? (IAudioOp*)new _AudioAdapterOp_swap_split< short, int32>(host) :
591 mix ? (IAudioOp*)new _AudioAdapterOp_swap_mix < short, int32>(host) :
592 (IAudioOp*)new _AudioAdapterOp_swap_direct < short, int32>(host);
593 else return
594 split ? (IAudioOp*)new _AudioAdapterOp_split < short, int32>(host) :
595 mix ? (IAudioOp*)new _AudioAdapterOp_mix < short, int32>(host) :
596 (IAudioOp*)new _AudioAdapterOp_direct < short, int32>(host);
597 break;
598 }
599 break;
600
601 case media_raw_audio_format::B_AUDIO_FLOAT:
602 switch(outputFormat.format) {
603 case media_raw_audio_format::B_AUDIO_UCHAR:
604 if(swapBefore) return
605 split ? (IAudioOp*)new _AudioAdapterOp_swap_split< float, uint8>(host) :
606 mix ? (IAudioOp*)new _AudioAdapterOp_swap_mix < float, uint8>(host) :
607 (IAudioOp*)new _AudioAdapterOp_swap_direct < float, uint8>(host);
608 else return
609 split ? (IAudioOp*)new _AudioAdapterOp_split < float, uint8>(host) :
610 mix ? (IAudioOp*)new _AudioAdapterOp_mix < float, uint8>(host) :
611 (IAudioOp*)new _AudioAdapterOp_direct < float, uint8>(host);
612 break;
613 case media_raw_audio_format::B_AUDIO_SHORT:
614 if(swapBefore) return
615 split ? (IAudioOp*)new _AudioAdapterOp_swap_split< float, short>(host) :
616 mix ? (IAudioOp*)new _AudioAdapterOp_swap_mix < float, short>(host) :
617 (IAudioOp*)new _AudioAdapterOp_swap_direct < float, short>(host);
618 else return
619 split ? (IAudioOp*)new _AudioAdapterOp_split < float, short>(host) :
620 mix ? (IAudioOp*)new _AudioAdapterOp_mix < float, short>(host) :
621 (IAudioOp*)new _AudioAdapterOp_direct < float, short>(host);
622 break;
623 case media_raw_audio_format::B_AUDIO_FLOAT:
624 if(swapBefore) return
625 split ? (IAudioOp*)new _AudioAdapterOp_swap_split< float, float>(host) :
626 mix ? (IAudioOp*)new _AudioAdapterOp_swap_mix < float, float>(host) :
627 (IAudioOp*)new _AudioAdapterOp_swap_direct < float, float>(host);
628 else return
629 split ? (IAudioOp*)new _AudioAdapterOp_split < float, float>(host) :
630 mix ? (IAudioOp*)new _AudioAdapterOp_mix < float, float>(host) :
631 (IAudioOp*)new _AudioAdapterOp_direct < float, float>(host);
632 break;
633 case media_raw_audio_format::B_AUDIO_INT:
634 if(swapBefore) return
635 split ? (IAudioOp*)new _AudioAdapterOp_swap_split< float, int32>(host) :
636 mix ? (IAudioOp*)new _AudioAdapterOp_swap_mix < float, int32>(host) :
637 (IAudioOp*)new _AudioAdapterOp_swap_direct < float, int32>(host);
638 else return
639 split ? (IAudioOp*)new _AudioAdapterOp_split < float, int32>(host) :
640 mix ? (IAudioOp*)new _AudioAdapterOp_mix < float, int32>(host) :
641 (IAudioOp*)new _AudioAdapterOp_direct < float, int32>(host);
642 break;
643 }
644 break;
645
646 case media_raw_audio_format::B_AUDIO_INT:
647 switch(outputFormat.format) {
648 case media_raw_audio_format::B_AUDIO_UCHAR:
649 if(swapBefore) return
650 split ? (IAudioOp*)new _AudioAdapterOp_swap_split< int32, uint8>(host) :
651 mix ? (IAudioOp*)new _AudioAdapterOp_swap_mix < int32, uint8>(host) :
652 (IAudioOp*)new _AudioAdapterOp_swap_direct < int32, uint8>(host);
653 else return
654 split ? (IAudioOp*)new _AudioAdapterOp_split < int32, uint8>(host) :
655 mix ? (IAudioOp*)new _AudioAdapterOp_mix < int32, uint8>(host) :
656 (IAudioOp*)new _AudioAdapterOp_direct < int32, uint8>(host);
657 break;
658 case media_raw_audio_format::B_AUDIO_SHORT:
659 if(swapBefore) return
660 split ? (IAudioOp*)new _AudioAdapterOp_swap_split< int32, short>(host) :
661 mix ? (IAudioOp*)new _AudioAdapterOp_swap_mix < int32, short>(host) :
662 (IAudioOp*)new _AudioAdapterOp_swap_direct < int32, short>(host);
663 else return
664 split ? (IAudioOp*)new _AudioAdapterOp_split < int32, short>(host) :
665 mix ? (IAudioOp*)new _AudioAdapterOp_mix < int32, short>(host) :
666 (IAudioOp*)new _AudioAdapterOp_direct < int32, short>(host);
667 break;
668 case media_raw_audio_format::B_AUDIO_FLOAT:
669 if(swapBefore) return
670 split ? (IAudioOp*)new _AudioAdapterOp_swap_split< int32, float>(host) :
671 mix ? (IAudioOp*)new _AudioAdapterOp_swap_mix < int32, float>(host) :
672 (IAudioOp*)new _AudioAdapterOp_swap_direct < int32, float>(host);
673 else return
674 split ? (IAudioOp*)new _AudioAdapterOp_split < int32, float>(host) :
675 mix ? (IAudioOp*)new _AudioAdapterOp_mix < int32, float>(host) :
676 (IAudioOp*)new _AudioAdapterOp_direct < int32, float>(host);
677 break;
678 case media_raw_audio_format::B_AUDIO_INT:
679 if(swapBefore) return
680 split ? (IAudioOp*)new _AudioAdapterOp_swap_split< int32, int32>(host) :
681 mix ? (IAudioOp*)new _AudioAdapterOp_swap_mix < int32, int32>(host) :
682 (IAudioOp*)new _AudioAdapterOp_swap_direct < int32, int32>(host);
683 else return
684 split ? (IAudioOp*)new _AudioAdapterOp_split < int32, int32>(host) :
685 mix ? (IAudioOp*)new _AudioAdapterOp_mix < int32, int32>(host) :
686 (IAudioOp*)new _AudioAdapterOp_direct < int32, int32>(host);
687 break;
688 }
689 break;
690 }
691
692 return 0;
693 }
694
createParameterSet()695 IParameterSet* AudioAdapterOpFactory::createParameterSet() {
696 return new _AudioAdapterParams();
697 }
698
699
700 // END -- AudioAdapterOp.cpp --
701