+++ /dev/null
-////////////////////////////////////////////////////////////////////////////////
-// Name: sndfrmt.cpp
-// Purpose: wxMMedia
-// Author: Guilhem Lavaux
-// Created: 1998
-// Updated: December 1998
-// Copyright: (C) 1997, 1998, Guilhem Lavaux
-// License: wxWindows license
-////////////////////////////////////////////////////////////////////////////////
-#ifdef __GNUG__
-#pragma implementation "sndfrmt.h"
-#endif
-#include "sndsnd.h"
-#include "sndfrmt.h"
-#include "sndpcm.h"
-
-// ----------------------------------------------------------------------------
-// wxSoundDataFormat
-// ----------------------------------------------------------------------------
-
-wxSoundDataFormat::wxSoundDataFormat()
-{
- m_srate = 22050;
- m_bps = 8;
- m_channels = 1;
- m_codno = 1;
- m_codec = NULL;
- m_codchange = FALSE;
- m_codcreate = TRUE;
-}
-
-wxSoundDataFormat::wxSoundDataFormat(const wxSoundDataFormat& format)
-{
- m_srate = format.m_srate;
- m_bps = format.m_bps;
- m_channels = format.m_channels;
- m_codno = format.m_codno;
- m_sign = format.m_sign;
- m_byteorder = format.m_byteorder;
- m_codchange = FALSE;
- m_codcreate = TRUE;
- m_codec = NULL;
-}
-
-wxSoundDataFormat::~wxSoundDataFormat()
-{
- wxDELETE(m_codec);
-}
-
-void wxSoundDataFormat::SetChannels(int channels)
-{
- m_channels = channels;
-}
-
-void wxSoundDataFormat::SetBps(int bps)
-{
- m_bps = bps;
- CodecChange();
-}
-
-void wxSoundDataFormat::SetSign(int sign)
-{
- m_sign = sign;
- CodecChange();
-}
-
-void wxSoundDataFormat::SetByteOrder(int byteorder)
-{
- m_byteorder = byteorder;
- CodecChange();
-}
-
-void wxSoundDataFormat::SetCodecNo(int codno)
-{
- m_codno = codno;
- m_codchange = TRUE;
- CodecChange();
-}
-
-wxSoundCodec *wxSoundDataFormat::GetCodec()
-{
- if (!m_codcreate)
- return NULL;
-
- if (m_codchange)
- wxDELETE(m_codec);
-
- if (m_codec)
- return m_codec;
-
- m_codchange = FALSE;
- m_codec = wxSoundCodec::Get(m_codno);
- CodecChange();
-
- return m_codec;
-}
-
-void wxSoundDataFormat::CodecChange()
-{
- wxSoundCodec *codec = GetCodec();
-
- if (!codec)
- return;
-
- switch (m_codno) {
- case WXSOUND_PCM: {
- wxSoundPcmCodec *pcm_codec = (wxSoundPcmCodec *)codec;
-
- pcm_codec->m_orig_format.SetSampleRate(m_srate);
- pcm_codec->m_orig_format.SetBps(m_bps);
- pcm_codec->m_orig_format.SetChannels(m_channels);
- pcm_codec->m_orig_format.SetByteOrder(m_byteorder);
- pcm_codec->m_orig_format.SetSign(m_sign);
- break;
- }
- default:
- codec->InitWith(*this);
- break;
- }
-}
-
-wxSoundDataFormat& wxSoundDataFormat::operator =(const wxSoundDataFormat& format)
-{
- wxDELETE(m_codec);
-
- m_srate = format.m_srate;
- m_bps = format.m_bps;
- m_channels = format.m_channels;
- m_codno = format.m_codno;
- m_sign = format.m_sign;
- m_byteorder = format.m_byteorder;
-
- return *this;
-}
-
-bool wxSoundDataFormat::operator ==(const wxSoundDataFormat& format) const
-{
- if (m_codno != format.m_codno || m_srate != format.m_srate ||
- m_bps != format.m_bps || m_channels != format.m_channels)
- return FALSE;
-
- if (m_codno == WXSOUND_PCM &&
- (m_sign != format.m_sign || m_byteorder != format.m_byteorder))
- return FALSE;
-
- return TRUE;
-}
-
-// ----------------------------------------------------------------------------
-// wxSoundCodec
-// ----------------------------------------------------------------------------
-
-#include "sndpcm.h"
-#include "sndadpcm.h"
-//#include "sndalaw.h"
-#include "sndmulaw.h"
-
-static wxClassInfo *l_sound_formats[] = {
- NULL,
- CLASSINFO(wxSoundPcmCodec),
- CLASSINFO(wxSoundAdpcmCodec),
- NULL,
- NULL,
- NULL,
- NULL, // CLASSINFO(wxSoundAlawCodec),
- CLASSINFO(wxSoundMulawCodec)
-};
-
-static int l_nb_formats = WXSIZEOF(l_sound_formats);
-
-wxSoundCodec::wxSoundCodec()
-{
- m_in_sound = NULL;
- m_out_sound = NULL;
- m_init = TRUE;
- m_chain_codec = NULL;
-}
-
-wxSoundCodec::~wxSoundCodec()
-{
- if (m_mode != WAITING)
- ExitMode();
-}
-
-void wxSoundCodec::InitIO(const wxSoundDataFormat& format)
-{
- m_io_format = format;
-}
-
-void wxSoundCodec::InitMode(ModeType mode)
-{
- wxStreamBuffer *buf_snd;
-
- m_mode = mode;
- if (!m_chain_codec) {
- if (m_mode == ENCODING) {
- m_out_sound = new wxStreamBuffer(*this, wxStreamBuffer::write);
- m_out_sound->SetBufferIO(1024);
- } else {
- m_in_sound = new wxStreamBuffer(*this, wxStreamBuffer::read);
- m_in_sound->SetBufferIO(1024);
- }
- }
- if (m_chain_codec) {
- if (m_chain_before) {
- m_chain_codec->SetInStream(m_in_sound);
- buf_snd = new wxStreamBuffer(wxStreamBuffer::read_write);
- buf_snd->Fixed(FALSE);
- m_chain_codec->SetOutStream(buf_snd);
- m_chain_codec->Decode();
- buf_snd->Seek(0, wxFromStart);
- m_in_sound = buf_snd;
- } else {
- buf_snd = new wxStreamBuffer(wxStreamBuffer::read_write);
- buf_snd->Fixed(FALSE);
-
- m_chain_codec->SetInStream(buf_snd);
- m_chain_codec->SetOutStream(m_out_sound);
- m_out_sound = buf_snd;
-
- buf_snd->Seek(0, wxFromStart);
- }
- }
-}
-
-void wxSoundCodec::ExitMode()
-{
- if (m_chain_codec) {
- if (m_chain_before) {
- delete m_in_sound;
- m_in_sound = m_chain_codec->GetInStream();
- } else {
- delete m_out_sound;
- m_out_sound = m_chain_codec->GetOutStream();
- }
- }
- m_mode = WAITING;
-}
-
-bool wxSoundCodec::ChainCodecBefore(wxSoundDataFormat& format)
-{
- m_chain_codec = format.GetCodec();
-
- if (!m_chain_codec)
- return FALSE;
-
- m_chain_before = TRUE;
- return TRUE;
-}
-
-bool wxSoundCodec::ChainCodecAfter(wxSoundDataFormat& format)
-{
- m_chain_codec = format.GetCodec();
-
- if (!m_chain_codec)
- return FALSE;
-
- m_chain_before = FALSE;
- return TRUE;
-}
-
-void wxSoundCodec::CopyToOutput()
-{
- m_out_sound->Write(m_in_sound);
-}
-
-size_t wxSoundCodec::Available()
-{
- return m_io_sndbuf->Available();
-}
-
-size_t wxSoundCodec::OnSysRead(void *buffer, size_t bsize)
-{
- wxUint32 s = bsize;
- m_io_sndbuf->OnNeedOutputData((char *)buffer, s);
- return bsize;
-}
-
-size_t wxSoundCodec::OnSysWrite(const void *buffer, size_t bsize)
-{
- wxUint32 s = bsize;
- m_io_sndbuf->OnBufferInFinished((char *)buffer, s);
- return bsize;
-}
-
-wxSoundCodec *wxSoundCodec::Get(int no)
-{
- if (no < 0 || no >= l_nb_formats)
- return NULL;
-
- if (!l_sound_formats[no])
- return NULL;
-
- return (wxSoundCodec *)l_sound_formats[no]->CreateObject();
-}