 		}
 	}
 
-
-	func MediaStream_release(_ command: CDVInvokedUrlCommand) {
+	@objc(MediaStream_release:) func MediaStream_release(_ command: CDVInvokedUrlCommand) {
 		NSLog("iosrtcPlugin#MediaStream_release()")
 
 		let id = command.argument(at: 0) as! String

			)
		}
	}
    
    func RTCRequestPermission(_ command: CDVInvokedUrlCommand) {
        DispatchQueue.main.async {
            let audioRequested: Bool = CBool(command.arguments[0] as! Bool)
            let videoRequested: Bool = CBool(command.arguments[1] as! Bool)
            var status: Bool = true
            
            if videoRequested == true {
                switch AVCaptureDevice.authorizationStatus(forMediaType: AVMediaTypeVideo) {
                case AVAuthorizationStatus.notDetermined:
                    NSLog("PluginGetUserMedia#call() | video authorization: not determined")
                case AVAuthorizationStatus.authorized:
                    NSLog("PluginGetUserMedia#call() | video authorization: authorized")
                case AVAuthorizationStatus.denied:
                    
                    NSLog("PluginGetUserMedia#call() | video authorization: denied")
                    status = false
                case AVAuthorizationStatus.restricted:
                    NSLog("PluginGetUserMedia#call() | video authorization: restricted")
                    status = false
                }
            }
            
            if audioRequested == true {
                switch AVCaptureDevice.authorizationStatus(forMediaType: AVMediaTypeAudio) {
                case AVAuthorizationStatus.notDetermined:
                    NSLog("PluginGetUserMedia#call() | audio authorization: not determined")
                case AVAuthorizationStatus.authorized:
                    NSLog("PluginGetUserMedia#call() | audio authorization: authorized")
                case AVAuthorizationStatus.denied:
                    NSLog("PluginGetUserMedia#call() | audio authorization: denied")
                    status = false
                case AVAuthorizationStatus.restricted:
                    NSLog("PluginGetUserMedia#call() | audio authorization: restricted")
                    status = false
                }
            }
            
            if(status){
                self.emit(command.callbackId,result: CDVPluginResult(status: CDVCommandStatus_OK))
            }else{
                self.emit(command.callbackId,result: CDVPluginResult(status: CDVCommandStatus_ERROR))
            }
        }
    }

	func RTCTurnOnSpeaker(_ command: CDVInvokedUrlCommand) {
        DispatchQueue.main.async {
            let isTurnOn: Bool = CBool(command.arguments[0] as! Bool)
            var isNeedRecord: Bool = true
            if command.arguments.count >= 2 {
                isNeedRecord = CBool(command.arguments[1] as! Bool)
            }
            self.audioOutputController.setOuputAudioMode(speaker: isTurnOn, record: isNeedRecord)
            self.emit(command.callbackId,
                result: CDVPluginResult(status: CDVCommandStatus_OK)
            )
        }
    }


	func dump(_ command: CDVInvokedUrlCommand) {

		pluginMediaStreamRenderer!.render(pluginMediaStream!)
	}

	@objc(MediaStreamRenderer_mediaStreamChanged:) func MediaStreamRenderer_mediaStreamChanged(_ command: CDVInvokedUrlCommand) {
		NSLog("iosrtcPlugin#MediaStreamRenderer_mediaStreamChanged()")

		let id = command.argument(at: 0) as! Int
