Mercurial > mplayer.hg
annotate libao2/pl_delay.c @ 13367:81ca72fd45f6
runtime aspect switching, patch by Aurelien Jacobs <aurel at gnuage . org>
author | diego |
---|---|
date | Fri, 17 Sep 2004 15:38:59 +0000 |
parents | 6e35326c742f |
children | 815f03b7cee5 |
rev | line source |
---|---|
11000 | 1 /* Audio out plugin it doesn't really do anything useful but serves |
3307
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 | |
9633
12b1790038b0
64bit libao2 fix by Jens Axboe <mplayer-dev@kernel.dk>
alex
parents:
7472
diff
changeset
|
41 static int control(int cmd,void *arg){ |
3107 | 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(){ | |
3307
4a5d56e89735
correced memory deallocation bug and erors in comments
anders
parents:
3194
diff
changeset
|
58 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
|
59 |
4a5d56e89735
correced memory deallocation bug and erors in comments
anders
parents:
3194
diff
changeset
|
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
4a5d56e89735
correced memory deallocation bug and erors in comments
anders
parents:
3194
diff
changeset
|
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
parents:
3107
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
4a5d56e89735
correced memory deallocation bug and erors in comments
anders
parents:
3194
diff
changeset
|
72 // 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
|
73 pl_delay.delay=(void*)malloc(ao_plugin_cfg.pl_delay_len); |
3107 | 74 if(!pl_delay.delay) |
75 return 0; | |
3307
4a5d56e89735
correced memory deallocation bug and erors in comments
anders
parents:
3194
diff
changeset
|
76 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
|
77 |
4a5d56e89735
correced memory deallocation bug and erors in comments
anders
parents:
3194
diff
changeset
|
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
parents:
3107
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
parents:
3107
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
parents:
3107
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
0a95c5074c50
Fixed sig 11 caused by resampling plugin, some cosmetic changes and speed improvements
anders
parents:
3307
diff
changeset
|
105 memcpy(pl_delay.data,pl_delay.delay,ao_plugin_cfg.pl_delay_len); |
3107 | 106 // 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
|
107 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
|
108 ao_plugin_data.data, |
0a95c5074c50
Fixed sig 11 caused by resampling plugin, some cosmetic changes and speed improvements
anders
parents:
3307
diff
changeset
|
109 ao_plugin_data.len-ao_plugin_cfg.pl_delay_len); |
3107 | 110 // 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
|
111 memcpy(pl_delay.delay, |
0a95c5074c50
Fixed sig 11 caused by resampling plugin, some cosmetic changes and speed improvements
anders
parents:
3307
diff
changeset
|
112 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
|
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
4a5d56e89735
correced memory deallocation bug and erors in comments
anders
parents:
3194
diff
changeset
|
121 |
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 |