summaryrefslogtreecommitdiff
path: root/apps/codecs/dumb/src/allegro/alplay.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/codecs/dumb/src/allegro/alplay.c')
-rw-r--r--apps/codecs/dumb/src/allegro/alplay.c270
1 files changed, 0 insertions, 270 deletions
diff --git a/apps/codecs/dumb/src/allegro/alplay.c b/apps/codecs/dumb/src/allegro/alplay.c
deleted file mode 100644
index 983bde105b..0000000000
--- a/apps/codecs/dumb/src/allegro/alplay.c
+++ /dev/null
@@ -1,270 +0,0 @@
1/* _______ ____ __ ___ ___
2 * \ _ \ \ / \ / \ \ / / ' ' '
3 * | | \ \ | | || | \/ | . .
4 * | | | | | | || ||\ /| |
5 * | | | | | | || || \/ | | ' ' '
6 * | | | | | | || || | | . .
7 * | |_/ / \ \__// || | |
8 * /_______/ynamic \____/niversal /__\ /____\usic /| . . ibliotheque
9 * / \
10 * / . \
11 * alplay.c - Functions to play a DUH through / / \ \
12 * an Allegro audio stream. | < / \_
13 * | \/ /\ /
14 * By entheh. \_ / > /
15 * | \ / /
16 * | ' /
17 * \__/
18 */
19
20#include <stdlib.h>
21
22#include <allegro.h>
23
24#include "aldumb.h"
25
26
27
28#define ADP_PLAYING 1
29
30struct AL_DUH_PLAYER
31{
32 int flags;
33 long bufsize;
34 int freq;
35 AUDIOSTREAM *stream;
36 DUH_SIGRENDERER *sigrenderer; /* If this is NULL, stream is invalid. */
37 float volume;
38 int silentcount;
39};
40
41
42
43AL_DUH_PLAYER *al_start_duh(DUH *duh, int n_channels, long pos, float volume, long bufsize, int freq)
44{
45 AL_DUH_PLAYER *dp;
46
47 /* This restriction is imposed by Allegro. */
48 ASSERT(n_channels > 0);
49 ASSERT(n_channels <= 2);
50
51 if (!duh)
52 return NULL;
53
54 dp = malloc(sizeof(*dp));
55 if (!dp)
56 return NULL;
57
58 dp->flags = ADP_PLAYING;
59 dp->bufsize = bufsize;
60 dp->freq = freq;
61
62 dp->stream = play_audio_stream(bufsize, 16, n_channels - 1, freq, 255, 128);
63
64 if (!dp->stream) {
65 free(dp);
66 return NULL;
67 }
68
69 voice_set_priority(dp->stream->voice, 255);
70
71 dp->sigrenderer = duh_start_sigrenderer(duh, 0, n_channels, pos);
72
73 if (!dp->sigrenderer) {
74 stop_audio_stream(dp->stream);
75 free(dp);
76 return NULL;
77 }
78
79 dp->volume = volume;
80 dp->silentcount = 0;
81
82 return dp;
83}
84
85
86
87void al_stop_duh(AL_DUH_PLAYER *dp)
88{
89 if (dp) {
90 if (dp->sigrenderer) {
91 duh_end_sigrenderer(dp->sigrenderer);
92 stop_audio_stream(dp->stream);
93 }
94 free(dp);
95 }
96}
97
98
99
100void al_pause_duh(AL_DUH_PLAYER *dp)
101{
102 if (dp && dp->sigrenderer && (dp->flags & ADP_PLAYING)) {
103 voice_stop(dp->stream->voice);
104 dp->flags &= ~ADP_PLAYING;
105 }
106}
107
108
109
110void al_resume_duh(AL_DUH_PLAYER *dp)
111{
112 if (dp && dp->sigrenderer && !(dp->flags & ADP_PLAYING)) {
113 voice_start(dp->stream->voice);
114 dp->flags |= ADP_PLAYING;
115 }
116}
117
118
119
120void al_duh_set_priority(AL_DUH_PLAYER *dp, int priority)
121{
122 if (dp && dp->sigrenderer)
123 voice_set_priority(dp->stream->voice, priority);
124}
125
126
127
128void al_duh_set_volume(AL_DUH_PLAYER *dp, float volume)
129{
130 if (dp)
131 dp->volume = volume;
132}
133
134
135
136int al_poll_duh(AL_DUH_PLAYER *dp)
137{
138 unsigned short *sptr;
139 long n;
140 long size;
141 int n_channels;
142
143 if (!dp || !dp->sigrenderer)
144 return 1;
145
146 if (!(dp->flags & ADP_PLAYING))
147 return 0;
148
149 sptr = get_audio_stream_buffer(dp->stream);
150
151 if (!sptr)
152 return 0;
153
154 n = duh_render(dp->sigrenderer, 16, 1, dp->volume, 65536.0 / dp->freq, dp->bufsize, sptr);
155
156 if (n == 0) {
157 if (++dp->silentcount >= 2) {
158 duh_end_sigrenderer(dp->sigrenderer);
159 free_audio_stream_buffer(dp->stream);
160 stop_audio_stream(dp->stream);
161 dp->sigrenderer = NULL;
162 return 1;
163 }
164 }
165
166 n_channels = duh_sigrenderer_get_n_channels(dp->sigrenderer);
167 n *= n_channels;
168 size = dp->bufsize * n_channels;
169 for (; n < size; n++)
170 sptr[n] = 0x8000;
171
172 free_audio_stream_buffer(dp->stream);
173
174 return 0;
175}
176
177
178
179long al_duh_get_position(AL_DUH_PLAYER *dp)
180{
181 return dp ? duh_sigrenderer_get_position(dp->sigrenderer) : -1;
182}
183
184
185
186AL_DUH_PLAYER *al_duh_encapsulate_sigrenderer(DUH_SIGRENDERER *sigrenderer, float volume, long bufsize, int freq)
187{
188 AL_DUH_PLAYER *dp;
189 int n_channels;
190
191 if (!sigrenderer)
192 return NULL;
193
194 dp = malloc(sizeof(*dp));
195 if (!dp)
196 return NULL;
197
198 n_channels = duh_sigrenderer_get_n_channels(sigrenderer);
199
200 /* This restriction is imposed by Allegro. */
201 ASSERT(n_channels > 0);
202 ASSERT(n_channels <= 2);
203
204 dp->flags = ADP_PLAYING;
205 dp->bufsize = bufsize;
206 dp->freq = freq;
207
208 dp->stream = play_audio_stream(bufsize, 16, n_channels - 1, freq, 255, 128);
209
210 if (!dp->stream) {
211 free(dp);
212 return NULL;
213 }
214
215 voice_set_priority(dp->stream->voice, 255);
216
217 dp->sigrenderer = sigrenderer;
218
219 dp->volume = volume;
220 dp->silentcount = 0;
221
222 return dp;
223}
224
225
226
227DUH_SIGRENDERER *al_duh_get_sigrenderer(AL_DUH_PLAYER *dp)
228{
229 return dp ? dp->sigrenderer : NULL;
230}
231
232
233
234/* IMPORTANT: This function will return NULL if the music has ended. */
235// Should this be changed? User might want to hack the underlying SIGRENDERER
236// and resurrect it (e.g. change pattern number), before it gets destroyed...
237DUH_SIGRENDERER *al_duh_decompose_to_sigrenderer(AL_DUH_PLAYER *dp)
238{
239 if (dp) {
240 DUH_SIGRENDERER *sigrenderer = dp->sigrenderer;
241 if (sigrenderer) stop_audio_stream(dp->stream);
242 free(dp);
243 return sigrenderer;
244 }
245 return NULL;
246}
247
248
249
250/* DEPRECATED */
251AL_DUH_PLAYER *al_duh_encapsulate_renderer(DUH_SIGRENDERER *dr, float volume, long bufsize, int freq)
252{
253 return al_duh_encapsulate_sigrenderer(dr, volume, bufsize, freq);
254}
255
256
257
258/* DEPRECATED */
259DUH_SIGRENDERER *al_duh_get_renderer(AL_DUH_PLAYER *dp)
260{
261 return al_duh_get_sigrenderer(dp);
262}
263
264
265
266/* DEPRECATED */
267DUH_SIGRENDERER *al_duh_decompose_to_renderer(AL_DUH_PLAYER *dp)
268{
269 return al_duh_decompose_to_sigrenderer(dp);
270}