X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e8482f24cfc00645607f8526fde38d39e0dcaa63..822e690b221486b63895b5f14a7fbee2bc966fe5:/contrib/src/mmedia/sndwav.cpp diff --git a/contrib/src/mmedia/sndwav.cpp b/contrib/src/mmedia/sndwav.cpp index 7d6d891878..76fc470954 100644 --- a/contrib/src/mmedia/sndwav.cpp +++ b/contrib/src/mmedia/sndwav.cpp @@ -9,7 +9,7 @@ #pragma implementation "sndwav.cpp" #endif -#include +#include "wx/wxprec.h" #ifndef WX_PRECOMP #include "wx/defs.h" @@ -29,6 +29,7 @@ #include "wx/mmedia/sndfile.h" #include "wx/mmedia/sndpcm.h" #include "wx/mmedia/sndg72x.h" +#include "wx/mmedia/sndmsad.h" #include "wx/mmedia/sndwav.h" #define BUILD_SIGNATURE(a,b,c,d) (((wxUint32)a) | (((wxUint32)b) << 8) | (((wxUint32)c) << 16) | (((wxUint32)d) << 24)) @@ -63,7 +64,7 @@ wxString wxSoundWave::GetCodecName() const return wxString(wxT("wxSoundWave codec")); } -#define FAIL_WITH(condition, err) if (condition) { m_snderror = err; return FALSE; } +#define FAIL_WITH(condition, err) if (condition) { m_snderror = err; return false; } bool wxSoundWave::CanRead() { @@ -76,7 +77,7 @@ bool wxSoundWave::CanRead() if (wxUINT32_SWAP_ON_BE(signature1) != RIFF_SIGNATURE) { m_input->Ungetch(&signature1, 4); - return FALSE; + return false; } // Pass the global length @@ -92,32 +93,76 @@ bool wxSoundWave::CanRead() // Test the second signature if (wxUINT32_SWAP_ON_BE(signature2) != WAVE_SIGNATURE) - return FALSE; + return false; - return TRUE; + return true; } -bool wxSoundWave::HandleOutputPCM(wxDataInputStream& data, wxUint16 channels, - wxUint32 sample_fq, wxUint32 byte_p_sec, - wxUint16 byte_p_spl, wxUint16 bits_p_spl) +bool wxSoundWave::HandleOutputPCM(wxDataInputStream& WXUNUSED(data), wxUint32 len, + wxUint16 channels, + wxUint32 sample_fq, wxUint32 WXUNUSED(byte_p_sec), + wxUint16 WXUNUSED(byte_p_spl), wxUint16 bits_p_spl) { wxSoundFormatPcm sndformat; sndformat.SetSampleRate(sample_fq); sndformat.SetBPS(bits_p_spl); sndformat.SetChannels(channels); - sndformat.Signed(TRUE); + sndformat.Signed(true); sndformat.SetOrder(wxLITTLE_ENDIAN); if (!SetSoundFormat(sndformat)) - return FALSE; + return false; - return TRUE; + m_input->SeekI(len, wxFromCurrent); + + return true; +} + +bool wxSoundWave::HandleOutputMSADPCM(wxDataInputStream& data, wxUint32 len, + wxUint16 channels, + wxUint32 sample_fq, wxUint32 WXUNUSED(byte_p_sec), + wxUint16 WXUNUSED(byte_p_spl), wxUint16 WXUNUSED(bits_p_spl)) +{ + wxSoundFormatMSAdpcm sndformat; + wxInt16 *coefs[2]; + wxUint16 coefs_len, i; + wxUint16 block_size; + + sndformat.SetSampleRate(sample_fq); + sndformat.SetChannels(channels); + + block_size = data.Read16(); + coefs_len = data.Read16(); + + coefs[0] = new wxInt16[coefs_len]; + coefs[1] = new wxInt16[coefs_len]; + + for (i=0;iSeekI(len, wxFromCurrent); + + return true; } -bool wxSoundWave::HandleOutputG721(wxDataInputStream& data, wxUint16 channels, - wxUint32 sample_fq, wxUint32 byte_p_sec, - wxUint16 byte_p_spl, wxUint16 bits_p_spl) +bool wxSoundWave::HandleOutputG721(wxDataInputStream& WXUNUSED(data), wxUint32 len, + wxUint16 WXUNUSED(channels), + wxUint32 sample_fq, wxUint32 WXUNUSED(byte_p_sec), + wxUint16 WXUNUSED(byte_p_spl), wxUint16 WXUNUSED(bits_p_spl)) { wxSoundFormatG72X sndformat; @@ -125,9 +170,11 @@ bool wxSoundWave::HandleOutputG721(wxDataInputStream& data, wxUint16 channels, sndformat.SetG72XType(wxSOUND_G721); if (!SetSoundFormat(sndformat)) - return FALSE; + return false; - return TRUE; + m_input->SeekI(len, wxFromCurrent); + + return true; } bool wxSoundWave::PrepareToPlay() @@ -137,11 +184,11 @@ bool wxSoundWave::PrepareToPlay() if (!m_input) { m_snderror = wxSOUND_INVSTRM; - return FALSE; + return false; } wxDataInputStream data(*m_input); - data.BigEndianOrdered(FALSE); + data.BigEndianOrdered(false); // Get the first signature FAIL_WITH(m_input->Read(&signature, 4).LastRead() != 4, wxSOUND_INVSTRM); @@ -149,6 +196,7 @@ bool wxSoundWave::PrepareToPlay() // "RIFF" len = data.Read32(); + wxUnusedVar(len); FAIL_WITH(m_input->LastRead() != 4, wxSOUND_INVSTRM); // dummy len @@ -157,7 +205,7 @@ bool wxSoundWave::PrepareToPlay() FAIL_WITH(wxUINT32_SWAP_ON_BE(signature) != WAVE_SIGNATURE, wxSOUND_INVSTRM); // "WAVE" - end_headers = FALSE; + end_headers = false; // Chunk loop while (!end_headers) { FAIL_WITH(m_input->Read(&signature, 4).LastRead() != 4, wxSOUND_INVSTRM); @@ -173,27 +221,38 @@ bool wxSoundWave::PrepareToPlay() // Get the common parameters data >> format >> channels >> sample_fq >> byte_p_sec >> byte_p_spl >> bits_p_spl; + len -= 16; switch (format) { case 0x01: // PCM - if (!HandleOutputPCM(data, channels, sample_fq, - byte_p_sec, byte_p_spl, bits_p_spl)) - return FALSE; + if (!HandleOutputPCM(data, len, channels, sample_fq, + byte_p_sec, byte_p_spl, + bits_p_spl)) + return false; + break; + case 0x02: // MS ADPCM + if (!HandleOutputMSADPCM(data, len, + channels, sample_fq, + byte_p_sec, byte_p_spl, + bits_p_spl)) + return false; break; case 0x40: // G721 - if (!HandleOutputG721(data, channels, sample_fq, - byte_p_sec, byte_p_spl, bits_p_spl)) - return FALSE; + if (!HandleOutputG721(data, len, + channels, sample_fq, + byte_p_sec, byte_p_spl, + bits_p_spl)) + return false; break; default: m_snderror = wxSOUND_NOCODEC; - return FALSE; + return false; } break; } case DATA_SIGNATURE: // "data" m_base_offset = m_input->TellI(); - end_headers = TRUE; + end_headers = true; FinishPreparation(len); break; default: @@ -202,7 +261,7 @@ bool wxSoundWave::PrepareToPlay() break; } } - return TRUE; + return true; } wxSoundFormatBase *wxSoundWave::HandleInputPCM(wxDataOutputStream& data) @@ -223,7 +282,7 @@ wxSoundFormatBase *wxSoundWave::HandleInputPCM(wxDataOutputStream& data) byte_p_sec = pcm->GetBytesFromTime(1); format = 0x01; - pcm->Signed(TRUE); + pcm->Signed(true); pcm->SetOrder(wxLITTLE_ENDIAN); data << format << channels << sample_fq @@ -271,14 +330,14 @@ FAIL_WITH(s->Write(&signature, 4).LastWrite() != 4, wxSOUND_INVSTRM); if (!m_output) { m_snderror = wxSOUND_INVSTRM; - return FALSE; + return false; } wxDataOutputStream data(*m_output); wxDataOutputStream fmt_d_data(fmt_data); - data.BigEndianOrdered(FALSE); - fmt_d_data.BigEndianOrdered(FALSE); + data.BigEndianOrdered(false); + fmt_d_data.BigEndianOrdered(false); WRITE_SIGNATURE(m_output, RIFF_SIGNATURE); @@ -300,14 +359,14 @@ FAIL_WITH(s->Write(&signature, 4).LastWrite() != 4, wxSOUND_INVSTRM); break; default: m_snderror = wxSOUND_NOCODEC; - return FALSE; + return false; } FAIL_WITH(!frmt, wxSOUND_NOCODEC); if (!SetSoundFormat(*frmt)) { delete frmt; - return FALSE; + return false; } delete frmt; @@ -328,28 +387,28 @@ FAIL_WITH(s->Write(&signature, 4).LastWrite() != 4, wxSOUND_INVSTRM); WRITE_SIGNATURE(m_output, DATA_SIGNATURE); data.Write32(m_sndformat->GetBytesFromTime(time)); - return TRUE; + return true; } bool wxSoundWave::FinishRecording() { if (m_output->SeekO(0, wxFromStart) == wxInvalidOffset) // We can't but there is no error. - return TRUE; + return true; if (m_bytes_left == 0) - return TRUE; + return true; // TODO: Update headers when we stop before the specified time (if possible) - return TRUE; + return true; } -bool wxSoundWave::RepositionStream(wxUint32 position) +bool wxSoundWave::RepositionStream(wxUint32 WXUNUSED(position)) { if (m_base_offset == wxInvalidOffset) - return FALSE; + return false; m_input->SeekI(m_base_offset, wxFromStart); - return TRUE; + return true; } wxUint32 wxSoundWave::GetData(void *buffer, wxUint32 len)