[PD-cvs] pd/src s_audio_asio.cpp,1.1.4.7,1.1.4.8
Thomas Grill
xovo at users.sourceforge.net
Tue Nov 9 16:30:39 CET 2004
Update of /cvsroot/pure-data/pd/src
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv25685/src
Modified Files:
Tag: devel_0_38
s_audio_asio.cpp
Log Message:
better handling of error situations
but: C++ exception handling may not be a good idea....
Index: s_audio_asio.cpp
===================================================================
RCS file: /cvsroot/pure-data/pd/src/Attic/s_audio_asio.cpp,v
retrieving revision 1.1.4.7
retrieving revision 1.1.4.8
diff -C2 -d -r1.1.4.7 -r1.1.4.8
*** s_audio_asio.cpp 8 Nov 2004 20:18:41 -0000 1.1.4.7
--- s_audio_asio.cpp 9 Nov 2004 15:30:37 -0000 1.1.4.8
***************
*** 117,123 ****
/* global storage */
static ASIODriverInfo * asio_driver = NULL;
! static ASIOBufferInfo * asio_bufferinfo;
! static ASIOChannelInfo* asio_channelinfo;
! static AsioTimeInfo * asio_timerinfo;
static ASIOCallbacks asio_callbacks;
extern AsioDrivers * asioDrivers; /* declared in asiodrivers.cpp */
--- 117,123 ----
/* global storage */
static ASIODriverInfo * asio_driver = NULL;
! static ASIOBufferInfo * asio_bufferinfo = NULL;
! static ASIOChannelInfo* asio_channelinfo = NULL;
! static AsioTimeInfo * asio_timerinfo = NULL;
static ASIOCallbacks asio_callbacks;
extern AsioDrivers * asioDrivers; /* declared in asiodrivers.cpp */
***************
*** 142,146 ****
/* ringbuffer stuff */
! static t_sample ** asio_ringbuffer; /* ringbuffers */
static int asio_ringbuffer_inoffset; /* ringbuffer(in) pointer offset for dac */
static int asio_ringbuffer_outoffset; /* ringbuffer(out) pointer offset */
--- 142,146 ----
/* ringbuffer stuff */
! static t_sample ** asio_ringbuffer = NULL; /* ringbuffers */
static int asio_ringbuffer_inoffset; /* ringbuffer(in) pointer offset for dac */
static int asio_ringbuffer_outoffset; /* ringbuffer(out) pointer offset */
***************
*** 165,169 ****
{
ASIOError status;
! ASIOBufferInfo * buffers;
int i;
int channels;
--- 165,169 ----
{
ASIOError status;
! ASIOBufferInfo * buffers = NULL;
int i;
int channels;
***************
*** 175,195 ****
#endif
/* check, if we use the first asio device */
prepare_asio_drivernames();
!
/* load the driver */
if (!asioDrivers)
asioDrivers = new AsioDrivers();
- /* check, if the driver is still running */
- if (asio_driver)
- asio_close_audio();
-
asioDrivers->getDriverNames(asio_drivernames,MAXNDEV);
! asioDrivers->loadDriver(asio_drivernames[*audioindev]);
!
!
/* initialize ASIO */
--- 175,198 ----
#endif
+ /* check, if the driver is still running */
+ if(asio_driver)
+ asio_close_audio();
/* check, if we use the first asio device */
prepare_asio_drivernames();
!
/* load the driver */
if (!asioDrivers)
asioDrivers = new AsioDrivers();
asioDrivers->getDriverNames(asio_drivernames,MAXNDEV);
! try {
! asioDrivers->loadDriver(asio_drivernames[*audioindev]);
! }
! catch(...) {
! error("ASIO: Error loading driver");
! goto bailout;
! }
/* initialize ASIO */
***************
*** 217,233 ****
case ASE_NotPresent:
error("ASIO: ASE_NotPresent");
! freebytes(asio_driver, sizeof (ASIODriverInfo));
! asio_driver = NULL;
! return;
case ASE_NoMemory:
error("ASIO: ASE_NoMemory");
! freebytes(asio_driver, sizeof (ASIODriverInfo));
! asio_driver = NULL;
! return;
case ASE_HWMalfunction:
error("ASIO: ASE_HWMalfunction");
! freebytes(asio_driver, sizeof (ASIODriverInfo));
! asio_driver = NULL;
! return;
}
#ifdef ASIODEBUG
--- 220,230 ----
case ASE_NotPresent:
error("ASIO: ASE_NotPresent");
! goto bailout;
case ASE_NoMemory:
error("ASIO: ASE_NoMemory");
! goto bailout;
case ASE_HWMalfunction:
error("ASIO: ASE_HWMalfunction");
! goto bailout;
}
#ifdef ASIODEBUG
***************
*** 238,243 ****
/* query driver */
status = ASIOGetChannels(&asio_inchannels, &asio_outchannels);
#ifdef ASIODEBUG
- ASSERT(status == ASE_OK);
post ("ASIOGetChannels\tinputs: %d, outputs: %d", asio_inchannels,
asio_outchannels);
--- 235,245 ----
/* query driver */
status = ASIOGetChannels(&asio_inchannels, &asio_outchannels);
+ if(status != ASE_OK)
+ {
+ error("ASIO: Couldn't get channel count");
+ goto bailout;
+ }
+
#ifdef ASIODEBUG
post ("ASIOGetChannels\tinputs: %d, outputs: %d", asio_inchannels,
asio_outchannels);
***************
*** 248,257 ****
channels = sys_inchannels + sys_outchannels;
-
status = ASIOGetBufferSize(&asio_minbufsize, &asio_maxbufsize, &asio_prefbufsize,
&asio_granularity);
#ifdef ASIODEBUG
- ASSERT(status == ASE_OK);
post ("ASIOGetBufferSize\tmin: %d, max: %d, preferred: %d, granularity: "
"%d", asio_minbufsize, asio_maxbufsize, asio_prefbufsize,
--- 250,262 ----
channels = sys_inchannels + sys_outchannels;
status = ASIOGetBufferSize(&asio_minbufsize, &asio_maxbufsize, &asio_prefbufsize,
&asio_granularity);
+ if(status != ASE_OK)
+ {
+ error("ASIO: Couldn't get buffer size");
+ goto bailout;
+ }
#ifdef ASIODEBUG
post ("ASIOGetBufferSize\tmin: %d, max: %d, preferred: %d, granularity: "
"%d", asio_minbufsize, asio_maxbufsize, asio_prefbufsize,
***************
*** 299,307 ****
{
error("ASIO: couldn't allocate buffer or channel info");
! if (asio_bufferinfo)
! freebytes(asio_bufferinfo, channels * sizeof (ASIOBufferInfo));
! if (asio_channelinfo)
! freebytes(asio_channelinfo, channels * sizeof (ASIOChannelInfo));
! return;
}
--- 304,308 ----
{
error("ASIO: couldn't allocate buffer or channel info");
! goto bailout;
}
***************
*** 321,337 ****
}
! if (ASIOCreateBuffers(asio_bufferinfo, sys_inchannels + sys_outchannels,
! asio_bufsize, &asio_callbacks)
! == ASE_OK)
! {
! #ifdef ASIODEBUG
! post("ASIO: buffers allocated");
! #endif
! }
! else
{
error("ASIO: couldn't allocate buffers");
! return;
}
asio_converter = (converter_t **)getbytes(channels * sizeof (converter_t *));
--- 322,336 ----
}
! status = ASIOCreateBuffers(asio_bufferinfo, sys_inchannels + sys_outchannels,
! asio_bufsize, &asio_callbacks);
!
! if(status != ASE_OK)
{
error("ASIO: couldn't allocate buffers");
! goto bailout;
}
+ #ifdef ASIODEBUG
+ post("ASIO: buffers allocated");
+ #endif
asio_converter = (converter_t **)getbytes(channels * sizeof (converter_t *));
***************
*** 390,398 ****
asio_ringbuffer_inoffset = asio_ringbuffer_outoffset = 0;
! if (ASIOStart() == ASE_OK)
! post("ASIO: started");
! else
! post("ASIO: couldn't start");
}
--- 389,401 ----
asio_ringbuffer_inoffset = asio_ringbuffer_outoffset = 0;
+ if(ASIOStart() != ASE_OK) goto bailout;
! post("ASIO: started");
! return;
!
! bailout:
! post("ASIO: couldn't start");
! asio_close_audio();
! return;
}
***************
*** 404,409 ****
if (asio_driver)
{
- post("ASIO: close");
-
pthread_cond_broadcast(&asio_ringbuf_cond);
--- 407,410 ----
***************
*** 417,466 ****
// -> clear output buffers and notify driver
#if 0
! // slow, blocking method
! for(i = 0; i != sys_outchannels; ++i)
! zerovec_simd(asio_ringbuffer[i], asio_ringbuffer_length);
! // wait for bufferswitch to process silence (twice)
! pthread_cond_wait(&asio_ringbuf_cond, &asio_ringbuf_mutex);
! for(i = 0; i != sys_outchannels; ++i)
! memset(asio_ringbuffer[i], 0, asio_ringbuffer_length * sizeof (t_sample));
! pthread_cond_wait(&asio_ringbuf_cond, &asio_ringbuf_mutex);
#else
// direct method - clear both hardware buffers
! for(i = 0; i < sys_outchannels; ++i) {
! long bytes = asio_bufsize*asio_out_samplewidth[i];
! memset(asio_bufferinfo[i].buffers[0],0,bytes);
! memset(asio_bufferinfo[i].buffers[1],0,bytes);
}
// notify driver
! ASIOOutputReady();
#endif
}
-
- status = ASIOStop();
- ASSERT(status == ASE_OK);
! for (i = 0; i != channels; i++)
! freealignedbytes(asio_ringbuffer[i],
! asio_ringbuffer_length * sizeof (t_sample));
! freebytes(asio_ringbuffer, channels * sizeof (t_sample *));
! freebytes(asio_bufferinfo, channels * sizeof (ASIOBufferInfo));
! freebytes(asio_channelinfo, channels * sizeof (ASIOChannelInfo));
! status = ASIODisposeBuffers();
! ASSERT(status == ASE_OK);
!
! asio_ringbuffer = NULL;
! asio_bufferinfo = NULL;
! asio_channelinfo = NULL;
!
if(asio_converter)
freebytes(asio_converter, channels * sizeof (converter_t *));
! asio_converter = NULL;
if(asio_out_samplewidth)
freebytes(asio_out_samplewidth, sys_outchannels * sizeof (int));
! asio_out_samplewidth = NULL;
!
! status = ASIOExit();
! ASSERT(status == ASE_OK);
freebytes(asio_driver, sizeof (ASIODriverInfo));
--- 418,492 ----
// -> clear output buffers and notify driver
#if 0
! if(asio_ringbuffer)
! {
! // slow, blocking method
! for(i = 0; i != sys_outchannels; ++i)
! zerovec_simd(asio_ringbuffer[i], asio_ringbuffer_length);
! // wait for bufferswitch to process silence (twice)
! pthread_cond_wait(&asio_ringbuf_cond, &asio_ringbuf_mutex);
! for(i = 0; i != sys_outchannels; ++i)
! memset(asio_ringbuffer[i], 0, asio_ringbuffer_length * sizeof (t_sample));
! pthread_cond_wait(&asio_ringbuf_cond, &asio_ringbuf_mutex);
! }
#else
// direct method - clear both hardware buffers
! if(asio_bufferinfo && asio_out_samplewidth)
! {
! for(i = 0; i < sys_outchannels; ++i) {
! long bytes = asio_bufsize*asio_out_samplewidth[i];
! memset(asio_bufferinfo[i].buffers[0],0,bytes);
! memset(asio_bufferinfo[i].buffers[1],0,bytes);
! }
}
// notify driver
! status = ASIOOutputReady();
#endif
}
! status = ASIOStop();
! if(status == ASE_OK) post("ASIO: stopped");
!
! status = ASIODisposeBuffers();
!
! try {
! // ASIOExit can crash if driver not really running
! status = ASIOExit();
! }
! catch(...) {}
!
! // deallocate all memory
!
! if(asio_ringbuffer)
! {
! for(i = 0; i < channels; i++)
! if(asio_ringbuffer[i])
! freealignedbytes(asio_ringbuffer[i],asio_ringbuffer_length * sizeof (t_sample));
! freebytes(asio_ringbuffer, channels * sizeof (t_sample *));
! asio_ringbuffer = NULL;
! }
!
! if(asio_bufferinfo)
! {
! freebytes(asio_bufferinfo, channels * sizeof (ASIOBufferInfo));
! asio_bufferinfo = NULL;
! }
!
! if(asio_channelinfo)
! {
! freebytes(asio_channelinfo, channels * sizeof (ASIOChannelInfo));
! asio_channelinfo = NULL;
! }
!
if(asio_converter)
+ {
freebytes(asio_converter, channels * sizeof (converter_t *));
! asio_converter = NULL;
! }
if(asio_out_samplewidth)
+ {
freebytes(asio_out_samplewidth, sys_outchannels * sizeof (int));
! asio_out_samplewidth = NULL;
! }
freebytes(asio_driver, sizeof (ASIODriverInfo));
More information about the Pd-cvs
mailing list