@Wolfram,
There were multiple things wrong with your code.
Here's my attempt.
Code: Select all
EnableExplicit
;-AudioStream.pbi
#AUDIOBUFFER_SIZE = 8192
#AUDIOBUFFER_SAMPLES = #AUDIOBUFFER_SIZE >> 2
#kAudioFormatFlagIsFloat = (1 << 0) ;// 0x1
#kAudioFormatFlagIsBigEndian = (1 << 1) ;// 0x2
#kAudioFormatFlagIsSignedInteger = (1 << 2) ;// 0x4
#kAudioFormatFlagIsPacked = (1 << 3) ;// 0x8
#kAudioFormatFlagIsAlignedHigh = (1 << 4) ;// 0x10
#kAudioFormatFlagIsNonInterleaved = (1 << 5) ;// 0x20
#kAudioFormatFlagIsNonMixable = (1 << 6) ;// 0x40
#kAudioFormatFlagsAreAllClear = (1 << 31)
#kLinearPCMFormatFlagIsFloat = #kAudioFormatFlagIsFloat
#kLinearPCMFormatFlagIsBigEndian = #kAudioFormatFlagIsBigEndian
#kLinearPCMFormatFlagIsSignedInteger = #kAudioFormatFlagIsSignedInteger
#kLinearPCMFormatFlagIsPacked = #kAudioFormatFlagIsPacked
#kLinearPCMFormatFlagIsAlignedHigh = #kAudioFormatFlagIsAlignedHigh
#kLinearPCMFormatFlagIsNonInterleaved = #kAudioFormatFlagIsNonInterleaved
#kLinearPCMFormatFlagIsNonMixable = #kAudioFormatFlagIsNonMixable
#kLinearPCMFormatFlagsSampleFractionShift = 7
#kLinearPCMFormatFlagsSampleFractionMask = ($3F << #kLinearPCMFormatFlagsSampleFractionShift)
#kLinearPCMFormatFlagsAreAllClear = #kAudioFormatFlagsAreAllClear
#kAppleLosslessFormatFlag_16BitSourceData = 1
#kAppleLosslessFormatFlag_20BitSourceData = 2
#kAppleLosslessFormatFlag_24BitSourceData = 3
#kAppleLosslessFormatFlag_32BitSourceData = 4
Structure AudioStreamBasicDescription
mSampleRate.d
mFormatID.l
mFormatFlags.l
mBytesPerPacket.l
mFramesPerPacket.l
mBytesPerFrame.l
mChannelsPerFrame.l
mBitsPerChannel.l
mReserved.l
EndStructure
Structure AudioQueueBuffer
mAudioDataBytesCapacity.i
mAudioData.i
mAudioDataByteSize.i
mUserData.i
mPacketDescriptionCapacity.i
mPacketDescriptions.i
mPacketDescriptionCount.i
EndStructure
Structure AudioStreamStereoSample
l.w
r.w
EndStructure
Structure AudioStreamSamples
ss.AudioStreamStereoSample[0]
EndStructure
ImportC "-framework AudioToolbox"
AudioQueueAllocateBuffer(inAQ, inBufferByteSize, *outBuffer)
AudioQueueDispose(inAQ, inImmediate = #True)
AudioQueueEnqueueBuffer(inAQ, inBuffer, inNumPacketDescs = 0, *inPacketDescs = #Null)
AudioQueueNewOutput(*inFormat, inCallbackProc, *inUserData, inCallbackRunLoop, inCallbackRunLoopMode, inFlags, *outAQ)
AudioQueueSetParameter(inAQ, inParamID, inValue.f)
AudioQueueStart(inAQ, *inStartTime = #Null)
AudioQueueStop(inAQ, inImmediate = #True)
EndImport
Prototype AudioStream_Callback_Proto(*SampleData.Float)
Global AudioStream_Callback.AudioStream_Callback_Proto
Global *AudioStream_Buf1.AudioQueueBuffer, *AudioStream_Buf2.AudioQueueBuffer
Global AudioStream_Queue = 0
ProcedureC AudioStream_Callback_(*ptr, queue, *buf.AudioQueueBuffer)
AudioStream_Callback(*buf\mAudioData)
AudioQueueEnqueueBuffer(queue, *buf)
EndProcedure
Procedure AudioStream_Init(*Callback)
AudioStream_Callback = *Callback
Protected fmt.AudioStreamBasicDescription
fmt\mSampleRate = 44100
fmt\mFormatID = $6C70636D; kAudioFormatLinearPCM
fmt\mFormatFlags = #kAudioFormatFlagIsPacked | #kLinearPCMFormatFlagIsSignedInteger
fmt\mFramesPerPacket = 1
fmt\mBytesPerFrame = 4
fmt\mBytesPerPacket = 4
fmt\mChannelsPerFrame = 2
fmt\mBitsPerChannel = 16
If AudioQueueNewOutput(@fmt, @AudioStream_Callback_(), #Null, #Null, #Null, 0, @AudioStream_Queue) = 0
AudioQueueAllocateBuffer(AudioStream_Queue, #AUDIOBUFFER_SIZE, @*AudioStream_Buf1)
AudioQueueAllocateBuffer(AudioStream_Queue, #AUDIOBUFFER_SIZE, @*AudioStream_Buf2)
*AudioStream_Buf1\mAudioDataByteSize = #AUDIOBUFFER_SIZE
*AudioStream_Buf2\mAudioDataByteSize = #AUDIOBUFFER_SIZE
EndIf
EndProcedure
Procedure AudioStream_SetVolume(volume.f)
If AudioStream_Queue
AudioQueueSetParameter(AudioStream_Queue, 1, volume); 1 = kAudioQueueParam_Volume
EndIf
EndProcedure
Procedure AudioStream_Start()
If AudioStream_Queue
AudioStream_Callback_(#Null, AudioStream_Queue, *AudioStream_Buf1)
AudioStream_Callback_(#Null, AudioStream_Queue, *AudioStream_Buf2)
AudioQueueStart(AudioStream_Queue)
EndIf
EndProcedure
Procedure AudioStream_Stop()
If AudioStream_Queue
AudioQueueStop(AudioStream_Queue)
EndIf
EndProcedure
Procedure AudioStream_Dispose()
If AudioStream_Queue
AudioQueueDispose(AudioStream_Queue)
AudioStream_Queue = 0
EndIf
EndProcedure
;-Main
; XIncludeFile "AudioStream.pbi"
Define FileName.s = "/Users/YourNmae/Desktop/16bit_44100WAVE_Stereo.wav"
If OpenFile(1, FileName)
Define FileSize.i = Lof(1)
Global SamplePos = 44
Global NumSamples = FileSize / SizeOf(AudioStreamStereoSample)
Global Dim WaveBuffer.AudioStreamStereoSample(NumSamples)
ReadData(1, @WaveBuffer(), FileSize)
CloseFile(1)
EndIf
Procedure SampleCallback(*out.AudioStreamSamples)
Protected i = 0
While i < #AUDIOBUFFER_SAMPLES
If SamplePos < NumSamples
*out\ss[i]\l = WaveBuffer(SamplePos)\l
*out\ss[i]\r = WaveBuffer(SamplePos)\r
SamplePos + 1
Else
*out\ss[i]\l = 0
*out\ss[i]\r = 0
EndIf
i + 1
Wend
EndProcedure
AudioStream_Init(@SampleCallback())
AudioStream_SetVolume(0.5)
AudioStream_Start()
MessageRequester("Audio Synthesis Demo", "Playing audio")
AudioStream_Dispose()
AUHAL version
Code: Select all
ImportC ""
AudioUnitSetVolume__(Unit, ID, Scope, Element, Value.f, BufferOffsetInFrames) As "_AudioUnitSetParameter"
EndImport
DataSection
dOut:
Data.l $61756f75,$64656620,$6170706c,0,0
PCM16Bit:
Data.l 0,$40E58880,$6C70636D,12,4,1,4,2,16,0
PCM32BitFloat:
Data.l 0,$40E58880,$6C70636D,1,8,1,8,2,32,0
EndDataSection
Global Audio_Unit.i
Procedure Audio_SetVolume(Volume); 0 - 100
Protected factor.f
If Volume
factor = Pow(10, 40 * (Volume - 100) * 0.0005)
EndIf
AudioUnitSetVolume__(Audio_Unit, 14, 1, 0, factor, 0)
EndProcedure
Procedure Audio_Init(*CallbackFunction, BufferSize.l = 2048)
Protected Dim CallbackStruct.i(1) : CallbackStruct(0) = *CallbackFunction
AudioComponentInstanceNew_(AudioComponentFindNext_(#Null, ?dOut), @Audio_Unit)
AudioUnitSetProperty_(Audio_Unit, 23, 1, 0, @CallbackStruct(), SizeOf(Integer) << 1)
AudioUnitSetProperty_(Audio_Unit, 8, 1, 0, ?PCM16Bit, 40)
AudioUnitSetProperty_(Audio_Unit, $6673697a, 1, 0, @BufferSize, 4)
AudioUnitInitialize_(Audio_Unit)
EndProcedure
Procedure Audio_Start()
ProcedureReturn Bool(AudioOutputUnitStart_(Audio_Unit) = 0)
EndProcedure
Procedure Audio_Stop()
AudioOutputUnitStop_(Audio_Unit)
EndProcedure
Procedure Audio_Terminate()
If Audio_Unit
AudioOutputUnitStop_(Audio_Unit)
AudioUnitUninitialize_(Audio_Unit)
AudioComponentInstanceDispose_(Audio_Unit)
Audio_Unit = 0
EndIf
EndProcedure
;-Main
Structure AudioStreamStereoSample
l.w
r.w
EndStructure
Structure AudioStreamSamples
ss.AudioStreamStereoSample[0]
EndStructure
Define FileName.s = "/Users/YourNmae/Desktop/16bit_44100WAVE_Stereo.wav"
If OpenFile(1, FileName)
Define FileSize.i = Lof(1)
Global SamplePos = 44
Global NumSamples = FileSize / SizeOf(AudioStreamStereoSample)
Global Dim WaveBuffer.AudioStreamStereoSample(NumSamples)
ReadData(1, @WaveBuffer(), FileSize)
CloseFile(1)
EndIf
ProcedureC SampleCallback(*inRefcon, *ioActionFlags, *inTimeStamp, inBusNumber.l, inNumberFrames.l, *ioData)
Protected i.i, *out.AudioStreamSamples = PeekI(*ioData + SizeOf(Integer) + 8)
While i < inNumberFrames
If SamplePos < NumSamples
*out\ss[i]\l = WaveBuffer(SamplePos)\l
*out\ss[i]\r = WaveBuffer(SamplePos)\r
SamplePos + 1
Else
*out\ss[i]\l = 0
*out\ss[i]\r = 0
EndIf
i + 1
Wend
EndProcedure
Audio_Init(@SampleCallback())
Audio_SetVolume(50)
Audio_Start()
MessageRequester("Audio Synthesis Demo", "Playing audio")
Audio_Terminate()