From add1f759509b8283fe23705cf3967e1dbbd5afc2 Mon Sep 17 00:00:00 2001 From: wittend99 Date: Wed, 16 May 2012 02:31:30 +0000 Subject: [PATCH] git-svn-id: https://svn.code.sf.net/p/freetel/code@470 01035d8c-6547-0410-b346-abe4f91aad63 --- fdmdv2/pa_test/Debug/pa_test.exe | Bin 56165 -> 69568 bytes fdmdv2/pa_test/pa_class.cpp | 368 +++++++++++++++++++++++++------ fdmdv2/pa_test/pa_test.mk | 2 +- fdmdv2/pa_test/pa_test.project | 3 + 4 files changed, 300 insertions(+), 73 deletions(-) diff --git a/fdmdv2/pa_test/Debug/pa_test.exe b/fdmdv2/pa_test/Debug/pa_test.exe index 9393ef6e61a27fd1311353eb7f4c3826f0fa52c9..70ca4075eeef3bd4bef8c544963647b9973d7fea 100644 GIT binary patch literal 69568 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 delta 13580 zcmb_@3s_ZE-uGJj>;p$Ygu?-k+&vKCjnELOuuk4Wa|}%zv+{rfiXk$1Q0n#dU}&!h z7Wi+H${KvT`8Ixbp(!S{2k)1(bhI)xvoZ%qDraiUx0>Pm{rBF7!|r^~JkR?+-+rF8 z|7-o$|GMsLAL#s@`qf*O=Cw20UwHj4(IiBRMTqkvREA3>PDBYIQjruPD(s;CvT*Bp z;3{B=#8i6aT`!Pg(xYquw`%@~L43mNJwiWH)-Yf-2WT@&HJfr;#t zSU>Sf!-Vvx%_7w;kcn77@p};4feGoVTId!B)N}#T_51!pY|cS$O=r!Nt`|{ij8$1A zsw=yn5cLJzaFZe$Zn3V|2pVaNkNs~H)|{yc>i|p7rJw%U)6sVgng!H`nYdtk1 zHggZxce=qC0o%4zc*i~%JyXI_&cg-~1p z#Z{~rG}WMq7h~L9b{b`e8yT&g->F;sl@=N#qt?R%Xt9CjHB9iOtH{){kx{yfdPCKe z!BY)RGr=>^m#?tT`S7`GAp2$T?EwJ2hWLohspt@tRS4{3ffyDzhnMEkrPXk*`Euxh z=F4jHW!c=d4>jlonqp7-HM8$T-$C^Xb`?RX14p{KUhgG%`v-qL^3x&f=Ns}1zV+bK zCefiibk#n761-BpVF#=eI0GN*uPI)8f%mo!ZtwcNj{6Snju2(d+Z|PIvFay&doN(9 zHCiw%m7ZhudsIfr7gIG08sydeb>7hW{&}qJhuuQd34c-LqLBWgO)Dz?V$`ZHP^zTEW1Cm~)IE~Y zxsQ%Qiueq`R_snsqCT9D!kyIY%f-6mNx8Z#xZVlcu29EWCq05TZ%fDRNQr%ds z;Z{6azvtLyF0U_C8)CHzw~EF7lC}sS4n*N-Oxl_PCx7bky4IZWMwB)8IG$zX&YG(j zflUce|Hjpx9<7J>j68E$Y1p%Vylix=VWu^I^3`0qe9*sEHuiUOlN|D@dSh^j8{^Pr zYSz|IZnvn-1zNk+gsv~WcHi7XdthcNkgi(v-1Nqz60SYt9opPz;n}qa=!}N_8inr> zXfIpic(oxXz2{iteKuO}v~inv-37ivLn9(LqVwCbjqGfE;Ae~qo)WyX!YF&z)k(*l zPM&gIU!q*NnXNaBw>4;P_&qyM{RSlrX1_XX`Wc$g*@oXwKyZ3vY)K(a9OUBtwCmr2 z%OiwwtJ_xR5rTR^@TlJwxLk?=0I39N1=7<< zTaeyC;^#2vX{5g(T|)|+56ei&NEt}kNcl(;kftHcMw*AT2+51I66sN-=J~>>DcpoY z2NFNWKre8f!$ZnOnt(JDsRXGOiJ$*Jj>G={(sRv;|Bd4xhzX??rQXu<)#cvu_7Ow3 zOT{HNwuQ@q6gxbD?jOFIB1WY9{w52HJu^$I7nfHSd(mB@=zo^(oH%3J#Hlxq$||X- zU|$`O{~x3U|B`v}(q;3jy}Ig5DCSgAK5xPN`JSbolI5dDjMVG$f&c47)3RO)O&#bK z-EsOX8!)KOEfSH^vFfT-4E|Ma$jR}|wcyHy8Tu;`czALtVtI^yt;0x;bBpbPYHji< zVsx^eO3JJx{sw@VhU6(*yrhH& zfDkt!aX55x%q>br3PtB7DXl4#otLF7%AlgWJCtFW^j~?2%CnhtAa8N_nk*sqL8b_c z+4N`A+UMQ$nS@0ef6G;e-vp}hv4QorrnLVmzn^4Pv&SYuNBi=zOCw^@4Z}Re)eDvh zC3+|tM_MgvA@xiyQKI@$>6BNbvpwogpDJfl^IaQUv!TvnSB6=!;uRL(?X4~?UMwsH zO4x&_a9Y+XH_@EJdu?2@G$|j`_QJ7p3;lOtrq8Nw!@WPss{R2a`X;%VoRW)8nXy#f(>;}|cK#E&Zs^%`%Sw{&rp zP>dq3F9XYJ9)5UyaYeC5zo+-7nzk5`}>~7Uz0h{kWR4GIlF#3&+$V9J=mt zJ_EmD2bxZ4Q5|K~#fwXq7M51~C9>nR8k@sgzPNO9W!Vy;jC@s765&|tE%w$dom5f0 zV5v|>P1MjRN6pgG>Iuc(VxioqYjwnS!>Rv-Qyh{|Mzdc^i#M*k(kGPM@mi@Wu3RW% z-b4>6Em%6N>N`+pRVSk|nzK&1xVXGhD6=?74)8CSbp;6WG&ly8R#z`Ucny^RW8Xk+ z7c$U~_A4yrki4bU@bTC0axmUJqiG9^eZQ!)cu$GArTX|$X0vLG_nL@Bm%iP1!6vWP>4zSXQ@W}>Fg=BO&Gshlt5JuH`lYN4v# zh%i=qJl=}x(gh`6G_U-Pd<<1=gI%2gJ}ahXoGwdmSEMCA&RVbM!@iX9FLGh%EPl)Q zKMJ~9F)X&qEfPGQ+7i#hLKd(Is|B~g+{LbfKB86&FT;s_H1fGsAez=hSMU zp2~qSscvCWt>u+ooJBO&Cw12GONNa0v%ZIZQ#|8m%rw?s8N**FV2$q*e(AHC^nR8e z*K4H5LSHXg%b$qE*INBmE3K-!qd#lr&1DpNN}*ME#QBn?A6o}(7nm)j#kE4Fa`t^d zmeP6t;tyJJzP}iT&a#x2_=`y>Vw8l|R4y%FP+3}%%E4K815~0}nUo=1kcnEsYT+Bc zuvK!scpyY;r>5Twxq;n#9O)HyQF_X%s!NxadWGyS{WX)=(EAvdig+}Hj@M;SSoPpA z-Vz(J?R}%RkFI`R)yijqt+dh?%f=LOwsR2FLiiaZXK_gh2JqG?5(h@;axSe#w{Nwg zxR8q#rIjf1YxYe!iR5RDzr*S zCugh{TPi*MQ0nj+P{FgHb&wsjO%R<{n|Jxrex3bt%NXy~WWVCtogQX84)RM0- zX%7Ii-;c^wNYTrRD{4y7?|fhX9yNSApyPQ-(Q=67HEt7_B9h#~9!7I~qm+BX=rP}@ zFh+ihv@VPe`_gZ_h!3pM^J}U-FeBu6wsL*Arpn{N*?hrr&&;WJ&-d^A@*!D=%2vp; z&o$vRqHZ=;r$_7XYYDwnm!hpvyTGD|tT4=>sp0(Pm(w?)f{IopQ{}TEG<8)N*nhq1 zMy1e=A8$I|c*JHIoB^rm3^5s}U3-?eEy7~EIs6vun=UV*)|n*@wU7?LgTf5aXy}QTa&inaCk%!^i2<#*Mdaf% z4vlS!rT^17xP9_}ydBbBq|T6UJa(fDeH@aCI7#O>IB44AyWy=>ai>svbEd@-FX?jg z_}g-uA86Uu(xPO>%&D)pwX6!Amu(aiWMw+>Sk8(5=u~T`l)2)tdo9xYKqc1h$cNfjnzH* zbh5G|f!=yLL$M{&xuiT?AMx9B&UV#qVg*?x6X zq{Q)mDRpmkwkJNfS{cd**xQj5;Z>QA*Yh@}O>K2h^wP(P5j-}=UGNvYEL#+xTCat?j?cADZIKtI0iVv^jE zJ-G{`A{B09$_vaZJU;=sh^z!|5gzTJi9;sBV+3=?TUyK8c9X^fDaqHubb57fES=w( zPEp$@P~Ceft=JxBbzsUTko-d|wQUcRb+~oKQs?$a>v_nh(g*uuscUX9J8vvdG~rgJYE(g_iBew$?I2uO5w~5j#^t_+w3X2xYyQ9C9zRsiCxN zXSTBf**0t(W_Q8&?#@NZZVL^4*TpxmX&^XYR=>MVhV#KPS~C`=`RMMflB?VFW#brvpeQ z29a)-krP1jL7@@D(?1v?UwLqmf-}+SgXn`4`X|UYD!C3VQg8}-?9gK}o01Nvg&&8Q zKCGtEx9x*uE|nfm3HcIAo5Hm~UpO3>aTUcK*kN?59_%uF+p=M84fxT|Lgx=V6i8h? zyeRw*c&)d)YoR0*03k=gnSk#d!nL?|Mq{&J2;*m7#a8|C3 zu&>V!qo||lR=yksMi;&+%sJ{(uvxD>I!Tt%zN0DDIJD7ln!Yo|myKLOZ=)b1CIFdg zLhc4qVnXHt*<=ce=RpMG2!y#ANNX?RZ*I+7=(5N!v0Aw3Ki+>JJQ3ZbH-TM?kmm$G zf`onGQbI#1>w`(k@_w}JgU6ym(7ONZ5n=&Eg?P(CQO6zDC=AFz{8h)&ty$PQ1M#oP zqIZs=OGD}0u}Lu+H`^CkbJ!O|2 z%wbLKW3hmej)y9#kyLmxM>((3v@cxr!iRQ8GNQ-W?laH~o+~Py`piX}KDIl!rT?Ei z7gRd`sf#i`w9{K3+Wp!Os&w+aiq(oPO?%nstI)zw5%_=z-XI%B7IVZKfm z>{jU>^o{EyyCXkHaIMA@^F0<%Q)`Z1K}jdl9MggXnsuc=tMtf+E^7P89>WvPkS!~( zC`G?G==C#cLt1-#sLZ>trV?M~j6WdiGw@pb4A*Hi|Lk?w1*D8gFuISFp??|lCs5*X zo3*d}UGf5r{WJ|zr5JAqt@$)fY1PBq5)@uOeg1ixV@1#)Yh!`YeEc^z2mgdukEl6MjJ@{FgV@r_0K|R8zAc54N2p0xL*d5?8j$g-g`&)z5x#{b3X^y9Z z?4Q!@KM^F58PKh-4>|m)#oWU7Aa&<;`+P1mv5wB8C9q!-B+#YXUmGOA9~w+5a!P{i zpA7IA@n6yHw*{%op|8%T#S{eW8&d)2IZU;HYX4O0W8P4G%{0}6vLPe8CUja!5ZId~E=|f6*1ANoeZ)duBde z#*Sz|ZI{QiJyQ($<(}!L-+Yo5a}83a4$8ft@!Nv;XZ z2W%g6j@xCT#^DU&m`dNBN~8V9?PS}TL?gOFt*OjIJHJSwM^D+QiPcYFVQZ#VvG05e zMSN_ht2^v+riN#0_+95xHk`J{aLbzAFVUFtG^Smjr^q8z{GzD$N1SJ`|UMX@W@+e{JI@V5}2Jg^A|_AejM0;6B5MX3QVPUl=h-@wvRUj}+{u z04gvsSlmcl&)H*(S|reGK)QXCvPOdCkNWg3-ixJyaOcIvFvI;Gsc0Hv{3nUP9v; zQUyTtwUJxRg%!)@JES|FE_zQzlG27%;J$PzOQY}CnkP4W5 zLDS>zGoacTF}2enzEk=)M!lgv1hT`Vns1TXLMQw^{v!}`7dUZqn@!WdOPMwlIVbFZ z#fUu@NSn$1i9onj*`jWB1`zEw)oY^|$Pr2JewXd2L3V5J3I!Qa-;b2lhsu3{zTOfHRJ?%g;O*}`(05Y#TUjXr+P4wQm0z}`b{pQ2NDdMWj7mF_( z!%Y@$0Mgluc=)%h;tEk8aL4E{#r={qrg0&>lyIvgh_UhM;#2LV~p>!PQ4-jZss9bTKnu8*Kwe{lKu z6MA7UFMBv0NGfPxR?G$Bzvt+!yc9?_cmkua5y%yjfh|DtOgtSxR-0_?9SA7j1YH6W z6-n{el6{KyC8lp=@%+gJPaxJ|2Eu;nzU2aOn>=v?X)+m^W=I9PY(5b4zFFe~RAdsX z2cjLegnw}HKSuBqaOl+_+Sq}pj+r7$L&-e; z#{oIt%j40P5V5cqVQ1%{WL^_j0P&yJ^;X;vi9eO&o(UWzeh;RDCLebJ;U_RujsP(a z;j=*AG)esfNG(!edk@8mnQG#>4oJk>Ug*XF?Q4HLDS!Keocs1hDPxt5$80im<9>_0 z?d=3rW?0_7CsfACjgQ#mKQ>Z7nYr=ve)6-oPlrjb+_)e@4%ql;guEDnpO^8cO&fpL NUw-`dqmeRM{$K544le)z diff --git a/fdmdv2/pa_test/pa_class.cpp b/fdmdv2/pa_test/pa_class.cpp index 14e70e40..694ca7cf 100644 --- a/fdmdv2/pa_test/pa_class.cpp +++ b/fdmdv2/pa_test/pa_class.cpp @@ -1,28 +1,246 @@ -#include -#include -#include "portaudio.h" +#include "pa_class.h" -/* -** Note that many of the older ISA sound cards on PCs do NOT support -** full duplex audio (simultaneous record and playback). -** And some only support full duplex at lower sample rates. -*/ -#define SAMPLE_RATE (44100) -#define PA_SAMPLE_TYPE paFloat32 -#define FRAMES_PER_BUFFER (64) +PortAudioWrap::PortAudioWrap() +{ + stream = NULL; +// inputBuffer = 0; +// outputBuffer = NULL; + inputDevice = paNoDevice; + outputDevice = paNoDevice; + userData = NULL; + samplerate = 0; + framesPerBuffer = 0; + statusFlags = 0; + streamCallback = NULL; + streamFinishedCallback = NULL; + timeInfo = 0; +} -typedef float SAMPLE; +PortAudioWrap::~PortAudioWrap() +{ +} -float CubicAmplifier(float input); +PaError PortAudioWrap::init() +{ + return Pa_Initialize(); +} -static int fuzzCallback(const void *inputBuffer, - void *outputBuffer, - unsigned long framesPerBuffer, - const PaStreamCallbackTimeInfo* timeInfo, - PaStreamCallbackFlags statusFlags, - void *userData); +PaError PortAudioWrap::streamOpen() +{ + return Pa_OpenStream( + &stream, + &inputBuffer, + &outputBuffer, + samplerate, + framesPerBuffer, + statusFlags, + *streamCallback, + userData + ); +} + +PaError PortAudioWrap::streamStart() +{ + return Pa_StartStream(this->stream); +} + +PaError PortAudioWrap::streamClose() +{ + if (isOpen()) + { + return Pa_CloseStream(this->stream); + } + else + { + return 1; + } +} + +void PortAudioWrap::terminate() +{ + Pa_Terminate(); +} + +void PortAudioWrap::stop() +{ + Pa_StopStream(stream); +} + +void PortAudioWrap::abort() +{ + Pa_AbortStream(stream); +} + +bool PortAudioWrap::isStopped() const +{ + PaError ret = Pa_IsStreamStopped(stream); + return ret; +} + +bool PortAudioWrap::isActive() const +{ + PaError ret = Pa_IsStreamActive(stream); + return ret; +} + +bool PortAudioWrap::isOpen() const +{ + return (stream != NULL); +} + +PaDeviceIndex PortAudioWrap::getDefaultInputDevice() +{ + return Pa_GetDefaultInputDevice(); +} + +PaDeviceIndex PortAudioWrap::getDefaultOutputDevice() +{ + return Pa_GetDefaultOutputDevice(); +} + +PaError PortAudioWrap::setInputChannelCount(int count) +{ + if(!isActive()) + { + inputBuffer.channelCount = count; + return paNoError; + } + return paStreamIsNotStopped; +} + +PaError PortAudioWrap::setInputSampleFormat(PaSampleFormat format) +{ + if(!isActive()) + { + inputBuffer.sampleFormat = format; + return paNoError; + } + return paStreamIsNotStopped; +} + +PaError PortAudioWrap::setInputLatency(PaTime latency) +{ + if(!isActive()) + { + inputBuffer.suggestedLatency = latency; + return paNoError; + } + return paStreamIsNotStopped; +} + +void PortAudioWrap::setInputHostApiStreamInfo(void *info) +{ + inputBuffer.hostApiSpecificStreamInfo = info; +} + +PaTime PortAudioWrap::getInputDefaultLowLatency() +{ + return Pa_GetDeviceInfo(inputBuffer.device)->defaultLowInputLatency; +} + +PaError PortAudioWrap::setOutputChannelCount(int count) +{ + if(!isActive()) + { + outputBuffer.channelCount = count; + return paNoError; + } + return paStreamIsNotStopped; +} -/* Non-linear amplifier with soft distortion curve. */ +PaError PortAudioWrap::setOutputSampleFormat(PaSampleFormat format) +{ + if(!isActive()) + { + outputBuffer.sampleFormat = format; + return paNoError; + } + return paStreamIsNotStopped; +} + +PaError PortAudioWrap::setOutputLatency(PaTime latency) +{ + if(!isOpen()) + { + outputBuffer.suggestedLatency = latency; + return paNoError; + } + return paStreamIsNotStopped; +} + +void PortAudioWrap::setOutputHostApiStreamInfo(void *info) +{ + outputBuffer.hostApiSpecificStreamInfo = info; +} + +PaTime PortAudioWrap::getOutputDefaultLowLatency() +{ + return Pa_GetDeviceInfo(inputBuffer.device)->defaultLowInputLatency; +} + +PaError PortAudioWrap::setFramesPerBuffer(unsigned long size) +{ + if(!isOpen()) + { + framesPerBuffer = size; + return paNoError; + } + return paStreamIsNotStopped; +} + +PaError PortAudioWrap::setSampleRate(unsigned long rate) +{ + if(!isOpen()) + { + samplerate = rate; + return paNoError; + } + return paStreamIsNotStopped; +} + +PaError PortAudioWrap::setStreamFlags(PaStreamFlags flags) +{ + if(!isOpen()) + { + statusFlags = flags; + return paNoError; + } + return paStreamIsNotStopped; +} + +PaError PortAudioWrap::setInputDevice(PaDeviceIndex flags) +{ + if(!isOpen()) + { + inputDevice = flags; + return paNoError; + } + return paStreamIsNotStopped; +} + +PaError PortAudioWrap::setOutputDevice(PaDeviceIndex flags) +{ + if(!isOpen()) + { + outputDevice = flags; + return paNoError; + } + return paStreamIsNotStopped; +} + +PaError PortAudioWrap::setCallback(PaStreamCallback *callback) +{ + if(!isOpen()) + { + streamCallback = callback; + return paNoError; + } + return paStreamIsNotStopped; +} + + + +// Non-linear amplifier with soft distortion curve. float CubicAmplifier(float input) { float output, temp; @@ -53,7 +271,7 @@ static int fuzzCallback(const void *inputBuffer, SAMPLE *out = (SAMPLE*)outputBuffer; const SAMPLE *in = (const SAMPLE*)inputBuffer; unsigned int i; - (void) timeInfo; /* Prevent unused variable warnings. */ + (void) timeInfo; // Prevent unused variable warnings. (void) statusFlags; (void) userData; @@ -61,8 +279,8 @@ static int fuzzCallback(const void *inputBuffer, { for(i = 0; i < framesPerBuffer; i++) { - *out++ = 0; /* left - silent */ - *out++ = 0; /* right - silent */ + *out++ = 0; // left - silent + *out++ = 0; // right - silent } gNumNoInputs += 1; } @@ -70,68 +288,73 @@ static int fuzzCallback(const void *inputBuffer, { for(i = 0; i < framesPerBuffer; i++) { - *out++ = FUZZ(*in++); /* left - distorted */ - *out++ = *in++; /* right - clean */ + *out++ = FUZZ(*in++); // left - distorted + *out++ = *in++; // right - clean } } return paContinue; } -#define BUILD_MAIN - -#ifdef BUILD_MAIN - +#if 1 int main(void) { - PaStreamParameters inputParameters, outputParameters; - PaStream *stream; PaError err; + PaDeviceIndex inputDevice; + PaDeviceIndex outputDevice; + + PortAudioWrap pa = PortAudioWrap(); + err = pa.init(); + + inputDevice = pa.getDefaultInputDevice(); // default input device + if(inputDevice == paNoDevice) + { + fprintf(stderr, "Error: No default input device.\n"); + goto error; + } + err = pa.setInputDevice(inputDevice); + err = pa.setInputChannelCount(2); // stereo input + err = pa.setInputSampleFormat(PA_SAMPLE_TYPE); + err = pa.setInputLatency(pa.getInputDefaultLowLatency()); + pa.setInputHostApiStreamInfo(NULL); + + outputDevice = pa.getDefaultOutputDevice(); // default output device + if (outputDevice == paNoDevice) + { + fprintf(stderr,"Error: No default output device.\n"); + goto error; + } + err = pa.setOutputDevice(inputDevice); + err = pa.setOutputChannelCount(2); // stereo input + err = pa.setOutputSampleFormat(PA_SAMPLE_TYPE); + err = pa.setOutputLatency(pa.getOutputDefaultLowLatency()); + pa.setOutputHostApiStreamInfo(NULL); - err = Pa_Initialize(); - if( err != paNoError ) goto error; - - inputParameters.device = Pa_GetDefaultInputDevice(); /* default input device */ - if (inputParameters.device == paNoDevice) { - fprintf(stderr,"Error: No default input device.\n"); - goto error; - } - inputParameters.channelCount = 2; /* stereo input */ - inputParameters.sampleFormat = PA_SAMPLE_TYPE; - inputParameters.suggestedLatency = Pa_GetDeviceInfo( inputParameters.device )->defaultLowInputLatency; - inputParameters.hostApiSpecificStreamInfo = NULL; - - outputParameters.device = Pa_GetDefaultOutputDevice(); /* default output device */ - if (outputParameters.device == paNoDevice) { - fprintf(stderr,"Error: No default output device.\n"); - goto error; - } - outputParameters.channelCount = 2; /* stereo output */ - outputParameters.sampleFormat = PA_SAMPLE_TYPE; - outputParameters.suggestedLatency = Pa_GetDeviceInfo( outputParameters.device )->defaultLowOutputLatency; - outputParameters.hostApiSpecificStreamInfo = NULL; - - err = Pa_OpenStream( - &stream, - &inputParameters, - &outputParameters, - SAMPLE_RATE, - FRAMES_PER_BUFFER, - 0, /* paClipOff, */ /* we won't output out of range samples so don't bother clipping them */ - fuzzCallback, - NULL ); - if( err != paNoError ) goto error; - - err = Pa_StartStream( stream ); - if( err != paNoError ) goto error; + err = pa.setFramesPerBuffer(FRAMES_PER_BUFFER); + err = pa.setSampleRate(SAMPLE_RATE); + err = pa.setStreamFlags(0); + err = pa.setCallback(fuzzCallback); + err = pa.streamOpen(); + + if(err != paNoError) + { + goto error; + } + err = pa.streamStart(); + if(err != paNoError) + { + goto error; + } printf("Hit ENTER to stop program.\n"); getchar(); - err = Pa_CloseStream( stream ); - if( err != paNoError ) goto error; - + err = pa.streamClose(); + if( err != paNoError ) + { + goto error; + } printf("Finished. gNumNoInputs = %d\n", gNumNoInputs ); - Pa_Terminate(); + pa.terminate(); return 0; error: @@ -140,7 +363,8 @@ error: fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return -1; - return 0; + } #endif + diff --git a/fdmdv2/pa_test/pa_test.mk b/fdmdv2/pa_test/pa_test.mk index d95eb471..8306337d 100644 --- a/fdmdv2/pa_test/pa_test.mk +++ b/fdmdv2/pa_test/pa_test.mk @@ -13,7 +13,7 @@ CurrentFileName := CurrentFilePath := CurrentFileFullPath := User :=wittend -Date :=5/14/2012 +Date :=5/15/2012 CodeLitePath :="C:\Program Files\CodeLite" LinkerName :=g++ ArchiveTool :=ar rcus diff --git a/fdmdv2/pa_test/pa_test.project b/fdmdv2/pa_test/pa_test.project index 16ec14d7..28ec3f44 100644 --- a/fdmdv2/pa_test/pa_test.project +++ b/fdmdv2/pa_test/pa_test.project @@ -99,4 +99,7 @@ + + + -- 2.25.1