/
playmus.c
247 lines (216 loc) · 5.55 KB
1
/*
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
PLAYMUS: A test application for the SDL mixer library.
Copyright (C) 1997-2012 Sam Lantinga <slouken@libsdl.org>
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
20
21
*/
22
/* $Id$ */
23
24
25
26
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
27
28
#ifdef unix
29
30
31
#include <unistd.h>
#endif
32
#include "SDL.h"
33
#include "SDL_mixer.h"
34
35
36
37
38
#ifdef HAVE_SIGNAL_H
#include <signal.h>
#endif
39
40
41
static int audio_open = 0;
static Mix_Music *music = NULL;
42
static int next_track = 0;
43
44
void CleanUp(int exitcode)
45
{
46
47
48
49
if( Mix_PlayingMusic() ) {
Mix_FadeOutMusic(1500);
SDL_Delay(1500);
}
50
51
52
53
if ( music ) {
Mix_FreeMusic(music);
music = NULL;
}
54
55
56
57
if ( audio_open ) {
Mix_CloseAudio();
audio_open = 0;
}
58
SDL_Quit();
59
exit(exitcode);
60
61
62
63
}
void Usage(char *argv0)
{
64
fprintf(stderr, "Usage: %s [-i] [-l] [-8] [-r rate] [-c channels] [-b buffers] [-v N] [-rwops] <musicfile>\n", argv0);
65
}
66
67
/*#define SEEK_TEST */
68
69
70
71
void Menu(void)
{
char buf[10];
72
printf("Available commands: (p)ause (r)esume (h)alt volume(v#) > ");
73
fflush(stdin);
74
75
if (scanf("%s",buf) == 1) {
switch(buf[0]){
76
77
78
79
80
81
82
#if defined(SEEK_TEST)
case '0': Mix_SetMusicPosition(0); break;
case '1': Mix_SetMusicPosition(10);break;
case '2': Mix_SetMusicPosition(20);break;
case '3': Mix_SetMusicPosition(30);break;
case '4': Mix_SetMusicPosition(40);break;
#endif /* SEEK_TEST */
83
84
85
86
87
88
89
90
91
92
93
94
95
case 'p': case 'P':
Mix_PauseMusic();
break;
case 'r': case 'R':
Mix_ResumeMusic();
break;
case 'h': case 'H':
Mix_HaltMusic();
break;
case 'v': case 'V':
Mix_VolumeMusic(atoi(buf+1));
break;
}
96
97
98
99
100
}
printf("Music playing: %s Paused: %s\n", Mix_PlayingMusic() ? "yes" : "no",
Mix_PausedMusic() ? "yes" : "no");
}
101
102
#ifdef HAVE_SIGNAL_H
103
104
105
106
107
108
109
110
111
void IntHandler(int sig)
{
switch (sig) {
case SIGINT:
next_track++;
break;
}
}
112
113
#endif
114
int main(int argc, char *argv[])
115
{
116
SDL_RWops *rwfp = NULL;
117
int audio_rate;
118
119
Uint16 audio_format;
int audio_channels;
120
int audio_buffers;
121
int audio_volume = MIX_MAX_VOLUME;
122
int looping = 0;
123
int interactive = 0;
124
int rwops = 0;
125
126
127
128
129
130
int i;
/* Initialize variables */
audio_rate = 22050;
audio_format = AUDIO_S16;
audio_channels = 2;
131
audio_buffers = 4096;
132
133
134
135
136
137
138
/* Check command line usage */
for ( i=1; argv[i] && (*argv[i] == '-'); ++i ) {
if ( (strcmp(argv[i], "-r") == 0) && argv[i+1] ) {
++i;
audio_rate = atoi(argv[i]);
} else
139
140
141
142
143
144
145
if ( strcmp(argv[i], "-m") == 0 ) {
audio_channels = 1;
} else
if ( (strcmp(argv[i], "-c") == 0) && argv[i+1] ) {
++i;
audio_channels = atoi(argv[i]);
} else
146
147
148
149
if ( (strcmp(argv[i], "-b") == 0) && argv[i+1] ) {
++i;
audio_buffers = atoi(argv[i]);
} else
150
151
152
153
if ( (strcmp(argv[i], "-v") == 0) && argv[i+1] ) {
++i;
audio_volume = atoi(argv[i]);
} else
154
155
156
if ( strcmp(argv[i], "-l") == 0 ) {
looping = -1;
} else
157
158
159
if ( strcmp(argv[i], "-i") == 0 ) {
interactive = 1;
} else
160
161
if ( strcmp(argv[i], "-8") == 0 ) {
audio_format = AUDIO_U8;
162
163
164
} else
if ( strcmp(argv[i], "-rwops") == 0 ) {
rwops = 1;
165
166
} else {
Usage(argv[0]);
167
return(1);
168
169
170
171
}
}
if ( ! argv[i] ) {
Usage(argv[0]);
172
return(1);
173
174
175
176
177
}
/* Initialize the SDL library */
if ( SDL_Init(SDL_INIT_AUDIO) < 0 ) {
fprintf(stderr, "Couldn't initialize SDL: %s\n",SDL_GetError());
178
return(255);
179
}
180
181
#ifdef HAVE_SIGNAL_H
182
signal(SIGINT, IntHandler);
183
signal(SIGTERM, CleanUp);
184
#endif
185
186
/* Open the audio device */
187
if (Mix_OpenAudio(audio_rate, audio_format, audio_channels, audio_buffers) < 0) {
188
fprintf(stderr, "Couldn't open audio: %s\n", SDL_GetError());
189
return(2);
190
191
} else {
Mix_QuerySpec(&audio_rate, &audio_format, &audio_channels);
192
printf("Opened audio at %d Hz %d bit %s (%s), %d bytes audio buffer\n", audio_rate,
193
(audio_format&0xFF),
194
(audio_channels > 2) ? "surround" : (audio_channels > 1) ? "stereo" : "mono",
195
(audio_format&0x1000) ? "BE" : "LE",
196
audio_buffers );
197
198
199
}
audio_open = 1;
200
201
202
/* Set the music volume */
Mix_VolumeMusic(audio_volume);
203
/* Set the external music player, if any */
204
Mix_SetMusicCMD(SDL_getenv("MUSIC_CMD"));
205
206
207
208
209
while (argv[i]) {
next_track = 0;
/* Load the requested music file */
210
211
if ( rwops ) {
rwfp = SDL_RWFromFile(argv[i], "rb");
212
music = Mix_LoadMUS_RW(rwfp);
213
214
215
} else {
music = Mix_LoadMUS(argv[i]);
}
216
217
218
if ( music == NULL ) {
fprintf(stderr, "Couldn't load %s: %s\n",
argv[i], SDL_GetError());
219
CleanUp(2);
220
221
222
223
224
}
/* Play and then exit */
printf("Playing %s\n", argv[i]);
Mix_FadeInMusic(music,looping,2000);
225
while ( !next_track && (Mix_PlayingMusic() || Mix_PausedMusic()) ) {
226
227
228
229
230
231
if(interactive)
Menu();
else
SDL_Delay(100);
}
Mix_FreeMusic(music);
232
if ( rwops ) {
233
SDL_RWclose(rwfp);
234
}
235
music = NULL;
236
237
238
239
240
241
/* If the user presses Ctrl-C more than once, exit. */
SDL_Delay(500);
if ( next_track > 1 ) break;
i++;
242
}
243
244
245
246
CleanUp(0);
/* Not reached, but fixes compiler warnings */
return 0;
247
}