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