]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/wave.cpp
renamed wxWave to wxSound; compatibility fixes
[wxWidgets.git] / src / mac / wave.cpp
index 5df346f8254ccf74f8ed0cffc10cad36e11b3456..35accb91670fa30805afea67f65bf90a326b5dc5 100644 (file)
@@ -1,12 +1,12 @@
 /////////////////////////////////////////////////////////////////////////////
 // Name:        wave.cpp
 // Purpose:     wxWave class implementation: optional
-// Author:      AUTHOR
+// Author:      Stefan Csomor
 // Modified by:
-// Created:     ??/??/98
+// Created:     1998-01-01
 // RCS-ID:      $Id$
-// Copyright:   (c) AUTHOR
-// Licence:    wxWindows licence
+// Copyright:   (c) Stefan Csomor
+// Licence:       wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 #ifdef __GNUG__
 
 #include "wx/object.h"
 #include "wx/string.h"
-#include "wx/mac/wave.h"
+#include "wx/wave.h"
+
+#if wxUSE_WAVE
+
+#ifdef __WXMAC__
+#include "wx/mac/private.h"
+#ifndef __DARWIN__
+#include <Sound.h>
+#endif
+#endif
 
 wxWave::wxWave()
-  : m_hSnd(NULL), m_waveLength(0), m_isResource(true), m_sndChan(0)
+  : m_sndChan(0), m_hSnd(NULL), m_waveLength(0), m_isResource(true)
 {
 }
 
 wxWave::wxWave(const wxString& sFileName, bool isResource)
-  : m_hSnd(NULL), m_waveLength(0), m_isResource(true), m_sndChan(0)
+  : m_sndChan(0), m_hSnd(NULL), m_waveLength(0), m_isResource(true)
 {
     Create(sFileName, isResource);
 }
@@ -31,130 +40,134 @@ wxWave::wxWave(const wxString& sFileName, bool isResource)
 
 wxWave::~wxWave()
 {
-    Free();
+    FreeData();
 }
 
+wxWave::wxWave(int size, const wxByte* data)
+  : m_sndChan(0), m_hSnd(NULL), m_waveLength(0), m_isResource(false)
+{
+    //TODO convert data
+}
 
 bool wxWave::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;
+    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, wth
 bool wxWave::Play(bool async, bool looped) const
 {
-       char lpSnd[32];
-       bool ret = false;
-       
-       if (m_isResource) 
-       {
-               strcpy(lpSnd, m_sndname); 
-               c2pstr((char *) lpSnd);
-               SndListHandle hSnd;
-               
-               hSnd = (SndListHandle) GetNamedResource('snd ',(const unsigned char *) lpSnd);
-
-               if ((hSnd != NULL) && (SndPlay(m_sndChan, hSnd, async) == noErr))
-                       ret = true;
-       } 
-       
-       return ret;
+    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, async) == noErr))
+               ret = true;
+    }
+
+    return ret;
 }
 
 
-bool wxWave::Free()
+bool wxWave::FreeData()
 {
-       bool ret = false;
-       
-       if (m_isResource)
-       {
-               m_sndname.Empty();
-               ret = true;
-       }
-       else
-       {
-               //TODO, 
-       }
-       
-       return ret;
+    bool ret = false;
+
+    if (m_isResource)
+    {
+        m_sndname.Empty();
+        ret = true;
+    }
+    else
+    {
+        //TODO,
+    }
+
+    return ret;
 }
 
 
@@ -164,66 +177,67 @@ bool wxWave::Free()
 
 /*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;
+    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);
+    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