पर सी ++ के साथ एएलएसए को प्राप्त यूडीपी ऑडियो डेटा को उचित रूप से कैसे लिखें, मेरे पास 2 रास्पबेरी पीआईएस हैं और उनमें से 1 ऑडियो राइडबेरी पीआई में ऑडियो डेटा के यूडीपी फ्रेम ट्रांसमिट करता है। प्राप्त यूडीपी पैकेट प्रत्येक 160 बाइट्स हैं। ट्रांसमिटिंग रास्पबेरी पाई 8 किलोहर्ट्ज़ 8-बिट मोनो नमूने भेज रहा है। प्राप्त रास्पबेरी पाई QUDPSocket के साथ क्यूटी 5.4.0 का उपयोग करता है और एएलएसए के साथ प्राप्त डेटा खेलने की कोशिश करता है। कोड नीचे है। जब भी बाइट्स रास्पबेरी पाई प्राप्त करने पर आते हैं तो "तैयार रीड" सिग्नल निकाल दिया जाता है, बफर एएलएसए को लिखा जाता है। मेरे पास रिसीविंग पीआई पर हेडफोन जैक से बहुत चंचल और गड़बड़ आवाज आ रही है - लेकिन यह पहचानने योग्य है। तो यह काम कर रहा है लेकिन भयानक लगता है।रास्पबेरी पीआई
- क्या एएलएसए के लिए नीचे मेरी कॉन्फ़िगरेशन के साथ कुछ गड़बड़ है?
- एसएनडी_पीसीएम_writei के साथ एएलएसए को प्राप्त यूडीपी पैकेट लिखने के लिए मुझे कैसे संपर्क करना चाहिए?
किसी भी सुझाव के लिए धन्यवाद।
UdpReceiver::UdpReceiver(QObject *parent) : QObject(parent)
{
// Debug
qDebug() << "Setting up a UDP Socket...";
// Create a socket
m_Socket = new QUdpSocket(this);
// Bind to the 2616 port
bool didBind = m_Socket->bind(QHostAddress::Any, 0x2616);
if (!didBind) {
qDebug() << "Error - could not bind to UDP Port!";
}
else {
qDebug() << "Success binding to port 0x2616!";
}
// Get notified that data is incoming to the socket
connect(m_Socket, SIGNAL(readyRead()), this, SLOT(readyRead()));
// Init to Zero
m_NumberUDPPacketsReceived = 0;
}
void UdpReceiver::readyRead() {
// When data comes in
QByteArray buffer;
buffer.resize(m_Socket->pendingDatagramSize());
QHostAddress sender;
quint16 senderPort;
// Cap buffer size
int lenToRead = buffer.size();
if (buffer.size() > NOMINAL_AUDIO_BUFFER_SIZE) {
lenToRead = NOMINAL_AUDIO_BUFFER_SIZE;
}
// Read the data from the UDP Port
m_Socket->readDatagram(buffer.data(), lenToRead,
&sender, &senderPort);
// Kick off audio playback
if (m_NumberUDPPacketsReceived == 0) {
qDebug() << "Received Data - Setting up ALSA Now....";
// Error handling
int err;
// Device to Write to
char *snd_device_out = "hw:0,0";
if ((err = snd_pcm_open (&playback_handle, snd_device_out, SND_PCM_STREAM_PLAYBACK, 0)) < 0) {
fprintf (stderr, "cannot open audio device %s (%s)\n",
snd_device_out,
snd_strerror (err));
exit (1);
}
if ((err = snd_pcm_hw_params_malloc (&hw_params)) < 0) {
fprintf (stderr, "cannot allocate hardware parameter structure (%s)\n",
snd_strerror (err));
exit (1);
}
if ((err = snd_pcm_hw_params_any (playback_handle, hw_params)) < 0) {
fprintf (stderr, "cannot initialize hardware parameter structure (%s)\n",
snd_strerror (err));
exit (1);
}
if ((err = snd_pcm_hw_params_set_access (playback_handle, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) {
fprintf (stderr, "cannot set access type (%s)\n",
snd_strerror (err));
exit (1);
}
if ((err = snd_pcm_hw_params_set_format (playback_handle, hw_params, SND_PCM_FORMAT_U8)) < 0) { // Unsigned 8 bit
fprintf (stderr, "cannot set sample format (%s)\n",
snd_strerror (err));
exit (1);
}
uint sample_rate = 8000;
if ((err = snd_pcm_hw_params_set_rate (playback_handle, hw_params, sample_rate, 0)) < 0) { // 8 KHz
fprintf (stderr, "cannot set sample rate (%s)\n",
snd_strerror (err));
exit (1);
}
if ((err = snd_pcm_hw_params_set_channels (playback_handle, hw_params, 1)) < 0) { // 1 Channel Mono
fprintf (stderr, "cannot set channel count (%s)\n",
snd_strerror (err));
exit (1);
}
if ((err = snd_pcm_hw_params (playback_handle, hw_params)) < 0) {
fprintf (stderr, "cannot set parameters (%s)\n",
snd_strerror (err));
exit (1);
}
snd_pcm_hw_params_free (hw_params);
// Flush handle prepare for playback
snd_pcm_drop(playback_handle);
if ((err = snd_pcm_prepare (playback_handle)) < 0) {
fprintf (stderr, "cannot prepare audio interface for use (%s)\n",
snd_strerror (err));
exit (1);
}
qDebug() << "Done Setting up ALSA....";
}
// Grab the buffer
m_Buffer = buffer.data();
// Write the data to the ALSA device
int error;
if ((error = snd_pcm_writei (playback_handle, m_Buffer, NOMINAL_AUDIO_BUFFER_SIZE)) != NOMINAL_AUDIO_BUFFER_SIZE) {
fprintf (stderr, "write to audio interface failed (%s)\n",
snd_strerror (error));
exit (1);
}
// Count up
m_NumberUDPPacketsReceived++;
}
क्या आप किसी अन्य प्रोग्राम का उपयोग करते समय बेहतर ध्वनि बजा सकते हैं? कुछ (?) मॉडल की जैक ध्वनि सामग्री (लेकिन एचडीएमआई) सिर्फ सॉफ्टवेयर से स्वतंत्र, भयानक ही है। – deviantfan
इनपुट के लिए धन्यवाद। लेकिन अगर मैं एएलएसए यूटिलिटीज 'एप्ले "प्रोग्राम का उपयोग करता हूं तो ऑडियो आउटपुट बहुत अच्छा लगता है। मुझे यकीन है कि यह एक विन्यास समस्या है। – PhilBot
आप अभी भी बफर/अवधि के आकार निर्धारित नहीं कर रहे हैं। –