2014-12-20 6 views
0

마이크에서 오디오 데이터를 캡처하고 재생할 Unity 클래스를 작성하고 있습니다. 재생 파트가 잘 작동합니다. 헤드폰에서 내 목소리를들을 수는 있지만 재생 중에 pcmsetposcallback이 호출되지 않기 때문에 오디오 샘플에 액세스 할 수 없습니다. createSound 메서드 내에서 한 번만 호출됩니다. 나는 몇몇 설정을 놓쳤다 고 생각한다. 또한 FMOD.MODE 플래그에 대해 여러 OR 조합을 시도했지만 운이 없다. fmodstudio10510.unitypackage를 사용 중이며 Windows 7에서 테스트하고 있지만 완전히 croos-platform을 지원해야합니다. 미리 감사드립니다. 월터마이크 소스에서 오디오를 재생하는 동안 FMOD pcmreadcallback이 호출되지 않습니다.

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() { 
    } 

} 

답변

0

녹화 시스템은 당신이 그 콜백을 받고되지 않습니다 그 이유는, pcmreadcallback를 통해 이동하지 않습니다.

마이크 데이터에 액세스하려면 Sound :: lock 및 Sound :: unlock을 사용하십시오.