mirror of https://github.com/oxen-io/session-ios
				
				
				
			
			You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			102 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Swift
		
	
		
		
			
		
	
	
			102 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Swift
		
	
| 
											8 years ago
										 | // | ||
|  | //  Copyright (c) 2018 Open Whisper Systems. All rights reserved. | ||
|  | // | ||
|  | 
 | ||
|  | import Foundation | ||
|  | import WebRTC | ||
|  | 
 | ||
|  | @objc | ||
|  | public class OWSAudioSession: NSObject { | ||
|  | 
 | ||
|  |     // Force singleton access | ||
|  |     public static let shared = OWSAudioSession() | ||
|  |     private override init() {} | ||
|  |     private let avAudioSession = AVAudioSession.sharedInstance() | ||
|  | 
 | ||
|  |     // Ignores hardware mute switch, plays through external speaker | ||
|  |     public func setPlaybackCategory() { | ||
|  |         Logger.debug("\(logTag) in \(#function)") | ||
|  | 
 | ||
|  |         // In general, we should have put the audio session back to it's default | ||
|  |         // category when we were done with whatever activity required it to be modified | ||
|  |         assert(avAudioSession.category == AVAudioSessionCategorySoloAmbient) | ||
|  | 
 | ||
|  |         do { | ||
|  |             try avAudioSession.setCategory(AVAudioSessionCategoryPlayback) | ||
|  |         } catch { | ||
|  |             owsFail("\(logTag) in \(#function) failed with error: \(error)") | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     public func setRecordCategory() -> Bool { | ||
|  |         Logger.debug("\(logTag) in \(#function)") | ||
|  | 
 | ||
|  |         // In general, we should have put the audio session back to it's default | ||
|  |         // category when we were done with whatever activity required it to be modified | ||
|  |         assert(avAudioSession.category == AVAudioSessionCategorySoloAmbient) | ||
|  | 
 | ||
|  |         assert(avAudioSession.recordPermission() == .granted) | ||
|  | 
 | ||
|  |         do { | ||
|  |             try avAudioSession.setCategory(AVAudioSessionCategoryRecord) | ||
|  |             return true | ||
|  |         } catch { | ||
|  |             owsFail("\(logTag) in \(#function) failed with error: \(error)") | ||
|  |             return false | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     public func endAudioActivity() { | ||
|  |         Logger.debug("\(logTag) in \(#function)") | ||
|  | 
 | ||
|  |         do { | ||
|  |             try avAudioSession.setCategory(AVAudioSessionCategorySoloAmbient) | ||
|  | 
 | ||
|  |             // When playing audio in Signal, other apps audio (e.g. Music) is paused. | ||
|  |             // By notifying when we deactivate, the other app can resume playback. | ||
|  |             try avAudioSession.setActive(false, with: [.notifyOthersOnDeactivation]) | ||
|  |         } catch { | ||
|  |             owsFail("\(logTag) in \(#function) failed with error: \(error)") | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     // MARK: - WebRTC Audio | ||
|  | 
 | ||
|  |     /**
 | ||
|  |      * By default WebRTC starts the audio session (PlayAndRecord) immediately upon creating the peer connection | ||
|  |      * but we want to create the peer connection and set up all the signaling channels before we prompt the user | ||
|  |      * for an incoming call. Without manually handling the session, this would result in the user seeing a recording | ||
|  |      * permission requested (and recording banner) before they even know they have an incoming call. | ||
|  |      * | ||
|  |      * By using the `useManualAudio` and `isAudioEnabled` attributes of the RTCAudioSession we can delay recording until | ||
|  |      * it makes sense. | ||
|  |      */ | ||
|  | 
 | ||
|  |     /**
 | ||
|  |      * The private class that manages AVAudioSession for WebRTC | ||
|  |      */ | ||
|  |     private let rtcAudioSession = RTCAudioSession.sharedInstance() | ||
|  | 
 | ||
|  |     /**
 | ||
|  |      * This must be called before any audio tracks are added to the peerConnection, else we'll start recording before all | ||
|  |      * our signaling is set up. | ||
|  |      */ | ||
|  |     public func configureRTCAudio() { | ||
|  |         Logger.info("\(logTag) in \(#function)") | ||
|  |         rtcAudioSession.useManualAudio = true | ||
|  |     } | ||
|  | 
 | ||
|  |     /**
 | ||
|  |      * Because we useManualAudio with our RTCAudioSession, we have to start/stop the recording audio session ourselves. | ||
|  |      * See header for details on  manual audio. | ||
|  |      */ | ||
|  |     public var isRTCAudioEnabled: Bool { | ||
|  |         get { | ||
|  |             return rtcAudioSession.isAudioEnabled | ||
|  |         } | ||
|  |         set { | ||
|  |             rtcAudioSession.isAudioEnabled = newValue | ||
|  |         } | ||
|  |     } | ||
|  | } |