PACLAMCallbacks.cxx

Go to the documentation of this file.
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 

Generated on Tue Aug 12 22:33:43 2008 for CLAM by  doxygen 1.5.5