我正在为 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因此,
0
和 1936747378
是您应该使用的值。
关于objective-c - 如何使用 Dart ffi 表示具有 int 和字符串声明的 ObjC 枚举 AVAudioSessionPortOverride?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64781293/