235 |
237 |
236 m_updateProperties &= PlaybackRateProperty; |
238 m_updateProperties &= PlaybackRateProperty; |
237 |
239 |
238 m_service->load(media, stream); |
240 m_service->load(media, stream); |
239 |
241 |
240 emit audioAvailableChanged(m_streamTypes & DirectShowPlayerService::AudioStream); |
242 emitPropertyChanges(); |
241 emit videoAvailableChanged(m_streamTypes & DirectShowPlayerService::VideoStream); |
|
242 emit durationChanged(m_duration); |
|
243 emit seekableChanged(m_seekable); |
|
244 emit mediaStatusChanged(m_status); |
|
245 emit stateChanged(m_state); |
|
246 } |
243 } |
247 |
244 |
248 void DirectShowPlayerControl::play() |
245 void DirectShowPlayerControl::play() |
249 { |
246 { |
250 m_service->play(); |
247 m_service->play(); |
264 } |
261 } |
265 |
262 |
266 void DirectShowPlayerControl::customEvent(QEvent *event) |
263 void DirectShowPlayerControl::customEvent(QEvent *event) |
267 { |
264 { |
268 if (event->type() == QEvent::Type(PropertiesChanged)) { |
265 if (event->type() == QEvent::Type(PropertiesChanged)) { |
269 int properties = m_updateProperties; |
266 emitPropertyChanges(); |
270 m_updateProperties = 0; |
|
271 |
|
272 if (properties & PlaybackRateProperty) |
|
273 emit playbackRateChanged(m_playbackRate); |
|
274 |
|
275 if (properties & StreamTypesProperty) { |
|
276 emit audioAvailableChanged(m_streamTypes & DirectShowPlayerService::AudioStream); |
|
277 emit videoAvailableChanged(m_streamTypes & DirectShowPlayerService::VideoStream); |
|
278 } |
|
279 |
|
280 if (properties & DurationProperty) |
|
281 emit durationChanged(m_duration); |
|
282 |
|
283 if (properties & SeekableProperty) |
|
284 emit seekableChanged(m_seekable); |
|
285 |
|
286 if (properties & StatusProperty) |
|
287 emit mediaStatusChanged(m_status); |
|
288 |
|
289 if (properties & StateProperty) |
|
290 emit stateChanged(m_state); |
|
291 |
267 |
292 event->accept(); |
268 event->accept(); |
293 } else { |
269 } else { |
294 QMediaPlayerControl::customEvent(event); |
270 QMediaPlayerControl::customEvent(event); |
295 } |
271 } |
296 } |
272 } |
297 |
273 |
|
274 void DirectShowPlayerControl::emitPropertyChanges() |
|
275 { |
|
276 int properties = m_updateProperties; |
|
277 m_updateProperties = 0; |
|
278 |
|
279 if ((properties & ErrorProperty) && m_error != QMediaPlayer::NoError) |
|
280 emit error(m_error, m_errorString); |
|
281 |
|
282 if (properties & PlaybackRateProperty) |
|
283 emit playbackRateChanged(m_playbackRate); |
|
284 |
|
285 if (properties & StreamTypesProperty) { |
|
286 emit audioAvailableChanged(m_streamTypes & DirectShowPlayerService::AudioStream); |
|
287 emit videoAvailableChanged(m_streamTypes & DirectShowPlayerService::VideoStream); |
|
288 } |
|
289 |
|
290 if (properties & PositionProperty) |
|
291 emit positionChanged(m_position); |
|
292 |
|
293 if (properties & DurationProperty) |
|
294 emit durationChanged(m_duration); |
|
295 |
|
296 if (properties & SeekableProperty) |
|
297 emit seekableChanged(m_seekable); |
|
298 |
|
299 if (properties & StatusProperty) |
|
300 emit mediaStatusChanged(m_status); |
|
301 |
|
302 if (properties & StateProperty) |
|
303 emit stateChanged(m_state); |
|
304 } |
|
305 |
298 void DirectShowPlayerControl::scheduleUpdate(int properties) |
306 void DirectShowPlayerControl::scheduleUpdate(int properties) |
299 { |
307 { |
300 if (m_updateProperties == 0) |
308 if (m_updateProperties == 0) |
301 QCoreApplication::postEvent(this, new QEvent(QEvent::Type(PropertiesChanged))); |
309 QCoreApplication::postEvent(this, new QEvent(QEvent::Type(PropertiesChanged))); |
302 |
310 |
358 void DirectShowPlayerControl::updateAudioOutput(IBaseFilter *filter) |
366 void DirectShowPlayerControl::updateAudioOutput(IBaseFilter *filter) |
359 { |
367 { |
360 if (m_audio) |
368 if (m_audio) |
361 m_audio->Release(); |
369 m_audio->Release(); |
362 |
370 |
363 m_audio = com_cast<IBasicAudio>(filter); |
371 m_audio = com_cast<IBasicAudio>(filter, IID_IBasicAudio); |
364 } |
372 } |
|
373 |
|
374 void DirectShowPlayerControl::updateError(QMediaPlayer::Error error, const QString &errorString) |
|
375 { |
|
376 m_error = error; |
|
377 m_errorString = errorString; |
|
378 |
|
379 if (m_error != QMediaPlayer::NoError) |
|
380 scheduleUpdate(ErrorProperty); |
|
381 } |
|
382 |
|
383 void DirectShowPlayerControl::updatePosition(qint64 position) |
|
384 { |
|
385 if (m_position != position) { |
|
386 m_position = position; |
|
387 |
|
388 scheduleUpdate(PositionProperty); |
|
389 } |
|
390 } |