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; 
  } 
}