Index: audio_resampler_acm.cpp =================================================================== --- audio_resampler_acm.cpp (revision 44336) +++ audio_resampler_acm.cpp (working copy) @@ -1,75 +1,69 @@ -/* - * PROJECT: ReactOS Sound Record Application - * LICENSE: GPL - See COPYING in the top level directory - * FILE: base/applications/sndrec32/audio_resampler_acm.cpp - * PURPOSE: Audio Resampler - * PROGRAMMERS: Marco Pagliaricci - */ - -#include "stdafx.h" +#include "StdAfx.h" #include "audio_resampler_acm.hpp" + + _AUDIO_NAMESPACE_START_ - ///////////////////////////////////////// - /////// Private Functions //////// - ///////////////////////////////////////// +///////////////////////////////////////// +/////// Private Functions //////// +///////////////////////////////////////// - void - audio_resampler_acm::init_( void ) +void +audio_resampler_acm::init_( void ) { - // - // Zeroing structures - // + // + // Zeroing structures + // - ZeroMemory( &acm_header, sizeof( ACMSTREAMHEADER )); - ZeroMemory( &wformat_src, sizeof( WAVEFORMATEX )); - ZeroMemory( &wformat_dst, sizeof( WAVEFORMATEX )); + ZeroMemory( &acm_header, sizeof( ACMSTREAMHEADER )); + ZeroMemory( &wformat_src, sizeof( WAVEFORMATEX )); + ZeroMemory( &wformat_dst, sizeof( WAVEFORMATEX )); + + + // + // Setting structures sizes + // + acm_header.cbStruct = sizeof( ACMSTREAMHEADER ); + wformat_src.cbSize = sizeof( WAVEFORMATEX ); + wformat_dst.cbSize = sizeof( WAVEFORMATEX ); - // - // Setting structures sizes - // - acm_header.cbStruct = sizeof( ACMSTREAMHEADER ); - wformat_src.cbSize = sizeof( WAVEFORMATEX ); - wformat_dst.cbSize = sizeof( WAVEFORMATEX ); + // + // Setting WAVEFORMATEX structure parameters + // according to `audio_format' in/out classes + // + wformat_src.wFormatTag = WAVE_FORMAT_PCM; + wformat_src.nSamplesPerSec = audfmt_in.sample_rate(); + wformat_src.nChannels = audfmt_in.channels(); + wformat_src.wBitsPerSample = audfmt_in.bits(); + wformat_src.nAvgBytesPerSec = audfmt_in.byte_rate(); + wformat_src.nBlockAlign = audfmt_in.block_align(); - // - // Setting WAVEFORMATEX structure parameters - // according to `audio_format' in/out classes - // - wformat_src.wFormatTag = WAVE_FORMAT_PCM; - wformat_src.nSamplesPerSec = audfmt_in.sample_rate(); - wformat_src.nChannels = audfmt_in.channels(); - wformat_src.wBitsPerSample = audfmt_in.bits(); - wformat_src.nAvgBytesPerSec = audfmt_in.byte_rate(); - wformat_src.nBlockAlign = audfmt_in.block_align(); + wformat_dst.wFormatTag = WAVE_FORMAT_PCM; + wformat_dst.nSamplesPerSec = audfmt_out.sample_rate(); + wformat_dst.nChannels = audfmt_out.channels(); + wformat_dst.wBitsPerSample = audfmt_out.bits(); + wformat_dst.nAvgBytesPerSec = audfmt_out.byte_rate(); + wformat_dst.nBlockAlign = audfmt_out.block_align(); - wformat_dst.wFormatTag = WAVE_FORMAT_PCM; - wformat_dst.nSamplesPerSec = audfmt_out.sample_rate(); - wformat_dst.nChannels = audfmt_out.channels(); - wformat_dst.wBitsPerSample = audfmt_out.bits(); - wformat_dst.nAvgBytesPerSec = audfmt_out.byte_rate(); - wformat_dst.nBlockAlign = audfmt_out.block_align(); - - - // - // Init acm structures completed successfull - // + // + // Init acm structures completed successfull + // } @@ -90,71 +84,72 @@ void - audio_resampler_acm::open( void ) +audio_resampler_acm::open( void ) { - MMRESULT err; + MMRESULT err; - // - // Opens ACM stream - // + // + // Opens ACM stream + // - err = acmStreamOpen( &acm_stream, 0, &wformat_src, &wformat_dst, - 0, 0, 0, ACM_STREAMOPENF_NONREALTIME ); + err = acmStreamOpen( &acm_stream, 0, &wformat_src, &wformat_dst, + 0, 0, 0, ACM_STREAMOPENF_NONREALTIME ); - if ( err != MMSYSERR_NOERROR ) - { - //TODO: throw error - printf("acmOpen error: %i\n", err); + if ( err != MMSYSERR_NOERROR ) + { + //TODO: throw error + MessageBox( 0, _T("acmOpen error: %i"), _T("ERROR"), MB_ICONERROR ); - } + } - // - // Calcs source buffer lenght - // + // + // Calcs source buffer lenght + // - src_buflen = ( unsigned int ) - (( float )audfmt_in.byte_rate() * ( float )buf_secs ); + src_buflen = ( unsigned int ) + (( float )audfmt_in.byte_rate() * ( float )buf_secs ); + + + + + // + // Calcs destination source buffer lenght + // with help of ACM apis + // + err = acmStreamSize( acm_stream, + src_buflen, &dst_buflen, ACM_STREAMSIZEF_SOURCE ); + + if ( err != MMSYSERR_NOERROR ) + { + //TODO: throw error + MessageBox( 0, _T("acmSize error"), _T("ERROR"), MB_ICONERROR ); - // - // Calcs destination source buffer lenght - // with help of ACM apis - // + } - err = acmStreamSize( acm_stream, - src_buflen, &dst_buflen, ACM_STREAMSIZEF_SOURCE ); - if ( err != MMSYSERR_NOERROR ) - { - //TODO: throw error - printf("acmSize error\n"); + // + // Initialize ACMSTREAMHEADER structure, + // and alloc memory for source and destination + // buffers. + // - } + acm_header.fdwStatus = 0; + acm_header.dwUser = 0; - - - // - // Initialize ACMSTREAMHEADER structure, - // and alloc memory for source and destination - // buffers. - // - - acm_header.fdwStatus = 0; - acm_header.dwUser = 0; - - - acm_header.pbSrc = ( LPBYTE ) new BYTE [ src_buflen ]; + + acm_header.pbSrc = ( LPBYTE ) new BYTE [ src_buflen ]; acm_header.cbSrcLength = src_buflen; acm_header.cbSrcLengthUsed = 0; acm_header.dwSrcUser = src_buflen; @@ -168,158 +163,165 @@ - // - // Give ACMSTREAMHEADER initialized correctly to the - // driver. - // + // + // Give ACMSTREAMHEADER initialized correctly to the + // driver. + // - err = acmStreamPrepareHeader( acm_stream, &acm_header, 0L ); + err = acmStreamPrepareHeader( acm_stream, &acm_header, 0L ); - if ( err != MMSYSERR_NOERROR ) - { - //TODO: throw error - printf("prep. header error\n"); - } + if ( err != MMSYSERR_NOERROR ) + { + //TODO: throw error + MessageBox( 0, _T("acmStreamPrepareHeader error"), _T("ERROR"), MB_ICONERROR ); + } - // - // ACM stream successfully opened. - // - stream_opened = true; + // + // ACM stream successfully opened. + // + + stream_opened = true; + } void - audio_resampler_acm::close( void ) +audio_resampler_acm::close( void ) { - MMRESULT err; + MMRESULT err; - if ( acm_stream ) - { + if ( acm_stream ) + { - if ( acm_header.fdwStatus & ACMSTREAMHEADER_STATUSF_PREPARED ) - { + if ( acm_header.fdwStatus & ACMSTREAMHEADER_STATUSF_PREPARED ) + { - acm_header.cbSrcLength = src_buflen; + acm_header.cbSrcLength = src_buflen; acm_header.cbDstLength = dst_buflen; err = acmStreamUnprepareHeader( acm_stream, &acm_header, 0L ); + + if ( err != MMSYSERR_NOERROR ) + { + + // + // Free buffer memory + // - if ( err != MMSYSERR_NOERROR ) - { + if ( acm_header.pbSrc != 0 ) + delete[] acm_header.pbSrc; - // - // Free buffer memory - // + if ( acm_header.pbDst != 0 ) + delete[] acm_header.pbDst; - if ( acm_header.pbSrc != 0 ) - delete[] acm_header.pbSrc; - if ( acm_header.pbDst != 0 ) - delete[] acm_header.pbDst; + // + // Re-init structures + // + init_(); - // - // Re-init structures - // + // + // Updating status + // - init_(); + stream_opened = false; - // - // Updating status - // - stream_opened = false; + //TODO: throw error + MessageBox( 0, _T("acmStreamUnPrepareHeader error"), _T("ERROR"), MB_ICONERROR ); + + } + } - //TODO: throw error - } - } + err = acmStreamClose( acm_stream, 0 ); + acm_stream = 0; + if ( err != MMSYSERR_NOERROR ) + { - err = acmStreamClose( acm_stream, 0 ); - acm_stream = 0; + // + // Free buffer memory + // - if ( err != MMSYSERR_NOERROR ) - { + if ( acm_header.pbSrc != 0 ) + delete[] acm_header.pbSrc; - // - // Free buffer memory - // + if ( acm_header.pbDst != 0 ) + delete[] acm_header.pbDst; - if ( acm_header.pbSrc != 0 ) - delete[] acm_header.pbSrc; - if ( acm_header.pbDst != 0 ) - delete[] acm_header.pbDst; + // + // Re-init structures + // + init_(); - // - // Re-init structures - // - init_(); + // + // Updating status + // + stream_opened = false; - // - // Updating status - // - stream_opened = false; + //TODO: throw error! + MessageBox( 0, _T("acmStreamClose error"), _T("ERROR"), MB_ICONERROR ); - //TODO: throw error! - } + } - }//if acm_stream != 0 + }//if acm_stream != 0 - // - // Free buffer memory - // + // + // Free buffer memory + // - if ( acm_header.pbSrc != 0 ) - delete[] acm_header.pbSrc; + if ( acm_header.pbSrc != 0 ) + delete[] acm_header.pbSrc; - if ( acm_header.pbDst != 0 ) - delete[] acm_header.pbDst; + if ( acm_header.pbDst != 0 ) + delete[] acm_header.pbDst; - // - // Re-init structures - // + // + // Re-init structures + // - init_(); + init_(); - // - // Updating status - // + // + // Updating status + // - stream_opened = false; + stream_opened = false; - // - // ACM sream successfully closed. - // + // + // ACM sream successfully closed. + // } @@ -328,60 +330,70 @@ void - audio_resampler_acm::audio_receive( unsigned char * data, unsigned int size ) +audio_resampler_acm::audio_receive( unsigned char * data, unsigned int size ) { - MMRESULT err; + MMRESULT err; - // - // Checking for acm stream opened - // + // + // Checking for acm stream opened + // - if ( stream_opened ) - { + if ( stream_opened ) + { + + // + // Copy audio data from extern to + // internal source buffer + // - // - // Copy audio data from extern to - // internal source buffer - // + memcpy( acm_header.pbSrc, data, size ); - memcpy( acm_header.pbSrc, data, size ); + acm_header.cbSrcLength = size; + acm_header.cbDstLengthUsed = 0; - acm_header.cbSrcLength = size; - acm_header.cbDstLengthUsed = 0; + err = acmStreamConvert( acm_stream, &acm_header, ACM_STREAMCONVERTF_BLOCKALIGN ); - err = acmStreamConvert( acm_stream, &acm_header, ACM_STREAMCONVERTF_BLOCKALIGN ); + if ( err != MMSYSERR_NOERROR ) + { + //TODO: throw error + MessageBox( 0, _T("acmStreamConvert error"), _T("ERROR"), MB_ICONERROR ); - if ( err != MMSYSERR_NOERROR ) - { - //TODO: throw error - printf("acm convert error\n"); - } + } - // - // Wait for sound conversion - // + // + // Wait for sound conversion + // - while(( ACMSTREAMHEADER_STATUSF_DONE & acm_header.fdwStatus ) == 0 ); + while(( ACMSTREAMHEADER_STATUSF_DONE & acm_header.fdwStatus ) == 0 ); + + //printf("Processed successfully %i bytes of audio.\n", acm_header.cbDstLengthUsed ); + - printf("Processed successfully %lu bytes of audio.\n", acm_header.cbDstLengthUsed ); + // + // Copy resampled audio, to destination buffer. + // + //memcpy( pbOutputData, acm_header.pbDst, acm_header.cbDstLengthUsed ); - // - // Copy resampled audio, to destination buffer. - // - //memcpy( pbOutputData, acm_header.pbDst, acm_header.cbDstLengthUsed ); + } +} - } -} -_AUDIO_NAMESPACE_END_ + + + + + + + +_AUDIO_NAMESPACE_END_ \ No newline at end of file