Как следует из названия, я использую библиотеку PortAudio для записи аудиовхода, чтобы передавать данные по сети на другой компьютер, где будет воспроизводиться звук. Это предшествует созданию базовой программы голосового чата.
На данный момент у меня правильно записывается звук, и данные отправляются в «серверную» программу (в настоящее время работающую на той же машине (но результаты не совпадают), тогда серверная программа просто эхо-данные возвращаются туда, откуда они пришли, чтобы их можно было воспроизвести.
Проблема, с которой я столкнулся, заключается в том, что данные, полученные обратно с сервера, по-видимому, имеют половину длины данных, отправляемых на сервер, т. Е. Когда данные воспроизводятся, аудио (это правильно) только 1 секунда вместо двух.
Это то, как данные отправляются с того места, где они записаны. Каждая часть данных отправляется и должна быть немедленно возвращена для сохранения, чтобы ее можно было воспроизвести позже:
floatData outData;
for (int i = 0; i < mData.maxFrameIndex; i++)
{
outData.dataSample = mData.recordedSamples[i];
send( mConnectSocket, (char*)&outData, sizeof(floatData), NULL );
//Receive the data send, which is echo'd back from the server straight away.
Receive( i );
}
closesocket( mConnectSocket );
WSACleanup();
Вот как это было отправлено, получено и отправлено обратно с сервера:
int iRecvResult = 0;
floatData inData;
do
{
iRecvResult = recv( mConnectSocket, (char*)&inData, sizeof(floatData), NULL );
if (iRecvResult > 0)
{
// Send the data straight back again.
iRecvResult = send( mConnectSocket, (char*)&inData, sizeof(floatData), NULL );
if( iRecvResult < 0 )
{
break;
}
}
} while (iRecvResult > 0);
closesocket( mConnectSocket );
WSACleanup();
И вот как данные принимаются обратно у исходного отправителя:
int iRecvResult = 0;
floatData inData;
iRecvResult = recv( mConnectSocket, (char*)&inData, sizeof(floatData), NULL );
mRecvData.recordedSamples[index] = inData.dataSample;
Я не знаю, почему только половина данных возвращается, все отправляется без проблем. Я предполагал, что смогу воспроизвести данные на стороне сервера, чтобы убедиться, что все это происходит на 100%, но мне было интересно, сможет ли кто-нибудь пролить свет на любые возможные теории.
Заранее спасибо.