alsalayer: cleanup and fixed class

Change-Id: Ice2d49076b129c59e3cf6e8a6a70890379ebac71
diff --git a/src/media/audio/alsa/alsalayer.cpp b/src/media/audio/alsa/alsalayer.cpp
index 2fe3152..906fffc 100644
--- a/src/media/audio/alsa/alsalayer.cpp
+++ b/src/media/audio/alsa/alsalayer.cpp
@@ -4,7 +4,8 @@
  *  Author: Emmanuel Milou <emmanuel.milou@savoirfairelinux.com>
  *  Author: Alexandre Savard <alexandre.savard@savoirfairelinux.com>
  *  Author: Андрей Лухнов <aol.nnov@gmail.com>
- *
+ *  Author: Mohamed Fenjiro <mohamed.fenjiro@savoirfairelinux.com>
+ * 
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
  *  the Free Software Foundation; either version 3 of the License, or
@@ -40,7 +41,6 @@
 public:
     AlsaThread(AlsaLayer *alsa);
     ~AlsaThread();
-    void initAudioLayer();
     void start();
     bool isRunning() const;
 
@@ -74,70 +74,9 @@
     thread_ = std::thread(&AlsaThread::run, this);
 }
 
-void AlsaThread::initAudioLayer(void)
-{
-    std::string pcmp;
-    std::string pcmr;
-    std::string pcmc;
-
-    if (alsa_->audioPlugin_ == PCM_DMIX_DSNOOP) {
-        pcmp = alsa_->buildDeviceTopo(PCM_DMIX, alsa_->indexOut_);
-        pcmr = alsa_->buildDeviceTopo(PCM_DMIX, alsa_->indexRing_);
-        pcmc = alsa_->buildDeviceTopo(PCM_DSNOOP, alsa_->indexIn_);
-    } else {
-        pcmp = alsa_->buildDeviceTopo(alsa_->audioPlugin_, alsa_->indexOut_);
-        pcmr = alsa_->buildDeviceTopo(alsa_->audioPlugin_, alsa_->indexRing_);
-        pcmc = alsa_->buildDeviceTopo(alsa_->audioPlugin_, alsa_->indexIn_);
-    }
-
-    if (not alsa_->is_capture_open_) {
-        alsa_->is_capture_open_ = alsa_->openDevice(&alsa_->captureHandle_, pcmc, SND_PCM_STREAM_CAPTURE, alsa_->audioInputFormat_);
-
-        if (not alsa_->is_capture_open_)
-            emitSignal<DRing::ConfigurationSignal::Error>(ALSA_CAPTURE_DEVICE);
-    }
-
-    if (not alsa_->is_playback_open_) {
-        alsa_->is_playback_open_ = alsa_->openDevice(&alsa_->playbackHandle_, pcmp, SND_PCM_STREAM_PLAYBACK, alsa_->audioFormat_);
-
-        if (not alsa_->is_playback_open_)
-            emitSignal<DRing::ConfigurationSignal::Error>(ALSA_PLAYBACK_DEVICE);
-
-        if (alsa_->getIndexPlayback() != alsa_->getIndexRingtone())
-            if (!alsa_->openDevice(&alsa_->ringtoneHandle_, pcmr, SND_PCM_STREAM_PLAYBACK, alsa_->audioFormat_))
-                emitSignal<DRing::ConfigurationSignal::Error>(ALSA_PLAYBACK_DEVICE);
-    }
-
-    alsa_->hardwareFormatAvailable(alsa_->getFormat());
-    alsa_->hardwareInputFormatAvailable(alsa_->audioInputFormat_);
-
-    alsa_->prepareCaptureStream();
-    alsa_->preparePlaybackStream();
-
-    alsa_->startCaptureStream();
-    alsa_->startPlaybackStream();
-
-    alsa_->flushMain();
-    alsa_->flushUrgent();
-}
-
-/**
- * Reimplementation of run()
- */
 void AlsaThread::run()
 {
-    initAudioLayer();
-    {
-        std::lock_guard<std::mutex> lock(alsa_->mutex_);
-        alsa_->status_ = AudioLayer::Status::Started;
-    }
-    alsa_->startedCv_.notify_all();
-
-    while (alsa_->status_ == AudioLayer::Status::Started and running_) {
-        alsa_->playback();
-        alsa_->ringtone();
-        alsa_->capture();
-    }
+    alsa_->run();
 }
 
 AlsaLayer::AlsaLayer(const AudioPreference &pref)
