| @@ -125,15 +125,17 @@ extern "C" | |||||
| STDMETHOD(Stop) (THIS) PURE; | STDMETHOD(Stop) (THIS) PURE; | ||||
| STDMETHOD(Unlock) (THIS_ LPVOID, DWORD, LPVOID, DWORD) PURE; | STDMETHOD(Unlock) (THIS_ LPVOID, DWORD, LPVOID, DWORD) PURE; | ||||
| }; | }; | ||||
| #undef INTERFACE | |||||
| } | } | ||||
| //============================================================================== | |||||
| namespace juce | namespace juce | ||||
| { | { | ||||
| namespace | |||||
| //============================================================================== | |||||
| namespace DSoundLogging | |||||
| { | { | ||||
| String getDSErrorMessage (HRESULT hr) | |||||
| String getErrorMessage (HRESULT hr) | |||||
| { | { | ||||
| const char* result = nullptr; | const char* result = nullptr; | ||||
| @@ -163,31 +165,37 @@ namespace | |||||
| } | } | ||||
| //============================================================================== | //============================================================================== | ||||
| #define DS_DEBUGGING 1 | |||||
| #ifdef DS_DEBUGGING | |||||
| #define CATCH JUCE_CATCH_EXCEPTION | |||||
| #undef log | |||||
| #define log(a) Logger::writeToLog(a); | |||||
| #undef logError | |||||
| #define logError(a) logDSError(a, __LINE__); | |||||
| #if JUCE_DIRECTSOUND_LOGGING | |||||
| static void logMessage (String message) | |||||
| { | |||||
| message = "DSOUND: " + message; | |||||
| DBG (message); | |||||
| Logger::writeToLog (message); | |||||
| } | |||||
| static void logDSError (HRESULT hr, int lineNum) | |||||
| static void logError (HRESULT hr, int lineNum) | |||||
| { | { | ||||
| if (FAILED (hr)) | if (FAILED (hr)) | ||||
| { | { | ||||
| String error ("DS error at line "); | |||||
| error << lineNum << " - " << getDSErrorMessage (hr); | |||||
| log (error); | |||||
| String error ("Error at line "); | |||||
| error << lineNum << ": " << getErrorMessage (hr); | |||||
| logMessage (error); | |||||
| } | } | ||||
| } | } | ||||
| #define CATCH JUCE_CATCH_EXCEPTION | |||||
| #define JUCE_DS_LOG(a) DSoundLogging::logMessage(a); | |||||
| #define JUCE_DS_LOG_ERROR(a) DSoundLogging::logError(a, __LINE__); | |||||
| #else | #else | ||||
| #define CATCH JUCE_CATCH_ALL | #define CATCH JUCE_CATCH_ALL | ||||
| #define log(a) | |||||
| #define logError(a) | |||||
| #define JUCE_DS_LOG(a) | |||||
| #define JUCE_DS_LOG_ERROR(a) | |||||
| #endif | #endif | ||||
| } | |||||
| //============================================================================== | |||||
| //============================================================================== | |||||
| namespace | |||||
| { | |||||
| #define DSOUND_FUNCTION(functionName, params) \ | #define DSOUND_FUNCTION(functionName, params) \ | ||||
| typedef HRESULT (WINAPI *type##functionName) params; \ | typedef HRESULT (WINAPI *type##functionName) params; \ | ||||
| static type##functionName ds##functionName = nullptr; | static type##functionName ds##functionName = nullptr; | ||||
| @@ -242,9 +250,9 @@ public: | |||||
| { | { | ||||
| if (pOutputBuffer != nullptr) | if (pOutputBuffer != nullptr) | ||||
| { | { | ||||
| log ("closing dsound out: " + name); | |||||
| JUCE_DS_LOG ("closing output: " + name); | |||||
| HRESULT hr = pOutputBuffer->Stop(); | HRESULT hr = pOutputBuffer->Stop(); | ||||
| logError (hr); | |||||
| JUCE_DS_LOG_ERROR (hr); | |||||
| pOutputBuffer->Release(); | pOutputBuffer->Release(); | ||||
| pOutputBuffer = nullptr; | pOutputBuffer = nullptr; | ||||
| @@ -259,8 +267,8 @@ public: | |||||
| String open() | String open() | ||||
| { | { | ||||
| log ("opening dsound out device: " + name + " rate=" + String (sampleRate) | |||||
| + " bits=" + String (bitDepth) + " buf=" + String (bufferSizeSamples)); | |||||
| JUCE_DS_LOG ("opening output: " + name + " rate=" + String (sampleRate) | |||||
| + " bits=" + String (bitDepth) + " buf=" + String (bufferSizeSamples)); | |||||
| pDirectSound = nullptr; | pDirectSound = nullptr; | ||||
| pOutputBuffer = nullptr; | pOutputBuffer = nullptr; | ||||
| @@ -279,7 +287,7 @@ public: | |||||
| const int numChannels = 2; | const int numChannels = 2; | ||||
| hr = pDirectSound->SetCooperativeLevel (GetDesktopWindow(), 2 /* DSSCL_PRIORITY */); | hr = pDirectSound->SetCooperativeLevel (GetDesktopWindow(), 2 /* DSSCL_PRIORITY */); | ||||
| logError (hr); | |||||
| JUCE_DS_LOG_ERROR (hr); | |||||
| if (SUCCEEDED (hr)) | if (SUCCEEDED (hr)) | ||||
| { | { | ||||
| @@ -291,9 +299,9 @@ public: | |||||
| primaryDesc.dwBufferBytes = 0; | primaryDesc.dwBufferBytes = 0; | ||||
| primaryDesc.lpwfxFormat = 0; | primaryDesc.lpwfxFormat = 0; | ||||
| log ("opening dsound out step 2"); | |||||
| JUCE_DS_LOG ("co-op level set"); | |||||
| hr = pDirectSound->CreateSoundBuffer (&primaryDesc, &pPrimaryBuffer, 0); | hr = pDirectSound->CreateSoundBuffer (&primaryDesc, &pPrimaryBuffer, 0); | ||||
| logError (hr); | |||||
| JUCE_DS_LOG_ERROR (hr); | |||||
| if (SUCCEEDED (hr)) | if (SUCCEEDED (hr)) | ||||
| { | { | ||||
| @@ -307,7 +315,7 @@ public: | |||||
| wfFormat.cbSize = 0; | wfFormat.cbSize = 0; | ||||
| hr = pPrimaryBuffer->SetFormat (&wfFormat); | hr = pPrimaryBuffer->SetFormat (&wfFormat); | ||||
| logError (hr); | |||||
| JUCE_DS_LOG_ERROR (hr); | |||||
| if (SUCCEEDED (hr)) | if (SUCCEEDED (hr)) | ||||
| { | { | ||||
| @@ -319,18 +327,18 @@ public: | |||||
| secondaryDesc.lpwfxFormat = &wfFormat; | secondaryDesc.lpwfxFormat = &wfFormat; | ||||
| hr = pDirectSound->CreateSoundBuffer (&secondaryDesc, &pOutputBuffer, 0); | hr = pDirectSound->CreateSoundBuffer (&secondaryDesc, &pOutputBuffer, 0); | ||||
| logError (hr); | |||||
| JUCE_DS_LOG_ERROR (hr); | |||||
| if (SUCCEEDED (hr)) | if (SUCCEEDED (hr)) | ||||
| { | { | ||||
| log ("opening dsound out step 3"); | |||||
| JUCE_DS_LOG ("buffer created"); | |||||
| DWORD dwDataLen; | DWORD dwDataLen; | ||||
| unsigned char* pDSBuffData; | unsigned char* pDSBuffData; | ||||
| hr = pOutputBuffer->Lock (0, (DWORD) totalBytesPerBuffer, | hr = pOutputBuffer->Lock (0, (DWORD) totalBytesPerBuffer, | ||||
| (LPVOID*) &pDSBuffData, &dwDataLen, 0, 0, 0); | (LPVOID*) &pDSBuffData, &dwDataLen, 0, 0, 0); | ||||
| logError (hr); | |||||
| JUCE_DS_LOG_ERROR (hr); | |||||
| if (SUCCEEDED (hr)) | if (SUCCEEDED (hr)) | ||||
| { | { | ||||
| @@ -357,7 +365,7 @@ public: | |||||
| } | } | ||||
| } | } | ||||
| error = getDSErrorMessage (hr); | |||||
| error = DSoundLogging::getErrorMessage (hr); | |||||
| close(); | close(); | ||||
| return error; | return error; | ||||
| } | } | ||||
| @@ -391,7 +399,7 @@ public: | |||||
| if (SUCCEEDED (hr)) | if (SUCCEEDED (hr)) | ||||
| break; | break; | ||||
| logError (hr); | |||||
| JUCE_DS_LOG_ERROR (hr); | |||||
| jassertfalse; | jassertfalse; | ||||
| return true; | return true; | ||||
| } | } | ||||
| @@ -467,7 +475,7 @@ public: | |||||
| else | else | ||||
| { | { | ||||
| jassertfalse; | jassertfalse; | ||||
| logError (hr); | |||||
| JUCE_DS_LOG_ERROR (hr); | |||||
| } | } | ||||
| bytesEmpty -= bytesPerBuffer; | bytesEmpty -= bytesPerBuffer; | ||||
| @@ -527,9 +535,9 @@ public: | |||||
| if (pInputBuffer != nullptr) | if (pInputBuffer != nullptr) | ||||
| { | { | ||||
| log ("closing dsound in: " + name); | |||||
| JUCE_DS_LOG ("closing input: " + name); | |||||
| hr = pInputBuffer->Stop(); | hr = pInputBuffer->Stop(); | ||||
| logError (hr); | |||||
| JUCE_DS_LOG_ERROR (hr); | |||||
| pInputBuffer->Release(); | pInputBuffer->Release(); | ||||
| pInputBuffer = nullptr; | pInputBuffer = nullptr; | ||||
| @@ -550,8 +558,8 @@ public: | |||||
| String open() | String open() | ||||
| { | { | ||||
| log ("opening dsound in device: " + name | |||||
| + " rate=" + String (sampleRate) + " bits=" + String (bitDepth) + " buf=" + String (bufferSizeSamples)); | |||||
| JUCE_DS_LOG ("opening input: " + name | |||||
| + " rate=" + String (sampleRate) + " bits=" + String (bitDepth) + " buf=" + String (bufferSizeSamples)); | |||||
| pDirectSound = nullptr; | pDirectSound = nullptr; | ||||
| pDirectSoundCapture = nullptr; | pDirectSoundCapture = nullptr; | ||||
| @@ -584,7 +592,7 @@ public: | |||||
| captureDesc.dwBufferBytes = (DWORD) totalBytesPerBuffer; | captureDesc.dwBufferBytes = (DWORD) totalBytesPerBuffer; | ||||
| captureDesc.lpwfxFormat = &wfFormat; | captureDesc.lpwfxFormat = &wfFormat; | ||||
| log ("opening dsound in step 2"); | |||||
| JUCE_DS_LOG ("object created"); | |||||
| hr = pDirectSoundCapture->CreateCaptureBuffer (&captureDesc, &pInputBuffer, 0); | hr = pDirectSoundCapture->CreateCaptureBuffer (&captureDesc, &pInputBuffer, 0); | ||||
| if (SUCCEEDED (hr)) | if (SUCCEEDED (hr)) | ||||
| @@ -596,8 +604,8 @@ public: | |||||
| } | } | ||||
| } | } | ||||
| logError (hr); | |||||
| const String error (getDSErrorMessage (hr)); | |||||
| JUCE_DS_LOG_ERROR (hr); | |||||
| const String error (DSoundLogging::getErrorMessage (hr)); | |||||
| close(); | close(); | ||||
| return error; | return error; | ||||
| @@ -619,7 +627,7 @@ public: | |||||
| DWORD capturePos, readPos; | DWORD capturePos, readPos; | ||||
| HRESULT hr = pInputBuffer->GetCurrentPosition (&capturePos, &readPos); | HRESULT hr = pInputBuffer->GetCurrentPosition (&capturePos, &readPos); | ||||
| logError (hr); | |||||
| JUCE_DS_LOG_ERROR (hr); | |||||
| if (FAILED (hr)) | if (FAILED (hr)) | ||||
| return true; | return true; | ||||
| @@ -677,7 +685,7 @@ public: | |||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| logError (hr); | |||||
| JUCE_DS_LOG_ERROR (hr); | |||||
| jassertfalse; | jassertfalse; | ||||
| } | } | ||||
| @@ -1186,7 +1194,7 @@ String DSoundAudioIODevice::openDevice (const BigInteger& inputChannels, | |||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| log (error); | |||||
| JUCE_DS_LOG ("Opening failed: " + error); | |||||
| } | } | ||||
| SetThreadPriority (GetCurrentThread(), oldThreadPri); | SetThreadPriority (GetCurrentThread(), oldThreadPri); | ||||
| @@ -1208,7 +1216,6 @@ public: | |||||
| initialiseDSoundFunctions(); | initialiseDSoundFunctions(); | ||||
| } | } | ||||
| //============================================================================== | |||||
| void scanForDevices() | void scanForDevices() | ||||
| { | { | ||||
| hasScanned = true; | hasScanned = true; | ||||
| @@ -1233,12 +1240,11 @@ public: | |||||
| { | { | ||||
| jassert (hasScanned); // need to call scanForDevices() before doing this | jassert (hasScanned); // need to call scanForDevices() before doing this | ||||
| DSoundAudioIODevice* const d = dynamic_cast <DSoundAudioIODevice*> (device); | |||||
| if (d == 0) | |||||
| return -1; | |||||
| if (DSoundAudioIODevice* const d = dynamic_cast <DSoundAudioIODevice*> (device)) | |||||
| return asInput ? d->inputDeviceIndex | |||||
| : d->outputDeviceIndex; | |||||
| return asInput ? d->inputDeviceIndex | |||||
| : d->outputDeviceIndex; | |||||
| return -1; | |||||
| } | } | ||||
| bool hasSeparateInputsAndOutputs() const { return true; } | bool hasSeparateInputsAndOutputs() const { return true; } | ||||
| @@ -1260,7 +1266,6 @@ public: | |||||
| } | } | ||||
| private: | private: | ||||
| //============================================================================== | |||||
| DSoundDeviceList deviceList; | DSoundDeviceList deviceList; | ||||
| bool hasScanned; | bool hasScanned; | ||||
| @@ -1276,7 +1281,6 @@ private: | |||||
| } | } | ||||
| } | } | ||||
| //============================================================================== | |||||
| JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DSoundAudioIODeviceType) | JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DSoundAudioIODeviceType) | ||||
| }; | }; | ||||
| @@ -1285,6 +1289,3 @@ AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_DirectSound() | |||||
| { | { | ||||
| return new DSoundAudioIODeviceType(); | return new DSoundAudioIODeviceType(); | ||||
| } | } | ||||
| #undef log | |||||
| #undef logError | |||||