|
|
|
@@ -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<AudioCDBurner> 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<IPropertyStorage> 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<AudioCDBurner> 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)
|
|
|
|
|