Skip to content

Latest commit

 

History

History
239 lines (208 loc) · 5.26 KB

playmus.c

File metadata and controls

239 lines (208 loc) · 5.26 KB
 
Oct 21, 1999
Oct 21, 1999
1
/*
Dec 31, 2011
Dec 31, 2011
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.
Oct 21, 1999
Oct 21, 1999
20
21
*/
Dec 14, 2001
Dec 14, 2001
22
/* $Id$ */
Dec 14, 2001
Dec 14, 2001
23
Oct 21, 1999
Oct 21, 1999
24
25
26
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
Apr 14, 2010
Apr 14, 2010
27
Feb 11, 2000
Feb 11, 2000
28
#ifdef unix
Oct 21, 1999
Oct 21, 1999
29
30
31
#include <unistd.h>
#endif
Dec 21, 1999
Dec 21, 1999
32
#include "SDL.h"
Jan 14, 2000
Jan 14, 2000
33
#include "SDL_mixer.h"
Oct 21, 1999
Oct 21, 1999
34
Feb 17, 2011
Feb 17, 2011
35
36
37
38
#ifdef HAVE_SIGNAL_H
#include <signal.h>
#endif
Oct 21, 1999
Oct 21, 1999
39
40
41
static int audio_open = 0;
static Mix_Music *music = NULL;
Jan 2, 2001
Jan 2, 2001
42
static int next_track = 0;
Oct 21, 1999
Oct 21, 1999
43
May 14, 2006
May 14, 2006
44
void CleanUp(int exitcode)
Oct 21, 1999
Oct 21, 1999
45
{
Oct 23, 1999
Oct 23, 1999
46
47
48
49
if( Mix_PlayingMusic() ) {
Mix_FadeOutMusic(1500);
SDL_Delay(1500);
}
Oct 21, 1999
Oct 21, 1999
50
51
52
53
if ( music ) {
Mix_FreeMusic(music);
music = NULL;
}
Oct 30, 1999
Oct 30, 1999
54
55
56
57
if ( audio_open ) {
Mix_CloseAudio();
audio_open = 0;
}
Oct 21, 1999
Oct 21, 1999
58
SDL_Quit();
May 14, 2006
May 14, 2006
59
exit(exitcode);
Oct 21, 1999
Oct 21, 1999
60
61
62
63
}
void Usage(char *argv0)
{
Dec 21, 2004
Dec 21, 2004
64
fprintf(stderr, "Usage: %s [-i] [-l] [-8] [-r rate] [-c channels] [-b buffers] [-v N] [-rwops] <musicfile>\n", argv0);
Oct 21, 1999
Oct 21, 1999
65
}
Nov 1, 1999
Nov 1, 1999
66
67
68
69
70
void Menu(void)
{
char buf[10];
Aug 20, 2006
Aug 20, 2006
71
printf("Available commands: (p)ause (r)esume (h)alt volume(v#) > ");
Nov 1, 1999
Nov 1, 1999
72
fflush(stdin);
Apr 14, 2010
Apr 14, 2010
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;
}
Nov 1, 1999
Nov 1, 1999
88
89
90
91
92
}
printf("Music playing: %s Paused: %s\n", Mix_PlayingMusic() ? "yes" : "no",
Mix_PausedMusic() ? "yes" : "no");
}
Apr 14, 2010
Apr 14, 2010
93
94
#ifdef HAVE_SIGNAL_H
Jan 2, 2001
Jan 2, 2001
95
96
97
98
99
100
101
102
103
void IntHandler(int sig)
{
switch (sig) {
case SIGINT:
next_track++;
break;
}
}
Apr 14, 2010
Apr 14, 2010
104
105
#endif
Dec 18, 2001
Dec 18, 2001
106
int main(int argc, char *argv[])
Oct 21, 1999
Oct 21, 1999
107
{
Apr 14, 2010
Apr 14, 2010
108
SDL_RWops *rwfp = NULL;
Feb 11, 2000
Feb 11, 2000
109
int audio_rate;
Oct 21, 1999
Oct 21, 1999
110
111
Uint16 audio_format;
int audio_channels;
Dec 11, 1999
Dec 11, 1999
112
int audio_buffers;
Feb 12, 2003
Feb 12, 2003
113
int audio_volume = MIX_MAX_VOLUME;
Oct 30, 1999
Oct 30, 1999
114
int looping = 0;
Nov 1, 1999
Nov 1, 1999
115
int interactive = 0;
Dec 21, 2004
Dec 21, 2004
116
int rwops = 0;
Oct 21, 1999
Oct 21, 1999
117
118
119
120
121
122
int i;
/* Initialize variables */
audio_rate = 22050;
audio_format = AUDIO_S16;
audio_channels = 2;
Dec 11, 1999
Dec 11, 1999
123
audio_buffers = 4096;
Oct 21, 1999
Oct 21, 1999
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
Aug 21, 2004
Aug 21, 2004
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
Dec 11, 1999
Dec 11, 1999
138
139
140
141
if ( (strcmp(argv[i], "-b") == 0) && argv[i+1] ) {
++i;
audio_buffers = atoi(argv[i]);
} else
Feb 12, 2003
Feb 12, 2003
142
143
144
145
if ( (strcmp(argv[i], "-v") == 0) && argv[i+1] ) {
++i;
audio_volume = atoi(argv[i]);
} else
Oct 30, 1999
Oct 30, 1999
146
147
148
if ( strcmp(argv[i], "-l") == 0 ) {
looping = -1;
} else
Nov 1, 1999
Nov 1, 1999
149
150
151
if ( strcmp(argv[i], "-i") == 0 ) {
interactive = 1;
} else
Oct 21, 1999
Oct 21, 1999
152
153
if ( strcmp(argv[i], "-8") == 0 ) {
audio_format = AUDIO_U8;
Dec 21, 2004
Dec 21, 2004
154
155
156
} else
if ( strcmp(argv[i], "-rwops") == 0 ) {
rwops = 1;
Oct 21, 1999
Oct 21, 1999
157
158
} else {
Usage(argv[0]);
Apr 5, 2001
Apr 5, 2001
159
return(1);
Oct 21, 1999
Oct 21, 1999
160
161
162
163
}
}
if ( ! argv[i] ) {
Usage(argv[0]);
Apr 5, 2001
Apr 5, 2001
164
return(1);
Oct 21, 1999
Oct 21, 1999
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());
Apr 5, 2001
Apr 5, 2001
170
return(255);
Oct 21, 1999
Oct 21, 1999
171
}
Aug 21, 2004
Aug 21, 2004
172
Apr 14, 2010
Apr 14, 2010
173
#ifdef HAVE_SIGNAL_H
Jan 2, 2001
Jan 2, 2001
174
signal(SIGINT, IntHandler);
May 14, 2006
May 14, 2006
175
signal(SIGTERM, CleanUp);
Apr 14, 2010
Apr 14, 2010
176
#endif
Oct 21, 1999
Oct 21, 1999
177
178
/* Open the audio device */
Dec 11, 1999
Dec 11, 1999
179
if (Mix_OpenAudio(audio_rate, audio_format, audio_channels, audio_buffers) < 0) {
Oct 21, 1999
Oct 21, 1999
180
fprintf(stderr, "Couldn't open audio: %s\n", SDL_GetError());
Apr 5, 2001
Apr 5, 2001
181
return(2);
Oct 21, 1999
Oct 21, 1999
182
183
} else {
Mix_QuerySpec(&audio_rate, &audio_format, &audio_channels);
May 1, 2006
May 1, 2006
184
printf("Opened audio at %d Hz %d bit %s (%s), %d bytes audio buffer\n", audio_rate,
Oct 21, 1999
Oct 21, 1999
185
(audio_format&0xFF),
Aug 21, 2004
Aug 21, 2004
186
(audio_channels > 2) ? "surround" : (audio_channels > 1) ? "stereo" : "mono",
May 1, 2006
May 1, 2006
187
(audio_format&0x1000) ? "BE" : "LE",
Dec 11, 1999
Dec 11, 1999
188
audio_buffers );
Oct 21, 1999
Oct 21, 1999
189
190
191
}
audio_open = 1;
Feb 12, 2003
Feb 12, 2003
192
193
194
/* Set the music volume */
Mix_VolumeMusic(audio_volume);
Oct 21, 1999
Oct 21, 1999
195
/* Set the external music player, if any */
Apr 14, 2010
Apr 14, 2010
196
Mix_SetMusicCMD(SDL_getenv("MUSIC_CMD"));
Oct 21, 1999
Oct 21, 1999
197
Jan 2, 2001
Jan 2, 2001
198
199
200
201
while (argv[i]) {
next_track = 0;
/* Load the requested music file */
Dec 21, 2004
Dec 21, 2004
202
203
if ( rwops ) {
rwfp = SDL_RWFromFile(argv[i], "rb");
Dec 27, 2004
Dec 27, 2004
204
music = Mix_LoadMUS_RW(rwfp);
Dec 21, 2004
Dec 21, 2004
205
206
207
} else {
music = Mix_LoadMUS(argv[i]);
}
Jan 2, 2001
Jan 2, 2001
208
209
210
if ( music == NULL ) {
fprintf(stderr, "Couldn't load %s: %s\n",
argv[i], SDL_GetError());
May 14, 2006
May 14, 2006
211
CleanUp(2);
Jan 2, 2001
Jan 2, 2001
212
213
214
215
216
}
/* Play and then exit */
printf("Playing %s\n", argv[i]);
Mix_FadeInMusic(music,looping,2000);
Dec 20, 2001
Dec 20, 2001
217
while ( !next_track && (Mix_PlayingMusic() || Mix_PausedMusic()) ) {
Jan 2, 2001
Jan 2, 2001
218
219
220
221
222
223
if(interactive)
Menu();
else
SDL_Delay(100);
}
Mix_FreeMusic(music);
Dec 21, 2004
Dec 21, 2004
224
if ( rwops ) {
Dec 31, 2011
Dec 31, 2011
225
SDL_RWclose(rwfp);
Dec 21, 2004
Dec 21, 2004
226
}
Dec 18, 2001
Dec 18, 2001
227
music = NULL;
Oct 21, 1999
Oct 21, 1999
228
Jan 2, 2001
Jan 2, 2001
229
230
231
232
233
/* If the user presses Ctrl-C more than once, exit. */
SDL_Delay(500);
if ( next_track > 1 ) break;
i++;
Oct 21, 1999
Oct 21, 1999
234
}
May 14, 2006
May 14, 2006
235
236
237
238
CleanUp(0);
/* Not reached, but fixes compiler warnings */
return 0;
Oct 21, 1999
Oct 21, 1999
239
}