wxWidgets/utils/wxMMedia/sndadpcm.cpp

119 lines
2.7 KiB
C++
Raw Normal View History

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