如何在Nativescript上访问ios核心音频(AudioQueue)

时间:2016-07-19 13:08:36

标签: ios audio plugins nativescript

我是nativescript的新手,现在正在开发ios版本的应用程序。 我在处理音频队列回调时遇到了一些麻烦。

我需要通过设备麦克风捕获原始音频缓冲区数据。(以毫秒为单位评估输入级别)1 为此,我尝试从我的自定义插件调用ios原生AudioToolBox / AudioQueueNewInput API。

最后,它运行时没有错误,但回调“inCallbackProc”永远不会被触发......

这是我的代码。

myplugin.ios.js

var kSamplingRate = 44100;
var inUserData = null;
var inCallbackRunLoopMode = kCFRunLoopDefaultMode;
var inFlags = 0;
//var outAQ = AudioQueueRef.alloc().init(); // error
//var outAQ = new OpaqueAudioQueue(); //error
var outAQ;
var inFormat = 
    new AudioStreamBasicDescription(
    kSamplingRate,
    kAudioFormatLinearPCM,
    kLinearPCMFormatFlagIsFloat,
    4,
    1,
    4,
    1,
    8,
    0
);

var buffers = [null, null, null];

var audiomodule = {
    inCallbackProc : function(
        inUserData, 
        inAQ, 
        inBuffer, 
        inStartTime, 
        inNumberPacketDescriptions, 
        inPacketDescs 
        ){
            console.log("callbacked");
        }
    ,record: function(){
        console.log("recordstarting");

        AudioQueueNewInput (
         inFormat, 
         this.inCallbackProc.copy,
         inUserData, 
         CFRunLoopGetCurrent(),
         inCallbackRunLoopMode, 
         inFlags, 
         outAQ
         );
        for (i in [0, 1, 2]) {
            AudioQueueAllocateBuffer(outAQ, 256, buffers[i])
            AudioQueueEnqueueBuffer(outAQ, buffers[i], 0, null)
           }

    AudioQueueStart(outAQ, null);
    }

};

module.exports = audiomodule;

app.js

var MyPlugin = require("myplugin");

exports.loaded = function(args) {
    var page = args.object;
    if (page.ios) {
        MyPlugin.record();
    }
};

执行此代码时,我可以在控制台日志中找到“recordstarting”,没有错误,但找不到“回调”。

我已阅读此文档。 NativeScript Doc - Marshaling

感谢任何人的帮助或评论。

1 个答案:

答案 0 :(得分:1)

我决定创建自己的插件 我自己的Objective-c库包装了原生的AudioRecord(Core Audio)API 并且自己的插件js暴露了库函数 最后,它的工作原理,回调工作也是如此。

在MyLibrary(目标-c)的

@property (nonatomic, copy) void (^completionHandler)(NSString *result);

myplugin.ios.js

mylibrary.completionHandler = (
function(response){
    console.log(response);
}