annotate libao2/pl_extrastereo.c @ 12022:293141b57c01

Use MultiplyElement to control volume. Works with multiple videos at the same time and even when NAS does not control the mixer or it is unavailable. Show buffer underrun hint only once and add missing linebreaks.
author ranma
date Sat, 13 Mar 2004 21:54:35 +0000
parents 12b1790038b0
children 815f03b7cee5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4927
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
1 /* Extrastereo effect plugin
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
2 * (linearly increases difference between L&R channels)
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
3 *
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
4 * Current limitations:
8739
66f3204117d6 trivial bigendian fix
colin
parents: 6795
diff changeset
5 * - only AFMT_S16_HE is supported currently
4927
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
6 *
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
7 * License: GPLv2 (as a mix of pl_volume.c and
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
8 * xmms:stereo_plugin/stereo.c)
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
9 *
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
10 * Author: pl <p_l@gmx.fr> (c) 2002 and beyond...
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
11 * */
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
12
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
13 #define PLUGIN
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
14
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
15 #include <stdio.h>
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
16 #include <stdlib.h>
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
17 #include <inttypes.h>
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
18
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
19 #include "audio_out.h"
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
20 #include "audio_plugin.h"
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
21 #include "audio_plugin_internal.h"
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
22 #include "afmt.h"
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
23
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
24 static ao_info_t info = {
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
25 "Extra stereo plugin",
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
26 "extrastereo",
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
27 "pl <p_l@gmx.fr>",
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
28 ""
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
29 };
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
30
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
31 LIBAO_PLUGIN_EXTERN(extrastereo)
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
32
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
33 // local data
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
34 static struct {
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
35 float mul; // intensity
6795
776b686069af - add some control (ao_oss, pl_extrastereo)
pontscho
parents: 4927
diff changeset
36 int inuse; // This plugin is in use TRUE, FALSE
776b686069af - add some control (ao_oss, pl_extrastereo)
pontscho
parents: 4927
diff changeset
37 int format; // sample format
4927
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
38 } pl_extrastereo = {2.5, 0, 0};
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
39
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
40
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
41 // to set/get/query special features/parameters
9633
12b1790038b0 64bit libao2 fix by Jens Axboe <mplayer-dev@kernel.dk>
alex
parents: 8741
diff changeset
42 static int control(int cmd,void *arg){
4927
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
43 switch(cmd){
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
44 case AOCONTROL_PLUGIN_SET_LEN:
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
45 return CONTROL_OK;
6795
776b686069af - add some control (ao_oss, pl_extrastereo)
pontscho
parents: 4927
diff changeset
46 case AOCONTROL_PLUGIN_ES_SET:
776b686069af - add some control (ao_oss, pl_extrastereo)
pontscho
parents: 4927
diff changeset
47 pl_extrastereo.mul=*((float*)arg);
776b686069af - add some control (ao_oss, pl_extrastereo)
pontscho
parents: 4927
diff changeset
48 return CONTROL_OK;
776b686069af - add some control (ao_oss, pl_extrastereo)
pontscho
parents: 4927
diff changeset
49 case AOCONTROL_PLUGIN_ES_GET:
776b686069af - add some control (ao_oss, pl_extrastereo)
pontscho
parents: 4927
diff changeset
50 *((float*)arg)=pl_extrastereo.mul;
776b686069af - add some control (ao_oss, pl_extrastereo)
pontscho
parents: 4927
diff changeset
51 return CONTROL_OK;
4927
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
52 }
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
53 return CONTROL_UNKNOWN;
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
54 }
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
55
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
56 // open & setup audio device
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
57 // return: 1=success 0=fail
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
58 static int init(){
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
59 switch(ao_plugin_data.format){
8741
46d21c0f36aa (nicer) endianness fix for every plugin except pl_format
colin
parents: 8739
diff changeset
60 case(AFMT_S16_NE):
4927
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
61 break;
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
62 default:
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
63 fprintf(stderr,"[pl_extrastereo] Audio format not yet suported \n");
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
64 return 0;
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
65 }
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
66
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
67 pl_extrastereo.mul=ao_plugin_cfg.pl_extrastereo_mul;
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
68 pl_extrastereo.format=ao_plugin_data.format;
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
69 pl_extrastereo.inuse=1;
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
70
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
71 printf("[pl_extrastereo] Extra stereo plugin in use (multiplier=%2.2f).\n",
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
72 pl_extrastereo.mul);
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
73 return 1;
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
74 }
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
75
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
76 // close plugin
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
77 static void uninit(){
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
78 pl_extrastereo.inuse=0;
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
79 }
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
80
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
81 // empty buffers
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
82 static void reset(){
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
83 }
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
84
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
85 // processes 'ao_plugin_data.len' bytes of 'data'
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
86 // called for every block of data
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
87 static int play(){
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
88
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
89 switch(pl_extrastereo.format){
8741
46d21c0f36aa (nicer) endianness fix for every plugin except pl_format
colin
parents: 8739
diff changeset
90 case(AFMT_S16_NE): {
4927
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
91
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
92 int16_t* data=(int16_t*)ao_plugin_data.data;
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
93 int len=ao_plugin_data.len / 2; // 16 bits samples
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
94
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
95 float mul = pl_extrastereo.mul;
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
96 int32_t i, avg, ltmp, rtmp;
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
97
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
98 for (i=0; i < len ; i += 2) {
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
99
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
100 avg = (data[i] + data[i + 1]) / 2;
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
101
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
102 ltmp = avg + (int) (mul * (data[i] - avg));
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
103 rtmp = avg + (int) (mul * (data[i + 1] - avg));
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
104
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
105 if (ltmp < -32768) {
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
106 ltmp = -32768;
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
107 } else if (ltmp > 32767) {
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
108 ltmp = 32767;
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
109 }
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
110
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
111 if (rtmp < -32768) {
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
112 rtmp = -32768;
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
113 } else if (rtmp > 32767) {
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
114 rtmp = 32767;
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
115 }
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
116
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
117 data[i] = ltmp;
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
118 data[i + 1] = rtmp;
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
119 }
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
120 break;
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
121 }
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
122 default:
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
123 return 0;
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
124 }
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
125 return 1;
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
126 }
3022570ad7d4 Extrastereo plugin: increases linearly the difference between left and right
pl
parents:
diff changeset
127