[PD-cvs] pd/src s_audio_asio.cpp,1.1.4.3,1.1.4.4
Tim Blechmann
timblech at users.sourceforge.net
Sun Nov 7 14:47:08 CET 2004
- Previous message: [PD-cvs] pd/src Makefile.am,1.1.4.2,1.1.4.3 u_main.tk,1.4.4.1,1.4.4.2
- Next message: [PD-cvs] externals/hcs/hid TODO,1.2,1.3 hid-help.pd,1.7,1.8 hid.c,1.11,1.12 hid.h,1.8,1.9 hid_darwin.c,1.6,1.7 hid_linux.c,1.3,1.4 mouse-help.pd,1.2,1.3
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
Update of /cvsroot/pure-data/pd/src
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27101
Modified Files:
Tag: devel_0_38
s_audio_asio.cpp
Log Message:
experimental ringbuffer reading
Index: s_audio_asio.cpp
===================================================================
RCS file: /cvsroot/pure-data/pd/src/Attic/s_audio_asio.cpp,v
retrieving revision 1.1.4.3
retrieving revision 1.1.4.4
diff -C2 -d -r1.1.4.3 -r1.1.4.4
*** s_audio_asio.cpp 7 Nov 2004 11:11:54 -0000 1.1.4.3
--- s_audio_asio.cpp 7 Nov 2004 13:47:05 -0000 1.1.4.4
***************
*** 46,49 ****
--- 46,51 ----
#endif
+ #define ASIODEBUG
+
/* public function prototypes */
extern "C" void asio_open_audio(int naudioindev, int *audioindev, int nchindev,
***************
*** 99,104 ****
/* that's the sample width in bytes (per output channel) -
! it's only for silence when stopping the driver.... (please find a better solution)
! */
static int *asio_out_samplewidth = NULL;
--- 101,106 ----
/* that's the sample width in bytes (per output channel) -
! * it's only for silence when stopping the driver.... (please find a better solution)
! */
static int *asio_out_samplewidth = NULL;
***************
*** 146,149 ****
--- 148,154 ----
static pthread_cond_t asio_ringbuf_cond = PTHREAD_COND_INITIALIZER;
+ /* some global definitions: */
+ #define ASIOVERSION 2 /* i hope we are compatible with asio 2 */
+
/* definitions from s_audio.c ... it should be save to use them */
#define DEVDESCSIZE 80
***************
*** 187,191 ****
/* initialize ASIO */
asio_driver = (ASIODriverInfo*) getbytes (sizeof(ASIODriverInfo));
! asio_driver->asioVersion = 2; /* i hope we are compatible with asio 2 */
#ifdef MSW
--- 192,196 ----
/* initialize ASIO */
asio_driver = (ASIODriverInfo*) getbytes (sizeof(ASIODriverInfo));
! asio_driver->asioVersion = ASIOVERSION;
#ifdef MSW
***************
*** 223,248 ****
return;
}
post("ASIO initialized successfully");
!
/* query driver */
status = ASIOGetChannels(&asio_inchannels, &asio_outchannels);
ASSERT(status == ASE_OK);
post ("ASIOGetChannels\tinputs: %d, outputs: %d", asio_inchannels,
asio_outchannels);
- /* tb: todo: channel count hardcoded to asio hardware */
sys_inchannels = *chindev <= asio_inchannels ? *chindev : asio_inchannels;
sys_outchannels = *choutdev <= asio_outchannels ? *choutdev : asio_outchannels;
channels = sys_inchannels + sys_outchannels;
!
status = ASIOGetBufferSize(&asio_minbufsize, &asio_maxbufsize, &asio_prefbufsize,
&asio_granularity);
ASSERT(status == ASE_OK);
post ("ASIOGetBufferSize\tmin: %d, max: %d, preferred: %d, granularity: "
"%d", asio_minbufsize, asio_maxbufsize, asio_prefbufsize,
asio_granularity);
/* todo: buffer size hardcoded to asio hardware */
--- 228,258 ----
return;
}
+ #ifdef ASIODEBUG
post("ASIO initialized successfully");
! #endif
/* query driver */
status = ASIOGetChannels(&asio_inchannels, &asio_outchannels);
+ #ifdef ASIODEBUG
ASSERT(status == ASE_OK);
post ("ASIOGetChannels\tinputs: %d, outputs: %d", asio_inchannels,
asio_outchannels);
+ #endif
sys_inchannels = *chindev <= asio_inchannels ? *chindev : asio_inchannels;
sys_outchannels = *choutdev <= asio_outchannels ? *choutdev : asio_outchannels;
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,
asio_granularity);
+ #endif
/* todo: buffer size hardcoded to asio hardware */
***************
*** 279,284 ****
/* prepare, create and set up buffers */
! asio_bufferinfo = (ASIOBufferInfo*) getbytes (channels * sizeof (ASIOBufferInfo));
! asio_channelinfo = (ASIOChannelInfo*) getbytes(channels * sizeof (ASIOChannelInfo));
if (!(asio_bufferinfo && asio_channelinfo))
{
--- 289,296 ----
/* prepare, create and set up buffers */
! asio_bufferinfo = (ASIOBufferInfo*) getbytes (channels *
! sizeof (ASIOBufferInfo));
! asio_channelinfo = (ASIOChannelInfo*) getbytes(channels *
! sizeof (ASIOChannelInfo));
if (!(asio_bufferinfo && asio_channelinfo))
{
***************
*** 310,314 ****
--- 322,328 ----
== ASE_OK)
{
+ #ifdef ASIODEBUG
post("ASIO: buffers allocated");
+ #endif
}
else
***************
*** 391,395 ****
int i;
! // pthread_cond_broadcast(&asio_ringbuf_cond);
if(asio_useoutputready)
--- 405,409 ----
int i;
! pthread_cond_broadcast(&asio_ringbuf_cond);
if(asio_useoutputready)
***************
*** 418,421 ****
--- 432,437 ----
}
+ post("ASIO: close");
+
status = ASIOStop();
ASSERT(status == ASE_OK);
***************
*** 423,428 ****
if (asio_driver)
{
for (i = 0; i != channels; i++)
! freebytes(asio_ringbuffer[i], asio_ringbuffer_length * sizeof (t_sample));
freebytes(asio_ringbuffer, channels * sizeof (t_sample *));
freebytes(asio_bufferinfo, channels * sizeof (ASIOBufferInfo));
--- 439,447 ----
if (asio_driver)
{
+ ASIOStop();
+
for (i = 0; i != channels; i++)
! freebytes(asio_ringbuffer[i],
! asio_ringbuffer_length * sizeof (t_sample));
freebytes(asio_ringbuffer, channels * sizeof (t_sample *));
freebytes(asio_bufferinfo, channels * sizeof (ASIOBufferInfo));
***************
*** 435,441 ****
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;
--- 454,463 ----
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;
***************
*** 487,492 ****
#endif
-
-
/* send sound to ringbuffer */
sp = sys_soundout;
--- 509,512 ----
***************
*** 503,509 ****
for (j = 0; j < sys_inchannels; j++)
{
memcpy(sp, asio_ringbuffer[i+j] + asio_ringbuffer_inoffset,
DEFDACBLKSIZE*sizeof(t_sample));
! sp+=DEFDACBLKSIZE;
}
--- 523,544 ----
for (j = 0; j < sys_inchannels; j++)
{
+ /* we should be able to read from the ringbuffer on a different position
+ * to reduce latency for asio buffer sizes that aren't multiples of 64...
+ * rethink this: */
+ #if 0
+ int offset = 2 * asio_bufsize;
+ if (asio_ringbuffer_inoffset <= offset )
+ memcpy(sp, asio_ringbuffer[i+j] + asio_ringbuffer_length +
+ asio_ringbuffer_inoffset - offset ,
+ DEFDACBLKSIZE*sizeof(t_sample));
+ else
+ memcpy(sp, asio_ringbuffer[i+j] + asio_ringbuffer_inoffset - offset,
+ DEFDACBLKSIZE*sizeof(t_sample));
+ #else /* working but higer latency */
memcpy(sp, asio_ringbuffer[i+j] + asio_ringbuffer_inoffset,
DEFDACBLKSIZE*sizeof(t_sample));
!
! #endif
! sp+=DEFDACBLKSIZE;
}
***************
*** 552,556 ****
static long asio_messages(long selector, long value, void* message, double* opt)
{
! /* todo */
return 0L;
}
--- 587,613 ----
static long asio_messages(long selector, long value, void* message, double* opt)
{
! switch (selector)
! {
! case kAsioSelectorSupported:
! return 1L;
! case kAsioEngineVersion:
! return ASIOVERSION;
! case kAsioResetRequest:
! /* how to handle this without changing the dsp scheduler? */
! return 1L;
! case kAsioBufferSizeChange:
! /* todo */
! return 0L; /* should be 1 */
! case kAsioResyncRequest:
! return 0L;
! case kAsioLatenciesChanged:
! /* we are not handling the latencies atm */
! return 0L;
! case kAsioSupportsTimeInfo:
! return 1L;
! case kAsioSupportsTimeCode:
! /* we don't support that atm */
! return 0L;
! }
return 0L;
}
***************
*** 638,647 ****
case ASIOSTInt32MSB:
return float32toInt32_S;
-
case ASIOSTFloat32LSB: // IEEE 754 32 bit float, as found on Intel x86 architecture
return float32tofloat32;
case ASIOSTFloat32MSB:
return float32tofloat32_S;
-
case ASIOSTFloat64LSB: // IEEE 754 64 bit double float, as found on Intel x86 architecture
return float32tofloat64;
--- 695,702 ----
***************
*** 689,698 ****
case ASIOSTInt32MSB:
return Int32tofloat32_S;
!
case ASIOSTFloat32LSB: // IEEE 754 32 bit float, as found on Intel x86 architecture
return float32tofloat32;
- case ASIOSTFloat32MSB:
- return float32tofloat32_S;
-
case ASIOSTFloat64LSB: // IEEE 754 64 bit double float, as found on Intel x86 architecture
return float64tofloat32;
--- 744,751 ----
case ASIOSTInt32MSB:
return Int32tofloat32_S;
! case ASIOSTFloat32MSB: // IEEE 754 32 bit float, as found on Intel x86 architecture
! float32tofloat32_S;
case ASIOSTFloat32LSB: // IEEE 754 32 bit float, as found on Intel x86 architecture
return float32tofloat32;
case ASIOSTFloat64LSB: // IEEE 754 64 bit double float, as found on Intel x86 architecture
return float64tofloat32;
***************
*** 714,718 ****
case ASIOSTInt32MSB24: // 32 bit data with 24 bit alignment
default:
! post("Input sample Type %d not supported, yet!!!",format);
return NULL;
}
--- 767,771 ----
case ASIOSTInt32MSB24: // 32 bit data with 24 bit alignment
default:
! post("Input sample Type %d not supported, yet!!!",format);
return NULL;
}
***************
*** 798,802 ****
static void float32tofloat32(void* inbuffer, void* outbuffer, long frames)
{
! memcpy (outbuffer, inbuffer, frames* sizeof (float)); /* check */
}
--- 851,855 ----
static void float32tofloat32(void* inbuffer, void* outbuffer, long frames)
{
! memcpy (outbuffer, inbuffer, frames* sizeof (float));
}
- Previous message: [PD-cvs] pd/src Makefile.am,1.1.4.2,1.1.4.3 u_main.tk,1.4.4.1,1.4.4.2
- Next message: [PD-cvs] externals/hcs/hid TODO,1.2,1.3 hid-help.pd,1.7,1.8 hid.c,1.11,1.12 hid.h,1.8,1.9 hid_darwin.c,1.6,1.7 hid_linux.c,1.3,1.4 mouse-help.pd,1.2,1.3
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
More information about the Pd-cvs
mailing list