@@ -19,11 +19,7 @@ class AgoraPcmSourcePush: NSObject {
1919 private let channelsPerFrame : Int
2020 private let bitPerSample : Int
2121 private let samples : Int
22- private var audioTimer : DispatchSourceTimer ?
23- private var audioSentFrames : Int64 = 0
24- private var audioSendStartMS : Int64 = 0
25- private var input : InputStream ?
26- private var buffer : UnsafeMutablePointer < UInt8 > ?
22+
2723 private var state : State = . Stop
2824 private let captureQueue : DispatchQueue
2925
@@ -41,7 +37,6 @@ class AgoraPcmSourcePush: NSObject {
4137 self . samples = samples
4238 captureQueue = DispatchQueue ( label: " MyCaptureQueue " )
4339 }
44-
4540
4641 func start( ) {
4742 if state == . Stop {
@@ -54,75 +49,31 @@ class AgoraPcmSourcePush: NSObject {
5449 if state == . Play {
5550 state = . Stop
5651 }
57- audioSentFrames = 0
58- audioSendStartMS = 0
59- if let buffer = buffer, let input = input {
60- buffer. deallocate ( )
61- input. close ( )
62- }
63- buffer = nil
64- input = nil
65- guard let timer = audioTimer else {
66- return
67- }
68- timer. cancel ( )
69-
70- audioTimer = nil
71- return
7252 }
7353
74- // private func play() {
75- // captureQueue.async {
76- // guard let input = InputStream(fileAtPath: self.filePath) else { return }
77- // input.open()
78- //
79- // let bufferSize = self.samples * self.bitPerSample / 8 * self.channelsPerFrame
80- // let sleepTime = TimeInterval(self.samples) / TimeInterval(self.sampleRate)
81- // let buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: bufferSize)
82- // while input.hasBytesAvailable && self.state == .Play {
83- // input.read(buffer, maxLength: bufferSize)
84- // self.delegate?.onAudioFrame(data: Data(bytes: buffer, count: bufferSize))
85- // Thread.sleep(forTimeInterval: sleepTime)
86- // }
87- // buffer.deallocate()
88- // input.close()
89- // }
90- // }
91-
92- private func currentTimeMillis( ) -> Int64 {
93- var darwinTime : timeval = timeval ( tv_sec: 0 , tv_usec: 0 )
94- gettimeofday ( & darwinTime, nil )
95- return ( Int64 ( darwinTime. tv_sec) * 1000 ) + Int64( darwinTime. tv_usec / 1000 )
96- }
97-
98- func play( ) {
99- let bufferSize = self . samples * self . bitPerSample / 8 * self . channelsPerFrame
100- input = InputStream ( fileAtPath: filePath)
101- input? . open ( )
102- buffer = UnsafeMutablePointer< UInt8> . allocate( capacity: bufferSize)
103- guard let input = input, let buffer = buffer else { return }
104- let timer = DispatchSource . makeTimerSource ( queue: captureQueue)
105- timer. schedule ( wallDeadline: . now( ) , repeating: 0.1 )
106-
107- timer. setEventHandler { [ weak self] in
108- guard let self = self else {
109- return
110- }
111-
112- if ( self . audioSentFrames == 0 ) {
113- self . audioSendStartMS = self . currentTimeMillis ( )
114- }
115-
116- let currentMS = self . currentTimeMillis ( )
117-
118- let targetSentFrames = ( ( currentMS - self . audioSendStartMS) / 100 ) + 1 ;
119- while ( targetSentFrames > self . audioSentFrames && ( input. hasBytesAvailable && self . state == . Play) ) {
120- // let size = input.read(buffer, maxLength: bufferSize)
121- self . delegate? . onAudioFrame ( data: buffer)
122- self . audioSentFrames += 1
54+ private func play( ) {
55+ captureQueue. async {
56+ guard let input = InputStream ( fileAtPath: self . filePath) else { return }
57+ input. open ( )
58+
59+ let bufferSize = self . samples * self . bitPerSample / 8 * self . channelsPerFrame
60+ let sleepTime = TimeInterval ( self . samples) / TimeInterval( self . sampleRate)
61+ let buffer = UnsafeMutablePointer< UInt8> . allocate( capacity: bufferSize)
62+ var index : Double = 0
63+ var firstPush : Double = 0
64+ while input. hasBytesAvailable && self . state == . Play {
65+ if firstPush == 0 {
66+ firstPush = CFAbsoluteTimeGetCurrent ( )
67+ }
68+ input. read ( buffer, maxLength: bufferSize)
69+ self . delegate? . onAudioFrame ( data: buffer)
70+ let nextPush = firstPush + index * sleepTime
71+ let sleep = nextPush - CFAbsoluteTimeGetCurrent( )
72+ Thread . sleep ( forTimeInterval: sleep)
73+ index += 1
74+ }
75+ buffer. deallocate ( )
76+ input. close ( )
12377 }
124- }
125- timer. resume ( )
126- audioTimer = timer
127- }
78+ }
12879}
0 commit comments