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

📄 sdl_ndsaudio.c

📁 SDL库 在进行视频显示程序spcaview安装时必须的库文件
💻 C
字号:
/*    SDL - Simple DirectMedia Layer    Copyright (C) 1997-2006 Sam Lantinga    This library is free software; you can redistribute it and/or    modify it under the terms of the GNU Lesser General Public    License as published by the Free Software Foundation; either    version 2.1 of the License, or (at your option) any later version.    This library 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    Lesser General Public License for more details.    You should have received a copy of the GNU Lesser General Public    License along with this library; if not, write to the Free Software    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA    Sam Lantinga    slouken@libsdl.org*/#include "SDL_config.h"/* Allow access to a raw mixing buffer */#include <nds.h>#include "SDL.h"#include "SDL_endian.h"#include "SDL_timer.h"#include "SDL_audio.h"#include "../SDL_audiomem.h"#include "../SDL_audio_c.h"#include "SDL_ndsaudio.h"#include "soundcommon.h"/* Audio driver functions */static int NDS_OpenAudio(_THIS, SDL_AudioSpec *spec);static void NDS_WaitAudio(_THIS);static void NDS_PlayAudio(_THIS);static Uint8 *NDS_GetAudioBuf(_THIS);static void NDS_CloseAudio(_THIS);/* Audio driver bootstrap functions */u32 framecounter = 0,soundoffset = 0;static SDL_AudioDevice *sdl_nds_audiodevice; //void SoundMixCallback(void *stream,u32 size)//{//	//printf("SoundMixCallback\n");//	//	Uint8 *buffer;//	 // 	buffer = sdl_nds_audiodevice->hidden->mixbuf;//	memset(buffer, sdl_nds_audiodevice->spec.silence, size);//	//	if (!sdl_nds_audiodevice->paused){ //		 ////	//if (sdl_nds_audiodevice->convert.needed) {//	//	int silence;////	//	if (sdl_nds_audiodevice->convert.src_format == AUDIO_U8 ) { //	//		silence = 0x80;//	//	} else {//	//		silence =  0; //	//	}//	//	memset(sdl_nds_audiodevice->convert.buf, silence, sdl_nds_audiodevice->convert.len);//	//	sdl_nds_audiodevice->spec.callback(sdl_nds_audiodevice->spec.userdata,//	//		(Uint8 *)sdl_nds_audiodevice->convert.buf,sdl_nds_audiodevice->convert.len);//	//	SDL_ConvertAudio(&sdl_nds_audiodevice->convert);//	//	memcpy(buffer, sdl_nds_audiodevice->convert.buf, sdl_nds_audiodevice->convert.len_cvt);//	//} else //	{//		sdl_nds_audiodevice->spec.callback(sdl_nds_audiodevice->spec.userdata, buffer, size);//		//memcpy((Sint16 *)stream,buffer, size);//	}////	}////	if(soundsystem->format == 8)//	{//		int i;//		s32 *buffer32 = (s32 *)buffer; //		s32 *stream32 = (s32 *)stream;//		for(i=0;i<size/4;i++){ *stream32++ = buffer32[i] ^ 0x80808080;}//		//for(i = 0; i < size; i++)//		//	((s8*)stream)[i]=(buffer[i]^0x80);//	}//	else//	{//		int i;//		for(i = 0; i < size; i++){//			//((short*)stream)[i] =(short)buffer[i] << 8;				// sound 8bit ---> buffer 16bit//			//if (buffer[i] &0x80)//				//((Sint16*)stream)[i] = 0xff00 | buffer[i];//			((Sint16*)stream)[i] = (buffer[i] - 128) << 8;////			//else//			//	((Sint16*)stream)[i] = buffer[i];//		}//		//register signed char *pSrc =buffer;//		//register short *pDest =stream;//		//int x;//		//			for (x=size; x>0; x--)//		//			{//		//				register short temp = (((short)*pSrc)-128)<<8;//		//				pSrc++;//		//				*pDest++ = temp;//		//			}////		//memcpy((Sint16 *)stream,buffer, size);//	}//}void SoundMixCallback(void *stream,u32 len){	SDL_AudioDevice *audio = (SDL_AudioDevice *)sdl_nds_audiodevice;	/* Silence the buffer, since it's ours */	SDL_memset(stream, audio->spec.silence, len);	/* Only do soemthing if audio is enabled */	if ( ! audio->enabled )		return;	if ( ! audio->paused ) {		if ( audio->convert.needed ) {			//fprintf(stderr,"converting audio\n");			SDL_mutexP(audio->mixer_lock);			(*audio->spec.callback)(audio->spec.userdata,				(Uint8 *)audio->convert.buf,audio->convert.len);			SDL_mutexV(audio->mixer_lock);			SDL_ConvertAudio(&audio->convert);			SDL_memcpy(stream,audio->convert.buf,audio->convert.len_cvt);		} else {			SDL_mutexP(audio->mixer_lock);			(*audio->spec.callback)(audio->spec.userdata,						(Uint8 *)stream, len);			SDL_mutexV(audio->mixer_lock);		}	}	return;}void MixSound(void){	int remain;	if(soundsystem->format == 8)	{		if((soundsystem->soundcursor + soundsystem->numsamples) > soundsystem->buffersize)		{			SoundMixCallback(&soundsystem->mixbuffer[soundsystem->soundcursor],soundsystem->buffersize - soundsystem->soundcursor);			remain = soundsystem->numsamples - (soundsystem->buffersize - soundsystem->soundcursor);			SoundMixCallback(soundsystem->mixbuffer,remain);		}		else		{			SoundMixCallback(&soundsystem->mixbuffer[soundsystem->soundcursor],soundsystem->numsamples);		}	}	else	{		if((soundsystem->soundcursor + soundsystem->numsamples) > (soundsystem->buffersize >> 1))		{			SoundMixCallback(&soundsystem->mixbuffer[soundsystem->soundcursor << 1],(soundsystem->buffersize >> 1) - soundsystem->soundcursor);			remain = soundsystem->numsamples - ((soundsystem->buffersize >> 1) - soundsystem->soundcursor);			SoundMixCallback(soundsystem->mixbuffer,remain);		}		else		{			SoundMixCallback(&soundsystem->mixbuffer[soundsystem->soundcursor << 1],soundsystem->numsamples);		}	}}void InterruptHandler(void){	framecounter++;}void FiFoHandler(void){	u32 command;	while ( !(REG_IPC_FIFO_CR & (IPC_FIFO_RECV_EMPTY)) ) 	{		command = REG_IPC_FIFO_RX;		switch(command)		{		case FIFO_NONE:			break;		case UPDATEON_ARM9:			REG_IME = 0;			MixSound();			REG_IME = 1;			SendCommandToArm7(MIXCOMPLETE_ONARM9);			break;		}	}}static int Audio_Available(void){	return(1);}static void Audio_DeleteDevice(SDL_AudioDevice *device){}static SDL_AudioDevice *Audio_CreateDevice(int devindex){		SDL_AudioDevice *this;	/* Initialize all variables that we clean on shutdown */	this = (SDL_AudioDevice *)malloc(sizeof(SDL_AudioDevice));	if ( this ) {		SDL_memset(this, 0, (sizeof *this));		this->hidden = (struct SDL_PrivateAudioData *)				SDL_malloc((sizeof *this->hidden));	}	if ( (this == NULL) || (this->hidden == NULL) ) {		SDL_OutOfMemory();		if ( this ) {			SDL_free(this);		}		return(0);	}	SDL_memset(this->hidden, 0, (sizeof *this->hidden));	/* Set the function pointers */	this->OpenAudio = NDS_OpenAudio;	this->WaitAudio = NDS_WaitAudio;	this->PlayAudio = NDS_PlayAudio;	this->GetAudioBuf = NDS_GetAudioBuf;	this->CloseAudio = NDS_CloseAudio;	this->free = Audio_DeleteDevice;//fprintf(stderr,"Audio_CreateDevice\n");	return this;}AudioBootStrap NDSAUD_bootstrap = {	"nds", "NDS audio",	Audio_Available, Audio_CreateDevice};void static NDS_WaitAudio(_THIS){	//printf("NDS_WaitAudio\n");}static void NDS_PlayAudio(_THIS){	//printf("playing audio\n");	if (this->paused)		return;	}static Uint8 *NDS_GetAudioBuf(_THIS){	return NULL;//(this->hidden->mixbuf); }static void NDS_CloseAudio(_THIS){/*	if ( this->hidden->mixbuf != NULL ) {		SDL_FreeAudioMem(this->hidden->mixbuf);		this->hidden->mixbuf = NULL;	}*/ }static int NDS_OpenAudio(_THIS, SDL_AudioSpec *spec){	//printf("NDS_OpenAudio\n");	int format = 0;	//switch(spec->format&0xff) {	//case  8: spec->format = AUDIO_S8;format=8; break;	//case 16: spec->format = AUDIO_S16LSB;format=16; break;	//default:	//	SDL_SetError("Unsupported audio format");	//	return(-1);	//}	switch (spec->format&~0x1000) {		case AUDIO_S8:			/* Signed 8-bit audio supported */			format=8;			break;		case AUDIO_U8:			spec->format ^= 0x80;format=8;			break;		case AUDIO_U16:			/* Unsigned 16-bit audio unsupported, convert to S16 */			spec->format ^=0x8000;format=16;		case AUDIO_S16:			/* Signed 16-bit audio supported */			format=16;			break;	}	/* Update the fragment size as size in bytes */	SDL_CalculateAudioSpec(spec);	/* Allocate mixing buffer */	//this->hidden->mixlen = spec->size;	//this->hidden->mixbuf = (Uint8 *) SDL_AllocAudioMem(this->hidden->mixlen);	//if ( this->hidden->mixbuf == NULL ) {	//	SDL_SetError("Out of Memory");	//	return(-1);	//} 	SDL_NDSAudio_mutex = 0; 	sdl_nds_audiodevice=this;		irqInit();	irqSet(IRQ_VBLANK,&InterruptHandler);	irqSet(IRQ_FIFO_NOT_EMPTY,&FiFoHandler);	irqEnable(IRQ_FIFO_NOT_EMPTY);		REG_IPC_FIFO_CR = IPC_FIFO_ENABLE | IPC_FIFO_SEND_CLEAR | IPC_FIFO_RECV_IRQ;	SoundSystemInit(spec->freq,spec->size,0,format);	SoundStartMixer();		return(1);}

⌨️ 快捷键说明

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