00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #ifndef PTLIB_SOUND_H
00036 #define PTLIB_SOUND_H
00037
00038 #ifdef P_USE_PRAGMA
00039 #pragma interface
00040 #endif
00041
00042 #include <ptlib/plugin.h>
00043 #include <ptlib/pluginmgr.h>
00044
00052 class PSound : public PBYTEArray
00053 {
00054 PCLASSINFO(PSound, PBYTEArray);
00055
00056 public:
00065 PSound(
00066 unsigned numChannels = 1,
00067 unsigned sampleRate = 8000,
00068 unsigned bitsPerSample = 16,
00069 PINDEX bufferSize = 0,
00070 const BYTE * data = NULL
00071 );
00072
00075 PSound(
00076 const PFilePath & filename
00077 );
00078
00081 PSound & operator=(
00082 const PBYTEArray & data
00083 );
00085
00097 PBoolean Load(
00098 const PFilePath & filename
00099 );
00100
00107 PBoolean Save(
00108 const PFilePath & filename
00109 );
00111
00114
00115 PBoolean Play();
00116
00118 PBoolean Play(const PString & device);
00119
00123 void SetFormat(
00124 unsigned numChannels,
00125 unsigned sampleRate,
00126 unsigned bitsPerSample
00127 );
00128
00132 unsigned GetEncoding() const { return encoding; }
00133
00135 unsigned GetChannels() const { return numChannels; }
00136
00138 unsigned GetSampleRate() const { return sampleRate; }
00139
00141 unsigned GetSampleSize() const { return sampleSize; }
00142
00144 DWORD GetErrorCode() const { return dwLastError; }
00145
00147 PINDEX GetFormatInfoSize() const { return formatInfo.GetSize(); }
00148
00150 const void * GetFormatInfoData() const { return (const BYTE *)formatInfo; }
00152
00163 static PBoolean PlayFile(
00164 const PFilePath & file,
00165 PBoolean wait = true
00166 );
00167
00169 static void Beep();
00171
00172 protected:
00174 unsigned encoding;
00176 unsigned numChannels;
00178 unsigned sampleRate;
00180 unsigned sampleSize;
00182 DWORD dwLastError;
00184 PBYTEArray formatInfo;
00185 };
00186
00187
00252 class PSoundChannel : public PChannel
00253 {
00254 PCLASSINFO(PSoundChannel, PChannel);
00255
00256 public:
00259 enum Directions {
00260 Recorder,
00261 Player
00262 };
00263
00265 PSoundChannel();
00266
00270 PSoundChannel(
00271 const PString & device,
00272 Directions dir,
00273 unsigned numChannels = 1,
00274 unsigned sampleRate = 8000,
00275 unsigned bitsPerSample = 16
00276 );
00277
00278
00279 virtual ~PSoundChannel();
00280
00282
00287 static PStringArray GetDriverNames(
00288 PPluginManager * pluginMgr = NULL
00289 );
00290
00295 static PStringArray GetDriversDeviceNames(
00296 const PString & driverName,
00297 Directions direction,
00298 PPluginManager * pluginMgr = NULL
00299 );
00300
00301
00302 static inline PStringArray GetDeviceNames(
00303 const PString & driverName,
00304 Directions direction,
00305 PPluginManager * pluginMgr = NULL
00306 ) { return GetDriversDeviceNames(driverName, direction, pluginMgr); }
00307
00310 static PSoundChannel * CreateChannel (
00311 const PString & driverName,
00312 PPluginManager * pluginMgr = NULL
00313 );
00314
00315
00316
00317
00318
00319
00320
00321
00322 static PSoundChannel * CreateChannelByName(
00323 const PString & deviceName,
00324 Directions direction,
00325 PPluginManager * pluginMgr = NULL
00326 );
00327
00333 static PSoundChannel * CreateOpenedChannel(
00334 const PString & driverName,
00335 const PString & deviceName,
00336 Directions direction,
00337 unsigned numChannels = 1,
00338 unsigned sampleRate = 8000,
00339 unsigned bitsPerSample = 16,
00340 PPluginManager * pluginMgr = NULL
00341 );
00342
00355 static PString GetDefaultDevice(
00356 Directions dir
00357 );
00358
00367 static PStringArray GetDeviceNames(
00368 Directions direction,
00369 PPluginManager * pluginMgr = NULL
00370 );
00371
00378 virtual PBoolean Open(
00379 const PString & device,
00380 Directions dir,
00381 unsigned numChannels = 1,
00382 unsigned sampleRate = 8000,
00383 unsigned bitsPerSample = 16
00384 );
00385
00391 virtual PBoolean IsOpen() const;
00392
00397 virtual PBoolean Close();
00398
00404 virtual int GetHandle() const;
00405
00407 virtual PString GetName() const;
00408
00416 virtual PBoolean Abort();
00418
00430 virtual PBoolean SetFormat(
00431 unsigned numChannels = 1,
00432 unsigned sampleRate = 8000,
00433 unsigned bitsPerSample = 16
00434 );
00435
00437 virtual unsigned GetChannels() const;
00438
00440 virtual unsigned GetSampleRate() const;
00441
00443 virtual unsigned GetSampleSize() const;
00444
00453 virtual PBoolean SetBuffers(
00454 PINDEX size,
00455 PINDEX count = 2
00456 );
00457
00463 virtual PBoolean GetBuffers(
00464 PINDEX & size,
00465 PINDEX & count
00466 );
00467
00468 enum {
00469 MaxVolume = 100
00470 };
00471
00480 virtual PBoolean SetVolume(
00481 unsigned volume
00482 );
00483
00492 virtual PBoolean GetVolume(
00493 unsigned & volume
00494 );
00496
00499
00521 virtual PBoolean Write(const void * buf, PINDEX len);
00522
00523
00547 virtual PBoolean Write(
00548 const void * buf,
00549 PINDEX len,
00550 const void * mark
00551 );
00552
00554 virtual PINDEX GetLastWriteCount() const;
00555
00572 virtual PBoolean PlaySound(
00573 const PSound & sound,
00574 PBoolean wait = true
00575 );
00576
00592 virtual PBoolean PlayFile(
00593 const PFilePath & file,
00594 PBoolean wait = true
00595 );
00596
00603 virtual PBoolean HasPlayCompleted();
00604
00611 virtual PBoolean WaitForPlayCompletion();
00612
00614
00645 virtual PBoolean Read(
00646 void * buf,
00647 PINDEX len
00648 );
00649
00651 PINDEX GetLastReadCount() const;
00652
00670 virtual PBoolean RecordSound(
00671 PSound & sound
00672 );
00673
00686 virtual PBoolean RecordFile(
00687 const PFilePath & file
00688 );
00689
00696 virtual PBoolean StartRecording();
00697
00705 virtual PBoolean IsRecordBufferFull();
00706
00715 virtual PBoolean AreAllRecordBuffersFull();
00716
00724 virtual PBoolean WaitForRecordBufferFull();
00725
00734 virtual PBoolean WaitForAllRecordBuffersFull();
00736
00737 protected:
00738 PSoundChannel * baseChannel;
00739
00744 Directions activeDirection;
00745 };
00746
00747
00749
00750
00751
00752 template <class className> class PSoundChannelPluginServiceDescriptor : public PDevicePluginServiceDescriptor
00753 {
00754 public:
00755 virtual PObject * CreateInstance(int ) const { return new className; }
00756 virtual PStringArray GetDeviceNames(int userData) const { return className::GetDeviceNames((PSoundChannel::Directions)userData); }
00757 };
00758
00759 #define PCREATE_SOUND_PLUGIN(name, className) \
00760 static PSoundChannelPluginServiceDescriptor<className> className##_descriptor; \
00761 PCREATE_PLUGIN(name, PSoundChannel, &className##_descriptor)
00762
00763 #ifdef _WIN32
00764 PPLUGIN_STATIC_LOAD(WindowsMultimedia, PSoundChannel);
00765 #elif defined(__BEOS__)
00766 PPLUGIN_STATIC_LOAD(BeOS, PSoundChannel);
00767 #endif
00768
00769 #if defined(P_DIRECTSOUND)
00770 PPLUGIN_STATIC_LOAD(DirectSound, PSoundChannel);
00771 #endif
00772
00773 #if defined(P_WAVFILE)
00774 PPLUGIN_STATIC_LOAD(WAVFile, PSoundChannel)
00775 #endif
00776
00777
00778 #endif // PTLIB_SOUND_H
00779
00780
00781