Skip to content

Commit b9ef1fa

Browse files
committed
setAudioHardMute, setAudioSoftMute 失敗時は Error で返すように修正
1 parent 7bdbb02 commit b9ef1fa

File tree

3 files changed

+37
-48
lines changed

3 files changed

+37
-48
lines changed

Sora/AudioDeviceModuleWrapper.swift

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,33 +2,37 @@ import Foundation
22
import WebRTC
33

44
/// RTCAudioDeviceModule の録音ポーズ/再開をラップするクラス
5-
public final class AudioDeviceModuleWrapper {
5+
final class AudioDeviceModuleWrapper {
66
private let audioDeviceModule: RTCAudioDeviceModule
77
// ハードミュート処理を直列化するためのキュー
88
private let queue = DispatchQueue(label: "jp.shiguredo.sora.audio.device.wrapper")
99
// 現在のハードミュート状態
1010
private var isHardMuted: Bool = false
1111

12-
public init(audioDeviceModule: RTCAudioDeviceModule) {
12+
init(audioDeviceModule: RTCAudioDeviceModule) {
1313
self.audioDeviceModule = audioDeviceModule
1414
}
1515

1616
/// 音声のハードミュート有効化/無効化します
1717
/// - Parameter mute: `true` でミュート有効化、`false` でミュート無効化
18-
/// - Returns: 成功した場合は `true`
19-
public func setAudioHardMute(_ mute: Bool) -> Bool {
18+
/// - Returns: 成功した場合は `true`、失敗した場合は `false` を返します
19+
func setAudioHardMute(_ mute: Bool) -> Bool {
2020
queue.sync {
21-
guard isHardMuted != mute else { return true }
21+
guard isHardMuted != mute else {
22+
return true
23+
}
24+
2225
let internalResult = mute ? pauseRecordingInternal() : resumeRecordingInternal()
2326
let message = "setAudioHardMute via RTCAudioDeviceModule mute=\(mute)"
2427
let result = internalResult == 0
2528
if result {
2629
isHardMuted = mute
2730
Logger.debug(type: .mediaChannel, message: message)
31+
return true
2832
} else {
2933
Logger.error(type: .mediaChannel, message: "\(message) failed")
34+
return false
3035
}
31-
return result
3236
}
3337
}
3438

Sora/MediaChannel.swift

Lines changed: 22 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -524,68 +524,48 @@ public final class MediaChannel {
524524

525525
/// MediaChannel の接続中にマイクをハードミュート有効化/無効化します
526526
/// - Parameter mute: `true` で有効化、`false` で無効化
527-
/// - Returns: 成功した場合は `true`、接続状態などの理由で処理しなかった場合は `false`
528-
public func setAudioHardMute(_ mute: Bool) -> Bool {
529-
guard canSwitchAudioMute() else {
530-
return false
527+
/// - Returns: 成功した場合は `nil`、失敗した場合は `Error` を返します
528+
public func setAudioHardMute(_ mute: Bool) -> Error? {
529+
guard state == .connected else {
530+
return SoraError.mediaChannelError(
531+
reason: "MediaChannel is not connected (state: \(state))")
531532
}
532533

533-
return NativePeerChannelFactory.default.audioDeviceModuleWrapper.setAudioHardMute(mute)
534-
}
535-
536-
/// MediaChannel の接続中にマイクをソフトミュート有効化 / 無効化します
537-
/// - Parameter mute: `true` で有効化、`false` で無効化
538-
/// - Returns: 成功した場合は `true`、接続状態などの理由で処理しなかった場合は `false`
539-
public func setAudioSoftMute(_ mute: Bool) -> Bool {
540-
guard canSwitchAudioMute() else {
541-
return false
534+
guard configuration.audioEnabled else {
535+
return SoraError.mediaChannelError(reason: "audioEnabled is false")
542536
}
543537

544-
// senderStream が Nullable のためアンラップが必要
545-
guard let senderStream else {
546-
return false
538+
if NativePeerChannelFactory.default.audioDeviceModuleWrapper.setAudioHardMute(mute) {
539+
return SoraError.mediaChannelError(reason: "AudioDeviceModuleWrapper::setAudioHardMute failed")
547540
}
548541

549-
senderStream.audioEnabled = !mute
550-
Logger.debug(type: .mediaChannel, message: "setAudioSoftMute mute=\(mute)")
551-
return true
542+
return nil
552543
}
553544

554-
// 音声ミュートの切り替えが可能かチェックします
555-
private func canSwitchAudioMute() -> Bool {
556-
// 接続中か
545+
/// MediaChannel の接続中にマイクをソフトミュート有効化 / 無効化します
546+
/// - Parameter mute: `true` で有効化、`false` で無効化
547+
/// - Returns: 成功した場合は `nil`、失敗した場合は `Error` を返します
548+
public func setAudioSoftMute(_ mute: Bool) -> Error? {
557549
guard state == .connected else {
558-
Logger.debug(
559-
type: .mediaChannel,
560-
message: "Switch audio mute failed, cause MediaChannel is not connected (state: \(state))")
561-
return false
550+
return SoraError.mediaChannelError(
551+
reason: "MediaChannel is not connected (state: \(state))")
562552
}
563553

564-
// 接続設定で音声を有効にしているか
565554
guard configuration.audioEnabled else {
566-
Logger.debug(
567-
type: .mediaChannel,
568-
message: "Switch audio mute failed, cause audioEnabled is false")
569-
return false
555+
return SoraError.mediaChannelError(reason: "audioEnabled is false")
570556
}
571557

572-
// ストリームが存在するか
573558
guard let senderStream else {
574-
Logger.debug(
575-
type: .mediaChannel,
576-
message: "Switch audio mute failed, cause senderStream is unavailable")
577-
return false
559+
return SoraError.mediaChannelError(reason: "senderStream is unavailable")
578560
}
579561

580-
// ストリームに音声トラックが含まれているか
581562
guard senderStream.hasAudioTrack else {
582-
Logger.debug(
583-
type: .mediaChannel,
584-
message: "Switch audio mute failed, cause senderStream has no AudioTrack")
585-
return false
563+
return SoraError.mediaChannelError(reason: "senderStream has no AudioTrack")
586564
}
587565

588-
return true
566+
senderStream.audioEnabled = !mute
567+
Logger.debug(type: .mediaChannel, message: "setAudioSoftMute mute=\(mute)")
568+
return nil
589569
}
590570
}
591571

Sora/SoraError.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ public enum SoraError: Error {
3333
/// ``PeerChannel`` で発生したエラー
3434
case peerChannelError(reason: String)
3535

36+
/// ``MediaChannel`` で発生したエラー
37+
case mediaChannelError(reason: String)
38+
3639
/// カメラに関するエラー
3740
case cameraError(reason: String)
3841

@@ -74,6 +77,8 @@ extension SoraError: LocalizedError {
7477
return "Unknown signaling message type \(type)"
7578
case .peerChannelError(let reason):
7679
return "PeerChannel error (\(reason))"
80+
case .mediaChannelError(let reason):
81+
return "MediaChannel error (\(reason))"
7782
case .cameraError(let reason):
7883
return "Camera error: \(reason)"
7984
case .messagingError(let reason):

0 commit comments

Comments
 (0)