playmus.c
上传用户:nini_0081
上传日期:2022-07-21
资源大小:2628k
文件大小:5k
源码类别:

多媒体编程

开发平台:

DOS

  1. /*
  2.     PLAYMUS:  A test application for the SDL mixer library.
  3.     Copyright (C) 1997-2009 Sam Lantinga
  4.     This library is free software; you can redistribute it and/or
  5.     modify it under the terms of the GNU Library General Public
  6.     License as published by the Free Software Foundation; either
  7.     version 2 of the License, or (at your option) any later version.
  8.     This library is distributed in the hope that it will be useful,
  9.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11.     Library General Public License for more details.
  12.     You should have received a copy of the GNU Library General Public
  13.     License along with this library; if not, write to the Free
  14.     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  15.     Sam Lantinga
  16.     slouken@libsdl.org
  17. */
  18. /* $Id: playmus.c 4211 2008-12-08 00:27:32Z slouken $ */
  19. #include <stdlib.h>
  20. #include <stdio.h>
  21. #include <string.h>
  22. #include <signal.h>
  23. #ifdef unix
  24. #include <unistd.h>
  25. #endif
  26. #include "SDL.h"
  27. #include "SDL_mixer.h"
  28. static int audio_open = 0;
  29. static Mix_Music *music = NULL;
  30. static int next_track = 0;
  31. void CleanUp(int exitcode)
  32. {
  33. if( Mix_PlayingMusic() ) {
  34. Mix_FadeOutMusic(1500);
  35. SDL_Delay(1500);
  36. }
  37. if ( music ) {
  38. Mix_FreeMusic(music);
  39. music = NULL;
  40. }
  41. if ( audio_open ) {
  42. Mix_CloseAudio();
  43. audio_open = 0;
  44. }
  45. SDL_Quit();
  46. exit(exitcode);
  47. }
  48. void Usage(char *argv0)
  49. {
  50. fprintf(stderr, "Usage: %s [-i] [-l] [-8] [-r rate] [-c channels] [-b buffers] [-v N] [-rwops] <musicfile>n", argv0);
  51. }
  52. void Menu(void)
  53. {
  54. char buf[10];
  55. printf("Available commands: (p)ause (r)esume (h)alt volume(v#) > ");
  56. fflush(stdin);
  57. scanf("%s",buf);
  58. switch(buf[0]){
  59. case 'p': case 'P':
  60. Mix_PauseMusic();
  61. break;
  62. case 'r': case 'R':
  63. Mix_ResumeMusic();
  64. break;
  65. case 'h': case 'H':
  66. Mix_HaltMusic();
  67. break;
  68. case 'v': case 'V':
  69. Mix_VolumeMusic(atoi(buf+1));
  70. break;
  71. }
  72. printf("Music playing: %s Paused: %sn", Mix_PlayingMusic() ? "yes" : "no", 
  73.    Mix_PausedMusic() ? "yes" : "no");
  74. }
  75. void IntHandler(int sig)
  76. {
  77. switch (sig) {
  78.         case SIGINT:
  79. next_track++;
  80. break;
  81. }
  82. }
  83. int main(int argc, char *argv[])
  84. {
  85. SDL_RWops *rwfp;
  86. int audio_rate;
  87. Uint16 audio_format;
  88. int audio_channels;
  89. int audio_buffers;
  90. int audio_volume = MIX_MAX_VOLUME;
  91. int looping = 0;
  92. int interactive = 0;
  93. int rwops = 0;
  94. int i;
  95. /* Initialize variables */
  96. audio_rate = 22050;
  97. audio_format = AUDIO_S16;
  98. audio_channels = 2;
  99. audio_buffers = 4096;
  100. /* Check command line usage */
  101. for ( i=1; argv[i] && (*argv[i] == '-'); ++i ) {
  102. if ( (strcmp(argv[i], "-r") == 0) && argv[i+1] ) {
  103. ++i;
  104. audio_rate = atoi(argv[i]);
  105. } else
  106. if ( strcmp(argv[i], "-m") == 0 ) {
  107. audio_channels = 1;
  108. } else
  109. if ( (strcmp(argv[i], "-c") == 0) && argv[i+1] ) {
  110. ++i;
  111. audio_channels = atoi(argv[i]);
  112. } else
  113. if ( (strcmp(argv[i], "-b") == 0) && argv[i+1] ) {
  114. ++i;
  115. audio_buffers = atoi(argv[i]);
  116. } else
  117. if ( (strcmp(argv[i], "-v") == 0) && argv[i+1] ) {
  118. ++i;
  119. audio_volume = atoi(argv[i]);
  120. } else
  121. if ( strcmp(argv[i], "-l") == 0 ) {
  122. looping = -1;
  123. } else
  124. if ( strcmp(argv[i], "-i") == 0 ) {
  125. interactive = 1;
  126. } else
  127. if ( strcmp(argv[i], "-8") == 0 ) {
  128. audio_format = AUDIO_U8;
  129. } else
  130. if ( strcmp(argv[i], "-rwops") == 0 ) {
  131. rwops = 1;
  132. } else {
  133. Usage(argv[0]);
  134. return(1);
  135. }
  136. }
  137. if ( ! argv[i] ) {
  138. Usage(argv[0]);
  139. return(1);
  140. }
  141. /* Initialize the SDL library */
  142. if ( SDL_Init(SDL_INIT_AUDIO) < 0 ) {
  143. fprintf(stderr, "Couldn't initialize SDL: %sn",SDL_GetError());
  144. return(255);
  145. }
  146. signal(SIGINT, IntHandler);
  147. signal(SIGTERM, CleanUp);
  148. /* Open the audio device */
  149. if (Mix_OpenAudio(audio_rate, audio_format, audio_channels, audio_buffers) < 0) {
  150. fprintf(stderr, "Couldn't open audio: %sn", SDL_GetError());
  151. return(2);
  152. } else {
  153. Mix_QuerySpec(&audio_rate, &audio_format, &audio_channels);
  154. printf("Opened audio at %d Hz %d bit %s (%s), %d bytes audio buffern", audio_rate,
  155. (audio_format&0xFF),
  156. (audio_channels > 2) ? "surround" : (audio_channels > 1) ? "stereo" : "mono", 
  157. (audio_format&0x1000) ? "BE" : "LE",
  158. audio_buffers );
  159. }
  160. audio_open = 1;
  161. /* Set the music volume */
  162. Mix_VolumeMusic(audio_volume);
  163. /* Set the external music player, if any */
  164. Mix_SetMusicCMD(getenv("MUSIC_CMD"));
  165. while (argv[i]) {
  166. next_track = 0;
  167. /* Load the requested music file */
  168. if ( rwops ) {
  169. rwfp = SDL_RWFromFile(argv[i], "rb");
  170. music = Mix_LoadMUS_RW(rwfp);
  171. } else {
  172. music = Mix_LoadMUS(argv[i]);
  173. }
  174. if ( music == NULL ) {
  175. fprintf(stderr, "Couldn't load %s: %sn",
  176. argv[i], SDL_GetError());
  177. CleanUp(2);
  178. }
  179. /* Play and then exit */
  180. printf("Playing %sn", argv[i]);
  181. Mix_FadeInMusic(music,looping,2000);
  182. while ( !next_track && (Mix_PlayingMusic() || Mix_PausedMusic()) ) {
  183. if(interactive)
  184. Menu();
  185. else
  186. SDL_Delay(100);
  187. }
  188. Mix_FreeMusic(music);
  189. if ( rwops ) {
  190. SDL_FreeRW(rwfp);
  191. }
  192. music = NULL;
  193. /* If the user presses Ctrl-C more than once, exit. */
  194. SDL_Delay(500);
  195. if ( next_track > 1 ) break;
  196. i++;
  197. }
  198. CleanUp(0);
  199. /* Not reached, but fixes compiler warnings */
  200. return 0;
  201. }