@@ -172,6 +111,72 @@
     closePlaybackStream();
 }
 
+void AlsaLayer::initAudioLayer()
+{
+    std::string pcmp;
+    std::string pcmr;
+    std::string pcmc;
+
+    if (audioPlugin_ == PCM_DMIX_DSNOOP) {
+        pcmp = buildDeviceTopo(PCM_DMIX, indexOut_);
+        pcmr = buildDeviceTopo(PCM_DMIX, indexRing_);
+        pcmc = buildDeviceTopo(PCM_DSNOOP, indexIn_);
+    } else {
+        pcmp = buildDeviceTopo(audioPlugin_, indexOut_);
+        pcmr = buildDeviceTopo(audioPlugin_, indexRing_);
+        pcmc = buildDeviceTopo(audioPlugin_, indexIn_);
+    }
+
+    if (not is_capture_open_) {
+        is_capture_open_ = openDevice(&captureHandle_, pcmc, SND_PCM_STREAM_CAPTURE, audioInputFormat_);
+
+        if (not is_capture_open_)
+            emitSignal<DRing::ConfigurationSignal::Error>(ALSA_CAPTURE_DEVICE);
+    }
+
+    if (not is_playback_open_) {
+        is_playback_open_ = openDevice(&playbackHandle_, pcmp, SND_PCM_STREAM_PLAYBACK, audioFormat_);
+
+        if (not is_playback_open_)
+            emitSignal<DRing::ConfigurationSignal::Error>(ALSA_PLAYBACK_DEVICE);
+
+        if (getIndexPlayback() != getIndexRingtone())
+            if (!openDevice(&ringtoneHandle_, pcmr, SND_PCM_STREAM_PLAYBACK, audioFormat_))
+                emitSignal<DRing::ConfigurationSignal::Error>(ALSA_PLAYBACK_DEVICE);
+    }
+
+    hardwareFormatAvailable(getFormat());
+    hardwareInputFormatAvailable(audioInputFormat_);
+
+    prepareCaptureStream();
+    preparePlaybackStream();
+
+    startCaptureStream();
+    startPlaybackStream();
+
+    flushMain();
+    flushUrgent();
+}
+
+/**
+ * Reimplementation of run()
+ */
+void AlsaLayer::run()
+{
+    initAudioLayer();
+    {
+        std::lock_guard<std::mutex> lock(mutex_);
+        status_ = AudioLayer::Status::Started;
+    }
+    startedCv_.notify_all();
+
+    while (status_ == AudioLayer::Status::Started and audioThread_ and audioThread_->isRunning()) {
+        playback();
+        ringtone();
+        capture();
+    }
+}
+
 // Retry approach taken from pa_linux_alsa.c, part of PortAudio
 bool AlsaLayer::openDevice(snd_pcm_t **pcm, const std::string &dev, snd_pcm_stream_t stream, AudioFormat& format)
 {
diff --git a/src/media/audio/alsa/alsalayer.h b/src/media/audio/alsa/alsalayer.h
index 902c777..aeb95ed 100644
--- a/src/media/audio/alsa/alsalayer.h
+++ b/src/media/audio/alsa/alsalayer.h
@@ -142,8 +142,11 @@
             return indexRing_;
         }
 
+        void run();
+
     private:
-        friend class AlsaThread;
+
+        void initAudioLayer();
         /**
          * Returns a map of audio device hardware description and index
          */
@@ -231,9 +234,6 @@
          */
         std::string audioPlugin_;
 
-        /** Vector to manage all soundcard index - description association of the system */
-        // std::vector<HwIDPair> IDSoundCards_;
-
         /** Non-interleaved audio buffers */
         AudioBuffer playbackBuff_;
         AudioBuffer captureBuff_;