2012-03-28 17 views
1

Wie der Titel vermuten lässt, verwende ich die PortAudio-Bibliothek zum Aufzeichnen von Audioeingängen, um die Daten über ein Netzwerk an ein anderes Gerät zu senden, auf dem die Audiodaten wiedergegeben werden. Dies ist ein Vorläufer für die Erstellung eines grundlegenden Voice-Chat-Programms.Senden von Audiodaten über ein Netzwerk mithilfe von PortAudio

Im Moment habe ich die Audio korrekt erfasst & die Daten werden an ein "Server" -Programm gesendet (läuft derzeit auf dem gleichen Rechner (aber die Ergebnisse sind die gleichen, wenn es nicht ist). Das Server-Programm dann nur echo ist die Daten zurück, wo es herkam, so dass es abgespielt werden kann

Das Problem, das ich habe, ist, dass die Daten zurück vom Server empfangen werden scheint, von der halben Länge der Daten gesendet zu sein der Server, dh wenn die Daten wiedergegeben werden, ist der Ton (der korrekt ist) nur 1 Sekunde statt zwei.

So werden die Daten von wo es aufgezeichnet wird gesendet.Jedes Stück Daten wird gesendet Und sollte wieder sofort gespeichert werden, empfangen werden, so dass sie später wiedergegeben werden können:

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(); 

Hier ist, wie es & vom Server gesendet wird empfangen gesendet:

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(); 

Und das ist wie die Daten an den ursprünglichen Absender zurückerhalten:

int iRecvResult = 0; 
floatData inData; 

iRecvResult = recv(mConnectSocket, (char*)&inData, sizeof(floatData), NULL); 

mRecvData.recordedSamples[index] = inData.dataSample; 

ich es wieder weiß nicht, warum die Daten nur 1/2, alle wird gesendet, ohne irgendwelche Probleme empfangen werden. Ich vermutete, dass ich die Daten auf der Server-Seite der Dinge wiedergeben konnte, um sicherzustellen, dass alles zu 100% da ist, aber ich fragte mich, ob irgendjemand irgendein Licht auf mögliche Theorien werfen könnte.

Vielen Dank im Voraus.

Antwort

0

Mein eigenes Problem behoben, nachdem ich mir in den letzten Tagen die Haare ausgerissen hatte. Stellt sich als ein dummer Fehler heraus.

Ich war nur 1/2 bekommen die Daten zurück, weil ich nur 1/2 Senden der Daten xD

Statt durch Looping zu mData.maxFrameIndex wie ich oben war, sollte ich auf die Zahl wurden Durchschleifen Proben, die ich hätte, wäre mData.maxFrameIndex * NUM_CHANNELS, die Anzahl der Kanäle ist 2.

floatData outData; 
for (int i = 0; i < mNumSamples; 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); 
} 
Verwandte Themen