void MainManager::initSDLmixer() { log_.i("Initializing SDL_mixer"); int mixFlags = MIX_INIT_FLAC; int mixFlagsInit = Mix_Init(mixFlags); if ((mixFlagsInit & mixFlags) != mixFlags) throw log_.exception("Failed to initialize SDL_mixer", Mix_GetError); if( Mix_OpenAudio( 22050, MIX_DEFAULT_FORMAT, 2, 1024 ) == -1 ) throw log_.exception("Failed to aquire sound device", Mix_GetError); atexit(Mix_CloseAudio); atexit(Mix_Quit); // Write version information to log SDL_version compiled; SDL_MIXER_VERSION(&compiled); logSDLVersion("SDL_mixer", compiled, *Mix_Linked_Version()); // Write music decoder information to log const int nMusicDecoders = Mix_GetNumMusicDecoders(); std::stringstream ss; if (nMusicDecoders > 0) ss << Mix_GetMusicDecoder(0); for (int i = 1 ; i < nMusicDecoders ; ++i) { ss << ", " << Mix_GetMusicDecoder(i) << Log::end; } log_.d() << "Music decoders (" << nMusicDecoders << "): " << ss.str() << Log::end; // Write audio decoder information to log const int nChunkDecoders = Mix_GetNumChunkDecoders(); ss.str(std::string("")); if (nChunkDecoders > 0) ss << Mix_GetChunkDecoder(0); for (int i = 1 ; i < nChunkDecoders ; ++i) { ss << ", " << Mix_GetChunkDecoder(i) << Log::end; } log_.d() << "Audio decoders (" << nChunkDecoders << "): " << ss.str() << Log::end; (void)Mix_VolumeMusic(MIX_MAX_VOLUME); (void)Mix_Volume(-1, MIX_MAX_VOLUME); // (void)Mix_VolumeMusic(MIX_MAX_VOLUME); log_.d() << "Music Volume level: " << 100.0f * (float)Mix_VolumeMusic(-1) / MIX_MAX_VOLUME << "%" << Log::end; // TODO swarminglogic, 2014-02-08: Move to audio configuration setting. // Setting 64 channels to be played simulatenously Mix_AllocateChannels(64); }
static void report_decoders(void) { int i, total; printf("Supported decoders...\n"); total = Mix_GetNumChunkDecoders(); for (i = 0; i < total; i++) { fprintf(stderr, " - chunk decoder: %s\n", Mix_GetChunkDecoder(i)); } total = Mix_GetNumMusicDecoders(); for (i = 0; i < total; i++) { fprintf(stderr, " - music decoder: %s\n", Mix_GetMusicDecoder(i)); } }
Mixer::Mixer(): theBgMusic(nullptr) { int i,max=Mix_GetNumMusicDecoders(); for(i=0; i<max; ++i) LOG_DEBUG() << "Music decoder" << i << "is for" << Mix_GetMusicDecoder(i); if (MIX_INIT_OGG != Mix_Init(MIX_INIT_OGG)) { LOG_WARNING() << "Mixer Init failed:" << Mix_GetError(); return; } // CD Quality, 2 channels (stereo) if (0 != Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 4096*4)) { LOG_WARNING() << "Error opening mixer audio:" << Mix_GetError(); } }
void logSDLMixerMediaInfo(std::ostream& out) { // Write music decoder information const int nMusicDecoders = Mix_GetNumMusicDecoders(); out << "Music decoders (" << nMusicDecoders << "): "; if (nMusicDecoders > 0) out << Mix_GetMusicDecoder(0); for (int i = 1 ; i < nMusicDecoders ; ++i) out << ", " << Mix_GetMusicDecoder(i); out << std::endl; // Write audio decoder information const int nChunkDecoders = Mix_GetNumChunkDecoders(); out << "Audio decoders (" << nChunkDecoders << "): "; if (nChunkDecoders > 0) out << Mix_GetChunkDecoder(0); for (int i = 1 ; i < nChunkDecoders ; ++i) { out << ", " << Mix_GetChunkDecoder(i); } out << std::endl; }
int main(int argc, char **argv) { int audio_rate,audio_channels; Uint16 audio_format; Uint32 t; Mix_Music *music; int volume=SDL_MIX_MAXVOLUME; /* initialize SDL for audio and video */ if(SDL_Init(SDL_INIT_AUDIO|SDL_INIT_VIDEO)<0) cleanExit("SDL_Init"); atexit(SDL_Quit); int initted=Mix_Init(0); printf("Before Mix_Init SDL_mixer supported: "); print_init_flags(initted); initted=Mix_Init(~0); printf("After Mix_Init SDL_mixer supported: "); print_init_flags(initted); Mix_Quit(); if(argc<2 || argc>4) { fprintf(stderr,"Usage: %s filename [depth] [any 3rd argument...]\n" " filename is any music file supported by your SDL_mixer library\n" " depth is screen depth, default is 8bits\n" " if there is a third argument given, we go fullscreen for maximum fun!\n", *argv); return 1; } /* open a screen for the wav output */ if(!(s=SDL_SetVideoMode(W,H,(argc>2?atoi(argv[2]):8),(argc>3?SDL_FULLSCREEN:0)|SDL_HWSURFACE|SDL_DOUBLEBUF))) cleanExit("SDL_SetVideoMode"); SDL_WM_SetCaption("sdlwav - SDL_mixer demo","sdlwav"); /* hide the annoying mouse pointer */ SDL_ShowCursor(SDL_DISABLE); /* get the colors we use */ white=SDL_MapRGB(s->format,0xff,0xff,0xff); black=SDL_MapRGB(s->format,0,0,0); /* initialize sdl mixer, open up the audio device */ if(Mix_OpenAudio(44100,MIX_DEFAULT_FORMAT,2,BUFFER)<0) cleanExit("Mix_OpenAudio"); /* we play no samples, so deallocate the default 8 channels... */ Mix_AllocateChannels(0); /* print out some info on the formats this run of SDL_mixer supports */ { int i,n=Mix_GetNumChunkDecoders(); printf("There are %d available chunk(sample) decoders:\n",n); for(i=0; i<n; ++i) printf(" %s\n", Mix_GetChunkDecoder(i)); n = Mix_GetNumMusicDecoders(); printf("There are %d available music decoders:\n",n); for(i=0; i<n; ++i) printf(" %s\n", Mix_GetMusicDecoder(i)); } /* print out some info on the audio device and stream */ Mix_QuerySpec(&audio_rate, &audio_format, &audio_channels); bits=audio_format&0xFF; sample_size=bits/8+audio_channels; rate=audio_rate; printf("Opened audio at %d Hz %d bit %s, %d bytes audio buffer\n", audio_rate, bits, audio_channels>1?"stereo":"mono", BUFFER ); /* calculate some parameters for the wav display */ dy=s->h/2.0/(float)(0x1<<bits); /* load the song */ if(!(music=Mix_LoadMUS(argv[1]))) cleanExit("Mix_LoadMUS(\"%s\")",argv[1]); { Mix_MusicType type=Mix_GetMusicType(music); printf("Music type: %s\n", type==MUS_NONE?"MUS_NONE": type==MUS_CMD?"MUS_CMD": type==MUS_WAV?"MUS_WAV": /*type==MUS_MOD_MODPLUG?"MUS_MOD_MODPLUG":*/ type==MUS_MOD?"MUS_MOD": type==MUS_MID?"MUS_MID": type==MUS_OGG?"MUS_OGG": type==MUS_MP3?"MUS_MP3": type==MUS_MP3_MAD?"MUS_MP3_MAD": type==MUS_FLAC?"MUS_FLAC": "Unknown"); } /* set the post mix processor up */ Mix_SetPostMix(postmix,argv[1]); SDL_FillRect(s,NULL,black); SDL_Flip(s); SDL_FillRect(s,NULL,black); SDL_Flip(s); /* start playing and displaying the wav */ /* wait for escape key of the quit event to finish */ t=SDL_GetTicks(); if(Mix_PlayMusic(music, 1)==-1) cleanExit("Mix_PlayMusic(0x%p,1)",music); Mix_VolumeMusic(volume); while((Mix_PlayingMusic() || Mix_PausedMusic()) && !done) { SDL_Event e; while(SDL_PollEvent(&e)) { switch(e.type) { case SDL_KEYDOWN: switch(e.key.keysym.sym) { case SDLK_ESCAPE: done=1; break; case SDLK_LEFT: if(e.key.keysym.mod&KMOD_SHIFT) { Mix_RewindMusic(); position=0; } else { int pos=position/audio_rate-1; if(pos<0) pos=0; Mix_SetMusicPosition(pos); position=pos*audio_rate; } break; case SDLK_RIGHT: switch(Mix_GetMusicType(NULL)) { case MUS_MP3: Mix_SetMusicPosition(+5); position+=5*audio_rate; break; case MUS_OGG: case MUS_FLAC: case MUS_MP3_MAD: /*case MUS_MOD_MODPLUG:*/ Mix_SetMusicPosition(position/audio_rate+1); position+=audio_rate; break; default: printf("cannot fast-forward this type of music\n"); break; } break; case SDLK_UP: volume=(volume+1)<<1; if(volume>SDL_MIX_MAXVOLUME) volume=SDL_MIX_MAXVOLUME; Mix_VolumeMusic(volume); break; case SDLK_DOWN: volume>>=1; Mix_VolumeMusic(volume); break; case SDLK_SPACE: if(Mix_PausedMusic()) Mix_ResumeMusic(); else Mix_PauseMusic(); break; default: break; } break; case SDL_QUIT: done=1; break; default: break; } } /* the postmix processor tells us when there's new data to draw */ if(need_refresh) refresh(); SDL_Delay(0); } t=SDL_GetTicks()-t; /* free & close */ Mix_FreeMusic(music); Mix_CloseAudio(); SDL_Quit(); /* show a silly statistic */ printf("fps=%.2f\n",((float)flips)/(t/1000.0)); return(0); }
static mrb_value mrb_sdl2_mixer_GetNumMusicDecoders(mrb_state *mrb, mrb_value self) { return mrb_fixnum_value(Mix_GetNumMusicDecoders()); }