#include <sound_driver_dsound.h>
Inheritance diagram for NLSOUND::CSoundDriverDSound:

Public Member Functions | |
| virtual void | commit3DChanges () |
| Commit all the changes made to 3D settings of listener and sources. | |
| uint | countHw2DBuffers () |
| Count the number of available hardware streaming 2D buffers. | |
| uint | countHw3DBuffers () |
| Count the number of available hardware streaming 3D buffers. | |
| virtual uint | countMaxSources () |
| Return the maximum number of sources that can created. | |
| uint | countPlayingSources () |
| Count the number of sources that are actually playing. | |
| virtual IBuffer * | createBuffer () |
| Create a sound buffer. | |
| virtual IListener * | createListener () |
| Create the listener instance. | |
| virtual ISource * | createSource () |
| Create a source. | |
| CSoundDriverDSound () | |
| Constructor. | |
| float | getGain () |
| Get the gain. | |
| IStringMapperProvider * | getStringMapper () |
| Return the string mapper. | |
| virtual bool | init (HWND wnd, bool useEax, IStringMapperProvider *stringMapper) |
| Initialization. | |
| virtual bool | readRawBuffer (IBuffer *destbuffer, const std::string &name, uint8 *rawData, uint dataSize, TSampleFormat format, uint32 frequency) |
| virtual bool | readWavBuffer (IBuffer *destbuffer, const std::string &name, uint8 *wavData, uint dataSize) |
| Load a wave file in to the buffer. | |
| void | setGain (float gain) |
| void | update () |
| Update all the driver and its sources. To be called only by the timer callback. | |
| void | writeProfile (std::ostream &out) |
| Write information about the driver to the output stream. | |
| virtual | ~CSoundDriverDSound () |
Static Public Member Functions | |
| ISoundDriver * | createDriver (bool useEax, IStringMapperProvider *stringMapper) |
| CSoundDriverDSound * | instance () |
| Return the instance of the singleton. | |
Static Public Attributes | |
| const uint32 | InterfaceVersion = 0x08 |
| Version of the driver interface. To increment when the interface change. | |
Private Member Functions | |
| friend | CBufferDSound::~CBufferDSound () |
| friend | CSourceDSound::~CSourceDSound () |
| virtual void | displayBench (NLMISC::CLog *log) |
| virtual void | endBench () |
| virtual void | removeBuffer (IBuffer *buffer) |
| Remove a buffer (should be called by the friend destructor of the buffer class). | |
| virtual void | removeSource (ISource *source) |
| Remove a source (should be called by the friend destructor of the source class). | |
| virtual void | startBench () |
Static Private Member Functions | |
| void CALLBACK | TimerCallback (UINT uID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2) |
Private Attributes | |
| DSCAPS | _Caps |
| LPDIRECTSOUND8 | _DirectSound |
| LPDIRECTSOUNDBUFFER | _PrimaryBuffer |
| uint | _SourceCount |
| std::set< CSourceDSound * > | _Sources |
| IStringMapperProvider * | _StringMapper |
| The string mapper provided by client code. | |
| UINT | _TimerID |
| uint32 | _TimerResolution |
| bool | _UseEAX |
| The EAX support is requested and accepted (ie, there is enougth hardware 3D buffer). | |
Static Private Attributes | |
| CSoundDriverDSound * | _Instance = NULL |
| uint32 | _TimerPeriod = 100 |
|
|
Constructor.
|
|
|
Definition at line 561 of file sound_driver_dsound.cpp. References _DirectSound, _PrimaryBuffer, _TimerID, _TimerResolution, and nldebug.
00562 {
00563 nldebug("Destroying DirectSound driver");
00564
00565 if (_TimerID != NULL)
00566 {
00567 timeKillEvent(_TimerID);
00568 timeEndPeriod(_TimerResolution);
00569 }
00570
00571
00572 // Assure that the remaining sources have released all their DSBuffers
00573 // before closing down DirectSound
00574 set<CSourceDSound*>::iterator iter;
00575
00576 for (iter = _Sources.begin(); iter != _Sources.end(); iter++)
00577 {
00578 (*iter)->release();
00579 }
00580
00581
00582 // Assure that the listener has released all resources before closing
00583 // down DirectSound
00584 if (CListenerDSound::instance() != 0)
00585 {
00586 CListenerDSound::instance()->release();
00587 }
00588
00589
00590 if (_PrimaryBuffer != NULL)
00591 {
00592 _PrimaryBuffer->Release();
00593 _PrimaryBuffer = NULL;
00594 }
00595
00596 if (_DirectSound != NULL)
00597 {
00598 _DirectSound->Release();
00599 _DirectSound = NULL;
00600 }
00601
00602 _Instance = 0;
00603
00604 // free the enumerated list
00605 if (CDeviceDescription::_List)
00606 {
00607 delete CDeviceDescription::_List;
00608 CDeviceDescription::_List = NULL;
00609 }
00610 }
|
|
|
|
|
|
|
|
|
Commit all the changes made to 3D settings of listener and sources.
Implements NLSOUND::ISoundDriver. Definition at line 886 of file sound_driver_dsound.cpp. References NLSOUND::CListenerDSound::commit3DChanges(), and NLSOUND::CListenerDSound::getPos().
00887 {
00888 CListenerDSound* listener = CListenerDSound::instance();
00889 listener->commit3DChanges();
00890
00891
00892 const CVector &origin = listener->getPos();
00893
00894 set<CSourceDSound*>::iterator iter;
00895
00896 // We handle the volume of the source according to the distance
00897 // ourselves. Call updateVolume() to, well..., update the volume
00898 // according to, euh ..., the new distance!
00899 for (iter = _Sources.begin(); iter != _Sources.end(); iter++)
00900 {
00901 if ((*iter)->isPlaying())
00902 {
00903 (*iter)->updateVolume(origin);
00904 }
00905 }
00906 }
|
|
|
Count the number of available hardware streaming 2D buffers.
Definition at line 779 of file sound_driver_dsound.cpp. References _DirectSound, and uint. Referenced by countMaxSources(), NLSOUND::CSourceDSound::init(), and init().
00780 {
00781 DSCAPS caps;
00782 caps.dwSize = sizeof(caps);
00783
00784 if (_DirectSound->GetCaps(&caps) != DS_OK)
00785 {
00786 throw ESoundDriver("Failed to query the sound device caps");
00787 }
00788
00789 return caps.dwFreeHwMixingStreamingBuffers;
00790 }
|
|
|
Count the number of available hardware streaming 3D buffers.
Definition at line 764 of file sound_driver_dsound.cpp. References _DirectSound, and uint. Referenced by countMaxSources(), NLSOUND::CSourceDSound::init(), and init().
00765 {
00766 DSCAPS caps;
00767 caps.dwSize = sizeof(caps);
00768
00769 if (_DirectSound->GetCaps(&caps) != DS_OK)
00770 {
00771 throw ESoundDriver("Failed to query the sound device caps");
00772 }
00773
00774 return caps.dwFreeHw3DStreamingBuffers;
00775 }
|
|
|
Return the maximum number of sources that can created.
Implements NLSOUND::ISoundDriver. Definition at line 613 of file sound_driver_dsound.cpp. References countHw2DBuffers(), countHw3DBuffers(), and uint.
00614 {
00615 // Try the hardware 3d buffers first
00616 uint n = countHw3DBuffers();
00617 if (n > 0)
00618 {
00619 return n;
00620 }
00621
00622 // If not, try the hardware 2d buffers first
00623 n = countHw2DBuffers();
00624 if (n > 0)
00625 {
00626 return n;
00627 }
00628
00629 // Okay, we'll use 32 software buffers
00630 return 32;
00631 }
|
|
|
Count the number of sources that are actually playing.
Definition at line 911 of file sound_driver_dsound.cpp. References uint. Referenced by writeProfile().
|
|
|
Create a sound buffer.
Implements NLSOUND::ISoundDriver. Definition at line 820 of file sound_driver_dsound.cpp. References _PrimaryBuffer.
00821 {
00822 NL_ALLOC_CONTEXT(NLSOUND_CSoundDriverDSound);
00823 if (_PrimaryBuffer == 0)
00824 {
00825 throw ESoundDriver("Corrupt driver");
00826 }
00827
00828
00829 // FIXME: set buffer ID
00830 return new CBufferDSound();
00831 }
|
|
||||||||||||
|
The static method which builds the sound driver instance In case of failure, can throw one of these ESoundDriver exception objects: ESoundDriverNotFound, ESoundDriverCorrupted, ESoundDriverOldVersion, ESoundDriverUnknownVersion You can request support for EAX. If EAX is requested and if there is enougth hardware buffer replay, then only hardware buffer are created when calling createBuffer. If the number of available hardware buffer is less than 10, then EAX is ignored. Definition at line 61 of file sound_driver.cpp. References buffer, NLSOUND::ISDRV_CREATE_PROC, NLSOUND::ISDRV_VERSION_PROC, nlinfo, and nlwarning.
00062 {
00063 ISDRV_CREATE_PROC createSoundDriver = NULL;
00064 ISDRV_VERSION_PROC versionDriver = NULL;
00065
00066 #ifdef NL_OS_WINDOWS
00067
00068 // WINDOWS code.
00069 HINSTANCE hInst;
00070
00071 hInst = LoadLibrary(NLSOUND_DLL_NAME);
00072
00073 if (!hInst)
00074 {
00075 throw ESoundDriverNotFound();
00076 }
00077
00078 char buffer[1024], *ptr;
00079 SearchPath (NULL, NLSOUND_DLL_NAME, NULL, 1023, buffer, &ptr);
00080 nlinfo ("Using the library '"NLSOUND_DLL_NAME"' that is in the directory: '%s'", buffer);
00081
00082 createSoundDriver = (ISDRV_CREATE_PROC) GetProcAddress (hInst, IDRV_CREATE_PROC_NAME);
00083 if (createSoundDriver == NULL)
00084 {
00085 nlinfo( "Error: %u", GetLastError() );
00086 throw ESoundDriverCorrupted();
00087 }
00088
00089 versionDriver = (ISDRV_VERSION_PROC) GetProcAddress (hInst, IDRV_VERSION_PROC_NAME);
00090 if (versionDriver != NULL)
00091 {
00092 if (versionDriver()<ISoundDriver::InterfaceVersion)
00093 throw ESoundDriverOldVersion();
00094 else if (versionDriver()>ISoundDriver::InterfaceVersion)
00095 throw ESoundDriverUnknownVersion();
00096 }
00097
00098 #elif defined (NL_OS_UNIX)
00099
00100 // Unix code
00101 void *handle = dlopen(NLSOUND_DLL_NAME, RTLD_NOW);
00102
00103 if (handle == NULL)
00104 {
00105 nlwarning ("when loading dynamic library '%s': %s", NLSOUND_DLL_NAME, dlerror());
00106 throw ESoundDriverNotFound();
00107 }
00108
00109 /* Not ANSI. Might produce a warning */
00110 createSoundDriver = (ISDRV_CREATE_PROC) dlsym (handle, IDRV_CREATE_PROC_NAME);
00111 if (createSoundDriver == NULL)
00112 {
00113 nlwarning ("when getting function in dynamic library '%s': %s", NLSOUND_DLL_NAME, dlerror());
00114 throw ESoundDriverCorrupted();
00115 }
00116
00117 versionDriver = (ISDRV_VERSION_PROC) dlsym (handle, IDRV_VERSION_PROC_NAME);
00118 if (versionDriver != NULL)
00119 {
00120 if (versionDriver()<ISoundDriver::InterfaceVersion)
00121 throw ESoundDriverOldVersion();
00122 else if (versionDriver()>ISoundDriver::InterfaceVersion)
00123 throw ESoundDriverUnknownVersion();
00124 }
00125
00126 #else // NL_OS_UNIX
00127 #error "Dynamic DLL loading not implemented!"
00128 #endif // NL_OS_UNIX
00129
00130 ISoundDriver *ret = createSoundDriver(useEax, stringMapper);
00131 if ( ret == NULL )
00132 {
00133 throw ESoundDriverCantCreateDriver();
00134 }
00135 return ret;
00136 }
|
|
|
Create the listener instance.
Implements NLSOUND::ISoundDriver. Definition at line 794 of file sound_driver_dsound.cpp. References _PrimaryBuffer, and nlwarning.
00795 {
00796 NL_ALLOC_CONTEXT(NLSOUND_CSoundDriverDSound);
00797 LPDIRECTSOUND3DLISTENER8 dsoundListener;
00798
00799 if (CListenerDSound::instance() != NULL)
00800 {
00801 return CListenerDSound::instance();
00802 }
00803
00804 if (_PrimaryBuffer == 0)
00805 {
00806 throw ESoundDriver("Corrupt driver");
00807 }
00808
00809 if (FAILED(_PrimaryBuffer->QueryInterface(IID_IDirectSound3DListener, (LPVOID *) &dsoundListener)))
00810 {
00811 nlwarning("The 3D listener interface is not available.");
00812 return new CListenerDSound(NULL);
00813 }
00814
00815 return new CListenerDSound(dsoundListener);
00816 }
|
|
|
Create a source.
Implements NLSOUND::ISoundDriver. Definition at line 860 of file sound_driver_dsound.cpp. References _DirectSound, _PrimaryBuffer, _UseEAX, and src.
00861 {
00862 NL_ALLOC_CONTEXT(NLSOUND_CSoundDriverDSound);
00863 if (_PrimaryBuffer == 0)
00864 {
00865 throw ESoundDriver("Corrupt driver");
00866 }
00867
00868
00869 CSourceDSound* src = new CSourceDSound(0);
00870 src->init(_DirectSound, _UseEAX);
00871 _Sources.insert(src);
00872
00873 return src;
00874 }
|
|
|
Implements NLSOUND::ISoundDriver. Definition at line 1064 of file sound_driver_dsound.cpp. References NLMISC::CHTimer::display(), NLMISC::CHTimer::displayByExecutionPath(), NLMISC::CHTimer::displayHierarchical(), and NLMISC::CHTimer::displayHierarchicalByExecutionPathSorted().
01065 {
01066 NLMISC::CHTimer::displayHierarchicalByExecutionPathSorted(log, CHTimer::TotalTime, true, 48, 2);
01067 NLMISC::CHTimer::displayHierarchical(log, true, 48, 2);
01068 NLMISC::CHTimer::displayByExecutionPath(log, CHTimer::TotalTime);
01069 NLMISC::CHTimer::display(log, CHTimer::TotalTime);
01070 }
|
|
|
Implements NLSOUND::ISoundDriver. Definition at line 1060 of file sound_driver_dsound.cpp. References NLMISC::CHTimer::endBench().
01061 {
01062 NLMISC::CHTimer::endBench();
01063 }
|
|
|
Get the gain.
Definition at line 962 of file sound_driver_dsound.cpp. References _PrimaryBuffer, and nldebug.
00963 {
00964 if (_PrimaryBuffer != 0)
00965 {
00966 /* convert from hundredths of decibels to linear amplitude */
00967 LONG volume;
00968 HRESULT hr = _PrimaryBuffer->GetVolume(&volume);
00969
00970 if (hr != DS_OK)
00971 {
00972 nldebug("Failed to get the volume");
00973 return 1.0;
00974 }
00975
00976 return (float) pow(10, (double) volume / 20.0 / 100.0);
00977 }
00978
00979 return 1.0;
00980 }
|
|
|
Return the string mapper.
Definition at line 112 of file sound_driver_dsound.h. References _StringMapper.
00112 {return _StringMapper;}
|
|
||||||||||||||||
|
Initialization.
Definition at line 318 of file sound_driver_dsound.cpp. References _Caps, _DirectSound, _PrimaryBuffer, _StringMapper, _TimerID, _TimerPeriod, _TimerResolution, _UseEAX, countHw2DBuffers(), countHw3DBuffers(), NLSOUND::CSoundDriverDSoundEnumCallback(), format, nldebug, nlwarning, res, uint, and uint32.
00319 {
00320 _StringMapper = stringMapper;
00321 if (FAILED(DirectSoundEnumerate(CSoundDriverDSoundEnumCallback, this)))
00322 {
00323 throw ESoundDriver("Failed to enumerate the DirectSound devices");
00324 }
00325
00326 // Create a DirectSound object and set the cooperative level.
00327
00328 if (useEax)
00329 {
00330 if (EAXDirectSoundCreate8(NULL, &_DirectSound, NULL) != DS_OK)
00331 {
00332 throw ESoundDriver("Failed to create the DirectSound object from EAX proxy funtion");
00333 }
00334 }
00335 else
00336 {
00337 if (DirectSoundCreate8(NULL, &_DirectSound, NULL) != DS_OK)
00338 {
00339 throw ESoundDriver("Failed to create the DirectSound object");
00340 }
00341 }
00342
00343
00344 if (_DirectSound->SetCooperativeLevel(wnd, DSSCL_PRIORITY) != DS_OK)
00345 {
00346 throw ESoundDriver("Failed to set the cooperative level");
00347 }
00348
00349
00350 // Analyse the capabilities of the sound driver/device
00351
00352 _Caps.dwSize = sizeof(_Caps);
00353
00354 if (_DirectSound->GetCaps(&_Caps) != DS_OK)
00355 {
00356 throw ESoundDriver("Failed to query the sound device caps");
00357 }
00358
00359
00360 // Create primary buffer
00361
00362 DSBUFFERDESC desc;
00363
00364 ZeroMemory(&desc, sizeof(DSBUFFERDESC));
00365 desc.dwSize = sizeof(DSBUFFERDESC);
00366
00367
00368 // First, try to allocate a 3D hardware buffer.
00369 // If we can't get a 3D hardware buffer, use a 2D hardware buffer.
00370 // As last option, use a 2D software buffer.
00371
00372 // check if wa can honor eax request
00373 if (countHw3DBuffers() > 10)
00374 {
00375 _UseEAX = useEax;
00376 }
00377 else
00378 {
00379 // not enougth hardware buffer, can't use eax
00380 _UseEAX = false;
00381 }
00382
00383 if (countHw3DBuffers() > 0)
00384 {
00385 nldebug("Primary buffer: Allocating 3D buffer in hardware");
00386 desc.dwFlags = DSBCAPS_PRIMARYBUFFER | DSBCAPS_LOCHARDWARE | DSBCAPS_CTRL3D | DSBCAPS_CTRLVOLUME;
00387 }
00388 else
00389 {
00390 nldebug("Primary buffer: Allocating 3D buffer in software");
00391 desc.dwFlags = DSBCAPS_PRIMARYBUFFER | DSBCAPS_LOCSOFTWARE | DSBCAPS_CTRL3D | DSBCAPS_CTRLVOLUME;
00392 // desc.guid3DAlgorithm = DS3DALG_NO_VIRTUALIZATION;
00393 }
00394
00395
00396
00397 HRESULT res = _DirectSound->CreateSoundBuffer(&desc, &_PrimaryBuffer, NULL);
00398
00399 if (res != DS_OK && res != DS_NO_VIRTUALIZATION)
00400 {
00401
00402 nlwarning("Primary buffer: Failed to create a buffer with 3D capabilities.");
00403
00404 ZeroMemory(&desc, sizeof(DSBUFFERDESC));
00405 desc.dwSize = sizeof(DSBUFFERDESC);
00406
00407 if (countHw2DBuffers() > 0)
00408 {
00409 nldebug("Primary buffer: Allocating 2D buffer in hardware");
00410 desc.dwFlags = DSBCAPS_PRIMARYBUFFER | DSBCAPS_LOCHARDWARE | DSBCAPS_CTRLVOLUME;
00411 }
00412 else
00413 {
00414 nldebug("Primary buffer: Allocating 2D buffer in software");
00415 desc.dwFlags = DSBCAPS_PRIMARYBUFFER | DSBCAPS_LOCSOFTWARE | DSBCAPS_CTRLVOLUME;
00416 }
00417
00418 if (_DirectSound->CreateSoundBuffer(&desc, &_PrimaryBuffer, NULL) != DS_OK)
00419 {
00420 throw ESoundDriver("Failed to create the primary buffer");
00421 }
00422 }
00423
00424
00425 // Set the format of the primary buffer
00426
00427 WAVEFORMATEX format;
00428
00429 format.cbSize = sizeof(WAVEFORMATEX);
00430
00431 // Make sure the sound card accepts the default settings.
00432 // For now, only the default settings are accepted. Fallback
00433 // strategy will be handled later.
00434
00435 if ((_Caps.dwMinSecondarySampleRate > 22050) && (22050 > _Caps.dwMaxSecondarySampleRate)) {
00436 throw ESoundDriver("Unsupported sample rate range");
00437 }
00438
00439 if ((_Caps.dwFlags & DSCAPS_PRIMARY16BIT) == 0) {
00440 throw ESoundDriver("Unsupported sample size [16bits]");
00441 }
00442
00443 format.wBitsPerSample = 16;
00444 format.nChannels = 1;
00445 format.nSamplesPerSec = 22050;
00446 format.nBlockAlign = format.nChannels * format.wBitsPerSample / 8;
00447 format.nAvgBytesPerSec = format.nSamplesPerSec * format.nBlockAlign;
00448 format.wFormatTag = WAVE_FORMAT_PCM;
00449
00450
00451 if (_PrimaryBuffer->SetFormat(&format) != DS_OK)
00452 {
00453 throw ESoundDriver("Failed to create set the format of the primary buffer");
00454 }
00455
00456 // Fill the buffer with silence
00457 /* LPVOID ptr;
00458 DWORD bytes;
00459
00460 HRESULT hr = _PrimaryBuffer->Lock(0, 0, &ptr, &bytes, NULL, NULL, DSBLOCK_ENTIREBUFFER);
00461 if (FAILED(hr))
00462 {
00463 switch (hr)
00464 {
00465 case DSERR_BUFFERLOST:
00466 throw ESoundDriver("Failed to lock the DirectSound primary buffer : DSERR_BUFFERLOST");
00467 case DSERR_INVALIDCALL:
00468 throw ESoundDriver("Failed to lock the DirectSound primary buffer : DSERR_INVALIDCALL");
00469 case DSERR_INVALIDPARAM:
00470 throw ESoundDriver("Failed to lock the DirectSound primary buffer : DSERR_INVALIDPARAM");
00471 case DSERR_PRIOLEVELNEEDED:
00472 throw ESoundDriver("Failed to lock the DirectSound primary buffer : DSERR_PRIOLEVELNEEDED");
00473 default:
00474 throw ESoundDriver("Failed to lock the DirectSound primary buffer : unkown error");
00475
00476 }
00477 }
00478
00479 memset(ptr, 0, bytes);
00480
00481 _PrimaryBuffer->Unlock(ptr, bytes, 0, 0);
00482 */
00483
00484 uint32 numBuffers = countHw3DBuffers();
00485 if (numBuffers == 0)
00486 {
00487 numBuffers = 31;
00488 }
00489
00490 /*
00491 _Sources = new CSourceDSound*[numBuffers];
00492
00493
00494 for (uint i = 0; i < numBuffers; i++)
00495 {
00496 _Sources[i] = 0;
00497 }
00498
00499 try
00500 {
00501 for (i = 0; i < numBuffers; i++)
00502 {
00503 _Sources[i] = new CSourceDSound(i);
00504 _Sources[i]->init(_DirectSound);
00505 _SourceCount++;
00506 }
00507 }
00508 catch (ESoundDriver& e)
00509 {
00510 // Okay, here's the situation: I'm listening to WinAmp while debugging.
00511 // The caps told me there were 31 buffers available. In reality, there were
00512 // only 30 available because WinAmp was using one. Somehow DirectSound didn't
00513 // notice. So when creating buffer 31, an exception was thrown.
00514 // If something like this happens, don't bother and go on with the buffers we've
00515 // got. If no buffers are created at all, throw the exception again.
00516
00517 if (_Sources == 0)
00518 {
00519 throw e;
00520 }
00521 }
00522
00523 */
00524
00525
00526 TIMECAPS tcaps;
00527
00528 timeGetDevCaps(&tcaps, sizeof(TIMECAPS));
00529 _TimerResolution = (tcaps.wPeriodMin > 10)? tcaps.wPeriodMin : 10;
00530 timeBeginPeriod(_TimerResolution);
00531
00532
00533
00534 #if NLSOUND_PROFILE
00535 for (uint i = 0; i < 1024; i++)
00536 {
00537 _TimerInterval[i] = 0;
00538 }
00539
00540 _TimerDate = CTime::getPerformanceTime();
00541 #endif
00542
00543
00544
00545
00546 _TimerID = timeSetEvent(_TimerPeriod, 0, &CSoundDriverDSound::TimerCallback, (DWORD)this, TIME_CALLBACK_FUNCTION | TIME_PERIODIC);
00547
00548 if (_TimerID == NULL)
00549 {
00550 throw ESoundDriver("Failed to create the timer");
00551 }
00552
00553
00554
00555
00556 return true;
00557 }
|
|
|
Return the instance of the singleton.
Definition at line 55 of file sound_driver_dsound.h.
00055 { return _Instance; }
|
|
||||||||||||||||||||||||||||
|
Implements NLSOUND::ISoundDriver. Definition at line 852 of file sound_driver_dsound.cpp. References format, uint, uint32, and uint8.
00853 {
00854 return ((CBufferDSound*) destbuffer)->readRawBuffer(name, rawData, dataSize, format, frequency);
00855 }
|
|
||||||||||||||||||||
|
Load a wave file in to the buffer.
Implements NLSOUND::ISoundDriver. Definition at line 847 of file sound_driver_dsound.cpp.
00848 {
00849 return ((CBufferDSound*) destbuffer)->readWavBuffer(name, wavData, dataSize);
00850 }
|
|
|
Remove a buffer (should be called by the friend destructor of the buffer class).
Implements NLSOUND::ISoundDriver. Definition at line 835 of file sound_driver_dsound.cpp. References buffer.
00836 {
00837 }
|
|
|
Remove a source (should be called by the friend destructor of the source class).
Implements NLSOUND::ISoundDriver. Definition at line 879 of file sound_driver_dsound.cpp.
00880 {
00881 _Sources.erase((CSourceDSound*) source);
00882 }
|
|
|
Set the gain (volume value inside [0 , 1]). (default: 1) 0.0 -> silence 0.5 -> -6dB 1.0 -> no attenuation values > 1 (amplification) not supported by most drivers Definition at line 930 of file sound_driver_dsound.cpp. References _PrimaryBuffer, and nldebug.
00931 {
00932 if (_PrimaryBuffer != 0)
00933 {
00934 if (gain < 0.00001f)
00935 {
00936 gain = 0.00001f;
00937 }
00938
00939 /* convert from linear amplitude to hundredths of decibels */
00940 LONG volume = (LONG)(100.0 * 20.0 * log10(gain));
00941
00942 if (volume < DSBVOLUME_MIN)
00943 {
00944 volume = DSBVOLUME_MIN;
00945 }
00946 else if (volume > DSBVOLUME_MAX)
00947 {
00948 volume = DSBVOLUME_MAX;
00949 }
00950
00951 HRESULT hr = _PrimaryBuffer->SetVolume(volume);
00952
00953 if (hr != DS_OK)
00954 {
00955 nldebug("Failed to set the volume");
00956 }
00957 }
00958 }
|
|
|
Implements NLSOUND::ISoundDriver. Definition at line 1056 of file sound_driver_dsound.cpp. References NLMISC::CHTimer::startBench().
01057 {
01058 NLMISC::CHTimer::startBench();
01059 }
|
|
||||||||||||||||||||||||
|
Definition at line 679 of file sound_driver_dsound.cpp. References _TimerPeriod, NLMISC::CTime::getLocalTime(), NLMISC::TTime, and update().
00680 {
00681 // a little speed check
00682 static NLMISC::TTime lastUpdate = NLMISC::CTime::getLocalTime();
00683 NLMISC::TTime now = NLMISC::CTime::getLocalTime();
00684
00685 if (now - lastUpdate > _TimerPeriod * 2)
00686 {
00687 // nlwarning("CSoundDriverDSound::TimerCallback : no update since %u millisec (nominal update = %u", uint32(now-lastUpdate), uint32(_TimerPeriod));
00688 }
00689 else
00690 {
00691 // nldebug("Callback delay = %u ms", uint32(now-lastUpdate));
00692 }
00693
00694 lastUpdate = now;
00695
00696
00697 CSoundDriverDSound* driver = (CSoundDriverDSound*) dwUser;
00698 driver->update();
00699 }
|
|
|
Update all the driver and its sources. To be called only by the timer callback.
Definition at line 703 of file sound_driver_dsound.cpp. References _TimerPeriod, NLMISC::CTime::getLocalTime(), H_AUTO, nlwarning, NLMISC::TTicks, NLMISC::TTime, and uint32. Referenced by TimerCallback().
00704 {
00705 H_AUTO(NLSOUND_DSoundUpdate)
00706 #if NLSOUND_PROFILE
00707 TTicks tnow = CTime::getPerformanceTime();
00708 #endif
00709
00710 NLMISC::TTime now = NLMISC::CTime::getLocalTime();
00711
00712 set<CSourceDSound*>::iterator first(_Sources.begin()), last(_Sources.end());
00713 for (;first != last; ++first)
00714 {
00715 if ((*first)->needsUpdate())
00716 {
00717 if ((*first)->update())
00718 {
00719 #if NLSOUND_PROFILE
00720 _UpdateSources++;
00721 #endif
00722 }
00723 }
00724 }
00725
00726 /*
00727 set<CSourceDSound*>::iterator iter;
00728
00729 iter = _Sources.begin();
00730
00731
00732 if ((iter != _Sources.end()) && (*iter)->needsUpdate())
00733 {
00734 while (iter != _Sources.end())
00735 {
00736 // if ((*iter)->update2()) {
00737 if ((*iter)->update())
00738 {
00739 #if NLSOUND_PROFILE
00740 _UpdateSources++;
00741 #endif
00742 }
00743 iter++;
00744 }
00745 }
00746
00747 */
00748 {
00749 NLMISC::TTime last = CTime::getLocalTime() - now;
00750 if (last > _TimerPeriod / 2)
00751 {
00752 nlwarning("CSoundDriverDSound::TimerCallback : update took %u millisec", (uint32)last);
00753 }
00754 }
00755
00756 #if NLSOUND_PROFILE
00757 _TotalUpdateTime += 1000.0 * CTime::ticksToSecond(CTime::getPerformanceTime() - tnow);
00758 _UpdateCount++;
00759 #endif
00760 }
|
|
|
Write information about the driver to the output stream.
Implements NLSOUND::ISoundDriver. Definition at line 635 of file sound_driver_dsound.cpp. References _DirectSound, and countPlayingSources().
00636 {
00637 // Write the available sound devices
00638 CDeviceDescription* list = CDeviceDescription::_List;
00639 while (list) {
00640 out << list->_Description << "\n";
00641 list = list->_Next;
00642 }
00643
00644 out << "\n";
00645
00646 // Write the buffers sizes
00647 out << "buffer size: " << (int)CSourceDSound::_SecondaryBufferSize << "\n";
00648 out << "copy size: " << (int)CSourceDSound::_UpdateCopySize << "\n";
00649 out << "swap size: " << (int)CSourceDSound::_SwapCopySize << "\n";
00650 out << "\n";
00651
00652 // Write the number of hardware buffers
00653 DSCAPS caps;
00654 caps.dwSize = sizeof(caps);
00655 _DirectSound->GetCaps(&caps);
00656
00657 cout << "3d hw buffers: " << caps.dwMaxHw3DAllBuffers << "\n";
00658 cout << "2d hw buffers: " << caps.dwMaxHwMixingAllBuffers << "\n";
00659 out << "\n";
00660
00661 // Write the number of hardware buffers
00662 #if NLSOUND_PROFILE
00663 out << "update time total --- " << getAverageUpdateTime()<< "\n";
00664 out << "update time source --- " << CSourceDSound::getAverageUpdateTime() << "\n";
00665 out << "update --- t: " << CSourceDSound::getAverageCumulTime();
00666 out << " - p: " << CSourceDSound::getAveragePosTime();
00667 out << " - l: " << CSourceDSound::getAverageLockTime();
00668 out << " - c: " << CSourceDSound::getAverageCopyTime();
00669 out << " - u: " << CSourceDSound::getAverageUnlockTime() << "\n";
00670 out << "update percentage: --- " << getUpdatePercentage() << "\n";
00671 out << "update num sources --- " << (int)getAverageUpdateSources() << "\n";
00672 out << "update byte size --- " << CSourceDSound::getAverageUpdateSize() << "\n";
00673 out << "swap time --- " << CSourceDSound::getTestAverage() << "\n";
00674 out << "src --- " << countPlayingSources() << "\n";
00675 #endif
00676 }
|
|
|
Definition at line 151 of file sound_driver_dsound.h. Referenced by init(). |
|
|
Definition at line 145 of file sound_driver_dsound.h. Referenced by countHw2DBuffers(), countHw3DBuffers(), createSource(), init(), writeProfile(), and ~CSoundDriverDSound(). |
|
|
Definition at line 52 of file sound_driver_dsound.cpp. |
|
|
Definition at line 148 of file sound_driver_dsound.h. Referenced by createBuffer(), createListener(), createSource(), getGain(), init(), setGain(), and ~CSoundDriverDSound(). |
|
|
Definition at line 158 of file sound_driver_dsound.h. |
|
|
Definition at line 155 of file sound_driver_dsound.h. |
|
|
The string mapper provided by client code.
Definition at line 169 of file sound_driver_dsound.h. Referenced by getStringMapper(), and init(). |
|
|
Definition at line 161 of file sound_driver_dsound.h. Referenced by init(), and ~CSoundDriverDSound(). |
|
|
Definition at line 53 of file sound_driver_dsound.cpp. Referenced by init(), TimerCallback(), and update(). |
|
|
Definition at line 164 of file sound_driver_dsound.h. Referenced by init(), and ~CSoundDriverDSound(). |
|
|
The EAX support is requested and accepted (ie, there is enougth hardware 3D buffer).
Definition at line 167 of file sound_driver_dsound.h. Referenced by createSource(), and init(). |
|
|
Version of the driver interface. To increment when the interface change.
Definition at line 48 of file sound_driver.cpp. |
1.3.6