Note that specific support for paInputUnderflow, paOutputOverflow and
paNeverDropInput is not necessary or possible with this driver due to the
synchronous full duplex double-buffered architecture of ASIO.
-
- @todo implement host api specific extension to set i/o buffer sizes in frames
-
- @todo review ReadStream, WriteStream, GetStreamReadAvailable, GetStreamWriteAvailable
-
- @todo review Blocking i/o latency computations in OpenStream(), changing ring
- buffer to a non-power-of-two structure could reduce blocking i/o latency.
-
- @todo implement IsFormatSupported
-
- @todo work out how to implement stream stoppage from callback and
- implement IsStreamActive properly. Stream stoppage could be implemented
- using a high-priority thread blocked on an Event which is signalled
- by the callback. Or, we could just call ASIO stop from the callback
- and see what happens.
-
- @todo rigorously check asio return codes and convert to pa error codes
-
- @todo Different channels of a multichannel stream can have different sample
- formats, but we assume that all are the same as the first channel for now.
- Fixing this will require the block processor to maintain per-channel
- conversion functions - could get nasty.
-
- @todo investigate whether the asio processNow flag needs to be honoured
-
- @todo handle asioMessages() callbacks in a useful way, or at least document
- what cases we don't handle.
-
- @todo miscellaneous other FIXMEs
-
- @todo provide an asio-specific method for setting the systems specific
- value (aka main window handle) - check that this matches the value
- passed to PaAsio_ShowControlPanel, or remove it entirely from
- PaAsio_ShowControlPanel. - this would allow PaAsio_ShowControlPanel
- to be called for the currently open stream (at present all streams
- must be closed).
*/
-
#include <stdio.h>
#include <assert.h>
#include <string.h>
if( inputChannelCount > 0 )
{
- /* FIXME: assume all channels use the same type for now */
+ /* FIXME: assume all channels use the same type for now
+
+ see: "ASIO devices with multiple sample formats are unsupported"
+ http://www.portaudio.com/trac/ticket/106
+ */
ASIOSampleType inputType = stream->asioChannelInfos[0].type;
PA_DEBUG(("ASIO Input type:%d",inputType));
if( outputChannelCount > 0 )
{
- /* FIXME: assume all channels use the same type for now */
+ /* FIXME: assume all channels use the same type for now
+
+ see: "ASIO devices with multiple sample formats are unsupported"
+ http://www.portaudio.com/trac/ticket/106
+ */
ASIOSampleType outputType = stream->asioChannelInfos[inputChannelCount].type;
PA_DEBUG(("ASIO Output type:%d",outputType));
if( !theAsioStream )
return 0L;
- // Keep sample position
- // FIXME: asioDriverInfo.pahsc_NumFramesDone = timeInfo->timeInfo.samplePosition.lo;
-
-
// protect against reentrancy
if( PaAsio_AtomicIncrement(&theAsioStream->reenterCount) )
{
{
#if 0
+/*
+ see: "ASIO callback underflow/overflow buffer slip detection doesn't work"
+ http://www.portaudio.com/trac/ticket/110
+*/
+
// test code to try to detect slip conditions... these may work on some systems
// but neither of them work on the RME Digi96
// Reset the driver is done by completely destruct is. I.e. ASIOStop(), ASIODisposeBuffers(), Destruction
// Afterwards you initialize the driver again.
- /*FIXME: commented the next line out */
+ /*FIXME: commented the next line out
+
+ see: "PA/ASIO ignores some driver notifications it probably shouldn't"
+ http://www.portaudio.com/trac/ticket/108
+ */
//asioDriverInfo.stopped; // In this sample the processing will just stop
ret = 1L;
break;