///
/// JHybridOneAudioSpec.cpp
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
/// https://github.com/mrousavy/nitro
/// Copyright © Marc Rousavy @ Margelo
///

#include "JHybridOneAudioSpec.hpp"

// Forward declaration of `AudioRecordingPermission` to properly resolve imports.
namespace margelo::nitro::one { enum class AudioRecordingPermission; }
// Forward declaration of `AudioPlaybackStatus` to properly resolve imports.
namespace margelo::nitro::one { struct AudioPlaybackStatus; }
// Forward declaration of `AudioPlaybackState` to properly resolve imports.
namespace margelo::nitro::one { enum class AudioPlaybackState; }
// Forward declaration of `AudioRecordingStatus` to properly resolve imports.
namespace margelo::nitro::one { struct AudioRecordingStatus; }
// Forward declaration of `AudioRecordingState` to properly resolve imports.
namespace margelo::nitro::one { enum class AudioRecordingState; }
// Forward declaration of `AudioRecordingResult` to properly resolve imports.
namespace margelo::nitro::one { struct AudioRecordingResult; }
// Forward declaration of `AudioPlayerStatus` to properly resolve imports.
namespace margelo::nitro::one { struct AudioPlayerStatus; }
// Forward declaration of `AudioInterruptionEvent` to properly resolve imports.
namespace margelo::nitro::one { struct AudioInterruptionEvent; }
// Forward declaration of `AudioInterruptionType` to properly resolve imports.
namespace margelo::nitro::one { enum class AudioInterruptionType; }
// Forward declaration of `AudioNowPlayingInfo` to properly resolve imports.
namespace margelo::nitro::one { struct AudioNowPlayingInfo; }
// Forward declaration of `AudioRemoteCommandEvent` to properly resolve imports.
namespace margelo::nitro::one { struct AudioRemoteCommandEvent; }
// Forward declaration of `AudioRemoteCommandType` to properly resolve imports.
namespace margelo::nitro::one { enum class AudioRemoteCommandType; }
// Forward declaration of `PitchCorrectionQuality` to properly resolve imports.
namespace margelo::nitro::one { enum class PitchCorrectionQuality; }

#include "AudioRecordingPermission.hpp"
#include <NitroModules/Promise.hpp>
#include <NitroModules/JPromise.hpp>
#include "JAudioRecordingPermission.hpp"
#include "AudioPlaybackStatus.hpp"
#include "JAudioPlaybackStatus.hpp"
#include "AudioPlaybackState.hpp"
#include "JAudioPlaybackState.hpp"
#include <string>
#include <optional>
#include <NitroModules/JUnit.hpp>
#include "AudioRecordingStatus.hpp"
#include "JAudioRecordingStatus.hpp"
#include "AudioRecordingState.hpp"
#include "JAudioRecordingState.hpp"
#include "AudioRecordingResult.hpp"
#include "JAudioRecordingResult.hpp"
#include <functional>
#include "JFunc_void.hpp"
#include <NitroModules/JNICallable.hpp>
#include "AudioPlayerStatus.hpp"
#include "JAudioPlayerStatus.hpp"
#include "AudioInterruptionEvent.hpp"
#include "JFunc_void_AudioInterruptionEvent.hpp"
#include "JAudioInterruptionEvent.hpp"
#include "AudioInterruptionType.hpp"
#include "JAudioInterruptionType.hpp"
#include "AudioNowPlayingInfo.hpp"
#include "JAudioNowPlayingInfo.hpp"
#include "AudioRemoteCommandEvent.hpp"
#include "JFunc_void_AudioRemoteCommandEvent.hpp"
#include "JAudioRemoteCommandEvent.hpp"
#include "AudioRemoteCommandType.hpp"
#include "JAudioRemoteCommandType.hpp"
#include <unordered_map>
#include "PitchCorrectionQuality.hpp"
#include "JPitchCorrectionQuality.hpp"

namespace margelo::nitro::one {

  std::shared_ptr<JHybridOneAudioSpec> JHybridOneAudioSpec::JavaPart::getJHybridOneAudioSpec() {
    auto hybridObject = JHybridObject::JavaPart::getJHybridObject();
    auto castHybridObject = std::dynamic_pointer_cast<JHybridOneAudioSpec>(hybridObject);
    if (castHybridObject == nullptr) [[unlikely]] {
      throw std::runtime_error("Failed to downcast JHybridObject to JHybridOneAudioSpec!");
    }
    return castHybridObject;
  }

