diff --git a/juce_amalgamated.cpp b/juce_amalgamated.cpp index 152ff4be1c..24223aeb4c 100644 --- a/juce_amalgamated.cpp +++ b/juce_amalgamated.cpp @@ -221894,33 +221894,35 @@ static IDiscRecorder* enumCDBurners (StringArray* list, int indexToOpen, IDiscMa return result; } -const StringArray AudioCDBurner::findAvailableDevices() -{ - StringArray devs; - enumCDBurners (&devs, -1, 0); - return devs; -} - -AudioCDBurner* AudioCDBurner::openDevice (const int deviceIndex) -{ - ScopedPointer b (new AudioCDBurner (deviceIndex)); - - if (b->pimpl == 0) - b = 0; - - return b.release(); -} - -class AudioCDBurner::Pimpl : public IDiscMasterProgressEvents +class AudioCDBurner::Pimpl : public IDiscMasterProgressEvents, + public Timer { public: - Pimpl() - : listener (0), progress (0), shouldCancel (false), refCount (1) + Pimpl (AudioCDBurner& owner_, IDiscMaster* discMaster_, IDiscRecorder* discRecorder_) + : owner (owner_), discMaster (discMaster_), discRecorder (discRecorder_), redbook (0), + listener (0), progress (0), shouldCancel (false), refCount (1) { + HRESULT hr = discMaster->SetActiveDiscMasterFormat (IID_IRedbookDiscMaster, (void**) &redbook); + jassert (SUCCEEDED (hr)); + hr = discMaster->SetActiveDiscRecorder (discRecorder); + //jassert (SUCCEEDED (hr)); + + lastState = getDiskState(); + startTimer (2000); } ~Pimpl() {} + void releaseObjects() + { + discRecorder->Close(); + if (redbook != 0) + redbook->Release(); + discRecorder->Release(); + discMaster->Release(); + Release(); + } + HRESULT __stdcall QueryInterface (REFIID id, void __RPC_FAR* __RPC_FAR* result) { if (result == 0) @@ -221966,6 +221968,35 @@ public: HRESULT __stdcall NotifyBurnComplete (HRESULT /*status*/) { return E_NOTIMPL; } HRESULT __stdcall NotifyEraseComplete (HRESULT /*status*/) { return E_NOTIMPL; } + class ScopedDiscOpener + { + public: + ScopedDiscOpener (Pimpl& p) : pimpl (p) { pimpl.discRecorder->OpenExclusive(); } + ~ScopedDiscOpener() { pimpl.discRecorder->Close(); } + + private: + Pimpl& pimpl; + }; + + DiskState getDiskState() + { + const ScopedDiscOpener opener (*this); + + long type, flags; + HRESULT hr = discRecorder->QueryMediaType (&type, &flags); + + if (FAILED (hr)) + return unknown; + + if (type != 0 && (flags & MEDIA_WRITABLE) != 0) + return writableDiskPresent; + + if (type == 0) + return noDisc; + else + return readOnlyDiskPresent; + } + int getIntProperty (const LPOLESTR name, const int defaultReturn) const { ComSmartPtr prop; @@ -222000,16 +222031,19 @@ public: && SUCCEEDED (discRecorder->SetRecorderProperties (prop)); } - class DiskOpener + void timerCallback() { - public: - DiskOpener (Pimpl& p) : pimpl (p) { pimpl.discRecorder->OpenExclusive(); } - ~DiskOpener() { pimpl.discRecorder->Close(); } + const DiskState state = getDiskState(); - private: - Pimpl& pimpl; - }; + if (state != lastState) + { + lastState = state; + owner.sendChangeMessage (&owner); + } + } + AudioCDBurner& owner; + DiskState lastState; IDiscMaster* discMaster; IDiscRecorder* discRecorder; IRedbookDiscMaster* redbook; @@ -222023,52 +222057,39 @@ private: AudioCDBurner::AudioCDBurner (const int deviceIndex) { - IDiscMaster* discMaster; - IDiscRecorder* dr = enumCDBurners (0, deviceIndex, &discMaster); - - if (dr != 0) - { - IRedbookDiscMaster* redbook; - HRESULT hr = discMaster->SetActiveDiscMasterFormat (IID_IRedbookDiscMaster, (void**) &redbook); - hr = discMaster->SetActiveDiscRecorder (dr); + IDiscMaster* discMaster = 0; + IDiscRecorder* discRecorder = enumCDBurners (0, deviceIndex, &discMaster); - pimpl = new Pimpl(); - pimpl->discMaster = discMaster; - pimpl->discRecorder = dr; - pimpl->redbook = redbook; - } + if (discRecorder != 0) + pimpl = new Pimpl (*this, discMaster, discRecorder); } AudioCDBurner::~AudioCDBurner() { if (pimpl != 0) - { - pimpl->discRecorder->Close(); - pimpl->redbook->Release(); - pimpl->discRecorder->Release(); - pimpl->discMaster->Release(); - - pimpl.release()->Release(); - } + pimpl.release()->releaseObjects(); } -AudioCDBurner::DiskState AudioCDBurner::getDiskState() const +const StringArray AudioCDBurner::findAvailableDevices() { - const Pimpl::DiskOpener opener (*pimpl); + StringArray devs; + enumCDBurners (&devs, -1, 0); + return devs; +} - long type, flags; - HRESULT hr = pimpl->discRecorder->QueryMediaType (&type, &flags); +AudioCDBurner* AudioCDBurner::openDevice (const int deviceIndex) +{ + ScopedPointer b (new AudioCDBurner (deviceIndex)); - if (FAILED (hr)) - return unknown; + if (b->pimpl == 0) + b = 0; - if (type != 0 && (flags & MEDIA_WRITABLE) != 0) - return writableDiskPresent; + return b.release(); +} - if (type == 0) - return noDisc; - else - return readOnlyDiskPresent; +AudioCDBurner::DiskState AudioCDBurner::getDiskState() const +{ + return pimpl->getDiskState(); } bool AudioCDBurner::isDiskPresent() const @@ -222078,8 +222099,8 @@ bool AudioCDBurner::isDiskPresent() const bool AudioCDBurner::openTray() { - const Pimpl::DiskOpener opener (*pimpl); - return pimpl->discRecorder->Eject() == S_OK; + const Pimpl::ScopedDiscOpener opener (*pimpl); + return SUCCEEDED (pimpl->discRecorder->Eject()); } AudioCDBurner::DiskState AudioCDBurner::waitUntilStateChange (int timeOutMilliseconds) diff --git a/src/native/windows/juce_win32_AudioCDReader.cpp b/src/native/windows/juce_win32_AudioCDReader.cpp index 925036c871..efcc8e1784 100644 --- a/src/native/windows/juce_win32_AudioCDReader.cpp +++ b/src/native/windows/juce_win32_AudioCDReader.cpp @@ -2132,34 +2132,36 @@ static IDiscRecorder* enumCDBurners (StringArray* list, int indexToOpen, IDiscMa return result; } -const StringArray AudioCDBurner::findAvailableDevices() -{ - StringArray devs; - enumCDBurners (&devs, -1, 0); - return devs; -} - -AudioCDBurner* AudioCDBurner::openDevice (const int deviceIndex) -{ - ScopedPointer b (new AudioCDBurner (deviceIndex)); - - if (b->pimpl == 0) - b = 0; - - return b.release(); -} - //============================================================================== -class AudioCDBurner::Pimpl : public IDiscMasterProgressEvents +class AudioCDBurner::Pimpl : public IDiscMasterProgressEvents, + public Timer { public: - Pimpl() - : listener (0), progress (0), shouldCancel (false), refCount (1) + Pimpl (AudioCDBurner& owner_, IDiscMaster* discMaster_, IDiscRecorder* discRecorder_) + : owner (owner_), discMaster (discMaster_), discRecorder (discRecorder_), redbook (0), + listener (0), progress (0), shouldCancel (false), refCount (1) { + HRESULT hr = discMaster->SetActiveDiscMasterFormat (IID_IRedbookDiscMaster, (void**) &redbook); + jassert (SUCCEEDED (hr)); + hr = discMaster->SetActiveDiscRecorder (discRecorder); + //jassert (SUCCEEDED (hr)); + + lastState = getDiskState(); + startTimer (2000); } ~Pimpl() {} + void releaseObjects() + { + discRecorder->Close(); + if (redbook != 0) + redbook->Release(); + discRecorder->Release(); + discMaster->Release(); + Release(); + } + HRESULT __stdcall QueryInterface (REFIID id, void __RPC_FAR* __RPC_FAR* result) { if (result == 0) @@ -2205,6 +2207,35 @@ public: HRESULT __stdcall NotifyBurnComplete (HRESULT /*status*/) { return E_NOTIMPL; } HRESULT __stdcall NotifyEraseComplete (HRESULT /*status*/) { return E_NOTIMPL; } + class ScopedDiscOpener + { + public: + ScopedDiscOpener (Pimpl& p) : pimpl (p) { pimpl.discRecorder->OpenExclusive(); } + ~ScopedDiscOpener() { pimpl.discRecorder->Close(); } + + private: + Pimpl& pimpl; + }; + + DiskState getDiskState() + { + const ScopedDiscOpener opener (*this); + + long type, flags; + HRESULT hr = discRecorder->QueryMediaType (&type, &flags); + + if (FAILED (hr)) + return unknown; + + if (type != 0 && (flags & MEDIA_WRITABLE) != 0) + return writableDiskPresent; + + if (type == 0) + return noDisc; + else + return readOnlyDiskPresent; + } + int getIntProperty (const LPOLESTR name, const int defaultReturn) const { ComSmartPtr prop; @@ -2239,16 +2270,19 @@ public: && SUCCEEDED (discRecorder->SetRecorderProperties (prop)); } - class DiskOpener + void timerCallback() { - public: - DiskOpener (Pimpl& p) : pimpl (p) { pimpl.discRecorder->OpenExclusive(); } - ~DiskOpener() { pimpl.discRecorder->Close(); } + const DiskState state = getDiskState(); - private: - Pimpl& pimpl; - }; + if (state != lastState) + { + lastState = state; + owner.sendChangeMessage (&owner); + } + } + AudioCDBurner& owner; + DiskState lastState; IDiscMaster* discMaster; IDiscRecorder* discRecorder; IRedbookDiscMaster* redbook; @@ -2263,52 +2297,39 @@ private: //============================================================================== AudioCDBurner::AudioCDBurner (const int deviceIndex) { - IDiscMaster* discMaster; - IDiscRecorder* dr = enumCDBurners (0, deviceIndex, &discMaster); + IDiscMaster* discMaster = 0; + IDiscRecorder* discRecorder = enumCDBurners (0, deviceIndex, &discMaster); - if (dr != 0) - { - IRedbookDiscMaster* redbook; - HRESULT hr = discMaster->SetActiveDiscMasterFormat (IID_IRedbookDiscMaster, (void**) &redbook); - hr = discMaster->SetActiveDiscRecorder (dr); - - pimpl = new Pimpl(); - pimpl->discMaster = discMaster; - pimpl->discRecorder = dr; - pimpl->redbook = redbook; - } + if (discRecorder != 0) + pimpl = new Pimpl (*this, discMaster, discRecorder); } AudioCDBurner::~AudioCDBurner() { if (pimpl != 0) - { - pimpl->discRecorder->Close(); - pimpl->redbook->Release(); - pimpl->discRecorder->Release(); - pimpl->discMaster->Release(); - - pimpl.release()->Release(); - } + pimpl.release()->releaseObjects(); } -AudioCDBurner::DiskState AudioCDBurner::getDiskState() const +const StringArray AudioCDBurner::findAvailableDevices() { - const Pimpl::DiskOpener opener (*pimpl); + StringArray devs; + enumCDBurners (&devs, -1, 0); + return devs; +} - long type, flags; - HRESULT hr = pimpl->discRecorder->QueryMediaType (&type, &flags); +AudioCDBurner* AudioCDBurner::openDevice (const int deviceIndex) +{ + ScopedPointer b (new AudioCDBurner (deviceIndex)); - if (FAILED (hr)) - return unknown; + if (b->pimpl == 0) + b = 0; - if (type != 0 && (flags & MEDIA_WRITABLE) != 0) - return writableDiskPresent; + return b.release(); +} - if (type == 0) - return noDisc; - else - return readOnlyDiskPresent; +AudioCDBurner::DiskState AudioCDBurner::getDiskState() const +{ + return pimpl->getDiskState(); } bool AudioCDBurner::isDiskPresent() const @@ -2318,8 +2339,8 @@ bool AudioCDBurner::isDiskPresent() const bool AudioCDBurner::openTray() { - const Pimpl::DiskOpener opener (*pimpl); - return pimpl->discRecorder->Eject() == S_OK; + const Pimpl::ScopedDiscOpener opener (*pimpl); + return SUCCEEDED (pimpl->discRecorder->Eject()); } AudioCDBurner::DiskState AudioCDBurner::waitUntilStateChange (int timeOutMilliseconds)