2015-02-08 15 views
7

पर सी ++ के साथ एएलएसए को प्राप्त यूडीपी ऑडियो डेटा को उचित रूप से कैसे लिखें, मेरे पास 2 रास्पबेरी पीआईएस हैं और उनमें से 1 ऑडियो राइडबेरी पीआई में ऑडियो डेटा के यूडीपी फ्रेम ट्रांसमिट करता है। प्राप्त यूडीपी पैकेट प्रत्येक 160 बाइट्स हैं। ट्रांसमिटिंग रास्पबेरी पाई 8 किलोहर्ट्ज़ 8-बिट मोनो नमूने भेज रहा है। प्राप्त रास्पबेरी पाई QUDPSocket के साथ क्यूटी 5.4.0 का उपयोग करता है और एएलएसए के साथ प्राप्त डेटा खेलने की कोशिश करता है। कोड नीचे है। जब भी बाइट्स रास्पबेरी पाई प्राप्त करने पर आते हैं तो "तैयार रीड" सिग्नल निकाल दिया जाता है, बफर एएलएसए को लिखा जाता है। मेरे पास रिसीविंग पीआई पर हेडफोन जैक से बहुत चंचल और गड़बड़ आवाज आ रही है - लेकिन यह पहचानने योग्य है। तो यह काम कर रहा है लेकिन भयानक लगता है।रास्पबेरी पीआई

  1. क्या एएलएसए के लिए नीचे मेरी कॉन्फ़िगरेशन के साथ कुछ गड़बड़ है?
  2. एसएनडी_पीसीएम_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++; 

} 
+0

क्या आप किसी अन्य प्रोग्राम का उपयोग करते समय बेहतर ध्वनि बजा सकते हैं? कुछ (?) मॉडल की जैक ध्वनि सामग्री (लेकिन एचडीएमआई) सिर्फ सॉफ्टवेयर से स्वतंत्र, भयानक ही है। – deviantfan

+0

इनपुट के लिए धन्यवाद। लेकिन अगर मैं एएलएसए यूटिलिटीज 'एप्ले "प्रोग्राम का उपयोग करता हूं तो ऑडियो आउटपुट बहुत अच्छा लगता है। मुझे यकीन है कि यह एक विन्यास समस्या है। – PhilBot

+0

आप अभी भी बफर/अवधि के आकार निर्धारित नहीं कर रहे हैं। –

उत्तर

0

मैं कोड के "बफर आकार को कैपिंग" समझ नहीं रहा हूं। यदि आने वाला डेटा आपके मनमानी NOMINAL_AUDIO_BUFFER_SIZE से बड़ा है तो आप उस आने वाले डेटा को बंद कर रहे हैं। क्या आपने उस कोड को हटाने की कोशिश की है?

संबंधित मुद्दे