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

📄 sound.cxx

📁 安装 H323需要的pwlib库
💻 CXX
字号:
/* * sound.cxx * * Code for pluigns sound device * * Portable Windows Library * * Copyright (c) 2003 Post Increment * * The contents of this file are subject to the Mozilla Public License * Version 1.0 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See * the License for the specific language governing rights and limitations * under the License. * * The Original Code is Portable Windows Library. * * The Initial Developer of the Original Code is Post Increment * * Contributor(s): Craig Southeren *                 Snark at GnomeMeeting * * $Log: sound.cxx,v $ * Revision 1.10  2004/11/17 10:13:14  csoutheren * Fixed compilation with gcc 4.0.0 * * Revision 1.9  2004/10/28 20:07:10  csoutheren * Fixes for MacOSX platforms, thanks to Hannes Friederich * * Revision 1.8  2004/08/16 06:40:59  csoutheren * Added adapters template to make device plugins available via the abstract factory interface * * Revision 1.7  2004/04/03 23:53:10  csoutheren * Added various changes to improce compatibility with the Sun Forte compiler *   Thanks to Brian Cameron * Added detection of readdir_r version * * Revision 1.6  2004/04/02 04:07:54  ykiryanov * Added ifndef BeOS for PSound * * Revision 1.5  2003/11/12 08:55:58  csoutheren * Added newline at end of file to remove gcc warning * * Revision 1.4  2003/11/12 05:17:25  csoutheren * Added more backwards compatibility functions for PSoundChannel * * Revision 1.3  2003/11/12 04:42:02  csoutheren * Removed non-specific code when compiling for WIn32 * * Revision 1.2  2003/11/12 03:27:25  csoutheren * Initial version of plugin code from Snark of GnomeMeeting with changes *    by Craig Southeren of Post Increment * * Revision 1.1.2.1  2003/10/07 01:33:19  csoutheren * Initial checkin of pwlib code to do plugins. * Modified from original code and concept provided by Snark of Gnomemeeting * */#ifdef __GNUC__#pragma implementation "sound.h"#endif#include <ptlib.h>#include <ptlib/sound.h>#include <ptlib/pluginmgr.h>static const char soundPluginBaseClass[] = "PSoundChannel";template <> PSoundChannel * PDevicePluginFactory<PSoundChannel>::Worker::Create(const PString & type) const{  return PSoundChannel::CreateChannel(type);}namespace PWLib {  PFactory<PDevicePluginAdapterBase>::Worker< PDevicePluginAdapter<PSoundChannel> > soundChannelFactoryAdapter("PSoundChannel", TRUE);};namespace PWLibStupidWindowsHacks {  int loadSoundStuff;};PStringList PSoundChannel::GetDriverNames(PPluginManager * _pluginMgr){  PPluginManager * pluginMgr = (_pluginMgr != NULL) ? _pluginMgr : &PPluginManager::GetPluginManager();  return pluginMgr->GetPluginsProviding(soundPluginBaseClass);}PStringList PSoundChannel::GetDeviceNames(const PString & driverName,                          const PSoundChannel::Directions dir,                                         PPluginManager * _pluginMgr){  PPluginManager * pluginMgr = (_pluginMgr != NULL) ? _pluginMgr : &PPluginManager::GetPluginManager();  PSoundChannelPluginServiceDescriptor * descr =    (PSoundChannelPluginServiceDescriptor *)pluginMgr->GetServiceDescriptor(driverName, soundPluginBaseClass);  if (descr != NULL)    return PStringList(descr->GetDeviceNames(dir));  else    return PStringList();}PSoundChannel * PSoundChannel::CreateChannel(const PString & driverName, PPluginManager * _pluginMgr){  PPluginManager * pluginMgr = (_pluginMgr != NULL) ? _pluginMgr : &PPluginManager::GetPluginManager();  PSoundChannelPluginServiceDescriptor * descr =    (PSoundChannelPluginServiceDescriptor *)pluginMgr->GetServiceDescriptor(driverName, soundPluginBaseClass);  if (descr != NULL)    return (PSoundChannel *)descr->CreateInstance ();  else    return NULL;}PSoundChannel * PSoundChannel::CreateOpenedChannel(      const PString & driverName,      const PString & deviceName,      const PSoundChannel::Directions dir,      unsigned numChannels,      unsigned sampleRate,      unsigned bitsPerSample){  PSoundChannel * sndChan = PSoundChannel::CreateChannel(driverName);  if (sndChan != NULL) {    if (!sndChan->Open(deviceName, dir, numChannels, sampleRate, bitsPerSample)) {      delete sndChan;      sndChan = NULL;    }  }  return sndChan;}PStringList PSoundChannel::GetDeviceNames(      Directions dir    // Sound I/O direction    ){  PStringArray names = GetDriverNames();  if (names.GetSize() > 0)    return GetDeviceNames(names[0], dir);  return PStringList();}PString PSoundChannel::GetDefaultDevice(      Directions dir    // Sound I/O direction){  PStringList devices = GetDeviceNames(dir);  if (devices.GetSize() > 0)    return devices[0];  return PString::Empty();}PSoundChannel::PSoundChannel(){  baseChannel = NULL;}PSoundChannel::~PSoundChannel(){  delete baseChannel;}PSoundChannel::PSoundChannel(      const PString & device,       /// Name of sound driver/device      Directions dir,               /// Sound I/O direction      unsigned numChannels,         /// Number of channels eg mono/stereo      unsigned sampleRate,          /// Samples per second      unsigned bitsPerSample        /// Number of bits per sample){  baseChannel = NULL;  Open(device, dir, numChannels, sampleRate, bitsPerSample);}BOOL PSoundChannel::Open(      const PString & device,   /// Name of sound driver/device      Directions dir,           /// Sound I/O direction      unsigned numChannels,     /// Number of channels eg mono/stereo      unsigned sampleRate,      /// Samples per second      unsigned bitsPerSample    /// Number of bits per sample    ){  if (baseChannel == NULL) {    PStringArray names = GetDriverNames();    if (names.GetSize() == 0)      return FALSE;    baseChannel = CreateChannel(names[0]);  }  if (baseChannel == NULL)    return FALSE;  return baseChannel->Open(device, dir, numChannels, sampleRate, bitsPerSample);}///////////////////////////////////////////////////////////////////////////#if !defined(_WIN32) && !defined(__BEOS__) && !defined(__APPLE__)PSound::PSound(unsigned channels,               unsigned samplesPerSecond,               unsigned bitsPerSample,               PINDEX   bufferSize,               const BYTE * buffer){  encoding = 0;  numChannels = channels;  sampleRate = samplesPerSecond;  sampleSize = bitsPerSample;  SetSize(bufferSize);  if (buffer != NULL)    memcpy(GetPointer(), buffer, bufferSize);}PSound::PSound(const PFilePath & filename){  encoding = 0;  numChannels = 1;  sampleRate = 8000;  sampleSize = 16;  Load(filename);}PSound & PSound::operator=(const PBYTEArray & data){  PBYTEArray::operator=(data);  return *this;}void PSound::SetFormat(unsigned channels,                       unsigned samplesPerSecond,                       unsigned bitsPerSample){  encoding = 0;  numChannels = channels;  sampleRate = samplesPerSecond;  sampleSize = bitsPerSample;  formatInfo.SetSize(0);}BOOL PSound::Load(const PFilePath & /*filename*/){  return FALSE;}BOOL PSound::Save(const PFilePath & /*filename*/){  return FALSE;}BOOL PSound::Play(){  PSoundChannel channel(PSoundChannel::GetDefaultDevice(PSoundChannel::Player),                        PSoundChannel::Player);  if (!channel.IsOpen())    return FALSE;  return channel.PlaySound(*this, TRUE);}BOOL PSound::PlayFile(const PFilePath & file, BOOL wait){  PSoundChannel channel(PSoundChannel::GetDefaultDevice(PSoundChannel::Player),                        PSoundChannel::Player);  if (!channel.IsOpen())    return FALSE;  return channel.PlayFile(file, wait);}#endif //_WIN32

⌨️ 快捷键说明

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