\r
// Get the latency of the JACK port.\r
ports = jack_get_ports( client, deviceName.c_str(), NULL, flag );\r
- if ( ports[ firstChannel ] )\r
- stream_.latency[mode] = jack_port_get_latency( jack_port_by_name( client, ports[ firstChannel ] ) );\r
+ if ( ports[ firstChannel ] ) {\r
+ // Added by Ge Wang\r
+ jack_latency_callback_mode_t cbmode = (mode == INPUT ? JackCaptureLatency : JackPlaybackLatency);\r
+ // the range (usually the min and max are equal)\r
+ jack_latency_range_t latrange; latrange.min = latrange.max = 0;\r
+ // get the latency range\r
+ jack_port_get_latency_range( jack_port_by_name( client, ports[firstChannel] ), cbmode, &latrange );\r
+ // be optimistic, use the min!\r
+ stream_.latency[mode] = latrange.min;\r
+ //stream_.latency[mode] = jack_port_get_latency( jack_port_by_name( client, ports[ firstChannel ] ) );\r
+ }\r
free( ports );\r
\r
// The jack server always uses 32-bit floating-point data.\r
info.nativeFormats |= RTAUDIO_FLOAT32;\r
else if ( channelInfo.type == ASIOSTFloat64MSB || channelInfo.type == ASIOSTFloat64LSB )\r
info.nativeFormats |= RTAUDIO_FLOAT64;\r
+ else if ( channelInfo.type == ASIOSTInt24MSB || channelInfo.type == ASIOSTInt24LSB )\r
+ info.nativeFormats |= RTAUDIO_SINT24;\r
\r
if ( info.outputChannels > 0 )\r
if ( getDefaultOutputDevice() == device ) info.isDefaultOutput = true;\r
stream_.deviceFormat[mode] = RTAUDIO_FLOAT64;\r
if ( channelInfo.type == ASIOSTFloat64MSB ) stream_.doByteSwap[mode] = true;\r
}\r
+ else if ( channelInfo.type == ASIOSTInt24MSB || channelInfo.type == ASIOSTInt24LSB ) {\r
+ stream_.deviceFormat[mode] = RTAUDIO_SINT24;\r
+ if ( channelInfo.type == ASIOSTInt24MSB ) stream_.doByteSwap[mode] = true;\r
+ }\r
\r
if ( stream_.deviceFormat[mode] == 0 ) {\r
drivers.removeCurrentDriver();\r
// Determine the device buffer size. By default, we'll use the value\r
// defined above (32K), but we will grow it to make allowances for\r
// very large software buffer sizes.\r
- DWORD dsBufferSize = MINIMUM_DEVICE_BUFFER_SIZE;;\r
+ DWORD dsBufferSize = MINIMUM_DEVICE_BUFFER_SIZE;\r
DWORD dsPointerLeadTime = 0;\r
\r
void *ohandle = 0, *bhandle = 0;\r
if ( priority < min ) priority = min;\r
else if ( priority > max ) priority = max;\r
param.sched_priority = priority;\r
- pthread_attr_setschedparam( &attr, ¶m );\r
pthread_attr_setschedpolicy( &attr, SCHED_RR );\r
+ pthread_attr_setschedparam( &attr, ¶m );\r
}\r
else\r
pthread_attr_setschedpolicy( &attr, SCHED_OTHER );\r
{\r
if ( format == RTAUDIO_SINT16 )\r
return 2;\r
- else if ( format == RTAUDIO_SINT24 || format == RTAUDIO_SINT32 ||\r
- format == RTAUDIO_FLOAT32 )\r
+ else if ( format == RTAUDIO_SINT32 || format == RTAUDIO_FLOAT32 )\r
return 4;\r
else if ( format == RTAUDIO_FLOAT64 )\r
return 8;\r
+ else if ( format == RTAUDIO_SINT24 )\r
+ return 3;\r
else if ( format == RTAUDIO_SINT8 )\r
return 1;\r
\r
}\r
}\r
else if (info.inFormat == RTAUDIO_SINT24) {\r
- Int32 *in = (Int32 *)inBuffer;\r
+ Int24 *in = (Int24 *)inBuffer;\r
scale = 1.0 / 8388607.5;\r
for (unsigned int i=0; i<stream_.bufferSize; i++) {\r
for (j=0; j<info.channels; j++) {\r
- out[info.outOffset[j]] = (Float64) (in[info.inOffset[j]] & 0x00ffffff);\r
+ out[info.outOffset[j]] = (Float64) (in[info.inOffset[j]].asInt());\r
out[info.outOffset[j]] += 0.5;\r
out[info.outOffset[j]] *= scale;\r
}\r
}\r
}\r
else if (info.inFormat == RTAUDIO_SINT24) {\r
- Int32 *in = (Int32 *)inBuffer;\r
+ Int24 *in = (Int24 *)inBuffer;\r
scale = (Float32) ( 1.0 / 8388607.5 );\r
for (unsigned int i=0; i<stream_.bufferSize; i++) {\r
for (j=0; j<info.channels; j++) {\r
- out[info.outOffset[j]] = (Float32) (in[info.inOffset[j]] & 0x00ffffff);\r
+ out[info.outOffset[j]] = (Float32) (in[info.inOffset[j]].asInt());\r
out[info.outOffset[j]] += 0.5;\r
out[info.outOffset[j]] *= scale;\r
}\r
out += info.outJump;\r
}\r
}\r
- else if (info.inFormat == RTAUDIO_SINT24) { // Hmmm ... we could just leave it in the lower 3 bytes\r
- Int32 *in = (Int32 *)inBuffer;\r
+ else if (info.inFormat == RTAUDIO_SINT24) {\r
+ Int24 *in = (Int24 *)inBuffer;\r
for (unsigned int i=0; i<stream_.bufferSize; i++) {\r
for (j=0; j<info.channels; j++) {\r
- out[info.outOffset[j]] = (Int32) in[info.inOffset[j]];\r
+ out[info.outOffset[j]] = (Int32) in[info.inOffset[j]].asInt();\r
out[info.outOffset[j]] <<= 8;\r
}\r
in += info.inJump;\r
}\r
}\r
else if (info.outFormat == RTAUDIO_SINT24) {\r
- Int32 *out = (Int32 *)outBuffer;\r
+ Int24 *out = (Int24 *)outBuffer;\r
if (info.inFormat == RTAUDIO_SINT8) {\r
signed char *in = (signed char *)inBuffer;\r
for (unsigned int i=0; i<stream_.bufferSize; i++) {\r
for (j=0; j<info.channels; j++) {\r
- out[info.outOffset[j]] = (Int32) in[info.inOffset[j]];\r
- out[info.outOffset[j]] <<= 16;\r
+ out[info.outOffset[j]] = (Int32) (in[info.inOffset[j]] << 16);\r
+ //out[info.outOffset[j]] <<= 16;\r
}\r
in += info.inJump;\r
out += info.outJump;\r
Int16 *in = (Int16 *)inBuffer;\r
for (unsigned int i=0; i<stream_.bufferSize; i++) {\r
for (j=0; j<info.channels; j++) {\r
- out[info.outOffset[j]] = (Int32) in[info.inOffset[j]];\r
- out[info.outOffset[j]] <<= 8;\r
+ out[info.outOffset[j]] = (Int32) (in[info.inOffset[j]] << 8);\r
+ //out[info.outOffset[j]] <<= 8;\r
}\r
in += info.inJump;\r
out += info.outJump;\r
}\r
else if (info.inFormat == RTAUDIO_SINT24) {\r
// Channel compensation and/or (de)interleaving only.\r
- Int32 *in = (Int32 *)inBuffer;\r
+ Int24 *in = (Int24 *)inBuffer;\r
for (unsigned int i=0; i<stream_.bufferSize; i++) {\r
for (j=0; j<info.channels; j++) {\r
out[info.outOffset[j]] = in[info.inOffset[j]];\r
Int32 *in = (Int32 *)inBuffer;\r
for (unsigned int i=0; i<stream_.bufferSize; i++) {\r
for (j=0; j<info.channels; j++) {\r
- out[info.outOffset[j]] = (Int32) in[info.inOffset[j]];\r
- out[info.outOffset[j]] >>= 8;\r
+ out[info.outOffset[j]] = (Int32) (in[info.inOffset[j]] >> 8);\r
+ //out[info.outOffset[j]] >>= 8;\r
}\r
in += info.inJump;\r
out += info.outJump;\r
}\r
}\r
else if (info.inFormat == RTAUDIO_SINT24) {\r
- Int32 *in = (Int32 *)inBuffer;\r
+ Int24 *in = (Int24 *)inBuffer;\r
for (unsigned int i=0; i<stream_.bufferSize; i++) {\r
for (j=0; j<info.channels; j++) {\r
- out[info.outOffset[j]] = (Int16) ((in[info.inOffset[j]] >> 8) & 0x0000ffff);\r
+ out[info.outOffset[j]] = (Int16) (in[info.inOffset[j]].asInt() >> 8);\r
}\r
in += info.inJump;\r
out += info.outJump;\r
}\r
}\r
else if (info.inFormat == RTAUDIO_SINT24) {\r
- Int32 *in = (Int32 *)inBuffer;\r
+ Int24 *in = (Int24 *)inBuffer;\r
for (unsigned int i=0; i<stream_.bufferSize; i++) {\r
for (j=0; j<info.channels; j++) {\r
- out[info.outOffset[j]] = (signed char) ((in[info.inOffset[j]] >> 16) & 0x000000ff);\r
+ out[info.outOffset[j]] = (signed char) (in[info.inOffset[j]].asInt() >> 16);\r
}\r
in += info.inJump;\r
out += info.outJump;\r
}\r
}\r
\r
- //static inline uint16_t bswap_16(uint16_t x) { return (x>>8) | (x<<8); }\r
- //static inline uint32_t bswap_32(uint32_t x) { return (bswap_16(x&0xffff)<<16) | (bswap_16(x>>16)); }\r
- //static inline uint64_t bswap_64(uint64_t x) { return (((unsigned long long)bswap_32(x&0xffffffffull))<<32) | (bswap_32(x>>32)); }\r
+//static inline uint16_t bswap_16(uint16_t x) { return (x>>8) | (x<<8); }\r
+//static inline uint32_t bswap_32(uint32_t x) { return (bswap_16(x&0xffff)<<16) | (bswap_16(x>>16)); }\r
+//static inline uint64_t bswap_64(uint64_t x) { return (((unsigned long long)bswap_32(x&0xffffffffull))<<32) | (bswap_32(x>>32)); }\r
\r
void RtApi :: byteSwapBuffer( char *buffer, unsigned int samples, RtAudioFormat format )\r
{\r
ptr += 2;\r
}\r
}\r
- else if ( format == RTAUDIO_SINT24 ||\r
- format == RTAUDIO_SINT32 ||\r
+ else if ( format == RTAUDIO_SINT32 ||\r
format == RTAUDIO_FLOAT32 ) {\r
for ( unsigned int i=0; i<samples; i++ ) {\r
// Swap 1st and 4th bytes.\r
ptr += 3;\r
}\r
}\r
+ else if ( format == RTAUDIO_SINT24 ) {\r
+ for ( unsigned int i=0; i<samples; i++ ) {\r
+ // Swap 1st and 3rd bytes.\r
+ val = *(ptr);\r
+ *(ptr) = *(ptr+2);\r
+ *(ptr+2) = val;\r
+\r
+ // Increment 2 more bytes.\r
+ ptr += 2;\r
+ }\r
+ }\r
else if ( format == RTAUDIO_FLOAT64 ) {\r
for ( unsigned int i=0; i<samples; i++ ) {\r
// Swap 1st and 8th bytes\r