X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0662cd3286d6da0be81ef063633fec13c5cf741b..5b7352027902bebecd06e2a124492fc0ee27f4e2:/utils/wxMMedia2/lib/sndwav.cpp diff --git a/utils/wxMMedia2/lib/sndwav.cpp b/utils/wxMMedia2/lib/sndwav.cpp index b4fa4faaa0..618cbfcab3 100644 --- a/utils/wxMMedia2/lib/sndwav.cpp +++ b/utils/wxMMedia2/lib/sndwav.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include "sndbase.h" #include "sndcodec.h" @@ -51,33 +52,31 @@ wxSoundWave::~wxSoundWave() bool wxSoundWave::CanRead() { - wxUint32 len, signature; + wxUint32 len, signature1, signature2; m_snderror = wxSOUND_NOERR; - FAIL_WITH(m_input->Read(&signature, 4).LastRead() != 4, wxSOUND_INVSTRM); + FAIL_WITH(m_input->Read(&signature1, 4).LastRead() != 4, wxSOUND_INVSTRM); - if (wxUINT32_SWAP_ON_BE(signature) != RIFF_SIGNATURE) { - m_input->Ungetch(&signature, 4); + if (wxUINT32_SWAP_ON_BE(signature1) != RIFF_SIGNATURE) { + m_input->Ungetch(&signature1, 4); return FALSE; } m_input->Read(&len, 4); FAIL_WITH(m_input->LastRead() != 4, wxSOUND_INVSTRM); - FAIL_WITH(m_input->Read(&signature, 4).LastRead() != 4, wxSOUND_INVSTRM); - if (wxUINT32_SWAP_ON_BE(signature) != WAVE_SIGNATURE) { - m_input->Ungetch(&signature, 4); - return FALSE; - } - - m_input->Ungetch("RIFF", 4); + FAIL_WITH(m_input->Read(&signature2, 4).LastRead() != 4, wxSOUND_INVSTRM); + m_input->Ungetch(&signature2, 4); m_input->Ungetch(&len, 4); - m_input->Ungetch("WAVE", 4); + m_input->Ungetch(&signature1, 4); + + if (wxUINT32_SWAP_ON_BE(signature2) != WAVE_SIGNATURE) + return FALSE; return TRUE; } -bool wxSoundWave::HandlePCM(wxDataInputStream& data, wxUint16 channels, +bool wxSoundWave::HandleOutputPCM(wxDataInputStream& data, wxUint16 channels, wxUint32 sample_fq, wxUint32 byte_p_sec, wxUint16 byte_p_spl, wxUint16 bits_p_spl) { @@ -95,7 +94,7 @@ bool wxSoundWave::HandlePCM(wxDataInputStream& data, wxUint16 channels, return TRUE; } -bool wxSoundWave::HandleG721(wxDataInputStream& data, wxUint16 channels, +bool wxSoundWave::HandleOutputG721(wxDataInputStream& data, wxUint16 channels, wxUint32 sample_fq, wxUint32 byte_p_sec, wxUint16 byte_p_spl, wxUint16 bits_p_spl) { @@ -152,12 +151,12 @@ bool wxSoundWave::PrepareToPlay() switch (format) { case 0x01: - if (!HandlePCM(data, channels, sample_fq, + if (!HandleOutputPCM(data, channels, sample_fq, byte_p_sec, byte_p_spl, bits_p_spl)) return FALSE; break; case 0x40: - if (!HandleG721(data, channels, sample_fq, + if (!HandleOutputG721(data, channels, sample_fq, byte_p_sec, byte_p_spl, bits_p_spl)) return FALSE; break; @@ -178,14 +177,69 @@ bool wxSoundWave::PrepareToPlay() return TRUE; } +wxSoundFormatBase *wxSoundWave::HandleInputPCM(wxDataOutputStream& data) +{ + wxUint16 format, channels, byte_p_spl, bits_p_spl; + wxUint32 sample_fq, byte_p_sec; + wxSoundFormatPcm *pcm; + + pcm = (wxSoundFormatPcm *)(m_sndformat->Clone()); + + // Write block length + data.Write32(16); + + sample_fq = pcm->GetSampleRate(); + bits_p_spl = pcm->GetBPS(); + channels = pcm->GetChannels(); + byte_p_spl = pcm->GetBPS() / 8; + byte_p_sec = pcm->GetBytesFromTime(1); + format = 0x01; + + pcm->Signed(TRUE); + pcm->SetOrder(wxLITTLE_ENDIAN); + + data << format << channels << sample_fq + << byte_p_sec << byte_p_spl << bits_p_spl; + + return pcm; +} + +wxSoundFormatBase *wxSoundWave::HandleInputG72X(wxDataOutputStream& data) +{ + wxUint16 format, channels, byte_p_spl, bits_p_spl; + wxUint32 sample_fq, byte_p_sec; + wxSoundFormatG72X *g72x; + + // Write block length + data.Write32(16); + + g72x = (wxSoundFormatG72X *)(m_sndformat->Clone()); + if (g72x->GetG72XType() != wxSOUND_G721) { + delete g72x; + return NULL; + } + + sample_fq = g72x->GetSampleRate(); + bits_p_spl = 4; + channels = 1; + byte_p_spl = 0; + byte_p_sec = g72x->GetBytesFromTime(1); + format = 0x40; + data << format << channels << sample_fq + << byte_p_sec << byte_p_spl << bits_p_spl; + + return g72x; +} + bool wxSoundWave::PrepareToRecord(unsigned long time) { -#define WRITE_SIGNATURE(sig) \ +#define WRITE_SIGNATURE(s,sig) \ signature = sig; \ signature = wxUINT32_SWAP_ON_BE(signature); \ -FAIL_WITH(m_output->Write(&signature, 4).LastWrite() != 4, wxSOUND_INVSTRM); +FAIL_WITH(s->Write(&signature, 4).LastWrite() != 4, wxSOUND_INVSTRM); - wxUint32 signature, len; + wxUint32 signature; + wxMemoryOutputStream fmt_data; if (!m_output) { m_snderror = wxSOUND_INVSTRM; @@ -193,53 +247,57 @@ FAIL_WITH(m_output->Write(&signature, 4).LastWrite() != 4, wxSOUND_INVSTRM); } wxDataOutputStream data(*m_output); - data.BigEndianOrdered(FALSE); - - len = m_sndformat->GetBytesFromTime(time); + wxDataOutputStream fmt_d_data(fmt_data); - len += HEADER_SIZE; + data.BigEndianOrdered(FALSE); + fmt_d_data.BigEndianOrdered(FALSE); - WRITE_SIGNATURE(RIFF_SIGNATURE); + WRITE_SIGNATURE(m_output, RIFF_SIGNATURE); - data << len; FAIL_WITH(m_output->LastWrite() != 4, wxSOUND_INVSTRM); - WRITE_SIGNATURE(WAVE_SIGNATURE); + WRITE_SIGNATURE((&fmt_data), WAVE_SIGNATURE); { - wxUint16 format, channels, byte_p_spl, bits_p_spl; - wxUint32 sample_fq, byte_p_sec; - wxSoundFormatPcm *pcm; + wxSoundFormatBase *frmt; + + WRITE_SIGNATURE((&fmt_data), FMT_SIGNATURE); - if (m_sndformat->GetType() != wxSOUND_PCM) { + switch (m_sndformat->GetType()) { + case wxSOUND_PCM: + frmt = HandleInputPCM(fmt_d_data); + break; + case wxSOUND_G72X: + frmt = HandleInputG72X(fmt_d_data); + break; + default: m_snderror = wxSOUND_NOCODEC; return FALSE; } - pcm = (wxSoundFormatPcm *)(m_sndformat->Clone()); + FAIL_WITH(!frmt, wxSOUND_NOCODEC); + + if (!SetSoundFormat(*frmt)) { + delete frmt; + return FALSE; + } + + delete frmt; + } - WRITE_SIGNATURE(FMT_SIGNATURE); - data.Write32(16); + data << (fmt_data.GetSize() + 8 + m_sndformat->GetBytesFromTime(time)); - sample_fq = pcm->GetSampleRate(); - bits_p_spl = pcm->GetBPS(); - channels = pcm->GetChannels(); - byte_p_spl = pcm->GetBPS() / 8; - byte_p_sec = pcm->GetBytesFromTime(1); - format = 1; - data << format << channels << sample_fq - << byte_p_sec << byte_p_spl << bits_p_spl; + { + char *out_buf; + out_buf = new char[fmt_data.GetSize()]; - pcm->Signed(TRUE); - pcm->SetOrder(wxLITTLE_ENDIAN); - - if (!SetSoundFormat(*pcm)) - return FALSE; + fmt_data.CopyTo(out_buf, fmt_data.GetSize()); + m_output->Write(out_buf, fmt_data.GetSize()); - delete pcm; + delete[] out_buf; } - WRITE_SIGNATURE(DATA_SIGNATURE); + WRITE_SIGNATURE(m_output, DATA_SIGNATURE); data.Write32(m_sndformat->GetBytesFromTime(time)); return TRUE; }