115 lines
2.4 KiB
C++
115 lines
2.4 KiB
C++
|
// /////////////////////////////////////////////////////////////////////////////
|
||
|
// Name: sndau.cpp
|
||
|
// Purpose: wxMMedia Sun Audio File Codec
|
||
|
// Author: Guilhem Lavaux
|
||
|
// Created: 1998
|
||
|
// Updated:
|
||
|
// Copyright: (C) 1998, Guilhem Lavaux
|
||
|
// License: wxWindows license
|
||
|
// /////////////////////////////////////////////////////////////////////////////
|
||
|
#ifdef __GNUG__
|
||
|
#pragma implementation "sndau.h"
|
||
|
#endif
|
||
|
|
||
|
#include "mmriff.h"
|
||
|
#include "sndfile.h"
|
||
|
#include "sndau.h"
|
||
|
|
||
|
#define AU_ISDN_ULAW 1
|
||
|
#define AU_PCM_8BITS 2
|
||
|
#define AU_PCM_16BITS 3
|
||
|
#define AU_ADPCM 23
|
||
|
|
||
|
wxSndAuCodec::wxSndAuCodec()
|
||
|
: wxSndFileCodec()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
wxSndAuCodec::wxSndAuCodec(wxInputStream& s, bool preload, bool seekable)
|
||
|
: wxSndFileCodec(s, preload, seekable)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
wxSndAuCodec::wxSndAuCodec(wxOutputStream& s, bool seekable)
|
||
|
: wxSndFileCodec(s, seekable)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
wxSndAuCodec::wxSndAuCodec(const wxString& fname)
|
||
|
: wxSndFileCodec(fname)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
wxSndAuCodec::~wxSndAuCodec()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
wxUint32 wxSndAuCodec::PrepareToPlay()
|
||
|
{
|
||
|
wxString id;
|
||
|
char temp_buf[5];
|
||
|
int offset, srate, codec, ch_count;
|
||
|
size_t len;
|
||
|
|
||
|
m_istream->SeekI(0);
|
||
|
|
||
|
m_istream->Read(temp_buf, 4);
|
||
|
temp_buf[4] = 0;
|
||
|
|
||
|
id = temp_buf;
|
||
|
if (id != ".snd") {
|
||
|
m_mmerror = wxMMFILE_INVALID;
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
#define READ_BE_32(i) \
|
||
|
m_istream->Read(temp_buf, 4); \
|
||
|
i = (unsigned long)temp_buf[0] << 24; \
|
||
|
i |= (unsigned long)temp_buf[1] << 16; \
|
||
|
i |= (unsigned long)temp_buf[2] << 8; \
|
||
|
i |= (unsigned long)temp_buf[3];
|
||
|
|
||
|
READ_BE_32(offset);
|
||
|
READ_BE_32(len);
|
||
|
READ_BE_32(codec);
|
||
|
READ_BE_32(srate);
|
||
|
READ_BE_32(ch_count);
|
||
|
|
||
|
m_sndformat.SetSampleRate(srate);
|
||
|
m_sndformat.SetChannels(ch_count);
|
||
|
switch (codec) {
|
||
|
case AU_ISDN_ULAW:
|
||
|
ChangeCodec(WXSOUND_ULAW);
|
||
|
break;
|
||
|
case AU_PCM_8BITS:
|
||
|
ChangeCodec(WXSOUND_PCM);
|
||
|
m_sndformat.SetByteOrder(wxSND_SAMPLE_LE);
|
||
|
m_sndformat.SetSign(wxSND_SAMPLE_SIGNED);
|
||
|
break;
|
||
|
case AU_PCM_16BITS:
|
||
|
ChangeCodec(WXSOUND_PCM);
|
||
|
m_sndformat.SetByteOrder(wxSND_SAMPLE_LE);
|
||
|
m_sndformat.SetSign(wxSND_SAMPLE_SIGNED);
|
||
|
break;
|
||
|
case AU_ADPCM:
|
||
|
ChangeCodec(WXSOUND_ADPCM);
|
||
|
break;
|
||
|
}
|
||
|
return len;
|
||
|
}
|
||
|
|
||
|
bool wxSndAuCodec::OnNeedData(char *buf, wxUint32 size)
|
||
|
{
|
||
|
return m_istream->Read(buf, size).LastError();
|
||
|
}
|
||
|
|
||
|
bool wxSndAuCodec::OnWriteData(char *buf, wxUint32 size)
|
||
|
{
|
||
|
return m_ostream->Write(buf, size).LastError();
|
||
|
}
|
||
|
|
||
|
bool wxSndAuCodec::PrepareToRecord(wxUint32 file_size)
|
||
|
{
|
||
|
return FALSE;
|
||
|
}
|