www.pudn.com > WMACompressor.zip > WmaWriter.cpp
// // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY // KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR // PURPOSE. IT CAN BE DISTRIBUTED FREE OF CHARGE AS LONG AS THIS HEADER // REMAINS UNCHANGED. // // Email: yetiicb@hotmail.com // // Copyright (C) 2002-2004 Idael Cardoso. // #include "StdAfx.h" #include ".\wmawriter.h" #include#using CWmaWriter::CWmaWriter(WAVEFORMATEX __nogc* pInFormat, IWMProfile __nogc* pProfile, IWMWriterSink __nogc* pSink) { if ( (pInFormat ==NULL) || (pProfile == NULL) || (pSink ==NULL) ) { AtlThrow(E_INVALIDARG); } m_MsAudioTime = 0; m_cAudioBytes = 0; m_AvgBytesPerSec = pInFormat->nAvgBytesPerSec; ATLTHROW_IF_FAILED(WMCreateWriter(NULL, &m_Writer)) CComPtr pWriterAdvanced; ATLTHROW_IF_FAILED(m_Writer.QueryInterface(&pWriterAdvanced)); ATLTHROW_IF_FAILED(pWriterAdvanced->AddSink(pSink)); m_Sink = pSink; ATLTHROW_IF_FAILED(m_Writer->SetProfile(pProfile)) DWORD cInputs = 0; ATLTHROW_IF_FAILED(m_Writer->GetInputCount(&cInputs)); CComPtr pProps; GUID InputType; WM_MEDIA_TYPE mt; mt.majortype = WMMEDIATYPE_Audio; mt.subtype = WMMEDIASUBTYPE_PCM; mt.bFixedSizeSamples = TRUE; mt.bTemporalCompression = FALSE; mt.lSampleSize = pInFormat->nBlockAlign; mt.formattype = WMFORMAT_WaveFormatEx; mt.pUnk = NULL; mt.cbFormat = sizeof( WAVEFORMATEX ) + pInFormat->cbSize; mt.pbFormat = (BYTE*)pInFormat; for(DWORD input = 0; input < cInputs; input++) { pProps = NULL; m_AudioInput = input; ATLTHROW_IF_FAILED(m_Writer->GetInputProps(input, &pProps)); ATLTHROW_IF_FAILED(pProps->GetType(&InputType)); if (InputType != WMMEDIATYPE_Audio) { AtlThrow(E_INVALIDARG); //Only Audio profile } ATLTHROW_IF_FAILED(pProps->SetMediaType(&mt)); ATLTHROW_IF_FAILED(m_Writer->SetInputProps(input, pProps)); } ATLTHROW_IF_FAILED(m_Writer->BeginWriting()); } CWmaWriter::~CWmaWriter(void) { if (m_Writer.p != NULL) { CComPtr pWriterAdvanced; m_Writer->EndWriting(); if( SUCCEEDED(m_Writer.QueryInterface(&pWriterAdvanced)) ) { pWriterAdvanced->RemoveSink(m_Sink); } } } void CWmaWriter::Write(INSSBuffer* pSample) { DWORD Length; pSample->GetLength(&Length); ATLTHROW_IF_FAILED(m_Writer->WriteSample(m_AudioInput, m_MsAudioTime * 10000, 0, pSample)); m_cAudioBytes += Length; m_MsAudioTime += MulDiv(Length, 1000, m_AvgBytesPerSec); } void CWmaWriter::Write(BYTE* pBuffer, DWORD Length) { if (m_Writer.p != NULL) { CComPtr pSample; BYTE* pSampleBuff; ATLTHROW_IF_FAILED(m_Writer->AllocateSample(Length, &pSample)); ATLTHROW_IF_FAILED(pSample->GetBuffer(&pSampleBuff)); memcpy(pSampleBuff, pBuffer, Length); ATLTHROW_IF_FAILED(pSample->SetLength(Length)); Write(pSample); } else { AtlThrow(E_POINTER); } } INSSBuffer* CWmaWriter::AllocateSample(DWORD Length) { if (m_Writer.p != NULL) { INSSBuffer* pSample = NULL; m_Writer->AllocateSample(Length, &pSample); return pSample; } else { return NULL; } }