1
0
Fork 0
forked from len0rd/rockbox
foxbox/apps/plugins/sdl/progs/quake/cd_rockbox.c
Franklin Wei 54b3b6f797 quake: migrate to SDL_mixer and add background music
Kind of skippy and only supports WAV. MP3 would be nice, especially if
using Rockbox's codec.

Change-Id: I0bba195603da32da1e4d1dcf2ee821fa5696824a
2024-10-27 10:23:57 -04:00

123 lines
2.4 KiB
C

/*
Copyright (C) 1996-1997 Id Software, Inc.
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/* Background music for Rockbox. Uses SDL_mixer and plays from
* /.rockbox/quake/%02d.wav */
#include "quakedef.h"
#include "SDL_mixer.h"
#define MUSIC_DIR ROCKBOX_DIR "/quake"
#if 1
static Mix_Music *mus = NULL;
#else
static int musfile = -1;
static int musfile_len, musfile_pos;
#define MP3_CHUNK 1024*512
static char mp3buf[MP3_CHUNK];
static void get_mp3(const void **start, size_t *size)
{
if(musfile >= 0)
{
int len = MIN(musfile_len - musfile_pos, MP3_CHUNK);
Sys_FileRead(musfile, mp3buf, len);
*start = mp3buf;
*size = len;
musfile_pos += len;
}
}
#endif
void CDAudio_Play(byte track, qboolean looping)
{
char path[MAX_PATH];
snprintf(path, sizeof(path), "%s/%02d.wav", MUSIC_DIR, track - 1);
rb->splashf(HZ, "playing %s", path);
#if 1
mus = Mix_LoadMUS(path);
if(!mus)
{
rb->splashf(HZ, "Failed: %s", Mix_GetError());
return;
}
Mix_PlayMusic(mus, looping ? -1 : 0);
#else
musfile_len = Sys_FileOpenRead(path, &musfile);
musfile_pos = 0;
rb->mp3_play_data(NULL, 0, get_mp3);
#endif
}
void CDAudio_Stop(void)
{
if ( (Mix_PlayingMusic()) || (Mix_PausedMusic()) )
Mix_HaltMusic();
}
void CDAudio_Pause(void)
{
Mix_PauseMusic();
}
void CDAudio_Resume(void)
{
Mix_ResumeMusic();
}
void CDAudio_Update(void)
{
//Mix_VolumeMusic(bgmvolume.value * SDL_MIX_MAXVOLUME);
}
int CDAudio_Init(void)
{
rb->splashf(HZ, "CD Init");
if(Mix_OpenAudio(MIX_DEFAULT_FREQUENCY, MIX_DEFAULT_FORMAT, 2, 1024)==-1) {
rb->splashf(HZ, "Mix_OpenAudio: %s\n", Mix_GetError());
return -1;
}
return 0;
}
void CDAudio_Shutdown(void)
{
if(mus)
Mix_FreeMusic(mus);
CDAudio_Stop();
}