Mercurial > hg > forks > pwpunix
annotate pwplib/snd-sdl.c @ 31:502d54fd46fa
Remove useless pwp_sdlaudio_close(), move fragment size calculation after SDL_OpenAudio() call as it may possibly modify the frequency. Show acquired audio parameters to user.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Mon, 24 May 2010 00:21:39 +0300 |
parents | 56848f781b4c |
children | 32ec3c0d1b6c |
rev | line source |
---|---|
0 | 1 /* |
2 * pwplib SDL (Simple Directmedia Layer) audio "driver" | |
3 * (C) Copyright 2010 ccr/TNSP^PWP <ccr@tnsp.org> | |
4 * | |
5 * This file and other changes are distributed under same | |
6 * license as pwplib itself. | |
7 */ | |
8 | |
9 #include "config.h" | |
10 | |
11 #ifdef DRIVE_SDL | |
12 | |
13 #include <stdio.h> | |
14 #include <stdlib.h> | |
15 #include <unistd.h> | |
16 #include <SDL.h> | |
17 | |
18 #include "pwplib.h" | |
19 | |
18 | 20 #define TIMERHZ (72/3) |
0 | 21 |
10
a379d6a2a717
Take into account that SDL does not guarantee audio buffer size to be what
Matti Hamalainen <ccr@tnsp.org>
parents:
6
diff
changeset
|
22 static int pwp_sdlaudio_run = 1; |
a379d6a2a717
Take into account that SDL does not guarantee audio buffer size to be what
Matti Hamalainen <ccr@tnsp.org>
parents:
6
diff
changeset
|
23 static int pwp_sdlaudio_frag = -1, pwp_sdlaudio_curr; |
0 | 24 |
25 extern void gb_sound(int, int, int, int); | |
26 | |
27 | |
17
c60e531d19cd
Some misc. cleanups and minor warning removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
16
diff
changeset
|
28 static void pwp_sdlaudio_fill(void * udata, Uint8 * buf, int len) |
0 | 29 { |
17
c60e531d19cd
Some misc. cleanups and minor warning removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
16
diff
changeset
|
30 (void) udata; |
10
a379d6a2a717
Take into account that SDL does not guarantee audio buffer size to be what
Matti Hamalainen <ccr@tnsp.org>
parents:
6
diff
changeset
|
31 while (len > 0) { |
a379d6a2a717
Take into account that SDL does not guarantee audio buffer size to be what
Matti Hamalainen <ccr@tnsp.org>
parents:
6
diff
changeset
|
32 if (pwp_sdlaudio_curr > len) { |
a379d6a2a717
Take into account that SDL does not guarantee audio buffer size to be what
Matti Hamalainen <ccr@tnsp.org>
parents:
6
diff
changeset
|
33 pwp_sdlaudio_curr -= len; |
a379d6a2a717
Take into account that SDL does not guarantee audio buffer size to be what
Matti Hamalainen <ccr@tnsp.org>
parents:
6
diff
changeset
|
34 gb_genwave(buf, len); |
a379d6a2a717
Take into account that SDL does not guarantee audio buffer size to be what
Matti Hamalainen <ccr@tnsp.org>
parents:
6
diff
changeset
|
35 len = 0; |
a379d6a2a717
Take into account that SDL does not guarantee audio buffer size to be what
Matti Hamalainen <ccr@tnsp.org>
parents:
6
diff
changeset
|
36 pwplib.player(); |
a379d6a2a717
Take into account that SDL does not guarantee audio buffer size to be what
Matti Hamalainen <ccr@tnsp.org>
parents:
6
diff
changeset
|
37 } else { |
a379d6a2a717
Take into account that SDL does not guarantee audio buffer size to be what
Matti Hamalainen <ccr@tnsp.org>
parents:
6
diff
changeset
|
38 gb_genwave(buf, pwp_sdlaudio_curr); |
a379d6a2a717
Take into account that SDL does not guarantee audio buffer size to be what
Matti Hamalainen <ccr@tnsp.org>
parents:
6
diff
changeset
|
39 buf += pwp_sdlaudio_curr; |
a379d6a2a717
Take into account that SDL does not guarantee audio buffer size to be what
Matti Hamalainen <ccr@tnsp.org>
parents:
6
diff
changeset
|
40 len -= pwp_sdlaudio_curr; |
a379d6a2a717
Take into account that SDL does not guarantee audio buffer size to be what
Matti Hamalainen <ccr@tnsp.org>
parents:
6
diff
changeset
|
41 pwp_sdlaudio_curr = pwp_sdlaudio_frag; |
a379d6a2a717
Take into account that SDL does not guarantee audio buffer size to be what
Matti Hamalainen <ccr@tnsp.org>
parents:
6
diff
changeset
|
42 pwplib.player(); |
a379d6a2a717
Take into account that SDL does not guarantee audio buffer size to be what
Matti Hamalainen <ccr@tnsp.org>
parents:
6
diff
changeset
|
43 } |
a379d6a2a717
Take into account that SDL does not guarantee audio buffer size to be what
Matti Hamalainen <ccr@tnsp.org>
parents:
6
diff
changeset
|
44 } |
0 | 45 } |
46 | |
10
a379d6a2a717
Take into account that SDL does not guarantee audio buffer size to be what
Matti Hamalainen <ccr@tnsp.org>
parents:
6
diff
changeset
|
47 static void pwp_sdlaudio_start(void) |
0 | 48 { |
10
a379d6a2a717
Take into account that SDL does not guarantee audio buffer size to be what
Matti Hamalainen <ccr@tnsp.org>
parents:
6
diff
changeset
|
49 if (pwp_sdlaudio_run) { |
a379d6a2a717
Take into account that SDL does not guarantee audio buffer size to be what
Matti Hamalainen <ccr@tnsp.org>
parents:
6
diff
changeset
|
50 pwp_sdlaudio_curr = pwp_sdlaudio_frag; |
a379d6a2a717
Take into account that SDL does not guarantee audio buffer size to be what
Matti Hamalainen <ccr@tnsp.org>
parents:
6
diff
changeset
|
51 pwp_sdlaudio_run = 0; |
6
e2f028bf775a
Possibly start SDL audio more sanely.
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
52 SDL_PauseAudio(0); |
e2f028bf775a
Possibly start SDL audio more sanely.
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
53 } |
0 | 54 } |
55 | |
56 int pwp_sdlaudio_init() | |
57 { | |
58 SDL_AudioSpec fmt; | |
59 | |
10
a379d6a2a717
Take into account that SDL does not guarantee audio buffer size to be what
Matti Hamalainen <ccr@tnsp.org>
parents:
6
diff
changeset
|
60 pwp_sdlaudio_run = 1; |
a379d6a2a717
Take into account that SDL does not guarantee audio buffer size to be what
Matti Hamalainen <ccr@tnsp.org>
parents:
6
diff
changeset
|
61 |
0 | 62 fmt.freq = 44100; |
63 fmt.format = AUDIO_U8; | |
64 fmt.channels = 1; | |
10
a379d6a2a717
Take into account that SDL does not guarantee audio buffer size to be what
Matti Hamalainen <ccr@tnsp.org>
parents:
6
diff
changeset
|
65 fmt.samples = 2048; |
0 | 66 fmt.callback = pwp_sdlaudio_fill; |
67 | |
68 if (SDL_OpenAudio(&fmt, NULL) < 0) | |
69 { | |
70 pwpwrite("* SDL: Could not get desired audio format.\n"); | |
71 return 0; | |
72 } | |
73 | |
31
502d54fd46fa
Remove useless pwp_sdlaudio_close(), move fragment size calculation after SDL_OpenAudio() call as it may possibly modify the frequency. Show acquired audio parameters to user.
Matti Hamalainen <ccr@tnsp.org>
parents:
18
diff
changeset
|
74 pwp_sdlaudio_frag = fmt.freq / TIMERHZ; |
502d54fd46fa
Remove useless pwp_sdlaudio_close(), move fragment size calculation after SDL_OpenAudio() call as it may possibly modify the frequency. Show acquired audio parameters to user.
Matti Hamalainen <ccr@tnsp.org>
parents:
18
diff
changeset
|
75 |
502d54fd46fa
Remove useless pwp_sdlaudio_close(), move fragment size calculation after SDL_OpenAudio() call as it may possibly modify the frequency. Show acquired audio parameters to user.
Matti Hamalainen <ccr@tnsp.org>
parents:
18
diff
changeset
|
76 pwpwrite("* SDL sound (freq=%d, fmt=%d, chn=%d, buf=%d, frag=%d)\n", |
502d54fd46fa
Remove useless pwp_sdlaudio_close(), move fragment size calculation after SDL_OpenAudio() call as it may possibly modify the frequency. Show acquired audio parameters to user.
Matti Hamalainen <ccr@tnsp.org>
parents:
18
diff
changeset
|
77 fmt.freq, fmt.format, fmt.channels, fmt.samples, pwp_sdlaudio_frag); |
0 | 78 |
79 pwplib.sound = gb_sound; | |
10
a379d6a2a717
Take into account that SDL does not guarantee audio buffer size to be what
Matti Hamalainen <ccr@tnsp.org>
parents:
6
diff
changeset
|
80 pwplib.loopflush = pwp_sdlaudio_start; |
0 | 81 gb_init(fmt.freq); |
82 | |
83 return 1; | |
84 } | |
85 #endif |