206 lines
5.0 KiB
C++
206 lines
5.0 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
// Name: src/msw/sound.cpp
|
|
// Purpose: wxSound
|
|
// Author: Julian Smart
|
|
// Modified by: 2005-07-29: Vadim Zeitlin: redesign
|
|
// Created: 04/01/98
|
|
// RCS-ID: $Id: sound.cpp 69178 2011-09-21 15:08:02Z VZ $
|
|
// Copyright: (c) Julian Smart
|
|
// Licence: wxWindows licence
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
// ============================================================================
|
|
// declarations
|
|
// ============================================================================
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// headers
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// For compilers that support precompilation, includes "wx.h".
|
|
#include "wx/wxprec.h"
|
|
|
|
#if defined(__BORLANDC__)
|
|
#pragma hdrstop
|
|
#endif
|
|
|
|
#if wxUSE_SOUND
|
|
|
|
#include "wx/sound.h"
|
|
#include "wx/msw/private.h"
|
|
|
|
#include <mmsystem.h>
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// wxSoundData
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// ABC for different sound data representations
|
|
class wxSoundData
|
|
{
|
|
public:
|
|
wxSoundData() { }
|
|
|
|
// return true if we had been successfully initialized
|
|
virtual bool IsOk() const = 0;
|
|
|
|
// get the flag corresponding to our content for PlaySound()
|
|
virtual DWORD GetSoundFlag() const = 0;
|
|
|
|
// get the data to be passed to PlaySound()
|
|
virtual LPCTSTR GetSoundData() const = 0;
|
|
|
|
virtual ~wxSoundData() { }
|
|
};
|
|
|
|
// class for in-memory sound data
|
|
class wxSoundDataMemory : public wxSoundData
|
|
{
|
|
public:
|
|
// we copy the data
|
|
wxSoundDataMemory(size_t size, const void* buf);
|
|
|
|
void *GetPtr() const { return m_waveDataPtr; }
|
|
|
|
virtual bool IsOk() const { return GetPtr() != NULL; }
|
|
virtual DWORD GetSoundFlag() const { return SND_MEMORY; }
|
|
virtual LPCTSTR GetSoundData() const { return (LPCTSTR)GetPtr(); }
|
|
|
|
private:
|
|
GlobalPtr m_waveData;
|
|
GlobalPtrLock m_waveDataPtr;
|
|
|
|
wxDECLARE_NO_COPY_CLASS(wxSoundDataMemory);
|
|
};
|
|
|
|
// class for sound files and resources
|
|
class wxSoundDataFile : public wxSoundData
|
|
{
|
|
public:
|
|
wxSoundDataFile(const wxString& filename, bool isResource);
|
|
|
|
virtual bool IsOk() const { return !m_name.empty(); }
|
|
virtual DWORD GetSoundFlag() const
|
|
{
|
|
return m_isResource ? SND_RESOURCE : SND_FILENAME;
|
|
}
|
|
virtual LPCTSTR GetSoundData() const { return m_name.c_str(); }
|
|
|
|
private:
|
|
const wxString m_name;
|
|
const bool m_isResource;
|
|
|
|
wxDECLARE_NO_COPY_CLASS(wxSoundDataFile);
|
|
};
|
|
|
|
// ============================================================================
|
|
// implementation
|
|
// ============================================================================
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// wxSoundData-derived classes
|
|
// ----------------------------------------------------------------------------
|
|
|
|
wxSoundDataMemory::wxSoundDataMemory(size_t size, const void* buf)
|
|
: m_waveData(size),
|
|
m_waveDataPtr(m_waveData)
|
|
{
|
|
if ( IsOk() )
|
|
::CopyMemory(m_waveDataPtr, buf, size);
|
|
}
|
|
|
|
wxSoundDataFile::wxSoundDataFile(const wxString& filename, bool isResource)
|
|
: m_name(filename),
|
|
m_isResource(isResource)
|
|
{
|
|
// check for file/resource existence?
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// wxSound
|
|
// ----------------------------------------------------------------------------
|
|
|
|
wxSound::wxSound()
|
|
{
|
|
Init();
|
|
}
|
|
|
|
wxSound::wxSound(const wxString& filename, bool isResource)
|
|
{
|
|
Init();
|
|
Create(filename, isResource);
|
|
}
|
|
|
|
wxSound::wxSound(size_t size, const void* data)
|
|
{
|
|
Init();
|
|
Create(size, data);
|
|
}
|
|
|
|
wxSound::~wxSound()
|
|
{
|
|
Free();
|
|
}
|
|
|
|
void wxSound::Free()
|
|
{
|
|
wxDELETE(m_data);
|
|
}
|
|
|
|
bool wxSound::CheckCreatedOk()
|
|
{
|
|
if ( m_data && !m_data->IsOk() )
|
|
Free();
|
|
|
|
return m_data != NULL;
|
|
}
|
|
|
|
bool wxSound::Create(const wxString& filename, bool isResource)
|
|
{
|
|
Free();
|
|
|
|
m_data = new wxSoundDataFile(filename, isResource);
|
|
|
|
return CheckCreatedOk();
|
|
}
|
|
|
|
bool wxSound::Create(size_t size, const void* data)
|
|
{
|
|
Free();
|
|
|
|
m_data = new wxSoundDataMemory(size, data);
|
|
|
|
return CheckCreatedOk();
|
|
}
|
|
|
|
bool wxSound::DoPlay(unsigned flags) const
|
|
{
|
|
if ( !IsOk() || !m_data->IsOk() )
|
|
return false;
|
|
|
|
DWORD flagsMSW = m_data->GetSoundFlag();
|
|
HMODULE hmod = flagsMSW == SND_RESOURCE ? wxGetInstance() : NULL;
|
|
|
|
// we don't want replacement default sound
|
|
flagsMSW |= SND_NODEFAULT;
|
|
|
|
// NB: wxSOUND_SYNC is 0, don't test for it
|
|
flagsMSW |= (flags & wxSOUND_ASYNC) ? SND_ASYNC : SND_SYNC;
|
|
if ( flags & wxSOUND_LOOP )
|
|
{
|
|
// looping only works with async flag
|
|
flagsMSW |= SND_LOOP | SND_ASYNC;
|
|
}
|
|
|
|
return ::PlaySound(m_data->GetSoundData(), hmod, flagsMSW) != FALSE;
|
|
}
|
|
|
|
/* static */
|
|
void wxSound::Stop()
|
|
{
|
|
::PlaySound(NULL, NULL, 0);
|
|
}
|
|
|
|
#endif // wxUSE_SOUND
|
|
|