@@ -592,6 +592,10 @@ class EQMDevice: EQMObject {
592592
593593 static func doIO ( client: EQMClient ? , operationID: UInt32 , sample: UnsafeMutablePointer < Float32 > , cycleInfo: AudioServerPlugInIOCycleInfo , frameSize: UInt32 ) -> OSStatus {
594594
595+ guard let buffer = ringBuffer else {
596+ return noErr
597+ }
598+
595599 ioMutex. lock ( )
596600
597601 switch operationID {
@@ -601,21 +605,22 @@ class EQMDevice: EQMObject {
601605 for frame in 0 ..< frameSize {
602606 for channel in 0 ..< kChannelCount {
603607 let readFrame = Int ( frame * kChannelCount + channel)
608+
604609 if EQMControl . muted {
605610 // Muted
606611 sample [ readFrame] = 0
607- } else {
608- let nextSampleTime = sampleTime + Int( frame)
609- let remainder = nextSampleTime % Int( ringBufferSize)
610- let writeFrame = remainder * Int( kChannelCount) + Int( channel)
611- ringBuffer![ writeFrame] += sample [ readFrame]
612612 }
613613
614+ let writePosition = sampleTime + Int( frame)
615+ let writeRemainder = writePosition % Int( ringBufferSize)
616+ let writeFrame = writeRemainder * Int( kChannelCount) + Int( channel)
617+ buffer [ writeFrame] += sample [ readFrame]
618+
614619 // Clean up buffer
615- let cleanFromFrame = sampleTime + Int( frame) + 8192
616- let remainder = cleanFromFrame % Int( ringBufferSize)
617- let cleanFrame = remainder * Int( kChannelCount) + Int( channel)
618- ringBuffer! [ cleanFrame] = 0
620+ let cleanCleanPosition = sampleTime + Int( frame) + 8192
621+ let cleanRemainder = cleanCleanPosition % Int( ringBufferSize)
622+ let cleanFrame = cleanRemainder * Int( kChannelCount) + Int( channel)
623+ buffer [ cleanFrame] = 0
619624 }
620625 }
621626
@@ -629,20 +634,24 @@ class EQMDevice: EQMObject {
629634 for frame in 0 ..< frameSize {
630635 for channel in 0 ..< kChannelCount {
631636 let writeFrame = Int ( frame * kChannelCount + channel)
637+
632638 if EQMControl . muted {
633639 sample [ writeFrame] = 0
634640 } else {
635- let nextSampleTime = sampleTime + Int( frame)
636- let remainder = nextSampleTime % Int( ringBufferSize)
637- let readFrame = remainder * Int( kChannelCount) + Int( channel)
638- sample [ writeFrame] = ringBuffer! [ readFrame]
641+ let readPosition = sampleTime + Int( frame)
642+ let readRemainder = readPosition % Int( ringBufferSize)
643+ let readFrame = readRemainder * Int( kChannelCount) + Int( channel)
644+ sample [ writeFrame] = buffer [ readFrame]
639645 }
640646
641647 // Clean up buffer
642- let cleanFromFrame = sampleTime + Int( frame) - Int( ringBufferSize)
643- let remainder = cleanFromFrame % Int( ringBufferSize)
644- let cleanFrame = remainder * Int( kChannelCount) + Int( channel)
645- ringBuffer![ cleanFrame] = 0
648+ let cleanPosition = sampleTime + Int( frame) - Int( ringBufferSize)
649+ if ( cleanPosition > 0 ) {
650+ let cleanRemainder = cleanPosition % Int( ringBufferSize)
651+ let cleanFrame = cleanRemainder * Int( kChannelCount) + Int( channel)
652+ buffer [ cleanFrame] = 0
653+ }
654+
646655 }
647656 }
648657 break
0 commit comments