3307
|
1 /* Audio out plugin it doesnt't really do anything useful but serves
|
|
2 an example of how audio plugins work. It delays the output signal
|
|
3 by the nuber of samples set by delay=n where n is the number of
|
|
4 bytes.
|
|
5 */
|
3194
1648d11fc36c
commandline configuration of audio plugins now through struct, format conversion plugin added
anders
diff
changeset
|
6 #define PLUGIN
|
3107
|
7
|
|
8 #include <stdio.h>
|
|
9 #include <stdlib.h>
|
6237
|
10 #include <string.h>
|
3107
|
11
|
|
12 #include "audio_out.h"
|
|
13 #include "audio_plugin.h"
|
|
14 #include "audio_plugin_internal.h"
|
|
15 #include "afmt.h"
|
|
16
|
|
17 static ao_info_t info =
|
|
18 {
|
3194
1648d11fc36c
commandline configuration of audio plugins now through struct, format conversion plugin added
anders
diff
changeset
|
19 "Delay audio plugin",
|
3107
|
20 "delay",
|
|
21 "Anders",
|
|
22 ""
|
|
23 };
|
|
24
|
|
25 LIBAO_PLUGIN_EXTERN(delay)
|
|
26
|
|
27 // local data
|
|
28 typedef struct pl_delay_s
|
|
29 {
|
|
30 void* data; // local audio data block
|
|
31 void* delay; // data block used for delaying audio signal
|
|
32 int len; // local buffer length
|
|
33 int rate; // local data rate
|
|
34 int channels; // local number of channels
|
|
35 int format; // local format
|
|
36 } pl_delay_t;
|
|
37
|
|
38 static pl_delay_t pl_delay={NULL,NULL,0,0,0,0};
|
|
39
|
|
40 // to set/get/query special features/parameters
|
9633
|
41 static int control(int cmd,void *arg){
|
3107
|
42 switch(cmd){
|
|
43 case AOCONTROL_PLUGIN_SET_LEN:
|
|
44 if(pl_delay.data)
|
3307
|
45 free(pl_delay.data);
|
3194
1648d11fc36c
commandline configuration of audio plugins now through struct, format conversion plugin added
anders
diff
changeset
|
46 pl_delay.len = ao_plugin_data.len;
|
1648d11fc36c
commandline configuration of audio plugins now through struct, format conversion plugin added
anders
diff
changeset
|
47 pl_delay.data=(void*)malloc(ao_plugin_data.len);
|
3307
|
48 if(!pl_delay.data)
|
|
49 return CONTROL_ERROR;
|
3107
|
50 return CONTROL_OK;
|
|
51 }
|
|
52 return -1;
|
|
53 }
|
|
54
|
|
55 // open & setup audio device
|
|
56 // return: 1=success 0=fail
|
|
57 static int init(){
|
3307
|
58 float time_delay; // The time in [s] this plugin delays the output data
|
|
59
|
|
60 /* If the output format of any of the below parameters differs from
|
3107
|
61 what is give it should be changed. See ao_plugin init() */
|
|
62 pl_delay.rate=ao_plugin_data.rate;
|
3307
|
63 pl_delay.channels=ao_plugin_data.channels; //1=mono 2=stereo
|
3107
|
64 pl_delay.format=ao_plugin_data.format;
|
|
65
|
|
66 // Tell ao_plugin how much this plugin adds to the overall time delay
|
3194
1648d11fc36c
commandline configuration of audio plugins now through struct, format conversion plugin added
anders
diff
changeset
|
67 time_delay=-1*(float)ao_plugin_cfg.pl_delay_len/((float)pl_delay.channels*(float)pl_delay.rate);
|
3107
|
68 if(pl_delay.format != AFMT_U8 && pl_delay.format != AFMT_S8)
|
|
69 time_delay/=2;
|
|
70 ao_plugin_data.delay_fix+=time_delay;
|
|
71
|
3307
|
72 // Create buffer for the delayed data
|
3194
1648d11fc36c
commandline configuration of audio plugins now through struct, format conversion plugin added
anders
diff
changeset
|
73 pl_delay.delay=(void*)malloc(ao_plugin_cfg.pl_delay_len);
|
3107
|
74 if(!pl_delay.delay)
|
|
75 return 0;
|
3307
|
76 memset(pl_delay.delay, 0, ao_plugin_cfg.pl_delay_len);
|
|
77
|
|
78 // Print some cool remark of what the plugin does
|
3194
1648d11fc36c
commandline configuration of audio plugins now through struct, format conversion plugin added
anders
diff
changeset
|
79 printf("[pl_delay] Output sound delayed by %i bytes\n",ao_plugin_cfg.pl_delay_len);
|
3107
|
80 return 1;
|
|
81 }
|
|
82
|
|
83 // close plugin
|
|
84 static void uninit(){
|
|
85 if(pl_delay.delay)
|
|
86 free(pl_delay.delay);
|
|
87 if(pl_delay.data)
|
|
88 free(pl_delay.data);
|
3194
1648d11fc36c
commandline configuration of audio plugins now through struct, format conversion plugin added
anders
diff
changeset
|
89 ao_plugin_cfg.pl_delay_len=0;
|
3107
|
90 }
|
|
91
|
|
92 // empty buffers
|
|
93 static void reset(){
|
|
94 int i = 0;
|
|
95 for(i=0;i<pl_delay.len;i++)
|
|
96 ((char*)pl_delay.data)[i]=0;
|
3194
1648d11fc36c
commandline configuration of audio plugins now through struct, format conversion plugin added
anders
diff
changeset
|
97 for(i=0;i<ao_plugin_cfg.pl_delay_len;i++)
|
3107
|
98 ((char*)pl_delay.delay)[i]=0;
|
|
99 }
|
|
100
|
|
101 // processes 'ao_plugin_data.len' bytes of 'data'
|
|
102 // called for every block of data
|
|
103 static int play(){
|
|
104 // Copy end of prev block to begining of buffer
|
4374
|
105 memcpy(pl_delay.data,pl_delay.delay,ao_plugin_cfg.pl_delay_len);
|
3107
|
106 // Copy current block except end
|
4374
|
107 memcpy(pl_delay.data+ao_plugin_cfg.pl_delay_len,
|
|
108 ao_plugin_data.data,
|
|
109 ao_plugin_data.len-ao_plugin_cfg.pl_delay_len);
|
3107
|
110 // Save away end of current block for next call
|
4374
|
111 memcpy(pl_delay.delay,
|
|
112 ao_plugin_data.data+ao_plugin_data.len-ao_plugin_cfg.pl_delay_len,
|
|
113 ao_plugin_cfg.pl_delay_len);
|
3107
|
114 // Set output data block
|
|
115 ao_plugin_data.data=pl_delay.data;
|
|
116 return 1;
|
|
117 }
|
|
118
|
|
119
|
|
120
|
3307
|
121
|
|
122
|
|
123
|
|
124
|
|
125
|
|
126
|
|
127
|
|
128
|
|
129
|