diff options
| author | Matthias P. Braendli <matthias.braendli@mpb.li> | 2017-10-07 10:31:04 +0200 | 
|---|---|---|
| committer | Matthias P. Braendli <matthias.braendli@mpb.li> | 2017-10-07 10:31:04 +0200 | 
| commit | 68ee7799a4eeb4148cd4628113ebf9ea3f94a211 (patch) | |
| tree | 974962f0f9a2552b8a9665b18563e5e14602453e /src/AlsaInput.cpp | |
| parent | 39e95f67515f97030f4e4dee03abde33ce35a99a (diff) | |
| download | ODR-AudioEnc-68ee7799a4eeb4148cd4628113ebf9ea3f94a211.tar.gz ODR-AudioEnc-68ee7799a4eeb4148cd4628113ebf9ea3f94a211.tar.bz2 ODR-AudioEnc-68ee7799a4eeb4148cd4628113ebf9ea3f94a211.zip  | |
Make all inputs use the same interface
Diffstat (limited to 'src/AlsaInput.cpp')
| -rw-r--r-- | src/AlsaInput.cpp | 70 | 
1 files changed, 39 insertions, 31 deletions
diff --git a/src/AlsaInput.cpp b/src/AlsaInput.cpp index 293232f..af3c284 100644 --- a/src/AlsaInput.cpp +++ b/src/AlsaInput.cpp @@ -1,6 +1,6 @@  /* ------------------------------------------------------------------   * Copyright (C) 2011 Martin Storsjo - * Copyright (C) 2013,2014 Matthias P. Braendli + * Copyright (C) 2017 Matthias P. Braendli   *   * Licensed under the Apache License, Version 2.0 (the "License");   * you may not use this file except in compliance with the License. @@ -22,13 +22,28 @@  #include "AlsaInput.h"  #include <cstdio> +#include <stdexcept>  #include <string>  #include <alsa/asoundlib.h>  #include <sys/time.h>  using namespace std; -int AlsaInput::prepare() +AlsaInput::~AlsaInput() +{ +    if (m_alsa_handle) { +        snd_pcm_close(m_alsa_handle); +        m_alsa_handle = nullptr; +    } +} + +static std::string alsa_strerror(int err) +{ +    string s(snd_strerror(err)); +    return s; +} + +void AlsaInput::m_init_alsa()  {      int err;      snd_pcm_hw_params_t *hw_params; @@ -39,67 +54,54 @@ int AlsaInput::prepare()      if ((err = snd_pcm_open(&m_alsa_handle, m_alsa_dev.c_str(),                      SND_PCM_STREAM_CAPTURE, open_mode)) < 0) { -        fprintf (stderr, "cannot open audio device %s (%s)\n", -                m_alsa_dev.c_str(), snd_strerror(err)); -        return 1; +        throw runtime_error("cannot open audio device " + +                m_alsa_dev + "(" + alsa_strerror(err) + ")");      }      if ((err = snd_pcm_hw_params_malloc(&hw_params)) < 0) { -        fprintf (stderr, "cannot allocate hardware parameter structure (%s)\n", -                snd_strerror(err)); -        return 1; +        throw runtime_error("cannot allocate hardware parameter structure (" + +                alsa_strerror(err) + ")");      }      if ((err = snd_pcm_hw_params_any(m_alsa_handle, hw_params)) < 0) { -        fprintf (stderr, "cannot initialize hardware parameter structure (%s)\n", -                snd_strerror(err)); -        return 1; +        throw runtime_error("cannot initialize hardware parameter structure (" + +                alsa_strerror(err) + ")");      }      if ((err = snd_pcm_hw_params_set_access(m_alsa_handle, hw_params,                      SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) { -        fprintf (stderr, "cannot set access type (%s)\n", -                snd_strerror(err)); -        return 1; +        throw runtime_error("cannot set access type (" + alsa_strerror(err) + ")");      }      if ((err = snd_pcm_hw_params_set_format(m_alsa_handle, hw_params,                      SND_PCM_FORMAT_S16_LE)) < 0) { -        fprintf (stderr, "cannot set sample format (%s)\n", -                snd_strerror(err)); -        return 1; +        throw runtime_error("cannot set sample format (" + +                alsa_strerror(err) + ")");      }      if ((err = snd_pcm_hw_params_set_rate_near(m_alsa_handle,                  hw_params, &m_rate, 0)) < 0) { -        fprintf (stderr, "cannot set sample rate (%s)\n", -                snd_strerror(err)); -        return 1; +        throw runtime_error("cannot set sample rate (" + alsa_strerror(err) + ")");      }      if ((err = snd_pcm_hw_params_set_channels(m_alsa_handle,                      hw_params, m_channels)) < 0) { -        fprintf (stderr, "cannot set channel count (%s)\n", -                snd_strerror(err)); -        return 1; +        throw runtime_error("cannot set channel count (" + +                alsa_strerror(err) + ")");      }      if ((err = snd_pcm_hw_params(m_alsa_handle, hw_params)) < 0) { -        fprintf (stderr, "cannot set parameters (%s)\n", -                snd_strerror(err)); -        return 1; +        throw runtime_error("cannot set parameters (" + alsa_strerror(err) + ")");      }      snd_pcm_hw_params_free (hw_params);      if ((err = snd_pcm_prepare(m_alsa_handle)) < 0) { -        fprintf (stderr, "cannot prepare audio interface for use (%s)\n", -                snd_strerror(err)); -        return 1; +        throw runtime_error("cannot prepare audio interface for use (" + +                alsa_strerror(err) + ")");      }      fprintf(stderr, "ALSA init done.\n"); -    return 0;  }  ssize_t AlsaInput::m_read(uint8_t* buf, snd_pcm_uframes_t length) @@ -122,12 +124,14 @@ ssize_t AlsaInput::m_read(uint8_t* buf, snd_pcm_uframes_t length)      return err;  } -void AlsaInputThreaded::start() +void AlsaInputThreaded::prepare()  {      if (m_fault) {          fprintf(stderr, "Cannot start alsa input. Fault detected previsouly!\n");      }      else { +        m_init_alsa(); +          m_running = true;          m_thread = std::thread(&AlsaInputThreaded::process, this);      } @@ -149,6 +153,10 @@ void AlsaInputThreaded::process()      }  } +void AlsaInputDirect::prepare() +{ +    m_init_alsa(); +}  ssize_t AlsaInputDirect::read(uint8_t* buf, size_t length)  {  | 
