www.pudn.com > ngcd080s.zip > stream.c


/******************************* 
*** Sound Streaming Routines *** 
*******************************/ 
 
//-- Include Files ---------------------------------------------------------- 
#include  
#include  
#include  
#include "../ym2610/ym2610.h" 
 
//-- Defines ---------------------------------------------------------------- 
#define	MAX_VOICES	7 
#define NUM_BUFFERS	3 
 
//-- Structures ------------------------------------------------------------- 
#include  
typedef struct { 
	HAC		voice; 
	LPAUDIOWAVE	wave; 
	int		buffer_size; 
	int		current_buffer; 
	int		in_use; 
	} STREAM; 
 
static	STREAM		audio_stream[MAX_VOICES]; 
 
//-- Exported Fuctions ------------------------------------------------------ 
void	stream_init(void); 
int		stream_create(int);					/* Nominal freq, returns handle (-1 = error) */ 
void	stream_destroy(int);				/* Handle */ 
void	stream_adjust(int, int, int);		/* Handle, volume, pan  */ 
int		stream_get_buffer_size(int);		/* Handle */ 
void	stream_fill_buffer(int, char *);	/* Handle, buffer to copy */ 
void	stream_kill_all(void); 
void	stream_pause(int); 
void	stream_resume(int); 
 
//--------------------------------------------------------------------------- 
void	stream_init(void) 
{ 
	int	i; 
	 
	for(i=0;iwFormat = AUDIO_FORMAT_16BITS | AUDIO_FORMAT_MONO | AUDIO_FORMAT_LOOP; 
				audio_stream[i].wave->nSampleRate = sound_freq; 
				audio_stream[i].wave->dwLength = audio_stream[i].buffer_size*NUM_BUFFERS*2; 
				audio_stream[i].wave->dwLoopEnd = audio_stream[i].wave->dwLength; 
				audio_stream[i].wave->dwLoopStart = 0; 
 
				if (ACreateAudioData(audio_stream[i].wave) != AUDIO_ERROR_NONE) { 
					free(audio_stream[i].wave); 
				} else { 
					memset(audio_stream[i].wave->lpData, 0x00, audio_stream[i].wave->dwLength); 
					AWriteAudioData(audio_stream[i].wave, 0L, audio_stream[i].wave->dwLength); 
					if (ACreateAudioVoice(&audio_stream[i].voice) != AUDIO_ERROR_NONE) { 
						ADestroyAudioData(audio_stream[i].wave); 
						free(audio_stream[i].wave); 
					} else { 
						ASetVoiceFrequency(audio_stream[i].voice, audio_freq); 
						ASetVoiceVolume(audio_stream[i].voice, 255); 
						ASetVoicePanning(audio_stream[i].voice, 128); 
						audio_stream[i].current_buffer = 1; 
						audio_stream[i].in_use = 1; 
						APlayVoice(audio_stream[i].voice, audio_stream[i].wave); 
						return i; 
					} 
				} 
			} 
		} 
	} 
	return -1; 
} 
 
//--------------------------------------------------------------------------- 
void	stream_destroy(int i) 
{ 
	if (audio_stream[i].in_use != 0) { 
		AStopVoice(audio_stream[i].voice); 
		ADestroyAudioVoice(audio_stream[i].voice); 
		ADestroyAudioData(audio_stream[i].wave); 
		free(audio_stream[i].wave); 
		audio_stream[i].in_use = 0; 
	} 
} 
 
//--------------------------------------------------------------------------- 
void	stream_adjust(int i, int vol, int pan) 
{ 
	ASetVoiceVolume(audio_stream[i].voice, vol); 
	ASetVoicePanning(audio_stream[i].voice, pan); 
} 
 
//--------------------------------------------------------------------------- 
int	stream_get_buffer_size(int i) 
{ 
	return audio_stream[i].buffer_size; 
} 
 
//--------------------------------------------------------------------------- 
void	stream_fill_buffer(int i, char *Buffer) 
{ 
	int	pos, left, right; 
	uclock_t a, b; 
	 
	left = audio_stream[i].current_buffer * audio_stream[i].buffer_size; 
	right = left + audio_stream[i].buffer_size; 
 
	do { 
		AUpdateAudioEx(audio_freq/60); 
		AGetVoicePosition(audio_stream[i].voice, (LPLONG)&pos); 
	} while((pos>=left)&&(pos<=right)); 
 
	memcpy(((char *)(audio_stream[i].wave->lpData))+(left*2), Buffer, audio_stream[i].buffer_size*2); 
	AWriteAudioData(audio_stream[i].wave, left*2, audio_stream[i].buffer_size*2); 
	audio_stream[i].current_buffer = (audio_stream[i].current_buffer + 1)%NUM_BUFFERS; 
} 
 
//--------------------------------------------------------------------------- 
void	stream_kill_all(void) 
{ 
	int	i; 
	 
	for(i=0;i