Skip to content

Add setRate, setValue and iOS AirPlay features #38

@Sun3

Description

@Sun3

It would be great to add setRate and setValue features, really needed. Also for iOS it would be great to add the routePickerButton to play audio to Apple TV (AirPlay).

Dart:

static const _nativeMethodSetRate = "setRate";
static const _nativeMethodSetRateArgRateInDouble = "rateInDouble";
static const _nativeMethodSetVolume = "setVolume";
static const _nativeMethodSetStateArgVolumeInDouble = "volumeInDouble";

static const _nativeMethodShowRoutePickerView = "showRoutePickerView"; // iOS Only AirPlay

  void setRate(double rate) {
    _invokeNativeMethod(
      _nativeMethodSetRate,
      arguments: <String, dynamic>{_nativeMethodSetRateArgRateInDouble: rate},
    );
  }

  void setVolume(double volume) {
    _invokeNativeMethod(
      _nativeMethodSetVolume,
      arguments: <String, dynamic>{_nativeMethodSetStateArgVolumeInDouble: volume},
    );
  }

void showRoutePickerView() {
  _invokeNativeMethod(_nativeMethodShowRoutePickerView);
}

Kotlin:

private const val NATIVE_METHOD_SET_RATE = "setRate"
private const val NATIVE_METHOD_SET_RATE_ARG_DOUBLE = "rateInDouble"
private const val NATIVE_METHOD_SET_VOLUME = "setVolume"
private const val NATIVE_METHOD_SET_VOLUME_ARG_DOUBLE = "volumeInDouble"

NATIVE_METHOD_SET_RATE -> {
  withArgument(call, NATIVE_METHOD_SET_RATE_ARG_DOUBLE) { rateInDouble: Double ->
    service.setRate(rateInDouble)
  }
}
NATIVE_METHOD_SET_VOLUME -> {
  withArgument(call, NATIVE_METHOD_SET_VOLUME_ARG_DOUBLE) { volumeInDouble: Double ->
    service.setVolume(volumeInDouble)
  }
}

Swit:

case "setRate":
    let arguments = call.arguments as! NSDictionary
    let rateInDouble =  arguments["rateInDouble"] as! Double
    self.setRate(rateInDouble: rateInDouble)

case "setVolume":
    let arguments = call.arguments as! NSDictionary
    let volumeInDouble =  arguments["volumeInDouble"] as! Double
    self.setVolume(volumeInDouble: volumeInDouble)

private func setRate(rateInDouble: Double) {
    // Since setting rate starts playing audio, let's check if player is paused, and keep it paused.
    let isMediaPlayerPlaying = player.rate
    player.rate = Float(rateInDouble)
    playerRate = Float(rateInDouble)
    if (isMediaPlayerPlaying == 0) {
        player.pause()
    }
}

private func setVolume(volumeInDouble: Double) {
    player.volume = Float(volumeInDouble)
}

private func showRoutePickerView() {
    if (routePickerView != nil) {
        if let routePickerButton = routePickerView.subviews.first(where: { $0 is UIButton }) as? UIButton {
            routePickerButton.sendActions(for: .touchUpInside)
        }
    }
}

Thank you.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions