CLAM-Development
1.1
|
00001 /* 00002 * Copyright (c) 2004 MUSIC TECHNOLOGY GROUP (MTG) 00003 * UNIVERSITAT POMPEU FABRA 00004 * 00005 * 00006 * This program is free software; you can redistribute it and/or modify 00007 * it under the terms of the GNU General Public License as published by 00008 * the Free Software Foundation; either version 2 of the License, or 00009 * (at your option) any later version. 00010 * 00011 * This program is distributed in the hope that it will be useful, 00012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00014 * GNU General Public License for more details. 00015 * 00016 * You should have received a copy of the GNU General Public License 00017 * along with this program; if not, write to the Free Software 00018 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00019 * 00020 */ 00021 00022 #include "PACLAMCallbacks.hxx" 00023 #include "DoubleBuffer.hxx" 00024 #include "CLAM_windows.h" 00025 #include "PAAudioStream.hxx" 00026 #undef GetClassName 00027 #include <iostream> 00028 00029 namespace CLAM 00030 { 00031 int monoOutCallback( const void *inputBuffer, void *outputBuffer, 00032 unsigned long framesPerBuffer, 00033 const PaStreamCallbackTimeInfo *timeInfo, 00034 PaStreamCallbackFlags statusFlags, void *userData ) 00035 { 00036 DoubleBuffer* dblBuff = ( DoubleBuffer* ) userData; 00037 static unsigned short last_time_token = 1; 00038 static unsigned short time_token = 1; 00039 00040 WaitForSingleObject( dblBuff->mBackBufferReady, INFINITE ); 00041 00042 short* dst = (short*) outputBuffer; 00043 short* src = (short*) dblBuff->mBackBuffer; 00044 unsigned bufflen = dblBuff->mLen; 00045 00046 // assuming one frame, already converted from float 00047 // to short 00048 00049 while ( bufflen-- ) 00050 { 00051 *dst++ = *src++; 00052 } 00053 00054 ResetEvent( dblBuff->mBackBufferReady ); 00055 00056 return 0; 00057 } 00058 00059 int stereoOutCallback( const void *inputBuffer, void *outputBuffer, 00060 unsigned long framesPerBuffer, 00061 const PaStreamCallbackTimeInfo *timeInfo, 00062 PaStreamCallbackFlags statusFlags, void *userData ) 00063 { 00064 DoubleBuffer* dblBuff = ( DoubleBuffer* ) userData; 00065 00066 00067 WaitForSingleObject( dblBuff->mBackBufferReady, INFINITE ); 00068 00069 short* dst = (short*) outputBuffer; 00070 short* src = (short*) dblBuff->mBackBuffer; 00071 00072 00073 // assuming two frame, already converted from float 00074 // to short 00075 00076 // We unroll the loop 00077 00078 unsigned bufflen = dblBuff->mLen >> 1; // division by two 00079 00080 while ( bufflen-- ) 00081 { 00082 *dst++ = *src++; 00083 *dst++ = *src++; 00084 } 00085 00086 ResetEvent( dblBuff->mBackBufferReady ); 00087 00088 return 0; 00089 } 00090 00091 int multiOutCallback( const void *inputBuffer, void *outputBuffer, 00092 unsigned long framesPerBuffer, 00093 const PaStreamCallbackTimeInfo *timeInfo, 00094 PaStreamCallbackFlags statusFlags, void *userData ) 00095 { 00096 DoubleBuffer* dblBuff = ( DoubleBuffer* ) userData; 00097 00098 WaitForSingleObject( dblBuff->mBackBufferReady, INFINITE ); 00099 00100 short* dst = (short*) outputBuffer; 00101 short* src = (short*) dblBuff->mBackBuffer; 00102 00103 // assuming one frame, already converted from float 00104 // to short 00105 // no loop unrolling here :( 00106 unsigned bufflen = dblBuff->mLen; 00107 while ( bufflen-- ) 00108 { 00109 *dst++ = *src++; 00110 } 00111 00112 ResetEvent( dblBuff->mBackBufferReady ); 00113 00114 return 0; 00115 00116 } 00117 00118 int monoInCallback( const void *inputBuffer, void *outputBuffer, 00119 unsigned long framesPerBuffer, 00120 const PaStreamCallbackTimeInfo *timeInfo, 00121 PaStreamCallbackFlags statusFlags, void *userData ) 00122 { 00123 DoubleBuffer* dblBuff = ((PAAudioStreamConfig*) userData)->GetInputDblBuffer(); 00124 00125 short* src = (short*) inputBuffer; 00126 short* dst = (short*) dblBuff->mFrontBuffer; 00127 00128 unsigned bufflen = dblBuff->mLen; 00129 00130 while ( bufflen-- ) 00131 *dst++ = *src++; 00132 00133 dblBuff->SwapBuffers(); 00134 00135 return 0; 00136 } 00137 00138 int stereoInCallback( const void *inputBuffer, void *outputBuffer, 00139 unsigned long framesPerBuffer, 00140 const PaStreamCallbackTimeInfo *timeInfo, 00141 PaStreamCallbackFlags statusFlags, void *userData ) 00142 { 00143 DoubleBuffer* dblBuff = ((PAAudioStreamConfig*) userData)->GetInputDblBuffer(); 00144 00145 short* src = (short*) inputBuffer; 00146 short* dst = (short*) dblBuff->mFrontBuffer; 00147 00148 00149 unsigned bufflen = dblBuff->mLen >> 1; 00150 00151 00152 while ( bufflen-- ) 00153 { 00154 *dst++ = *src++; 00155 *dst++ = *src++; 00156 } 00157 00158 dblBuff->SwapBuffers(); 00159 return 0; 00160 } 00161 00162 int multiInCallback( const void *inputBuffer, void *outputBuffer, 00163 unsigned long framesPerBuffer, 00164 const PaStreamCallbackTimeInfo *timeInfo, 00165 PaStreamCallbackFlags statusFlags, void *userData ) 00166 { 00167 PAAudioStreamConfig *stream = (PAAudioStreamConfig*) userData; 00168 00169 short* dst = (short*) stream->GetInputDblBuffer()->mFrontBuffer; 00170 unsigned long bufferSize = framesPerBuffer; 00171 bufferSize *= (stream->GetChannelNumber() << 1); // 2 bytes per sample 00172 00173 memcpy(dst, inputBuffer, bufferSize); 00174 stream->GetInputDblBuffer()->SwapBuffers(); 00175 00176 return paContinue; 00177 } 00178 00179 int stereoFDCallback( const void *inputBuffer, void *outputBuffer, 00180 unsigned long framesPerBuffer, 00181 const PaStreamCallbackTimeInfo *timeInfo, 00182 PaStreamCallbackFlags statusFlags, void *userData ) 00183 { 00184 00185 FullDuplexDoubleBuffer* buff = ( FullDuplexDoubleBuffer*) userData; 00186 00187 short* src = (short*) inputBuffer; 00188 short* dst = (short*) buff->mInputDblBuff->mFrontBuffer; 00189 00190 00191 unsigned bufflen = buff->mInputDblBuff->mLen >> 1; 00192 00193 00194 while ( bufflen-- ) 00195 { 00196 *dst++ = *src++; 00197 *dst++ = *src++; 00198 } 00199 00200 buff->mInputDblBuff->SwapBuffers(); 00201 00202 WaitForSingleObject( buff->mOutputDblBuff->mBackBufferReady, INFINITE ); 00203 00204 //buff->mOutputDblBuff->mBackBufferReady = false; 00205 00206 dst = (short*) outputBuffer; 00207 src = (short*) buff->mInputDblBuff->mBackBuffer; 00208 00209 00210 // assuming two frame, already converted from float 00211 // to short 00212 00213 // We unroll the loop 00214 00215 bufflen = buff->mOutputDblBuff->mLen >> 1; // division by two 00216 00217 while ( bufflen-- ) 00218 { 00219 *dst++ = *src++; 00220 *dst++ = *src++; 00221 } 00222 00223 ResetEvent( buff->mOutputDblBuff->mBackBufferReady ); 00224 00225 return 0; 00226 00227 } 00228 00229 } 00230