Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenaudio_wavein.hpp
Go to the documentation of this file.
00001 /* PROJECT: ReactOS sndrec32 00002 * LICENSE: GPL - See COPYING in the top level directory 00003 * FILE: base/applications/sndrec32/audio_wavein.hpp 00004 * PURPOSE: Windows MM wave in abstraction 00005 * PROGRAMMERS: Marco Pagliaricci (irc: rendar) 00006 */ 00007 00008 00009 #ifndef _AUDIOWAVEIN_H_ 00010 #define _AUDIOWAVEIN_H_ 00011 00012 00013 00014 #include "audio_def.hpp" 00015 #include "audio_format.hpp" 00016 #include "audio_receiver.hpp" 00017 00018 00019 00020 _AUDIO_NAMESPACE_START_ 00021 00022 00023 00024 00025 enum audio_wavein_status { WAVEIN_NOTREADY, WAVEIN_READY, 00026 WAVEIN_RECORDING, WAVEIN_ERR, 00027 WAVEIN_STOP, WAVEIN_FLUSHING 00028 00029 }; 00030 00031 00032 00033 00034 00035 class audio_wavein 00036 { 00037 private: 00038 00039 00040 00041 // 00042 // The new recording thread sends message to this procedure 00043 // about open recording, close, and sound data recorded 00044 // 00045 00046 static DWORD WINAPI recording_procedure( LPVOID ); 00047 00048 // 00049 // When this event is signaled, then the previsiously created 00050 // recording thread will wake up and start recording audio 00051 // and will pass audio data to an `audio_receiver' object. 00052 // 00053 00054 HANDLE wakeup_recthread; 00055 HANDLE data_flushed_event; 00056 00057 00058 00059 00060 protected: 00061 00062 00063 //TODO: puts these structs in private?! 00064 00065 00066 00067 00068 // 00069 // Audio wavein device stuff 00070 // 00071 00072 WAVEFORMATEX wave_format; 00073 WAVEHDR * wave_headers; 00074 HWAVEIN wavein_handle; 00075 00076 00077 00078 00079 00080 audio_format aud_info; 00081 00082 audio_receiver & audio_rcvd; 00083 00084 00085 00086 // 00087 // Audio Recorder Thread id 00088 // 00089 00090 DWORD recthread_id; 00091 00092 00093 00094 00095 // 00096 // Object status 00097 // 00098 00099 audio_wavein_status status; 00100 00101 00102 00103 00104 00105 00106 00107 // 00108 // How many seconds of audio 00109 // can record the internal buffer 00110 // before flushing audio data 00111 // to the `audio_receiver' class? 00112 // 00113 00114 float buf_secs; 00115 00116 00117 // 00118 // The temporary buffers for the audio 00119 // data incoming from the wavein device 00120 // and its size, and its total number. 00121 // 00122 00123 BYTE * main_buffer; 00124 unsigned int mb_size; 00125 00126 unsigned int buffers; 00127 00128 00129 00130 00131 00132 // 00133 // Protected Functions 00134 // 00135 00136 00137 //initialize all structures and variables. 00138 void init_( void ); 00139 00140 void alloc_buffers_mem_( unsigned int, float ); 00141 void free_buffers_mem_( void ); 00142 00143 void init_headers_( void ); 00144 void prep_headers_( void ); 00145 void unprep_headers_( void ); 00146 void add_buffers_to_driver_( void ); 00147 00148 00149 00150 00151 00152 00153 00154 public: 00155 00156 00157 // 00158 // Ctors 00159 // 00160 00161 audio_wavein( 00162 const audio_format & a_info, audio_receiver & a_receiver ) 00163 00164 : wave_headers( 0 ), 00165 aud_info( a_info ), audio_rcvd( a_receiver ), 00166 status( WAVEIN_NOTREADY ), main_buffer( 0 ), mb_size( 0 ), 00167 buffers( _AUDIO_DEFAULT_WAVEINBUFFERS ) 00168 { 00169 00170 // 00171 // Initializing internal wavein data 00172 // 00173 00174 00175 init_(); 00176 00177 aud_info = a_info; 00178 } 00179 00180 00181 00182 00183 00184 00185 00186 // 00187 // Dtor 00188 // 00189 00190 ~audio_wavein( void ) 00191 { 00192 00193 //close(); TODO! 00194 00195 } 00196 00197 00198 00199 // 00200 // Public functions 00201 // 00202 00203 void open( void ); 00204 void close ( void ); 00205 00206 00207 void start_recording( void ); 00208 void stop_recording( void ); 00209 00210 00211 00212 audio_wavein_status current_status ( void ) const 00213 { 00214 return status; 00215 } 00216 00217 float buffer_secs( void ) const 00218 { return buf_secs; } 00219 00220 00221 void buffer_secs( float bsecs ) 00222 { 00223 // 00224 // Some checking 00225 // 00226 00227 if ( bsecs <= 0 ) 00228 return; 00229 00230 00231 // 00232 // Set seconds lenght for each 00233 // buffer. 00234 // 00235 00236 buf_secs = bsecs; 00237 } 00238 00239 00240 unsigned int total_buffers( void ) const 00241 { return buffers; } 00242 00243 00244 00245 void total_buffers( unsigned int tot_bufs ) 00246 { 00247 00248 // 00249 // Some checking 00250 // 00251 00252 if ( tot_bufs == 0 ) 00253 return; 00254 00255 00256 // 00257 // Sets the number of total buffers. 00258 // 00259 00260 buffers = tot_bufs; 00261 } 00262 00263 00264 audio_format format( void ) const 00265 { return aud_info; } 00266 00267 00268 00269 00270 BYTE * buf( void ) { return main_buffer; } 00271 unsigned int bufsz( void ) { return mb_size; } 00272 00273 00274 unsigned int samplevalue_max( void ) 00275 { 00276 00277 if ( aud_info.bits() == 16 ) 00278 return (unsigned int )65535; 00279 00280 else if ( aud_info.bits() == 8 ) 00281 return (unsigned int)255; 00282 00283 else 00284 return 0; 00285 } 00286 00287 00288 unsigned tot_samples_buf( void ) 00289 { 00290 00291 00292 return aud_info.samples_in_bytes( mb_size ); 00293 00294 00295 } 00296 00297 unsigned int nsample ( unsigned int nsamp ) 00298 { 00299 00300 00301 unsigned int svalue; 00302 00303 00304 00305 if ( aud_info.bits() == 16 ) 00306 svalue = ( unsigned int ) abs( *(( short * ) (main_buffer + aud_info.bytes_in_samples( nsamp )))); 00307 else if ( aud_info.bits() == 8 ) 00308 svalue = (unsigned int)(( ptrdiff_t ) *(main_buffer + aud_info.bytes_in_samples( nsamp ))); 00309 00310 else 00311 svalue = 0; 00312 00313 return svalue; 00314 00315 } 00316 00317 00318 }; 00319 00320 00321 00322 00323 _AUDIO_NAMESPACE_END_ 00324 00325 00326 00327 00328 #endif //ifdef _AUDIOWAVEIN_H_ Generated on Sun May 27 2012 04:17:43 for ReactOS by
1.7.6.1
|