마이크에서 오디오 데이터를 캡처하고 재생할 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() {
}
}