TizenRefApp-7591 Implement play, pause audio functionality 04/96304/3
authorNataliia Kamyshna <n.kamyshna@samsung.com>
Tue, 8 Nov 2016 11:20:25 +0000 (13:20 +0200)
committerAleksandr Sapozhnik <a.sapozhnik@samsung.com>
Tue, 8 Nov 2016 16:18:03 +0000 (08:18 -0800)
Change-Id: I0842c35536b3f2bbba81d5094224db666f69047e
Signed-off-by: Nataliia Kamyshna <n.kamyshna@samsung.com>
memo-app/inc/Input/RecordField.h
memo-app/res/input/edje/InputPath.h
memo-app/res/input/edje/RecordFieldLayout.h
memo-app/res/input/edje/record-field-layout.edc
memo-app/res/input/images/btn_play.png [new file with mode: 0644]
memo-app/src/Input/RecordField.cpp

index ae6b8fb6c5ca5f1bfabc22f832e205deca31225c..30e0b95ba408a2dbf5debe307ac50e5e5262997a 100644 (file)
@@ -23,6 +23,7 @@
 
 namespace Common
 {
+       class Player;
        class Recorder;
 }
 
@@ -70,25 +71,36 @@ namespace Input
 
        private:
                virtual Evas_Object *onCreate(Evas_Object *parent) override;
+               virtual void onCreated() override;
+
+               void setMode(Mode mode);
+               void createRecorderView();
+               void createPlayerView();
+
                Evas_Object *createStopBtn(Evas_Object *parent);
                Evas_Object *createRecordBtn(Evas_Object *parent);
+               Evas_Object *createPlayBtn(Evas_Object *parent);
 
                void onRecording(unsigned long long elapsedTime, unsigned long long fileSize);
                void onStopPressed();
                void onRecordPressed();
-               void onPausePressed();
+               void onRecordPausePressed();
+
+               void onPlayCompleted();
+               void onPlayPressed();
+               void onPlayPausePressed();
+
                void onClosePressed();
                void onDelete();
                void showDiscardPopup();
                void showDeletePopup();
-
-               void setMode(Mode mode);
+               std::string formatTime(int time);
 
                std::string m_Path;
                Mode m_Mode;
-               Evas_Object *m_StopBtn;
-               Evas_Object *m_RecordBtn;
+               Evas_Object *m_PlayBtn;
                Common::Recorder *m_Recorder;
+               Common::Player *m_Player;
                DeleteCallback m_OnDelete;
        };
 }
index 43786f656bb335a0fc2524bb60183653facc6918..e59c70adee1989dfdfd7c0933b8db8b4055877e5 100644 (file)
 #define RECORD_BTN_ICON_REC        INPUT_IMG_DIR"icon_btn_rec.png"
 #define RECORD_BTN_ICON_STOP       INPUT_IMG_DIR"btn_stop.png"
 #define RECORD_BTN_ICON_PAUSE      INPUT_IMG_DIR"btn_paused.png"
+#define RECORD_BTN_ICON_PLAY       INPUT_IMG_DIR"btn_play.png"
+#define RECORD_BTN_CLOSE           INPUT_IMG_DIR"btn_voicememo_cancel.png"
+
 #define RECORD_ICON_REC            INPUT_IMG_DIR"icon_rec.png"
 #define RECORD_ICON_PAUSE          INPUT_IMG_DIR"icon_pause.png"
-#define RECORD_BTN_CLOSE           INPUT_IMG_DIR"btn_voicememo_cancel.png"
 
 #endif /* INPUT_PATH_H */
index a297e42d10b082c470f15407bf4eae761a4c175a..883db10b7f76ec83d7e5ad245d338c90352c53ed 100644 (file)
@@ -22,6 +22,7 @@
 #define GROUP_RECORD_FIELD      "record_field"
 #define GROUP_BTN_STOP          "btn_stop"
 #define GROUP_BTN_RECORD        "btn_record"
+#define GROUP_BTN_PLAY          "btn_play"
 
 #define PART_BTN_STOP           "swallow.btn_stop"
 #define PART_BTN_REC_PLAY       "swallow.btn_rec_play"
 #define SIGNAL_BTN_STOP_HIDE    "btn_stop,state,hide"
 #define SIGNAL_BTN_STOP_SHOW    "btn_stop,state,show"
 
