/
playmus.c
239 lines (208 loc) · 5.26 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
68
69
70
void Menu(void)
{
char buf[10];
71
printf("Available commands: (p)ause (r)esume (h)alt volume(v#) > ");
72
fflush(stdin);
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
if (scanf("%s",buf) == 1) {
switch(buf[0]){
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;
}
88
89
90
91
92
}
printf("Music playing: %s Paused: %s\n", Mix_PlayingMusic() ? "yes" : "no",
Mix_PausedMusic() ? "yes" : "no");
}
93
94
#ifdef HAVE_SIGNAL_H
95
96
97
98
99
100
101
102
103
void IntHandler(int sig)
{
switch (sig) {
case SIGINT:
next_track++;
break;
}
}
104
105
#endif
106
int main(int argc, char *argv[])
107
{
108
SDL_RWops *rwfp = NULL;
109
int audio_rate;
110
111
Uint16 audio_format;
int audio_channels;
112
int audio_buffers;
113
int audio_volume = MIX_MAX_VOLUME;
114
int looping = 0;
115
int interactive = 0;
116
int rwops = 0;
117
118
119
120
121
122
int i;
/* Initialize variables */
audio_rate = 22050;
audio_format = AUDIO_S16;
audio_channels = 2;
123
audio_buffers = 4096;
124
125
126
127
128
129
130
/* 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
131
132
133
134
135
136
137
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
138
139
140
141
if ( (strcmp(argv[i], "-b") == 0) && argv[i+1] ) {
++i;
audio_buffers = atoi(argv[i]);
} else
142
143
144
145
if ( (strcmp(argv[i], "-v") == 0) && argv[i+1] ) {
++i;
audio_volume = atoi(argv[i]);
} else
146
147
148
if ( strcmp(argv[i], "-l") == 0 ) {
looping = -1;
} else
149
150
151
if ( strcmp(argv[i], "-i") == 0 ) {
interactive = 1;
} else
152
153
if ( strcmp(argv[i], "-8") == 0 ) {
audio_format = AUDIO_U8;
154
155
156
} else
if ( strcmp(argv[i], "-rwops") == 0 ) {
rwops = 1;
157
158
} else {
Usage(argv[0]);
159
return(1);
160
161
162
163
}
}
if ( ! argv[i] ) {
Usage(argv[0]);
164
return(1);
165
166
167
168
169
}
/* Initialize the SDL library */
if ( SDL_Init(SDL_INIT_AUDIO) < 0 ) {
fprintf(stderr, "Couldn't initialize SDL: %s\n",SDL_GetError());
170
return(255);
171
}
172
173
#ifdef HAVE_SIGNAL_H
174
signal(SIGINT, IntHandler);
175
signal(SIGTERM, CleanUp);
176
#endif
177
178
/* Open the audio device */
179
if (Mix_OpenAudio(audio_rate, audio_format, audio_channels, audio_buffers) < 0) {
180
fprintf(stderr, "Couldn't open audio: %s\n", SDL_GetError());
181
return(2);
182
183
} else {
Mix_QuerySpec(&audio_rate, &audio_format, &audio_channels);
184
printf("Opened audio at %d Hz %d bit %s (%s), %d bytes audio buffer\n", audio_rate,
185
(audio_format&0xFF),
186
(audio_channels > 2) ? "surround" : (audio_channels > 1) ? "stereo" : "mono",
187
(audio_format&0x1000) ? "BE" : "LE",
188
audio_buffers );
189
190
191
}
audio_open = 1;
192
193
194
/* Set the music volume */
Mix_VolumeMusic(audio_volume);
195
/* Set the external music player, if any */
196
Mix_SetMusicCMD(SDL_getenv("MUSIC_CMD"));
197
198
199
200
201
while (argv[i]) {
next_track = 0;
/* Load the requested music file */
202
203
if ( rwops ) {
rwfp = SDL_RWFromFile(argv[i], "rb");
204
music = Mix_LoadMUS_RW(rwfp);
205
206
207
} else {
music = Mix_LoadMUS(argv[i]);
}
208
209
210
if ( music == NULL ) {
fprintf(stderr, "Couldn't load %s: %s\n",
argv[i], SDL_GetError());
211
CleanUp(2);
212
213
214
215
216
}
/* Play and then exit */
printf("Playing %s\n", argv[i]);
Mix_FadeInMusic(music,looping,2000);
217
while ( !next_track && (Mix_PlayingMusic() || Mix_PausedMusic()) ) {
218
219
220
221
222
223
if(interactive)
Menu();
else
SDL_Delay(100);
}
Mix_FreeMusic(music);
224
if ( rwops ) {
225
SDL_RWclose(rwfp);
226
}
227
music = NULL;
228
229
230
231
232
233
/* If the user presses Ctrl-C more than once, exit. */
SDL_Delay(500);
if ( next_track > 1 ) break;
i++;
234
}
235
236
237
238
CleanUp(0);
/* Not reached, but fixes compiler warnings */
return 0;
239
}