⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sndaiff.cpp

📁 很牛的GUI源码wxWidgets-2.8.0.zip 可在多种平台下运行.
💻 CPP
字号:
// --------------------------------------------------------------------------// Name: sndaiff.cpp// Purpose:// Date: 08/11/1999// Author: Guilhem Lavaux <lavaux@easynet.fr> (C) 1999// CVSID: $Id: sndaiff.cpp,v 1.7 2005/09/23 12:47:50 MR Exp $// wxWindows licence// --------------------------------------------------------------------------#include "wx/wxprec.h"#ifndef WX_PRECOMP    #include "wx/defs.h"#endif#ifdef __BORLANDC__    #pragma hdrstop#endif#include "wx/stream.h"#include "wx/datstrm.h"#include "wx/filefn.h"#include "wx/mmedia/sndbase.h"#include "wx/mmedia/sndcodec.h"#include "wx/mmedia/sndfile.h"#include "wx/mmedia/sndpcm.h"#include "wx/mmedia/sndaiff.h"#define BUILD_SIGNATURE(a,b,c,d) (((wxUint32)a) | (((wxUint32)b) << 8) | (((wxUint32)c) << 16)  | (((wxUint32)d) << 24))#define FORM_SIGNATURE BUILD_SIGNATURE('F','O','R','M')#define AIFF_SIGNATURE BUILD_SIGNATURE('A','I','F','F')#define AIFC_SIGNATURE BUILD_SIGNATURE('A','I','F','C')#define COMM_SIGNATURE BUILD_SIGNATURE('C','O','M','M')#define SSND_SIGNATURE BUILD_SIGNATURE('S','S','N','D')wxSoundAiff::wxSoundAiff(wxInputStream& stream, wxSoundStream& io_sound)  : wxSoundFileStream(stream, io_sound){    m_base_offset = wxInvalidOffset;}wxSoundAiff::wxSoundAiff(wxOutputStream& stream, wxSoundStream& io_sound)  : wxSoundFileStream(stream, io_sound){    m_base_offset = wxInvalidOffset;}wxSoundAiff::~wxSoundAiff(){}wxString wxSoundAiff::GetCodecName() const{    return wxT("wxSoundAiff codec");}bool wxSoundAiff::CanRead(){    wxUint32 signature1, signature2, len;        if (m_input->Read(&signature1, 4).LastRead() != 4)        return false;        if (wxUINT32_SWAP_ON_BE(signature1) != FORM_SIGNATURE) {        m_input->Ungetch(&signature1, 4);        return false;    }        m_input->Read(&len, 4);    if (m_input->LastRead() != 4) {        m_input->Ungetch(&len, m_input->LastRead());        m_input->Ungetch(&signature1, 4);        return false;    }        if (m_input->Read(&signature2, 4).LastRead() != 4) {        m_input->Ungetch(&signature2, m_input->LastRead());        m_input->Ungetch(&len, 4);        m_input->Ungetch(&signature1, 4);        return false;    }        m_input->Ungetch(&signature2, 4);    m_input->Ungetch(&len, 4);    m_input->Ungetch(&signature1, 4);        if (        wxUINT32_SWAP_ON_BE(signature2) != AIFF_SIGNATURE &&        wxUINT32_SWAP_ON_BE(signature2) != AIFC_SIGNATURE)        return false;        return true;}#define FAIL_WITH(condition, err) if (condition) { m_snderror = err; return false; }bool wxSoundAiff::PrepareToPlay(){    wxDataInputStream data(*m_input);    wxUint32 signature, len, ssnd;    bool end_headers;        if (!m_input) {        m_snderror = wxSOUND_INVSTRM;        return false;    }    m_snderror = wxSOUND_NOERROR;        data.BigEndianOrdered(true);        FAIL_WITH(m_input->Read(&signature, 4).LastRead() != 4, wxSOUND_INVSTRM);    FAIL_WITH(wxUINT32_SWAP_ON_BE(signature) != FORM_SIGNATURE, wxSOUND_INVSTRM);    // "FORM"        len = data.Read32();     wxUnusedVar(len);    FAIL_WITH(m_input->LastRead() != 4, wxSOUND_INVSTRM);    // dummy len        FAIL_WITH(m_input->Read(&signature, 4).LastRead() != 4, wxSOUND_INVSTRM);    FAIL_WITH(        wxUINT32_SWAP_ON_BE(signature) != AIFF_SIGNATURE &&        wxUINT32_SWAP_ON_BE(signature) != AIFC_SIGNATURE, wxSOUND_INVSTRM);    // "AIFF" / "AIFC"        end_headers = false;    while (!end_headers) {        FAIL_WITH(m_input->Read(&signature, 4).LastRead() != 4, wxSOUND_INVSTRM);                len = data.Read32();        FAIL_WITH(m_input->LastRead() != 4, wxSOUND_INVSTRM);                switch (wxUINT32_SWAP_ON_BE(signature)) {            case COMM_SIGNATURE: { // "COMM"                wxUint16 channels, bps;                wxUint32 num_samples;                double srate;                wxSoundFormatPcm sndformat;                // Get sound data informations                data >> channels >> num_samples >> bps >> srate;                 // Convert them in a wxSoundFormat object                sndformat.SetSampleRate((wxUint32) srate);                sndformat.SetBPS(bps);                sndformat.SetChannels(channels);                sndformat.Signed(false);                sndformat.SetOrder(wxBIG_ENDIAN);                                if (!SetSoundFormat(sndformat))                    return false;                // We pass all data left                m_input->SeekI(len-18, wxFromCurrent);                break;            }            case SSND_SIGNATURE: {  // "SSND"                data >> ssnd;                // m_input->SeekI(4, wxFromCurrent);  // Pass an INT32                // m_input->SeekI(len-4, wxFromCurrent); // Pass the rest                m_input->SeekI(ssnd + 4, wxFromCurrent);                m_base_offset = m_input->TellI();                // len-8 bytes of samples                FinishPreparation(len - 8);                end_headers = true;                break;            }            default:                m_input->SeekI(len, wxFromCurrent);                break;        }    }    return true;}bool wxSoundAiff::PrepareToRecord(wxUint32 WXUNUSED(time)){    // TODO    return false;}bool wxSoundAiff::FinishRecording(){    // TODO    return false;}bool wxSoundAiff::RepositionStream(wxUint32 WXUNUSED(position)){    // If the stream is not seekable "TellI() returns wxInvalidOffset" we cannot reposition stream    if (m_base_offset == wxInvalidOffset)        return false;    m_input->SeekI(m_base_offset, wxFromStart);    return true;}wxUint32 wxSoundAiff::GetData(void *buffer, wxUint32 len){    return m_input->Read(buffer, len).LastRead();}wxUint32 wxSoundAiff::PutData(const void *buffer, wxUint32 len){    return m_output->Write(buffer, len).LastWrite();}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -