1 /****************************************************************************
2 **
3 ** Copyright (C) 2017 The Qt Company Ltd.
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of the examples of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:BSD$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see https://www.qt.io/terms-conditions. For further
15 ** information use the contact form at https://www.qt.io/contact-us.
16 **
17 ** BSD License Usage
18 ** Alternatively, you may use this file under the terms of the BSD license
19 ** as follows:
20 **
21 ** "Redistribution and use in source and binary forms, with or without
22 ** modification, are permitted provided that the following conditions are
23 ** met:
24 **   * Redistributions of source code must retain the above copyright
25 **     notice, this list of conditions and the following disclaimer.
26 **   * Redistributions in binary form must reproduce the above copyright
27 **     notice, this list of conditions and the following disclaimer in
28 **     the documentation and/or other materials provided with the
29 **     distribution.
30 **   * Neither the name of The Qt Company Ltd nor the names of its
31 **     contributors may be used to endorse or promote products derived
32 **     from this software without specific prior written permission.
33 **
34 **
35 ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
36 ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
37 ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
38 ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
39 ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
40 ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
41 ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
42 ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
43 ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
44 ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
45 ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
46 **
47 ** $QT_END_LICENSE$
48 **
49 ****************************************************************************/
50 
51 #ifndef PLAYER_H
52 #define PLAYER_H
53 
54 #include <QWidget>
55 #include <QMediaPlayer>
56 #include <QMediaPlaylist>
57 
58 QT_BEGIN_NAMESPACE
59 class QAbstractItemView;
60 class QLabel;
61 class QMediaPlayer;
62 class QModelIndex;
63 class QPushButton;
64 class QSlider;
65 class QStatusBar;
66 class QVideoProbe;
67 class QVideoWidget;
68 class QAudioProbe;
69 QT_END_NAMESPACE
70 
71 class PlaylistModel;
72 class HistogramWidget;
73 
74 class Player : public QWidget
75 {
76     Q_OBJECT
77 
78 public:
79     explicit Player(QWidget *parent = nullptr);
80     ~Player();
81 
82     bool isPlayerAvailable() const;
83 
84     void addToPlaylist(const QList<QUrl> &urls);
85     void setCustomAudioRole(const QString &role);
86 
87 signals:
88     void fullScreenChanged(bool fullScreen);
89 
90 private slots:
91     void open();
92     void durationChanged(qint64 duration);
93     void positionChanged(qint64 progress);
94     void metaDataChanged();
95 
96     void previousClicked();
97 
98     void seek(int seconds);
99     void jump(const QModelIndex &index);
100     void playlistPositionChanged(int);
101 
102     void statusChanged(QMediaPlayer::MediaStatus status);
103     void stateChanged(QMediaPlayer::State state);
104     void bufferingProgress(int progress);
105     void videoAvailableChanged(bool available);
106 
107     void displayErrorMessage();
108 
109     void showColorDialog();
110 
111 private:
112     void clearHistogram();
113     void setTrackInfo(const QString &info);
114     void setStatusInfo(const QString &info);
115     void handleCursor(QMediaPlayer::MediaStatus status);
116     void updateDurationInfo(qint64 currentInfo);
117 
118     QMediaPlayer *m_player = nullptr;
119     QMediaPlaylist *m_playlist = nullptr;
120     QVideoWidget *m_videoWidget = nullptr;
121     QLabel *m_coverLabel = nullptr;
122     QSlider *m_slider = nullptr;
123     QLabel *m_labelDuration = nullptr;
124     QPushButton *m_fullScreenButton = nullptr;
125     QPushButton *m_colorButton = nullptr;
126     QDialog *m_colorDialog = nullptr;
127     QLabel *m_statusLabel = nullptr;
128     QStatusBar *m_statusBar = nullptr;
129 
130     QLabel *m_labelHistogram = nullptr;
131     HistogramWidget *m_videoHistogram = nullptr;
132     HistogramWidget *m_audioHistogram = nullptr;
133     QVideoProbe *m_videoProbe = nullptr;
134     QAudioProbe *m_audioProbe = nullptr;
135 
136     PlaylistModel *m_playlistModel = nullptr;
137     QAbstractItemView *m_playlistView = nullptr;
138     QString m_trackInfo;
139     QString m_statusInfo;
140     qint64 m_duration;
141 };
142 
143 #endif // PLAYER_H
144