Skip to content

Latest commit

 

History

History
239 lines (208 loc) · 5.18 KB

playmus.c

File metadata and controls

239 lines (208 loc) · 5.18 KB
 
Oct 21, 1999
Oct 21, 1999
1
2
/*
PLAYMUS: A test application for the SDL mixer library.
Dec 8, 2008
Dec 8, 2008
3
Copyright (C) 1997-2009 Sam Lantinga
Oct 21, 1999
Oct 21, 1999
4
Dec 14, 2001
Dec 14, 2001
5
6
7
8
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
Oct 21, 1999
Oct 21, 1999
9
Dec 14, 2001
Dec 14, 2001
10
This library is distributed in the hope that it will be useful,
Oct 21, 1999
Oct 21, 1999
11
but WITHOUT ANY WARRANTY; without even the implied warranty of
Dec 14, 2001
Dec 14, 2001
12
13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
Oct 21, 1999
Oct 21, 1999
14
Dec 14, 2001
Dec 14, 2001
15
16
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Oct 21, 1999
Oct 21, 1999
17
18
19
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Sam Lantinga
Dec 14, 2001
Dec 14, 2001
20
slouken@libsdl.org
Oct 21, 1999
Oct 21, 1999
21
22
*/
Dec 14, 2001
Dec 14, 2001
23
/* $Id$ */
Dec 14, 2001
Dec 14, 2001
24
Oct 21, 1999
Oct 21, 1999
25
26
27
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
Apr 14, 2010
Apr 14, 2010
28
29
#ifdef HAVE_SIGNAL_H
Oct 21, 1999
Oct 21, 1999
30
#include <signal.h>
Apr 14, 2010
Apr 14, 2010
31
#endif
Feb 11, 2000
Feb 11, 2000
32
#ifdef unix
Oct 21, 1999
Oct 21, 1999
33
34
35
#include <unistd.h>
#endif
Dec 21, 1999
Dec 21, 1999
36
#include "SDL.h"
Jan 14, 2000
Jan 14, 2000
37
#include "SDL_mixer.h"
Oct 21, 1999
Oct 21, 1999
38
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
225
226
if ( rwops ) {
SDL_FreeRW(rwfp);
}
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
}