Mercurial > mplayer.hg
annotate libao2/pl_delay.c @ 7431:e46eeafcd4df
Moved all the cdinfo specific from cddb to a standalone file(cdinfo.c), so
if no network, cdda can still be compiled.
author | bertrand |
---|---|
date | Tue, 17 Sep 2002 19:51:12 +0000 |
parents | 2eec40929570 |
children | c4434bdf6e51 |
rev | line source |
---|---|
3307
4a5d56e89735
correced memory deallocation bug and erors in comments
anders
parents:
3194
diff
changeset
|
1 /* Audio out plugin it doesnt't really do anything useful but serves |
4a5d56e89735
correced memory deallocation bug and erors in comments
anders
parents:
3194
diff
changeset
|
2 an example of how audio plugins work. It delays the output signal |
4a5d56e89735
correced memory deallocation bug and erors in comments
anders
parents:
3194
diff
changeset
|
3 by the nuber of samples set by delay=n where n is the number of |
4a5d56e89735
correced memory deallocation bug and erors in comments
anders
parents:
3194
diff
changeset
|
4 bytes. |
4a5d56e89735
correced memory deallocation bug and erors in comments
anders
parents:
3194
diff
changeset
|
5 */ |
3194
1648d11fc36c
commandline configuration of audio plugins now through struct, format conversion plugin added
anders
parents:
3107
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
parents:
3107
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 | |
41 static int control(int cmd,int arg){ | |
42 switch(cmd){ | |
43 case AOCONTROL_PLUGIN_SET_LEN: | |
44 if(pl_delay.data) | |
3307
4a5d56e89735
correced memory deallocation bug and erors in comments
anders
parents:
3194
diff
changeset
|
45 free(pl_delay.data); |
3194
1648d11fc36c
commandline configuration of audio plugins now through struct, format conversion plugin added
anders
parents:
3107
diff
changeset
|
46 pl_delay.len = ao_plugin_data.len; |
1648d11fc36c
commandline configuration of audio plugins now through struct, format conversion plugin added
anders
parents:
3107
diff
changeset
|
47 pl_delay.data=(void*)malloc(ao_plugin_data.len); |
3307
4a5d56e89735
correced memory deallocation bug and erors in comments
anders
parents:
3194
diff
changeset
|
48 if(!pl_delay.data) |
4a5d56e89735
correced memory deallocation bug and erors in comments
anders
parents:
3194
diff
changeset
|
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(){ | |
58 int i=0; | |
3307
4a5d56e89735
correced memory deallocation bug and erors in comments
anders
parents:
3194
diff
changeset
|
59 float time_delay; // The time in [s] this plugin delays the output data |
4a5d56e89735
correced memory deallocation bug and erors in comments
anders
parents:
3194
diff
changeset
|
60 |
4a5d56e89735
correced memory deallocation bug and erors in comments
anders
parents:
3194
diff
changeset
|
61 /* If the output format of any of the below parameters differs from |
3107 | 62 what is give it should be changed. See ao_plugin init() */ |
63 pl_delay.rate=ao_plugin_data.rate; | |
3307
4a5d56e89735
correced memory deallocation bug and erors in comments
anders
parents:
3194
diff
changeset
|
64 pl_delay.channels=ao_plugin_data.channels; //1=mono 2=stereo |
3107 | 65 pl_delay.format=ao_plugin_data.format; |
66 | |
67 // 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
parents:
3107
diff
changeset
|
68 time_delay=-1*(float)ao_plugin_cfg.pl_delay_len/((float)pl_delay.channels*(float)pl_delay.rate); |
3107 | 69 if(pl_delay.format != AFMT_U8 && pl_delay.format != AFMT_S8) |
70 time_delay/=2; | |
71 ao_plugin_data.delay_fix+=time_delay; | |
72 | |
3307
4a5d56e89735
correced memory deallocation bug and erors in comments
anders
parents:
3194
diff
changeset
|
73 // Create buffer for the delayed data |
3194
1648d11fc36c
commandline configuration of audio plugins now through struct, format conversion plugin added
anders
parents:
3107
diff
changeset
|
74 pl_delay.delay=(void*)malloc(ao_plugin_cfg.pl_delay_len); |
3107 | 75 if(!pl_delay.delay) |
76 return 0; | |
3307
4a5d56e89735
correced memory deallocation bug and erors in comments
anders
parents:
3194
diff
changeset
|
77 memset(pl_delay.delay, 0, ao_plugin_cfg.pl_delay_len); |
4a5d56e89735
correced memory deallocation bug and erors in comments
anders
parents:
3194
diff
changeset
|
78 |
4a5d56e89735
correced memory deallocation bug and erors in comments
anders
parents:
3194
diff
changeset
|
79 // Print some cool remark of what the plugin does |
3194
1648d11fc36c
commandline configuration of audio plugins now through struct, format conversion plugin added
anders
parents:
3107
diff
changeset
|
80 printf("[pl_delay] Output sound delayed by %i bytes\n",ao_plugin_cfg.pl_delay_len); |
3107 | 81 return 1; |
82 } | |
83 | |
84 // close plugin | |
85 static void uninit(){ | |
86 if(pl_delay.delay) | |
87 free(pl_delay.delay); | |
88 if(pl_delay.data) | |
89 free(pl_delay.data); | |
3194
1648d11fc36c
commandline configuration of audio plugins now through struct, format conversion plugin added
anders
parents:
3107
diff
changeset
|
90 ao_plugin_cfg.pl_delay_len=0; |
3107 | 91 } |
92 | |
93 // empty buffers | |
94 static void reset(){ | |
95 int i = 0; | |
96 for(i=0;i<pl_delay.len;i++) | |
97 ((char*)pl_delay.data)[i]=0; | |
3194
1648d11fc36c
commandline configuration of audio plugins now through struct, format conversion plugin added
anders
parents:
3107
diff
changeset
|
98 for(i=0;i<ao_plugin_cfg.pl_delay_len;i++) |
3107 | 99 ((char*)pl_delay.delay)[i]=0; |
100 } | |
101 | |
102 // processes 'ao_plugin_data.len' bytes of 'data' | |
103 // called for every block of data | |
104 static int play(){ | |
105 // Copy end of prev block to begining of buffer | |
4374
0a95c5074c50
Fixed sig 11 caused by resampling plugin, some cosmetic changes and speed improvements
anders
parents:
3307
diff
changeset
|
106 memcpy(pl_delay.data,pl_delay.delay,ao_plugin_cfg.pl_delay_len); |
3107 | 107 // Copy current block except end |
4374
0a95c5074c50
Fixed sig 11 caused by resampling plugin, some cosmetic changes and speed improvements
anders
parents:
3307
diff
changeset
|
108 memcpy(pl_delay.data+ao_plugin_cfg.pl_delay_len, |
0a95c5074c50
Fixed sig 11 caused by resampling plugin, some cosmetic changes and speed improvements
anders
parents:
3307
diff
changeset
|
109 ao_plugin_data.data, |
0a95c5074c50
Fixed sig 11 caused by resampling plugin, some cosmetic changes and speed improvements
anders
parents:
3307
diff
changeset
|
110 ao_plugin_data.len-ao_plugin_cfg.pl_delay_len); |
3107 | 111 // Save away end of current block for next call |
4374
0a95c5074c50
Fixed sig 11 caused by resampling plugin, some cosmetic changes and speed improvements
anders
parents:
3307
diff
changeset
|
112 memcpy(pl_delay.delay, |
0a95c5074c50
Fixed sig 11 caused by resampling plugin, some cosmetic changes and speed improvements
anders
parents:
3307
diff
changeset
|
113 ao_plugin_data.data+ao_plugin_data.len-ao_plugin_cfg.pl_delay_len, |
0a95c5074c50
Fixed sig 11 caused by resampling plugin, some cosmetic changes and speed improvements
anders
parents:
3307
diff
changeset
|
114 ao_plugin_cfg.pl_delay_len); |
3107 | 115 // Set output data block |
116 ao_plugin_data.data=pl_delay.data; | |
117 return 1; | |
118 } | |
119 | |
120 | |
121 | |
3307
4a5d56e89735
correced memory deallocation bug and erors in comments
anders
parents:
3194
diff
changeset
|
122 |
4a5d56e89735
correced memory deallocation bug and erors in comments
anders
parents:
3194
diff
changeset
|
123 |
4a5d56e89735
correced memory deallocation bug and erors in comments
anders
parents:
3194
diff
changeset
|
124 |
4a5d56e89735
correced memory deallocation bug and erors in comments
anders
parents:
3194
diff
changeset
|
125 |
4a5d56e89735
correced memory deallocation bug and erors in comments
anders
parents:
3194
diff
changeset
|
126 |
4a5d56e89735
correced memory deallocation bug and erors in comments
anders
parents:
3194
diff
changeset
|
127 |
4a5d56e89735
correced memory deallocation bug and erors in comments
anders
parents:
3194
diff
changeset
|
128 |
4a5d56e89735
correced memory deallocation bug and erors in comments
anders
parents:
3194
diff
changeset
|
129 |
4a5d56e89735
correced memory deallocation bug and erors in comments
anders
parents:
3194
diff
changeset
|
130 |