2 Copyright (C) Prikol Software 1996-1997
3 Copyright (C) Aleksey Volynskov 1996-1997
4 Copyright (C) <ARembo@gmail.com> 2011
6 This file is part of the Doom2D:Rembo project.
8 Doom2D:Rembo is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License version 2 as
10 published by the Free Software Foundation.
12 Doom2D:Rembo is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, see <http://www.gnu.org/licenses/> or
19 write to the Free Software Foundation, Inc.,
20 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
27 #include <SDL_mixer.h>
29 #define NUM_CHANNELS 16
30 #define NUM_CHUNKS 300
43 if (!SDL_WasInit(SDL_INIT_AUDIO
)) {
44 if (SDL_InitSubSystem(SDL_INIT_AUDIO
) < 0) {
45 fprintf(stderr
, "\nUnable to initialize audio: %s\n", SDL_GetError());
50 if (Mix_OpenAudio(22050, AUDIO_S16
, 1, 1000) < 0) {
51 fprintf(stderr
, "Error initializing SDL_mixer: %s\n", Mix_GetError());
56 if (Mix_AllocateChannels(NUM_CHANNELS
)!=NUM_CHANNELS
) {
57 fprintf(stderr
, "Error allocation channels: %s\n", Mix_GetError());
64 for (i
=0; i
<NUM_CHUNKS
; i
++) {
69 snddisabled
= (snd_vol
==0);
78 SDL_QuitSubSystem(SDL_INIT_AUDIO
);
81 Mix_Chunk
* get_chunk(snd_t
*s
, int r
, int v
)
84 for(i
=0; i
<NUM_CHUNKS
; i
++) {
85 if (chunks
[i
].s
== s
) return chunks
[i
].c
;
86 if (chunks
[i
].s
== NULL
&& fi
==-1) fi
= i
;
89 if (fi
==-1) return NULL
;
91 Uint8
*data
= (Uint8
*)s
+sizeof(snd_t
);
94 SDL_BuildAudioCVT(&cvt
, AUDIO_S8
, 1, s
->rate
, AUDIO_S16
, 1, 22050);
95 if (!(cvt
.buf
= malloc(dlen
*cvt
.len_mult
))) ERR_fatal("Out of memory\n");;
96 memcpy(cvt
.buf
, data
, dlen
);
98 SDL_ConvertAudio(&cvt
);
101 if (!(chunk
= malloc(sizeof(Mix_Chunk
)))) ERR_fatal("Out of memory\n");;
103 chunk
->alen
=cvt
.len_cvt
;
105 chunk
->volume
=(float)v
/255*SDL_MIX_MAXVOLUME
;
108 chunks
[fi
].c
= chunk
;
115 if (snddisabled
) return;
118 for (i
=0; i
<NUM_CHUNKS
; i
++) {
120 free(chunks
[i
].c
->abuf
);
128 short S_play(snd_t
*s
,short c
,unsigned r
,short v
)
130 if (snddisabled
) return 0;
131 Mix_Chunk
*chunk
= get_chunk(s
,r
,v
);
132 if (chunk
==NULL
) return 0;
133 return Mix_PlayChannel(c
, chunk
, 0);
143 if (snddisabled
) return;
145 if (snd_vol
>128) snd_vol
=128;
146 if (snd_vol
<0) snd_vol
=0;
147 Mix_Volume(-1, snd_vol
);
152 if (snddisabled
) return;
153 while (Mix_Playing(-1)) {