AlarmNotifications
PANDA Slow Control Alarm Daemon
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
beedo.cpp
Go to the documentation of this file.
1 
34 #include "beedo.h"
35 
36 #include <iostream>
37 #include <stdexcept>
38 #include <unistd.h>
39 #include <QFile>
40 #include <QIcon>
41 #include <QLayout>
42 #include <QTimer>
43 #include <QUrl>
44 #include <AudioOutput>
45 #include <MediaObject>
46 #include <MediaSource>
47 #include <VideoWidget>
48 
49 #include "exceptionhandler.h"
50 
51 using namespace AlarmNotifications;
52 
54 {
55  //std::cout << "Beedo instance requested!" << std::endl;
56  static Beedo global_instance;
57  return global_instance;
58 }
59 
61  : QObject ( nullptr ),
62  _go ( false ),
63  _display ( nullptr ),
64  _audio ( nullptr ),
65  _media ( nullptr ),
66  _video ( nullptr )
67 {
68 #ifndef BEEDOOLDQTFALLBACK
70 #else
71  QFile videoresource ( QString::fromUtf8 ( ":/beedo.ogv" ) );
72  videoresource.open ( QIODevice::ReadOnly );
73  _videobuffer.open ( QIODevice::ReadWrite );
74  _videobuffer.write ( videoresource.readAll() );
75  _videobuffer.seek ( 0 );
76 #endif
77 
78  connect ( this, SIGNAL ( signalPlay() ), this, SLOT ( playAlarmVideo() ) );
79  connect ( this, SIGNAL ( signalStop() ), this, SLOT ( stopAlarmVideo() ) );
80 }
81 
83 {
84  destroy();
85  // Just to be sure. If destroy() was called before, nothing will happen.
86 }
87 
89 {
90  _display = new QWidget (
91  nullptr,
92  Qt::Widget |
93  Qt::X11BypassWindowManagerHint |
94  Qt::CustomizeWindowHint |
95  Qt::WindowStaysOnTopHint
96  );
97  _media = new Phonon::MediaObject ( nullptr );
98  _audio = new Phonon::AudioOutput ( Phonon::NotificationCategory, nullptr );
99  _video = new Phonon::VideoWidget ( _display );
100  _mediaToAudio = Phonon::createPath ( _media, _audio );
101  _mediaToVideo = Phonon::createPath ( _media, _video );
102  const QSize widgetsize ( 256, 256 );
103  const QRect widgetrect ( QPoint ( 0,0 ),widgetsize );
104  _display->setGeometry ( widgetrect );
105  _display->setMinimumSize ( widgetsize );
106  _display->setMinimumSize ( widgetsize );
107  _video->setGeometry ( widgetrect );
108  _video->setMinimumSize ( widgetsize );
109  _video->setMaximumSize ( widgetsize );
110  _display->setWindowIcon ( QIcon::fromTheme ( QString::fromUtf8 ( "dialog-warning" ) ) );
111  connect ( _media, SIGNAL ( stateChanged ( Phonon::State,Phonon::State ) ), this, SLOT ( phononStateChange ( Phonon::State,Phonon::State ) ) );
112 }
113 
115 {
116  if ( _media == nullptr || _audio == nullptr || _video == nullptr || _display == nullptr )
117  return;
118  _media->stop();
119  _media->clearQueue();
120  _media->clear();
121  _mediaToAudio.disconnect();
122  _mediaToVideo.disconnect();
123  _video->hide();
124  delete _display;
125  _display = nullptr;
126  delete _audio;
127  _audio = nullptr;
128  delete _media;
129  _media = nullptr;
130 }
131 
133 {
134  _go = false;
136 }
137 
139 {
140  try
141  {
142  if ( _go )
143  return; // Beedo already running
144  _go = true;
145  emit signalPlay();
146  }
147  catch ( std::exception& e )
148  {
149  ExceptionHandler ( e, "Beedo::start_internal()" );
150  }
151  catch ( ... )
152  {
153  ExceptionHandler ( "Beedo::start_internal()" );
154  }
155 }
156 
158 {
159  try
160  {
161  if ( !_go )
162  return; // Beedo already stopped
163  _go = false;
164  emit signalStop();
165  }
166  catch ( std::exception& e )
167  {
168  ExceptionHandler ( e, "Beedo::stop_internal()" );
169  }
170  catch ( ... )
171  {
172  ExceptionHandler ( "Beedo::stop_internal()" );
173  }
174 }
175 
177 {
178 #ifdef BEEDOOLDQTFALLBACK
181 #endif
182  //_media->setCurrentSource ( QUrl::fromLocalFile ( QString::fromUtf8 ( "/home/tobias/Dokumente/Studium/EP1/slowcontrol/AlarmWatcher/beedo.ogv" ) ) );
183 #ifndef BEEDOOLDQTFALLBACK
184  _media->setCurrentSource ( QUrl ( QString::fromUtf8 ( "qrc:/beedo.ogv" ) ) );
185 #else
186  _videobuffer.seek ( 0 );
187  _media->setCurrentSource ( &_videobuffer );
188 #endif
189 #ifndef BEEDOOLDQTFALLBACK
190  while ( _media->state() == Phonon::LoadingState )
191  usleep ( 10*1000 ); // Sleep for 10 ms
192  usleep ( 500*1000 ); // Phonon apparently needs some more time, else the call to play() will be lost
193 #else
194  //Strange bug in old versions of the library - or in the SL6 binaries
195  usleep ( 750*1000 );
196 #endif
197  if ( !_media->isValid() )
198  std::cout << "Cannot play \"Beedo\" video resource!" << std::endl;
199  _display->show();
200  _media->play();
201 }
202 
204 {
205  _media->stop();
206 }
207 
208 void Beedo::phononStateChange ( const Phonon::State newState, const Phonon::State oldState )
209 {
210  if ( newState == Phonon::PlayingState && oldState != Phonon::PlayingState )
211  _display->show();
212  if ( newState != Phonon::PlayingState && oldState == Phonon::PlayingState && !_go )
213  _display->hide();
214  if ( newState != Phonon::PlayingState && oldState == Phonon::PlayingState && _go )
215  QTimer::singleShot ( 0, this, SLOT ( playAlarmVideo() ) ); // Do an infinite loop until someone invokes stop()
216 }
217 
218 #include "beedo.moc"
void destroy()
Destroy all media objects.
Definition: beedo.cpp:132
Beedo()
Constructor.
Definition: beedo.cpp:60
void playAlarmVideo()
Instruct phonon to start playing.
Definition: beedo.cpp:176
#define nullptr
Allow using the nullptr keyword with GCC < 4.6.
Definition: oldgcccompat.h:56
void phononStateChange(const Phonon::State newState, const Phonon::State oldState)
React on a Phonon state change.
Definition: beedo.cpp:208
void signalStop()
Signal GUI to stop playing.
QWidget * _display
Video window.
Definition: beedo.h:86
void start_internal() noexcept
Internal routine to start video/audio playback.
Definition: beedo.cpp:138
bool _go
Video/audio play flag.
Definition: beedo.h:80
static Beedo & instance()
Get singleton instance.
Definition: beedo.cpp:53
void createMediaObjects()
Create the Qt objects to play a media file.
Definition: beedo.cpp:88
void stop_internal() noexcept
Internal routine to stop video/audio playback.
Definition: beedo.cpp:157
Phonon::AudioOutput * _audio
Phonon audio output encapsulation.
Definition: beedo.h:92
Provide an opto-acoustic alarm notification on a control room PC.
void destroyMediaObjects()
Delete the Qt and Phonon objects.
Definition: beedo.cpp:114
Namespace for Alarm Notifications application.
#define noexcept
Allow using the noexcept keyword with GCC < 4.6.
Definition: oldgcccompat.h:52
Phonon::VideoWidget * _video
Phonon video output encapsulation.
Definition: beedo.h:104
void ExceptionHandler(std::exception &e, std::string location, const bool quit=false) noexcept
Generic exception handler for known exceptions.
void signalPlay()
Signal GUI to start playing.
Phonon::MediaObject * _media
Phonon media file encapsulation.
Definition: beedo.h:98
Generic functions for exception handling.
virtual ~Beedo()
Destructor.
Definition: beedo.cpp:82
Opto-acoustic alarm engine.
Definition: beedo.h:71
Phonon::Path _mediaToVideo
Connection between _media and _video.
Definition: beedo.h:116
Phonon::Path _mediaToAudio
Connection between _media and _audio.
Definition: beedo.h:110
void stopAlarmVideo()
Instruct Phonon to stop playing.
Definition: beedo.cpp:203