-#define SIGNAL_BTN_RECORD       "btn,state,record"
+#define SIGNAL_BTN_RESUME       "btn,state,resume"
 #define SIGNAL_BTN_PAUSE        "btn,state,pause"
-#define BTN_RECORD_CLICKED      "btn,state,rec_clicked"
+#define BTN_RESUME_CLICKED      "btn,state,resume_clicked"
 #define BTN_PAUSE_CLICKED       "btn,state,pause_clicked"
 
 #define SIGNAL_ICON_HIDE        "icon,state,hide"
 #define SIGNAL_ICON_REC         "icon,state,rec"
 #define SIGNAL_ICON_PAUSE       "icon,state,pause"
 
+#define SIGNAL_RECORD_TIME_SHOW "record_time,state,show"
+#define SIGNAL_RECORD_TIME_HIDE "record_time,state,hide"
+
 #endif /* RECORD_FIELD_LAYOUT_H */
index b9974ad9512a02ab3112649a2b8db47c61e98501..f1f093bb9c871cb3b617d3b5a41b9fb172a51042 100644 (file)
@@ -157,6 +157,10 @@ collections {
                                        rel2 { relative: 0.5 1.0; to_x: "spacer.record_time.middle"; }
                                        text.style: "record_time";
                                }
+                               desc { "hidden";
+                                       inherit: "default";
+                                       visible: 0;
+                               }
                        }
                        image { PART_CLOSE_BTN; scale;
                                desc { "default";
@@ -236,6 +240,18 @@ collections {
                                action: STATE_SET "pause" 0.0;
                                target: "icon";
                        }
+                       program {
+                               signal: SIGNAL_RECORD_TIME_SHOW;
+                               source: "*";
+                               action: STATE_SET "default" 0.0;
+                               target: PART_RECORD_TIME;
+                       }
+                       program {
+                               signal: SIGNAL_RECORD_TIME_HIDE;
+                               source: "*";
+                               action: STATE_SET "hidden" 0.0;
+                               target: PART_RECORD_TIME;
+                       }
                }
        }
 
@@ -302,7 +318,7 @@ collections {
                programs {
                        program {
                                name: "record";
-                               signal: SIGNAL_BTN_RECORD;
+                               signal: SIGNAL_BTN_RESUME;
                                source: "*";
                                script {
                                        set_int(is_paused, 0);
@@ -327,11 +343,25 @@ collections {
                                                emit(BTN_PAUSE_CLICKED, "");
                                                run_program(PROGRAM:"record");
                                        } else  {
-                                               emit(BTN_RECORD_CLICKED, "");
+                                               emit(BTN_RESUME_CLICKED, "");
                                                run_program(PROGRAM:"pause");
                                        }
                                }
                        }
                }
        }
+
+       group { GROUP_BTN_PLAY;
+               inherit: GROUP_BTN_RECORD;
+               images.image: RECORD_BTN_ICON_PLAY COMP;
+
+               parts {
+                       image { "image"; scale;
+                               desc { "default";
+                                       image.normal: RECORD_BTN_ICON_PLAY;
+                                       color: 250 250 250 255;
+                               }
+                       }
+               }
+       }
 }
diff --git a/memo-app/res/input/images/btn_play.png b/memo-app/res/input/images/btn_play.png
new file mode 100644 (file)
index 0000000..ca5b538
Binary files /dev/null and b/memo-app/res/input/images/btn_play.png differ
index 701ac179350b62b579e60933f3d6d43907f19c9a..a5ed4b3fa70dd44cb7cde4a62983b00a9a944137 100644 (file)
@@ -21,6 +21,7 @@
 #include "Utils/Callback.h"
 #include "Utils/Logger.h"
 
+#include "Common/Player.h"
 #include "Common/Recorder.h"
 
 #include "RecordFieldLayout.h"
@@ -42,11 +43,11 @@ namespace
 
 RecordField::RecordField(std::string path, Mode mode)
        : m_Path(path)
-       , m_StopBtn(nullptr)
-       , m_RecordBtn(nullptr)
+       , m_Mode(mode)
+       , m_PlayBtn(nullptr)
        , m_Recorder(nullptr)
+       , m_Player(nullptr)
 {
-       setMode(mode);
 }
 
 RecordField::~RecordField()
