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

📄 sound.cpp

📁 很牛的GUI源码wxWidgets-2.8.0.zip 可在多种平台下运行.
💻 CPP
字号:
/////////////////////////////////////////////////////////////////////////////// Name:        src/mac/classic/sound.cpp// Purpose:     wxSound class implementation: optional// Author:      Stefan Csomor// Modified by:// Created:     1998-01-01// RCS-ID:      $Id: sound.cpp,v 1.6 2006/04/24 08:46:29 ABX Exp $// Copyright:   (c) Stefan Csomor// Licence:     wxWindows licence/////////////////////////////////////////////////////////////////////////////// For compilers that support precompilation, includes "wx.h".#include "wx/wxprec.h"#if wxUSE_SOUND#include "wx/sound.h"#ifndef WX_PRECOMP    #include "wx/object.h"    #include "wx/string.h"#endif#ifdef __WXMAC__#include "wx/mac/private.h"#ifndef __DARWIN__#include <Sound.h>#endif#endifwxSound::wxSound()  : m_sndChan(0), m_hSnd(NULL), m_waveLength(0), m_isResource(true){}wxSound::wxSound(const wxString& sFileName, bool isResource)  : m_sndChan(0), m_hSnd(NULL), m_waveLength(0), m_isResource(true){    Create(sFileName, isResource);}wxSound::~wxSound(){    FreeData();}wxSound::wxSound(int size, const wxByte* data)  : m_sndChan(0), m_hSnd(NULL), m_waveLength(0), m_isResource(false){    //TODO convert data}bool wxSound::Create(const wxString& fileName, bool isResource){    bool ret = false;    m_sndname = fileName;    m_isResource = isResource;    if (m_isResource)        ret = true;    else    { /*        if (sndChan)        {                                                                    // we're playing            FSClose(SndRefNum);            SndRefNum = 0;            SndDisposeChannel(sndChan, TRUE);            free(sndChan);            sndChan = 0;            KillTimer(0,timerID);        }        if (!lpSnd)            return true;        if (_access(lpSnd,0))                            // no file, no service            return false;        // Allocate SndChannel        sndChan = (SndChannelPtr) malloc (sizeof(SndChannel));        if (!sndChan)            return false;        sndChan->qLength = 128;        if (noErr != SndNewChannel (&sndChan, sampledSynth, initMono | initNoInterp, 0))        {            free(sndChan);            sndChan = 0;            return false;        }        if (!(SndRefNum = MacOpenSndFile ((char *)lpSnd)))        {            SndDisposeChannel(sndChan, TRUE);            free(sndChan);            sndChan = 0;            return false;        }        bool async = false;        if (fdwSound & SND_ASYNC)            async = true;        if (SndStartFilePlay(sndChan, SndRefNum, 0, 81920, 0, 0, 0, async) != noErr)        {            FSClose (SndRefNum);            SndRefNum = 0;            SndDisposeChannel (sndChan, TRUE);            free (sndChan);            sndChan = 0;            return false;        }        if (async)        {  // haven't finish yet            timerID = SetTimer(0, 0, 250, TimerCallBack);        }        else        {            FSClose (SndRefNum);            SndRefNum = 0;            SndDisposeChannel (sndChan, TRUE);            free (sndChan);            sndChan = 0;        }*/    }    return ret;}//don't know what to do with looped, wthbool wxSound::DoPlay(unsigned flags) const{    bool ret = false;    if (m_isResource)    {        Str255 snd ;        wxMacStringToPascal( m_sndname , snd ) ;        SndListHandle hSnd;        hSnd = (SndListHandle) GetNamedResource('snd ', snd);        if ((hSnd != NULL) && (SndPlay((SndChannelPtr)m_sndChan, (SndListHandle) hSnd, (flags & wxSOUND_ASYNC)) == noErr))            ret = true;    }    return ret;}bool wxSound::FreeData(){    bool ret = false;    if (m_isResource)    {        m_sndname.Empty();        ret = true;    }    else    {        //TODO,    }    return ret;}//code below is from an old implementation used for telinfo with MSVC crossplatform support//technology proceeds, so it would be the wisest to drop this code, but it's left here just//for the sake of a reference. BTW: Wave files can now be played with QT, starting from V3/*static short MacOpenSndFile (char * path){    VolumeParam vp;    FSSpec fspec;    Str255 name;    char *c;    // first, get the volume reference number for the file.  Start by    // making a Pstring with just the volume name    strcpy ((char *) name, path);    if (c = strchr ((char *) name, ':'))    {        c++;        *c = '\0';    }    c2pstr ((char *) name);    vp.ioCompletion = 0;    vp.ioVolIndex    = -1;    vp.ioNamePtr    = name;    vp.ioVRefNum    = 0;    if (PBGetVInfo((ParamBlockRec *)&vp, 0) != noErr)        return 0;    // next, buld an FSSpec for the file    strcpy ((char *) name, path);    c2pstr ((char *) name);    if (FSMakeFSSpec (vp.ioVRefNum, 0, name, &fspec) != noErr)        return 0;    short frefnum;    // now open the file, and return it's reference number    if (FSpOpenDF(&fspec, fsRdPerm, &frefnum) != noErr)        return 0;    return frefnum;}void TimerCallBack(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime){    if(!sndChan)    {        KillTimer(0,timerID);        return;    }    SCStatus    scstat;    if (noErr == SndChannelStatus (sndChan, sizeof (SCStatus), &scstat)) {        if (scstat.scChannelPaused || scstat.scChannelBusy)            return;                            // not done yet    }    // either error or done.    FSClose (SndRefNum);    SndRefNum = 0;    SndDisposeChannel (sndChan, TRUE);    free (sndChan);    sndChan = 0;    KillTimer(0,timerID);}*/#endif // wxUSE_SOUND

⌨️ 快捷键说明

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