ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

audio_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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.