Ken Thomases : winecoreaudio: Implement CoreAudio_wiAudioUnitIOProc,
the input callback.
Alexandre Julliard
julliard at wine.codeweavers.com
Fri Dec 29 06:47:26 CST 2006
Module: wine
Branch: master
Commit: fa84451647902e00894126638ec2a01d8f047436
URL: http://source.winehq.org/git/wine.git/?a=commit;h=fa84451647902e00894126638ec2a01d8f047436
Author: Ken Thomases <ken at codeweavers.com>
Date: Thu Dec 28 11:07:16 2006 -0600
winecoreaudio: Implement CoreAudio_wiAudioUnitIOProc, the input callback.
---
dlls/winmm/winecoreaudio/audio.c | 74 +++++++++++++++++++++++++++++++++++++-
1 files changed, 73 insertions(+), 1 deletions(-)
diff --git a/dlls/winmm/winecoreaudio/audio.c b/dlls/winmm/winecoreaudio/audio.c
index ee1a62f..7e39ba9 100644
--- a/dlls/winmm/winecoreaudio/audio.c
+++ b/dlls/winmm/winecoreaudio/audio.c
@@ -68,6 +68,15 @@ enum
};
typedef UInt32 AudioUnitRenderActionFlags;
+typedef long ComponentResult;
+extern ComponentResult
+AudioUnitRender( AudioUnit ci,
+ AudioUnitRenderActionFlags * ioActionFlags,
+ const AudioTimeStamp * inTimeStamp,
+ UInt32 inOutputBusNumber,
+ UInt32 inNumberFrames,
+ AudioBufferList * ioData) AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER;
+
/* only allow 10 output devices through this driver, this ought to be adequate */
#define MAX_WAVEOUTDRV (1)
#define MAX_WAVEINDRV (1)
@@ -2118,7 +2127,70 @@ OSStatus CoreAudio_wiAudioUnitIOProc(voi
UInt32 inNumberFrames,
AudioBufferList *ioData)
{
- return noErr;
+ WINE_WAVEIN* wwi = (WINE_WAVEIN*)inRefCon;
+ OSStatus err = noErr;
+ BOOL needNotify = FALSE;
+ WAVEHDR* lpStorePtr;
+ unsigned int dataToStore;
+ unsigned int dataStored = 0;
+
+
+ if (wwi->trace_on)
+ fprintf(stderr, "trace:wave:CoreAudio_wiAudioUnitIOProc (ioActionFlags = %08lx, inTimeStamp = { %f, %llu, %f, %llu, %08lx }, inBusNumber = %lu, inNumberFrames = %lu)\n",
+ *ioActionFlags, inTimeStamp->mSampleTime, inTimeStamp->mHostTime, inTimeStamp->mRateScalar, inTimeStamp->mWordClockTime, inTimeStamp->mFlags, inBusNumber, inNumberFrames);
+
+ /* Render into audio buffer */
+ err = AudioUnitRender(wwi->audioUnit, ioActionFlags, inTimeStamp, inBusNumber, inNumberFrames, wwi->bufferList);
+ if (err)
+ {
+ if (wwi->err_on)
+ fprintf(stderr, "err:wave:CoreAudio_wiAudioUnitIOProc AudioUnitRender failed with error %li\n", err);
+ return err;
+ }
+
+ /* Copy from audio buffer to the wavehdrs */
+ dataToStore = wwi->bufferList->mBuffers[0].mDataByteSize;
+
+ OSSpinLockLock(&wwi->lock);
+
+ lpStorePtr = wwi->lpQueuePtr;
+
+ while (dataToStore > 0 && wwi->state == WINE_WS_PLAYING && lpStorePtr)
+ {
+ unsigned int room = lpStorePtr->dwBufferLength - lpStorePtr->dwBytesRecorded;
+ unsigned int toCopy;
+
+ if (wwi->trace_on)
+ fprintf(stderr, "trace:wave:CoreAudio_wiAudioUnitIOProc Looking to store %u bytes to wavehdr %p, which has room for %u\n",
+ dataToStore, lpStorePtr, room);
+
+ if (room >= dataToStore)
+ toCopy = dataToStore;
+ else
+ toCopy = room;
+
+ if (toCopy > 0)
+ {
+ memcpy(lpStorePtr->lpData + lpStorePtr->dwBytesRecorded,
+ (char*)wwi->bufferList->mBuffers[0].mData + dataStored, toCopy);
+ lpStorePtr->dwBytesRecorded += toCopy;
+ wwi->dwTotalRecorded += toCopy;
+ dataStored += toCopy;
+ dataToStore -= toCopy;
+ room -= toCopy;
+ }
+
+ if (room == 0)
+ {
+ lpStorePtr = lpStorePtr->lpNext;
+ needNotify = TRUE;
+ }
+ }
+
+ OSSpinLockUnlock(&wwi->lock);
+
+ if (needNotify) wodSendNotifyInputCompletionsMessage(wwi);
+ return err;
}
#else
More information about the wine-cvs
mailing list