@@ -55,6 +56,7 @@ RecordField::~RecordField()
                m_Recorder->save();
                delete m_Recorder;
        }
+       delete m_Player;
 }
 
 void RecordField::setDeleteCallback(DeleteCallback callback)
@@ -75,43 +77,90 @@ Evas_Object *RecordField::onCreate(Evas_Object *parent)
 {
        Evas_Object *layout = elm_layout_add(parent);
        elm_layout_file_set(layout, layoutFilePath.c_str(), GROUP_RECORD_FIELD);
-
-       elm_layout_content_set(layout, PART_BTN_STOP, createStopBtn(layout));
-       elm_layout_content_set(layout, PART_BTN_REC_PLAY, createRecordBtn(layout));
-       elm_layout_text_set(layout, PART_RECORD_TIME, DEFAULT_TIME);
        elm_layout_signal_callback_add(layout, "mouse,clicked,*", PART_CLOSE_BTN,
                        (Edje_Signal_Cb) makeCallback(&RecordField::onClosePressed), this);
 
        return layout;
 }
 
-void RecordField::onRecording(unsigned long long elapsedTime, unsigned long long fileSize)
+void RecordField::onCreated()
 {
-       char str[MAX_TEXT_LEN];
-       snprintf(str, MAX_TEXT_LEN, "%02d:%02d", (int)((elapsedTime/1000)/60), (int)((elapsedTime/1000)%60));
-       elm_layout_text_set(getEvasObject(), PART_RECORD_TIME, str);
+       setMode(m_Mode);
+}
+
+void RecordField::setMode(Mode mode)
+{
+       m_Mode = mode;
+
+       switch (m_Mode) {
+               case ModeRecorder:
+                       m_Recorder = new Recorder(m_Path.c_str());
+                       m_Recorder->setRecordingCallback(std::bind(&RecordField::onRecording, this, _1, _2));
+                       createRecorderView();
+                       break;
+               case ModePlayer:
+                       if (m_Recorder) {
+                               delete m_Recorder;
+                               m_Recorder = nullptr;
+                       }
+                       m_Player = new Player(m_Path.c_str());
+                       m_Player->setCompleteCallback(std::bind(&RecordField::onPlayCompleted, this));
+                       createPlayerView();
+                       break;
+       }
+}
+
+void RecordField::createRecorderView()
+{
+       elm_layout_content_set(getEvasObject(), PART_BTN_STOP, createStopBtn(getEvasObject()));
+       elm_layout_content_set(getEvasObject(), PART_BTN_REC_PLAY, createRecordBtn(getEvasObject()));
+       elm_layout_text_set(getEvasObject(), PART_RECORD_TIME, DEFAULT_TIME);
+}
+
+void RecordField::createPlayerView()
+{
+       elm_layout_content_set(getEvasObject(), PART_BTN_STOP, nullptr);
+       elm_layout_content_set(getEvasObject(), PART_BTN_REC_PLAY, createPlayBtn(getEvasObject()));
+       elm_layout_text_set(getEvasObject(), PART_RECORD_TIME, formatTime(m_Player->getDuration()).c_str());
 }
 
 Evas_Object *RecordField::createStopBtn(Evas_Object *parent)
 {
-       m_StopBtn = elm_layout_add(parent);
-       elm_layout_file_set(m_StopBtn, layoutFilePath.c_str(), GROUP_BTN_STOP);
-       elm_layout_signal_callback_add(m_StopBtn, "mouse,clicked,*", "*",
+       Evas_Object *stopBtn = elm_layout_add(parent);
+       elm_layout_file_set(stopBtn, layoutFilePath.c_str(), GROUP_BTN_STOP);
+       elm_layout_signal_callback_add(stopBtn, "mouse,clicked,*", "*",
                        (Edje_Signal_Cb) makeCallback(&RecordField::onStopPressed), this);
 
-       return m_StopBtn;
+       return stopBtn;
 }
 
 Evas_Object *RecordField::createRecordBtn(Evas_Object *parent)
 {
-       m_RecordBtn = elm_layout_add(parent);
-       elm_layout_file_set(m_RecordBtn, layoutFilePath.c_str(), GROUP_BTN_RECORD);
-       elm_layout_signal_callback_add(m_RecordBtn, BTN_RECORD_CLICKED, "*",
+       Evas_Object *recordBtn = elm_layout_add(parent);
+       elm_layout_file_set(recordBtn, layoutFilePath.c_str(), GROUP_BTN_RECORD);
+       elm_layout_signal_callback_add(recordBtn, BTN_RESUME_CLICKED, "*",
                        (Edje_Signal_Cb) makeCallback(&RecordField::onRecordPressed), this);
-       elm_layout_signal_callback_add(m_RecordBtn, BTN_PAUSE_CLICKED, "*",
-                       (Edje_Signal_Cb) makeCallback(&RecordField::onPausePressed), this);
+       elm_layout_signal_callback_add(recordBtn, BTN_PAUSE_CLICKED, "*",
+                       (Edje_Signal_Cb) makeCallback(&RecordField::onRecordPausePressed), this);
+
+       return recordBtn;
+}
+
+Evas_Object *RecordField::createPlayBtn(Evas_Object *parent)
+{
+       m_PlayBtn = elm_layout_add(parent);
+       elm_layout_file_set(m_PlayBtn, layoutFilePath.c_str(), GROUP_BTN_PLAY);
+       elm_layout_signal_callback_add(m_PlayBtn, BTN_RESUME_CLICKED, "*",
+                       (Edje_Signal_Cb) makeCallback(&RecordField::onPlayPressed), this);
+       elm_layout_signal_callback_add(m_PlayBtn, BTN_PAUSE_CLICKED, "*",
+                       (Edje_Signal_Cb) makeCallback(&RecordField::onPlayPausePressed), this);
 
-       return m_RecordBtn;
+       return m_PlayBtn;
+}
+
+void RecordField::onRecording(unsigned long long elapsedTime, unsigned long long fileSize)
+{
+       elm_layout_text_set(getEvasObject(), PART_RECORD_TIME, formatTime(elapsedTime).c_str());
 }
 
 void RecordField::onStopPressed()
@@ -119,6 +168,7 @@ void RecordField::onStopPressed()
        m_Recorder->save();
        elm_object_signal_emit(getEvasObject(), SIGNAL_BTN_STOP_HIDE, "*");
        elm_object_signal_emit(getEvasObject(), SIGNAL_ICON_HIDE, "*");
+       setMode(ModePlayer);
 }
 
 void RecordField::onRecordPressed()
@@ -128,12 +178,30 @@ void RecordField::onRecordPressed()
        elm_object_signal_emit(getEvasObject(), SIGNAL_BTN_STOP_SHOW, "*");
 }
 
