diff options
Diffstat (limited to 'src/AlsaInput.cpp')
| -rw-r--r-- | src/AlsaInput.cpp | 25 | 
1 files changed, 18 insertions, 7 deletions
| diff --git a/src/AlsaInput.cpp b/src/AlsaInput.cpp index 14f4524..4b0da93 100644 --- a/src/AlsaInput.cpp +++ b/src/AlsaInput.cpp @@ -101,7 +101,7 @@ int AlsaInput::prepare()      return 0;  } -size_t AlsaInput::m_read(uint8_t* buf, snd_pcm_uframes_t length) +ssize_t AlsaInput::m_read(uint8_t* buf, snd_pcm_uframes_t length)  {      int i;      int err; @@ -123,28 +123,39 @@ size_t AlsaInput::m_read(uint8_t* buf, snd_pcm_uframes_t length)  void AlsaInputThreaded::start()  { -    m_running = true; -    m_thread = boost::thread(&AlsaInputThreaded::process, this); +    if (m_fault) { +        fprintf(stderr, "Cannot start alsa input. Fault detected previsouly!\n"); +    } +    else { +        m_running = true; +        m_thread = boost::thread(&AlsaInputThreaded::process, this); +    }  }  void AlsaInputThreaded::process()  {      uint8_t samplebuf[NUM_SAMPLES_PER_CALL * BYTES_PER_SAMPLE * m_channels];      while (m_running) { -        size_t n = m_read(samplebuf, NUM_SAMPLES_PER_CALL); +        ssize_t n = m_read(samplebuf, NUM_SAMPLES_PER_CALL); + +        if (n < 0) { +            m_running = false; +            m_fault = true; +            break; +        }          m_queue.push(samplebuf, BYTES_PER_SAMPLE*m_channels*n);      }  } -size_t AlsaInputDirect::read(uint8_t* buf, size_t length) +ssize_t AlsaInputDirect::read(uint8_t* buf, size_t length)  {      int bytes_per_frame = m_channels * BYTES_PER_SAMPLE;      assert(length % bytes_per_frame == 0); -    size_t read = m_read(buf, length / bytes_per_frame); +    ssize_t read = m_read(buf, length / bytes_per_frame); -    return read * bytes_per_frame; +    return (read > 0) ? read * bytes_per_frame : read;  } | 
