Skip to content

Latest commit

 

History

History
229 lines (201 loc) · 5.06 KB

playmus.c

File metadata and controls

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