objective-c - 如何使用 Dart ffi 表示具有 int 和字符串声明的 ObjC 枚举 AVAudioSessionPortOverride?

标签 objective-c dart ffi

我正在为 Flutter 开发一个跨平台的声音 API。
我们正在尝试停止在 API 的 iOS 部分使用 Objective C/Swift,并使用 Dart ffi 作为替代。
ffi(外部函数接口(interface))允许 dart 调用 Obj C API。
这意味着我们需要创建一个包装 Obj C 音频库的 dart 库。
在执行此操作时,我们遇到了 AVAudioSessionPortOverride有两个声明的枚举; AVAudioSessionPortOverrideSpeaker = 'spkr'AVAudioSessionPortOverrideNone = 0 .
我对这里发生的事情感到困惑,因为其中一个声明是 int 而另一个是字符串。
我注意到 AVAudioSessionPortOverride扩展一个 NSUInteger 那么如何处理字符串。它是否以某种方式转换为int?如果是这样,我将如何在 Dart 中做到这一点有什么想法吗?
以下是我们目前所拥有的:

class AVAudioSessionPortOverride extends NSUInteger {
  const AVAudioSessionPortOverride(int value) : super(value);

  static AVAudioSessionPortOverride None = AVAudioSessionPortOverride(0);

  static const AVAudioSessionPortOverride Speaker =
      AVAudioSessionPortOverride('spkr');
}

最佳答案

'spkr'实际上是一个int。参见例如How to convert multi-character constant to integer in C?了解 C 中这个晦涩的特性是如何工作的。
也就是说,如果您查看 PortOverride 的 Swift 表示枚举,你会看到这个:

/// For use with overrideOutputAudioPort:error:
public enum PortOverride : UInt {    
    /// No override.  Return audio routing to the default state for the current audio category.
    case none = 0

    /// Route audio output to speaker.  Use this override with AVAudioSessionCategoryPlayAndRecord,
    /// which by default routes the output to the receiver.
    case speaker = 1936747378
}
另见 https://developer.apple.com/documentation/avfoundation/avaudiosession/portoverride/speaker
因此,01936747378是您应该使用的值。

关于objective-c - 如何使用 Dart ffi 表示具有 int 和字符串声明的 ObjC 枚举 AVAudioSessionPortOverride?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64781293/

相关文章:

ios - 如何将 Obj-C block 保存在 C 结构中?

c - 将 `foreign import prim` 与使用 STG 调用约定的 C 函数一起使用

c - haskell FFI : Calling FunPtrs

android - 如何将媒体查询数据添加到特定填充?

flutter - Flutter中出现这个错误的原因是什么?

c - "multiple definition of ` memcmp“链接Rust staticlib与嵌入式C程序时出错

iphone - 将字符串转换为 int-objective c

objective-c - NSFileWrapper 的 serializedRepresentation 返回不适当的大数据

ios - Objective-C 中的字符串比较与 isEqualToString

flutter - 如何在 flutter 中为自定义绘制的圆圈提供阴影