X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/aa8fb7a0164e989e09d2b78867633399a740f1d3..5b7352027902bebecd06e2a124492fc0ee27f4e2:/utils/wxMMedia2/lib/sndwav.cpp?ds=sidebyside diff --git a/utils/wxMMedia2/lib/sndwav.cpp b/utils/wxMMedia2/lib/sndwav.cpp index 79c1d20257..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,28 +52,26 @@ 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; } @@ -234,12 +233,13 @@ wxSoundFormatBase *wxSoundWave::HandleInputG72X(wxDataOutputStream& data) 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; @@ -247,30 +247,28 @@ FAIL_WITH(m_output->Write(&signature, 4).LastWrite() != 4, wxSOUND_INVSTRM); } wxDataOutputStream data(*m_output); - data.BigEndianOrdered(FALSE); + wxDataOutputStream fmt_d_data(fmt_data); - len = m_sndformat->GetBytesFromTime(time); - - 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); { wxSoundFormatBase *frmt; - WRITE_SIGNATURE(FMT_SIGNATURE); + WRITE_SIGNATURE((&fmt_data), FMT_SIGNATURE); switch (m_sndformat->GetType()) { case wxSOUND_PCM: - frmt = HandleInputPCM(data); + frmt = HandleInputPCM(fmt_d_data); break; case wxSOUND_G72X: - frmt = HandleInputG72X(data); + frmt = HandleInputG72X(fmt_d_data); break; default: m_snderror = wxSOUND_NOCODEC; @@ -287,7 +285,19 @@ FAIL_WITH(m_output->Write(&signature, 4).LastWrite() != 4, wxSOUND_INVSTRM); delete frmt; } - WRITE_SIGNATURE(DATA_SIGNATURE); + data << (fmt_data.GetSize() + 8 + m_sndformat->GetBytesFromTime(time)); + + { + char *out_buf; + out_buf = new char[fmt_data.GetSize()]; + + fmt_data.CopyTo(out_buf, fmt_data.GetSize()); + m_output->Write(out_buf, fmt_data.GetSize()); + + delete[] out_buf; + } + + WRITE_SIGNATURE(m_output, DATA_SIGNATURE); data.Write32(m_sndformat->GetBytesFromTime(time)); return TRUE; }