Browse Source

More win32 AudioCDBurner changes.

tags/2021-05-28
Julian Storer 15 years ago
parent
commit
c0dda3fdfb
2 changed files with 166 additions and 124 deletions
  1. +83
    -62
      juce_amalgamated.cpp
  2. +83
    -62
      src/native/windows/juce_win32_AudioCDReader.cpp

+ 83
- 62
juce_amalgamated.cpp View File

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


+ 83
- 62
src/native/windows/juce_win32_AudioCDReader.cpp View File

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


Loading…
Cancel
Save