git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1722 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			119 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			119 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#ifdef __GNUG__
 | 
						|
#pragma implementation "sndmulaw.h"
 | 
						|
#endif
 | 
						|
 | 
						|
#include "sndsnd.h"
 | 
						|
#include "sndfrmt.h"
 | 
						|
#include "sndadpcm.h"
 | 
						|
#include "adpcm/g72x.h"
 | 
						|
 | 
						|
wxSoundAdpcmCodec::wxSoundAdpcmCodec()
 | 
						|
  : wxSoundCodec()
 | 
						|
{
 | 
						|
  // TODO: For the moment, only 1 channel is supported.
 | 
						|
  m_codec_state = new g72x_state;
 | 
						|
  g72x_init_state(m_codec_state);
 | 
						|
}
 | 
						|
 | 
						|
wxSoundAdpcmCodec::~wxSoundAdpcmCodec()
 | 
						|
{
 | 
						|
}
 | 
						|
 | 
						|
void wxSoundAdpcmCodec::InitWith(const wxSoundDataFormat& format)
 | 
						|
{
 | 
						|
  m_srate = format.GetSampleRate();
 | 
						|
}
 | 
						|
 | 
						|
int wxSoundAdpcmCodec::GetBits(int nbits)
 | 
						|
{
 | 
						|
  unsigned int mask;
 | 
						|
  int bits;
 | 
						|
 | 
						|
  if (m_bits_waiting == 0)
 | 
						|
    m_current_byte = m_in_sound->GetChar();
 | 
						|
 | 
						|
  mask = (1 << nbits) - 1;
 | 
						|
  bits = m_current_byte & mask;
 | 
						|
  m_current_byte >>= nbits;
 | 
						|
  m_bits_waiting -= nbits;
 | 
						|
  return bits;
 | 
						|
}
 | 
						|
 | 
						|
void wxSoundAdpcmCodec::Decode()
 | 
						|
{
 | 
						|
  int smp, bits;
 | 
						|
  wxSoundDataFormat pref_frmt;
 | 
						|
 | 
						|
  pref_frmt = GetPreferredFormat(0);
 | 
						|
  if (!(m_io_format == pref_frmt))
 | 
						|
    ChainCodecAfter(pref_frmt);
 | 
						|
 | 
						|
  bits = GetBits(4);
 | 
						|
  if (m_io_format.GetByteOrder() == wxSND_SAMPLE_LE) {
 | 
						|
    while (!StreamOk()) {
 | 
						|
      smp = g721_decoder(bits, AUDIO_ENCODING_LINEAR, m_codec_state);
 | 
						|
      m_out_sound->PutChar(smp & 0x00ff);
 | 
						|
      m_out_sound->PutChar((smp & 0xff00) >> 8);
 | 
						|
      bits = GetBits(4);
 | 
						|
    }
 | 
						|
  } else {
 | 
						|
    while (!StreamOk()) {
 | 
						|
      smp = g721_decoder(bits, AUDIO_ENCODING_LINEAR, m_codec_state);
 | 
						|
      m_out_sound->PutChar((smp & 0xff00) >> 8);
 | 
						|
      m_out_sound->PutChar(smp & 0x00ff);
 | 
						|
      bits = GetBits(4);
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
void wxSoundAdpcmCodec::Encode()
 | 
						|
{
 | 
						|
/*
 | 
						|
  int smp;
 | 
						|
  wxSoundDataFormat pref_frmt;
 | 
						|
 | 
						|
  pref_frmt = GetPreferredFormat(0);
 | 
						|
  if (!(m_io_format == pref_frmt))
 | 
						|
    ChainCodecAfter(pref_frmt);
 | 
						|
 | 
						|
  bits = GetBits(4);
 | 
						|
  if (m_io_format.GetByteOrder() == wxSND_SAMPLE_LE) {
 | 
						|
    while (!StreamOk()) {
 | 
						|
      smp = g721_decoder(bits, AUDIO_ENCODING_LINEAR, codec_state);
 | 
						|
      m_out_sound->PutChar(smp & 0x00ff);
 | 
						|
      m_out_sound->PutChar((smp & 0xff00) >> 8);
 | 
						|
      bits = GetBits(4);
 | 
						|
    }
 | 
						|
  } else {
 | 
						|
    while (!StreamOk()) {
 | 
						|
      smp = g721_decoder(bits, AUDIO_ENCODING_LINEAR, codec_state);
 | 
						|
      m_out_sound->PutChar((smp & 0xff00) >> 8);
 | 
						|
      m_out_sound->PutChar(smp & 0x00ff);
 | 
						|
      bits = GetBits(4);
 | 
						|
    }
 | 
						|
  }
 | 
						|
*/
 | 
						|
}
 | 
						|
 | 
						|
size_t wxSoundAdpcmCodec::GetByteRate() const
 | 
						|
{
 | 
						|
  return (m_io_format.GetSampleRate() * m_io_format.GetChannels()) / 2;
 | 
						|
}
 | 
						|
 | 
						|
wxSoundDataFormat wxSoundAdpcmCodec::GetPreferredFormat(int WXUNUSED(no)) const
 | 
						|
{
 | 
						|
  wxSoundDataFormat format;
 | 
						|
 | 
						|
  format.SetCodecNo(WXSOUND_PCM);
 | 
						|
  format.SetSampleRate(m_srate);
 | 
						|
  format.SetBps(16);
 | 
						|
  format.SetChannels(1);
 | 
						|
  format.SetSign(wxSND_SAMPLE_SIGNED);
 | 
						|
#ifdef USE_BE_MACH
 | 
						|
  format.SetByteOrder(wxSND_SAMPLE_BE);
 | 
						|
#else
 | 
						|
  format.SetByteOrder(wxSND_SAMPLE_LE);
 | 
						|
#endif
 | 
						|
  return format;
 | 
						|
}
 |