short out48k_short[2*N48];
int nout;
- //wxLogDebug("start infifo1: %5d outfifo1: %5d\n", fifo_n(cbData->infifo1), fifo_n(cbData->outfifo1));
+ //wxLogDebug("start infifo1: %5d outfifo1: %5d\n", fifo_n(cbData->infifo1), fifo_n(cbData->outfifo1));
//
// RX side processing --------------------------------------------
int nsam = g_soundCard1SampleRate * (float)N8/FS;
assert(nsam <= N48);
+ g_mutexProtectingCallbackData.Lock();
while (fifo_read(cbData->infifo1, in48k_short, nsam) == 0)
{
+ g_mutexProtectingCallbackData.Unlock();
int n8k;
n8k = resample(cbData->insrc1, in8k_short, in48k_short, FS, g_soundCard1SampleRate, N8, nsam);
resample_for_plot(g_plotSpeechOutFifo, out8k_short, N8);
+ g_mutexProtectingCallbackData.Lock();
if (g_nSoundCards == 1) {
nout = resample(cbData->outsrc2, out48k_short, out8k_short, g_soundCard1SampleRate, FS, N48, N8);
fifo_write(cbData->outfifo1, out48k_short, nout);
nout = resample(cbData->outsrc2, out48k_short, out8k_short, g_soundCard2SampleRate, FS, N48, N8);
fifo_write(cbData->outfifo2, out48k_short, nout);
}
-
}
+ g_mutexProtectingCallbackData.Unlock();
//
// TX side processing --------------------------------------------
// samples are uninterrupted by differences in sample rate
// between this sound card and sound card 2.
+ g_mutexProtectingCallbackData.Lock();
while((unsigned)fifo_n(cbData->outfifo1) < 6*N48) {
+ g_mutexProtectingCallbackData.Unlock();
int nsam = g_soundCard2SampleRate * (float)codec2_samples_per_frame(g_pCodec2)/FS;
assert(nsam <= 2*N48);
// output 40ms of modem tone
nout = resample(cbData->outsrc1, out48k_short, out8k_short, g_soundCard1SampleRate, FS, 2*N48, 2*N8);
+ g_mutexProtectingCallbackData.Lock();
fifo_write(cbData->outfifo1, out48k_short, nout);
}
+ g_mutexProtectingCallbackData.Unlock();
}
//wxLogDebug(" end infifo1: %5d outfifo1: %5d\n", fifo_n(cbData->infifo1), fifo_n(cbData->outfifo1));
assert(inputBuffer != NULL);
assert(outputBuffer != NULL);
+ wxMutexLocker lock(g_mutexProtectingCallbackData);
+
+ if (cb_cnt)
+ printf("cb1: already in a callback\n");
+ cb_cnt++;
if (statusFlags)
printf("cb1 statusFlags: 0x%x\n", (int)statusFlags);
wptr[1] = 0;
}
}
+ cb_cnt--;
return paContinue;
}
short indata[MAX_FPB];
short outdata[MAX_FPB];
+ wxMutexLocker lock(g_mutexProtectingCallbackData);
+
+ if (cb_cnt)
+ printf("cb2: already in a callback\n");
+ cb_cnt++;
if (statusFlags)
printf("cb2 statusFlags: 0x%x\n", (int)statusFlags);
}
#endif
//printf("end cb2\n");
+ cb_cnt--;
return paContinue;
}