-void RecordField::onPausePressed()
+void RecordField::onRecordPausePressed()
 {
        m_Recorder->pause();
        elm_object_signal_emit(getEvasObject(), SIGNAL_ICON_PAUSE, "*");
 }
 
+void RecordField::onPlayCompleted()
+{
+       m_Player->stop();
+       elm_object_signal_emit(m_PlayBtn, SIGNAL_BTN_RESUME, "*");
+       elm_object_signal_emit(getEvasObject(), SIGNAL_RECORD_TIME_SHOW, "*");
+}
+
+void RecordField::onPlayPressed()
+{
+       m_Player->start();
+       elm_object_signal_emit(getEvasObject(), SIGNAL_RECORD_TIME_HIDE, "*");
+}
+
+void RecordField::onPlayPausePressed()
+{
+       m_Player->pause();
+}
+
 void RecordField::onClosePressed()
 {
        switch(m_Mode) {
@@ -193,20 +261,9 @@ void RecordField::showDeletePopup()
        popup->show();
 }
 
-void RecordField::setMode(Mode mode)
+std::string RecordField::formatTime(int time)
 {
-       m_Mode = mode;
-
-       if (m_Recorder) {
-               delete m_Recorder;
-               m_Recorder = nullptr;
-       }
-       switch (m_Mode) {
-               case ModeRecorder:
-                       m_Recorder = new Recorder(m_Path.c_str());
-                       m_Recorder->setRecordingCallback(std::bind(&RecordField::onRecording, this, _1, _2));
-                       break;
-               case ModePlayer:
-                       break;
-       }
+       char str[MAX_TEXT_LEN];
+       snprintf(str, MAX_TEXT_LEN, "%02d:%02d", (time/1000)/60, (time/1000)%60);
+       return str;
 }