⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i_cdmus.c

📁 The source code of Doom legacy for windows
💻 C
字号:
// Emacs style mode select   -*- C++ -*- //-----------------------------------------------------------------------------//// $Id: i_cdmus.c,v 1.2 2000/09/10 10:56:00 metzgermeister Exp $//// Copyright (C) 1998-2000 by DooM Legacy Team.//// 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.////// $Log: i_cdmus.c,v $// Revision 1.2  2000/09/10 10:56:00  metzgermeister// clean up & made it work again//// Revision 1.1  2000/08/21 21:17:32  metzgermeister// Initial import to CVS//// DESCRIPTION://      cd music interface////-----------------------------------------------------------------------------#include <stdlib.h>#include <SDL/SDL.h>#include "doomtype.h"#include "i_sound.h"#include "command.h"#include "m_argv.h"#define MAX_CD_TRACKS 256static boolean cdValid = false;static boolean playing = false;static boolean wasPlaying = false;static boolean initialized = false;static boolean enabled = false;static boolean playLooping = false;static byte    playTrack;static byte    maxTrack;static byte    cdRemap[MAX_CD_TRACKS];static int     cdvolume = -1;CV_PossibleValue_t cd_volume_cons_t[]={{0,"MIN"},{31,"MAX"},{0,NULL}};consvar_t cd_volume = {"cd_volume","31",CV_SAVE, cd_volume_cons_t};consvar_t cdUpdate  = {"cd_update","1",CV_SAVE};static SDL_CD *cdrom = NULL;static Uint32 lastchk = 0;static CDstatus cdStatus;/************************************************************************** * * function: CDAudio_GetAudioDiskInfo * * description: * set number of tracks if CD is available * **************************************************************************/static int CDAudio_GetAudioDiskInfo(void){    cdValid = false;    maxTrack = 0;        cdStatus = SDL_CDStatus(cdrom);    if(!CD_INDRIVE(cdStatus))    {	CONS_Printf("No CD in drive\n");	return -1;    }        if(cdStatus == CD_ERROR)    {	CONS_Printf("CD Error: %s\n", SDL_GetError());	return -1;    }        cdValid = true;    maxTrack = cdrom->numtracks;        return 0;}/************************************************************************** * * function: I_EjectCD * * description: * * **************************************************************************/static void I_EjectCD(void){    if (cdrom == NULL || !enabled)	return; // no cd init'd        I_StopCD();        if(SDL_CDEject(cdrom))    {	CONS_Printf("cdrom eject failed\n");    }    return;}/************************************************************************** * * function: Command_Cd_f * * description: * handles all CD commands from the console * **************************************************************************/static void Command_Cd_f (void){    char	*command;    int		ret;    int		n;    if (!initialized)	return;    if (COM_Argc() < 2) {	CONS_Printf ("cd [on] [off] [remap] [reset] [open]\n"		     "   [info] [play <track>] [resume]\n"		     "   [stop] [pause] [loop <track>]\n");	return;    }    command = COM_Argv (1);    if (!strncmp(command, "on", 2)) {	enabled = true;	return;    }    if (!strncmp(command, "off", 3)) {	I_StopCD();	enabled = false;	return;    }	    if (!strncmp(command, "remap", 5)) {	ret = COM_Argc() - 2;	if (ret <= 0) {	    for (n = 1; n < MAX_CD_TRACKS; n++)		if (cdRemap[n] != n)		    CONS_Printf("  %u -> %u\n", n, cdRemap[n]);	    return;	}	for (n = 1; n <= ret; n++)	    cdRemap[n] = atoi(COM_Argv (n+1));	return;    }            if (!strncmp(command, "reset", 5)) {	enabled = true;	I_StopCD();            	for (n = 0; n < MAX_CD_TRACKS; n++)	    cdRemap[n] = n;	CDAudio_GetAudioDiskInfo();	return;    }            if (!cdValid) {	CDAudio_GetAudioDiskInfo();	if (!cdValid) {	    CONS_Printf("No CD in player.\n");	    return;	}    }    if (!strncmp(command, "open", 4)) {	I_EjectCD();	cdValid = false;	return;    }    if (!strncmp(command, "info", 4)) {	CONS_Printf("%u tracks\n", maxTrack);	if (playing)	    CONS_Printf("Currently %s track %u\n", playLooping ? "looping" : "playing", playTrack);	else if (wasPlaying)	    CONS_Printf("Paused %s track %u\n", playLooping ? "looping" : "playing", playTrack);	CONS_Printf("Volume is %d\n", cdvolume);	return;    }    if (!strncmp(command, "play", 4)) {	I_PlayCD((byte)atoi(COM_Argv (2)), false);	return;    }    if (!strncmp(command, "loop", 4)) {	I_PlayCD((byte)atoi(COM_Argv (2)), true);	return;    }    if (!strncmp(command, "stop", 4)) {	I_StopCD();	return;    }            if (!strncmp(command, "pause", 5)) {	I_PauseCD();	return;    }            if (!strncmp(command, "resume", 6)) {	I_ResumeCD();	return;    }            CONS_Printf("Invalid command \"cd %s\"\n", COM_Argv (1));}/************************************************************************** * * function: StopCD * * description: * * **************************************************************************/void I_StopCD(void){    if (cdrom == NULL || !enabled)	return;        if (!(playing || wasPlaying))	return;        if(SDL_CDStop(cdrom))    {	CONS_Printf("cdromstop failed\n");    }        wasPlaying = false;    playing = false;}/************************************************************************** * * function: PauseCD * * description: * * **************************************************************************/void I_PauseCD (void){    if (cdrom == NULL || !enabled)	return;        if (!playing)	return;        if(SDL_CDPause(cdrom))    {	CONS_Printf("cdrompause failed\n");    }        wasPlaying = playing;    playing = false;}/************************************************************************** * * function: ResumeCD * * description: * * **************************************************************************/// continue after a pausevoid I_ResumeCD (void){    if (cdrom == NULL || !enabled)	return;        if (!cdValid)	return;        if (!wasPlaying)	return;	    if(cd_volume.value == 0)	return;        if(SDL_CDResume(cdrom))    {	CONS_Printf("cdromresume failed\n");    }        playing = true;    wasPlaying = false;     return;}/************************************************************************** * * function: ShutdownCD * * description: * * **************************************************************************/void I_ShutdownCD (void){    if (!initialized)	return;    I_StopCD();    SDL_CDClose(cdrom);        cdrom = NULL;    initialized = false;    enabled = false;}/************************************************************************** * * function: InitCD * * description: * Initialize the first CD drive SDL detects and add console command 'cd' * **************************************************************************/void I_InitCD (void){    int i;    char *cdName;        // Don't start music on a dedicated server    if (M_CheckParm("-dedicated"))	return ;        // Has been checked in d_main.c, but doesn't hurt here    if (M_CheckParm ("-nocd"))	return ;        // Initialize SDL first    if (SDL_Init(SDL_INIT_CDROM) < 0) {	fprintf(stderr, "Couldn't initialize SDL: %s\n",SDL_GetError());	return;    }    // Open drive    cdrom = SDL_CDOpen(0);    cdName = SDL_CDName(0);        if (cdrom == NULL) {	if(cdName == NULL)	{	    	    CONS_Printf("Couldn't open default CD-ROM drive: %s\n",		    SDL_GetError());	}	else	{	    CONS_Printf("Couldn't open default CD-ROM drive %s: %s\n",			cdName, SDL_GetError());	}		return;    }        for (i = 0; i < MAX_CD_TRACKS; i++)	cdRemap[i] = i;        initialized = true;    enabled = true;    if (CDAudio_GetAudioDiskInfo()) {	CONS_Printf("I_InitCD: No CD in player.\n");	cdValid = false;    }    COM_AddCommand ("cd", Command_Cd_f);        CONS_Printf("CD Audio Initialized\n");        return ;}///************************************************************************** * * function: UpdateCD * * description: * sets CD volume (may have changed) and initiates play evey 2 seconds * in case the song has elapsed * **************************************************************************/void I_UpdateCD (void){    if (!enabled)	return;        I_SetVolumeCD(cd_volume.value);	    if (playing && lastchk < SDL_GetTicks())     {	lastchk = SDL_GetTicks() + 2000; //two seconds between chks		if(CDAudio_GetAudioDiskInfo())	{	    playing = false;	    return;	}	if(cdStatus != CD_PLAYING &&	   cdStatus != CD_PAUSED)	{	    playing = false;	    if (playLooping)		I_PlayCD(playTrack, true);	}    }    return;}/************************************************************************** * * function: PlayCD * * description: * play the requested track and set the looping flag * pauses the CD if volume is 0 *  **************************************************************************/void I_PlayCD (int track, boolean looping){    if (cdrom == NULL || !enabled)	return;        if (!cdValid)    {	CDAudio_GetAudioDiskInfo();	if (!cdValid)	    return;    }        track = cdRemap[track];        if (track < 1 || track > maxTrack)    {	CONS_Printf("I_PlayCD: Bad track number %u.\n", track);	return;    }        // don't try to play a non-audio track    if(cdrom->track[track].type == SDL_DATA_TRACK)    {	CONS_Printf("I_PlayCD: track %i is not audio\n", track);	return;    }	    if (playing)    {	if (playTrack == track)	    return;	I_StopCD();    }        if(SDL_CDPlayTracks(cdrom, track, 0, 1, 0))    {	CONS_Printf("Error playing track %d: %s\n",		    track, SDL_GetError());	return;    }        playLooping = looping;    playTrack = track;    playing = true;    if(cd_volume.value == 0)    {	I_PauseCD();    }    }/************************************************************************** * * function: SetVolumeCD * * description: * SDL does not support setting the CD volume * use pause instead and toggle between full and no music *  **************************************************************************/int I_SetVolumeCD (int volume){    if(volume != cdvolume)    {	if(volume > 0 && volume < 16)	{	    CV_SetValue(&cd_volume, 31);	    cdvolume = 31;	    	    I_ResumeCD();	}	else if(volume > 15 && volume < 31)	{	    CV_SetValue(&cd_volume, 0);	    cdvolume = 0;	    	    I_PauseCD();	}    }        return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -