[106319] trunk/dports/audio/portaudio
hum at macports.org
hum at macports.org
Wed May 22 06:08:54 PDT 2013
Revision: 106319
https://trac.macports.org/changeset/106319
Author: hum at macports.org
Date: 2013-05-22 06:08:54 -0700 (Wed, 22 May 2013)
Log Message:
-----------
portaudio: add patch-IOerror.diff to fix "Input overflowed" IOError; see #39150.
Modified Paths:
--------------
trunk/dports/audio/portaudio/Portfile
Added Paths:
-----------
trunk/dports/audio/portaudio/files/patch-IOerror.diff
Modified: trunk/dports/audio/portaudio/Portfile
===================================================================
--- trunk/dports/audio/portaudio/Portfile 2013-05-22 12:28:15 UTC (rev 106318)
+++ trunk/dports/audio/portaudio/Portfile 2013-05-22 13:08:54 UTC (rev 106319)
@@ -5,7 +5,7 @@
name portaudio
version 19.20111121
-revision 3
+revision 4
categories audio devel
platforms darwin macosx
maintainers hum openmaintainer
@@ -44,6 +44,8 @@
patch-clang.diff
platform darwin {
+ # patch-IOerror.diff is a fix for "Input overflowed" IOError; see #39150.
+ patchfiles-append patch-IOerror.diff
if {${os.major} >= 10} {
patchfiles-append patch-src__hostapi__coreaudio__pa_mac_core.c
}
Added: trunk/dports/audio/portaudio/files/patch-IOerror.diff
===================================================================
--- trunk/dports/audio/portaudio/files/patch-IOerror.diff (rev 0)
+++ trunk/dports/audio/portaudio/files/patch-IOerror.diff 2013-05-22 13:08:54 UTC (rev 106319)
@@ -0,0 +1,239 @@
+Index: src/hostapi/coreaudio/pa_mac_core_blocking.c
+===================================================================
+--- src/hostapi/coreaudio/pa_mac_core_blocking.c (Revision 1843)
++++ src/hostapi/coreaudio/pa_mac_core_blocking.c (Revision 1844)
+@@ -359,8 +359,9 @@
+
+ /* check for underflow */
+ if( avail < frameCount * blio->inputSampleSizeActual * blio->inChan )
++ {
+ OSAtomicOr32( paInputOverflow, &blio->statusFlags );
+-
++ }
+ toRead = MIN( avail, frameCount * blio->inputSampleSizeActual * blio->inChan );
+
+ /* copy the data */
+Index: src/hostapi/coreaudio/pa_mac_core.c
+===================================================================
+--- src/hostapi/coreaudio/pa_mac_core.c (Revision 1843)
++++ src/hostapi/coreaudio/pa_mac_core.c (Revision 1844)
+@@ -1774,25 +1774,16 @@
+ do is initialize everything so that if we fail, we know what hasn't
+ been touched.
+ */
+-
+- stream->inputAudioBufferList.mBuffers[0].mData = NULL;
+- stream->inputRingBuffer.buffer = NULL;
+- bzero( &stream->blio, sizeof( PaMacBlio ) );
+-/*
++ bzero( stream, sizeof( PaMacCoreStream ) );
++
++ /*
+ stream->blio.inputRingBuffer.buffer = NULL;
+ stream->blio.outputRingBuffer.buffer = NULL;
+ stream->blio.inputSampleFormat = inputParameters?inputParameters->sampleFormat:0;
+ stream->blio.inputSampleSize = computeSampleSizeFromFormat(stream->blio.inputSampleFormat);
+ stream->blio.outputSampleFormat=outputParameters?outputParameters->sampleFormat:0;
+ stream->blio.outputSampleSize = computeSampleSizeFromFormat(stream->blio.outputSampleFormat);
+-*/
+- stream->inputSRConverter = NULL;
+- stream->inputUnit = NULL;
+- stream->outputUnit = NULL;
+- stream->inputFramesPerBuffer = 0;
+- stream->outputFramesPerBuffer = 0;
+- stream->bufferProcessorIsInitialized = FALSE;
+- stream->timingInformationMutexIsInitialized = 0;
++ */
+
+ /* assert( streamCallback ) ; */ /* only callback mode is implemented */
+ if( streamCallback )
+@@ -2145,11 +2136,11 @@
+ const bool isRender = inBusNumber == OUTPUT_ELEMENT;
+ int callbackResult = paContinue ;
+ double hostTimeStampInPaTime = HOST_TIME_TO_PA_TIME(inTimeStamp->mHostTime);
+-
++
+ VVDBUG(("AudioIOProc()\n"));
+
+ PaUtil_BeginCpuLoadMeasurement( &stream->cpuLoadMeasurer );
+-
++
+ /* -----------------------------------------------------------------*\
+ This output may be useful for debugging,
+ But printing durring the callback is a bad enough idea that
+@@ -2250,7 +2241,8 @@
+ *
+ */
+ OSStatus err = 0;
+- unsigned long frames;
++ unsigned long frames;
++ long bytesPerFrame = sizeof( float ) * ioData->mBuffers[0].mNumberChannels;
+
+ /* -- start processing -- */
+ PaUtil_BeginBufferProcessing( &(stream->bufferProcessor),
+@@ -2261,8 +2253,8 @@
+ /* -- compute frames. do some checks -- */
+ assert( ioData->mNumberBuffers == 1 );
+ assert( ioData->mBuffers[0].mNumberChannels == stream->userOutChan );
+- frames = ioData->mBuffers[0].mDataByteSize;
+- frames /= sizeof( float ) * ioData->mBuffers[0].mNumberChannels;
++
++ frames = ioData->mBuffers[0].mDataByteSize / bytesPerFrame;
+ /* -- copy and process input data -- */
+ err= AudioUnitRender(stream->inputUnit,
+ ioActionFlags,
+@@ -2300,7 +2292,8 @@
+ * and into the PA buffer processor. If sample rate conversion
+ * is required on input, that is done here as well.
+ */
+- unsigned long frames;
++ unsigned long frames;
++ long bytesPerFrame = sizeof( float ) * ioData->mBuffers[0].mNumberChannels;
+
+ /* Sometimes, when stopping a duplex stream we get erroneous
+ xrun flags, so if this is our last run, clear the flags. */
+@@ -2322,8 +2315,7 @@
+
+ /* -- Copy and process output data -- */
+ assert( ioData->mNumberBuffers == 1 );
+- frames = ioData->mBuffers[0].mDataByteSize;
+- frames /= sizeof( float ) * ioData->mBuffers[0].mNumberChannels;
++ frames = ioData->mBuffers[0].mDataByteSize / bytesPerFrame;
+ assert( ioData->mBuffers[0].mNumberChannels == stream->userOutChan );
+ PaUtil_SetOutputFrameCount( &(stream->bufferProcessor), frames );
+ PaUtil_SetInterleavedOutputChannels( &(stream->bufferProcessor),
+@@ -2337,6 +2329,8 @@
+ /* Here, we read the data out of the ring buffer, through the
+ audio converter. */
+ int inChan = stream->inputAudioBufferList.mBuffers[0].mNumberChannels;
++ long bytesPerFrame = flsz * inChan;
++
+ if( stream->inputSRConverter )
+ {
+ OSStatus err;
+@@ -2353,7 +2347,12 @@
+ { /*the ring buffer callback underflowed */
+ err = 0;
+ bzero( ((char *)data) + size, sizeof(data)-size );
+- stream->xrunFlags |= paInputUnderflow;
++ /* The ring buffer can underflow normally when the stream is stopping.
++ * So only report an error if the stream is active. */
++ if( stream->state == ACTIVE )
++ {
++ stream->xrunFlags |= paInputUnderflow;
++ }
+ }
+ ERR( err );
+ assert( !err );
+@@ -2374,7 +2373,7 @@
+ AudioConverter would otherwise handle for us. */
+ void *data1, *data2;
+ ring_buffer_size_t size1, size2;
+- PaUtil_GetRingBufferReadRegions( &stream->inputRingBuffer,
++ ring_buffer_size_t framesReadable = PaUtil_GetRingBufferReadRegions( &stream->inputRingBuffer,
+ frames,
+ &data1, &size1,
+ &data2, &size2 );
+@@ -2389,14 +2388,21 @@
+ PaUtil_EndBufferProcessing( &(stream->bufferProcessor),
+ &callbackResult );
+ PaUtil_AdvanceRingBufferReadIndex(&stream->inputRingBuffer, size1 );
+- } else if( size1 + size2 < frames ) {
++ } else if( framesReadable < frames ) {
++
++ long sizeBytes1 = size1 * bytesPerFrame;
++ long sizeBytes2 = size2 * bytesPerFrame;
+ /*we underflowed. take what data we can, zero the rest.*/
+- unsigned char data[frames*inChan*flsz];
+- if( size1 )
+- memcpy( data, data1, size1 );
+- if( size2 )
+- memcpy( data+size1, data2, size2 );
+- bzero( data+size1+size2, frames*flsz*inChan - size1 - size2 );
++ unsigned char data[ frames * bytesPerFrame ];
++ if( size1 > 0 )
++ {
++ memcpy( data, data1, sizeBytes1 );
++ }
++ if( size2 > 0 )
++ {
++ memcpy( data+sizeBytes1, data2, sizeBytes2 );
++ }
++ bzero( data+sizeBytes1+sizeBytes2, (frames*bytesPerFrame) - sizeBytes1 - sizeBytes2 );
+
+ PaUtil_SetInputFrameCount( &(stream->bufferProcessor), frames );
+ PaUtil_SetInterleavedInputChannels( &(stream->bufferProcessor),
+@@ -2407,7 +2413,7 @@
+ PaUtil_EndBufferProcessing( &(stream->bufferProcessor),
+ &callbackResult );
+ PaUtil_AdvanceRingBufferReadIndex( &stream->inputRingBuffer,
+- size1+size2 );
++ framesReadable );
+ /* flag underflow */
+ stream->xrunFlags |= paInputUnderflow;
+ } else {
+@@ -2425,7 +2431,7 @@
+ framesProcessed =
+ PaUtil_EndBufferProcessing( &(stream->bufferProcessor),
+ &callbackResult );
+- PaUtil_AdvanceRingBufferReadIndex(&stream->inputRingBuffer, size1+size2 );
++ PaUtil_AdvanceRingBufferReadIndex(&stream->inputRingBuffer, framesReadable );
+ }
+ }
+ } else {
+@@ -2463,13 +2469,13 @@
+ {
+ /* If this is duplex or we use a converter, put the data
+ into the ring buffer. */
+- long bytesIn, bytesOut;
+- bytesIn = sizeof( float ) * inNumberFrames * chan;
+- bytesOut = PaUtil_WriteRingBuffer( &stream->inputRingBuffer,
++ ring_buffer_size_t framesWritten = PaUtil_WriteRingBuffer( &stream->inputRingBuffer,
+ stream->inputAudioBufferList.mBuffers[0].mData,
+ inNumberFrames );
+- if( bytesIn != bytesOut )
+- stream->xrunFlags |= paInputOverflow ;
++ if( framesWritten != inNumberFrames )
++ {
++ stream->xrunFlags |= paInputOverflow ;
++ }
+ }
+ else
+ {
+Index: qa/loopback/src/paqa.c
+===================================================================
+--- qa/loopback/src/paqa.c (Revision 1843)
++++ qa/loopback/src/paqa.c (Revision 1844)
+@@ -989,8 +989,8 @@
+ int framesPerBuffers[] = { 0, 16, 32, 40, 64, 100, 128, 256, 512, 1024 };
+ int numBufferSizes = (sizeof(framesPerBuffers)/sizeof(int));
+
+- PaSampleFormat sampleFormats[] = { paUInt8, paInt8, paInt16, paInt32 };
+- const char *sampleFormatNames[] = { "paUInt8", "paInt8", "paInt16", "paInt32" };
++ PaSampleFormat sampleFormats[] = { paFloat32, paUInt8, paInt8, paInt16, paInt32 };
++ const char *sampleFormatNames[] = { "paFloat32", "paUInt8", "paInt8", "paInt16", "paInt32" };
+ int numSampleFormats = (sizeof(sampleFormats)/sizeof(PaSampleFormat));
+
+ printf( "=============== Analysing Loopback %d to %d =====================\n", outputDevice, inputDevice );
+Index: qa/loopback/src/audio_analyzer.c
+===================================================================
+--- qa/loopback/src/audio_analyzer.c (Revision 1843)
++++ qa/loopback/src/audio_analyzer.c (Revision 1844)
+@@ -514,9 +514,15 @@
+
+ assert( startFrame >= 0 );
+ assert( count > 0 );
+-
+- for( is=0; is<count; is++ )
++
++ /* Zero out initial part of the recording. */
++ for( is=0; is<startFrame; is++ )
+ {
++ recording->buffer[ is ] = 0.0f;
++ }
++ /* Fade in where signal begins. */
++ for( is=0; is<count; is++ )
++ {
+ double c = cos( phase );
+ double w = c * c;
+ float x = recording->buffer[ is + startFrame ];
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macports-changes/attachments/20130522/81f0fbd2/attachment.html>
More information about the macports-changes
mailing list