  jni::local_ref<JHybridOneAudioSpec::CxxPart::jhybriddata> JHybridOneAudioSpec::CxxPart::initHybrid(jni::alias_ref<jhybridobject> jThis) {
    return makeCxxInstance(jThis);
  }

  std::shared_ptr<JHybridObject> JHybridOneAudioSpec::CxxPart::createHybridObject(const jni::local_ref<JHybridObject::JavaPart>& javaPart) {
    auto castJavaPart = jni::dynamic_ref_cast<JHybridOneAudioSpec::JavaPart>(javaPart);
    if (castJavaPart == nullptr) [[unlikely]] {
      throw std::runtime_error("Failed to cast JHybridObject::JavaPart to JHybridOneAudioSpec::JavaPart!");
    }
    return std::make_shared<JHybridOneAudioSpec>(castJavaPart);
  }

  void JHybridOneAudioSpec::CxxPart::registerNatives() {
    registerHybrid({
      makeNativeMethod("initHybrid", JHybridOneAudioSpec::CxxPart::initHybrid),
    });
  }

  // Properties
  

  // Methods
  std::shared_ptr<Promise<AudioRecordingPermission>> JHybridOneAudioSpec::getRecordingPermissionStatus() {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>()>("getRecordingPermissionStatus");
    auto __result = method(_javaPart);
    return [&]() {
      auto __promise = Promise<AudioRecordingPermission>::create();
      __result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& __boxedResult) {
        auto __result = jni::static_ref_cast<JAudioRecordingPermission>(__boxedResult);
        __promise->resolve(__result->toCpp());
      });
      __result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
        jni::JniException __jniError(__throwable);
        __promise->reject(std::make_exception_ptr(__jniError));
      });
      return __promise;
    }();
  }
  std::shared_ptr<Promise<AudioRecordingPermission>> JHybridOneAudioSpec::requestRecordingPermission() {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>()>("requestRecordingPermission");
    auto __result = method(_javaPart);
    return [&]() {
      auto __promise = Promise<AudioRecordingPermission>::create();
      __result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& __boxedResult) {
        auto __result = jni::static_ref_cast<JAudioRecordingPermission>(__boxedResult);
        __promise->resolve(__result->toCpp());
      });
      __result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
        jni::JniException __jniError(__throwable);
        __promise->reject(std::make_exception_ptr(__jniError));
      });
      return __promise;
    }();
  }
  std::shared_ptr<Promise<AudioPlaybackStatus>> JHybridOneAudioSpec::play(const std::string& uri) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>(jni::alias_ref<jni::JString> /* uri */)>("play");
    auto __result = method(_javaPart, jni::make_jstring(uri));
    return [&]() {
      auto __promise = Promise<AudioPlaybackStatus>::create();
      __result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& __boxedResult) {
        auto __result = jni::static_ref_cast<JAudioPlaybackStatus>(__boxedResult);
        __promise->resolve(__result->toCpp());
      });
      __result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
        jni::JniException __jniError(__throwable);
        __promise->reject(std::make_exception_ptr(__jniError));
      });
      return __promise;
    }();
  }
  std::shared_ptr<Promise<AudioPlaybackStatus>> JHybridOneAudioSpec::getPlaybackStatus() {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>()>("getPlaybackStatus");
    auto __result = method(_javaPart);
    return [&]() {
      auto __promise = Promise<AudioPlaybackStatus>::create();
      __result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& __boxedResult) {
        auto __result = jni::static_ref_cast<JAudioPlaybackStatus>(__boxedResult);
        __promise->resolve(__result->toCpp());
      });
      __result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
        jni::JniException __jniError(__throwable);
        __promise->reject(std::make_exception_ptr(__jniError));
      });
      return __promise;
    }();
  }
  std::shared_ptr<Promise<AudioPlaybackStatus>> JHybridOneAudioSpec::pause() {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>()>("pause");
    auto __result = method(_javaPart);
    return [&]() {
      auto __promise = Promise<AudioPlaybackStatus>::create();
      __result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& __boxedResult) {
        auto __result = jni::static_ref_cast<JAudioPlaybackStatus>(__boxedResult);
        __promise->resolve(__result->toCpp());
      });
      __result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
        jni::JniException __jniError(__throwable);
        __promise->reject(std::make_exception_ptr(__jniError));
      });
      return __promise;
    }();
  }
  std::shared_ptr<Promise<AudioPlaybackStatus>> JHybridOneAudioSpec::resume() {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>()>("resume");
    auto __result = method(_javaPart);
    return [&]() {
      auto __promise = Promise<AudioPlaybackStatus>::create();
      __result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& __boxedResult) {
        auto __result = jni::static_ref_cast<JAudioPlaybackStatus>(__boxedResult);
        __promise->resolve(__result->toCpp());
      });
      __result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
        jni::JniException __jniError(__throwable);
        __promise->reject(std::make_exception_ptr(__jniError));
      });
      return __promise;
    }();
  }
  std::shared_ptr<Promise<AudioPlaybackStatus>> JHybridOneAudioSpec::seek(double positionMs) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>(double /* positionMs */)>("seek");
    auto __result = method(_javaPart, positionMs);
    return [&]() {
      auto __promise = Promise<AudioPlaybackStatus>::create();
      __result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& __boxedResult) {
        auto __result = jni::static_ref_cast<JAudioPlaybackStatus>(__boxedResult);
        __promise->resolve(__result->toCpp());
      });
      __result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
        jni::JniException __jniError(__throwable);
        __promise->reject(std::make_exception_ptr(__jniError));
      });
      return __promise;
    }();
  }
  std::shared_ptr<Promise<void>> JHybridOneAudioSpec::stop() {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>()>("stop");
    auto __result = method(_javaPart);
    return [&]() {
      auto __promise = Promise<void>::create();
      __result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& /* unit */) {
        __promise->resolve();
      });
      __result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
        jni::JniException __jniError(__throwable);
        __promise->reject(std::make_exception_ptr(__jniError));
      });
      return __promise;
    }();
  }
  std::shared_ptr<Promise<AudioRecordingStatus>> JHybridOneAudioSpec::startRecording() {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>()>("startRecording");
    auto __result = method(_javaPart);
    return [&]() {
      auto __promise = Promise<AudioRecordingStatus>::create();
      __result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& __boxedResult) {
        auto __result = jni::static_ref_cast<JAudioRecordingStatus>(__boxedResult);
        __promise->resolve(__result->toCpp());
      });
      __result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
        jni::JniException __jniError(__throwable);
        __promise->reject(std::make_exception_ptr(__jniError));
      });
      return __promise;
    }();
  }
  std::shared_ptr<Promise<AudioRecordingStatus>> JHybridOneAudioSpec::getRecordingStatus() {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>()>("getRecordingStatus");
    auto __result = method(_javaPart);
    return [&]() {
      auto __promise = Promise<AudioRecordingStatus>::create();
      __result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& __boxedResult) {
        auto __result = jni::static_ref_cast<JAudioRecordingStatus>(__boxedResult);
        __promise->resolve(__result->toCpp());
      });
      __result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
        jni::JniException __jniError(__throwable);
        __promise->reject(std::make_exception_ptr(__jniError));
      });
      return __promise;
    }();
  }
  std::shared_ptr<Promise<AudioRecordingStatus>> JHybridOneAudioSpec::pauseRecording() {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>()>("pauseRecording");
    auto __result = method(_javaPart);
    return [&]() {
      auto __promise = Promise<AudioRecordingStatus>::create();
      __result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& __boxedResult) {
        auto __result = jni::static_ref_cast<JAudioRecordingStatus>(__boxedResult);
        __promise->resolve(__result->toCpp());
      });
      __result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
        jni::JniException __jniError(__throwable);
        __promise->reject(std::make_exception_ptr(__jniError));
      });
      return __promise;
    }();
  }
  std::shared_ptr<Promise<AudioRecordingStatus>> JHybridOneAudioSpec::resumeRecording() {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>()>("resumeRecording");
    auto __result = method(_javaPart);
    return [&]() {
      auto __promise = Promise<AudioRecordingStatus>::create();
      __result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& __boxedResult) {
        auto __result = jni::static_ref_cast<JAudioRecordingStatus>(__boxedResult);
        __promise->resolve(__result->toCpp());
      });
      __result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
        jni::JniException __jniError(__throwable);
        __promise->reject(std::make_exception_ptr(__jniError));
      });
      return __promise;
    }();
  }
  std::shared_ptr<Promise<AudioRecordingResult>> JHybridOneAudioSpec::stopRecording() {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>()>("stopRecording");
    auto __result = method(_javaPart);
    return [&]() {
      auto __promise = Promise<AudioRecordingResult>::create();
      __result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& __boxedResult) {
        auto __result = jni::static_ref_cast<JAudioRecordingResult>(__boxedResult);
        __promise->resolve(__result->toCpp());
      });
      __result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
        jni::JniException __jniError(__throwable);
        __promise->reject(std::make_exception_ptr(__jniError));
      });
      return __promise;
    }();
  }
  std::function<void()> JHybridOneAudioSpec::addInterruptionListener(const std::function<void(const AudioInterruptionEvent& /* event */)>& onEvent) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JFunc_void::javaobject>(jni::alias_ref<JFunc_void_AudioInterruptionEvent::javaobject> /* onEvent */)>("addInterruptionListener_cxx");
    auto __result = method(_javaPart, JFunc_void_AudioInterruptionEvent_cxx::fromCpp(onEvent));
    return [&]() -> std::function<void()> {
      if (__result->isInstanceOf(JFunc_void_cxx::javaClassStatic())) [[likely]] {
        auto downcast = jni::static_ref_cast<JFunc_void_cxx::javaobject>(__result);
        return downcast->cthis()->getFunction();
      } else {
        auto __resultRef = jni::make_global(__result);
        return JNICallable<JFunc_void, void()>(std::move(__resultRef));
      }
    }();
  }
  std::shared_ptr<Promise<void>> JHybridOneAudioSpec::setNowPlayingInfo(const AudioNowPlayingInfo& info) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>(jni::alias_ref<JAudioNowPlayingInfo> /* info */)>("setNowPlayingInfo");
    auto __result = method(_javaPart, JAudioNowPlayingInfo::fromCpp(info));
    return [&]() {
      auto __promise = Promise<void>::create();
      __result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& /* unit */) {
        __promise->resolve();
      });
      __result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
        jni::JniException __jniError(__throwable);
        __promise->reject(std::make_exception_ptr(__jniError));
      });
      return __promise;
    }();
  }
  std::shared_ptr<Promise<void>> JHybridOneAudioSpec::clearNowPlayingInfo() {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>()>("clearNowPlayingInfo");
    auto __result = method(_javaPart);
    return [&]() {
      auto __promise = Promise<void>::create();
      __result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& /* unit */) {
        __promise->resolve();
      });
      __result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
        jni::JniException __jniError(__throwable);
        __promise->reject(std::make_exception_ptr(__jniError));
      });
      return __promise;
    }();
  }
  std::function<void()> JHybridOneAudioSpec::addRemoteCommandListener(const std::function<void(const AudioRemoteCommandEvent& /* event */)>& onEvent) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JFunc_void::javaobject>(jni::alias_ref<JFunc_void_AudioRemoteCommandEvent::javaobject> /* onEvent */)>("addRemoteCommandListener_cxx");
    auto __result = method(_javaPart, JFunc_void_AudioRemoteCommandEvent_cxx::fromCpp(onEvent));
    return [&]() -> std::function<void()> {
      if (__result->isInstanceOf(JFunc_void_cxx::javaClassStatic())) [[likely]] {
        auto downcast = jni::static_ref_cast<JFunc_void_cxx::javaobject>(__result);
        return downcast->cthis()->getFunction();
      } else {
        auto __resultRef = jni::make_global(__result);
        return JNICallable<JFunc_void, void()>(std::move(__resultRef));
      }
    }();
  }
  std::string JHybridOneAudioSpec::createPlayer(const std::optional<std::string>& sourceUri, const std::optional<std::unordered_map<std::string, std::string>>& headers) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<jni::JString>(jni::alias_ref<jni::JString> /* sourceUri */, jni::alias_ref<jni::JMap<jni::JString, jni::JString>> /* headers */)>("createPlayer");
    auto __result = method(_javaPart, sourceUri.has_value() ? jni::make_jstring(sourceUri.value()) : nullptr, headers.has_value() ? [&]() -> jni::local_ref<jni::JMap<jni::JString, jni::JString>> {
      auto __map = jni::JHashMap<jni::JString, jni::JString>::create(headers.value().size());
      for (const auto& __entry : headers.value()) {
        __map->put(jni::make_jstring(__entry.first), jni::make_jstring(__entry.second));
      }
      return __map;
    }() : nullptr);
    return __result->toStdString();
  }
  void JHybridOneAudioSpec::playerPlay(const std::string& playerId) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<void(jni::alias_ref<jni::JString> /* playerId */)>("playerPlay");
    method(_javaPart, jni::make_jstring(playerId));
  }
  void JHybridOneAudioSpec::playerPause(const std::string& playerId) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<void(jni::alias_ref<jni::JString> /* playerId */)>("playerPause");
    method(_javaPart, jni::make_jstring(playerId));
  }
  std::shared_ptr<Promise<void>> JHybridOneAudioSpec::playerSeek(const std::string& playerId, double seconds, std::optional<double> toleranceBeforeMs, std::optional<double> toleranceAfterMs) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>(jni::alias_ref<jni::JString> /* playerId */, double /* seconds */, jni::alias_ref<jni::JDouble> /* toleranceBeforeMs */, jni::alias_ref<jni::JDouble> /* toleranceAfterMs */)>("playerSeek");
    auto __result = method(_javaPart, jni::make_jstring(playerId), seconds, toleranceBeforeMs.has_value() ? jni::JDouble::valueOf(toleranceBeforeMs.value()) : nullptr, toleranceAfterMs.has_value() ? jni::JDouble::valueOf(toleranceAfterMs.value()) : nullptr);
    return [&]() {
      auto __promise = Promise<void>::create();
      __result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& /* unit */) {
        __promise->resolve();
      });
      __result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
        jni::JniException __jniError(__throwable);
        __promise->reject(std::make_exception_ptr(__jniError));
      });
      return __promise;
    }();
  }
  void JHybridOneAudioSpec::playerReplace(const std::string& playerId, const std::optional<std::string>& sourceUri, const std::optional<std::unordered_map<std::string, std::string>>& headers) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<void(jni::alias_ref<jni::JString> /* playerId */, jni::alias_ref<jni::JString> /* sourceUri */, jni::alias_ref<jni::JMap<jni::JString, jni::JString>> /* headers */)>("playerReplace");
    method(_javaPart, jni::make_jstring(playerId), sourceUri.has_value() ? jni::make_jstring(sourceUri.value()) : nullptr, headers.has_value() ? [&]() -> jni::local_ref<jni::JMap<jni::JString, jni::JString>> {
      auto __map = jni::JHashMap<jni::JString, jni::JString>::create(headers.value().size());
      for (const auto& __entry : headers.value()) {
        __map->put(jni::make_jstring(__entry.first), jni::make_jstring(__entry.second));
      }
      return __map;
    }() : nullptr);
  }
  void JHybridOneAudioSpec::removePlayer(const std::string& playerId) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<void(jni::alias_ref<jni::JString> /* playerId */)>("removePlayer");
    method(_javaPart, jni::make_jstring(playerId));
  }
  AudioPlayerStatus JHybridOneAudioSpec::getPlayerStatus(const std::string& playerId) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JAudioPlayerStatus>(jni::alias_ref<jni::JString> /* playerId */)>("getPlayerStatus");
    auto __result = method(_javaPart, jni::make_jstring(playerId));
    return __result->toCpp();
  }
  void JHybridOneAudioSpec::setPlayerRate(const std::string& playerId, double rate, std::optional<PitchCorrectionQuality> pitchQuality) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<void(jni::alias_ref<jni::JString> /* playerId */, double /* rate */, jni::alias_ref<JPitchCorrectionQuality> /* pitchQuality */)>("setPlayerRate");
    method(_javaPart, jni::make_jstring(playerId), rate, pitchQuality.has_value() ? JPitchCorrectionQuality::fromCpp(pitchQuality.value()) : nullptr);
  }
  void JHybridOneAudioSpec::setPlayerVolume(const std::string& playerId, double volume) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<void(jni::alias_ref<jni::JString> /* playerId */, double /* volume */)>("setPlayerVolume");
    method(_javaPart, jni::make_jstring(playerId), volume);
  }
  void JHybridOneAudioSpec::setPlayerMuted(const std::string& playerId, bool muted) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<void(jni::alias_ref<jni::JString> /* playerId */, jboolean /* muted */)>("setPlayerMuted");
    method(_javaPart, jni::make_jstring(playerId), muted);
  }
  void JHybridOneAudioSpec::setPlayerLoop(const std::string& playerId, bool loop) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<void(jni::alias_ref<jni::JString> /* playerId */, jboolean /* loop */)>("setPlayerLoop");
    method(_javaPart, jni::make_jstring(playerId), loop);
  }
  void JHybridOneAudioSpec::setPlayerPitchCorrection(const std::string& playerId, bool enabled) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<void(jni::alias_ref<jni::JString> /* playerId */, jboolean /* enabled */)>("setPlayerPitchCorrection");
    method(_javaPart, jni::make_jstring(playerId), enabled);
  }

} // namespace margelo::nitro::one
