asio: remove unnecessary ASIO SDK files
These files should be obtained directly from Steinberg.
This commit is contained in:
parent
eb6b5e2598
commit
ab665735ad
42 changed files with 0 additions and 8450 deletions
Binary file not shown.
Binary file not shown.
|
|
@ -1,41 +0,0 @@
|
||||||
Microsoft Developer Studio Workspace File, Format Version 6.00
|
|
||||||
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
Project: "asiosample"="..\driver\asiosample\asiosample\asiosample.dsp" - Package Owner=<4>
|
|
||||||
|
|
||||||
Package=<5>
|
|
||||||
{{{
|
|
||||||
}}}
|
|
||||||
|
|
||||||
Package=<4>
|
|
||||||
{{{
|
|
||||||
}}}
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
Project: "hostsample"="..\host\sample\hostsample.dsp" - Package Owner=<4>
|
|
||||||
|
|
||||||
Package=<5>
|
|
||||||
{{{
|
|
||||||
}}}
|
|
||||||
|
|
||||||
Package=<4>
|
|
||||||
{{{
|
|
||||||
}}}
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
Global:
|
|
||||||
|
|
||||||
Package=<5>
|
|
||||||
{{{
|
|
||||||
}}}
|
|
||||||
|
|
||||||
Package=<3>
|
|
||||||
{{{
|
|
||||||
}}}
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
Binary file not shown.
|
|
@ -1,12 +0,0 @@
|
||||||
Changes in ASIO 2.3 since ASIO 2.2
|
|
||||||
- added host queries to detect the driver's buffering and drop-out detection capabilities
|
|
||||||
- some additional documentation on MMCSS; see page 46 of 'ASIO SDK 2.3.pdf'
|
|
||||||
- dropped support for Mac OS 8 and 9
|
|
||||||
|
|
||||||
Changes in ASIO 2.2 since ASIO 2.1
|
|
||||||
- added support for Windows 64 bit
|
|
||||||
|
|
||||||
Changes in ASIO 2.1 since ASIO 2.0
|
|
||||||
- Sony DSD support added
|
|
||||||
- fixed Windows registry sample to HKEY_LOCAL_MACHINE
|
|
||||||
- fixed a definition problem for input monitoring
|
|
||||||
|
|
@ -1,257 +0,0 @@
|
||||||
/*
|
|
||||||
Steinberg Audio Stream I/O API
|
|
||||||
(c) 1996, Steinberg Soft- und Hardware GmbH
|
|
||||||
|
|
||||||
asio.cpp
|
|
||||||
|
|
||||||
asio functions entries which translate the
|
|
||||||
asio interface to the asiodrvr class methods
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include "asiosys.h" // platform definition
|
|
||||||
#include "asio.h"
|
|
||||||
|
|
||||||
#if MAC
|
|
||||||
#include "asiodrvr.h"
|
|
||||||
|
|
||||||
#pragma export on
|
|
||||||
|
|
||||||
AsioDriver *theAsioDriver = 0;
|
|
||||||
|
|
||||||
extern "C"
|
|
||||||
{
|
|
||||||
|
|
||||||
long main()
|
|
||||||
{
|
|
||||||
return 'ASIO';
|
|
||||||
}
|
|
||||||
|
|
||||||
#elif WINDOWS
|
|
||||||
|
|
||||||
#include "windows.h"
|
|
||||||
#include "iasiodrv.h"
|
|
||||||
#include "asiodrivers.h"
|
|
||||||
|
|
||||||
IASIO *theAsioDriver = 0;
|
|
||||||
extern AsioDrivers *asioDrivers;
|
|
||||||
|
|
||||||
#elif SGI || SUN || BEOS || LINUX
|
|
||||||
#include "asiodrvr.h"
|
|
||||||
static AsioDriver *theAsioDriver = 0;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------------------------------
|
|
||||||
ASIOError ASIOInit(ASIODriverInfo *info)
|
|
||||||
{
|
|
||||||
#if MAC || SGI || SUN || BEOS || LINUX
|
|
||||||
if(theAsioDriver)
|
|
||||||
{
|
|
||||||
delete theAsioDriver;
|
|
||||||
theAsioDriver = 0;
|
|
||||||
}
|
|
||||||
info->driverVersion = 0;
|
|
||||||
strcpy(info->name, "No ASIO Driver");
|
|
||||||
theAsioDriver = getDriver();
|
|
||||||
if(!theAsioDriver)
|
|
||||||
{
|
|
||||||
strcpy(info->errorMessage, "Not enough memory for the ASIO driver!");
|
|
||||||
return ASE_NotPresent;
|
|
||||||
}
|
|
||||||
if(!theAsioDriver->init(info->sysRef))
|
|
||||||
{
|
|
||||||
theAsioDriver->getErrorMessage(info->errorMessage);
|
|
||||||
delete theAsioDriver;
|
|
||||||
theAsioDriver = 0;
|
|
||||||
return ASE_NotPresent;
|
|
||||||
}
|
|
||||||
strcpy(info->errorMessage, "No ASIO Driver Error");
|
|
||||||
theAsioDriver->getDriverName(info->name);
|
|
||||||
info->driverVersion = theAsioDriver->getDriverVersion();
|
|
||||||
return ASE_OK;
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
info->driverVersion = 0;
|
|
||||||
strcpy(info->name, "No ASIO Driver");
|
|
||||||
if(theAsioDriver) // must be loaded!
|
|
||||||
{
|
|
||||||
if(!theAsioDriver->init(info->sysRef))
|
|
||||||
{
|
|
||||||
theAsioDriver->getErrorMessage(info->errorMessage);
|
|
||||||
theAsioDriver = 0;
|
|
||||||
return ASE_NotPresent;
|
|
||||||
}
|
|
||||||
|
|
||||||
strcpy(info->errorMessage, "No ASIO Driver Error");
|
|
||||||
theAsioDriver->getDriverName(info->name);
|
|
||||||
info->driverVersion = theAsioDriver->getDriverVersion();
|
|
||||||
return ASE_OK;
|
|
||||||
}
|
|
||||||
return ASE_NotPresent;
|
|
||||||
|
|
||||||
#endif // !MAC
|
|
||||||
}
|
|
||||||
|
|
||||||
ASIOError ASIOExit(void)
|
|
||||||
{
|
|
||||||
if(theAsioDriver)
|
|
||||||
{
|
|
||||||
#if WINDOWS
|
|
||||||
asioDrivers->removeCurrentDriver();
|
|
||||||
#else
|
|
||||||
delete theAsioDriver;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
theAsioDriver = 0;
|
|
||||||
return ASE_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
ASIOError ASIOStart(void)
|
|
||||||
{
|
|
||||||
if(!theAsioDriver)
|
|
||||||
return ASE_NotPresent;
|
|
||||||
return theAsioDriver->start();
|
|
||||||
}
|
|
||||||
|
|
||||||
ASIOError ASIOStop(void)
|
|
||||||
{
|
|
||||||
if(!theAsioDriver)
|
|
||||||
return ASE_NotPresent;
|
|
||||||
return theAsioDriver->stop();
|
|
||||||
}
|
|
||||||
|
|
||||||
ASIOError ASIOGetChannels(long *numInputChannels, long *numOutputChannels)
|
|
||||||
{
|
|
||||||
if(!theAsioDriver)
|
|
||||||
{
|
|
||||||
*numInputChannels = *numOutputChannels = 0;
|
|
||||||
return ASE_NotPresent;
|
|
||||||
}
|
|
||||||
return theAsioDriver->getChannels(numInputChannels, numOutputChannels);
|
|
||||||
}
|
|
||||||
|
|
||||||
ASIOError ASIOGetLatencies(long *inputLatency, long *outputLatency)
|
|
||||||
{
|
|
||||||
if(!theAsioDriver)
|
|
||||||
{
|
|
||||||
*inputLatency = *outputLatency = 0;
|
|
||||||
return ASE_NotPresent;
|
|
||||||
}
|
|
||||||
return theAsioDriver->getLatencies(inputLatency, outputLatency);
|
|
||||||
}
|
|
||||||
|
|
||||||
ASIOError ASIOGetBufferSize(long *minSize, long *maxSize, long *preferredSize, long *granularity)
|
|
||||||
{
|
|
||||||
if(!theAsioDriver)
|
|
||||||
{
|
|
||||||
*minSize = *maxSize = *preferredSize = *granularity = 0;
|
|
||||||
return ASE_NotPresent;
|
|
||||||
}
|
|
||||||
return theAsioDriver->getBufferSize(minSize, maxSize, preferredSize, granularity);
|
|
||||||
}
|
|
||||||
|
|
||||||
ASIOError ASIOCanSampleRate(ASIOSampleRate sampleRate)
|
|
||||||
{
|
|
||||||
if(!theAsioDriver)
|
|
||||||
return ASE_NotPresent;
|
|
||||||
return theAsioDriver->canSampleRate(sampleRate);
|
|
||||||
}
|
|
||||||
|
|
||||||
ASIOError ASIOGetSampleRate(ASIOSampleRate *currentRate)
|
|
||||||
{
|
|
||||||
if(!theAsioDriver)
|
|
||||||
return ASE_NotPresent;
|
|
||||||
return theAsioDriver->getSampleRate(currentRate);
|
|
||||||
}
|
|
||||||
|
|
||||||
ASIOError ASIOSetSampleRate(ASIOSampleRate sampleRate)
|
|
||||||
{
|
|
||||||
if(!theAsioDriver)
|
|
||||||
return ASE_NotPresent;
|
|
||||||
return theAsioDriver->setSampleRate(sampleRate);
|
|
||||||
}
|
|
||||||
|
|
||||||
ASIOError ASIOGetClockSources(ASIOClockSource *clocks, long *numSources)
|
|
||||||
{
|
|
||||||
if(!theAsioDriver)
|
|
||||||
{
|
|
||||||
*numSources = 0;
|
|
||||||
return ASE_NotPresent;
|
|
||||||
}
|
|
||||||
return theAsioDriver->getClockSources(clocks, numSources);
|
|
||||||
}
|
|
||||||
|
|
||||||
ASIOError ASIOSetClockSource(long reference)
|
|
||||||
{
|
|
||||||
if(!theAsioDriver)
|
|
||||||
return ASE_NotPresent;
|
|
||||||
return theAsioDriver->setClockSource(reference);
|
|
||||||
}
|
|
||||||
|
|
||||||
ASIOError ASIOGetSamplePosition(ASIOSamples *sPos, ASIOTimeStamp *tStamp)
|
|
||||||
{
|
|
||||||
if(!theAsioDriver)
|
|
||||||
return ASE_NotPresent;
|
|
||||||
return theAsioDriver->getSamplePosition(sPos, tStamp);
|
|
||||||
}
|
|
||||||
|
|
||||||
ASIOError ASIOGetChannelInfo(ASIOChannelInfo *info)
|
|
||||||
{
|
|
||||||
if(!theAsioDriver)
|
|
||||||
{
|
|
||||||
info->channelGroup = -1;
|
|
||||||
info->type = ASIOSTInt16MSB;
|
|
||||||
strcpy(info->name, "None");
|
|
||||||
return ASE_NotPresent;
|
|
||||||
}
|
|
||||||
return theAsioDriver->getChannelInfo(info);
|
|
||||||
}
|
|
||||||
|
|
||||||
ASIOError ASIOCreateBuffers(ASIOBufferInfo *bufferInfos, long numChannels,
|
|
||||||
long bufferSize, ASIOCallbacks *callbacks)
|
|
||||||
{
|
|
||||||
if(!theAsioDriver)
|
|
||||||
{
|
|
||||||
ASIOBufferInfo *info = bufferInfos;
|
|
||||||
for(long i = 0; i < numChannels; i++, info++)
|
|
||||||
info->buffers[0] = info->buffers[1] = 0;
|
|
||||||
return ASE_NotPresent;
|
|
||||||
}
|
|
||||||
return theAsioDriver->createBuffers(bufferInfos, numChannels, bufferSize, callbacks);
|
|
||||||
}
|
|
||||||
|
|
||||||
ASIOError ASIODisposeBuffers(void)
|
|
||||||
{
|
|
||||||
if(!theAsioDriver)
|
|
||||||
return ASE_NotPresent;
|
|
||||||
return theAsioDriver->disposeBuffers();
|
|
||||||
}
|
|
||||||
|
|
||||||
ASIOError ASIOControlPanel(void)
|
|
||||||
{
|
|
||||||
if(!theAsioDriver)
|
|
||||||
return ASE_NotPresent;
|
|
||||||
return theAsioDriver->controlPanel();
|
|
||||||
}
|
|
||||||
|
|
||||||
ASIOError ASIOFuture(long selector, void *opt)
|
|
||||||
{
|
|
||||||
if(!theAsioDriver)
|
|
||||||
return ASE_NotPresent;
|
|
||||||
return theAsioDriver->future(selector, opt);
|
|
||||||
}
|
|
||||||
|
|
||||||
ASIOError ASIOOutputReady(void)
|
|
||||||
{
|
|
||||||
if(!theAsioDriver)
|
|
||||||
return ASE_NotPresent;
|
|
||||||
return theAsioDriver->outputReady();
|
|
||||||
}
|
|
||||||
|
|
||||||
#if MAC
|
|
||||||
} // extern "C"
|
|
||||||
#pragma export off
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -1,139 +0,0 @@
|
||||||
/*
|
|
||||||
Steinberg Audio Stream I/O API
|
|
||||||
(c) 1996, Steinberg Soft- und Hardware GmbH
|
|
||||||
charlie (May 1996)
|
|
||||||
|
|
||||||
asiodrvr.cpp
|
|
||||||
c++ superclass to implement asio functionality. from this,
|
|
||||||
you can derive whatever required
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include "asiosys.h"
|
|
||||||
#include "asiodrvr.h"
|
|
||||||
|
|
||||||
#if WINDOWS
|
|
||||||
#error do not use this
|
|
||||||
AsioDriver::AsioDriver (LPUNKNOWN pUnk, HRESULT *phr) : CUnknown("My AsioDriver", pUnk, phr)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
AsioDriver::AsioDriver()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
AsioDriver::~AsioDriver()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
ASIOBool AsioDriver::init(void *sysRef)
|
|
||||||
{
|
|
||||||
return ASE_NotPresent;
|
|
||||||
}
|
|
||||||
|
|
||||||
void AsioDriver::getDriverName(char *name)
|
|
||||||
{
|
|
||||||
strcpy(name, "No Driver");
|
|
||||||
}
|
|
||||||
|
|
||||||
long AsioDriver::getDriverVersion()
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void AsioDriver::getErrorMessage(char *string)
|
|
||||||
{
|
|
||||||
strcpy(string, "ASIO Driver Implementation Error!");
|
|
||||||
}
|
|
||||||
|
|
||||||
ASIOError AsioDriver::start()
|
|
||||||
{
|
|
||||||
return ASE_NotPresent;
|
|
||||||
}
|
|
||||||
|
|
||||||
ASIOError AsioDriver::stop()
|
|
||||||
{
|
|
||||||
return ASE_NotPresent;
|
|
||||||
}
|
|
||||||
|
|
||||||
ASIOError AsioDriver::getChannels(long *numInputChannels, long *numOutputChannels)
|
|
||||||
{
|
|
||||||
return ASE_NotPresent;
|
|
||||||
}
|
|
||||||
|
|
||||||
ASIOError AsioDriver::getLatencies(long *inputLatency, long *outputLatency)
|
|
||||||
{
|
|
||||||
return ASE_NotPresent;
|
|
||||||
}
|
|
||||||
|
|
||||||
ASIOError AsioDriver::getBufferSize(long *minSize, long *maxSize,
|
|
||||||
long *preferredSize, long *granularity)
|
|
||||||
{
|
|
||||||
return ASE_NotPresent;
|
|
||||||
}
|
|
||||||
|
|
||||||
ASIOError AsioDriver::canSampleRate(ASIOSampleRate sampleRate)
|
|
||||||
{
|
|
||||||
return ASE_NotPresent;
|
|
||||||
}
|
|
||||||
|
|
||||||
ASIOError AsioDriver::getSampleRate(ASIOSampleRate *sampleRate)
|
|
||||||
{
|
|
||||||
return ASE_NotPresent;
|
|
||||||
}
|
|
||||||
|
|
||||||
ASIOError AsioDriver::setSampleRate(ASIOSampleRate sampleRate)
|
|
||||||
{
|
|
||||||
return ASE_NotPresent;
|
|
||||||
}
|
|
||||||
|
|
||||||
ASIOError AsioDriver::getClockSources(ASIOClockSource *clocks, long *numSources)
|
|
||||||
{
|
|
||||||
*numSources = 0;
|
|
||||||
return ASE_NotPresent;
|
|
||||||
}
|
|
||||||
|
|
||||||
ASIOError AsioDriver::setClockSource(long reference)
|
|
||||||
{
|
|
||||||
return ASE_NotPresent;
|
|
||||||
}
|
|
||||||
|
|
||||||
ASIOError AsioDriver::getSamplePosition(ASIOSamples *sPos, ASIOTimeStamp *tStamp)
|
|
||||||
{
|
|
||||||
return ASE_NotPresent;
|
|
||||||
}
|
|
||||||
|
|
||||||
ASIOError AsioDriver::getChannelInfo(ASIOChannelInfo *info)
|
|
||||||
{
|
|
||||||
return ASE_NotPresent;
|
|
||||||
}
|
|
||||||
|
|
||||||
ASIOError AsioDriver::createBuffers(ASIOBufferInfo *channelInfos, long numChannels,
|
|
||||||
long bufferSize, ASIOCallbacks *callbacks)
|
|
||||||
{
|
|
||||||
return ASE_NotPresent;
|
|
||||||
}
|
|
||||||
|
|
||||||
ASIOError AsioDriver::disposeBuffers()
|
|
||||||
{
|
|
||||||
return ASE_NotPresent;
|
|
||||||
}
|
|
||||||
|
|
||||||
ASIOError AsioDriver::controlPanel()
|
|
||||||
{
|
|
||||||
return ASE_NotPresent;
|
|
||||||
}
|
|
||||||
|
|
||||||
ASIOError AsioDriver::future(long selector, void *opt)
|
|
||||||
{
|
|
||||||
return ASE_NotPresent;
|
|
||||||
}
|
|
||||||
|
|
||||||
ASIOError AsioDriver::outputReady()
|
|
||||||
{
|
|
||||||
return ASE_NotPresent;
|
|
||||||
}
|
|
||||||
|
|
@ -1,76 +0,0 @@
|
||||||
/*
|
|
||||||
Steinberg Audio Stream I/O API
|
|
||||||
(c) 1996, Steinberg Soft- und Hardware GmbH
|
|
||||||
charlie (May 1996)
|
|
||||||
|
|
||||||
asiodrvr.h
|
|
||||||
c++ superclass to implement asio functionality. from this,
|
|
||||||
you can derive whatever required
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _asiodrvr_
|
|
||||||
#define _asiodrvr_
|
|
||||||
|
|
||||||
// cpu and os system we are running on
|
|
||||||
#include "asiosys.h"
|
|
||||||
// basic "C" interface
|
|
||||||
#include "asio.h"
|
|
||||||
|
|
||||||
class AsioDriver;
|
|
||||||
extern AsioDriver *getDriver(); // for generic constructor
|
|
||||||
|
|
||||||
#if WINDOWS
|
|
||||||
#include <windows.h>
|
|
||||||
#include "combase.h"
|
|
||||||
#include "iasiodrv.h"
|
|
||||||
class AsioDriver : public IASIO ,public CUnknown
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
AsioDriver(LPUNKNOWN pUnk, HRESULT *phr);
|
|
||||||
|
|
||||||
DECLARE_IUNKNOWN
|
|
||||||
// Factory method
|
|
||||||
static CUnknown *CreateInstance(LPUNKNOWN pUnk, HRESULT *phr);
|
|
||||||
// IUnknown
|
|
||||||
virtual HRESULT STDMETHODCALLTYPE NonDelegatingQueryInterface(REFIID riid,void **ppvObject);
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
class AsioDriver
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
AsioDriver();
|
|
||||||
#endif
|
|
||||||
virtual ~AsioDriver();
|
|
||||||
|
|
||||||
virtual ASIOBool init(void* sysRef);
|
|
||||||
virtual void getDriverName(char *name); // max 32 bytes incl. terminating zero
|
|
||||||
virtual long getDriverVersion();
|
|
||||||
virtual void getErrorMessage(char *string); // max 124 bytes incl.
|
|
||||||
|
|
||||||
virtual ASIOError start();
|
|
||||||
virtual ASIOError stop();
|
|
||||||
|
|
||||||
virtual ASIOError getChannels(long *numInputChannels, long *numOutputChannels);
|
|
||||||
virtual ASIOError getLatencies(long *inputLatency, long *outputLatency);
|
|
||||||
virtual ASIOError getBufferSize(long *minSize, long *maxSize,
|
|
||||||
long *preferredSize, long *granularity);
|
|
||||||
|
|
||||||
virtual ASIOError canSampleRate(ASIOSampleRate sampleRate);
|
|
||||||
virtual ASIOError getSampleRate(ASIOSampleRate *sampleRate);
|
|
||||||
virtual ASIOError setSampleRate(ASIOSampleRate sampleRate);
|
|
||||||
virtual ASIOError getClockSources(ASIOClockSource *clocks, long *numSources);
|
|
||||||
virtual ASIOError setClockSource(long reference);
|
|
||||||
|
|
||||||
virtual ASIOError getSamplePosition(ASIOSamples *sPos, ASIOTimeStamp *tStamp);
|
|
||||||
virtual ASIOError getChannelInfo(ASIOChannelInfo *info);
|
|
||||||
|
|
||||||
virtual ASIOError createBuffers(ASIOBufferInfo *bufferInfos, long numChannels,
|
|
||||||
long bufferSize, ASIOCallbacks *callbacks);
|
|
||||||
virtual ASIOError disposeBuffers();
|
|
||||||
|
|
||||||
virtual ASIOError controlPanel();
|
|
||||||
virtual ASIOError future(long selector, void *opt);
|
|
||||||
virtual ASIOError outputReady();
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,82 +0,0 @@
|
||||||
#ifndef __asiosys__
|
|
||||||
#define __asiosys__
|
|
||||||
|
|
||||||
#if defined(_WIN32) || defined(_WIN64)
|
|
||||||
#undef MAC
|
|
||||||
#define PPC 0
|
|
||||||
#define WINDOWS 1
|
|
||||||
#define SGI 0
|
|
||||||
#define SUN 0
|
|
||||||
#define LINUX 0
|
|
||||||
#define BEOS 0
|
|
||||||
|
|
||||||
#define NATIVE_INT64 0
|
|
||||||
#define IEEE754_64FLOAT 1
|
|
||||||
|
|
||||||
#elif BEOS
|
|
||||||
#define MAC 0
|
|
||||||
#define PPC 0
|
|
||||||
#define WINDOWS 0
|
|
||||||
#define PC 0
|
|
||||||
#define SGI 0
|
|
||||||
#define SUN 0
|
|
||||||
#define LINUX 0
|
|
||||||
|
|
||||||
#define NATIVE_INT64 0
|
|
||||||
#define IEEE754_64FLOAT 1
|
|
||||||
|
|
||||||
#ifndef DEBUG
|
|
||||||
#define DEBUG 0
|
|
||||||
#if DEBUG
|
|
||||||
void DEBUGGERMESSAGE(char *string);
|
|
||||||
#else
|
|
||||||
#define DEBUGGERMESSAGE(a)
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#elif SGI
|
|
||||||
#define MAC 0
|
|
||||||
#define PPC 0
|
|
||||||
#define WINDOWS 0
|
|
||||||
#define PC 0
|
|
||||||
#define SUN 0
|
|
||||||
#define LINUX 0
|
|
||||||
#define BEOS 0
|
|
||||||
|
|
||||||
#define NATIVE_INT64 0
|
|
||||||
#define IEEE754_64FLOAT 1
|
|
||||||
|
|
||||||
#ifndef DEBUG
|
|
||||||
#define DEBUG 0
|
|
||||||
#if DEBUG
|
|
||||||
void DEBUGGERMESSAGE(char *string);
|
|
||||||
#else
|
|
||||||
#define DEBUGGERMESSAGE(a)
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#else // MAC
|
|
||||||
|
|
||||||
#define MAC 1
|
|
||||||
#define PPC 1
|
|
||||||
#define WINDOWS 0
|
|
||||||
#define PC 0
|
|
||||||
#define SGI 0
|
|
||||||
#define SUN 0
|
|
||||||
#define LINUX 0
|
|
||||||
#define BEOS 0
|
|
||||||
|
|
||||||
#define NATIVE_INT64 0
|
|
||||||
#define IEEE754_64FLOAT 1
|
|
||||||
|
|
||||||
#ifndef DEBUG
|
|
||||||
#define DEBUG 0
|
|
||||||
#if DEBUG
|
|
||||||
void DEBUGGERMESSAGE(char *string);
|
|
||||||
#else
|
|
||||||
#define DEBUGGERMESSAGE(a)
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,202 +0,0 @@
|
||||||
//==========================================================================;
|
|
||||||
//
|
|
||||||
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
|
|
||||||
// KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
|
||||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
|
|
||||||
// PURPOSE.
|
|
||||||
//
|
|
||||||
// Copyright (c) 1992 - 1996 Microsoft Corporation. All Rights Reserved.
|
|
||||||
//
|
|
||||||
//--------------------------------------------------------------------------;
|
|
||||||
|
|
||||||
// Base class hierachy for creating COM objects, December 1994
|
|
||||||
|
|
||||||
#include <windows.h>
|
|
||||||
#include "wxdebug.h"
|
|
||||||
#include "combase.h"
|
|
||||||
#pragma warning( disable : 4514 ) // Disable warnings re unused inline functions
|
|
||||||
|
|
||||||
|
|
||||||
/* Define the static member variable */
|
|
||||||
|
|
||||||
LONG CBaseObject::m_cObjects = 0;
|
|
||||||
|
|
||||||
|
|
||||||
/* Constructor */
|
|
||||||
|
|
||||||
CBaseObject::CBaseObject(TCHAR *pName)
|
|
||||||
{
|
|
||||||
/* Increment the number of active objects */
|
|
||||||
InterlockedIncrement(&m_cObjects);
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
m_dwCookie = DbgRegisterObjectCreation(pName);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Destructor */
|
|
||||||
|
|
||||||
CBaseObject::~CBaseObject()
|
|
||||||
{
|
|
||||||
/* Decrement the number of objects active */
|
|
||||||
InterlockedDecrement(&m_cObjects);
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
DbgRegisterObjectDestruction(m_dwCookie);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Constructor */
|
|
||||||
|
|
||||||
// We know we use "this" in the initialization list, we also know we don't modify *phr.
|
|
||||||
#pragma warning( disable : 4355 4100 )
|
|
||||||
CUnknown::CUnknown(TCHAR *pName, LPUNKNOWN pUnk, HRESULT *phr)
|
|
||||||
: CBaseObject(pName)
|
|
||||||
/* Start the object with a reference count of zero - when the */
|
|
||||||
/* object is queried for it's first interface this may be */
|
|
||||||
/* incremented depending on whether or not this object is */
|
|
||||||
/* currently being aggregated upon */
|
|
||||||
, m_cRef(0)
|
|
||||||
/* Set our pointer to our IUnknown interface. */
|
|
||||||
/* If we have an outer, use its, otherwise use ours. */
|
|
||||||
/* This pointer effectivly points to the owner of */
|
|
||||||
/* this object and can be accessed by the GetOwner() method. */
|
|
||||||
, m_pUnknown( pUnk != 0 ? pUnk : reinterpret_cast<LPUNKNOWN>( static_cast<PNDUNKNOWN>(this) ) )
|
|
||||||
/* Why the double cast? Well, the inner cast is a type-safe cast */
|
|
||||||
/* to pointer to a type from which we inherit. The second is */
|
|
||||||
/* type-unsafe but works because INonDelegatingUnknown "behaves */
|
|
||||||
/* like" IUnknown. (Only the names on the methods change.) */
|
|
||||||
{
|
|
||||||
// Everything we need to do has been done in the initializer list
|
|
||||||
}
|
|
||||||
#pragma warning( default : 4355 4100 )
|
|
||||||
|
|
||||||
/* QueryInterface */
|
|
||||||
|
|
||||||
STDMETHODIMP CUnknown::NonDelegatingQueryInterface(REFIID riid, void ** ppv)
|
|
||||||
{
|
|
||||||
CheckPointer(ppv,E_POINTER);
|
|
||||||
ValidateReadWritePtr(ppv,sizeof(PVOID));
|
|
||||||
|
|
||||||
/* We know only about IUnknown */
|
|
||||||
|
|
||||||
if (riid == IID_IUnknown) {
|
|
||||||
GetInterface((LPUNKNOWN) (PNDUNKNOWN) this, ppv);
|
|
||||||
return NOERROR;
|
|
||||||
} else {
|
|
||||||
*ppv = NULL;
|
|
||||||
return E_NOINTERFACE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* We have to ensure that we DON'T use a max macro, since these will typically */
|
|
||||||
/* lead to one of the parameters being evaluated twice. Since we are worried */
|
|
||||||
/* about concurrency, we can't afford to access the m_cRef twice since we can't */
|
|
||||||
/* afford to run the risk that its value having changed between accesses. */
|
|
||||||
#ifdef max
|
|
||||||
#undef max
|
|
||||||
#endif
|
|
||||||
|
|
||||||
template<class T> inline static T max( const T & a, const T & b )
|
|
||||||
{
|
|
||||||
return a > b ? a : b;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* AddRef */
|
|
||||||
|
|
||||||
STDMETHODIMP_(ULONG) CUnknown::NonDelegatingAddRef()
|
|
||||||
{
|
|
||||||
LONG lRef = InterlockedIncrement( &m_cRef );
|
|
||||||
ASSERT(lRef > 0);
|
|
||||||
DbgLog((LOG_MEMORY,3,TEXT(" Obj %d ref++ = %d"),
|
|
||||||
m_dwCookie, m_cRef));
|
|
||||||
return max(ULONG(m_cRef), 1ul);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Release */
|
|
||||||
|
|
||||||
STDMETHODIMP_(ULONG) CUnknown::NonDelegatingRelease()
|
|
||||||
{
|
|
||||||
/* If the reference count drops to zero delete ourselves */
|
|
||||||
|
|
||||||
LONG lRef = InterlockedDecrement( &m_cRef );
|
|
||||||
ASSERT(lRef >= 0);
|
|
||||||
|
|
||||||
DbgLog((LOG_MEMORY,3,TEXT(" Object %d ref-- = %d"),
|
|
||||||
m_dwCookie, m_cRef));
|
|
||||||
if (lRef == 0) {
|
|
||||||
|
|
||||||
// COM rules say we must protect against re-entrancy.
|
|
||||||
// If we are an aggregator and we hold our own interfaces
|
|
||||||
// on the aggregatee, the QI for these interfaces will
|
|
||||||
// addref ourselves. So after doing the QI we must release
|
|
||||||
// a ref count on ourselves. Then, before releasing the
|
|
||||||
// private interface, we must addref ourselves. When we do
|
|
||||||
// this from the destructor here it will result in the ref
|
|
||||||
// count going to 1 and then back to 0 causing us to
|
|
||||||
// re-enter the destructor. Hence we add an extra refcount here
|
|
||||||
// once we know we will delete the object.
|
|
||||||
// for an example aggregator see filgraph\distrib.cpp.
|
|
||||||
|
|
||||||
m_cRef++;
|
|
||||||
|
|
||||||
delete this;
|
|
||||||
return ULONG(0);
|
|
||||||
} else {
|
|
||||||
return max(ULONG(m_cRef), 1ul);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Return an interface pointer to a requesting client
|
|
||||||
performing a thread safe AddRef as necessary */
|
|
||||||
|
|
||||||
HRESULT CUnknown::GetInterface(LPUNKNOWN pUnk, void **ppv)
|
|
||||||
{
|
|
||||||
CheckPointer(ppv, E_POINTER);
|
|
||||||
*ppv = pUnk;
|
|
||||||
pUnk->AddRef();
|
|
||||||
return NOERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Compares two interfaces and returns TRUE if they are on the same object */
|
|
||||||
|
|
||||||
BOOL IsEqualObject(IUnknown *pFirst, IUnknown *pSecond)
|
|
||||||
{
|
|
||||||
/* Different objects can't have the same interface pointer for
|
|
||||||
any interface
|
|
||||||
*/
|
|
||||||
if (pFirst == pSecond) {
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
/* OK - do it the hard way - check if they have the same
|
|
||||||
IUnknown pointers - a single object can only have one of these
|
|
||||||
*/
|
|
||||||
LPUNKNOWN pUnknown1; // Retrieve the IUnknown interface
|
|
||||||
LPUNKNOWN pUnknown2; // Retrieve the other IUnknown interface
|
|
||||||
HRESULT hr; // General OLE return code
|
|
||||||
|
|
||||||
ASSERT(pFirst);
|
|
||||||
ASSERT(pSecond);
|
|
||||||
|
|
||||||
/* See if the IUnknown pointers match */
|
|
||||||
|
|
||||||
hr = pFirst->QueryInterface(IID_IUnknown,(void **) &pUnknown1);
|
|
||||||
ASSERT(SUCCEEDED(hr));
|
|
||||||
ASSERT(pUnknown1);
|
|
||||||
|
|
||||||
hr = pSecond->QueryInterface(IID_IUnknown,(void **) &pUnknown2);
|
|
||||||
ASSERT(SUCCEEDED(hr));
|
|
||||||
ASSERT(pUnknown2);
|
|
||||||
|
|
||||||
/* Release the extra interfaces we hold */
|
|
||||||
|
|
||||||
pUnknown1->Release();
|
|
||||||
pUnknown2->Release();
|
|
||||||
return (pUnknown1 == pUnknown2);
|
|
||||||
}
|
|
||||||
|
|
@ -1,284 +0,0 @@
|
||||||
//==========================================================================;
|
|
||||||
//
|
|
||||||
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
|
|
||||||
// KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
|
||||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
|
|
||||||
// PURPOSE.
|
|
||||||
//
|
|
||||||
// Copyright (c) 1992 - 1996 Microsoft Corporation. All Rights Reserved.
|
|
||||||
//
|
|
||||||
//--------------------------------------------------------------------------;
|
|
||||||
|
|
||||||
// Base class hierachy for creating COM objects, December 1994
|
|
||||||
|
|
||||||
/*
|
|
||||||
|
|
||||||
a. Derive your COM object from CUnknown
|
|
||||||
|
|
||||||
b. Make a static CreateInstance function that takes an LPUNKNOWN, an HRESULT *
|
|
||||||
and a TCHAR *. The LPUNKNOWN defines the object to delegate IUnknown calls
|
|
||||||
to. The HRESULT * allows error codes to be passed around constructors and
|
|
||||||
the TCHAR * is a descriptive name that can be printed on the debugger.
|
|
||||||
|
|
||||||
It is important that constructors only change the HRESULT * if they have
|
|
||||||
to set an ERROR code, if it was successful then leave it alone or you may
|
|
||||||
overwrite an error code from an object previously created.
|
|
||||||
|
|
||||||
When you call a constructor the descriptive name should be in static store
|
|
||||||
as we do not copy the string. To stop large amounts of memory being used
|
|
||||||
in retail builds by all these static strings use the NAME macro,
|
|
||||||
|
|
||||||
CMyFilter = new CImplFilter(NAME("My filter"),pUnknown,phr);
|
|
||||||
if (FAILED(hr)) {
|
|
||||||
return hr;
|
|
||||||
}
|
|
||||||
|
|
||||||
In retail builds NAME(_x_) compiles to NULL, the base CBaseObject class
|
|
||||||
knows not to do anything with objects that don't have a name.
|
|
||||||
|
|
||||||
c. Have a constructor for your object that passes the LPUNKNOWN, HRESULT * and
|
|
||||||
TCHAR * to the CUnknown constructor. You can set the HRESULT if you have an
|
|
||||||
error, or just simply pass it through to the constructor.
|
|
||||||
|
|
||||||
The object creation will fail in the class factory if the HRESULT indicates
|
|
||||||
an error (ie FAILED(HRESULT) == TRUE)
|
|
||||||
|
|
||||||
d. Create a FactoryTemplate with your object's class id and CreateInstance
|
|
||||||
function.
|
|
||||||
|
|
||||||
Then (for each interface) either
|
|
||||||
|
|
||||||
Multiple inheritance
|
|
||||||
|
|
||||||
1. Also derive it from ISomeInterface
|
|
||||||
2. Include DECLARE_IUNKNOWN in your class definition to declare
|
|
||||||
implementations of QueryInterface, AddRef and Release that
|
|
||||||
call the outer unknown
|
|
||||||
3. Override NonDelegatingQueryInterface to expose ISomeInterface by
|
|
||||||
code something like
|
|
||||||
|
|
||||||
if (riid == IID_ISomeInterface) {
|
|
||||||
return GetInterface((ISomeInterface *) this, ppv);
|
|
||||||
} else {
|
|
||||||
return CUnknown::NonDelegatingQueryInterface(riid, ppv);
|
|
||||||
}
|
|
||||||
|
|
||||||
4. Declare and implement the member functions of ISomeInterface.
|
|
||||||
|
|
||||||
or: Nested interfaces
|
|
||||||
|
|
||||||
1. Declare a class derived from CUnknown
|
|
||||||
2. Include DECLARE_IUNKNOWN in your class definition
|
|
||||||
3. Override NonDelegatingQueryInterface to expose ISomeInterface by
|
|
||||||
code something like
|
|
||||||
|
|
||||||
if (riid == IID_ISomeInterface) {
|
|
||||||
return GetInterface((ISomeInterface *) this, ppv);
|
|
||||||
} else {
|
|
||||||
return CUnknown::NonDelegatingQueryInterface(riid, ppv);
|
|
||||||
}
|
|
||||||
|
|
||||||
4. Implement the member functions of ISomeInterface. Use GetOwner() to
|
|
||||||
access the COM object class.
|
|
||||||
|
|
||||||
And in your COM object class:
|
|
||||||
|
|
||||||
5. Make the nested class a friend of the COM object class, and declare
|
|
||||||
an instance of the nested class as a member of the COM object class.
|
|
||||||
|
|
||||||
NOTE that because you must always pass the outer unknown and an hResult
|
|
||||||
to the CUnknown constructor you cannot use a default constructor, in
|
|
||||||
other words you will have to make the member variable a pointer to the
|
|
||||||
class and make a NEW call in your constructor to actually create it.
|
|
||||||
|
|
||||||
6. override the NonDelegatingQueryInterface with code like this:
|
|
||||||
|
|
||||||
if (riid == IID_ISomeInterface) {
|
|
||||||
return m_pImplFilter->
|
|
||||||
NonDelegatingQueryInterface(IID_ISomeInterface, ppv);
|
|
||||||
} else {
|
|
||||||
return CUnknown::NonDelegatingQueryInterface(riid, ppv);
|
|
||||||
}
|
|
||||||
|
|
||||||
You can have mixed classes which support some interfaces via multiple
|
|
||||||
inheritance and some via nested classes
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __COMBASE__
|
|
||||||
#define __COMBASE__
|
|
||||||
|
|
||||||
/* The DLLENTRY module initialises the module handle on loading */
|
|
||||||
|
|
||||||
extern HINSTANCE g_hInst;
|
|
||||||
|
|
||||||
/* On DLL load remember which platform we are running on */
|
|
||||||
|
|
||||||
extern DWORD g_amPlatform;
|
|
||||||
extern OSVERSIONINFO g_osInfo; // Filled in by GetVersionEx
|
|
||||||
|
|
||||||
/* Version of IUnknown that is renamed to allow a class to support both
|
|
||||||
non delegating and delegating IUnknowns in the same COM object */
|
|
||||||
|
|
||||||
DECLARE_INTERFACE(INonDelegatingUnknown)
|
|
||||||
{
|
|
||||||
STDMETHOD(NonDelegatingQueryInterface) (THIS_ REFIID, LPVOID *) PURE;
|
|
||||||
STDMETHOD_(ULONG, NonDelegatingAddRef)(THIS) PURE;
|
|
||||||
STDMETHOD_(ULONG, NonDelegatingRelease)(THIS) PURE;
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef INonDelegatingUnknown *PNDUNKNOWN;
|
|
||||||
|
|
||||||
|
|
||||||
/* This is the base object class that supports active object counting. As
|
|
||||||
part of the debug facilities we trace every time a C++ object is created
|
|
||||||
or destroyed. The name of the object has to be passed up through the class
|
|
||||||
derivation list during construction as you cannot call virtual functions
|
|
||||||
in the constructor. The downside of all this is that every single object
|
|
||||||
constructor has to take an object name parameter that describes it */
|
|
||||||
|
|
||||||
class CBaseObject
|
|
||||||
{
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
// Disable the copy constructor and assignment by default so you will get
|
|
||||||
// compiler errors instead of unexpected behaviour if you pass objects
|
|
||||||
// by value or assign objects.
|
|
||||||
CBaseObject(const CBaseObject& objectSrc); // no implementation
|
|
||||||
void operator=(const CBaseObject& objectSrc); // no implementation
|
|
||||||
|
|
||||||
private:
|
|
||||||
static LONG m_cObjects; /* Total number of objects active */
|
|
||||||
|
|
||||||
protected:
|
|
||||||
#ifdef DEBUG
|
|
||||||
DWORD m_dwCookie; /* Cookie identifying this object */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
/* These increment and decrement the number of active objects */
|
|
||||||
|
|
||||||
CBaseObject(TCHAR *pName);
|
|
||||||
~CBaseObject();
|
|
||||||
|
|
||||||
/* Call this to find if there are any CUnknown derived objects active */
|
|
||||||
|
|
||||||
static LONG ObjectsActive() {
|
|
||||||
return m_cObjects;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/* An object that supports one or more COM interfaces will be based on
|
|
||||||
this class. It supports counting of total objects for DLLCanUnloadNow
|
|
||||||
support, and an implementation of the core non delegating IUnknown */
|
|
||||||
|
|
||||||
class CUnknown : public INonDelegatingUnknown,
|
|
||||||
public CBaseObject
|
|
||||||
{
|
|
||||||
|
|
||||||
private:
|
|
||||||
const LPUNKNOWN m_pUnknown; /* Owner of this object */
|
|
||||||
|
|
||||||
protected: /* So we can override NonDelegatingRelease() */
|
|
||||||
volatile LONG m_cRef; /* Number of reference counts */
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
CUnknown(TCHAR *pName, LPUNKNOWN pUnk, HRESULT *phr);
|
|
||||||
virtual ~CUnknown() {};
|
|
||||||
|
|
||||||
/* Return the owner of this object */
|
|
||||||
|
|
||||||
LPUNKNOWN GetOwner() const {
|
|
||||||
return m_pUnknown;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Called from the class factory to create a new instance, it is
|
|
||||||
pure virtual so it must be overriden in your derived class */
|
|
||||||
|
|
||||||
/* static CUnknown *CreateInstance(LPUNKNOWN, HRESULT *) */
|
|
||||||
|
|
||||||
/* Non delegating unknown implementation */
|
|
||||||
|
|
||||||
STDMETHODIMP NonDelegatingQueryInterface(REFIID, void **);
|
|
||||||
STDMETHODIMP_(ULONG) NonDelegatingAddRef();
|
|
||||||
STDMETHODIMP_(ULONG) NonDelegatingRelease();
|
|
||||||
|
|
||||||
/* Return an interface pointer to a requesting client
|
|
||||||
performing a thread safe AddRef as necessary */
|
|
||||||
|
|
||||||
HRESULT GetInterface(LPUNKNOWN pUnk, void **ppv);
|
|
||||||
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
#if WINVER < 0x0501
|
|
||||||
|
|
||||||
/* The standard InterlockedXXX functions won't take volatiles */
|
|
||||||
static inline LONG InterlockedIncrement( volatile LONG * plong )
|
|
||||||
{ return InterlockedIncrement( const_cast<LONG*>( plong ) ); }
|
|
||||||
|
|
||||||
static inline LONG InterlockedDecrement( volatile LONG * plong )
|
|
||||||
{ return InterlockedDecrement( const_cast<LONG*>( plong ) ); }
|
|
||||||
|
|
||||||
static inline LONG InterlockedExchange( volatile LONG * plong, LONG new_value )
|
|
||||||
{ return InterlockedExchange( const_cast<LONG*>( plong ), new_value ); }
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* A function that can create a new COM object */
|
|
||||||
|
|
||||||
typedef CUnknown *(*LPFNNewCOMObject)(LPUNKNOWN pUnkOuter, HRESULT *phr);
|
|
||||||
|
|
||||||
/* A function (can be NULL) which is called from the DLL entrypoint
|
|
||||||
routine for each factory template:
|
|
||||||
|
|
||||||
bLoading - TRUE on DLL load, FALSE on DLL unload
|
|
||||||
rclsid - the m_ClsID of the entry
|
|
||||||
*/
|
|
||||||
typedef void (*LPFNInitRoutine)(BOOL bLoading, const CLSID *rclsid);
|
|
||||||
|
|
||||||
/* Create one of these per object class in an array so that
|
|
||||||
the default class factory code can create new instances */
|
|
||||||
|
|
||||||
class CFactoryTemplate {
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
const WCHAR *m_Name;
|
|
||||||
const CLSID *m_ClsID;
|
|
||||||
LPFNNewCOMObject m_lpfnNew;
|
|
||||||
LPFNInitRoutine m_lpfnInit;
|
|
||||||
|
|
||||||
BOOL IsClassID(REFCLSID rclsid) const {
|
|
||||||
return (IsEqualCLSID(*m_ClsID,rclsid));
|
|
||||||
};
|
|
||||||
|
|
||||||
CUnknown *CreateInstance(LPUNKNOWN pUnk, HRESULT *phr) const {
|
|
||||||
return m_lpfnNew(pUnk, phr);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/* You must override the (pure virtual) NonDelegatingQueryInterface to return
|
|
||||||
interface pointers (using GetInterface) to the interfaces your derived
|
|
||||||
class supports (the default implementation only supports IUnknown) */
|
|
||||||
|
|
||||||
#define DECLARE_IUNKNOWN \
|
|
||||||
STDMETHODIMP QueryInterface(REFIID riid, void **ppv) { \
|
|
||||||
return GetOwner()->QueryInterface(riid,ppv); \
|
|
||||||
}; \
|
|
||||||
STDMETHODIMP_(ULONG) AddRef() { \
|
|
||||||
return GetOwner()->AddRef(); \
|
|
||||||
}; \
|
|
||||||
STDMETHODIMP_(ULONG) Release() { \
|
|
||||||
return GetOwner()->Release(); \
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* __COMBASE__ */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,14 +0,0 @@
|
||||||
#include "asiosys.h"
|
|
||||||
|
|
||||||
#if DEBUG
|
|
||||||
#if MAC
|
|
||||||
#include <TextUtils.h>
|
|
||||||
void DEBUGGERMESSAGE(char *string)
|
|
||||||
{
|
|
||||||
c2pstr(string);
|
|
||||||
DebugStr((unsigned char *)string);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
#error debugmessage
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,323 +0,0 @@
|
||||||
//==========================================================================;
|
|
||||||
//
|
|
||||||
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
|
|
||||||
// KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
|
||||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
|
|
||||||
// PURPOSE.
|
|
||||||
//
|
|
||||||
// Copyright (c) 1992 - 1996 Microsoft Corporation. All Rights Reserved.
|
|
||||||
//
|
|
||||||
//--------------------------------------------------------------------------;
|
|
||||||
|
|
||||||
//
|
|
||||||
// classes used to support dll entrypoints for COM objects.
|
|
||||||
//
|
|
||||||
// #include "switches.h"
|
|
||||||
|
|
||||||
#include <windows.h>
|
|
||||||
#include "wxdebug.h"
|
|
||||||
#include "combase.h"
|
|
||||||
#ifdef DEBUG
|
|
||||||
#include <tchar.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
extern CFactoryTemplate g_Templates[];
|
|
||||||
extern int g_cTemplates;
|
|
||||||
|
|
||||||
HINSTANCE hinstance = 0;
|
|
||||||
DWORD g_amPlatform; // VER_PLATFORM_WIN32_WINDOWS etc... (from GetVersionEx)
|
|
||||||
OSVERSIONINFO g_osInfo;
|
|
||||||
|
|
||||||
//
|
|
||||||
// an instance of this is created by the DLLGetClassObject entrypoint
|
|
||||||
// it uses the CFactoryTemplate object it is given to support the
|
|
||||||
// IClassFactory interface
|
|
||||||
|
|
||||||
class CClassFactory : public IClassFactory
|
|
||||||
{
|
|
||||||
|
|
||||||
private:
|
|
||||||
const CFactoryTemplate * m_pTemplate;
|
|
||||||
|
|
||||||
ULONG m_cRef;
|
|
||||||
|
|
||||||
static int m_cLocked;
|
|
||||||
public:
|
|
||||||
CClassFactory(const CFactoryTemplate *);
|
|
||||||
|
|
||||||
// IUnknown
|
|
||||||
STDMETHODIMP QueryInterface(REFIID riid, void ** ppv);
|
|
||||||
STDMETHODIMP_(ULONG)AddRef();
|
|
||||||
STDMETHODIMP_(ULONG)Release();
|
|
||||||
|
|
||||||
// IClassFactory
|
|
||||||
STDMETHODIMP CreateInstance(LPUNKNOWN pUnkOuter, REFIID riid, void **pv);
|
|
||||||
STDMETHODIMP LockServer(BOOL fLock);
|
|
||||||
|
|
||||||
// allow DLLGetClassObject to know about global server lock status
|
|
||||||
static BOOL IsLocked() {
|
|
||||||
return (m_cLocked > 0);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
// process-wide dll locked state
|
|
||||||
int CClassFactory::m_cLocked = 0;
|
|
||||||
|
|
||||||
CClassFactory::CClassFactory(const CFactoryTemplate *pTemplate)
|
|
||||||
{
|
|
||||||
m_cRef = 0;
|
|
||||||
m_pTemplate = pTemplate;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
STDMETHODIMP CClassFactory::QueryInterface(REFIID riid,void **ppv)
|
|
||||||
{
|
|
||||||
CheckPointer(ppv,E_POINTER)
|
|
||||||
ValidateReadWritePtr(ppv,sizeof(PVOID));
|
|
||||||
*ppv = NULL;
|
|
||||||
|
|
||||||
// any interface on this object is the object pointer.
|
|
||||||
if ((riid == IID_IUnknown) || (riid == IID_IClassFactory)) {
|
|
||||||
*ppv = (LPVOID) this;
|
|
||||||
// AddRef returned interface pointer
|
|
||||||
((LPUNKNOWN) *ppv)->AddRef();
|
|
||||||
return NOERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ResultFromScode(E_NOINTERFACE);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
STDMETHODIMP_(ULONG) CClassFactory::AddRef()
|
|
||||||
{
|
|
||||||
return ++m_cRef;
|
|
||||||
}
|
|
||||||
|
|
||||||
STDMETHODIMP_(ULONG) CClassFactory::Release()
|
|
||||||
{
|
|
||||||
LONG rc;
|
|
||||||
|
|
||||||
if (--m_cRef == 0) {
|
|
||||||
delete this;
|
|
||||||
rc = 0;
|
|
||||||
} else rc = m_cRef;
|
|
||||||
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
STDMETHODIMP CClassFactory::CreateInstance(LPUNKNOWN pUnkOuter,REFIID riid,void **pv)
|
|
||||||
{
|
|
||||||
CheckPointer(pv,E_POINTER)
|
|
||||||
ValidateReadWritePtr(pv,sizeof(void *));
|
|
||||||
|
|
||||||
/* Enforce the normal OLE rules regarding interfaces and delegation */
|
|
||||||
|
|
||||||
if (pUnkOuter != NULL) {
|
|
||||||
if (IsEqualIID(riid,IID_IUnknown) == FALSE) {
|
|
||||||
return ResultFromScode(E_NOINTERFACE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Create the new object through the derived class's create function */
|
|
||||||
|
|
||||||
HRESULT hr = NOERROR;
|
|
||||||
CUnknown *pObj = m_pTemplate->CreateInstance(pUnkOuter, &hr);
|
|
||||||
|
|
||||||
if (pObj == NULL) {
|
|
||||||
return E_OUTOFMEMORY;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Delete the object if we got a construction error */
|
|
||||||
|
|
||||||
if (FAILED(hr)) {
|
|
||||||
delete pObj;
|
|
||||||
return hr;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Get a reference counted interface on the object */
|
|
||||||
|
|
||||||
/* We wrap the non-delegating QI with NDAddRef & NDRelease. */
|
|
||||||
/* This protects any outer object from being prematurely */
|
|
||||||
/* released by an inner object that may have to be created */
|
|
||||||
/* in order to supply the requested interface. */
|
|
||||||
pObj->NonDelegatingAddRef();
|
|
||||||
hr = pObj->NonDelegatingQueryInterface(riid, pv);
|
|
||||||
pObj->NonDelegatingRelease();
|
|
||||||
/* Note that if NonDelegatingQueryInterface fails, it will */
|
|
||||||
/* not increment the ref count, so the NonDelegatingRelease */
|
|
||||||
/* will drop the ref back to zero and the object will "self-*/
|
|
||||||
/* destruct". Hence we don't need additional tidy-up code */
|
|
||||||
/* to cope with NonDelegatingQueryInterface failing. */
|
|
||||||
|
|
||||||
if (SUCCEEDED(hr)) {
|
|
||||||
ASSERT(*pv);
|
|
||||||
}
|
|
||||||
|
|
||||||
return hr;
|
|
||||||
}
|
|
||||||
|
|
||||||
STDMETHODIMP CClassFactory::LockServer(BOOL fLock)
|
|
||||||
{
|
|
||||||
if (fLock) {
|
|
||||||
m_cLocked++;
|
|
||||||
} else {
|
|
||||||
m_cLocked--;
|
|
||||||
}
|
|
||||||
return NOERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// --- COM entrypoints -----------------------------------------
|
|
||||||
// DllRegisterServer
|
|
||||||
|
|
||||||
//called by COM to get the class factory object for a given class
|
|
||||||
STDAPI DllGetClassObject(REFCLSID rClsID,REFIID riid,void **pv)
|
|
||||||
{
|
|
||||||
// DebugBreak();
|
|
||||||
|
|
||||||
if (!(riid == IID_IUnknown) && !(riid == IID_IClassFactory)) {
|
|
||||||
return E_NOINTERFACE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// traverse the array of templates looking for one with this
|
|
||||||
// class id
|
|
||||||
for (int i = 0; i < g_cTemplates; i++) {
|
|
||||||
const CFactoryTemplate * pT = &g_Templates[i];
|
|
||||||
if (pT->IsClassID(rClsID)) {
|
|
||||||
|
|
||||||
// found a template - make a class factory based on this
|
|
||||||
// template
|
|
||||||
|
|
||||||
*pv = (LPVOID) (LPUNKNOWN) new CClassFactory(pT);
|
|
||||||
if (*pv == NULL) {
|
|
||||||
return E_OUTOFMEMORY;
|
|
||||||
}
|
|
||||||
((LPUNKNOWN)*pv)->AddRef();
|
|
||||||
return NOERROR;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return CLASS_E_CLASSNOTAVAILABLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Call any initialization routines
|
|
||||||
//
|
|
||||||
void DllInitClasses(BOOL bLoading)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
// DebugBreak();
|
|
||||||
|
|
||||||
// traverse the array of templates calling the init routine
|
|
||||||
// if they have one
|
|
||||||
for (i = 0; i < g_cTemplates; i++) {
|
|
||||||
const CFactoryTemplate * pT = &g_Templates[i];
|
|
||||||
if (pT->m_lpfnInit != NULL) {
|
|
||||||
(*pT->m_lpfnInit)(bLoading, pT->m_ClsID);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// called by COM to determine if this dll can be unloaded
|
|
||||||
// return ok unless there are outstanding objects or a lock requested
|
|
||||||
// by IClassFactory::LockServer
|
|
||||||
//
|
|
||||||
// CClassFactory has a static function that can tell us about the locks,
|
|
||||||
// and CCOMObject has a static function that can tell us about the active
|
|
||||||
// object count
|
|
||||||
STDAPI DllCanUnloadNow()
|
|
||||||
{
|
|
||||||
// DebugBreak();
|
|
||||||
|
|
||||||
DbgLog((LOG_MEMORY,2,TEXT("DLLCanUnloadNow called - IsLocked = %d, Active objects = %d"),
|
|
||||||
CClassFactory::IsLocked(),
|
|
||||||
CBaseObject::ObjectsActive()));
|
|
||||||
|
|
||||||
if (CClassFactory::IsLocked() || CBaseObject::ObjectsActive()) {
|
|
||||||
|
|
||||||
return S_FALSE;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return S_OK;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// --- standard WIN32 entrypoints --------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
//extern "C" BOOL WINAPI DllEntryPoint(HINSTANCE, ULONG, LPVOID);
|
|
||||||
//BOOL WINAPI DllEntryPoint(HINSTANCE hInstance,ULONG ulReason,LPVOID pv)
|
|
||||||
//BOOL WINAPI DllMain (HINSTANCE hInstance,ULONG ulReason,LPVOID pv)
|
|
||||||
BOOL WINAPI DllEntryPoint (HINSTANCE hInstance,ULONG ulReason,LPVOID pv)
|
|
||||||
{
|
|
||||||
|
|
||||||
// DebugBreak();
|
|
||||||
|
|
||||||
switch (ulReason) {
|
|
||||||
|
|
||||||
case DLL_PROCESS_ATTACH:
|
|
||||||
DisableThreadLibraryCalls(hInstance);
|
|
||||||
DbgInitialise(hInstance);
|
|
||||||
{
|
|
||||||
// The platform identifier is used to work out whether
|
|
||||||
// full unicode support is available or not. Hence the
|
|
||||||
// default will be the lowest common denominator - i.e. N/A
|
|
||||||
g_amPlatform = VER_PLATFORM_WIN32_WINDOWS; // win95 assumed in case GetVersionEx fails
|
|
||||||
|
|
||||||
g_osInfo.dwOSVersionInfoSize = sizeof(g_osInfo);
|
|
||||||
if (GetVersionEx(&g_osInfo)) {
|
|
||||||
g_amPlatform = g_osInfo.dwPlatformId;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
DbgLog((LOG_ERROR, 1, "Failed to get the OS platform, assuming Win95"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
hinstance = hInstance;
|
|
||||||
DllInitClasses(TRUE);
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DLL_PROCESS_DETACH:
|
|
||||||
DllInitClasses(FALSE);
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
if (CBaseObject::ObjectsActive()) {
|
|
||||||
DbgSetModuleLevel(LOG_MEMORY, 2);
|
|
||||||
TCHAR szInfo[512];
|
|
||||||
extern TCHAR m_ModuleName[]; // Cut down module name
|
|
||||||
|
|
||||||
TCHAR FullName[_MAX_PATH]; // Load the full path and module name
|
|
||||||
TCHAR *pName; // Searches from the end for a backslash
|
|
||||||
|
|
||||||
GetModuleFileName(NULL,FullName,_MAX_PATH);
|
|
||||||
pName = _tcsrchr(FullName,'\\');
|
|
||||||
if (pName == NULL) {
|
|
||||||
pName = FullName;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
pName++;
|
|
||||||
}
|
|
||||||
|
|
||||||
DWORD cch = wsprintf(szInfo, TEXT("Executable: %s Pid %x Tid %x. "),
|
|
||||||
pName, GetCurrentProcessId(), GetCurrentThreadId());
|
|
||||||
|
|
||||||
wsprintf(szInfo+cch, TEXT("Module %s, %d objects left active!"),
|
|
||||||
m_ModuleName, CBaseObject::ObjectsActive());
|
|
||||||
DbgAssert(szInfo, TEXT(__FILE__),__LINE__);
|
|
||||||
|
|
||||||
// If running remotely wait for the Assert to be acknowledged
|
|
||||||
// before dumping out the object register
|
|
||||||
DbgDumpObjectRegister();
|
|
||||||
}
|
|
||||||
DbgTerminate();
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,37 +0,0 @@
|
||||||
#include "asiosys.h"
|
|
||||||
#include "asio.h"
|
|
||||||
|
|
||||||
/* Forward Declarations */
|
|
||||||
|
|
||||||
#ifndef __ASIODRIVER_FWD_DEFINED__
|
|
||||||
#define __ASIODRIVER_FWD_DEFINED__
|
|
||||||
typedef interface IASIO IASIO;
|
|
||||||
#endif /* __ASIODRIVER_FWD_DEFINED__ */
|
|
||||||
|
|
||||||
interface IASIO : public IUnknown
|
|
||||||
{
|
|
||||||
|
|
||||||
virtual ASIOBool init(void *sysHandle) = 0;
|
|
||||||
virtual void getDriverName(char *name) = 0;
|
|
||||||
virtual long getDriverVersion() = 0;
|
|
||||||
virtual void getErrorMessage(char *string) = 0;
|
|
||||||
virtual ASIOError start() = 0;
|
|
||||||
virtual ASIOError stop() = 0;
|
|
||||||
virtual ASIOError getChannels(long *numInputChannels, long *numOutputChannels) = 0;
|
|
||||||
virtual ASIOError getLatencies(long *inputLatency, long *outputLatency) = 0;
|
|
||||||
virtual ASIOError getBufferSize(long *minSize, long *maxSize,
|
|
||||||
long *preferredSize, long *granularity) = 0;
|
|
||||||
virtual ASIOError canSampleRate(ASIOSampleRate sampleRate) = 0;
|
|
||||||
virtual ASIOError getSampleRate(ASIOSampleRate *sampleRate) = 0;
|
|
||||||
virtual ASIOError setSampleRate(ASIOSampleRate sampleRate) = 0;
|
|
||||||
virtual ASIOError getClockSources(ASIOClockSource *clocks, long *numSources) = 0;
|
|
||||||
virtual ASIOError setClockSource(long reference) = 0;
|
|
||||||
virtual ASIOError getSamplePosition(ASIOSamples *sPos, ASIOTimeStamp *tStamp) = 0;
|
|
||||||
virtual ASIOError getChannelInfo(ASIOChannelInfo *info) = 0;
|
|
||||||
virtual ASIOError createBuffers(ASIOBufferInfo *bufferInfos, long numChannels,
|
|
||||||
long bufferSize, ASIOCallbacks *callbacks) = 0;
|
|
||||||
virtual ASIOError disposeBuffers() = 0;
|
|
||||||
virtual ASIOError controlPanel() = 0;
|
|
||||||
virtual ASIOError future(long selector,void *opt) = 0;
|
|
||||||
virtual ASIOError outputReady() = 0;
|
|
||||||
};
|
|
||||||
|
|
@ -1,332 +0,0 @@
|
||||||
#include <windows.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
typedef struct keylist
|
|
||||||
{
|
|
||||||
HKEY mainKey;
|
|
||||||
HKEY subKey;
|
|
||||||
char *keyname;
|
|
||||||
struct keylist *next;
|
|
||||||
} KEYLIST, *LPKEYLIST;
|
|
||||||
|
|
||||||
#define CLSID_STRING_LEN 100
|
|
||||||
#define MAX_PATH_LEN 360
|
|
||||||
|
|
||||||
#define DEV_ERR_SELFREG -100
|
|
||||||
#define ERRSREG_MODULE_NOT_FOUND DEV_ERR_SELFREG-1
|
|
||||||
#define ERRSREG_MODPATH_NOT_FOUND DEV_ERR_SELFREG-2
|
|
||||||
#define ERRSREG_STRING_FROM_CLSID DEV_ERR_SELFREG-3
|
|
||||||
#define ERRSREG_CHAR_TO_MULTIBYTE DEV_ERR_SELFREG-4
|
|
||||||
|
|
||||||
#define SZREGSTR_DESCRIPTION "Description"
|
|
||||||
#define SZREGSTR_CLSID "CLSID"
|
|
||||||
#define SZREGSTR_INPROCSERVER32 "InprocServer32"
|
|
||||||
#define SZREGSTR_THREADINGMODEL "ThreadingModel"
|
|
||||||
#define SZREGSTR_SOFTWARE "SOFTWARE"
|
|
||||||
#define SZREGSTR_ASIO "ASIO"
|
|
||||||
|
|
||||||
LONG RegisterAsioDriver (CLSID,char *,char *,char *,char *);
|
|
||||||
LONG UnregisterAsioDriver (CLSID,char *,char *);
|
|
||||||
|
|
||||||
static LONG findRegPath (HKEY,char *);
|
|
||||||
static LONG createRegPath (HKEY,char *,char *);
|
|
||||||
static LONG createRegStringValue (HKEY,char *,char *,char *);
|
|
||||||
static LONG getRegString (HKEY,char *,char *,LPVOID,DWORD);
|
|
||||||
static LPKEYLIST findAllSubKeys (HKEY,HKEY,DWORD,char *,LPKEYLIST);
|
|
||||||
static LONG deleteRegPath (HKEY,char *,char *);
|
|
||||||
|
|
||||||
static char subkeybuf[MAX_PATH_LEN];
|
|
||||||
|
|
||||||
|
|
||||||
// ------------------------------------------
|
|
||||||
// Global Functions
|
|
||||||
// ------------------------------------------
|
|
||||||
LONG RegisterAsioDriver (CLSID clsid,char *szdllname,char *szregname,char *szasiodesc,char *szthreadmodel)
|
|
||||||
{
|
|
||||||
HMODULE hMod;
|
|
||||||
char szDLLPath[MAX_PATH_LEN];
|
|
||||||
char szModuleName[MAX_PATH_LEN];
|
|
||||||
char szregpath[MAX_PATH_LEN];
|
|
||||||
char szclsid[CLSID_STRING_LEN];
|
|
||||||
LPOLESTR wszCLSID = NULL;
|
|
||||||
BOOL newregentry = FALSE;
|
|
||||||
LONG rc;
|
|
||||||
|
|
||||||
hMod = GetModuleHandle(szdllname);
|
|
||||||
if (!hMod) return ERRSREG_MODULE_NOT_FOUND;
|
|
||||||
szModuleName[0] = 0;
|
|
||||||
GetModuleFileName(hMod,szModuleName,MAX_PATH_LEN);
|
|
||||||
if (!szModuleName[0]) return ERRSREG_MODPATH_NOT_FOUND;
|
|
||||||
CharLower((LPTSTR)szModuleName);
|
|
||||||
|
|
||||||
rc = (LONG)StringFromCLSID(clsid,&wszCLSID);
|
|
||||||
if (rc != S_OK) return ERRSREG_STRING_FROM_CLSID;
|
|
||||||
rc = (LONG)WideCharToMultiByte(CP_ACP,0,(LPWSTR)wszCLSID,-1,szclsid,CLSID_STRING_LEN,0,0);
|
|
||||||
if (!rc) return ERRSREG_CHAR_TO_MULTIBYTE;
|
|
||||||
|
|
||||||
sprintf(szregpath,"%s\\%s",SZREGSTR_CLSID,szclsid);
|
|
||||||
rc = findRegPath(HKEY_CLASSES_ROOT,szregpath);
|
|
||||||
if (rc) {
|
|
||||||
sprintf(szregpath,"%s\\%s\\%s",SZREGSTR_CLSID,szclsid,SZREGSTR_INPROCSERVER32);
|
|
||||||
getRegString (HKEY_CLASSES_ROOT,szregpath,0,(LPVOID)szDLLPath,MAX_PATH_LEN);
|
|
||||||
CharLower((LPTSTR)szDLLPath);
|
|
||||||
rc = (LONG)strcmp(szDLLPath,szModuleName);
|
|
||||||
if (rc) {
|
|
||||||
// delete old regentry
|
|
||||||
sprintf(szregpath,"%s",SZREGSTR_CLSID);
|
|
||||||
deleteRegPath(HKEY_CLASSES_ROOT,szregpath,szclsid);
|
|
||||||
newregentry = TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else newregentry = TRUE;
|
|
||||||
|
|
||||||
if (newregentry) {
|
|
||||||
// HKEY_CLASSES_ROOT\CLSID\{...}
|
|
||||||
sprintf(szregpath,"%s",SZREGSTR_CLSID);
|
|
||||||
createRegPath (HKEY_CLASSES_ROOT,szregpath,szclsid);
|
|
||||||
// HKEY_CLASSES_ROOT\CLSID\{...} -> Description
|
|
||||||
sprintf(szregpath,"%s\\%s",SZREGSTR_CLSID,szclsid);
|
|
||||||
createRegStringValue(HKEY_CLASSES_ROOT,szregpath,0,szasiodesc);
|
|
||||||
// HKEY_CLASSES_ROOT\CLSID\InProcServer32
|
|
||||||
sprintf(szregpath,"%s\\%s",SZREGSTR_CLSID,szclsid);
|
|
||||||
createRegPath (HKEY_CLASSES_ROOT,szregpath,SZREGSTR_INPROCSERVER32);
|
|
||||||
// HKEY_CLASSES_ROOT\CLSID\InProcServer32 -> DLL path
|
|
||||||
sprintf(szregpath,"%s\\%s\\%s",SZREGSTR_CLSID,szclsid,SZREGSTR_INPROCSERVER32);
|
|
||||||
createRegStringValue(HKEY_CLASSES_ROOT,szregpath,0,szModuleName);
|
|
||||||
// HKEY_CLASSES_ROOT\CLSID\InProcServer32 -> ThreadingModel
|
|
||||||
createRegStringValue(HKEY_CLASSES_ROOT,szregpath,SZREGSTR_THREADINGMODEL,szthreadmodel);
|
|
||||||
}
|
|
||||||
|
|
||||||
// HKEY_LOCAL_MACHINE\SOFTWARE\ASIO
|
|
||||||
sprintf(szregpath,"%s\\%s",SZREGSTR_SOFTWARE,SZREGSTR_ASIO);
|
|
||||||
rc = findRegPath(HKEY_LOCAL_MACHINE,szregpath);
|
|
||||||
if (rc) {
|
|
||||||
sprintf(szregpath,"%s\\%s\\%s",SZREGSTR_SOFTWARE,SZREGSTR_ASIO,szregname);
|
|
||||||
rc = findRegPath(HKEY_LOCAL_MACHINE,szregpath);
|
|
||||||
if (rc) {
|
|
||||||
sprintf(szregpath,"%s\\%s",SZREGSTR_SOFTWARE,SZREGSTR_ASIO);
|
|
||||||
deleteRegPath(HKEY_LOCAL_MACHINE,szregpath,szregname);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// HKEY_LOCAL_MACHINE\SOFTWARE\ASIO
|
|
||||||
sprintf(szregpath,"%s",SZREGSTR_SOFTWARE);
|
|
||||||
createRegPath (HKEY_LOCAL_MACHINE,szregpath,SZREGSTR_ASIO);
|
|
||||||
}
|
|
||||||
|
|
||||||
// HKEY_LOCAL_MACHINE\SOFTWARE\ASIO\<szregname>
|
|
||||||
sprintf(szregpath,"%s\\%s",SZREGSTR_SOFTWARE,SZREGSTR_ASIO);
|
|
||||||
createRegPath (HKEY_LOCAL_MACHINE,szregpath,szregname);
|
|
||||||
|
|
||||||
// HKEY_LOCAL_MACHINE\SOFTWARE\ASIO\<szregname> -> CLSID
|
|
||||||
// HKEY_LOCAL_MACHINE\SOFTWARE\ASIO\<szregname> -> Description
|
|
||||||
sprintf(szregpath,"%s\\%s\\%s",SZREGSTR_SOFTWARE,SZREGSTR_ASIO,szregname);
|
|
||||||
createRegStringValue(HKEY_LOCAL_MACHINE,szregpath,SZREGSTR_CLSID,szclsid);
|
|
||||||
createRegStringValue(HKEY_LOCAL_MACHINE,szregpath,SZREGSTR_DESCRIPTION,szasiodesc);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
LONG UnregisterAsioDriver (CLSID clsid,char *szdllname,char *szregname)
|
|
||||||
{
|
|
||||||
LONG rc;
|
|
||||||
HMODULE hMod;
|
|
||||||
char szregpath[MAX_PATH_LEN];
|
|
||||||
char szModuleName[MAX_PATH_LEN];
|
|
||||||
char szclsid[CLSID_STRING_LEN];
|
|
||||||
LPOLESTR wszCLSID = NULL;
|
|
||||||
|
|
||||||
|
|
||||||
hMod = GetModuleHandle(szdllname);
|
|
||||||
if (!hMod) return ERRSREG_MODULE_NOT_FOUND;
|
|
||||||
szModuleName[0] = 0;
|
|
||||||
GetModuleFileName(hMod,szModuleName,MAX_PATH_LEN);
|
|
||||||
if (!szModuleName[0]) return ERRSREG_MODPATH_NOT_FOUND;
|
|
||||||
CharLower((LPTSTR)szModuleName);
|
|
||||||
|
|
||||||
rc = (LONG)StringFromCLSID(clsid,&wszCLSID) ;
|
|
||||||
if (rc != S_OK) return ERRSREG_STRING_FROM_CLSID;
|
|
||||||
rc = (LONG)WideCharToMultiByte(CP_ACP,0,(LPWSTR)wszCLSID,-1,szclsid,CLSID_STRING_LEN,0,0);
|
|
||||||
if (!rc) return ERRSREG_CHAR_TO_MULTIBYTE;
|
|
||||||
|
|
||||||
|
|
||||||
sprintf(szregpath,"%s\\%s",SZREGSTR_CLSID,szclsid);
|
|
||||||
rc = findRegPath(HKEY_CLASSES_ROOT,szregpath);
|
|
||||||
if (rc) {
|
|
||||||
// delete old regentry
|
|
||||||
sprintf(szregpath,"%s",SZREGSTR_CLSID);
|
|
||||||
deleteRegPath(HKEY_CLASSES_ROOT,szregpath,szclsid);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// HKEY_LOCAL_MACHINE\SOFTWARE\ASIO
|
|
||||||
sprintf(szregpath,"%s\\%s",SZREGSTR_SOFTWARE,SZREGSTR_ASIO);
|
|
||||||
rc = findRegPath(HKEY_LOCAL_MACHINE,szregpath);
|
|
||||||
if (rc) {
|
|
||||||
sprintf(szregpath,"%s\\%s\\%s",SZREGSTR_SOFTWARE,SZREGSTR_ASIO,szregname);
|
|
||||||
rc = findRegPath(HKEY_LOCAL_MACHINE,szregpath);
|
|
||||||
if (rc) {
|
|
||||||
sprintf(szregpath,"%s\\%s",SZREGSTR_SOFTWARE,SZREGSTR_ASIO);
|
|
||||||
deleteRegPath(HKEY_LOCAL_MACHINE,szregpath,szregname);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ------------------------------------------
|
|
||||||
// Local Functions
|
|
||||||
// ------------------------------------------
|
|
||||||
static LONG findRegPath (HKEY mainkey,char *szregpath)
|
|
||||||
{
|
|
||||||
HKEY hkey;
|
|
||||||
LONG cr,rc = -1;
|
|
||||||
|
|
||||||
if (szregpath) {
|
|
||||||
if ((cr = RegOpenKey(mainkey,szregpath,&hkey)) == ERROR_SUCCESS) {
|
|
||||||
RegCloseKey(hkey);
|
|
||||||
rc = 1;
|
|
||||||
}
|
|
||||||
else rc = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
static LONG createRegPath (HKEY mainkey,char *szregpath,char *sznewpath)
|
|
||||||
{
|
|
||||||
HKEY hkey,hksub;
|
|
||||||
LONG cr,rc = -1;
|
|
||||||
char newregpath[MAX_PATH_LEN];
|
|
||||||
|
|
||||||
sprintf(newregpath,"%s\\%s",szregpath,sznewpath);
|
|
||||||
if (!(cr = findRegPath(mainkey,newregpath))) {
|
|
||||||
if ((cr = RegOpenKey(mainkey,szregpath,&hkey)) == ERROR_SUCCESS) {
|
|
||||||
if ((cr = RegCreateKey(hkey,sznewpath,&hksub)) == ERROR_SUCCESS) {
|
|
||||||
RegCloseKey(hksub);
|
|
||||||
rc = 0;
|
|
||||||
}
|
|
||||||
RegCloseKey(hkey);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (cr > 0) rc = 0;
|
|
||||||
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
static LONG createRegStringValue (HKEY mainkey,char *szregpath,char *valname,char *szvalstr)
|
|
||||||
{
|
|
||||||
LONG cr,rc = -1;
|
|
||||||
HKEY hkey;
|
|
||||||
|
|
||||||
if (szregpath) {
|
|
||||||
if ((cr = RegOpenKey(mainkey,szregpath,&hkey)) == ERROR_SUCCESS) {
|
|
||||||
cr = RegSetValueEx(hkey,(LPCTSTR)valname,0,REG_SZ,(const BYTE *)szvalstr,(DWORD)strlen(szvalstr));
|
|
||||||
RegCloseKey(hkey);
|
|
||||||
if (cr == ERROR_SUCCESS) rc = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static LONG getRegString (HKEY mainkey,char *szregpath,char *valname,LPVOID pval,DWORD vsize)
|
|
||||||
{
|
|
||||||
HKEY hkey;
|
|
||||||
LONG cr,rc = -1;
|
|
||||||
DWORD hsize,htype;
|
|
||||||
|
|
||||||
if (szregpath) {
|
|
||||||
if ((cr = RegOpenKey(mainkey,szregpath,&hkey)) == ERROR_SUCCESS) {
|
|
||||||
cr = RegQueryValueEx(hkey,valname,0,&htype,0,&hsize);
|
|
||||||
if (cr == ERROR_SUCCESS) {
|
|
||||||
if (hsize <= vsize) {
|
|
||||||
cr = RegQueryValueEx(hkey,valname,0,&htype,(LPBYTE)pval,&hsize);
|
|
||||||
rc = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
RegCloseKey(hkey);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
static LPKEYLIST findAllSubKeys (HKEY hkey,HKEY hksub,DWORD index,char *keyname,LPKEYLIST kl)
|
|
||||||
{
|
|
||||||
HKEY hknew = 0;
|
|
||||||
char *newkey;
|
|
||||||
LONG cr;
|
|
||||||
|
|
||||||
if (!hksub) {
|
|
||||||
cr = RegOpenKeyEx(hkey,(LPCTSTR)keyname,0,KEY_ALL_ACCESS,&hknew);
|
|
||||||
if (cr != ERROR_SUCCESS) return kl;
|
|
||||||
}
|
|
||||||
else hknew = hksub;
|
|
||||||
|
|
||||||
cr = RegEnumKey(hknew,index,(LPTSTR)subkeybuf,MAX_PATH_LEN);
|
|
||||||
if (cr == ERROR_SUCCESS) {
|
|
||||||
newkey = new char[strlen(subkeybuf)+1];
|
|
||||||
strcpy(newkey,subkeybuf);
|
|
||||||
|
|
||||||
kl = findAllSubKeys(hknew,0,0,newkey,kl);
|
|
||||||
kl = findAllSubKeys(hkey,hknew,index+1,keyname,kl);
|
|
||||||
|
|
||||||
return kl;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!kl->next) {
|
|
||||||
kl->next = new KEYLIST[1];
|
|
||||||
kl = kl->next;
|
|
||||||
kl->mainKey = hkey;
|
|
||||||
kl->subKey = hknew;
|
|
||||||
kl->keyname = keyname;
|
|
||||||
kl->next = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return kl;
|
|
||||||
}
|
|
||||||
|
|
||||||
static LONG deleteRegPath (HKEY mainkey,char *szregpath,char *szdelpath)
|
|
||||||
{
|
|
||||||
HKEY hkey;
|
|
||||||
LONG cr,rc = -1;
|
|
||||||
KEYLIST klist;
|
|
||||||
LPKEYLIST pkl,k;
|
|
||||||
char *keyname = 0;
|
|
||||||
|
|
||||||
if ((cr = RegOpenKey(mainkey,szregpath,&hkey)) == ERROR_SUCCESS) {
|
|
||||||
|
|
||||||
keyname = new char[strlen(szdelpath)+1];
|
|
||||||
if (!keyname) {
|
|
||||||
RegCloseKey(hkey);
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
strcpy(keyname,szdelpath);
|
|
||||||
klist.next = 0;
|
|
||||||
|
|
||||||
findAllSubKeys(hkey,0,0,keyname,&klist);
|
|
||||||
|
|
||||||
if (klist.next) {
|
|
||||||
pkl = klist.next;
|
|
||||||
|
|
||||||
while (pkl) {
|
|
||||||
RegCloseKey(pkl->subKey);
|
|
||||||
cr = RegDeleteKey(pkl->mainKey,pkl->keyname);
|
|
||||||
delete pkl->keyname;
|
|
||||||
k = pkl;
|
|
||||||
pkl = pkl->next;
|
|
||||||
delete k;
|
|
||||||
}
|
|
||||||
rc = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
RegCloseKey(hkey);
|
|
||||||
}
|
|
||||||
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,326 +0,0 @@
|
||||||
//==========================================================================;
|
|
||||||
//
|
|
||||||
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
|
|
||||||
// KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
|
||||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
|
|
||||||
// PURPOSE.
|
|
||||||
//
|
|
||||||
// Copyright (c) 1992 - 1996 Microsoft Corporation. All Rights Reserved.
|
|
||||||
//
|
|
||||||
//--------------------------------------------------------------------------;
|
|
||||||
|
|
||||||
// Debugging facilities, January 1995
|
|
||||||
|
|
||||||
#ifndef __WXDEBUG__
|
|
||||||
#define __WXDEBUG__
|
|
||||||
|
|
||||||
// Avoid conflict with MFC
|
|
||||||
#undef ASSERT
|
|
||||||
|
|
||||||
// This library provides fairly straight forward debugging functionality, this
|
|
||||||
// is split into two main sections. The first is assertion handling, there are
|
|
||||||
// three types of assertions provided here. The most commonly used one is the
|
|
||||||
// ASSERT(condition) macro which will pop up a message box including the file
|
|
||||||
// and line number if the condition evaluates to FALSE. Then there is the
|
|
||||||
// EXECUTE_ASSERT macro which is the same as ASSERT except the condition will
|
|
||||||
// still be executed in NON debug builds. The final type of assertion is the
|
|
||||||
// KASSERT macro which is more suitable for pure (perhaps kernel) filters as
|
|
||||||
// the condition is printed onto the debugger rather than in a message box.
|
|
||||||
//
|
|
||||||
// The other part of the debug module facilties is general purpose logging.
|
|
||||||
// This is accessed by calling DbgLog(). The function takes a type and level
|
|
||||||
// field which define the type of informational string you are presenting and
|
|
||||||
// it's relative importance. The type field can be a combination (one or more)
|
|
||||||
// of LOG_TIMING, LOG_TRACE, LOG_MEMORY, LOG_LOCKING and LOG_ERROR. The level
|
|
||||||
// is a DWORD value where zero defines highest important. Use of zero as the
|
|
||||||
// debug logging level is to be encouraged ONLY for major errors or events as
|
|
||||||
// they will ALWAYS be displayed on the debugger. Other debug output has it's
|
|
||||||
// level matched against the current debug output level stored in the registry
|
|
||||||
// for this module and if less than the current setting it will be displayed.
|
|
||||||
//
|
|
||||||
// Each module or executable has it's own debug output level for each of the
|
|
||||||
// five types. These are read in when the DbgInitialise function is called
|
|
||||||
// for DLLs linking to STRMBASE.LIB this is done automatically when the DLL
|
|
||||||
// is loaded, executables must call it explicitely with the module instance
|
|
||||||
// handle given to them through the WINMAIN entry point. An executable must
|
|
||||||
// also call DbgTerminate when they have finished to clean up the resources
|
|
||||||
// the debug library uses, once again this is done automatically for DLLs
|
|
||||||
|
|
||||||
// These are the five different categories of logging information
|
|
||||||
|
|
||||||
enum { LOG_TIMING = 0x01, // Timing and performance measurements
|
|
||||||
LOG_TRACE = 0x02, // General step point call tracing
|
|
||||||
LOG_MEMORY = 0x04, // Memory and object allocation/destruction
|
|
||||||
LOG_LOCKING = 0x08, // Locking/unlocking of critical sections
|
|
||||||
LOG_ERROR = 0x10 }; // Debug error notification
|
|
||||||
|
|
||||||
enum { CDISP_HEX = 0x01,
|
|
||||||
CDISP_DEC = 0x02};
|
|
||||||
|
|
||||||
// For each object created derived from CBaseObject (in debug builds) we
|
|
||||||
// create a descriptor that holds it's name (statically allocated memory)
|
|
||||||
// and a cookie we assign it. We keep a list of all the active objects
|
|
||||||
// we have registered so that we can dump a list of remaining objects
|
|
||||||
|
|
||||||
typedef struct tag_ObjectDesc {
|
|
||||||
TCHAR *m_pName;
|
|
||||||
DWORD m_dwCookie;
|
|
||||||
tag_ObjectDesc *m_pNext;
|
|
||||||
} ObjectDesc;
|
|
||||||
|
|
||||||
#define DLLIMPORT __declspec(dllimport)
|
|
||||||
#define DLLEXPORT __declspec(dllexport)
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
|
|
||||||
#define NAME(x) TEXT(x)
|
|
||||||
|
|
||||||
// These are used internally by the debug library (PRIVATE)
|
|
||||||
|
|
||||||
void DbgInitKeyLevels(HKEY hKey);
|
|
||||||
void DbgInitGlobalSettings();
|
|
||||||
void DbgInitModuleSettings();
|
|
||||||
void DbgInitModuleName();
|
|
||||||
DWORD DbgRegisterObjectCreation(TCHAR *pObjectName);
|
|
||||||
BOOL DbgRegisterObjectDestruction(DWORD dwCookie);
|
|
||||||
|
|
||||||
// These are the PUBLIC entry points
|
|
||||||
|
|
||||||
BOOL DbgCheckModuleLevel(DWORD Type,DWORD Level);
|
|
||||||
void DbgSetModuleLevel(DWORD Type,DWORD Level);
|
|
||||||
|
|
||||||
// Initialise the library with the module handle
|
|
||||||
|
|
||||||
void DbgInitialise(HINSTANCE hInst);
|
|
||||||
void DbgTerminate();
|
|
||||||
|
|
||||||
void DbgDumpObjectRegister();
|
|
||||||
|
|
||||||
// Display error and logging to the user
|
|
||||||
|
|
||||||
void DbgAssert(const TCHAR *pCondition,const TCHAR *pFileName,INT iLine);
|
|
||||||
void DbgBreakPoint(const TCHAR *pCondition,const TCHAR *pFileName,INT iLine);
|
|
||||||
void DbgKernelAssert(const TCHAR *pCondition,const TCHAR *pFileName,INT iLine);
|
|
||||||
void DbgLogInfo(DWORD Type,DWORD Level,const TCHAR *pFormat,...);
|
|
||||||
void DbgOutString(LPCTSTR psz);
|
|
||||||
|
|
||||||
// Debug infinite wait stuff
|
|
||||||
DWORD DbgWaitForSingleObject(HANDLE h);
|
|
||||||
DWORD DbgWaitForMultipleObjects(DWORD nCount,
|
|
||||||
CONST HANDLE *lpHandles,
|
|
||||||
BOOL bWaitAll);
|
|
||||||
void DbgSetWaitTimeout(DWORD dwTimeout);
|
|
||||||
|
|
||||||
#ifdef __strmif_h__
|
|
||||||
void DisplayType(LPSTR label, const AM_MEDIA_TYPE *pmtIn);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define KASSERT(_x_) if (!(_x_)) \
|
|
||||||
DbgKernelAssert(TEXT(#_x_),TEXT(__FILE__),__LINE__)
|
|
||||||
|
|
||||||
// Break on the debugger without putting up a message box
|
|
||||||
// message goes to debugger instead
|
|
||||||
|
|
||||||
#define KDbgBreak(_x_) \
|
|
||||||
DbgKernelAssert(TEXT(#_x_),TEXT(__FILE__),__LINE__)
|
|
||||||
|
|
||||||
#define ASSERT(_x_) if (!(_x_)) \
|
|
||||||
DbgAssert(TEXT(#_x_),TEXT(__FILE__),__LINE__)
|
|
||||||
|
|
||||||
// Put up a message box informing the user of a halt
|
|
||||||
// condition in the program
|
|
||||||
|
|
||||||
#define DbgBreak(_x_) \
|
|
||||||
DbgBreakPoint(TEXT(#_x_),TEXT(__FILE__),__LINE__)
|
|
||||||
|
|
||||||
#define EXECUTE_ASSERT(_x_) ASSERT(_x_)
|
|
||||||
#define DbgLog(_x_) DbgLogInfo _x_
|
|
||||||
|
|
||||||
// MFC style trace macros
|
|
||||||
|
|
||||||
#define NOTE(_x_) DbgLog((LOG_TRACE,5,TEXT(_x_)));
|
|
||||||
#define NOTE1(_x_,a) DbgLog((LOG_TRACE,5,TEXT(_x_),a));
|
|
||||||
#define NOTE2(_x_,a,b) DbgLog((LOG_TRACE,5,TEXT(_x_),a,b));
|
|
||||||
#define NOTE3(_x_,a,b,c) DbgLog((LOG_TRACE,5,TEXT(_x_),a,b,c));
|
|
||||||
#define NOTE4(_x_,a,b,c,d) DbgLog((LOG_TRACE,5,TEXT(_x_),a,b,c,d));
|
|
||||||
#define NOTE5(_x_,a,b,c,d,e) DbgLog((LOG_TRACE,5,TEXT(_x_),a,b,c,d,e));
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
// Retail builds make public debug functions inert - WARNING the source
|
|
||||||
// files do not define or build any of the entry points in debug builds
|
|
||||||
// (public entry points compile to nothing) so if you go trying to call
|
|
||||||
// any of the private entry points in your source they won't compile
|
|
||||||
|
|
||||||
#define NAME(_x_) NULL
|
|
||||||
|
|
||||||
#define DbgInitialise(hInst)
|
|
||||||
#define DbgTerminate()
|
|
||||||
#define DbgLog(_x_)
|
|
||||||
#define DbgOutString(psz)
|
|
||||||
|
|
||||||
#define DbgRegisterObjectCreation(pObjectName)
|
|
||||||
#define DbgRegisterObjectDestruction(dwCookie)
|
|
||||||
#define DbgDumpObjectRegister()
|
|
||||||
|
|
||||||
#define DbgCheckModuleLevel(Type,Level)
|
|
||||||
#define DbgSetModuleLevel(Type,Level)
|
|
||||||
|
|
||||||
#define DbgWaitForSingleObject(h) WaitForSingleObject(h, INFINITE)
|
|
||||||
#define DbgWaitForMultipleObjects(nCount, lpHandles, bWaitAll) \
|
|
||||||
WaitForMultipleObjects(nCount, lpHandles, bWaitAll, INFINITE)
|
|
||||||
#define DbgSetWaitTimeout(dwTimeout)
|
|
||||||
|
|
||||||
#define KDbgBreak(_x_)
|
|
||||||
#define DbgBreak(_x_)
|
|
||||||
|
|
||||||
#define KASSERT(_x_)
|
|
||||||
#define ASSERT(_x_)
|
|
||||||
#define EXECUTE_ASSERT(_x_) _x_
|
|
||||||
|
|
||||||
// MFC style trace macros
|
|
||||||
|
|
||||||
#define NOTE(_x_)
|
|
||||||
#define NOTE1(_x_,a)
|
|
||||||
#define NOTE2(_x_,a,b)
|
|
||||||
#define NOTE3(_x_,a,b,c)
|
|
||||||
#define NOTE4(_x_,a,b,c,d)
|
|
||||||
#define NOTE5(_x_,a,b,c,d,e)
|
|
||||||
|
|
||||||
#define DisplayType(label, pmtIn)
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
// Checks a pointer which should be non NULL - can be used as follows.
|
|
||||||
|
|
||||||
#define CheckPointer(p,ret) {if((p)==NULL) return (ret);}
|
|
||||||
|
|
||||||
// HRESULT Foo(VOID *pBar)
|
|
||||||
// {
|
|
||||||
// CheckPointer(pBar,E_INVALIDARG)
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// Or if the function returns a boolean
|
|
||||||
//
|
|
||||||
// BOOL Foo(VOID *pBar)
|
|
||||||
// {
|
|
||||||
// CheckPointer(pBar,FALSE)
|
|
||||||
// }
|
|
||||||
|
|
||||||
// These validate pointers when symbol VFWROBUST is defined
|
|
||||||
// This will normally be defined in debug not retail builds
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
#define VFWROBUST
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef VFWROBUST
|
|
||||||
|
|
||||||
#define ValidateReadPtr(p,cb) \
|
|
||||||
{if(IsBadReadPtr((PVOID)p,cb) == TRUE) \
|
|
||||||
DbgBreak("Invalid read pointer");}
|
|
||||||
|
|
||||||
#define ValidateWritePtr(p,cb) \
|
|
||||||
{if(IsBadWritePtr((PVOID)p,cb) == TRUE) \
|
|
||||||
DbgBreak("Invalid write pointer");}
|
|
||||||
|
|
||||||
#define ValidateReadWritePtr(p,cb) \
|
|
||||||
{ValidateReadPtr(p,cb) ValidateWritePtr(p,cb)}
|
|
||||||
|
|
||||||
#define ValidateStringPtr(p) \
|
|
||||||
{if(IsBadStringPtr((LPCTSTR)p,INFINITE) == TRUE) \
|
|
||||||
DbgBreak("Invalid string pointer");}
|
|
||||||
|
|
||||||
#define ValidateStringPtrA(p) \
|
|
||||||
{if(IsBadStringPtrA((LPCSTR)p,INFINITE) == TRUE) \
|
|
||||||
DbgBreak("Invalid ANSII string pointer");}
|
|
||||||
|
|
||||||
#define ValidateStringPtrW(p) \
|
|
||||||
{if(IsBadStringPtrW((LPCWSTR)p,INFINITE) == TRUE) \
|
|
||||||
DbgBreak("Invalid UNICODE string pointer");}
|
|
||||||
|
|
||||||
#else
|
|
||||||
#define ValidateReadPtr(p,cb)
|
|
||||||
#define ValidateWritePtr(p,cb)
|
|
||||||
#define ValidateReadWritePtr(p,cb)
|
|
||||||
#define ValidateStringPtr(p)
|
|
||||||
#define ValidateStringPtrA(p)
|
|
||||||
#define ValidateStringPtrW(p)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef _OBJBASE_H_
|
|
||||||
|
|
||||||
// Outputting GUID names. If you want to include the name
|
|
||||||
// associated with a GUID (eg CLSID_...) then
|
|
||||||
//
|
|
||||||
// GuidNames[yourGUID]
|
|
||||||
//
|
|
||||||
// Returns the name defined in uuids.h as a string
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
TCHAR *szName;
|
|
||||||
GUID guid;
|
|
||||||
} GUID_STRING_ENTRY;
|
|
||||||
|
|
||||||
class CGuidNameList {
|
|
||||||
public:
|
|
||||||
TCHAR *operator [] (const GUID& guid);
|
|
||||||
};
|
|
||||||
|
|
||||||
extern CGuidNameList GuidNames;
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
// REMIND macro - generates warning as reminder to complete coding
|
|
||||||
// (eg) usage:
|
|
||||||
//
|
|
||||||
// #pragma message (REMIND("Add automation support"))
|
|
||||||
|
|
||||||
|
|
||||||
#define QUOTE(x) #x
|
|
||||||
#define QQUOTE(y) QUOTE(y)
|
|
||||||
#define REMIND(str) __FILE__ "(" QQUOTE(__LINE__) ") : " str
|
|
||||||
|
|
||||||
|
|
||||||
// Hack to display objects in a useful format
|
|
||||||
//
|
|
||||||
// eg If you want to display a LONGLONG ll in a debug string do (eg)
|
|
||||||
//
|
|
||||||
// DbgLog((LOG_TRACE, n, TEXT("Value is %s"), (LPCTSTR)CDisp(ll, CDISP_HEX)));
|
|
||||||
|
|
||||||
|
|
||||||
class CDispBasic
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
CDispBasic() { m_pString = m_String; };
|
|
||||||
~CDispBasic();
|
|
||||||
protected:
|
|
||||||
PTCHAR m_pString; // normally points to m_String... unless too much data
|
|
||||||
TCHAR m_String[50];
|
|
||||||
};
|
|
||||||
class CDisp : public CDispBasic
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
CDisp(LONGLONG ll, int Format = CDISP_HEX); // Display a LONGLONG in CDISP_HEX or CDISP_DEC form
|
|
||||||
CDisp(REFCLSID clsid); // Display a GUID
|
|
||||||
CDisp(double d); // Display a floating point number
|
|
||||||
#ifdef __strmif_h__
|
|
||||||
#ifdef __STREAMS__
|
|
||||||
CDisp(CRefTime t); // Display a Reference Time
|
|
||||||
#endif
|
|
||||||
CDisp(IPin *pPin); // Display a pin as {filter clsid}(pin name)
|
|
||||||
#endif // __strmif_h__
|
|
||||||
~CDisp();
|
|
||||||
|
|
||||||
// Implement cast to (LPCTSTR) as parameter to logger
|
|
||||||
operator LPCTSTR()
|
|
||||||
{
|
|
||||||
return (LPCTSTR)m_pString;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // __WXDEBUG__
|
|
||||||
|
|
||||||
|
|
@ -1,9 +0,0 @@
|
||||||
LIBRARY ASIOSample
|
|
||||||
DESCRIPTION 'ASIO Sample Driver'
|
|
||||||
PROTMODE
|
|
||||||
EXPORTS
|
|
||||||
DllMain
|
|
||||||
DllGetClassObject
|
|
||||||
DllCanUnloadNow
|
|
||||||
DllRegisterServer
|
|
||||||
DllUnregisterServer
|
|
||||||
|
|
@ -1,23 +0,0 @@
|
||||||
Asiosample
|
|
||||||
|
|
||||||
This sample driver illustrates the implementation of an ASIO driver.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Windows notes:
|
|
||||||
|
|
||||||
For Windows a COM implementation is provided. The final driver can be
|
|
||||||
installed in the system by dragging the asiosample.dll onto the
|
|
||||||
regsvr32.exe in the windows\system directory.
|
|
||||||
|
|
||||||
It is normal that the LNK4104 warning is issued for the following 4
|
|
||||||
exported symbols:
|
|
||||||
|
|
||||||
DllGetClassObject
|
|
||||||
DllCanUnloadNow
|
|
||||||
DllRegisterServer
|
|
||||||
DllUnregisterServer
|
|
||||||
|
|
||||||
|
|
||||||
Macintosh notes:
|
|
||||||
The supplied project is created with CodeWarrior Pro 5.
|
|
||||||
|
|
@ -1,151 +0,0 @@
|
||||||
# Microsoft Developer Studio Project File - Name="asiosample" - Package Owner=<4>
|
|
||||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00
|
|
||||||
# ** DO NOT EDIT **
|
|
||||||
|
|
||||||
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
|
|
||||||
|
|
||||||
CFG=asiosample - Win32 Debug
|
|
||||||
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
|
|
||||||
!MESSAGE use the Export Makefile command and run
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE NMAKE /f "asiosample.mak".
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE You can specify a configuration when running NMAKE
|
|
||||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE NMAKE /f "asiosample.mak" CFG="asiosample - Win32 Debug"
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE Possible choices for configuration are:
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE "asiosample - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
|
|
||||||
!MESSAGE "asiosample - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
|
|
||||||
!MESSAGE
|
|
||||||
|
|
||||||
# Begin Project
|
|
||||||
# PROP AllowPerConfigDependencies 0
|
|
||||||
# PROP Scc_ProjName ""
|
|
||||||
# PROP Scc_LocalPath ""
|
|
||||||
CPP=cl.exe
|
|
||||||
MTL=midl.exe
|
|
||||||
RSC=rc.exe
|
|
||||||
|
|
||||||
!IF "$(CFG)" == "asiosample - Win32 Release"
|
|
||||||
|
|
||||||
# PROP BASE Use_MFC 0
|
|
||||||
# PROP BASE Use_Debug_Libraries 0
|
|
||||||
# PROP BASE Output_Dir "Release"
|
|
||||||
# PROP BASE Intermediate_Dir "Release"
|
|
||||||
# PROP BASE Target_Dir ""
|
|
||||||
# PROP Use_MFC 0
|
|
||||||
# PROP Use_Debug_Libraries 0
|
|
||||||
# PROP Output_Dir "Release"
|
|
||||||
# PROP Intermediate_Dir "Release"
|
|
||||||
# PROP Ignore_Export_Lib 0
|
|
||||||
# PROP Target_Dir ""
|
|
||||||
# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
|
|
||||||
# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\..\Common" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
|
|
||||||
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
|
||||||
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
|
||||||
# ADD BASE RSC /l 0x409 /d "NDEBUG"
|
|
||||||
# ADD RSC /l 0x409 /d "NDEBUG"
|
|
||||||
BSC32=bscmake.exe
|
|
||||||
# ADD BASE BSC32 /nologo
|
|
||||||
# ADD BSC32 /nologo
|
|
||||||
LINK32=link.exe
|
|
||||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386
|
|
||||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib winmm.lib /nologo /subsystem:windows /dll /machine:I386
|
|
||||||
|
|
||||||
!ELSEIF "$(CFG)" == "asiosample - Win32 Debug"
|
|
||||||
|
|
||||||
# PROP BASE Use_MFC 0
|
|
||||||
# PROP BASE Use_Debug_Libraries 1
|
|
||||||
# PROP BASE Output_Dir "Debug"
|
|
||||||
# PROP BASE Intermediate_Dir "Debug"
|
|
||||||
# PROP BASE Target_Dir ""
|
|
||||||
# PROP Use_MFC 0
|
|
||||||
# PROP Use_Debug_Libraries 1
|
|
||||||
# PROP Output_Dir "Debug"
|
|
||||||
# PROP Intermediate_Dir "Debug"
|
|
||||||
# PROP Ignore_Export_Lib 0
|
|
||||||
# PROP Target_Dir ""
|
|
||||||
# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /GZ /c
|
|
||||||
# ADD CPP /nologo /G5 /MTd /W3 /Gm /GX /Zi /Od /I "..\..\..\Common" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /GZ /c
|
|
||||||
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
|
||||||
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
|
||||||
# ADD BASE RSC /l 0x409 /d "_DEBUG"
|
|
||||||
# ADD RSC /l 0x409 /d "_DEBUG"
|
|
||||||
BSC32=bscmake.exe
|
|
||||||
# ADD BASE BSC32 /nologo
|
|
||||||
# ADD BSC32 /nologo
|
|
||||||
LINK32=link.exe
|
|
||||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept
|
|
||||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib winmm.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept
|
|
||||||
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
# Begin Target
|
|
||||||
|
|
||||||
# Name "asiosample - Win32 Release"
|
|
||||||
# Name "asiosample - Win32 Debug"
|
|
||||||
# Begin Group "Source Files"
|
|
||||||
|
|
||||||
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\asiosample.def
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\asiosmpl.cpp
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\common\combase.cpp
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\common\dllentry.cpp
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\common\register.cpp
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\wintimer.cpp
|
|
||||||
# End Source File
|
|
||||||
# End Group
|
|
||||||
# Begin Group "Header Files"
|
|
||||||
|
|
||||||
# PROP Default_Filter "h;hpp;hxx;hm;inl"
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\common\asio.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\Common\Asiodrvr.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\asiosmpl.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\common\asiosys.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\common\combase.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\common\iasiodrv.h
|
|
||||||
# End Source File
|
|
||||||
# End Group
|
|
||||||
# Begin Group "Resource Files"
|
|
||||||
|
|
||||||
# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
|
|
||||||
# End Group
|
|
||||||
# End Target
|
|
||||||
# End Project
|
|
||||||
|
|
@ -1,629 +0,0 @@
|
||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="8.00"
|
|
||||||
Name="asiosample"
|
|
||||||
ProjectGUID="{D514DF49-CE45-4F09-9BAD-8FDA4BEF4DE3}"
|
|
||||||
RootNamespace="asiosample"
|
|
||||||
>
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"
|
|
||||||
/>
|
|
||||||
<Platform
|
|
||||||
Name="x64"
|
|
||||||
/>
|
|
||||||
</Platforms>
|
|
||||||
<ToolFiles>
|
|
||||||
</ToolFiles>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
OutputDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
ConfigurationType="2"
|
|
||||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
|
|
||||||
UseOfMFC="0"
|
|
||||||
ATLMinimizesCRunTimeLibraryUsage="false"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
PreprocessorDefinitions="_DEBUG"
|
|
||||||
MkTypLibCompatible="true"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
TargetEnvironment="1"
|
|
||||||
TypeLibraryName=".\Debug/asiosample.tlb"
|
|
||||||
HeaderFileName=""
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="..\..\..\Common"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_CRT_SECURE_NO_DEPRECATE"
|
|
||||||
MinimalRebuild="true"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="1"
|
|
||||||
WarningLevel="3"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
DebugInformationFormat="3"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
PreprocessorDefinitions="_DEBUG"
|
|
||||||
Culture="1033"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalDependencies="odbc32.lib odbccp32.lib winmm.lib"
|
|
||||||
OutputFile="$(PlatformName)\$(ConfigurationName)\asiosample.dll"
|
|
||||||
LinkIncremental="2"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
ModuleDefinitionFile="..\asiosample.def"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
SubSystem="2"
|
|
||||||
TargetMachine="1"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|x64"
|
|
||||||
OutputDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
ConfigurationType="2"
|
|
||||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
|
|
||||||
UseOfMFC="0"
|
|
||||||
ATLMinimizesCRunTimeLibraryUsage="false"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
PreprocessorDefinitions="_DEBUG"
|
|
||||||
MkTypLibCompatible="true"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
TargetEnvironment="3"
|
|
||||||
TypeLibraryName=".\Debug/asiosample.tlb"
|
|
||||||
HeaderFileName=""
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="..\..\..\Common"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_CRT_SECURE_NO_DEPRECATE"
|
|
||||||
MinimalRebuild="true"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="1"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="3"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
DebugInformationFormat="3"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
PreprocessorDefinitions="_DEBUG"
|
|
||||||
Culture="1033"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalDependencies="odbc32.lib odbccp32.lib winmm.lib"
|
|
||||||
OutputFile="$(PlatformName)\$(ConfigurationName)\asiosample.dll"
|
|
||||||
LinkIncremental="2"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
ModuleDefinitionFile="..\asiosample.def"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
SubSystem="2"
|
|
||||||
TargetMachine="17"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
ConfigurationType="2"
|
|
||||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
|
|
||||||
UseOfMFC="0"
|
|
||||||
ATLMinimizesCRunTimeLibraryUsage="false"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
PreprocessorDefinitions="NDEBUG"
|
|
||||||
MkTypLibCompatible="true"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
TargetEnvironment="1"
|
|
||||||
TypeLibraryName=".\Release/asiosample.tlb"
|
|
||||||
HeaderFileName=""
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="2"
|
|
||||||
InlineFunctionExpansion="1"
|
|
||||||
AdditionalIncludeDirectories="..\..\..\Common"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_CRT_SECURE_NO_DEPRECATE"
|
|
||||||
StringPooling="true"
|
|
||||||
RuntimeLibrary="0"
|
|
||||||
EnableFunctionLevelLinking="true"
|
|
||||||
WarningLevel="3"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
PreprocessorDefinitions="NDEBUG"
|
|
||||||
Culture="1033"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalDependencies="odbc32.lib odbccp32.lib winmm.lib"
|
|
||||||
OutputFile="$(PlatformName)\$(ConfigurationName)\asiosample.dll"
|
|
||||||
LinkIncremental="1"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
ModuleDefinitionFile="..\asiosample.def"
|
|
||||||
SubSystem="2"
|
|
||||||
TargetMachine="1"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|x64"
|
|
||||||
OutputDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
ConfigurationType="2"
|
|
||||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
|
|
||||||
UseOfMFC="0"
|
|
||||||
ATLMinimizesCRunTimeLibraryUsage="false"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
PreprocessorDefinitions="NDEBUG"
|
|
||||||
MkTypLibCompatible="true"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
TargetEnvironment="3"
|
|
||||||
TypeLibraryName=".\Release/asiosample.tlb"
|
|
||||||
HeaderFileName=""
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="2"
|
|
||||||
InlineFunctionExpansion="1"
|
|
||||||
AdditionalIncludeDirectories="..\..\..\Common"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_CRT_SECURE_NO_DEPRECATE"
|
|
||||||
StringPooling="true"
|
|
||||||
RuntimeLibrary="0"
|
|
||||||
EnableFunctionLevelLinking="true"
|
|
||||||
WarningLevel="3"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
PreprocessorDefinitions="NDEBUG"
|
|
||||||
Culture="1033"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalDependencies="odbc32.lib odbccp32.lib winmm.lib"
|
|
||||||
OutputFile="$(PlatformName)\$(ConfigurationName)\asiosample.dll"
|
|
||||||
LinkIncremental="1"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
ModuleDefinitionFile="..\asiosample.def"
|
|
||||||
SubSystem="2"
|
|
||||||
TargetMachine="17"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<References>
|
|
||||||
</References>
|
|
||||||
<Files>
|
|
||||||
<Filter
|
|
||||||
Name="Source Files"
|
|
||||||
Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
|
||||||
>
|
|
||||||
<File
|
|
||||||
RelativePath="..\asiosample.def"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\asiosmpl.cpp"
|
|
||||||
>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Debug|x64"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Release|Win32"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Release|x64"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\..\common\combase.cpp"
|
|
||||||
>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Debug|x64"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Release|Win32"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Release|x64"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\..\common\dllentry.cpp"
|
|
||||||
>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Debug|x64"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Release|Win32"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Release|x64"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\..\common\register.cpp"
|
|
||||||
>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Debug|x64"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Release|Win32"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Release|x64"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\wintimer.cpp"
|
|
||||||
>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Debug|x64"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Release|Win32"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Release|x64"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
<Filter
|
|
||||||
Name="Header Files"
|
|
||||||
Filter="h;hpp;hxx;hm;inl"
|
|
||||||
>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\..\common\asio.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\Common\Asiodrvr.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\asiosmpl.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\..\common\asiosys.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\..\common\combase.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\..\common\iasiodrv.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
<Filter
|
|
||||||
Name="Resource Files"
|
|
||||||
Filter="ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
|
|
||||||
>
|
|
||||||
</Filter>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
||||||
|
|
@ -1,660 +0,0 @@
|
||||||
/*
|
|
||||||
Steinberg Audio Stream I/O API
|
|
||||||
(c) 1996, Steinberg Soft- und Hardware GmbH
|
|
||||||
charlie (May 1996)
|
|
||||||
|
|
||||||
asiosmpl.cpp
|
|
||||||
|
|
||||||
sample implementation of asio. can be set to simulate input with some
|
|
||||||
stupid oscillators.
|
|
||||||
this driver doesn't output sound at all...
|
|
||||||
timing is done via the extended time manager on the mac, and
|
|
||||||
a simple thread on pc.
|
|
||||||
you may test various configurations by changing the kNumInputs/Outputs,
|
|
||||||
and kBlockFrames. note that when using wave generation, as i/o is not optimized
|
|
||||||
at all, it moves quite a bit of memory, too many i/o channels may make it
|
|
||||||
pretty slow.
|
|
||||||
|
|
||||||
if you use this file as a template, make sure to resolve places where the
|
|
||||||
search string !!! can be found...
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include "asiosmpl.h"
|
|
||||||
//#include "virtape.h"
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
// extern
|
|
||||||
void getNanoSeconds(ASIOTimeStamp *time);
|
|
||||||
|
|
||||||
// local
|
|
||||||
|
|
||||||
double AsioSamples2double (ASIOSamples* samples);
|
|
||||||
|
|
||||||
static const double twoRaisedTo32 = 4294967296.;
|
|
||||||
static const double twoRaisedTo32Reciprocal = 1. / twoRaisedTo32;
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------
|
|
||||||
// on windows, we do the COM stuff.
|
|
||||||
|
|
||||||
#if WINDOWS
|
|
||||||
#include "windows.h"
|
|
||||||
#include "mmsystem.h"
|
|
||||||
|
|
||||||
// class id. !!! NOTE: !!! you will obviously have to create your own class id!
|
|
||||||
// {188135E1-D565-11d2-854F-00A0C99F5D19}
|
|
||||||
CLSID IID_ASIO_DRIVER = { 0x188135e1, 0xd565, 0x11d2, { 0x85, 0x4f, 0x0, 0xa0, 0xc9, 0x9f, 0x5d, 0x19 } };
|
|
||||||
|
|
||||||
CFactoryTemplate g_Templates[1] = {
|
|
||||||
{L"ASIOSAMPLE", &IID_ASIO_DRIVER, AsioSample::CreateInstance}
|
|
||||||
};
|
|
||||||
int g_cTemplates = sizeof(g_Templates) / sizeof(g_Templates[0]);
|
|
||||||
|
|
||||||
CUnknown* AsioSample::CreateInstance (LPUNKNOWN pUnk, HRESULT *phr)
|
|
||||||
{
|
|
||||||
return (CUnknown*)new AsioSample (pUnk,phr);
|
|
||||||
};
|
|
||||||
|
|
||||||
STDMETHODIMP AsioSample::NonDelegatingQueryInterface (REFIID riid, void ** ppv)
|
|
||||||
{
|
|
||||||
if (riid == IID_ASIO_DRIVER)
|
|
||||||
{
|
|
||||||
return GetInterface (this, ppv);
|
|
||||||
}
|
|
||||||
return CUnknown::NonDelegatingQueryInterface (riid, ppv);
|
|
||||||
}
|
|
||||||
|
|
||||||
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
||||||
// Register ASIO Driver
|
|
||||||
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
||||||
extern LONG RegisterAsioDriver (CLSID,char *,char *,char *,char *);
|
|
||||||
extern LONG UnregisterAsioDriver (CLSID,char *,char *);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Server registration, called on REGSVR32.EXE "the dllname.dll"
|
|
||||||
//
|
|
||||||
HRESULT _stdcall DllRegisterServer()
|
|
||||||
{
|
|
||||||
LONG rc;
|
|
||||||
char errstr[128];
|
|
||||||
|
|
||||||
rc = RegisterAsioDriver (IID_ASIO_DRIVER,"ASIOSample.dll","ASIO Sample Driver","ASIO Sample","Apartment");
|
|
||||||
|
|
||||||
if (rc) {
|
|
||||||
memset(errstr,0,128);
|
|
||||||
sprintf(errstr,"Register Server failed ! (%d)",rc);
|
|
||||||
MessageBox(0,(LPCTSTR)errstr,(LPCTSTR)"ASIO sample Driver",MB_OK);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return S_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Server unregistration
|
|
||||||
//
|
|
||||||
HRESULT _stdcall DllUnregisterServer()
|
|
||||||
{
|
|
||||||
LONG rc;
|
|
||||||
char errstr[128];
|
|
||||||
|
|
||||||
rc = UnregisterAsioDriver (IID_ASIO_DRIVER,"ASIOSample.dll","ASIO Sample Driver");
|
|
||||||
|
|
||||||
if (rc) {
|
|
||||||
memset(errstr,0,128);
|
|
||||||
sprintf(errstr,"Unregister Server failed ! (%d)",rc);
|
|
||||||
MessageBox(0,(LPCTSTR)errstr,(LPCTSTR)"ASIO Korg1212 I/O Driver",MB_OK);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return S_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------
|
|
||||||
//------------------------------------------------------------------------------------------
|
|
||||||
AsioSample::AsioSample (LPUNKNOWN pUnk, HRESULT *phr)
|
|
||||||
: CUnknown("ASIOSAMPLE", pUnk, phr)
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
// when not on windows, we derive from AsioDriver
|
|
||||||
AsioSample::AsioSample () : AsioDriver ()
|
|
||||||
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
long i;
|
|
||||||
|
|
||||||
blockFrames = kBlockFrames;
|
|
||||||
inputLatency = blockFrames; // typically
|
|
||||||
outputLatency = blockFrames * 2;
|
|
||||||
// typically blockFrames * 2; try to get 1 by offering direct buffer
|
|
||||||
// access, and using asioPostOutput for lower latency
|
|
||||||
samplePosition = 0;
|
|
||||||
sampleRate = 44100.;
|
|
||||||
milliSeconds = (long)((double)(kBlockFrames * 1000) / sampleRate);
|
|
||||||
active = false;
|
|
||||||
started = false;
|
|
||||||
timeInfoMode = false;
|
|
||||||
tcRead = false;
|
|
||||||
for (i = 0; i < kNumInputs; i++)
|
|
||||||
{
|
|
||||||
inputBuffers[i] = 0;
|
|
||||||
inMap[i] = 0;
|
|
||||||
}
|
|
||||||
#if TESTWAVES
|
|
||||||
sawTooth = sineWave = 0;
|
|
||||||
#endif
|
|
||||||
for (i = 0; i < kNumOutputs; i++)
|
|
||||||
{
|
|
||||||
outputBuffers[i] = 0;
|
|
||||||
outMap[i] = 0;
|
|
||||||
}
|
|
||||||
callbacks = 0;
|
|
||||||
activeInputs = activeOutputs = 0;
|
|
||||||
toggle = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------
|
|
||||||
AsioSample::~AsioSample ()
|
|
||||||
{
|
|
||||||
stop ();
|
|
||||||
outputClose ();
|
|
||||||
inputClose ();
|
|
||||||
disposeBuffers ();
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------
|
|
||||||
void AsioSample::getDriverName (char *name)
|
|
||||||
{
|
|
||||||
strcpy (name, "Sample ASIO");
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------
|
|
||||||
long AsioSample::getDriverVersion ()
|
|
||||||
{
|
|
||||||
return 0x00000001L;
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------
|
|
||||||
void AsioSample::getErrorMessage (char *string)
|
|
||||||
{
|
|
||||||
strcpy (string, errorMessage);
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------
|
|
||||||
ASIOBool AsioSample::init (void* sysRef)
|
|
||||||
{
|
|
||||||
sysRef = sysRef;
|
|
||||||
if (active)
|
|
||||||
return true;
|
|
||||||
strcpy (errorMessage, "ASIO Driver open Failure!");
|
|
||||||
if (inputOpen ())
|
|
||||||
{
|
|
||||||
if (outputOpen ())
|
|
||||||
{
|
|
||||||
active = true;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
timerOff (); // de-activate 'hardware'
|
|
||||||
|
|
||||||
outputClose ();
|
|
||||||
inputClose ();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------
|
|
||||||
ASIOError AsioSample::start ()
|
|
||||||
{
|
|
||||||
if (callbacks)
|
|
||||||
{
|
|
||||||
started = false;
|
|
||||||
samplePosition = 0;
|
|
||||||
theSystemTime.lo = theSystemTime.hi = 0;
|
|
||||||
toggle = 0;
|
|
||||||
|
|
||||||
timerOn (); // activate 'hardware'
|
|
||||||
started = true;
|
|
||||||
|
|
||||||
return ASE_OK;
|
|
||||||
}
|
|
||||||
return ASE_NotPresent;
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------
|
|
||||||
ASIOError AsioSample::stop ()
|
|
||||||
{
|
|
||||||
started = false;
|
|
||||||
timerOff (); // de-activate 'hardware'
|
|
||||||
return ASE_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------
|
|
||||||
ASIOError AsioSample::getChannels (long *numInputChannels, long *numOutputChannels)
|
|
||||||
{
|
|
||||||
*numInputChannels = kNumInputs;
|
|
||||||
*numOutputChannels = kNumOutputs;
|
|
||||||
return ASE_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------
|
|
||||||
ASIOError AsioSample::getLatencies (long *_inputLatency, long *_outputLatency)
|
|
||||||
{
|
|
||||||
*_inputLatency = inputLatency;
|
|
||||||
*_outputLatency = outputLatency;
|
|
||||||
return ASE_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------
|
|
||||||
ASIOError AsioSample::getBufferSize (long *minSize, long *maxSize,
|
|
||||||
long *preferredSize, long *granularity)
|
|
||||||
{
|
|
||||||
*minSize = *maxSize = *preferredSize = blockFrames; // allow this size only
|
|
||||||
*granularity = 0;
|
|
||||||
return ASE_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------
|
|
||||||
ASIOError AsioSample::canSampleRate (ASIOSampleRate sampleRate)
|
|
||||||
{
|
|
||||||
if (sampleRate == 44100. || sampleRate == 48000.) // allow these rates only
|
|
||||||
return ASE_OK;
|
|
||||||
return ASE_NoClock;
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------
|
|
||||||
ASIOError AsioSample::getSampleRate (ASIOSampleRate *sampleRate)
|
|
||||||
{
|
|
||||||
*sampleRate = this->sampleRate;
|
|
||||||
return ASE_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------
|
|
||||||
ASIOError AsioSample::setSampleRate (ASIOSampleRate sampleRate)
|
|
||||||
{
|
|
||||||
if (sampleRate != 44100. && sampleRate != 48000.)
|
|
||||||
return ASE_NoClock;
|
|
||||||
if (sampleRate != this->sampleRate)
|
|
||||||
{
|
|
||||||
this->sampleRate = sampleRate;
|
|
||||||
asioTime.timeInfo.sampleRate = sampleRate;
|
|
||||||
asioTime.timeInfo.flags |= kSampleRateChanged;
|
|
||||||
milliSeconds = (long)((double)(kBlockFrames * 1000) / this->sampleRate);
|
|
||||||
if (callbacks && callbacks->sampleRateDidChange)
|
|
||||||
callbacks->sampleRateDidChange (this->sampleRate);
|
|
||||||
}
|
|
||||||
return ASE_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------
|
|
||||||
ASIOError AsioSample::getClockSources (ASIOClockSource *clocks, long *numSources)
|
|
||||||
{
|
|
||||||
// internal
|
|
||||||
clocks->index = 0;
|
|
||||||
clocks->associatedChannel = -1;
|
|
||||||
clocks->associatedGroup = -1;
|
|
||||||
clocks->isCurrentSource = ASIOTrue;
|
|
||||||
strcpy(clocks->name, "Internal");
|
|
||||||
*numSources = 1;
|
|
||||||
return ASE_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------
|
|
||||||
ASIOError AsioSample::setClockSource (long index)
|
|
||||||
{
|
|
||||||
if (!index)
|
|
||||||
{
|
|
||||||
asioTime.timeInfo.flags |= kClockSourceChanged;
|
|
||||||
return ASE_OK;
|
|
||||||
}
|
|
||||||
return ASE_NotPresent;
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------
|
|
||||||
ASIOError AsioSample::getSamplePosition (ASIOSamples *sPos, ASIOTimeStamp *tStamp)
|
|
||||||
{
|
|
||||||
tStamp->lo = theSystemTime.lo;
|
|
||||||
tStamp->hi = theSystemTime.hi;
|
|
||||||
if (samplePosition >= twoRaisedTo32)
|
|
||||||
{
|
|
||||||
sPos->hi = (unsigned long)(samplePosition * twoRaisedTo32Reciprocal);
|
|
||||||
sPos->lo = (unsigned long)(samplePosition - (sPos->hi * twoRaisedTo32));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
sPos->hi = 0;
|
|
||||||
sPos->lo = (unsigned long)samplePosition;
|
|
||||||
}
|
|
||||||
return ASE_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------
|
|
||||||
ASIOError AsioSample::getChannelInfo (ASIOChannelInfo *info)
|
|
||||||
{
|
|
||||||
if (info->channel < 0 || (info->isInput ? info->channel >= kNumInputs : info->channel >= kNumOutputs))
|
|
||||||
return ASE_InvalidParameter;
|
|
||||||
#if WINDOWS
|
|
||||||
info->type = ASIOSTInt16LSB;
|
|
||||||
#else
|
|
||||||
info->type = ASIOSTInt16MSB;
|
|
||||||
#endif
|
|
||||||
info->channelGroup = 0;
|
|
||||||
info->isActive = ASIOFalse;
|
|
||||||
long i;
|
|
||||||
if (info->isInput)
|
|
||||||
{
|
|
||||||
for (i = 0; i < activeInputs; i++)
|
|
||||||
{
|
|
||||||
if (inMap[i] == info->channel)
|
|
||||||
{
|
|
||||||
info->isActive = ASIOTrue;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
for (i = 0; i < activeOutputs; i++)
|
|
||||||
{
|
|
||||||
if (outMap[i] == info->channel)
|
|
||||||
{
|
|
||||||
info->isActive = ASIOTrue;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
strcpy(info->name, "Sample ");
|
|
||||||
return ASE_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------
|
|
||||||
ASIOError AsioSample::createBuffers (ASIOBufferInfo *bufferInfos, long numChannels,
|
|
||||||
long bufferSize, ASIOCallbacks *callbacks)
|
|
||||||
{
|
|
||||||
ASIOBufferInfo *info = bufferInfos;
|
|
||||||
long i;
|
|
||||||
bool notEnoughMem = false;
|
|
||||||
|
|
||||||
activeInputs = 0;
|
|
||||||
activeOutputs = 0;
|
|
||||||
blockFrames = bufferSize;
|
|
||||||
for (i = 0; i < numChannels; i++, info++)
|
|
||||||
{
|
|
||||||
if (info->isInput)
|
|
||||||
{
|
|
||||||
if (info->channelNum < 0 || info->channelNum >= kNumInputs)
|
|
||||||
goto error;
|
|
||||||
inMap[activeInputs] = info->channelNum;
|
|
||||||
inputBuffers[activeInputs] = new short[blockFrames * 2]; // double buffer
|
|
||||||
if (inputBuffers[activeInputs])
|
|
||||||
{
|
|
||||||
info->buffers[0] = inputBuffers[activeInputs];
|
|
||||||
info->buffers[1] = inputBuffers[activeInputs] + blockFrames;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
info->buffers[0] = info->buffers[1] = 0;
|
|
||||||
notEnoughMem = true;
|
|
||||||
}
|
|
||||||
activeInputs++;
|
|
||||||
if (activeInputs > kNumInputs)
|
|
||||||
{
|
|
||||||
error:
|
|
||||||
disposeBuffers();
|
|
||||||
return ASE_InvalidParameter;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else // output
|
|
||||||
{
|
|
||||||
if (info->channelNum < 0 || info->channelNum >= kNumOutputs)
|
|
||||||
goto error;
|
|
||||||
outMap[activeOutputs] = info->channelNum;
|
|
||||||
outputBuffers[activeOutputs] = new short[blockFrames * 2]; // double buffer
|
|
||||||
if (outputBuffers[activeOutputs])
|
|
||||||
{
|
|
||||||
info->buffers[0] = outputBuffers[activeOutputs];
|
|
||||||
info->buffers[1] = outputBuffers[activeOutputs] + blockFrames;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
info->buffers[0] = info->buffers[1] = 0;
|
|
||||||
notEnoughMem = true;
|
|
||||||
}
|
|
||||||
activeOutputs++;
|
|
||||||
if (activeOutputs > kNumOutputs)
|
|
||||||
{
|
|
||||||
activeOutputs--;
|
|
||||||
disposeBuffers();
|
|
||||||
return ASE_InvalidParameter;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (notEnoughMem)
|
|
||||||
{
|
|
||||||
disposeBuffers();
|
|
||||||
return ASE_NoMemory;
|
|
||||||
}
|
|
||||||
|
|
||||||
this->callbacks = callbacks;
|
|
||||||
if (callbacks->asioMessage (kAsioSupportsTimeInfo, 0, 0, 0))
|
|
||||||
{
|
|
||||||
timeInfoMode = true;
|
|
||||||
asioTime.timeInfo.speed = 1.;
|
|
||||||
asioTime.timeInfo.systemTime.hi = asioTime.timeInfo.systemTime.lo = 0;
|
|
||||||
asioTime.timeInfo.samplePosition.hi = asioTime.timeInfo.samplePosition.lo = 0;
|
|
||||||
asioTime.timeInfo.sampleRate = sampleRate;
|
|
||||||
asioTime.timeInfo.flags = kSystemTimeValid | kSamplePositionValid | kSampleRateValid;
|
|
||||||
|
|
||||||
asioTime.timeCode.speed = 1.;
|
|
||||||
asioTime.timeCode.timeCodeSamples.lo = asioTime.timeCode.timeCodeSamples.hi = 0;
|
|
||||||
asioTime.timeCode.flags = kTcValid | kTcRunning ;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
timeInfoMode = false;
|
|
||||||
return ASE_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------
|
|
||||||
ASIOError AsioSample::disposeBuffers()
|
|
||||||
{
|
|
||||||
long i;
|
|
||||||
|
|
||||||
callbacks = 0;
|
|
||||||
stop();
|
|
||||||
for (i = 0; i < activeInputs; i++)
|
|
||||||
delete inputBuffers[i];
|
|
||||||
activeInputs = 0;
|
|
||||||
for (i = 0; i < activeOutputs; i++)
|
|
||||||
delete outputBuffers[i];
|
|
||||||
activeOutputs = 0;
|
|
||||||
return ASE_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------
|
|
||||||
ASIOError AsioSample::controlPanel()
|
|
||||||
{
|
|
||||||
return ASE_NotPresent;
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------
|
|
||||||
ASIOError AsioSample::future (long selector, void* opt) // !!! check properties
|
|
||||||
{
|
|
||||||
ASIOTransportParameters* tp = (ASIOTransportParameters*)opt;
|
|
||||||
switch (selector)
|
|
||||||
{
|
|
||||||
case kAsioEnableTimeCodeRead: tcRead = true; return ASE_SUCCESS;
|
|
||||||
case kAsioDisableTimeCodeRead: tcRead = false; return ASE_SUCCESS;
|
|
||||||
case kAsioSetInputMonitor: return ASE_SUCCESS; // for testing!!!
|
|
||||||
case kAsioCanInputMonitor: return ASE_SUCCESS; // for testing!!!
|
|
||||||
case kAsioCanTimeInfo: return ASE_SUCCESS;
|
|
||||||
case kAsioCanTimeCode: return ASE_SUCCESS;
|
|
||||||
}
|
|
||||||
return ASE_NotPresent;
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------------
|
|
||||||
// private methods
|
|
||||||
//--------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------------
|
|
||||||
// input
|
|
||||||
//--------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------
|
|
||||||
bool AsioSample::inputOpen ()
|
|
||||||
{
|
|
||||||
#if TESTWAVES
|
|
||||||
sineWave = new short[blockFrames];
|
|
||||||
if (!sineWave)
|
|
||||||
{
|
|
||||||
strcpy (errorMessage, "ASIO Sample Driver: Out of Memory!");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
makeSine (sineWave);
|
|
||||||
|
|
||||||
sawTooth = new short[blockFrames];
|
|
||||||
if (!sawTooth)
|
|
||||||
{
|
|
||||||
strcpy(errorMessage, "ASIO Sample Driver: Out of Memory!");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
makeSaw(sawTooth);
|
|
||||||
#endif
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if TESTWAVES
|
|
||||||
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
const double pi = 0.3141592654;
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------
|
|
||||||
void AsioSample::makeSine (short *wave)
|
|
||||||
{
|
|
||||||
double frames = (double)blockFrames;
|
|
||||||
double i, f = (pi * 2.) / frames;
|
|
||||||
|
|
||||||
for (i = 0; i < frames; i++)
|
|
||||||
*wave++ = (short)((double)0x7fff * sin(f * i));
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------
|
|
||||||
void AsioSample::makeSaw(short *wave)
|
|
||||||
{
|
|
||||||
double frames = (double)blockFrames;
|
|
||||||
double i, f = 2. / frames;
|
|
||||||
|
|
||||||
for (i = 0; i < frames; i++)
|
|
||||||
*wave++ = (short)((double)0x7fff * (-1. + f * i));
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------
|
|
||||||
void AsioSample::inputClose ()
|
|
||||||
{
|
|
||||||
#if TESTWAVES
|
|
||||||
if (sineWave)
|
|
||||||
delete sineWave;
|
|
||||||
sineWave = 0;
|
|
||||||
if (sawTooth)
|
|
||||||
delete sawTooth;
|
|
||||||
sawTooth = 0;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------
|
|
||||||
void AsioSample::input()
|
|
||||||
{
|
|
||||||
#if TESTWAVES
|
|
||||||
long i;
|
|
||||||
short *in = 0;
|
|
||||||
|
|
||||||
for (i = 0; i < activeInputs; i++)
|
|
||||||
{
|
|
||||||
in = inputBuffers[i];
|
|
||||||
if (in)
|
|
||||||
{
|
|
||||||
if (toggle)
|
|
||||||
in += blockFrames;
|
|
||||||
if ((i & 1) && sawTooth)
|
|
||||||
memcpy(in, sawTooth, (unsigned long)(blockFrames * 2));
|
|
||||||
else if (sineWave)
|
|
||||||
memcpy(in, sineWave, (unsigned long)(blockFrames * 2));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------------------------------
|
|
||||||
// output
|
|
||||||
//------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------
|
|
||||||
bool AsioSample::outputOpen()
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------
|
|
||||||
void AsioSample::outputClose ()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------
|
|
||||||
void AsioSample::output ()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------
|
|
||||||
void AsioSample::bufferSwitch ()
|
|
||||||
{
|
|
||||||
if (started && callbacks)
|
|
||||||
{
|
|
||||||
getNanoSeconds(&theSystemTime); // latch system time
|
|
||||||
input();
|
|
||||||
output();
|
|
||||||
samplePosition += blockFrames;
|
|
||||||
if (timeInfoMode)
|
|
||||||
bufferSwitchX ();
|
|
||||||
else
|
|
||||||
callbacks->bufferSwitch (toggle, ASIOFalse);
|
|
||||||
toggle = toggle ? 0 : 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------
|
|
||||||
// asio2 buffer switch
|
|
||||||
void AsioSample::bufferSwitchX ()
|
|
||||||
{
|
|
||||||
getSamplePosition (&asioTime.timeInfo.samplePosition, &asioTime.timeInfo.systemTime);
|
|
||||||
long offset = toggle ? blockFrames : 0;
|
|
||||||
if (tcRead)
|
|
||||||
{ // Create a fake time code, which is 10 minutes ahead of the card's sample position
|
|
||||||
// Please note that for simplicity here time code will wrap after 32 bit are reached
|
|
||||||
asioTime.timeCode.timeCodeSamples.lo = asioTime.timeInfo.samplePosition.lo + 600.0 * sampleRate;
|
|
||||||
asioTime.timeCode.timeCodeSamples.hi = 0;
|
|
||||||
}
|
|
||||||
callbacks->bufferSwitchTimeInfo (&asioTime, toggle, ASIOFalse);
|
|
||||||
asioTime.timeInfo.flags &= ~(kSampleRateChanged | kClockSourceChanged);
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------
|
|
||||||
ASIOError AsioSample::outputReady ()
|
|
||||||
{
|
|
||||||
return ASE_NotPresent;
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------
|
|
||||||
double AsioSamples2double (ASIOSamples* samples)
|
|
||||||
{
|
|
||||||
double a = (double)(samples->lo);
|
|
||||||
if (samples->hi)
|
|
||||||
a += (double)(samples->hi) * twoRaisedTo32;
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,148 +0,0 @@
|
||||||
/*
|
|
||||||
Steinberg Audio Stream I/O API
|
|
||||||
(c) 1999, Steinberg Soft- und Hardware GmbH
|
|
||||||
|
|
||||||
asiosmpl.h
|
|
||||||
|
|
||||||
test implementation of asio
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _asiosmpl_
|
|
||||||
#define _asiosmpl_
|
|
||||||
|
|
||||||
#include "asiosys.h"
|
|
||||||
|
|
||||||
#define TESTWAVES 1
|
|
||||||
// when true, will feed the left input (to host) with
|
|
||||||
// a sine wave, and the right one with a sawtooth
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
kBlockFrames = 256,
|
|
||||||
kNumInputs = 16,
|
|
||||||
kNumOutputs = 16
|
|
||||||
};
|
|
||||||
|
|
||||||
#if WINDOWS
|
|
||||||
|
|
||||||
#include "rpc.h"
|
|
||||||
#include "rpcndr.h"
|
|
||||||
#ifndef COM_NO_WINDOWS_H
|
|
||||||
#include <windows.h>
|
|
||||||
#include "ole2.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "combase.h"
|
|
||||||
#include "iasiodrv.h"
|
|
||||||
|
|
||||||
class AsioSample : public IASIO, public CUnknown
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
AsioSample(LPUNKNOWN pUnk, HRESULT *phr);
|
|
||||||
~AsioSample();
|
|
||||||
|
|
||||||
DECLARE_IUNKNOWN
|
|
||||||
//STDMETHODIMP QueryInterface(REFIID riid, void **ppv) { \
|
|
||||||
// return GetOwner()->QueryInterface(riid,ppv); \
|
|
||||||
//}; \
|
|
||||||
//STDMETHODIMP_(ULONG) AddRef() { \
|
|
||||||
// return GetOwner()->AddRef(); \
|
|
||||||
//}; \
|
|
||||||
//STDMETHODIMP_(ULONG) Release() { \
|
|
||||||
// return GetOwner()->Release(); \
|
|
||||||
//};
|
|
||||||
|
|
||||||
// Factory method
|
|
||||||
static CUnknown *CreateInstance(LPUNKNOWN pUnk, HRESULT *phr);
|
|
||||||
// IUnknown
|
|
||||||
virtual HRESULT STDMETHODCALLTYPE NonDelegatingQueryInterface(REFIID riid,void **ppvObject);
|
|
||||||
#else
|
|
||||||
|
|
||||||
#include "asiodrvr.h"
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------
|
|
||||||
class AsioSample : public AsioDriver
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
AsioSample ();
|
|
||||||
~AsioSample ();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ASIOBool init (void* sysRef);
|
|
||||||
void getDriverName (char *name); // max 32 bytes incl. terminating zero
|
|
||||||
long getDriverVersion ();
|
|
||||||
void getErrorMessage (char *string); // max 128 bytes incl.
|
|
||||||
|
|
||||||
ASIOError start ();
|
|
||||||
ASIOError stop ();
|
|
||||||
|
|
||||||
ASIOError getChannels (long *numInputChannels, long *numOutputChannels);
|
|
||||||
ASIOError getLatencies (long *inputLatency, long *outputLatency);
|
|
||||||
ASIOError getBufferSize (long *minSize, long *maxSize,
|
|
||||||
long *preferredSize, long *granularity);
|
|
||||||
|
|
||||||
ASIOError canSampleRate (ASIOSampleRate sampleRate);
|
|
||||||
ASIOError getSampleRate (ASIOSampleRate *sampleRate);
|
|
||||||
ASIOError setSampleRate (ASIOSampleRate sampleRate);
|
|
||||||
ASIOError getClockSources (ASIOClockSource *clocks, long *numSources);
|
|
||||||
ASIOError setClockSource (long index);
|
|
||||||
|
|
||||||
ASIOError getSamplePosition (ASIOSamples *sPos, ASIOTimeStamp *tStamp);
|
|
||||||
ASIOError getChannelInfo (ASIOChannelInfo *info);
|
|
||||||
|
|
||||||
ASIOError createBuffers (ASIOBufferInfo *bufferInfos, long numChannels,
|
|
||||||
long bufferSize, ASIOCallbacks *callbacks);
|
|
||||||
ASIOError disposeBuffers ();
|
|
||||||
|
|
||||||
ASIOError controlPanel ();
|
|
||||||
ASIOError future (long selector, void *opt);
|
|
||||||
ASIOError outputReady ();
|
|
||||||
|
|
||||||
void bufferSwitch ();
|
|
||||||
long getMilliSeconds () {return milliSeconds;}
|
|
||||||
|
|
||||||
private:
|
|
||||||
friend void myTimer();
|
|
||||||
|
|
||||||
bool inputOpen ();
|
|
||||||
#if TESTWAVES
|
|
||||||
void makeSine (short *wave);
|
|
||||||
void makeSaw (short *wave);
|
|
||||||
#endif
|
|
||||||
void inputClose ();
|
|
||||||
void input ();
|
|
||||||
|
|
||||||
bool outputOpen ();
|
|
||||||
void outputClose ();
|
|
||||||
void output ();
|
|
||||||
|
|
||||||
void timerOn ();
|
|
||||||
void timerOff ();
|
|
||||||
void bufferSwitchX ();
|
|
||||||
|
|
||||||
double samplePosition;
|
|
||||||
double sampleRate;
|
|
||||||
ASIOCallbacks *callbacks;
|
|
||||||
ASIOTime asioTime;
|
|
||||||
ASIOTimeStamp theSystemTime;
|
|
||||||
short *inputBuffers[kNumInputs * 2];
|
|
||||||
short *outputBuffers[kNumOutputs * 2];
|
|
||||||
#if TESTWAVES
|
|
||||||
short *sineWave, *sawTooth;
|
|
||||||
#endif
|
|
||||||
long inMap[kNumInputs];
|
|
||||||
long outMap[kNumOutputs];
|
|
||||||
long blockFrames;
|
|
||||||
long inputLatency;
|
|
||||||
long outputLatency;
|
|
||||||
long activeInputs;
|
|
||||||
long activeOutputs;
|
|
||||||
long toggle;
|
|
||||||
long milliSeconds;
|
|
||||||
bool active, started;
|
|
||||||
bool timeInfoMode, tcRead;
|
|
||||||
char errorMessage[128];
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
@ -1,15 +0,0 @@
|
||||||
#include "asio.h"
|
|
||||||
#include <Timer.h>
|
|
||||||
|
|
||||||
void getNanoSeconds(ASIOTimeStamp *time);
|
|
||||||
|
|
||||||
static const double twoRaisedTo32 = 4294967296.;
|
|
||||||
|
|
||||||
void getNanoSeconds(ASIOTimeStamp *time)
|
|
||||||
{
|
|
||||||
UnsignedWide ys;
|
|
||||||
Microseconds(&ys);
|
|
||||||
double r = 1000. * ((double)ys.hi * twoRaisedTo32 + (double)ys.lo);
|
|
||||||
time->hi = (unsigned long)(r / twoRaisedTo32);
|
|
||||||
time->lo = (unsigned long)(r - (double)time->hi * twoRaisedTo32);
|
|
||||||
}
|
|
||||||
|
|
@ -1,52 +0,0 @@
|
||||||
/*
|
|
||||||
Steinberg Audio Stream I/O API
|
|
||||||
(c) 1996, Steinberg Soft- und Hardware GmbH
|
|
||||||
charlie (May 1996)
|
|
||||||
|
|
||||||
asiosmpl.cpp
|
|
||||||
|
|
||||||
sample implementation of asio.
|
|
||||||
time manager irq
|
|
||||||
**** mac os specific ****
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <macheaders.h>
|
|
||||||
#include <Timer.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include "asiosmpl.h"
|
|
||||||
|
|
||||||
static TMTask myTmTask;
|
|
||||||
static bool tmTaskOn = false;
|
|
||||||
static AsioSample *theSound = 0;
|
|
||||||
|
|
||||||
void myTimer();
|
|
||||||
void myTimer()
|
|
||||||
{
|
|
||||||
if(theSound)
|
|
||||||
theSound->bufferSwitch();
|
|
||||||
PrimeTime((QElemPtr)&myTmTask, theSound->milliSeconds);
|
|
||||||
}
|
|
||||||
|
|
||||||
void AsioSample::timerOn()
|
|
||||||
{
|
|
||||||
theSound = this; // for irq
|
|
||||||
if(!tmTaskOn)
|
|
||||||
{
|
|
||||||
memset(&myTmTask, 0, sizeof(TMTask));
|
|
||||||
myTmTask.tmAddr = NewTimerProc(myTimer);
|
|
||||||
myTmTask.tmWakeUp = 0;
|
|
||||||
tmTaskOn = true;
|
|
||||||
InsXTime((QElemPtr)&myTmTask);
|
|
||||||
PrimeTime((QElemPtr)&myTmTask, theSound->milliSeconds);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void AsioSample::timerOff()
|
|
||||||
{
|
|
||||||
if(tmTaskOn)
|
|
||||||
{
|
|
||||||
RmvTime((QElemPtr)&myTmTask);
|
|
||||||
tmTaskOn = false;
|
|
||||||
}
|
|
||||||
theSound = 0;
|
|
||||||
}
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
||||||
#include "asiosmpl.h"
|
|
||||||
|
|
||||||
AsioDriver *getDriver()
|
|
||||||
{
|
|
||||||
return new AsioSample();
|
|
||||||
}
|
|
||||||
|
|
@ -1,55 +0,0 @@
|
||||||
#include <windows.h>
|
|
||||||
#include "asiosmpl.h"
|
|
||||||
|
|
||||||
static DWORD __stdcall ASIOThread (void *param);
|
|
||||||
static HANDLE ASIOThreadHandle = 0;
|
|
||||||
static bool done = false;
|
|
||||||
const double twoRaisedTo32 = 4294967296.;
|
|
||||||
|
|
||||||
AsioSample* theDriver = 0;
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------
|
|
||||||
void getNanoSeconds (ASIOTimeStamp* ts)
|
|
||||||
{
|
|
||||||
double nanoSeconds = (double)((unsigned long)timeGetTime ()) * 1000000.;
|
|
||||||
ts->hi = (unsigned long)(nanoSeconds / twoRaisedTo32);
|
|
||||||
ts->lo = (unsigned long)(nanoSeconds - (ts->hi * twoRaisedTo32));
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------
|
|
||||||
void AsioSample::timerOn ()
|
|
||||||
{
|
|
||||||
theDriver = this;
|
|
||||||
DWORD asioId;
|
|
||||||
done = false;
|
|
||||||
ASIOThreadHandle = CreateThread (0, 0, &ASIOThread, 0, 0, &asioId);
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------
|
|
||||||
void AsioSample::timerOff ()
|
|
||||||
{
|
|
||||||
done = true;
|
|
||||||
if (ASIOThreadHandle)
|
|
||||||
WaitForSingleObject(ASIOThreadHandle, 1000);
|
|
||||||
ASIOThreadHandle = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------
|
|
||||||
static DWORD __stdcall ASIOThread (void *param)
|
|
||||||
{
|
|
||||||
do
|
|
||||||
{
|
|
||||||
if (theDriver)
|
|
||||||
{
|
|
||||||
theDriver->bufferSwitch ();
|
|
||||||
Sleep (theDriver->getMilliSeconds ());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
double a = 1000. / 44100.;
|
|
||||||
Sleep ((long)(a * (double)kBlockFrames));
|
|
||||||
|
|
||||||
}
|
|
||||||
} while (!done);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
@ -1,859 +0,0 @@
|
||||||
#include "ginclude.h"
|
|
||||||
#include "ASIOConvertSamples.h"
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
#if MAC
|
|
||||||
#define TRUNCATE 0
|
|
||||||
|
|
||||||
#elif ASIO_CPU_X86 || ASIO_CPU_SPARC || ASIO_CPU_MIPS
|
|
||||||
#define TRUNCATE 1
|
|
||||||
#undef MAXFLOAT
|
|
||||||
#define MAXFLOAT 0x7fffff00L
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ASIOConvertSamples::ASIOConvertSamples()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//-------------------------------------------------------------------------------------------
|
|
||||||
// mono
|
|
||||||
|
|
||||||
void ASIOConvertSamples::convertMono8Unsigned(long *source, char *dest, long frames)
|
|
||||||
{
|
|
||||||
unsigned char *c = (unsigned char *)source;
|
|
||||||
unsigned char a;
|
|
||||||
|
|
||||||
dest--;
|
|
||||||
while(--frames >= 0)
|
|
||||||
{
|
|
||||||
#if ASIO_LITTLE_ENDIAN
|
|
||||||
a = c[3];
|
|
||||||
#else
|
|
||||||
a = c[0];
|
|
||||||
#endif
|
|
||||||
c += 4;
|
|
||||||
a -= 0x80U;
|
|
||||||
*++dest = a;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ASIOConvertSamples::convertMono8(long *source, char *dest, long frames)
|
|
||||||
{
|
|
||||||
char *c = (char *)source;
|
|
||||||
char a;
|
|
||||||
|
|
||||||
dest--;
|
|
||||||
while(--frames >= 0)
|
|
||||||
{
|
|
||||||
#if ASIO_LITTLE_ENDIAN
|
|
||||||
a = c[3];
|
|
||||||
#else
|
|
||||||
a = c[0];
|
|
||||||
#endif
|
|
||||||
c += 4;
|
|
||||||
*++dest = a;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ASIOConvertSamples::convertMono16(long *source, short *dest, long frames)
|
|
||||||
{
|
|
||||||
#if ASIO_LITTLE_ENDIAN
|
|
||||||
char* s = (char*)source;
|
|
||||||
char* d = (char*)dest;
|
|
||||||
while(--frames >= 0)
|
|
||||||
{
|
|
||||||
*d++ = s[3]; // dest big endian, msb first
|
|
||||||
*d++ = s[2];
|
|
||||||
s += 4;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
long l;
|
|
||||||
|
|
||||||
source--;
|
|
||||||
dest--;
|
|
||||||
while(--frames >= 0)
|
|
||||||
{
|
|
||||||
l = *++source;
|
|
||||||
*++dest = (short)(l >> 16);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void ASIOConvertSamples::convertMono24(long *source, char *dest, long frames)
|
|
||||||
{
|
|
||||||
// work with chars in order to prevent misalignments
|
|
||||||
char *s = (char *)source;
|
|
||||||
char a, b, c;
|
|
||||||
|
|
||||||
dest--;
|
|
||||||
while(--frames >= 0)
|
|
||||||
{
|
|
||||||
#if ASIO_LITTLE_ENDIAN
|
|
||||||
a = s[3]; // msb
|
|
||||||
b = s[2];
|
|
||||||
c = s[1]; // lsb
|
|
||||||
#else
|
|
||||||
a = s[0];
|
|
||||||
b = s[1];
|
|
||||||
c = s[2];
|
|
||||||
#endif
|
|
||||||
s += 4;
|
|
||||||
*++dest = a; // big endian, msb first
|
|
||||||
*++dest = b;
|
|
||||||
*++dest = c;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// small endian
|
|
||||||
|
|
||||||
void ASIOConvertSamples::convertMono16SmallEndian(long *source, short *dest, long frames)
|
|
||||||
{
|
|
||||||
char *s = (char *)source;
|
|
||||||
char *d = (char *)dest;
|
|
||||||
char a, b;
|
|
||||||
|
|
||||||
d--;
|
|
||||||
while(--frames >= 0)
|
|
||||||
{
|
|
||||||
#if ASIO_LITTLE_ENDIAN
|
|
||||||
a = s[3];
|
|
||||||
b = s[2];
|
|
||||||
#else
|
|
||||||
a = s[0];
|
|
||||||
b = s[1];
|
|
||||||
#endif
|
|
||||||
s += 4;
|
|
||||||
*++d = b; // dest small endian, lsb first
|
|
||||||
*++d = a;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ASIOConvertSamples::convertMono24SmallEndian(long *source, char *dest, long frames)
|
|
||||||
{
|
|
||||||
// work with chars in order to prevent misalignments
|
|
||||||
char *s = (char *)source;
|
|
||||||
char a, b, c;
|
|
||||||
|
|
||||||
dest--;
|
|
||||||
while(--frames >= 0)
|
|
||||||
{
|
|
||||||
#if ASIO_LITTLE_ENDIAN
|
|
||||||
a = s[3];
|
|
||||||
b = s[2];
|
|
||||||
c = s[1];
|
|
||||||
#else
|
|
||||||
a = s[0];
|
|
||||||
b = s[1];
|
|
||||||
c = s[2];
|
|
||||||
#endif
|
|
||||||
s += 4;
|
|
||||||
*++dest = c; // lsb first
|
|
||||||
*++dest = b;
|
|
||||||
*++dest = a;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//-------------------------------------------------------------------------------------------
|
|
||||||
// stereo interleaved
|
|
||||||
|
|
||||||
void ASIOConvertSamples::convertStereo8InterleavedUnsigned(long *left, long *right, char *dest, long frames)
|
|
||||||
{
|
|
||||||
unsigned char *cl = (unsigned char *)left;
|
|
||||||
unsigned char *cr = (unsigned char *)right;
|
|
||||||
unsigned char a, b;
|
|
||||||
|
|
||||||
dest--;
|
|
||||||
while(--frames >= 0)
|
|
||||||
{
|
|
||||||
#if ASIO_LITTLE_ENDIAN
|
|
||||||
a = cl[3];
|
|
||||||
b = cr[3];
|
|
||||||
#else
|
|
||||||
a = cl[0];
|
|
||||||
b = cr[0];
|
|
||||||
#endif
|
|
||||||
cl += 4;
|
|
||||||
cr += 4;
|
|
||||||
a -= 0x80U;
|
|
||||||
b -= 0x80U;
|
|
||||||
*++dest = a;
|
|
||||||
*++dest = b;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ASIOConvertSamples::convertStereo8Interleaved(long *left, long *right, char *dest, long frames)
|
|
||||||
{
|
|
||||||
unsigned char *cl = (unsigned char *)left;
|
|
||||||
unsigned char *cr = (unsigned char *)right;
|
|
||||||
unsigned char a, b;
|
|
||||||
|
|
||||||
dest--;
|
|
||||||
while(--frames >= 0)
|
|
||||||
{
|
|
||||||
#if ASIO_LITTLE_ENDIAN
|
|
||||||
a = cl[3];
|
|
||||||
b = cr[3];
|
|
||||||
#else
|
|
||||||
a = cl[0];
|
|
||||||
b = cr[0];
|
|
||||||
#endif
|
|
||||||
cl += 4;
|
|
||||||
cr += 4;
|
|
||||||
*++dest = a;
|
|
||||||
*++dest = b;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ASIOConvertSamples::convertStereo16Interleaved(long *left, long *right, short *dest, long frames)
|
|
||||||
{
|
|
||||||
#if ASIO_LITTLE_ENDIAN
|
|
||||||
char* sl = (char*)left;
|
|
||||||
char* sr = (char*)right;
|
|
||||||
char* d = (char*)dest;
|
|
||||||
while(--frames >= 0)
|
|
||||||
{
|
|
||||||
*d++ = sl[3]; // msb first
|
|
||||||
*d++ = sl[2];
|
|
||||||
*d++ = sr[3];
|
|
||||||
*d++ = sr[2];
|
|
||||||
sl += 4;
|
|
||||||
sr += 4;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
long l, r;
|
|
||||||
|
|
||||||
left--;
|
|
||||||
right--;
|
|
||||||
dest--;
|
|
||||||
while(--frames >= 0)
|
|
||||||
{
|
|
||||||
l = *++left;
|
|
||||||
r = *++right;
|
|
||||||
*++dest = (short)(l >> 16);
|
|
||||||
*++dest = (short)(r >> 16);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void ASIOConvertSamples::convertStereo24Interleaved(long *left, long *right, char *dest, long frames)
|
|
||||||
{
|
|
||||||
// work with chars in order to prevent misalignments
|
|
||||||
char *sl = (char *)left;
|
|
||||||
char *sr = (char *)right;
|
|
||||||
char al, bl, cl, ar, br, cr;
|
|
||||||
|
|
||||||
dest--;
|
|
||||||
while(--frames >= 0)
|
|
||||||
{
|
|
||||||
#if ASIO_LITTLE_ENDIAN
|
|
||||||
al = sl[3];
|
|
||||||
bl = sl[2];
|
|
||||||
cl = sl[1];
|
|
||||||
ar = sr[3];
|
|
||||||
br = sr[2];
|
|
||||||
cr = sr[1];
|
|
||||||
#else
|
|
||||||
al = sl[0];
|
|
||||||
bl = sl[1];
|
|
||||||
cl = sl[2];
|
|
||||||
ar = sr[0];
|
|
||||||
br = sr[1];
|
|
||||||
cr = sr[2];
|
|
||||||
#endif
|
|
||||||
sl += 4;
|
|
||||||
sr += 4;
|
|
||||||
*++dest = al;
|
|
||||||
*++dest = bl;
|
|
||||||
*++dest = cl;
|
|
||||||
*++dest = ar;
|
|
||||||
*++dest = br;
|
|
||||||
*++dest = cr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ASIOConvertSamples::convertStereo16InterleavedSmallEndian(long *left, long *right, short *dest, long frames)
|
|
||||||
{
|
|
||||||
char *sl = (char *)left;
|
|
||||||
char *sr = (char *)right;
|
|
||||||
char *d = (char *)dest;
|
|
||||||
char al, bl, ar, br;
|
|
||||||
|
|
||||||
d--;
|
|
||||||
while(--frames >= 0)
|
|
||||||
{
|
|
||||||
#if ASIO_LITTLE_ENDIAN
|
|
||||||
al = sl[3];
|
|
||||||
bl = sl[2];
|
|
||||||
ar = sr[3];
|
|
||||||
br = sr[2];
|
|
||||||
#else
|
|
||||||
al = sl[0];
|
|
||||||
bl = sl[1];
|
|
||||||
ar = sr[0];
|
|
||||||
br = sr[1];
|
|
||||||
#endif
|
|
||||||
sl += 4;
|
|
||||||
sr += 4;
|
|
||||||
*++d = bl; // lsb first
|
|
||||||
*++d = al;
|
|
||||||
*++d = br;
|
|
||||||
*++d = ar;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ASIOConvertSamples::convertStereo24InterleavedSmallEndian(long *left, long *right, char *dest, long frames)
|
|
||||||
{
|
|
||||||
// work with chars in order to prevent misalignments
|
|
||||||
char *sl = (char *)left;
|
|
||||||
char *sr = (char *)right;
|
|
||||||
char al, bl, cl, ar, br, cr;
|
|
||||||
|
|
||||||
dest--;
|
|
||||||
while(--frames >= 0)
|
|
||||||
{
|
|
||||||
#if ASIO_LITTLE_ENDIAN
|
|
||||||
al = sl[3];
|
|
||||||
bl = sl[2];
|
|
||||||
cl = sl[1];
|
|
||||||
ar = sr[3];
|
|
||||||
br = sr[2];
|
|
||||||
cr = sr[1];
|
|
||||||
#else
|
|
||||||
al = sl[0];
|
|
||||||
bl = sl[1];
|
|
||||||
cl = sl[2];
|
|
||||||
ar = sr[0];
|
|
||||||
br = sr[1];
|
|
||||||
cr = sr[2];
|
|
||||||
#endif
|
|
||||||
sl += 4;
|
|
||||||
sr += 4;
|
|
||||||
*++dest = cl;
|
|
||||||
*++dest = bl;
|
|
||||||
*++dest = al;
|
|
||||||
*++dest = cr;
|
|
||||||
*++dest = br;
|
|
||||||
*++dest = ar;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//-------------------------------------------------------------------------------------------
|
|
||||||
// stereo split
|
|
||||||
|
|
||||||
void ASIOConvertSamples::convertStereo8Unsigned(long *left, long *right, char *dLeft, char *dRight, long frames)
|
|
||||||
{
|
|
||||||
unsigned char *cl = (unsigned char *)left;
|
|
||||||
unsigned char *cr = (unsigned char *)right;
|
|
||||||
unsigned char a, b;
|
|
||||||
|
|
||||||
dLeft--;
|
|
||||||
dRight--;
|
|
||||||
while(--frames >= 0)
|
|
||||||
{
|
|
||||||
#if ASIO_LITTLE_ENDIAN
|
|
||||||
a = cl[3];
|
|
||||||
b = cr[3];
|
|
||||||
#else
|
|
||||||
a = cl[0];
|
|
||||||
b = cr[0];
|
|
||||||
#endif
|
|
||||||
cl += 4;
|
|
||||||
cr += 4;
|
|
||||||
a -= 0x80U;
|
|
||||||
b -= 0x80U;
|
|
||||||
*++dLeft = a;
|
|
||||||
*++dRight = b;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ASIOConvertSamples::convertStereo8(long *left, long *right, char *dLeft, char *dRight, long frames)
|
|
||||||
{
|
|
||||||
unsigned char *cl = (unsigned char *)left;
|
|
||||||
unsigned char *cr = (unsigned char *)right;
|
|
||||||
unsigned char a, b;
|
|
||||||
|
|
||||||
dLeft--;
|
|
||||||
dRight--;
|
|
||||||
while(--frames >= 0)
|
|
||||||
{
|
|
||||||
#if ASIO_LITTLE_ENDIAN
|
|
||||||
a = cl[3];
|
|
||||||
b = cr[3];
|
|
||||||
#else
|
|
||||||
a = cl[0];
|
|
||||||
b = cr[0];
|
|
||||||
#endif
|
|
||||||
cl += 4;
|
|
||||||
cr += 4;
|
|
||||||
*++dLeft = a;
|
|
||||||
*++dRight = b;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ASIOConvertSamples::convertStereo16(long *left, long *right, short *dLeft, short *dRight, long frames)
|
|
||||||
{
|
|
||||||
#if ASIO_LITTLE_ENDIAN
|
|
||||||
char* sl = (char*)left;
|
|
||||||
char* sr = (char*)right;
|
|
||||||
char* dl = (char*)dLeft;
|
|
||||||
char* dr = (char*)dRight;
|
|
||||||
while(--frames >= 0)
|
|
||||||
{
|
|
||||||
*dl++ = sl[3]; // msb first
|
|
||||||
*dl++ = sl[2];
|
|
||||||
*dr++ = sr[3];
|
|
||||||
*dr++ = sr[2];
|
|
||||||
sl += 4;
|
|
||||||
sr += 4;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
long l, r;
|
|
||||||
|
|
||||||
left--;
|
|
||||||
right--;
|
|
||||||
dLeft--;
|
|
||||||
dRight--;
|
|
||||||
while(--frames >= 0)
|
|
||||||
{
|
|
||||||
l = *++left;
|
|
||||||
r = *++right;
|
|
||||||
*++dLeft = (short)(l >> 16);
|
|
||||||
*++dRight = (short)(r >> 16);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void ASIOConvertSamples::convertStereo24(long *left, long *right, char *dLeft, char *dRight, long frames)
|
|
||||||
{
|
|
||||||
// work with chars in order to prevent misalignments
|
|
||||||
char *sl = (char *)left;
|
|
||||||
char *sr = (char *)right;
|
|
||||||
char al, bl, cl, ar, br, cr;
|
|
||||||
|
|
||||||
dLeft--;
|
|
||||||
dRight--;
|
|
||||||
while(--frames >= 0)
|
|
||||||
{
|
|
||||||
#if ASIO_LITTLE_ENDIAN
|
|
||||||
al = sl[3];
|
|
||||||
bl = sl[2];
|
|
||||||
cl = sl[1];
|
|
||||||
ar = sr[3];
|
|
||||||
br = sr[2];
|
|
||||||
cr = sr[1];
|
|
||||||
#else
|
|
||||||
al = sl[0];
|
|
||||||
bl = sl[1];
|
|
||||||
cl = sl[2];
|
|
||||||
ar = sr[0];
|
|
||||||
br = sr[1];
|
|
||||||
cr = sr[2];
|
|
||||||
#endif
|
|
||||||
sl += 4;
|
|
||||||
sr += 4;
|
|
||||||
*++dLeft = al;
|
|
||||||
*++dLeft = bl;
|
|
||||||
*++dLeft = cl;
|
|
||||||
*++dRight = ar;
|
|
||||||
*++dRight = br;
|
|
||||||
*++dRight = cr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// small endian
|
|
||||||
void ASIOConvertSamples::convertStereo16SmallEndian(long *left, long *right, short *dLeft, short *dRight, long frames)
|
|
||||||
{
|
|
||||||
char *sl = (char *)left;
|
|
||||||
char *sr = (char *)right;
|
|
||||||
char *dl = (char *)dLeft;
|
|
||||||
char *dr = (char *)dRight;
|
|
||||||
char al, bl, ar, br;
|
|
||||||
|
|
||||||
dl--;
|
|
||||||
dr--;
|
|
||||||
while(--frames >= 0)
|
|
||||||
{
|
|
||||||
#if ASIO_LITTLE_ENDIAN
|
|
||||||
al = sl[3];
|
|
||||||
bl = sl[2];
|
|
||||||
ar = sr[3];
|
|
||||||
br = sr[2];
|
|
||||||
#else
|
|
||||||
al = sl[0];
|
|
||||||
bl = sl[1];
|
|
||||||
ar = sr[0];
|
|
||||||
br = sr[1];
|
|
||||||
#endif
|
|
||||||
sl += 4;
|
|
||||||
sr += 4;
|
|
||||||
*++dl = bl;
|
|
||||||
*++dl = al;
|
|
||||||
*++dr = br;
|
|
||||||
*++dr = ar;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ASIOConvertSamples::convertStereo24SmallEndian(long *left, long *right, char *dLeft, char *dRight, long frames)
|
|
||||||
{
|
|
||||||
// work with chars in order to prevent misalignments
|
|
||||||
char *sl = (char *)left;
|
|
||||||
char *sr = (char *)right;
|
|
||||||
char al, bl, cl, ar, br, cr;
|
|
||||||
|
|
||||||
dLeft--;
|
|
||||||
dRight--;
|
|
||||||
while(--frames >= 0)
|
|
||||||
{
|
|
||||||
#if ASIO_LITTLE_ENDIAN
|
|
||||||
al = sl[3];
|
|
||||||
bl = sl[2];
|
|
||||||
cl = sl[1];
|
|
||||||
ar = sr[3];
|
|
||||||
br = sr[2];
|
|
||||||
cr = sr[1];
|
|
||||||
#else
|
|
||||||
al = sl[0];
|
|
||||||
bl = sl[1];
|
|
||||||
cl = sl[2];
|
|
||||||
ar = sr[0];
|
|
||||||
br = sr[1];
|
|
||||||
cr = sr[2];
|
|
||||||
#endif
|
|
||||||
sl += 4;
|
|
||||||
sr += 4;
|
|
||||||
*++dLeft = cl;
|
|
||||||
*++dLeft = bl;
|
|
||||||
*++dLeft = al;
|
|
||||||
*++dRight = cr;
|
|
||||||
*++dRight = br;
|
|
||||||
*++dRight = ar;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------
|
|
||||||
// in place integer conversions
|
|
||||||
|
|
||||||
void ASIOConvertSamples::int32msb16to16inPlace(long *in, long frames)
|
|
||||||
{
|
|
||||||
short *d1 = (short *)in;
|
|
||||||
short* out = d1;
|
|
||||||
#if ASIO_LITTLE_ENDIAN
|
|
||||||
d1++;
|
|
||||||
#endif
|
|
||||||
while(--frames >= 0)
|
|
||||||
{
|
|
||||||
*out++ = *d1;
|
|
||||||
d1 += 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ASIOConvertSamples::int32lsb16to16inPlace(long *in, long frames)
|
|
||||||
{
|
|
||||||
short *d1 = (short *)in;
|
|
||||||
short* out = d1;
|
|
||||||
#if !ASIO_LITTLE_ENDIAN
|
|
||||||
d1++;
|
|
||||||
#endif
|
|
||||||
while(--frames >= 0)
|
|
||||||
{
|
|
||||||
*out++ = *d1;
|
|
||||||
d1 += 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ASIOConvertSamples::int32msb16shiftedTo16inPlace(long *in, long frames, long shift)
|
|
||||||
{
|
|
||||||
short* out = (short*)in;
|
|
||||||
while(--frames >= 0)
|
|
||||||
*out++ = (short)(*in++ >> shift);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ASIOConvertSamples::int24msbto16inPlace(unsigned char *in, long frames)
|
|
||||||
{
|
|
||||||
short a;
|
|
||||||
short* out = (short*)in;
|
|
||||||
while(--frames >= 0)
|
|
||||||
{
|
|
||||||
#if ASIO_LITTLE_ENDIAN
|
|
||||||
a = (short)in[2];
|
|
||||||
a <<= 8;
|
|
||||||
a |= (in[1] & 0xff);
|
|
||||||
#else
|
|
||||||
a = (short)in[0];
|
|
||||||
a <<= 8;
|
|
||||||
a |= (in[1] & 0xff);
|
|
||||||
#endif
|
|
||||||
*out++ = a;
|
|
||||||
in += 3;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
void ASIOConvertSamples::shift32(void* buffer, long shiftAmount, long targetByteWidth,
|
|
||||||
bool revertEndian, long sampleFrames)
|
|
||||||
{
|
|
||||||
long a;
|
|
||||||
long frames = sampleFrames;
|
|
||||||
long* source = (long*)buffer;
|
|
||||||
if(revertEndian)
|
|
||||||
{
|
|
||||||
reverseEndian(buffer, 4, sampleFrames);
|
|
||||||
revertEndian = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(targetByteWidth == 2)
|
|
||||||
{
|
|
||||||
short* dest = (short*)buffer;
|
|
||||||
short* al = (short*)&a;
|
|
||||||
#if ASIO_LITTLE_ENDIAN
|
|
||||||
al++;
|
|
||||||
#endif
|
|
||||||
while(--frames >= 0)
|
|
||||||
{
|
|
||||||
a = *source++;
|
|
||||||
a <<= shiftAmount;
|
|
||||||
*dest++ = *al;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
else if(targetByteWidth == 3)
|
|
||||||
{
|
|
||||||
char* dest = (char*)buffer;
|
|
||||||
long* source = (long*)buffer;
|
|
||||||
char* aa = (char*)&a;
|
|
||||||
while(--frames >= 0)
|
|
||||||
{
|
|
||||||
a = *source++;
|
|
||||||
a <<= shiftAmount;
|
|
||||||
#if ASIO_LITTLE_ENDIAN
|
|
||||||
dest[0] = aa[1]; // lsb
|
|
||||||
dest[1] = aa[2];
|
|
||||||
dest[2] = aa[3]; // msb
|
|
||||||
#else
|
|
||||||
dest[0] = aa[0]; // msb
|
|
||||||
dest[1] = aa[1];
|
|
||||||
dest[2] = aa[2]; // lsb
|
|
||||||
#endif
|
|
||||||
dest += 3;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
else if(targetByteWidth == 4)
|
|
||||||
{
|
|
||||||
long* dest = source;
|
|
||||||
while(--frames >= 0)
|
|
||||||
*dest++ = *source++ << shiftAmount;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ASIOConvertSamples::reverseEndian(void* buffer, long byteWidth, long frames)
|
|
||||||
{
|
|
||||||
char* a = (char*)buffer;
|
|
||||||
char* b = a;
|
|
||||||
char c;
|
|
||||||
if(byteWidth == 2)
|
|
||||||
{
|
|
||||||
while(--frames >= 0)
|
|
||||||
{
|
|
||||||
c = a[0];
|
|
||||||
a[0] = a[1];
|
|
||||||
a[1] = c;
|
|
||||||
a += 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if(byteWidth == 3)
|
|
||||||
{
|
|
||||||
while(--frames >= 0)
|
|
||||||
{
|
|
||||||
c = a[0];
|
|
||||||
a[0] = a[2];
|
|
||||||
a[2] = c;
|
|
||||||
a += 3;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if(byteWidth == 4)
|
|
||||||
{
|
|
||||||
while(--frames >= 0)
|
|
||||||
{
|
|
||||||
c = a[0];
|
|
||||||
a[0] = a[3];
|
|
||||||
a[3] = c;
|
|
||||||
c = a[1];
|
|
||||||
a[1] = a[2];
|
|
||||||
a[2] = c;
|
|
||||||
a += 4;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//-------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
void ASIOConvertSamples::int32to16inPlace(void* buffer, long frames)
|
|
||||||
{
|
|
||||||
short* in = (short*)buffer;
|
|
||||||
short* out = in;
|
|
||||||
#if ASIO_LITTLE_ENDIAN
|
|
||||||
in++;
|
|
||||||
#endif
|
|
||||||
while(--frames >= 0)
|
|
||||||
{
|
|
||||||
*out++ = *in;
|
|
||||||
in += 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ASIOConvertSamples::int24to16inPlace(void* buffer, long frames)
|
|
||||||
{
|
|
||||||
char* from = (char*)buffer;
|
|
||||||
char* to = from;
|
|
||||||
while(--frames >= 0)
|
|
||||||
{
|
|
||||||
#if ASIO_LITTLE_ENDIAN
|
|
||||||
to[0] = from[1];
|
|
||||||
to[1] = from[2];
|
|
||||||
#else
|
|
||||||
to[0] = from[0];
|
|
||||||
to[1] = from[1];
|
|
||||||
#endif
|
|
||||||
from += 3;
|
|
||||||
to += 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ASIOConvertSamples::int32to24inPlace(void* buffer, long frames)
|
|
||||||
{
|
|
||||||
long* in = (long*)buffer;
|
|
||||||
char* out = (char*)buffer;
|
|
||||||
long a;
|
|
||||||
while(--frames >= 0)
|
|
||||||
{
|
|
||||||
a = *in++;
|
|
||||||
a >>= 8; // 32->24
|
|
||||||
#if ASIO_LITTLE_ENDIAN
|
|
||||||
out[0] = (char)a; // lsb
|
|
||||||
a >>= 8;
|
|
||||||
out[1] = (char)a;
|
|
||||||
a >>= 8;
|
|
||||||
out[2] = (char)a;
|
|
||||||
#else
|
|
||||||
out[2] = (char)a; // lsb
|
|
||||||
a >>= 8;
|
|
||||||
out[1] = (char)a;
|
|
||||||
a >>= 8;
|
|
||||||
out[0] = (char)a;
|
|
||||||
#endif
|
|
||||||
out += 3;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ASIOConvertSamples::int16to24inPlace(void* buffer, long frames)
|
|
||||||
{
|
|
||||||
char* in = (char*)buffer;
|
|
||||||
char* out = (char*)buffer;
|
|
||||||
in += frames * 2;
|
|
||||||
out += frames * 3;
|
|
||||||
while(--frames >= 0)
|
|
||||||
{
|
|
||||||
out -= 3;
|
|
||||||
in -= 2;
|
|
||||||
#if ASIO_LITTLE_ENDIAN
|
|
||||||
out[2] = in[1]; // msb
|
|
||||||
out[1] = in[0]; // lsb
|
|
||||||
out[0] = 0;
|
|
||||||
#else
|
|
||||||
out[2] = 0;
|
|
||||||
out[1] = in[1]; // lsb
|
|
||||||
out[0] = in[0]; // msb
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ASIOConvertSamples::int24to32inPlace(void* buffer, long frames)
|
|
||||||
{
|
|
||||||
long a, b, c;
|
|
||||||
char* in = (char*)buffer;
|
|
||||||
long* out = (long*)buffer;
|
|
||||||
in += (frames * 3);
|
|
||||||
out += frames;
|
|
||||||
while(--frames >= 0)
|
|
||||||
{
|
|
||||||
#if ASIO_LITTLE_ENDIAN
|
|
||||||
a = (long)in[-1]; // msb
|
|
||||||
b = (long)in[-2];
|
|
||||||
c = (long)in[-3];
|
|
||||||
#else
|
|
||||||
a = (long)in[-3]; // msb
|
|
||||||
b = (long)in[-2];
|
|
||||||
c = (long)in[-1];
|
|
||||||
#endif
|
|
||||||
a <<= 24;
|
|
||||||
b <<= 16;
|
|
||||||
b &= 0x00ff0000;
|
|
||||||
a |= b;
|
|
||||||
c <<= 8;
|
|
||||||
c &= 0x0000ff00;
|
|
||||||
a |= c;
|
|
||||||
*--out = a;
|
|
||||||
in -= 3;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ASIOConvertSamples::int16to32inPlace(void* buffer, long frames)
|
|
||||||
{
|
|
||||||
short* in = (short*)buffer;
|
|
||||||
long* out = (long*)buffer;
|
|
||||||
in += frames;
|
|
||||||
out += frames;
|
|
||||||
while(--frames >= 0)
|
|
||||||
*--out = ((long)(*--in)) << 16;
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------
|
|
||||||
// float to int
|
|
||||||
|
|
||||||
const double fScaler16 = (double)0x7fffL;
|
|
||||||
const double fScaler24 = (double)0x7fffffL;
|
|
||||||
const double fScaler32 = (double)0x7fffffffL;
|
|
||||||
|
|
||||||
void ASIOConvertSamples::float32toInt16inPlace(float* buffer, long frames)
|
|
||||||
{
|
|
||||||
double sc = fScaler16 + .49999;
|
|
||||||
short* b = (short*)buffer;
|
|
||||||
while(--frames >= 0)
|
|
||||||
*b++ = (short)((double)(*buffer++) * sc);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ASIOConvertSamples::float32toInt24inPlace(float* buffer, long frames)
|
|
||||||
{
|
|
||||||
double sc = fScaler24 + .49999;
|
|
||||||
long a;
|
|
||||||
char* b = (char*)buffer;
|
|
||||||
char* aa = (char*)&a;
|
|
||||||
|
|
||||||
while(--frames >= 0)
|
|
||||||
{
|
|
||||||
a = (long)((double)(*buffer++) * sc);
|
|
||||||
#if ASIO_LITTLE_ENDIAN
|
|
||||||
*b++ = aa[3];
|
|
||||||
*b++ = aa[2];
|
|
||||||
*b++ = aa[1];
|
|
||||||
#else
|
|
||||||
*b++ = aa[1];
|
|
||||||
*b++ = aa[2];
|
|
||||||
*b++ = aa[3];
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ASIOConvertSamples::float32toInt32inPlace(float* buffer, long frames)
|
|
||||||
{
|
|
||||||
double sc = fScaler32 + .49999;
|
|
||||||
long* b = (long*)buffer;
|
|
||||||
while(--frames >= 0)
|
|
||||||
*b++ = (long)((double)(*buffer++) * sc);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,62 +0,0 @@
|
||||||
#ifndef __ASIOConvertSamples__
|
|
||||||
#define __ASIOConvertSamples__
|
|
||||||
|
|
||||||
class ASIOConvertSamples
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
ASIOConvertSamples();
|
|
||||||
~ASIOConvertSamples() {}
|
|
||||||
|
|
||||||
// format converters, input 32 bit integer
|
|
||||||
// mono
|
|
||||||
void convertMono8(long *source, char *dest, long frames);
|
|
||||||
void convertMono8Unsigned(long *source, char *dest, long frames);
|
|
||||||
void convertMono16(long *source, short *dest, long frames);
|
|
||||||
void convertMono16SmallEndian(long *source, short *dest, long frames);
|
|
||||||
void convertMono24(long *source, char *dest, long frames);
|
|
||||||
void convertMono24SmallEndian(long *source, char *dest, long frames);
|
|
||||||
|
|
||||||
// stereo interleaved
|
|
||||||
void convertStereo8Interleaved(long *left, long *right, char *dest, long frames);
|
|
||||||
void convertStereo8InterleavedUnsigned(long *left, long *right, char *dest, long frames);
|
|
||||||
void convertStereo16Interleaved(long *left, long *right, short *dest, long frames);
|
|
||||||
void convertStereo16InterleavedSmallEndian(long *left, long *right, short *dest, long frames);
|
|
||||||
void convertStereo24Interleaved(long *left, long *right, char *dest, long frames);
|
|
||||||
void convertStereo24InterleavedSmallEndian(long *left, long *right, char *dest, long frames);
|
|
||||||
|
|
||||||
// stereo split
|
|
||||||
void convertStereo8(long *left, long *right, char *dLeft, char *dRight, long frames);
|
|
||||||
void convertStereo8Unsigned(long *left, long *right, char *dLeft, char *dRight, long frames);
|
|
||||||
void convertStereo16(long *left, long *right, short *dLeft, short *dRight, long frames);
|
|
||||||
void convertStereo16SmallEndian(long *left, long *right, short *dLeft, short *dRight, long frames);
|
|
||||||
void convertStereo24(long *left, long *right, char *dLeft, char *dRight, long frames);
|
|
||||||
void convertStereo24SmallEndian(long *left, long *right, char *dLeft, char *dRight, long frames);
|
|
||||||
|
|
||||||
// integer in place conversions
|
|
||||||
|
|
||||||
void int32msb16to16inPlace(long *in, long frames);
|
|
||||||
void int32lsb16to16inPlace(long *in, long frames);
|
|
||||||
void int32msb16shiftedTo16inPlace(long *in1, long frames, long shift);
|
|
||||||
void int24msbto16inPlace(unsigned char *in, long frames);
|
|
||||||
|
|
||||||
// integer to integer
|
|
||||||
|
|
||||||
void shift32(void* buffer, long shiftAmount, long targetByteWidth,
|
|
||||||
bool reverseEndian, long frames);
|
|
||||||
void reverseEndian(void* buffer, long byteWidth, long frames);
|
|
||||||
|
|
||||||
void int32to16inPlace(void* buffer, long frames);
|
|
||||||
void int24to16inPlace(void* buffer, long frames);
|
|
||||||
void int32to24inPlace(void* buffer, long frames);
|
|
||||||
void int16to24inPlace(void* buffer, long frames);
|
|
||||||
void int24to32inPlace(void* buffer, long frames);
|
|
||||||
void int16to32inPlace(void* buffer, long frames);
|
|
||||||
|
|
||||||
// float to integer
|
|
||||||
|
|
||||||
void float32toInt16inPlace(float* buffer, long frames);
|
|
||||||
void float32toInt24inPlace(float* buffer, long frames);
|
|
||||||
void float32toInt32inPlace(float* buffer, long frames);
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,186 +0,0 @@
|
||||||
#include <string.h>
|
|
||||||
#include "asiodrivers.h"
|
|
||||||
|
|
||||||
AsioDrivers* asioDrivers = 0;
|
|
||||||
|
|
||||||
bool loadAsioDriver(char *name);
|
|
||||||
|
|
||||||
bool loadAsioDriver(char *name)
|
|
||||||
{
|
|
||||||
if(!asioDrivers)
|
|
||||||
asioDrivers = new AsioDrivers();
|
|
||||||
if(asioDrivers)
|
|
||||||
return asioDrivers->loadDriver(name);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
#if MAC
|
|
||||||
|
|
||||||
bool resolveASIO(unsigned long aconnID);
|
|
||||||
|
|
||||||
AsioDrivers::AsioDrivers() : CodeFragments("ASIO Drivers", 'AsDr', 'Asio')
|
|
||||||
{
|
|
||||||
connID = -1;
|
|
||||||
curIndex = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
AsioDrivers::~AsioDrivers()
|
|
||||||
{
|
|
||||||
removeCurrentDriver();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AsioDrivers::getCurrentDriverName(char *name)
|
|
||||||
{
|
|
||||||
if(curIndex >= 0)
|
|
||||||
return getName(curIndex, name);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
long AsioDrivers::getDriverNames(char **names, long maxDrivers)
|
|
||||||
{
|
|
||||||
for(long i = 0; i < getNumFragments() && i < maxDrivers; i++)
|
|
||||||
getName(i, names[i]);
|
|
||||||
return getNumFragments() < maxDrivers ? getNumFragments() : maxDrivers;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AsioDrivers::loadDriver(char *name)
|
|
||||||
{
|
|
||||||
char dname[64];
|
|
||||||
unsigned long newID;
|
|
||||||
|
|
||||||
for(long i = 0; i < getNumFragments(); i++)
|
|
||||||
{
|
|
||||||
if(getName(i, dname) && !strcmp(name, dname))
|
|
||||||
{
|
|
||||||
if(newInstance(i, &newID))
|
|
||||||
{
|
|
||||||
if(resolveASIO(newID))
|
|
||||||
{
|
|
||||||
if(connID != -1)
|
|
||||||
removeInstance(curIndex, connID);
|
|
||||||
curIndex = i;
|
|
||||||
connID = newID;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void AsioDrivers::removeCurrentDriver()
|
|
||||||
{
|
|
||||||
if(connID != -1)
|
|
||||||
removeInstance(curIndex, connID);
|
|
||||||
connID = -1;
|
|
||||||
curIndex = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
#elif WINDOWS
|
|
||||||
|
|
||||||
#include "iasiodrv.h"
|
|
||||||
|
|
||||||
extern IASIO* theAsioDriver;
|
|
||||||
|
|
||||||
AsioDrivers::AsioDrivers() : AsioDriverList()
|
|
||||||
{
|
|
||||||
curIndex = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
AsioDrivers::~AsioDrivers()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AsioDrivers::getCurrentDriverName(char *name)
|
|
||||||
{
|
|
||||||
if(curIndex >= 0)
|
|
||||||
return asioGetDriverName(curIndex, name, 32) == 0 ? true : false;
|
|
||||||
name[0] = 0;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
long AsioDrivers::getDriverNames(char **names, long maxDrivers)
|
|
||||||
{
|
|
||||||
for(long i = 0; i < asioGetNumDev() && i < maxDrivers; i++)
|
|
||||||
asioGetDriverName(i, names[i], 32);
|
|
||||||
return asioGetNumDev() < maxDrivers ? asioGetNumDev() : maxDrivers;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AsioDrivers::loadDriver(char *name)
|
|
||||||
{
|
|
||||||
char dname[64];
|
|
||||||
char curName[64];
|
|
||||||
|
|
||||||
for(long i = 0; i < asioGetNumDev(); i++)
|
|
||||||
{
|
|
||||||
if(!asioGetDriverName(i, dname, 32) && !strcmp(name, dname))
|
|
||||||
{
|
|
||||||
curName[0] = 0;
|
|
||||||
getCurrentDriverName(curName); // in case we fail...
|
|
||||||
removeCurrentDriver();
|
|
||||||
|
|
||||||
if(!asioOpenDriver(i, (void **)&theAsioDriver))
|
|
||||||
{
|
|
||||||
curIndex = i;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
theAsioDriver = 0;
|
|
||||||
if(curName[0] && strcmp(dname, curName))
|
|
||||||
loadDriver(curName); // try restore
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void AsioDrivers::removeCurrentDriver()
|
|
||||||
{
|
|
||||||
if(curIndex != -1)
|
|
||||||
asioCloseDriver(curIndex);
|
|
||||||
curIndex = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#elif SGI || BEOS
|
|
||||||
|
|
||||||
#include "asiolist.h"
|
|
||||||
|
|
||||||
AsioDrivers::AsioDrivers()
|
|
||||||
: AsioDriverList()
|
|
||||||
{
|
|
||||||
curIndex = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
AsioDrivers::~AsioDrivers()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AsioDrivers::getCurrentDriverName(char *name)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
long AsioDrivers::getDriverNames(char **names, long maxDrivers)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AsioDrivers::loadDriver(char *name)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void AsioDrivers::removeCurrentDriver()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
#error implement me
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,41 +0,0 @@
|
||||||
#ifndef __AsioDrivers__
|
|
||||||
#define __AsioDrivers__
|
|
||||||
|
|
||||||
#include "ginclude.h"
|
|
||||||
|
|
||||||
#if MAC
|
|
||||||
#include "CodeFragments.hpp"
|
|
||||||
|
|
||||||
class AsioDrivers : public CodeFragments
|
|
||||||
|
|
||||||
#elif WINDOWS
|
|
||||||
#include <windows.h>
|
|
||||||
#include "asiolist.h"
|
|
||||||
|
|
||||||
class AsioDrivers : public AsioDriverList
|
|
||||||
|
|
||||||
#elif SGI || BEOS
|
|
||||||
#include "asiolist.h"
|
|
||||||
|
|
||||||
class AsioDrivers : public AsioDriverList
|
|
||||||
|
|
||||||
#else
|
|
||||||
#error implement me
|
|
||||||
#endif
|
|
||||||
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
AsioDrivers();
|
|
||||||
~AsioDrivers();
|
|
||||||
|
|
||||||
bool getCurrentDriverName(char *name);
|
|
||||||
long getDriverNames(char **names, long maxDrivers);
|
|
||||||
bool loadDriver(char *name);
|
|
||||||
void removeCurrentDriver();
|
|
||||||
long getCurrentDriverIndex() {return curIndex;}
|
|
||||||
protected:
|
|
||||||
unsigned long connID;
|
|
||||||
long curIndex;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,38 +0,0 @@
|
||||||
#ifndef __gInclude__
|
|
||||||
#define __gInclude__
|
|
||||||
|
|
||||||
#if SGI
|
|
||||||
#undef BEOS
|
|
||||||
#undef MAC
|
|
||||||
#undef WINDOWS
|
|
||||||
//
|
|
||||||
#define ASIO_BIG_ENDIAN 1
|
|
||||||
#define ASIO_CPU_MIPS 1
|
|
||||||
#elif defined(_WIN32) || defined(_WIN64)
|
|
||||||
#undef BEOS
|
|
||||||
#undef MAC
|
|
||||||
#undef SGI
|
|
||||||
#define WINDOWS 1
|
|
||||||
#define ASIO_LITTLE_ENDIAN 1
|
|
||||||
#define ASIO_CPU_X86 1
|
|
||||||
#elif BEOS
|
|
||||||
#undef MAC
|
|
||||||
#undef SGI
|
|
||||||
#undef WINDOWS
|
|
||||||
#define ASIO_LITTLE_ENDIAN 1
|
|
||||||
#define ASIO_CPU_X86 1
|
|
||||||
//
|
|
||||||
#else
|
|
||||||
#define MAC 1
|
|
||||||
#undef BEOS
|
|
||||||
#undef WINDOWS
|
|
||||||
#undef SGI
|
|
||||||
#define ASIO_BIG_ENDIAN 1
|
|
||||||
#define ASIO_CPU_PPC 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// always
|
|
||||||
#define NATIVE_INT64 0
|
|
||||||
#define IEEE754_64FLOAT 1
|
|
||||||
|
|
||||||
#endif // __gInclude__
|
|
||||||
|
|
@ -1,342 +0,0 @@
|
||||||
// asio code fragment 'linker'
|
|
||||||
// mac specific
|
|
||||||
// loads the symbols via the fragment manager, and
|
|
||||||
// translates them into function pointers. this
|
|
||||||
// means no asio lib must be linked, as the
|
|
||||||
// 'real' asio functions are here
|
|
||||||
|
|
||||||
#include "ginclude.h"
|
|
||||||
#include <macheaders.c>
|
|
||||||
#include <string.h>
|
|
||||||
#include <CodeFragments.h>
|
|
||||||
#include "asio.h"
|
|
||||||
|
|
||||||
// Macro below has to 0 if external drivers will be used.
|
|
||||||
// Can be set to 1 if a specific ASIO driver should be linked into the program
|
|
||||||
#define ASIOINCLUDED 0
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// export
|
|
||||||
bool resolveASIO(unsigned long aconnID);
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------------------
|
|
||||||
// private
|
|
||||||
|
|
||||||
#if ASIOINCLUDED
|
|
||||||
bool resolveASIO(unsigned long aconnID) {aconnID = aconnID; return true;}
|
|
||||||
#else
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
kASIOInit = 0,
|
|
||||||
kASIOExit,
|
|
||||||
kASIOStart,
|
|
||||||
kASIOStop,
|
|
||||||
kASIOGetChannels,
|
|
||||||
kASIOGetLatencies,
|
|
||||||
kASIOGetBufferSize,
|
|
||||||
kASIOCanSampleRate,
|
|
||||||
kASIOGetSampleRate,
|
|
||||||
kASIOSetSampleRate,
|
|
||||||
kASIOGetClockSources,
|
|
||||||
kASIOSetClockSource,
|
|
||||||
kASIOGetSamplePosition,
|
|
||||||
kASIOGetChannelInfo,
|
|
||||||
kASIOCreateBuffers,
|
|
||||||
kASIODisposeBuffers,
|
|
||||||
kASIOControlPanel,
|
|
||||||
kASIOFuture,
|
|
||||||
|
|
||||||
kASIOOutputReady,
|
|
||||||
|
|
||||||
kNumSymbols,
|
|
||||||
kRequiredSymbols = kNumSymbols - 1
|
|
||||||
};
|
|
||||||
|
|
||||||
static char *asioTable[kNumSymbols] =
|
|
||||||
{
|
|
||||||
"ASIOInit",
|
|
||||||
"ASIOExit",
|
|
||||||
"ASIOStart",
|
|
||||||
"ASIOStop",
|
|
||||||
"ASIOGetChannels",
|
|
||||||
"ASIOGetLatencies",
|
|
||||||
"ASIOGetBufferSize",
|
|
||||||
"ASIOCanSampleRate",
|
|
||||||
"ASIOGetSampleRate",
|
|
||||||
"ASIOSetSampleRate",
|
|
||||||
"ASIOGetClockSources",
|
|
||||||
"ASIOSetClockSource",
|
|
||||||
"ASIOGetSamplePosition",
|
|
||||||
"ASIOGetChannelInfo",
|
|
||||||
"ASIOCreateBuffers",
|
|
||||||
"ASIODisposeBuffers",
|
|
||||||
"ASIOControlPanel",
|
|
||||||
"ASIOFuture",
|
|
||||||
"ASIOOutputReady"
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef ASIOError (*fasioInit) (ASIODriverInfo *info);
|
|
||||||
typedef ASIOError (*fasioExit) (void);
|
|
||||||
typedef ASIOError (*fasioStart) (void);
|
|
||||||
typedef ASIOError (*fasioStop) (void);
|
|
||||||
typedef ASIOError (*asioGetChannels) (long *numInputChannels, long *numOutputChannels);
|
|
||||||
typedef ASIOError (*asioGetLatencies) (long *inputLatency, long *outputLatency);
|
|
||||||
typedef ASIOError (*asioGetBufferSize) (long *minSize, long *maxSize, long *preferredSize, long *granularity);
|
|
||||||
typedef ASIOError (*asioCanSampleRate) (ASIOSampleRate sampleRate);
|
|
||||||
typedef ASIOError (*asioGetSampleRate) (ASIOSampleRate *currentRate);
|
|
||||||
typedef ASIOError (*asioSetSampleRate) (ASIOSampleRate sampleRate);
|
|
||||||
typedef ASIOError (*asioGetClockSources) (ASIOClockSource *clocks, long *numSources);
|
|
||||||
typedef ASIOError (*asioSetClockSource) (long reference);
|
|
||||||
typedef ASIOError (*asioGetSamplePosition) (ASIOSamples *sPos, ASIOTimeStamp *tStamp);
|
|
||||||
typedef ASIOError (*asioGetChannelInfo) (ASIOChannelInfo *info);
|
|
||||||
typedef ASIOError (*asioCreateBuffers) (ASIOBufferInfo *channelInfos, long numChannels,
|
|
||||||
long bufferSize, ASIOCallbacks *callbacks);
|
|
||||||
typedef ASIOError (*asioDisposeBuffers) (void);
|
|
||||||
typedef ASIOError (*asioControlPanel) (void);
|
|
||||||
typedef ASIOError (*asioFuture)(long selector, void *opt);
|
|
||||||
typedef ASIOError (*asioOutputReady) (void);
|
|
||||||
|
|
||||||
static void *functionTable[kNumSymbols] = {0};
|
|
||||||
static bool inited = false;
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
#include <CodeFragments.h>
|
|
||||||
|
|
||||||
bool resolveASIO(unsigned long aconnID)
|
|
||||||
{
|
|
||||||
OSErr err;
|
|
||||||
CFragConnectionID connID = (CFragConnectionID)aconnID;
|
|
||||||
CFragSymbolClass symClass;
|
|
||||||
Ptr symAddr = nil;
|
|
||||||
Str255 myName;
|
|
||||||
long myCount = 0;
|
|
||||||
|
|
||||||
err = CountSymbols(connID, &myCount);
|
|
||||||
if(err != noErr || myCount < (kRequiredSymbols + 1)) // there must be a main()
|
|
||||||
return false;
|
|
||||||
|
|
||||||
long n, c = 0;
|
|
||||||
for(n = kRequiredSymbols; n < kNumSymbols; n++)
|
|
||||||
functionTable[n] = 0;
|
|
||||||
for(n = 0; n < myCount; n++)
|
|
||||||
{
|
|
||||||
// we can't use FindSymbol(), as the compiler adds mangling
|
|
||||||
// (such as ASIOInit__Fv). also, the symbols don't appear
|
|
||||||
// in the order they are declared or implemented.
|
|
||||||
// so we use strncmp()
|
|
||||||
err = GetIndSymbol(connID, n, myName, &symAddr, &symClass);
|
|
||||||
if(err != noErr)
|
|
||||||
break;
|
|
||||||
PtoCstr(myName);
|
|
||||||
if(!strncmp((char *)myName, "main", 4L))
|
|
||||||
c++;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
for(long i = 0; i < kNumSymbols; i++)
|
|
||||||
{
|
|
||||||
long sc = strlen(asioTable[i]);
|
|
||||||
if(!strncmp((char *)myName, asioTable[i], sc))
|
|
||||||
{
|
|
||||||
functionTable[i] = symAddr;
|
|
||||||
if(i < kRequiredSymbols)
|
|
||||||
c++;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// if(c >= kNumSymbols + 1)
|
|
||||||
// break;
|
|
||||||
}
|
|
||||||
if(c >= kRequiredSymbols + 1)
|
|
||||||
{
|
|
||||||
inited = true;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------
|
|
||||||
//---------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
#pragma export on
|
|
||||||
|
|
||||||
static short curRes = 0;
|
|
||||||
#define saveRes() curRes = CurResFile()
|
|
||||||
#define restRes() UseResFile(curRes);
|
|
||||||
|
|
||||||
|
|
||||||
ASIOError ASIOInit(ASIODriverInfo *info)
|
|
||||||
{
|
|
||||||
saveRes();
|
|
||||||
strcpy(info->errorMessage, "No ASIO Driver could be Loaded!");
|
|
||||||
if(!inited)
|
|
||||||
return ASE_NotPresent;
|
|
||||||
fasioInit f = (fasioInit)functionTable[kASIOInit];
|
|
||||||
ASIOError e = (*f)(info);
|
|
||||||
restRes();
|
|
||||||
return e;
|
|
||||||
}
|
|
||||||
|
|
||||||
ASIOError ASIOExit(void)
|
|
||||||
{
|
|
||||||
if(!inited)
|
|
||||||
return ASE_NotPresent;
|
|
||||||
saveRes();
|
|
||||||
fasioExit f = (fasioExit)functionTable[kASIOExit];
|
|
||||||
ASIOError e = (*f)();
|
|
||||||
restRes();
|
|
||||||
return e;
|
|
||||||
}
|
|
||||||
|
|
||||||
ASIOError ASIOStart(void)
|
|
||||||
{
|
|
||||||
if(!inited)
|
|
||||||
return ASE_NotPresent;
|
|
||||||
fasioStart f = (fasioStart)functionTable[kASIOStart];
|
|
||||||
return (*f)();
|
|
||||||
}
|
|
||||||
|
|
||||||
ASIOError ASIOStop(void)
|
|
||||||
{
|
|
||||||
if(!inited)
|
|
||||||
return ASE_NotPresent;
|
|
||||||
fasioStop f = (fasioStop)functionTable[kASIOStop];
|
|
||||||
return (*f)();
|
|
||||||
}
|
|
||||||
|
|
||||||
ASIOError ASIOGetChannels(long *numInputChannels, long *numOutputChannels)
|
|
||||||
{
|
|
||||||
if(!inited)
|
|
||||||
return ASE_NotPresent;
|
|
||||||
asioGetChannels f = (asioGetChannels)functionTable[kASIOGetChannels];
|
|
||||||
return (*f)(numInputChannels, numOutputChannels);
|
|
||||||
}
|
|
||||||
|
|
||||||
ASIOError ASIOGetLatencies(long *inputLatency, long *outputLatency)
|
|
||||||
{
|
|
||||||
if(!inited)
|
|
||||||
return ASE_NotPresent;
|
|
||||||
asioGetLatencies f = (asioGetLatencies)functionTable[kASIOGetLatencies];
|
|
||||||
return (*f)(inputLatency, outputLatency);
|
|
||||||
}
|
|
||||||
|
|
||||||
ASIOError ASIOGetBufferSize(long *minSize, long *maxSize, long *preferredSize, long *granularity)
|
|
||||||
{
|
|
||||||
if(!inited)
|
|
||||||
return ASE_NotPresent;
|
|
||||||
asioGetBufferSize f = (asioGetBufferSize)functionTable[kASIOGetBufferSize];
|
|
||||||
return (*f)(minSize, maxSize, preferredSize, granularity);
|
|
||||||
}
|
|
||||||
|
|
||||||
ASIOError ASIOCanSampleRate(ASIOSampleRate sampleRate)
|
|
||||||
{
|
|
||||||
if(!inited)
|
|
||||||
return ASE_NotPresent;
|
|
||||||
asioCanSampleRate f = (asioCanSampleRate)functionTable[kASIOCanSampleRate];
|
|
||||||
return (*f)(sampleRate);
|
|
||||||
}
|
|
||||||
|
|
||||||
ASIOError ASIOGetSampleRate(ASIOSampleRate *currentRate)
|
|
||||||
{
|
|
||||||
if(!inited)
|
|
||||||
return ASE_NotPresent;
|
|
||||||
asioGetSampleRate f = (asioGetSampleRate)functionTable[kASIOGetSampleRate];
|
|
||||||
return (*f)(currentRate);
|
|
||||||
}
|
|
||||||
|
|
||||||
ASIOError ASIOSetSampleRate(ASIOSampleRate sampleRate)
|
|
||||||
{
|
|
||||||
if(!inited)
|
|
||||||
return ASE_NotPresent;
|
|
||||||
asioSetSampleRate f = (asioSetSampleRate)functionTable[kASIOSetSampleRate];
|
|
||||||
return (*f)(sampleRate);
|
|
||||||
}
|
|
||||||
|
|
||||||
ASIOError ASIOGetClockSources(ASIOClockSource *clocks, long *numSources)
|
|
||||||
{
|
|
||||||
if(!inited)
|
|
||||||
return ASE_NotPresent;
|
|
||||||
asioGetClockSources f = (asioGetClockSources)functionTable[kASIOGetClockSources];
|
|
||||||
return (*f)(clocks, numSources);
|
|
||||||
}
|
|
||||||
|
|
||||||
ASIOError ASIOSetClockSource(long reference)
|
|
||||||
{
|
|
||||||
if(!inited)
|
|
||||||
return ASE_NotPresent;
|
|
||||||
asioSetClockSource f = (asioSetClockSource)functionTable[kASIOSetClockSource];
|
|
||||||
return (*f)(reference);
|
|
||||||
}
|
|
||||||
|
|
||||||
ASIOError ASIOGetSamplePosition(ASIOSamples *sPos, ASIOTimeStamp *tStamp)
|
|
||||||
{
|
|
||||||
if(!inited)
|
|
||||||
return ASE_NotPresent;
|
|
||||||
asioGetSamplePosition f = (asioGetSamplePosition)functionTable[kASIOGetSamplePosition];
|
|
||||||
return (*f)(sPos, tStamp);
|
|
||||||
}
|
|
||||||
|
|
||||||
ASIOError ASIOGetChannelInfo(ASIOChannelInfo *info)
|
|
||||||
{
|
|
||||||
if(!inited)
|
|
||||||
return ASE_NotPresent;
|
|
||||||
asioGetChannelInfo f = (asioGetChannelInfo)functionTable[kASIOGetChannelInfo];
|
|
||||||
return (*f)(info);
|
|
||||||
}
|
|
||||||
|
|
||||||
ASIOError ASIOCreateBuffers(ASIOBufferInfo *channelInfos, long numChannels, long bufferSize, ASIOCallbacks *callbacks)
|
|
||||||
{
|
|
||||||
if(!inited)
|
|
||||||
return ASE_NotPresent;
|
|
||||||
saveRes();
|
|
||||||
asioCreateBuffers f = (asioCreateBuffers)functionTable[kASIOCreateBuffers];
|
|
||||||
ASIOError e = (*f)(channelInfos, numChannels, bufferSize, callbacks);
|
|
||||||
restRes();
|
|
||||||
return e;
|
|
||||||
}
|
|
||||||
|
|
||||||
ASIOError ASIODisposeBuffers(void)
|
|
||||||
{
|
|
||||||
if(!inited)
|
|
||||||
return ASE_NotPresent;
|
|
||||||
asioDisposeBuffers f = (asioDisposeBuffers)functionTable[kASIODisposeBuffers];
|
|
||||||
return (*f)();
|
|
||||||
}
|
|
||||||
|
|
||||||
ASIOError ASIOControlPanel(void)
|
|
||||||
{
|
|
||||||
if(!inited)
|
|
||||||
return ASE_NotPresent;
|
|
||||||
saveRes();
|
|
||||||
asioControlPanel f = (asioControlPanel)functionTable[kASIOControlPanel];
|
|
||||||
ASIOError e = (*f)();
|
|
||||||
restRes();
|
|
||||||
return e;
|
|
||||||
}
|
|
||||||
|
|
||||||
ASIOError ASIOFuture(long selector, void *opt)
|
|
||||||
{
|
|
||||||
if(!inited)
|
|
||||||
return 0;
|
|
||||||
saveRes();
|
|
||||||
asioFuture f = (asioFuture)functionTable[kASIOFuture];
|
|
||||||
ASIOError e = (*f)(selector, opt);
|
|
||||||
restRes();
|
|
||||||
return e;
|
|
||||||
}
|
|
||||||
|
|
||||||
ASIOError ASIOOutputReady(void)
|
|
||||||
{
|
|
||||||
asioOutputReady f = (asioControlPanel)functionTable[kASIOOutputReady];
|
|
||||||
if(!inited || !f)
|
|
||||||
return ASE_NotPresent;
|
|
||||||
return (*f)();
|
|
||||||
}
|
|
||||||
|
|
||||||
#pragma export off
|
|
||||||
|
|
||||||
#endif // ASIOINCLUDED
|
|
||||||
|
|
||||||
|
|
@ -1,349 +0,0 @@
|
||||||
// very MAC specific; generic code fragment handler
|
|
||||||
#include "ginclude.h"
|
|
||||||
#include <macheaders.c>
|
|
||||||
#include <string.h>
|
|
||||||
#include <Files.h>
|
|
||||||
#include <CodeFragments.h>
|
|
||||||
#include "CodeFragments.hpp"
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
kNewCFragCopy = kPrivateCFragCopy
|
|
||||||
};
|
|
||||||
|
|
||||||
class CodeFragmentInstance
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
friend class CodeFragment;
|
|
||||||
CodeFragmentInstance() {next = 0; handle = 0; connID = (void*)-1;}
|
|
||||||
~CodeFragmentInstance() {CloseConnection((CFragConnectionID*)&connID); DisposeHandle(handle);}
|
|
||||||
|
|
||||||
CodeFragmentInstance *next;
|
|
||||||
Handle handle;
|
|
||||||
void* connID;
|
|
||||||
};
|
|
||||||
|
|
||||||
class CodeFragment
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
CodeFragment();
|
|
||||||
~CodeFragment();
|
|
||||||
|
|
||||||
bool newInstance(void** cID);
|
|
||||||
void removeInstance(void* id);
|
|
||||||
bool getName(char *name) {if(!resName[0]) return false; strcpy(name, resName); return true;}
|
|
||||||
|
|
||||||
private:
|
|
||||||
friend class CodeFragments;
|
|
||||||
|
|
||||||
CodeFragment *next;
|
|
||||||
CodeFragmentInstance *root;
|
|
||||||
Handle handle;
|
|
||||||
long numInstances;
|
|
||||||
long index;
|
|
||||||
char resName[64];
|
|
||||||
};
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
CodeFragment::CodeFragment()
|
|
||||||
{
|
|
||||||
next = 0;
|
|
||||||
root = 0;
|
|
||||||
handle = 0;
|
|
||||||
numInstances = 0;
|
|
||||||
index = 0;
|
|
||||||
resName[0] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
CodeFragment::~CodeFragment()
|
|
||||||
{
|
|
||||||
// could delete all instances
|
|
||||||
// rather omit it...
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CodeFragment::newInstance(void** cID)
|
|
||||||
{
|
|
||||||
Ptr myMainAddr;
|
|
||||||
Str255 myErrName;
|
|
||||||
char pname[256];
|
|
||||||
|
|
||||||
*cID = (void*)-1;
|
|
||||||
if(!handle)
|
|
||||||
return false;
|
|
||||||
CodeFragmentInstance *c = new CodeFragmentInstance();
|
|
||||||
if(!c)
|
|
||||||
return false;
|
|
||||||
c->handle = this->handle;
|
|
||||||
OSErr err = HandToHand(&c->handle);
|
|
||||||
if(err == noErr)
|
|
||||||
{
|
|
||||||
// use fragment loader
|
|
||||||
myMainAddr = 0;
|
|
||||||
strcpy(pname, resName);
|
|
||||||
CtoPstr(pname);
|
|
||||||
err = GetMemFragment(*handle, GetHandleSize(handle),
|
|
||||||
(unsigned char *)pname, kNewCFragCopy, (CFragConnectionID*)&c->connID,
|
|
||||||
&myMainAddr, myErrName);
|
|
||||||
if(err == noErr && myMainAddr)
|
|
||||||
{
|
|
||||||
if(!root)
|
|
||||||
root = c;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
CodeFragmentInstance *cc = root;
|
|
||||||
while(cc->next)
|
|
||||||
cc = cc->next;
|
|
||||||
cc->next = c;
|
|
||||||
}
|
|
||||||
numInstances++;
|
|
||||||
*cID = c->connID;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CodeFragment::removeInstance(void* id)
|
|
||||||
{
|
|
||||||
CodeFragmentInstance *c = root, *last = root;
|
|
||||||
while(c)
|
|
||||||
{
|
|
||||||
if(c->connID == id)
|
|
||||||
{
|
|
||||||
if(c == root)
|
|
||||||
root = root->next;
|
|
||||||
else
|
|
||||||
last->next = c->next;
|
|
||||||
delete c;
|
|
||||||
numInstances--;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
last = c;
|
|
||||||
c = c->next;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------------
|
|
||||||
//----------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
CodeFragments::CodeFragments(char *folderName, long fileType, long resType)
|
|
||||||
{
|
|
||||||
root = 0;
|
|
||||||
numFragments = 0;
|
|
||||||
gARefNum = -1;
|
|
||||||
|
|
||||||
if(setFolder(folderName))
|
|
||||||
{
|
|
||||||
loadFragments(gARefNum, fileType, resType);
|
|
||||||
SetVol(0L, defVol);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
CodeFragments::~CodeFragments()
|
|
||||||
{
|
|
||||||
while(root)
|
|
||||||
{
|
|
||||||
CodeFragment *c = root->next;
|
|
||||||
delete root;
|
|
||||||
root = c;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CodeFragments::newInstance(long index, unsigned long* cID)
|
|
||||||
{
|
|
||||||
*cID = -1;
|
|
||||||
CodeFragment *c = root;
|
|
||||||
while(c)
|
|
||||||
{
|
|
||||||
if(c->index == index)
|
|
||||||
return c->newInstance((void**)cID);
|
|
||||||
c = c->next;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CodeFragments::removeInstance(long index, unsigned long cID)
|
|
||||||
{
|
|
||||||
CodeFragment *c = root;
|
|
||||||
while(c)
|
|
||||||
{
|
|
||||||
if(c->index == index)
|
|
||||||
{
|
|
||||||
c->removeInstance((void*)cID);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
c = c->next;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CodeFragments::getName(long index, char *name)
|
|
||||||
{
|
|
||||||
CodeFragment *c = root;
|
|
||||||
while(c)
|
|
||||||
{
|
|
||||||
if(c->index == index)
|
|
||||||
{
|
|
||||||
strcpy(name, c->resName);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
c = c->next;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------
|
|
||||||
// private
|
|
||||||
|
|
||||||
void CodeFragments::loadFragments(short folderRef, long fileType, long resType)
|
|
||||||
{
|
|
||||||
Str255 fileName;
|
|
||||||
HFileParam parmblock;
|
|
||||||
short resRef,index = 1,lindex;
|
|
||||||
short resID;
|
|
||||||
ResType resourceType;
|
|
||||||
Str255 resName;
|
|
||||||
Handle h;
|
|
||||||
short curResFile = CurResFile();
|
|
||||||
|
|
||||||
while(true)
|
|
||||||
{
|
|
||||||
// find any file in the folder
|
|
||||||
memset (&parmblock,0,(long)sizeof(HFileParam));
|
|
||||||
parmblock.ioNamePtr = fileName;
|
|
||||||
parmblock.ioVRefNum = folderRef;
|
|
||||||
parmblock.ioFDirIndex = index;
|
|
||||||
if(PBHGetFInfoSync ((HParmBlkPtr)&parmblock) != noErr)
|
|
||||||
break;
|
|
||||||
|
|
||||||
// see if the file type matches
|
|
||||||
if(parmblock.ioFlFndrInfo.fdType == fileType)
|
|
||||||
{
|
|
||||||
resRef = OpenResFile(fileName);
|
|
||||||
if(ResError()==noErr)
|
|
||||||
{
|
|
||||||
UseResFile(resRef);
|
|
||||||
lindex = 1;
|
|
||||||
// search resources in the file found which match
|
|
||||||
while(true)
|
|
||||||
{
|
|
||||||
h = Get1IndResource(resType, lindex);
|
|
||||||
if(h)
|
|
||||||
{
|
|
||||||
CodeFragment *c = new CodeFragment;
|
|
||||||
if(!root)
|
|
||||||
root = c;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
CodeFragment *cc = root;
|
|
||||||
while(cc->next)
|
|
||||||
cc = cc->next;
|
|
||||||
cc->next = c;
|
|
||||||
}
|
|
||||||
GetResInfo(h, &resID, &resourceType, resName);
|
|
||||||
// PtoCstr(fileName);
|
|
||||||
// strcpy(c->fileName, (char *)fileName);
|
|
||||||
PtoCstr(resName);
|
|
||||||
strcpy(c->resName, (char*)resName);
|
|
||||||
DetachResource(h);
|
|
||||||
HLockHi(h);
|
|
||||||
c->handle = h;
|
|
||||||
c->index = numFragments;
|
|
||||||
numFragments++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
break;
|
|
||||||
lindex++;
|
|
||||||
}
|
|
||||||
CloseResFile(resRef);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
index++;
|
|
||||||
}
|
|
||||||
UseResFile(curResFile);
|
|
||||||
}
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
bool CodeFragments::setFolder(char *folderName)
|
|
||||||
{
|
|
||||||
FSSpec fss;
|
|
||||||
|
|
||||||
if(gARefNum == -1)
|
|
||||||
{
|
|
||||||
if(!getFrontProcessDirectory(&fss))
|
|
||||||
return false;
|
|
||||||
if(!openFragmentFolder(&fss, folderName, &gARefNum))
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
defVol = getDefVol();
|
|
||||||
SetVol(0L, gARefNum);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CodeFragments::getFrontProcessDirectory(void *specs)
|
|
||||||
{
|
|
||||||
FSSpec *fss = (FSSpec *)specs;
|
|
||||||
ProcessInfoRec pif;
|
|
||||||
ProcessSerialNumber psn;
|
|
||||||
|
|
||||||
memset(&psn,0,(long)sizeof(ProcessSerialNumber));
|
|
||||||
if(GetFrontProcess(&psn) == noErr)
|
|
||||||
{
|
|
||||||
pif.processName = 0; //(StringPtr)name;
|
|
||||||
pif.processAppSpec = fss;
|
|
||||||
pif.processInfoLength = sizeof(ProcessInfoRec);
|
|
||||||
if(GetProcessInformation(&psn, &pif) == noErr)
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CodeFragments::openFragmentFolder(void *specs, char *foldername, short *found_vref)
|
|
||||||
{
|
|
||||||
FSSpec *fss = (FSSpec *)specs;
|
|
||||||
WDPBRec funcparms,homefolder;
|
|
||||||
HFileInfo my_funcfolder;
|
|
||||||
char funcFolder_name[32];
|
|
||||||
|
|
||||||
*found_vref = -1;
|
|
||||||
strcpy(funcFolder_name,foldername);
|
|
||||||
CtoPstr(funcFolder_name);
|
|
||||||
|
|
||||||
memset (&homefolder,0,(long)sizeof(WDPBRec));
|
|
||||||
homefolder.ioVRefNum = fss->vRefNum;
|
|
||||||
homefolder.ioWDDirID = fss->parID;
|
|
||||||
if(PBOpenWDSync(&homefolder) != noErr)
|
|
||||||
return false;
|
|
||||||
memset(&my_funcfolder,0,(long)sizeof(CInfoPBRec));
|
|
||||||
my_funcfolder.ioNamePtr = (StringPtr)funcFolder_name;
|
|
||||||
my_funcfolder.ioVRefNum = homefolder.ioVRefNum;
|
|
||||||
if(PBGetCatInfoSync((CInfoPBPtr)&my_funcfolder) != noErr)
|
|
||||||
{
|
|
||||||
PBCloseWDSync(&homefolder);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
memset (&funcparms,0,(long)sizeof(WDPBRec));
|
|
||||||
funcparms.ioWDProcID = 'stCA';
|
|
||||||
funcparms.ioVRefNum = my_funcfolder.ioVRefNum;
|
|
||||||
funcparms.ioWDDirID = my_funcfolder.ioDirID;
|
|
||||||
if(PBOpenWDSync(&funcparms) != noErr)
|
|
||||||
{
|
|
||||||
PBCloseWDSync(&homefolder);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
PBCloseWDSync(&homefolder);
|
|
||||||
*found_vref = funcparms.ioVRefNum;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
short CodeFragments::getDefVol()
|
|
||||||
{
|
|
||||||
unsigned char text[32];
|
|
||||||
short vol_ref = 0;
|
|
||||||
|
|
||||||
*text=0;
|
|
||||||
if(GetVol(text, &vol_ref) == noErr)
|
|
||||||
return (vol_ref);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
@ -1,30 +0,0 @@
|
||||||
#ifndef __CodeFragments__
|
|
||||||
#define __CodeFragments__
|
|
||||||
|
|
||||||
class CodeFragment;
|
|
||||||
|
|
||||||
class CodeFragments
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
CodeFragments(char *folderName, long fileType, long resType);
|
|
||||||
~CodeFragments();
|
|
||||||
|
|
||||||
long getNumFragments() {return numFragments;}
|
|
||||||
bool newInstance(long index, unsigned long *cID);
|
|
||||||
void removeInstance(long index, unsigned long cID);
|
|
||||||
bool getName(long index, char *name);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
void loadFragments(short folderRef, long fileType, long resType);
|
|
||||||
bool setFolder(char *folderName);
|
|
||||||
bool openFragmentFolder(void *specs, char *foldername, short *found_vref);
|
|
||||||
bool getFrontProcessDirectory(void *specs);
|
|
||||||
short getDefVol();
|
|
||||||
|
|
||||||
CodeFragment *root;
|
|
||||||
long numFragments;
|
|
||||||
short gARefNum;
|
|
||||||
short defVol;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,268 +0,0 @@
|
||||||
#include <windows.h>
|
|
||||||
#include "iasiodrv.h"
|
|
||||||
#include "asiolist.h"
|
|
||||||
|
|
||||||
#define ASIODRV_DESC "description"
|
|
||||||
#define INPROC_SERVER "InprocServer32"
|
|
||||||
#define ASIO_PATH "software\\asio"
|
|
||||||
#define COM_CLSID "clsid"
|
|
||||||
|
|
||||||
// ******************************************************************
|
|
||||||
// Local Functions
|
|
||||||
// ******************************************************************
|
|
||||||
static LONG findDrvPath (char *clsidstr,char *dllpath,int dllpathsize)
|
|
||||||
{
|
|
||||||
HKEY hkEnum,hksub,hkpath;
|
|
||||||
char databuf[512];
|
|
||||||
LONG cr,rc = -1;
|
|
||||||
DWORD datatype,datasize;
|
|
||||||
DWORD index;
|
|
||||||
OFSTRUCT ofs;
|
|
||||||
HFILE hfile;
|
|
||||||
BOOL found = FALSE;
|
|
||||||
|
|
||||||
CharLowerBuff(clsidstr,strlen(clsidstr));
|
|
||||||
if ((cr = RegOpenKey(HKEY_CLASSES_ROOT,COM_CLSID,&hkEnum)) == ERROR_SUCCESS) {
|
|
||||||
|
|
||||||
index = 0;
|
|
||||||
while (cr == ERROR_SUCCESS && !found) {
|
|
||||||
cr = RegEnumKey(hkEnum,index++,(LPTSTR)databuf,512);
|
|
||||||
if (cr == ERROR_SUCCESS) {
|
|
||||||
CharLowerBuff(databuf,strlen(databuf));
|
|
||||||
if (!(strcmp(databuf,clsidstr))) {
|
|
||||||
if ((cr = RegOpenKeyEx(hkEnum,(LPCTSTR)databuf,0,KEY_READ,&hksub)) == ERROR_SUCCESS) {
|
|
||||||
if ((cr = RegOpenKeyEx(hksub,(LPCTSTR)INPROC_SERVER,0,KEY_READ,&hkpath)) == ERROR_SUCCESS) {
|
|
||||||
datatype = REG_SZ; datasize = (DWORD)dllpathsize;
|
|
||||||
cr = RegQueryValueEx(hkpath,0,0,&datatype,(LPBYTE)dllpath,&datasize);
|
|
||||||
if (cr == ERROR_SUCCESS) {
|
|
||||||
memset(&ofs,0,sizeof(OFSTRUCT));
|
|
||||||
ofs.cBytes = sizeof(OFSTRUCT);
|
|
||||||
hfile = OpenFile(dllpath,&ofs,OF_EXIST);
|
|
||||||
if (hfile) rc = 0;
|
|
||||||
}
|
|
||||||
RegCloseKey(hkpath);
|
|
||||||
}
|
|
||||||
RegCloseKey(hksub);
|
|
||||||
}
|
|
||||||
found = TRUE; // break out
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
RegCloseKey(hkEnum);
|
|
||||||
}
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static LPASIODRVSTRUCT newDrvStruct (HKEY hkey,char *keyname,int drvID,LPASIODRVSTRUCT lpdrv)
|
|
||||||
{
|
|
||||||
HKEY hksub;
|
|
||||||
char databuf[256];
|
|
||||||
char dllpath[MAXPATHLEN];
|
|
||||||
WORD wData[100];
|
|
||||||
CLSID clsid;
|
|
||||||
DWORD datatype,datasize;
|
|
||||||
LONG cr,rc;
|
|
||||||
|
|
||||||
if (!lpdrv) {
|
|
||||||
if ((cr = RegOpenKeyEx(hkey,(LPCTSTR)keyname,0,KEY_READ,&hksub)) == ERROR_SUCCESS) {
|
|
||||||
|
|
||||||
datatype = REG_SZ; datasize = 256;
|
|
||||||
cr = RegQueryValueEx(hksub,COM_CLSID,0,&datatype,(LPBYTE)databuf,&datasize);
|
|
||||||
if (cr == ERROR_SUCCESS) {
|
|
||||||
rc = findDrvPath (databuf,dllpath,MAXPATHLEN);
|
|
||||||
if (rc == 0) {
|
|
||||||
lpdrv = new ASIODRVSTRUCT[1];
|
|
||||||
if (lpdrv) {
|
|
||||||
memset(lpdrv,0,sizeof(ASIODRVSTRUCT));
|
|
||||||
lpdrv->drvID = drvID;
|
|
||||||
MultiByteToWideChar(CP_ACP,0,(LPCSTR)databuf,-1,(LPWSTR)wData,100);
|
|
||||||
if ((cr = CLSIDFromString((LPOLESTR)wData,(LPCLSID)&clsid)) == S_OK) {
|
|
||||||
memcpy(&lpdrv->clsid,&clsid,sizeof(CLSID));
|
|
||||||
}
|
|
||||||
|
|
||||||
datatype = REG_SZ; datasize = 256;
|
|
||||||
cr = RegQueryValueEx(hksub,ASIODRV_DESC,0,&datatype,(LPBYTE)databuf,&datasize);
|
|
||||||
if (cr == ERROR_SUCCESS) {
|
|
||||||
strcpy(lpdrv->drvname,databuf);
|
|
||||||
}
|
|
||||||
else strcpy(lpdrv->drvname,keyname);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
RegCloseKey(hksub);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else lpdrv->next = newDrvStruct(hkey,keyname,drvID+1,lpdrv->next);
|
|
||||||
|
|
||||||
return lpdrv;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void deleteDrvStruct (LPASIODRVSTRUCT lpdrv)
|
|
||||||
{
|
|
||||||
IASIO *iasio;
|
|
||||||
|
|
||||||
if (lpdrv != 0) {
|
|
||||||
deleteDrvStruct(lpdrv->next);
|
|
||||||
if (lpdrv->asiodrv) {
|
|
||||||
iasio = (IASIO *)lpdrv->asiodrv;
|
|
||||||
iasio->Release();
|
|
||||||
}
|
|
||||||
delete lpdrv;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static LPASIODRVSTRUCT getDrvStruct (int drvID,LPASIODRVSTRUCT lpdrv)
|
|
||||||
{
|
|
||||||
while (lpdrv) {
|
|
||||||
if (lpdrv->drvID == drvID) return lpdrv;
|
|
||||||
lpdrv = lpdrv->next;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
// ******************************************************************
|
|
||||||
|
|
||||||
|
|
||||||
// ******************************************************************
|
|
||||||
// AsioDriverList
|
|
||||||
// ******************************************************************
|
|
||||||
AsioDriverList::AsioDriverList ()
|
|
||||||
{
|
|
||||||
HKEY hkEnum = 0;
|
|
||||||
char keyname[MAXDRVNAMELEN];
|
|
||||||
LPASIODRVSTRUCT pdl;
|
|
||||||
LONG cr;
|
|
||||||
DWORD index = 0;
|
|
||||||
BOOL fin = FALSE;
|
|
||||||
|
|
||||||
numdrv = 0;
|
|
||||||
lpdrvlist = 0;
|
|
||||||
|
|
||||||
cr = RegOpenKey(HKEY_LOCAL_MACHINE,ASIO_PATH,&hkEnum);
|
|
||||||
while (cr == ERROR_SUCCESS) {
|
|
||||||
if ((cr = RegEnumKey(hkEnum,index++,(LPTSTR)keyname,MAXDRVNAMELEN))== ERROR_SUCCESS) {
|
|
||||||
lpdrvlist = newDrvStruct (hkEnum,keyname,0,lpdrvlist);
|
|
||||||
}
|
|
||||||
else fin = TRUE;
|
|
||||||
}
|
|
||||||
if (hkEnum) RegCloseKey(hkEnum);
|
|
||||||
|
|
||||||
pdl = lpdrvlist;
|
|
||||||
while (pdl) {
|
|
||||||
numdrv++;
|
|
||||||
pdl = pdl->next;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (numdrv) CoInitialize(0); // initialize COM
|
|
||||||
}
|
|
||||||
|
|
||||||
AsioDriverList::~AsioDriverList ()
|
|
||||||
{
|
|
||||||
if (numdrv) {
|
|
||||||
deleteDrvStruct(lpdrvlist);
|
|
||||||
CoUninitialize();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
LONG AsioDriverList::asioGetNumDev (VOID)
|
|
||||||
{
|
|
||||||
return (LONG)numdrv;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
LONG AsioDriverList::asioOpenDriver (int drvID,LPVOID *asiodrv)
|
|
||||||
{
|
|
||||||
LPASIODRVSTRUCT lpdrv = 0;
|
|
||||||
long rc;
|
|
||||||
|
|
||||||
if (!asiodrv) return DRVERR_INVALID_PARAM;
|
|
||||||
|
|
||||||
if ((lpdrv = getDrvStruct(drvID,lpdrvlist)) != 0) {
|
|
||||||
if (!lpdrv->asiodrv) {
|
|
||||||
rc = CoCreateInstance(lpdrv->clsid,0,CLSCTX_INPROC_SERVER,lpdrv->clsid,asiodrv);
|
|
||||||
if (rc == S_OK) {
|
|
||||||
lpdrv->asiodrv = *asiodrv;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
// else if (rc == REGDB_E_CLASSNOTREG)
|
|
||||||
// strcpy (info->messageText, "Driver not registered in the Registration Database!");
|
|
||||||
}
|
|
||||||
else rc = DRVERR_DEVICE_ALREADY_OPEN;
|
|
||||||
}
|
|
||||||
else rc = DRVERR_DEVICE_NOT_FOUND;
|
|
||||||
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
LONG AsioDriverList::asioCloseDriver (int drvID)
|
|
||||||
{
|
|
||||||
LPASIODRVSTRUCT lpdrv = 0;
|
|
||||||
IASIO *iasio;
|
|
||||||
|
|
||||||
if ((lpdrv = getDrvStruct(drvID,lpdrvlist)) != 0) {
|
|
||||||
if (lpdrv->asiodrv) {
|
|
||||||
iasio = (IASIO *)lpdrv->asiodrv;
|
|
||||||
iasio->Release();
|
|
||||||
lpdrv->asiodrv = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
LONG AsioDriverList::asioGetDriverName (int drvID,char *drvname,int drvnamesize)
|
|
||||||
{
|
|
||||||
LPASIODRVSTRUCT lpdrv = 0;
|
|
||||||
|
|
||||||
if (!drvname) return DRVERR_INVALID_PARAM;
|
|
||||||
|
|
||||||
if ((lpdrv = getDrvStruct(drvID,lpdrvlist)) != 0) {
|
|
||||||
if (strlen(lpdrv->drvname) < (unsigned int)drvnamesize) {
|
|
||||||
strcpy(drvname,lpdrv->drvname);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
memcpy(drvname,lpdrv->drvname,drvnamesize-4);
|
|
||||||
drvname[drvnamesize-4] = '.';
|
|
||||||
drvname[drvnamesize-3] = '.';
|
|
||||||
drvname[drvnamesize-2] = '.';
|
|
||||||
drvname[drvnamesize-1] = 0;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return DRVERR_DEVICE_NOT_FOUND;
|
|
||||||
}
|
|
||||||
|
|
||||||
LONG AsioDriverList::asioGetDriverPath (int drvID,char *dllpath,int dllpathsize)
|
|
||||||
{
|
|
||||||
LPASIODRVSTRUCT lpdrv = 0;
|
|
||||||
|
|
||||||
if (!dllpath) return DRVERR_INVALID_PARAM;
|
|
||||||
|
|
||||||
if ((lpdrv = getDrvStruct(drvID,lpdrvlist)) != 0) {
|
|
||||||
if (strlen(lpdrv->dllpath) < (unsigned int)dllpathsize) {
|
|
||||||
strcpy(dllpath,lpdrv->dllpath);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
dllpath[0] = 0;
|
|
||||||
return DRVERR_INVALID_PARAM;
|
|
||||||
}
|
|
||||||
return DRVERR_DEVICE_NOT_FOUND;
|
|
||||||
}
|
|
||||||
|
|
||||||
LONG AsioDriverList::asioGetDriverCLSID (int drvID,CLSID *clsid)
|
|
||||||
{
|
|
||||||
LPASIODRVSTRUCT lpdrv = 0;
|
|
||||||
|
|
||||||
if (!clsid) return DRVERR_INVALID_PARAM;
|
|
||||||
|
|
||||||
if ((lpdrv = getDrvStruct(drvID,lpdrvlist)) != 0) {
|
|
||||||
memcpy(clsid,&lpdrv->clsid,sizeof(CLSID));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return DRVERR_DEVICE_NOT_FOUND;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,46 +0,0 @@
|
||||||
#ifndef __asiolist__
|
|
||||||
#define __asiolist__
|
|
||||||
|
|
||||||
#define DRVERR -5000
|
|
||||||
#define DRVERR_INVALID_PARAM DRVERR-1
|
|
||||||
#define DRVERR_DEVICE_ALREADY_OPEN DRVERR-2
|
|
||||||
#define DRVERR_DEVICE_NOT_FOUND DRVERR-3
|
|
||||||
|
|
||||||
#define MAXPATHLEN 512
|
|
||||||
#define MAXDRVNAMELEN 128
|
|
||||||
|
|
||||||
struct asiodrvstruct
|
|
||||||
{
|
|
||||||
int drvID;
|
|
||||||
CLSID clsid;
|
|
||||||
char dllpath[MAXPATHLEN];
|
|
||||||
char drvname[MAXDRVNAMELEN];
|
|
||||||
LPVOID asiodrv;
|
|
||||||
struct asiodrvstruct *next;
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef struct asiodrvstruct ASIODRVSTRUCT;
|
|
||||||
typedef ASIODRVSTRUCT *LPASIODRVSTRUCT;
|
|
||||||
|
|
||||||
class AsioDriverList {
|
|
||||||
public:
|
|
||||||
AsioDriverList();
|
|
||||||
~AsioDriverList();
|
|
||||||
|
|
||||||
LONG asioOpenDriver (int,VOID **);
|
|
||||||
LONG asioCloseDriver (int);
|
|
||||||
|
|
||||||
// nice to have
|
|
||||||
LONG asioGetNumDev (VOID);
|
|
||||||
LONG asioGetDriverName (int,char *,int);
|
|
||||||
LONG asioGetDriverPath (int,char *,int);
|
|
||||||
LONG asioGetDriverCLSID (int,CLSID *);
|
|
||||||
|
|
||||||
// or use directly access
|
|
||||||
LPASIODRVSTRUCT lpdrvlist;
|
|
||||||
int numdrv;
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef class AsioDriverList *LPASIODRIVERLIST;
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,526 +0,0 @@
|
||||||
// hostsample.cpp : a simple ASIO host example.
|
|
||||||
// - instantiates the driver
|
|
||||||
// - get the information from the driver
|
|
||||||
// - built up some audio channels
|
|
||||||
// - plays silence for 20 seconds
|
|
||||||
// - destruct the driver
|
|
||||||
// Note: This sample cannot work with the "ASIO DirectX Driver" as it does
|
|
||||||
// not have a valid Application Window handle, which is used as sysRef
|
|
||||||
// on the Windows platform.
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include "asiosys.h"
|
|
||||||
#include "asio.h"
|
|
||||||
#include "asiodrivers.h"
|
|
||||||
|
|
||||||
// name of the ASIO device to be used
|
|
||||||
#if WINDOWS
|
|
||||||
// #define ASIO_DRIVER_NAME "ASIO Multimedia Driver"
|
|
||||||
#define ASIO_DRIVER_NAME "ASIO Sample"
|
|
||||||
#elif MAC
|
|
||||||
// #define ASIO_DRIVER_NAME "Apple Sound Manager"
|
|
||||||
#define ASIO_DRIVER_NAME "ASIO Sample"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define TEST_RUN_TIME 20.0 // run for 20 seconds
|
|
||||||
|
|
||||||
|
|
||||||
enum {
|
|
||||||
// number of input and outputs supported by the host application
|
|
||||||
// you can change these to higher or lower values
|
|
||||||
kMaxInputChannels = 32,
|
|
||||||
kMaxOutputChannels = 32
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// internal data storage
|
|
||||||
typedef struct DriverInfo
|
|
||||||
{
|
|
||||||
// ASIOInit()
|
|
||||||
ASIODriverInfo driverInfo;
|
|
||||||
|
|
||||||
// ASIOGetChannels()
|
|
||||||
long inputChannels;
|
|
||||||
long outputChannels;
|
|
||||||
|
|
||||||
// ASIOGetBufferSize()
|
|
||||||
long minSize;
|
|
||||||
long maxSize;
|
|
||||||
long preferredSize;
|
|
||||||
long granularity;
|
|
||||||
|
|
||||||
// ASIOGetSampleRate()
|
|
||||||
ASIOSampleRate sampleRate;
|
|
||||||
|
|
||||||
// ASIOOutputReady()
|
|
||||||
bool postOutput;
|
|
||||||
|
|
||||||
// ASIOGetLatencies ()
|
|
||||||
long inputLatency;
|
|
||||||
long outputLatency;
|
|
||||||
|
|
||||||
// ASIOCreateBuffers ()
|
|
||||||
long inputBuffers; // becomes number of actual created input buffers
|
|
||||||
long outputBuffers; // becomes number of actual created output buffers
|
|
||||||
ASIOBufferInfo bufferInfos[kMaxInputChannels + kMaxOutputChannels]; // buffer info's
|
|
||||||
|
|
||||||
// ASIOGetChannelInfo()
|
|
||||||
ASIOChannelInfo channelInfos[kMaxInputChannels + kMaxOutputChannels]; // channel info's
|
|
||||||
// The above two arrays share the same indexing, as the data in them are linked together
|
|
||||||
|
|
||||||
// Information from ASIOGetSamplePosition()
|
|
||||||
// data is converted to double floats for easier use, however 64 bit integer can be used, too
|
|
||||||
double nanoSeconds;
|
|
||||||
double samples;
|
|
||||||
double tcSamples; // time code samples
|
|
||||||
|
|
||||||
// bufferSwitchTimeInfo()
|
|
||||||
ASIOTime tInfo; // time info state
|
|
||||||
unsigned long sysRefTime; // system reference time, when bufferSwitch() was called
|
|
||||||
|
|
||||||
// Signal the end of processing in this example
|
|
||||||
bool stopped;
|
|
||||||
} DriverInfo;
|
|
||||||
|
|
||||||
|
|
||||||
DriverInfo asioDriverInfo = {0};
|
|
||||||
ASIOCallbacks asioCallbacks;
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------
|
|
||||||
// some external references
|
|
||||||
extern AsioDrivers* asioDrivers;
|
|
||||||
bool loadAsioDriver(char *name);
|
|
||||||
|
|
||||||
// internal prototypes (required for the Metrowerks CodeWarrior compiler)
|
|
||||||
int main(int argc, char* argv[]);
|
|
||||||
long init_asio_static_data (DriverInfo *asioDriverInfo);
|
|
||||||
ASIOError create_asio_buffers (DriverInfo *asioDriverInfo);
|
|
||||||
unsigned long get_sys_reference_time();
|
|
||||||
|
|
||||||
|
|
||||||
// callback prototypes
|
|
||||||
void bufferSwitch(long index, ASIOBool processNow);
|
|
||||||
ASIOTime *bufferSwitchTimeInfo(ASIOTime *timeInfo, long index, ASIOBool processNow);
|
|
||||||
void sampleRateChanged(ASIOSampleRate sRate);
|
|
||||||
long asioMessages(long selector, long value, void* message, double* opt);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------
|
|
||||||
long init_asio_static_data (DriverInfo *asioDriverInfo)
|
|
||||||
{ // collect the informational data of the driver
|
|
||||||
// get the number of available channels
|
|
||||||
if(ASIOGetChannels(&asioDriverInfo->inputChannels, &asioDriverInfo->outputChannels) == ASE_OK)
|
|
||||||
{
|
|
||||||
printf ("ASIOGetChannels (inputs: %d, outputs: %d);\n", asioDriverInfo->inputChannels, asioDriverInfo->outputChannels);
|
|
||||||
|
|
||||||
// get the usable buffer sizes
|
|
||||||
if(ASIOGetBufferSize(&asioDriverInfo->minSize, &asioDriverInfo->maxSize, &asioDriverInfo->preferredSize, &asioDriverInfo->granularity) == ASE_OK)
|
|
||||||
{
|
|
||||||
printf ("ASIOGetBufferSize (min: %d, max: %d, preferred: %d, granularity: %d);\n",
|
|
||||||
asioDriverInfo->minSize, asioDriverInfo->maxSize,
|
|
||||||
asioDriverInfo->preferredSize, asioDriverInfo->granularity);
|
|
||||||
|
|
||||||
// get the currently selected sample rate
|
|
||||||
if(ASIOGetSampleRate(&asioDriverInfo->sampleRate) == ASE_OK)
|
|
||||||
{
|
|
||||||
printf ("ASIOGetSampleRate (sampleRate: %f);\n", asioDriverInfo->sampleRate);
|
|
||||||
if (asioDriverInfo->sampleRate <= 0.0 || asioDriverInfo->sampleRate > 96000.0)
|
|
||||||
{
|
|
||||||
// Driver does not store it's internal sample rate, so set it to a know one.
|
|
||||||
// Usually you should check beforehand, that the selected sample rate is valid
|
|
||||||
// with ASIOCanSampleRate().
|
|
||||||
if(ASIOSetSampleRate(44100.0) == ASE_OK)
|
|
||||||
{
|
|
||||||
if(ASIOGetSampleRate(&asioDriverInfo->sampleRate) == ASE_OK)
|
|
||||||
printf ("ASIOGetSampleRate (sampleRate: %f);\n", asioDriverInfo->sampleRate);
|
|
||||||
else
|
|
||||||
return -6;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
return -5;
|
|
||||||
}
|
|
||||||
|
|
||||||
// check wether the driver requires the ASIOOutputReady() optimization
|
|
||||||
// (can be used by the driver to reduce output latency by one block)
|
|
||||||
if(ASIOOutputReady() == ASE_OK)
|
|
||||||
asioDriverInfo->postOutput = true;
|
|
||||||
else
|
|
||||||
asioDriverInfo->postOutput = false;
|
|
||||||
printf ("ASIOOutputReady(); - %s\n", asioDriverInfo->postOutput ? "Supported" : "Not supported");
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return -3;
|
|
||||||
}
|
|
||||||
return -2;
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------
|
|
||||||
// conversion from 64 bit ASIOSample/ASIOTimeStamp to double float
|
|
||||||
#if NATIVE_INT64
|
|
||||||
#define ASIO64toDouble(a) (a)
|
|
||||||
#else
|
|
||||||
const double twoRaisedTo32 = 4294967296.;
|
|
||||||
#define ASIO64toDouble(a) ((a).lo + (a).hi * twoRaisedTo32)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ASIOTime *bufferSwitchTimeInfo(ASIOTime *timeInfo, long index, ASIOBool processNow)
|
|
||||||
{ // the actual processing callback.
|
|
||||||
// Beware that this is normally in a seperate thread, hence be sure that you take care
|
|
||||||
// about thread synchronization. This is omitted here for simplicity.
|
|
||||||
static long processedSamples = 0;
|
|
||||||
|
|
||||||
// store the timeInfo for later use
|
|
||||||
asioDriverInfo.tInfo = *timeInfo;
|
|
||||||
|
|
||||||
// get the time stamp of the buffer, not necessary if no
|
|
||||||
// synchronization to other media is required
|
|
||||||
if (timeInfo->timeInfo.flags & kSystemTimeValid)
|
|
||||||
asioDriverInfo.nanoSeconds = ASIO64toDouble(timeInfo->timeInfo.systemTime);
|
|
||||||
else
|
|
||||||
asioDriverInfo.nanoSeconds = 0;
|
|
||||||
|
|
||||||
if (timeInfo->timeInfo.flags & kSamplePositionValid)
|
|
||||||
asioDriverInfo.samples = ASIO64toDouble(timeInfo->timeInfo.samplePosition);
|
|
||||||
else
|
|
||||||
asioDriverInfo.samples = 0;
|
|
||||||
|
|
||||||
if (timeInfo->timeCode.flags & kTcValid)
|
|
||||||
asioDriverInfo.tcSamples = ASIO64toDouble(timeInfo->timeCode.timeCodeSamples);
|
|
||||||
else
|
|
||||||
asioDriverInfo.tcSamples = 0;
|
|
||||||
|
|
||||||
// get the system reference time
|
|
||||||
asioDriverInfo.sysRefTime = get_sys_reference_time();
|
|
||||||
|
|
||||||
#if WINDOWS && _DEBUG
|
|
||||||
// a few debug messages for the Windows device driver developer
|
|
||||||
// tells you the time when driver got its interrupt and the delay until the app receives
|
|
||||||
// the event notification.
|
|
||||||
static double last_samples = 0;
|
|
||||||
char tmp[128];
|
|
||||||
sprintf (tmp, "diff: %d / %d ms / %d ms / %d samples \n", asioDriverInfo.sysRefTime - (long)(asioDriverInfo.nanoSeconds / 1000000.0), asioDriverInfo.sysRefTime, (long)(asioDriverInfo.nanoSeconds / 1000000.0), (long)(asioDriverInfo.samples - last_samples));
|
|
||||||
OutputDebugString (tmp);
|
|
||||||
last_samples = asioDriverInfo.samples;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// buffer size in samples
|
|
||||||
long buffSize = asioDriverInfo.preferredSize;
|
|
||||||
|
|
||||||
// perform the processing
|
|
||||||
for (int i = 0; i < asioDriverInfo.inputBuffers + asioDriverInfo.outputBuffers; i++)
|
|
||||||
{
|
|
||||||
if (asioDriverInfo.bufferInfos[i].isInput == false)
|
|
||||||
{
|
|
||||||
// OK do processing for the outputs only
|
|
||||||
switch (asioDriverInfo.channelInfos[i].type)
|
|
||||||
{
|
|
||||||
case ASIOSTInt16LSB:
|
|
||||||
memset (asioDriverInfo.bufferInfos[i].buffers[index], 0, buffSize * 2);
|
|
||||||
break;
|
|
||||||
case ASIOSTInt24LSB: // used for 20 bits as well
|
|
||||||
memset (asioDriverInfo.bufferInfos[i].buffers[index], 0, buffSize * 3);
|
|
||||||
break;
|
|
||||||
case ASIOSTInt32LSB:
|
|
||||||
memset (asioDriverInfo.bufferInfos[i].buffers[index], 0, buffSize * 4);
|
|
||||||
break;
|
|
||||||
case ASIOSTFloat32LSB: // IEEE 754 32 bit float, as found on Intel x86 architecture
|
|
||||||
memset (asioDriverInfo.bufferInfos[i].buffers[index], 0, buffSize * 4);
|
|
||||||
break;
|
|
||||||
case ASIOSTFloat64LSB: // IEEE 754 64 bit double float, as found on Intel x86 architecture
|
|
||||||
memset (asioDriverInfo.bufferInfos[i].buffers[index], 0, buffSize * 8);
|
|
||||||
break;
|
|
||||||
|
|
||||||
// these are used for 32 bit data buffer, with different alignment of the data inside
|
|
||||||
// 32 bit PCI bus systems can more easily used with these
|
|
||||||
case ASIOSTInt32LSB16: // 32 bit data with 18 bit alignment
|
|
||||||
case ASIOSTInt32LSB18: // 32 bit data with 18 bit alignment
|
|
||||||
case ASIOSTInt32LSB20: // 32 bit data with 20 bit alignment
|
|
||||||
case ASIOSTInt32LSB24: // 32 bit data with 24 bit alignment
|
|
||||||
memset (asioDriverInfo.bufferInfos[i].buffers[index], 0, buffSize * 4);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ASIOSTInt16MSB:
|
|
||||||
memset (asioDriverInfo.bufferInfos[i].buffers[index], 0, buffSize * 2);
|
|
||||||
break;
|
|
||||||
case ASIOSTInt24MSB: // used for 20 bits as well
|
|
||||||
memset (asioDriverInfo.bufferInfos[i].buffers[index], 0, buffSize * 3);
|
|
||||||
break;
|
|
||||||
case ASIOSTInt32MSB:
|
|
||||||
memset (asioDriverInfo.bufferInfos[i].buffers[index], 0, buffSize * 4);
|
|
||||||
break;
|
|
||||||
case ASIOSTFloat32MSB: // IEEE 754 32 bit float, as found on Intel x86 architecture
|
|
||||||
memset (asioDriverInfo.bufferInfos[i].buffers[index], 0, buffSize * 4);
|
|
||||||
break;
|
|
||||||
case ASIOSTFloat64MSB: // IEEE 754 64 bit double float, as found on Intel x86 architecture
|
|
||||||
memset (asioDriverInfo.bufferInfos[i].buffers[index], 0, buffSize * 8);
|
|
||||||
break;
|
|
||||||
|
|
||||||
// these are used for 32 bit data buffer, with different alignment of the data inside
|
|
||||||
// 32 bit PCI bus systems can more easily used with these
|
|
||||||
case ASIOSTInt32MSB16: // 32 bit data with 18 bit alignment
|
|
||||||
case ASIOSTInt32MSB18: // 32 bit data with 18 bit alignment
|
|
||||||
case ASIOSTInt32MSB20: // 32 bit data with 20 bit alignment
|
|
||||||
case ASIOSTInt32MSB24: // 32 bit data with 24 bit alignment
|
|
||||||
memset (asioDriverInfo.bufferInfos[i].buffers[index], 0, buffSize * 4);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// finally if the driver supports the ASIOOutputReady() optimization, do it here, all data are in place
|
|
||||||
if (asioDriverInfo.postOutput)
|
|
||||||
ASIOOutputReady();
|
|
||||||
|
|
||||||
if (processedSamples >= asioDriverInfo.sampleRate * TEST_RUN_TIME) // roughly measured
|
|
||||||
asioDriverInfo.stopped = true;
|
|
||||||
else
|
|
||||||
processedSamples += buffSize;
|
|
||||||
|
|
||||||
return 0L;
|
|
||||||
}
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------
|
|
||||||
void bufferSwitch(long index, ASIOBool processNow)
|
|
||||||
{ // the actual processing callback.
|
|
||||||
// Beware that this is normally in a seperate thread, hence be sure that you take care
|
|
||||||
// about thread synchronization. This is omitted here for simplicity.
|
|
||||||
|
|
||||||
// as this is a "back door" into the bufferSwitchTimeInfo a timeInfo needs to be created
|
|
||||||
// though it will only set the timeInfo.samplePosition and timeInfo.systemTime fields and the according flags
|
|
||||||
ASIOTime timeInfo;
|
|
||||||
memset (&timeInfo, 0, sizeof (timeInfo));
|
|
||||||
|
|
||||||
// get the time stamp of the buffer, not necessary if no
|
|
||||||
// synchronization to other media is required
|
|
||||||
if(ASIOGetSamplePosition(&timeInfo.timeInfo.samplePosition, &timeInfo.timeInfo.systemTime) == ASE_OK)
|
|
||||||
timeInfo.timeInfo.flags = kSystemTimeValid | kSamplePositionValid;
|
|
||||||
|
|
||||||
bufferSwitchTimeInfo (&timeInfo, index, processNow);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------
|
|
||||||
void sampleRateChanged(ASIOSampleRate sRate)
|
|
||||||
{
|
|
||||||
// do whatever you need to do if the sample rate changed
|
|
||||||
// usually this only happens during external sync.
|
|
||||||
// Audio processing is not stopped by the driver, actual sample rate
|
|
||||||
// might not have even changed, maybe only the sample rate status of an
|
|
||||||
// AES/EBU or S/PDIF digital input at the audio device.
|
|
||||||
// You might have to update time/sample related conversion routines, etc.
|
|
||||||
}
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------
|
|
||||||
long asioMessages(long selector, long value, void* message, double* opt)
|
|
||||||
{
|
|
||||||
// currently the parameters "value", "message" and "opt" are not used.
|
|
||||||
long ret = 0;
|
|
||||||
switch(selector)
|
|
||||||
{
|
|
||||||
case kAsioSelectorSupported:
|
|
||||||
if(value == kAsioResetRequest
|
|
||||||
|| value == kAsioEngineVersion
|
|
||||||
|| value == kAsioResyncRequest
|
|
||||||
|| value == kAsioLatenciesChanged
|
|
||||||
// the following three were added for ASIO 2.0, you don't necessarily have to support them
|
|
||||||
|| value == kAsioSupportsTimeInfo
|
|
||||||
|| value == kAsioSupportsTimeCode
|
|
||||||
|| value == kAsioSupportsInputMonitor)
|
|
||||||
ret = 1L;
|
|
||||||
break;
|
|
||||||
case kAsioResetRequest:
|
|
||||||
// defer the task and perform the reset of the driver during the next "safe" situation
|
|
||||||
// You cannot reset the driver right now, as this code is called from the driver.
|
|
||||||
// Reset the driver is done by completely destruct is. I.e. ASIOStop(), ASIODisposeBuffers(), Destruction
|
|
||||||
// Afterwards you initialize the driver again.
|
|
||||||
asioDriverInfo.stopped; // In this sample the processing will just stop
|
|
||||||
ret = 1L;
|
|
||||||
break;
|
|
||||||
case kAsioResyncRequest:
|
|
||||||
// This informs the application, that the driver encountered some non fatal data loss.
|
|
||||||
// It is used for synchronization purposes of different media.
|
|
||||||
// Added mainly to work around the Win16Mutex problems in Windows 95/98 with the
|
|
||||||
// Windows Multimedia system, which could loose data because the Mutex was hold too long
|
|
||||||
// by another thread.
|
|
||||||
// However a driver can issue it in other situations, too.
|
|
||||||
ret = 1L;
|
|
||||||
break;
|
|
||||||
case kAsioLatenciesChanged:
|
|
||||||
// This will inform the host application that the drivers were latencies changed.
|
|
||||||
// Beware, it this does not mean that the buffer sizes have changed!
|
|
||||||
// You might need to update internal delay data.
|
|
||||||
ret = 1L;
|
|
||||||
break;
|
|
||||||
case kAsioEngineVersion:
|
|
||||||
// return the supported ASIO version of the host application
|
|
||||||
// If a host applications does not implement this selector, ASIO 1.0 is assumed
|
|
||||||
// by the driver
|
|
||||||
ret = 2L;
|
|
||||||
break;
|
|
||||||
case kAsioSupportsTimeInfo:
|
|
||||||
// informs the driver wether the asioCallbacks.bufferSwitchTimeInfo() callback
|
|
||||||
// is supported.
|
|
||||||
// For compatibility with ASIO 1.0 drivers the host application should always support
|
|
||||||
// the "old" bufferSwitch method, too.
|
|
||||||
ret = 1;
|
|
||||||
break;
|
|
||||||
case kAsioSupportsTimeCode:
|
|
||||||
// informs the driver wether application is interested in time code info.
|
|
||||||
// If an application does not need to know about time code, the driver has less work
|
|
||||||
// to do.
|
|
||||||
ret = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------
|
|
||||||
ASIOError create_asio_buffers (DriverInfo *asioDriverInfo)
|
|
||||||
{ // create buffers for all inputs and outputs of the card with the
|
|
||||||
// preferredSize from ASIOGetBufferSize() as buffer size
|
|
||||||
long i;
|
|
||||||
ASIOError result;
|
|
||||||
|
|
||||||
// fill the bufferInfos from the start without a gap
|
|
||||||
ASIOBufferInfo *info = asioDriverInfo->bufferInfos;
|
|
||||||
|
|
||||||
// prepare inputs (Though this is not necessaily required, no opened inputs will work, too
|
|
||||||
if (asioDriverInfo->inputChannels > kMaxInputChannels)
|
|
||||||
asioDriverInfo->inputBuffers = kMaxInputChannels;
|
|
||||||
else
|
|
||||||
asioDriverInfo->inputBuffers = asioDriverInfo->inputChannels;
|
|
||||||
for(i = 0; i < asioDriverInfo->inputBuffers; i++, info++)
|
|
||||||
{
|
|
||||||
info->isInput = ASIOTrue;
|
|
||||||
info->channelNum = i;
|
|
||||||
info->buffers[0] = info->buffers[1] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// prepare outputs
|
|
||||||
if (asioDriverInfo->outputChannels > kMaxOutputChannels)
|
|
||||||
asioDriverInfo->outputBuffers = kMaxOutputChannels;
|
|
||||||
else
|
|
||||||
asioDriverInfo->outputBuffers = asioDriverInfo->outputChannels;
|
|
||||||
for(i = 0; i < asioDriverInfo->outputBuffers; i++, info++)
|
|
||||||
{
|
|
||||||
info->isInput = ASIOFalse;
|
|
||||||
info->channelNum = i;
|
|
||||||
info->buffers[0] = info->buffers[1] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// create and activate buffers
|
|
||||||
result = ASIOCreateBuffers(asioDriverInfo->bufferInfos,
|
|
||||||
asioDriverInfo->inputBuffers + asioDriverInfo->outputBuffers,
|
|
||||||
asioDriverInfo->preferredSize, &asioCallbacks);
|
|
||||||
if (result == ASE_OK)
|
|
||||||
{
|
|
||||||
// now get all the buffer details, sample word length, name, word clock group and activation
|
|
||||||
for (i = 0; i < asioDriverInfo->inputBuffers + asioDriverInfo->outputBuffers; i++)
|
|
||||||
{
|
|
||||||
asioDriverInfo->channelInfos[i].channel = asioDriverInfo->bufferInfos[i].channelNum;
|
|
||||||
asioDriverInfo->channelInfos[i].isInput = asioDriverInfo->bufferInfos[i].isInput;
|
|
||||||
result = ASIOGetChannelInfo(&asioDriverInfo->channelInfos[i]);
|
|
||||||
if (result != ASE_OK)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (result == ASE_OK)
|
|
||||||
{
|
|
||||||
// get the input and output latencies
|
|
||||||
// Latencies often are only valid after ASIOCreateBuffers()
|
|
||||||
// (input latency is the age of the first sample in the currently returned audio block)
|
|
||||||
// (output latency is the time the first sample in the currently returned audio block requires to get to the output)
|
|
||||||
result = ASIOGetLatencies(&asioDriverInfo->inputLatency, &asioDriverInfo->outputLatency);
|
|
||||||
if (result == ASE_OK)
|
|
||||||
printf ("ASIOGetLatencies (input: %d, output: %d);\n", asioDriverInfo->inputLatency, asioDriverInfo->outputLatency);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char* argv[])
|
|
||||||
{
|
|
||||||
// load the driver, this will setup all the necessary internal data structures
|
|
||||||
if (loadAsioDriver (ASIO_DRIVER_NAME))
|
|
||||||
{
|
|
||||||
// initialize the driver
|
|
||||||
if (ASIOInit (&asioDriverInfo.driverInfo) == ASE_OK)
|
|
||||||
{
|
|
||||||
printf ("asioVersion: %d\n"
|
|
||||||
"driverVersion: %d\n"
|
|
||||||
"Name: %s\n"
|
|
||||||
"ErrorMessage: %s\n",
|
|
||||||
asioDriverInfo.driverInfo.asioVersion, asioDriverInfo.driverInfo.driverVersion,
|
|
||||||
asioDriverInfo.driverInfo.name, asioDriverInfo.driverInfo.errorMessage);
|
|
||||||
if (init_asio_static_data (&asioDriverInfo) == 0)
|
|
||||||
{
|
|
||||||
// ASIOControlPanel(); you might want to check wether the ASIOControlPanel() can open
|
|
||||||
|
|
||||||
// set up the asioCallback structure and create the ASIO data buffer
|
|
||||||
asioCallbacks.bufferSwitch = &bufferSwitch;
|
|
||||||
asioCallbacks.sampleRateDidChange = &sampleRateChanged;
|
|
||||||
asioCallbacks.asioMessage = &asioMessages;
|
|
||||||
asioCallbacks.bufferSwitchTimeInfo = &bufferSwitchTimeInfo;
|
|
||||||
if (create_asio_buffers (&asioDriverInfo) == ASE_OK)
|
|
||||||
{
|
|
||||||
if (ASIOStart() == ASE_OK)
|
|
||||||
{
|
|
||||||
// Now all is up and running
|
|
||||||
fprintf (stdout, "\nASIO Driver started succefully.\n\n");
|
|
||||||
while (!asioDriverInfo.stopped)
|
|
||||||
{
|
|
||||||
#if WINDOWS
|
|
||||||
Sleep(100); // goto sleep for 100 milliseconds
|
|
||||||
#elif MAC
|
|
||||||
unsigned long dummy;
|
|
||||||
Delay (6, &dummy);
|
|
||||||
#endif
|
|
||||||
fprintf (stdout, "%d ms / %d ms / %d samples", asioDriverInfo.sysRefTime, (long)(asioDriverInfo.nanoSeconds / 1000000.0), (long)asioDriverInfo.samples);
|
|
||||||
|
|
||||||
// create a more readable time code format (the quick and dirty way)
|
|
||||||
double remainder = asioDriverInfo.tcSamples;
|
|
||||||
long hours = (long)(remainder / (asioDriverInfo.sampleRate * 3600));
|
|
||||||
remainder -= hours * asioDriverInfo.sampleRate * 3600;
|
|
||||||
long minutes = (long)(remainder / (asioDriverInfo.sampleRate * 60));
|
|
||||||
remainder -= minutes * asioDriverInfo.sampleRate * 60;
|
|
||||||
long seconds = (long)(remainder / asioDriverInfo.sampleRate);
|
|
||||||
remainder -= seconds * asioDriverInfo.sampleRate;
|
|
||||||
fprintf (stdout, " / TC: %2.2d:%2.2d:%2.2d:%5.5d", (long)hours, (long)minutes, (long)seconds, (long)remainder);
|
|
||||||
|
|
||||||
fprintf (stdout, " \r");
|
|
||||||
#if !MAC
|
|
||||||
fflush (stdout);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
ASIOStop();
|
|
||||||
}
|
|
||||||
ASIODisposeBuffers();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ASIOExit();
|
|
||||||
}
|
|
||||||
asioDrivers->removeCurrentDriver();
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
unsigned long get_sys_reference_time()
|
|
||||||
{ // get the system reference time
|
|
||||||
#if WINDOWS
|
|
||||||
return timeGetTime();
|
|
||||||
#elif MAC
|
|
||||||
static const double twoRaisedTo32 = 4294967296.;
|
|
||||||
UnsignedWide ys;
|
|
||||||
Microseconds(&ys);
|
|
||||||
double r = ((double)ys.hi * twoRaisedTo32 + (double)ys.lo);
|
|
||||||
return (unsigned long)(r / 1000.);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
@ -1,134 +0,0 @@
|
||||||
# Microsoft Developer Studio Project File - Name="hostsample" - Package Owner=<4>
|
|
||||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00
|
|
||||||
# ** DO NOT EDIT **
|
|
||||||
|
|
||||||
# TARGTYPE "Win32 (x86) Console Application" 0x0103
|
|
||||||
|
|
||||||
CFG=hostsample - Win32 Debug
|
|
||||||
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
|
|
||||||
!MESSAGE use the Export Makefile command and run
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE NMAKE /f "hostsample.mak".
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE You can specify a configuration when running NMAKE
|
|
||||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE NMAKE /f "hostsample.mak" CFG="hostsample - Win32 Debug"
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE Possible choices for configuration are:
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE "hostsample - Win32 Release" (based on "Win32 (x86) Console Application")
|
|
||||||
!MESSAGE "hostsample - Win32 Debug" (based on "Win32 (x86) Console Application")
|
|
||||||
!MESSAGE
|
|
||||||
|
|
||||||
# Begin Project
|
|
||||||
# PROP AllowPerConfigDependencies 0
|
|
||||||
# PROP Scc_ProjName ""
|
|
||||||
# PROP Scc_LocalPath ""
|
|
||||||
CPP=cl.exe
|
|
||||||
RSC=rc.exe
|
|
||||||
|
|
||||||
!IF "$(CFG)" == "hostsample - Win32 Release"
|
|
||||||
|
|
||||||
# PROP BASE Use_MFC 0
|
|
||||||
# PROP BASE Use_Debug_Libraries 0
|
|
||||||
# PROP BASE Output_Dir "Release"
|
|
||||||
# PROP BASE Intermediate_Dir "Release"
|
|
||||||
# PROP BASE Target_Dir ""
|
|
||||||
# PROP Use_MFC 0
|
|
||||||
# PROP Use_Debug_Libraries 0
|
|
||||||
# PROP Output_Dir "Release"
|
|
||||||
# PROP Intermediate_Dir "Release"
|
|
||||||
# PROP Ignore_Export_Lib 0
|
|
||||||
# PROP Target_Dir ""
|
|
||||||
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /c
|
|
||||||
# ADD CPP /nologo /W3 /GX /O2 /I "../../common" /I "../../host" /I "../../host/pc" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
|
|
||||||
# ADD BASE RSC /l 0x809 /d "NDEBUG"
|
|
||||||
# ADD RSC /l 0x809 /d "NDEBUG"
|
|
||||||
BSC32=bscmake.exe
|
|
||||||
# ADD BASE BSC32 /nologo
|
|
||||||
# ADD BSC32 /nologo
|
|
||||||
LINK32=link.exe
|
|
||||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
|
|
||||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib winmm.lib /nologo /subsystem:console /machine:I386
|
|
||||||
|
|
||||||
!ELSEIF "$(CFG)" == "hostsample - Win32 Debug"
|
|
||||||
|
|
||||||
# PROP BASE Use_MFC 0
|
|
||||||
# PROP BASE Use_Debug_Libraries 1
|
|
||||||
# PROP BASE Output_Dir "Debug"
|
|
||||||
# PROP BASE Intermediate_Dir "Debug"
|
|
||||||
# PROP BASE Target_Dir ""
|
|
||||||
# PROP Use_MFC 0
|
|
||||||
# PROP Use_Debug_Libraries 1
|
|
||||||
# PROP Output_Dir "Debug"
|
|
||||||
# PROP Intermediate_Dir "Debug"
|
|
||||||
# PROP Ignore_Export_Lib 0
|
|
||||||
# PROP Target_Dir ""
|
|
||||||
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /GZ /c
|
|
||||||
# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../common" /I "../../host" /I "../../host/pc" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FR /YX /FD /GZ /c
|
|
||||||
# ADD BASE RSC /l 0x809 /d "_DEBUG"
|
|
||||||
# ADD RSC /l 0x809 /d "_DEBUG"
|
|
||||||
BSC32=bscmake.exe
|
|
||||||
# ADD BASE BSC32 /nologo
|
|
||||||
# ADD BSC32 /nologo
|
|
||||||
LINK32=link.exe
|
|
||||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
|
|
||||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib winmm.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
|
|
||||||
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
# Begin Target
|
|
||||||
|
|
||||||
# Name "hostsample - Win32 Release"
|
|
||||||
# Name "hostsample - Win32 Debug"
|
|
||||||
# Begin Group "Source Files"
|
|
||||||
|
|
||||||
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\common\asio.cpp
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\asiodrivers.cpp
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\pc\asiolist.cpp
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\hostsample.cpp
|
|
||||||
# End Source File
|
|
||||||
# End Group
|
|
||||||
# Begin Group "Header Files"
|
|
||||||
|
|
||||||
# PROP Default_Filter "h;hpp;hxx;hm;inl"
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\common\asio.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\asiodrivers.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\pc\asiolist.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\ginclude.h
|
|
||||||
# End Source File
|
|
||||||
# End Group
|
|
||||||
# Begin Group "Resource Files"
|
|
||||||
|
|
||||||
# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
|
|
||||||
# End Group
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\ReadMe.txt
|
|
||||||
# End Source File
|
|
||||||
# End Target
|
|
||||||
# End Project
|
|
||||||
|
|
@ -1,571 +0,0 @@
|
||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="8.00"
|
|
||||||
Name="hostsample"
|
|
||||||
ProjectGUID="{1E10ECB0-0666-474F-A010-660E7CE9DC00}"
|
|
||||||
>
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"
|
|
||||||
/>
|
|
||||||
<Platform
|
|
||||||
Name="x64"
|
|
||||||
/>
|
|
||||||
</Platforms>
|
|
||||||
<ToolFiles>
|
|
||||||
</ToolFiles>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
ConfigurationType="1"
|
|
||||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
|
|
||||||
UseOfMFC="0"
|
|
||||||
ATLMinimizesCRunTimeLibraryUsage="false"
|
|
||||||
CharacterSet="2"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
TypeLibraryName=".\Release/hostsample.tlb"
|
|
||||||
HeaderFileName=""
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="2"
|
|
||||||
InlineFunctionExpansion="1"
|
|
||||||
AdditionalIncludeDirectories="../../common,../../host,../../host/pc"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"
|
|
||||||
StringPooling="true"
|
|
||||||
RuntimeLibrary="0"
|
|
||||||
EnableFunctionLevelLinking="true"
|
|
||||||
PrecompiledHeaderFile=".\Release/hostsample.pch"
|
|
||||||
WarningLevel="3"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
PreprocessorDefinitions="NDEBUG"
|
|
||||||
Culture="2057"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalDependencies="odbc32.lib odbccp32.lib winmm.lib"
|
|
||||||
OutputFile="$(PlatformName)\$(ConfigurationName)\hostsample.exe"
|
|
||||||
LinkIncremental="1"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
SubSystem="1"
|
|
||||||
TargetMachine="1"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|x64"
|
|
||||||
OutputDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
ConfigurationType="1"
|
|
||||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
|
|
||||||
UseOfMFC="0"
|
|
||||||
ATLMinimizesCRunTimeLibraryUsage="false"
|
|
||||||
CharacterSet="2"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
TargetEnvironment="3"
|
|
||||||
TypeLibraryName=".\Release/hostsample.tlb"
|
|
||||||
HeaderFileName=""
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="2"
|
|
||||||
InlineFunctionExpansion="1"
|
|
||||||
AdditionalIncludeDirectories="../../common,../../host,../../host/pc"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"
|
|
||||||
StringPooling="true"
|
|
||||||
RuntimeLibrary="0"
|
|
||||||
EnableFunctionLevelLinking="true"
|
|
||||||
PrecompiledHeaderFile=".\Release/hostsample.pch"
|
|
||||||
WarningLevel="3"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
PreprocessorDefinitions="NDEBUG"
|
|
||||||
Culture="2057"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalDependencies="odbc32.lib odbccp32.lib winmm.lib"
|
|
||||||
OutputFile="$(PlatformName)\$(ConfigurationName)\hostsample.exe"
|
|
||||||
LinkIncremental="1"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
SubSystem="1"
|
|
||||||
TargetMachine="17"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
OutputDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
ConfigurationType="1"
|
|
||||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
|
|
||||||
UseOfMFC="0"
|
|
||||||
ATLMinimizesCRunTimeLibraryUsage="false"
|
|
||||||
CharacterSet="2"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
TypeLibraryName=".\Debug/hostsample.tlb"
|
|
||||||
HeaderFileName=""
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="../../common,../../host,../../host/pc"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"
|
|
||||||
MinimalRebuild="true"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="1"
|
|
||||||
PrecompiledHeaderFile=".\Debug/hostsample.pch"
|
|
||||||
BrowseInformation="1"
|
|
||||||
WarningLevel="3"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
DebugInformationFormat="4"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
PreprocessorDefinitions="_DEBUG"
|
|
||||||
Culture="2057"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalDependencies="odbc32.lib odbccp32.lib winmm.lib"
|
|
||||||
OutputFile="$(PlatformName)\$(ConfigurationName)\hostsample.exe"
|
|
||||||
LinkIncremental="2"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
SubSystem="1"
|
|
||||||
TargetMachine="1"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|x64"
|
|
||||||
OutputDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
ConfigurationType="1"
|
|
||||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
|
|
||||||
UseOfMFC="0"
|
|
||||||
ATLMinimizesCRunTimeLibraryUsage="false"
|
|
||||||
CharacterSet="2"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
TargetEnvironment="3"
|
|
||||||
TypeLibraryName=".\Debug/hostsample.tlb"
|
|
||||||
HeaderFileName=""
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="../../common,../../host,../../host/pc"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"
|
|
||||||
MinimalRebuild="true"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="1"
|
|
||||||
PrecompiledHeaderFile=".\Debug/hostsample.pch"
|
|
||||||
BrowseInformation="1"
|
|
||||||
WarningLevel="3"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
DebugInformationFormat="3"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
PreprocessorDefinitions="_DEBUG"
|
|
||||||
Culture="2057"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalDependencies="odbc32.lib odbccp32.lib winmm.lib"
|
|
||||||
OutputFile="$(PlatformName)\$(ConfigurationName)\hostsample.exe"
|
|
||||||
LinkIncremental="2"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
SubSystem="1"
|
|
||||||
TargetMachine="17"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<References>
|
|
||||||
</References>
|
|
||||||
<Files>
|
|
||||||
<Filter
|
|
||||||
Name="Source Files"
|
|
||||||
Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
|
||||||
>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\common\asio.cpp"
|
|
||||||
>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Release|Win32"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Release|x64"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Debug|x64"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\asiodrivers.cpp"
|
|
||||||
>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Release|Win32"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Release|x64"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Debug|x64"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\pc\asiolist.cpp"
|
|
||||||
>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Release|Win32"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Release|x64"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Debug|x64"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="hostsample.cpp"
|
|
||||||
>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Release|Win32"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Release|x64"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Debug|x64"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
<Filter
|
|
||||||
Name="Header Files"
|
|
||||||
Filter="h;hpp;hxx;hm;inl"
|
|
||||||
>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\common\asio.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\asiodrivers.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\pc\asiolist.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\ginclude.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
<Filter
|
|
||||||
Name="Resource Files"
|
|
||||||
Filter="ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
|
|
||||||
>
|
|
||||||
</Filter>
|
|
||||||
<File
|
|
||||||
RelativePath="ReadMe.txt"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
||||||
|
|
@ -1,55 +0,0 @@
|
||||||
ASIO 2.3 SDK Contents
|
|
||||||
---------------------
|
|
||||||
|
|
||||||
readme.txt - this file
|
|
||||||
changes.txt - contains change information between
|
|
||||||
SDK releases
|
|
||||||
ASIO SDK 2.3.pdf - ASIO SDK 2.3 specification
|
|
||||||
Steinberg ASIO Licensing Agreement.pdf - Licencing Agreement
|
|
||||||
|
|
||||||
common:
|
|
||||||
asio.h - ASIO C definition
|
|
||||||
iasiodrv.h - interface definition for the ASIO driver class
|
|
||||||
asio.cpp - asio host interface (not used on Mac)
|
|
||||||
asiodrvr.h
|
|
||||||
asiodrvr.cpp - ASIO driver class base definition
|
|
||||||
combase.h
|
|
||||||
combase.cpp - COM base definitions (PC only)
|
|
||||||
dllentry.cpp - DLL functions (PC only)
|
|
||||||
register.cpp - driver self registration functionality
|
|
||||||
wxdebug.h
|
|
||||||
debugmessage.cpp - some debugging help
|
|
||||||
|
|
||||||
host:
|
|
||||||
asiodrivers.h
|
|
||||||
asiodrivers.cpp - ASIO driver managment (enumeration and instantiation)
|
|
||||||
ASIOConvertSamples.h
|
|
||||||
ASIOConvertSamples.cpp - sample data format conversion class
|
|
||||||
ginclude.h - platform specific definitions
|
|
||||||
|
|
||||||
host/mac:
|
|
||||||
asioshlib.cpp - asio.cpp for the Mac, resolves the symbols
|
|
||||||
codefragments.hpp
|
|
||||||
codefragments.cpp - code fragment loader
|
|
||||||
|
|
||||||
host/pc:
|
|
||||||
asiolist.h
|
|
||||||
asiolist.cpp - instantiates an ASIO driver via the COM model
|
|
||||||
|
|
||||||
host/sample:
|
|
||||||
hostsample.cpp - a simple console app which shows ASIO hosting
|
|
||||||
hostsample.dsp - MSVC++ 5.0 project
|
|
||||||
hostsample.vcproj - Visual Studio 2005 project (32 and 64 bit targets)
|
|
||||||
|
|
||||||
driver/asiosample:
|
|
||||||
asiosmpl.h
|
|
||||||
asiosmpl.cpp - ASIO 2.0 sample driver
|
|
||||||
wintimer.cpp - bufferSwitch() wakeup thread (Windows)
|
|
||||||
asiosample.def - Windows DLL module export definition
|
|
||||||
mactimer.cpp - bufferSwitch() wakeup thread (Macintosh)
|
|
||||||
macnanosecs.cpp - Macintosh system reference time
|
|
||||||
makesamp.cpp - Macintosh driver object instantiation
|
|
||||||
|
|
||||||
driver/asiosample/asiosample:
|
|
||||||
asiosample.dsp - MSVC++ 5.0 project
|
|
||||||
asiosample.vcproj - Visual Studio 2005 project (32 and 64 bit targets)
|
|
||||||
Binary file not shown.
Loading…
Reference in a new issue