Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenaudio_resampler_acm.cpp
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_resampler_acm.cpp 00004 * PURPOSE: Sound recording 00005 * PROGRAMMERS: Marco Pagliaricci (irc: rendar) 00006 */ 00007 00008 00009 #include "stdafx.h" 00010 #include "audio_resampler_acm.hpp" 00011 #include <stdio.h> 00012 00013 00014 00015 _AUDIO_NAMESPACE_START_ 00016 00017 00021 00022 00023 void 00024 audio_resampler_acm::init_( void ) 00025 { 00026 00027 00028 00029 // 00030 // Zeroing structures 00031 // 00032 00033 ZeroMemory( &acm_header, sizeof( ACMSTREAMHEADER )); 00034 ZeroMemory( &wformat_src, sizeof( WAVEFORMATEX )); 00035 ZeroMemory( &wformat_dst, sizeof( WAVEFORMATEX )); 00036 00037 00038 00039 00040 // 00041 // Setting structures sizes 00042 // 00043 00044 acm_header.cbStruct = sizeof( ACMSTREAMHEADER ); 00045 wformat_src.cbSize = sizeof( WAVEFORMATEX ); 00046 wformat_dst.cbSize = sizeof( WAVEFORMATEX ); 00047 00048 00049 00050 00051 // 00052 // Setting WAVEFORMATEX structure parameters 00053 // according to `audio_format' in/out classes 00054 // 00055 00056 wformat_src.wFormatTag = WAVE_FORMAT_PCM; 00057 wformat_src.nSamplesPerSec = audfmt_in.sample_rate(); 00058 wformat_src.nChannels = audfmt_in.channels(); 00059 wformat_src.wBitsPerSample = audfmt_in.bits(); 00060 wformat_src.nAvgBytesPerSec = audfmt_in.byte_rate(); 00061 wformat_src.nBlockAlign = audfmt_in.block_align(); 00062 00063 00064 wformat_dst.wFormatTag = WAVE_FORMAT_PCM; 00065 wformat_dst.nSamplesPerSec = audfmt_out.sample_rate(); 00066 wformat_dst.nChannels = audfmt_out.channels(); 00067 wformat_dst.wBitsPerSample = audfmt_out.bits(); 00068 wformat_dst.nAvgBytesPerSec = audfmt_out.byte_rate(); 00069 wformat_dst.nBlockAlign = audfmt_out.block_align(); 00070 00071 00072 00073 // 00074 // Init acm structures completed successfull 00075 // 00076 } 00077 00078 00079 00080 00081 00082 00083 00084 00085 00086 00087 00091 00092 00093 00094 00095 void 00096 audio_resampler_acm::open( void ) 00097 { 00098 00099 00100 MMRESULT err; 00101 00102 00103 // 00104 // Opens ACM stream 00105 // 00106 00107 err = acmStreamOpen( &acm_stream, 0, &wformat_src, &wformat_dst, 00108 0, 0, 0, ACM_STREAMOPENF_NONREALTIME ); 00109 00110 00111 if ( err != MMSYSERR_NOERROR ) 00112 { 00113 //TODO: throw error 00114 MessageBox( 0, _T("acmOpen error: %i"), _T("ERROR"), MB_ICONERROR ); 00115 00116 } 00117 00118 00119 00120 // 00121 // Calcs source buffer lenght 00122 // 00123 00124 src_buflen = ( unsigned int ) 00125 (( float )audfmt_in.byte_rate() * ( float )buf_secs ); 00126 00127 00128 00129 00130 00131 00132 // 00133 // Calcs destination source buffer lenght 00134 // with help of ACM apis 00135 // 00136 00137 err = acmStreamSize( acm_stream, 00138 src_buflen, &dst_buflen, ACM_STREAMSIZEF_SOURCE ); 00139 00140 00141 if ( err != MMSYSERR_NOERROR ) 00142 { 00143 //TODO: throw error 00144 MessageBox( 0, _T("acmStreamSize error"), _T("ERROR"), MB_ICONERROR ); 00145 00146 00147 } 00148 00149 00150 00151 // 00152 // Initialize ACMSTREAMHEADER structure, 00153 // and alloc memory for source and destination 00154 // buffers. 00155 // 00156 00157 acm_header.fdwStatus = 0; 00158 acm_header.dwUser = 0; 00159 00160 00161 acm_header.pbSrc = ( LPBYTE ) new BYTE [ src_buflen ]; 00162 acm_header.cbSrcLength = src_buflen; 00163 acm_header.cbSrcLengthUsed = 0; 00164 acm_header.dwSrcUser = src_buflen; 00165 00166 00167 acm_header.pbDst = ( LPBYTE ) new BYTE [ dst_buflen ]; 00168 acm_header.cbDstLength = dst_buflen; 00169 acm_header.cbDstLengthUsed = 0; 00170 acm_header.dwDstUser = dst_buflen; 00171 00172 00173 00174 00175 // 00176 // Give ACMSTREAMHEADER initialized correctly to the 00177 // driver. 00178 // 00179 00180 err = acmStreamPrepareHeader( acm_stream, &acm_header, 0L ); 00181 00182 if ( err != MMSYSERR_NOERROR ) 00183 { 00184 //TODO: throw error 00185 MessageBox( 0, _T("acmStreamPrepareHeader error"), _T("ERROR"), MB_ICONERROR ); 00186 00187 00188 } 00189 00190 00191 00192 00193 // 00194 // ACM stream successfully opened. 00195 // 00196 00197 stream_opened = true; 00198 00199 } 00200 00201 00202 00203 00204 void 00205 audio_resampler_acm::close( void ) 00206 { 00207 00208 00209 MMRESULT err; 00210 00211 00212 if ( acm_stream ) 00213 { 00214 00215 if ( acm_header.fdwStatus & ACMSTREAMHEADER_STATUSF_PREPARED ) 00216 { 00217 00218 acm_header.cbSrcLength = src_buflen; 00219 acm_header.cbDstLength = dst_buflen; 00220 00221 err = acmStreamUnprepareHeader( acm_stream, &acm_header, 0L ); 00222 00223 00224 if ( err != MMSYSERR_NOERROR ) 00225 { 00226 00227 // 00228 // Free buffer memory 00229 // 00230 00231 if ( acm_header.pbSrc != 0 ) 00232 delete[] acm_header.pbSrc; 00233 00234 if ( acm_header.pbDst != 0 ) 00235 delete[] acm_header.pbDst; 00236 00237 00238 // 00239 // Re-init structures 00240 // 00241 00242 init_(); 00243 00244 // 00245 // Updating status 00246 // 00247 00248 stream_opened = false; 00249 00250 00251 //TODO: throw error 00252 MessageBox( 0, _T("acmStreamUnPrepareHeader error"), _T("ERROR"), MB_ICONERROR ); 00253 00254 00255 } 00256 } 00257 00258 00259 err = acmStreamClose( acm_stream, 0 ); 00260 acm_stream = 0; 00261 00262 if ( err != MMSYSERR_NOERROR ) 00263 { 00264 00265 // 00266 // Free buffer memory 00267 // 00268 00269 if ( acm_header.pbSrc != 0 ) 00270 delete[] acm_header.pbSrc; 00271 00272 if ( acm_header.pbDst != 0 ) 00273 delete[] acm_header.pbDst; 00274 00275 00276 // 00277 // Re-init structures 00278 // 00279 00280 init_(); 00281 00282 00283 // 00284 // Updating status 00285 // 00286 00287 stream_opened = false; 00288 00289 00290 //TODO: throw error! 00291 00292 MessageBox( 0, _T("acmStreamClose error"), _T("ERROR"), MB_ICONERROR ); 00293 00294 00295 } 00296 00297 00298 }//if acm_stream != 0 00299 00300 00301 00302 00303 00304 00305 // 00306 // Free buffer memory 00307 // 00308 00309 if ( acm_header.pbSrc != 0 ) 00310 delete[] acm_header.pbSrc; 00311 00312 if ( acm_header.pbDst != 0 ) 00313 delete[] acm_header.pbDst; 00314 00315 00316 // 00317 // Re-init structures 00318 // 00319 00320 init_(); 00321 00322 00323 // 00324 // Updating status 00325 // 00326 00327 stream_opened = false; 00328 00329 00330 00331 // 00332 // ACM sream successfully closed. 00333 // 00334 00335 00336 } 00337 00338 00339 00340 00341 void 00342 audio_resampler_acm::audio_receive( unsigned char * data, unsigned int size ) 00343 { 00344 00345 MMRESULT err; 00346 00347 // 00348 // Checking for acm stream opened 00349 // 00350 00351 if ( stream_opened ) 00352 { 00353 00354 00355 // 00356 // Copy audio data from extern to 00357 // internal source buffer 00358 // 00359 00360 memcpy( acm_header.pbSrc, data, size ); 00361 00362 00363 acm_header.cbSrcLength = size; 00364 acm_header.cbDstLengthUsed = 0; 00365 00366 err = acmStreamConvert( acm_stream, &acm_header, ACM_STREAMCONVERTF_BLOCKALIGN ); 00367 00368 if ( err != MMSYSERR_NOERROR ) 00369 { 00370 //TODO: throw error 00371 MessageBox( 0, _T("acmStreamConvert error"), _T("ERROR"), MB_ICONERROR ); 00372 00373 00374 } 00375 00376 00377 // 00378 // Wait for sound conversion 00379 // 00380 00381 while(( ACMSTREAMHEADER_STATUSF_DONE & acm_header.fdwStatus ) == 0 ); 00382 00383 00384 00385 00386 00387 // 00388 // Copy resampled audio, to destination buffer. 00389 // 00390 00391 //memcpy( pbOutputData, acm_header.pbDst, acm_header.cbDstLengthUsed ); 00392 00393 00394 } 00395 00396 } 00397 00398 00399 00400 00401 00402 00403 00404 00405 00406 00407 _AUDIO_NAMESPACE_END_ Generated on Sat May 26 2012 04:16:26 for ReactOS by
1.7.6.1
|