Skip to content

Commit e50f722

Browse files
author
zhaoyongqiang
committed
fix MS-202875 Mac播放pcm没有声音的问题
1 parent 5b3b4f5 commit e50f722

2 files changed

Lines changed: 31 additions & 80 deletions

File tree

iOS/Podfile

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,18 @@ target 'APIExample' do
88
pod 'Floaty', '~> 4.2.0'
99
pod 'AGEVideoLayout', '~> 1.0.2'
1010
pod 'CocoaAsyncSocket', '7.6.5'
11-
# pod 'AgoraRtcEngine_iOS_Beta', '4.0.0-beta.1'
12-
pod 'sdk', :path => 'sdk.podspec'
11+
# pod 'AgoraRtcEngine_Special_iOS', '4.0.0.test3'
12+
pod 'sdk', :path => 'sdk.podspec'
1313
end
1414

1515
target 'Agora-ScreenShare-Extension' do
1616
use_frameworks!
17-
pod 'sdk', :path => 'sdk.podspec'
18-
# pod 'AgoraRtcEngine_iOS_Beta', '4.0.0-beta.1'
17+
pod 'sdk', :path => 'sdk.podspec'
18+
#pod 'AgoraRtcEngine_Special_iOS', '4.0.0.test3'
1919
end
2020

2121
target 'SimpleFilter' do
2222
use_frameworks!
23-
pod 'sdk', :path => 'sdk.podspec'
24-
# pod 'AgoraRtcEngine_iOS_Beta', '4.0.0-beta.1'
23+
pod 'sdk', :path => 'sdk.podspec'
24+
#pod 'AgoraRtcEngine_Special_iOS', '4.0.0.test3'
2525
end

macOS/APIExample/Commons/ExternalAudio/AgoraPcmSourcePush.swift

Lines changed: 25 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)