1 #include "Sound.h"
2 
3 NAMESPACE_UPP;
4 
5 extern "C"{
6 	//this is a C callable function, to wrap U++ Callback into PaStreamCallback
StreamCallback(const void * input,void * output,unsigned long frames,const PaStreamCallbackTimeInfo * timeinfo,unsigned long flags,void * data)7 	int StreamCallback(const void *input, void *output, unsigned long frames,
8 	          const PaStreamCallbackTimeInfo *timeinfo, unsigned long flags, void *data)
9 	{
10 		StreamCallbackData *scd = static_cast<StreamCallbackData*>(data);
11 		StreamCallbackArgs sca(input, output, frames, timeinfo, flags,scd->data);
12 		scd->func(sca);
13 		return(sca.state);
14 	}
15 
16 	//this is a C callable function, to wrap WhenFinish into PaStreamFinishedCallback
StreamFinishedCallback(void * data)17 	void StreamFinishedCallback(void *data){
18 		StreamCallbackData *scd = static_cast<StreamCallbackData*>(data);
19 		scd->finish(scd->data);
20 	}
21 }
22 
23 
24 /* ASound */
25 
ASound()26 ASound::ASound():err(paNoError),samplerate(44100), fpb(1024),flags(SND_NOFLAG){
27 	SoundSys();
28 }
29 
OpenStream(PaStreamCallback * cb,void * data,const StreamParameters & inparam,const StreamParameters & outparam)30 void ASound::OpenStream(PaStreamCallback* cb, void* data,
31                         const StreamParameters& inparam, const StreamParameters& outparam){
32 	ASSERT(SoundSystem::Exists());
33 	const PaStreamParameters* noparam=NULL;
34 	err = Pa_OpenStream(&stream, IsNull(inparam)?noparam:inparam, IsNull(outparam)?noparam:outparam,
35 	                    samplerate, fpb, flags, cb, data);
36 	CHECK_ERR;
37 }
38 
OpenDefaultStream(PaStreamCallback * cb,void * data,int inchannels,int outchannels,SampleFormat format)39 void ASound::OpenDefaultStream(PaStreamCallback* cb, void* data,
40                                int inchannels,int outchannels, SampleFormat format){
41 	ASSERT(SoundSystem::Exists());
42 	err = Pa_OpenDefaultStream(&stream,inchannels,outchannels,format,samplerate,fpb,cb,data);
43 	CHECK_ERR;
44 }
45 
Close()46 void ASound::Close(){
47 	if (IsOpen()){
48 		err = Pa_CloseStream(stream);
49 		CHECK_ERR;
50 		stream = NULL;
51 	}
52 }
53 
IsStopped() const54 bool ASound::IsStopped() const{
55 	int err = Pa_IsStreamStopped(stream);
56 	CHECK_ERR;
57 	return err;
58 }
59 
IsActive() const60 bool ASound::IsActive() const{
61 	int err = Pa_IsStreamActive(stream);
62 	CHECK_ERR;
63 	return err;
64 }
65 
GetInputLatency() const66 double ASound::GetInputLatency() const{
67 	const PaStreamInfo *info = Pa_GetStreamInfo(stream);
68 	if (info != NULL) return info->inputLatency;
69 	else return 0;
70 }
71 
GetOutputLatency() const72 double ASound::GetOutputLatency() const{
73 	const PaStreamInfo *info = Pa_GetStreamInfo(stream);
74 	if (info != NULL) return info->outputLatency;
75 	else return 0;
76 }
77 
GetSampleRate() const78 double ASound::GetSampleRate() const{
79 	const PaStreamInfo *info = Pa_GetStreamInfo(stream);
80 	if (info != NULL) return info->sampleRate;
81 	else return 0;
82 }
83 
84 /* Sound */
85 
Open(void * data,const StreamParameters & inparam,const StreamParameters & outparam)86 void Sound::Open(void* data, const StreamParameters& inparam,const StreamParameters& outparam){
87 	scallback=StreamCallbackData(WhenAction,WhenFinished,data);
88 	OpenStream(&StreamCallback,static_cast<void *>(&scallback),inparam,outparam);
89 	if(err==paNoError) SetFinishCallback();
90 }
91 
Open(const StreamParameters & inparam,const StreamParameters & outparam)92 void Sound::Open(const StreamParameters& inparam,const StreamParameters& outparam){
93 	Open(NULL, inparam, outparam);
94 }
95 
OpenDefault(void * data,int inchannels,int outchannels,SampleFormat format)96 void Sound::OpenDefault(void* data, int inchannels,int outchannels, SampleFormat format){
97 	scallback=StreamCallbackData(WhenAction,WhenFinished,data);
98 	OpenDefaultStream(&StreamCallback, static_cast<void *>(&scallback),inchannels,outchannels,format);
99 	if(err==paNoError) SetFinishCallback();
100 }
101 
OpenDefault(int inchannels,int outchannels,SampleFormat format)102 void Sound::OpenDefault(int inchannels, int outchannels, SampleFormat format){
103 	OpenDefault(NULL, inchannels, outchannels, format);
104 }
105 
SetFinishCallback()106 void Sound::SetFinishCallback(){
107 	err=Pa_SetStreamFinishedCallback(stream,&StreamFinishedCallback);
108 	CHECK_ERR;
109 }
110 
111 
112 END_UPP_NAMESPACE;
113