Unity3d 从麦克风源播放音频时,不会调用FMOD pcmreadcallback

Unity3d 从麦克风源播放音频时,不会调用FMOD pcmreadcallback,unity3d,playback,microphone,fmod,Unity3d,Playback,Microphone,Fmod,我正在编写一个Unity类来捕获和回放来自麦克风的音频数据。播放部分工作正常我可以在耳机中听到我的声音,但我无法访问音频样本,因为在播放过程中从未调用pcmsetposcallback。在createSound方法中只调用一次。我想我错过了一些设置,也尝试了几个或组合的FMOD.MODE标志,但没有运气。 我在Windows7下使用fmodstudio10510.unitypackage并进行测试,但它应该具有完全的croos平台支持。 提前谢谢。 沃尔特 录音系统没有通过pcmreadcall

我正在编写一个Unity类来捕获和回放来自麦克风的音频数据。播放部分工作正常我可以在耳机中听到我的声音,但我无法访问音频样本,因为在播放过程中从未调用pcmsetposcallback。在createSound方法中只调用一次。我想我错过了一些设置,也尝试了几个或组合的FMOD.MODE标志,但没有运气。 我在Windows7下使用fmodstudio10510.unitypackage并进行测试,但它应该具有完全的croos平台支持。 提前谢谢。 沃尔特


录音系统没有通过pcmreadcallback,这就是为什么你没有收到这些回调

要访问麦克风数据,请使用Sound::lock和Sound::unlock

public class AudioInit : MonoBehaviour {

    FMOD.System lowlevel = null;
    FMOD.Sound snd = null;

    // callbacks delegates
    FMOD.SOUND_PCMREADCALLBACK pcmreadcallbackPtr = new FMOD.SOUND_PCMREADCALLBACK (pcmreadcallbackFunc);
    int driverId;

    void Start () {

        int channels = 1;
        int sampleRate = 8000;
        float recordTime = 1.0f;

        // get low level instance
        FMOD_StudioSystem.instance.System.getLowLevelSystem(out lowlevel);

        // fill sound info struct
        FMOD.CREATESOUNDEXINFO soundInfo = new FMOD.CREATESOUNDEXINFO ();       
        soundInfo.cbsize = System.Runtime.InteropServices.Marshal.SizeOf (typeof(FMOD.CREATESOUNDEXINFO));
        soundInfo.length  = (uint)(sampleRate * channels * sizeof(byte) * recordTime);      
        soundInfo.numchannels       = channels;
        soundInfo.defaultfrequency  = sampleRate;
        soundInfo.format            = FMOD.SOUND_FORMAT.PCM8;
        soundInfo.pcmreadcallback = pcmreadcallbackPtr;
        soundInfo.pcmsetposcallback = pcmsetposcallbackPtr;
        soundInfo.dlsname = IntPtr.Zero;

        // FMODE MODE flag
        FMOD.MODE mode = FMOD.MODE.OPENUSER | FMOD.MODE.LOOP_NORMAL;

        // create sound
        FMOD.RESULT res = lowlevel.createSound((string)null, mode, ref soundInfo, out snd);

        if (res != FMOD.RESULT.OK) {
            Debug.Log ("ERROR snd " + res.ToString ());
            return;
        }

        // get driver
        res = lowlevel.getDriver (out driverId);        
        if (res != FMOD.RESULT.OK) {
            Debug.Log ("ERROR getDriver " + res.ToString ());
            return;
        }

        // start record from microphone
        res = lowlevel.recordStart (driverId, snd, true);       
        if (res != FMOD.RESULT.OK) {
            Debug.Log ("ERROR recordStart " + res.ToString ());
            return;
        }

        uint pos = 0;
        uint tries = 10;
        // wait for a valid record position
        while ( !(pos > 0) && (tries--) > 0 ) {

            if ( lowlevel.getRecordPosition(driverId, out pos) == FMOD.RESULT.OK ){
                System.Threading.Thread.Sleep(100);
            } else { break; }
        }
        if ( !( pos > 0 )) {
            Debug.Log ("ERROR invalid record position");
            return;
        }

        // start playback
        FMOD.Channel chn;
        res = lowlevel.playSound (snd, new FMOD.ChannelGroup (IntPtr.Zero), false, out chn);

        if (res != FMOD.RESULT.OK) {
            Debug.Log ("ERROR recordStart " + res.ToString ());
            return;
        }
    }

    // only called once during lowlevel.createSound execution 
    static FMOD.RESULT pcmreadcallbackFunc (IntPtr sound, IntPtr data, uint len){

        Debug.Log("pcmreadcallback sample size " + len.ToString());
        return FMOD.RESULT.OK;
    }

    // Update is called once per frame
    void Update () {
    }

}