www.pudn.com > lib.zip > myaudio.C
#include#include #include #include "private.h" #include "myaudio.h" static audio *Audio; static coroutine *pco; static audio_pval pvals[] = { { AU_INPUT_RATE, AU_RATE_9600 }, { AU_OUTPUT_RATE, AU_RATE_9600 }, { AU_INPUT_SOURCE, AU_INPUT_LINE }, { AU_LEFT_INPUT_ATTEN, 0 }, { AU_RIGHT_INPUT_ATTEN, 0 }, { AU_SPEAKER_MUTE_CTL, 1 }, { AU_MONITOR_CTL, 0 }, { -1, -1 }, }; global int samplecount; global void openaudio() { Audio = new audio(AU_IN | AU_OUT | AU_LOCK | AU_SAVE, pvals); pco = NULL; samplecount = 0; } global void closeaudio() { delete Audio; } global void setduplex(int n) { Audio -> setduplex(n); } global void discardinput() { Audio -> idiscard(); } global void discardoutput() { Audio -> odiscard(); } global void flushoutput() { Audio -> oflush(); } global void inparallel(coroutine *co1, coroutine *co2) { coroutine *spco = pco; pco = co1; callco(co2); pco = spco; } inline void swapit() { coroutine *p = pco; if (p != NULL) { pco = currentco; callco(p); } } global float insample() { swapit(); samplecount++; return (float) (Audio -> read() * 2e-6f); } global void outsample(float x) { swapit(); if (x > 2.0f || x < -2.0f) { fprintf(stderr, "outsample value out of range: %f\r\n", x); abort(); } Audio -> write((int) (x * 2e6f)); /* hardware accepts signed 24-bit but reduce to limit power to line */ }