/
playmus.c
242 lines (209 loc) · 6.18 KB
1
/*
2
PLAYMUS: A test application for the SDL mixer library.
3
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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
/* Quiet windows compiler warnings */
23
#define _CRT_SECURE_NO_WARNINGS
24
25
/* $Id$ */
26
27
28
29
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
30
31
#ifdef unix
32
33
34
#include <unistd.h>
#endif
35
#include "SDL.h"
36
#include "SDL_mixer.h"
37
38
39
40
41
#ifdef HAVE_SIGNAL_H
#include <signal.h>
#endif
42
43
44
static int audio_open = 0;
static Mix_Music *music = NULL;
45
static int next_track = 0;
46
47
void CleanUp(int exitcode)
48
{
49
if(Mix_PlayingMusic()) {
50
51
52
Mix_FadeOutMusic(1500);
SDL_Delay(1500);
}
53
if (music) {
54
55
56
Mix_FreeMusic(music);
music = NULL;
}
57
if (audio_open) {
58
59
60
61
62
Mix_CloseAudio();
audio_open = 0;
}
SDL_Quit();
exit(exitcode);
63
64
65
66
}
void Usage(char *argv0)
{
67
SDL_Log("Usage: %s [-i] [-l] [-8] [-f32] [-r rate] [-c channels] [-b buffers] [-v N] [-rwops] <musicfile>\n", argv0);
68
}
69
70
71
void Menu(void)
{
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
char buf[10];
printf("Available commands: (p)ause (r)esume (h)alt volume(v#) > ");
fflush(stdin);
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;
}
}
printf("Music playing: %s Paused: %s\n", Mix_PlayingMusic() ? "yes" : "no",
Mix_PausedMusic() ? "yes" : "no");
94
95
}
96
97
#ifdef HAVE_SIGNAL_H
98
99
void IntHandler(int sig)
{
100
101
102
103
104
switch (sig) {
case SIGINT:
next_track++;
break;
}
105
106
}
107
108
#endif
109
int main(int argc, char *argv[])
110
{
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
int audio_rate;
Uint16 audio_format;
int audio_channels;
int audio_buffers;
int audio_volume = MIX_MAX_VOLUME;
int looping = 0;
int interactive = 0;
int rwops = 0;
int i;
/* Initialize variables */
audio_rate = 22050;
audio_format = AUDIO_S16;
audio_channels = 2;
audio_buffers = 4096;
/* Check command line usage */
128
129
for (i=1; argv[i] && (*argv[i] == '-'); ++i) {
if ((strcmp(argv[i], "-r") == 0) && argv[i+1]) {
130
131
132
++i;
audio_rate = atoi(argv[i]);
} else
133
if (strcmp(argv[i], "-m") == 0) {
134
135
audio_channels = 1;
} else
136
if ((strcmp(argv[i], "-c") == 0) && argv[i+1]) {
137
138
139
++i;
audio_channels = atoi(argv[i]);
} else
140
if ((strcmp(argv[i], "-b") == 0) && argv[i+1]) {
141
142
143
++i;
audio_buffers = atoi(argv[i]);
} else
144
if ((strcmp(argv[i], "-v") == 0) && argv[i+1]) {
145
146
147
++i;
audio_volume = atoi(argv[i]);
} else
148
if (strcmp(argv[i], "-l") == 0) {
149
150
looping = -1;
} else
151
if (strcmp(argv[i], "-i") == 0) {
152
153
interactive = 1;
} else
154
if (strcmp(argv[i], "-8") == 0) {
155
156
audio_format = AUDIO_U8;
} else
157
158
159
if (strcmp(argv[i], "-f32") == 0) {
audio_format = AUDIO_F32;
} else
160
if (strcmp(argv[i], "-rwops") == 0) {
161
162
163
164
165
166
rwops = 1;
} else {
Usage(argv[0]);
return(1);
}
}
167
if (! argv[i]) {
168
169
170
171
172
Usage(argv[0]);
return(1);
}
/* Initialize the SDL library */
173
174
if (SDL_Init(SDL_INIT_AUDIO) < 0) {
SDL_Log("Couldn't initialize SDL: %s\n",SDL_GetError());
175
176
return(255);
}
177
178
#ifdef HAVE_SIGNAL_H
179
180
signal(SIGINT, IntHandler);
signal(SIGTERM, CleanUp);
181
#endif
182
183
184
/* Open the audio device */
if (Mix_OpenAudio(audio_rate, audio_format, audio_channels, audio_buffers) < 0) {
185
SDL_Log("Couldn't open audio: %s\n", SDL_GetError());
186
187
188
return(2);
} else {
Mix_QuerySpec(&audio_rate, &audio_format, &audio_channels);
189
SDL_Log("Opened audio at %d Hz %d bit%s %s %d bytes audio buffer\n", audio_rate,
190
(audio_format&0xFF),
191
(SDL_AUDIO_ISFLOAT(audio_format) ? " (float)" : ""),
192
(audio_channels > 2) ? "surround" : (audio_channels > 1) ? "stereo" : "mono",
193
audio_buffers);
194
195
196
197
198
199
200
201
202
203
204
205
206
}
audio_open = 1;
/* Set the music volume */
Mix_VolumeMusic(audio_volume);
/* Set the external music player, if any */
Mix_SetMusicCMD(SDL_getenv("MUSIC_CMD"));
while (argv[i]) {
next_track = 0;
/* Load the requested music file */
207
if (rwops) {
208
music = Mix_LoadMUS_RW(SDL_RWFromFile(argv[i], "rb"), SDL_TRUE);
209
210
211
} else {
music = Mix_LoadMUS(argv[i]);
}
212
213
if (music == NULL) {
SDL_Log("Couldn't load %s: %s\n",
214
215
216
217
218
argv[i], SDL_GetError());
CleanUp(2);
}
/* Play and then exit */
219
SDL_Log("Playing %s\n", argv[i]);
220
Mix_FadeInMusic(music,looping,2000);
221
while (!next_track && (Mix_PlayingMusic() || Mix_PausedMusic())) {
222
223
224
225
226
227
228
229
230
231
if(interactive)
Menu();
else
SDL_Delay(100);
}
Mix_FreeMusic(music);
music = NULL;
/* If the user presses Ctrl-C more than once, exit. */
SDL_Delay(500);
232
if (next_track > 1) break;
233
234
235
236
237
238
239
i++;
}
CleanUp(0);
/* Not reached, but fixes compiler warnings */
return 0;
240
}
241
242
/* vi: set ts=4 sw=4 expandtab: */