Merge pull request #4594 from FernetMenta/paplayer
[xbmc.git] / xbmc / ApplicationPlayer.cpp
blob83aa8757c7e4bef865af724916f89fea4d8af160
1 /*
2 * Copyright (C) 2005-2013 Team XBMC
3 * http://xbmc.org
5 * This Program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2, or (at your option)
8 * any later version.
10 * This Program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with XBMC; see the file COPYING. If not, see
17 * <http://www.gnu.org/licenses/>.
21 #include "ApplicationPlayer.h"
22 #include "cores/IPlayer.h"
23 #include "Application.h"
25 #define VOLUME_MINIMUM 0.0f // -60dB
26 #define VOLUME_MAXIMUM 1.0f // 0dB
28 CApplicationPlayer::CApplicationPlayer()
30 m_iPlayerOPSeq = 0;
31 m_eCurrentPlayer = EPC_NONE;
34 boost::shared_ptr<IPlayer> CApplicationPlayer::GetInternal() const
36 CSingleLock lock(m_player_lock);
37 return m_pPlayer;
40 void CApplicationPlayer::ClosePlayer()
42 boost::shared_ptr<IPlayer> player = GetInternal();
43 if (player)
45 CloseFile();
46 // we need to do this directly on the member
47 CSingleLock lock(m_player_lock);
48 m_pPlayer.reset();
52 void CApplicationPlayer::CloseFile(bool reopen)
54 boost::shared_ptr<IPlayer> player = GetInternal();
55 if (player)
57 ++m_iPlayerOPSeq;
58 player->CloseFile(reopen);
62 void CApplicationPlayer::ClosePlayerGapless(PLAYERCOREID newCore)
64 boost::shared_ptr<IPlayer> player = GetInternal();
65 if (!player)
66 return;
68 bool gaplessSupported = (m_eCurrentPlayer == EPC_DVDPLAYER || m_eCurrentPlayer == EPC_PAPLAYER);
69 #if defined(HAS_OMXPLAYER)
70 gaplessSupported = gaplessSupported || (m_eCurrentPlayer == EPC_OMXPLAYER);
71 #endif
72 gaplessSupported = gaplessSupported && (m_eCurrentPlayer == newCore);
73 if (!gaplessSupported)
75 ClosePlayer();
77 else
79 // XXX: we had to stop the previous playing item, it was done in dvdplayer::OpenFile.
80 // but in paplayer::OpenFile, it sometimes just fade in without call CloseFile.
81 // but if we do not stop it, we can not distingush callbacks from previous
82 // item and current item, it will confused us then we can not make correct delay
83 // callback after the starting state.
84 CloseFile(true);
88 void CApplicationPlayer::CreatePlayer(PLAYERCOREID newCore, IPlayerCallback& callback)
90 CSingleLock lock(m_player_lock);
91 if (!m_pPlayer)
93 m_eCurrentPlayer = newCore;
94 m_pPlayer.reset(CPlayerCoreFactory::Get().CreatePlayer(newCore, callback));
98 PlayBackRet CApplicationPlayer::OpenFile(const CFileItem& item, const CPlayerOptions& options)
100 boost::shared_ptr<IPlayer> player = GetInternal();
101 PlayBackRet iResult = PLAYBACK_FAIL;
102 if (player)
104 // op seq for detect cancel (CloseFile be called or OpenFile be called again) during OpenFile.
105 unsigned int startingSeq = ++m_iPlayerOPSeq;
107 iResult = player->OpenFile(item, options) ? PLAYBACK_OK : PLAYBACK_FAIL;
108 // check whether the OpenFile was canceled by either CloseFile or another OpenFile.
109 if (m_iPlayerOPSeq != startingSeq)
110 iResult = PLAYBACK_CANCELED;
112 return iResult;
115 bool CApplicationPlayer::HasPlayer() const
117 boost::shared_ptr<IPlayer> player = GetInternal();
118 return player != NULL;
121 void CApplicationPlayer::RegisterAudioCallback(IAudioCallback* pCallback)
123 boost::shared_ptr<IPlayer> player = GetInternal();
124 if (player)
125 player->RegisterAudioCallback(pCallback);
128 void CApplicationPlayer::UnRegisterAudioCallback()
130 boost::shared_ptr<IPlayer> player = GetInternal();
131 if (player)
132 player->UnRegisterAudioCallback();
135 int CApplicationPlayer::GetChapter()
137 boost::shared_ptr<IPlayer> player = GetInternal();
138 if (player)
139 return player->GetChapter();
140 else
141 return -1;
144 int CApplicationPlayer::GetChapterCount()
146 boost::shared_ptr<IPlayer> player = GetInternal();
147 if (player)
148 return player->GetChapterCount();
149 else
150 return 0;
153 void CApplicationPlayer::GetChapterName(CStdString& strChapterName)
155 boost::shared_ptr<IPlayer> player = GetInternal();
156 if (player)
157 player->GetChapterName(strChapterName);
160 bool CApplicationPlayer::HasAudio() const
162 boost::shared_ptr<IPlayer> player = GetInternal();
163 return (player && player->HasAudio());
166 bool CApplicationPlayer::HasVideo() const
168 boost::shared_ptr<IPlayer> player = GetInternal();
169 return (player && player->HasVideo());
172 bool CApplicationPlayer::IsPaused() const
174 boost::shared_ptr<IPlayer> player = GetInternal();
175 return (player && player->IsPaused());
178 bool CApplicationPlayer::IsPlaying() const
180 boost::shared_ptr<IPlayer> player = GetInternal();
181 return (player && player->IsPlaying());
184 bool CApplicationPlayer::IsPausedPlayback() const
186 return (IsPlaying() && IsPaused());
189 bool CApplicationPlayer::IsPlayingAudio() const
191 return (IsPlaying() && !HasVideo() && HasAudio());
194 bool CApplicationPlayer::IsPlayingVideo() const
196 return (IsPlaying() && HasVideo());
199 void CApplicationPlayer::Pause()
201 boost::shared_ptr<IPlayer> player = GetInternal();
202 if (player)
203 player->Pause();
206 bool CApplicationPlayer::ControlsVolume() const
208 boost::shared_ptr<IPlayer> player = GetInternal();
209 return (player && player->ControlsVolume());
212 void CApplicationPlayer::SetMute(bool bOnOff)
214 boost::shared_ptr<IPlayer> player = GetInternal();
215 if (player)
216 player->SetMute(bOnOff);
219 void CApplicationPlayer::SetVolume(float volume)
221 boost::shared_ptr<IPlayer> player = GetInternal();
222 if (player)
223 player->SetVolume(volume);
226 void CApplicationPlayer::Seek(bool bPlus, bool bLargeStep, bool bChapterOverride)
228 boost::shared_ptr<IPlayer> player = GetInternal();
229 if (player)
230 player->Seek(bPlus, bLargeStep, bChapterOverride);
233 void CApplicationPlayer::SeekPercentage(float fPercent)
235 boost::shared_ptr<IPlayer> player = GetInternal();
236 if (player)
237 player->SeekPercentage(fPercent);
240 bool CApplicationPlayer::IsPassthrough() const
242 boost::shared_ptr<IPlayer> player = GetInternal();
243 return (player && player->IsPassthrough());
246 bool CApplicationPlayer::CanSeek()
248 boost::shared_ptr<IPlayer> player = GetInternal();
249 return (player && player->CanSeek());
252 bool CApplicationPlayer::SeekScene(bool bPlus)
254 boost::shared_ptr<IPlayer> player = GetInternal();
255 return (player && player->SeekScene(bPlus));
258 void CApplicationPlayer::SeekTime(int64_t iTime)
260 boost::shared_ptr<IPlayer> player = GetInternal();
261 if (player)
262 player->SeekTime(iTime);
265 CStdString CApplicationPlayer::GetPlayingTitle()
267 boost::shared_ptr<IPlayer> player = GetInternal();
268 if (player)
269 return player->GetPlayingTitle();
270 else
271 return "";
274 int64_t CApplicationPlayer::GetTime() const
276 boost::shared_ptr<IPlayer> player = GetInternal();
277 if (player)
278 return player->GetTime();
279 else
280 return 0;
283 bool CApplicationPlayer::IsCaching() const
285 boost::shared_ptr<IPlayer> player = GetInternal();
286 return (player && player->IsCaching());
289 bool CApplicationPlayer::IsInMenu() const
291 boost::shared_ptr<IPlayer> player = GetInternal();
292 return (player && player->IsInMenu());
295 bool CApplicationPlayer::HasMenu() const
297 boost::shared_ptr<IPlayer> player = GetInternal();
298 return (player && player->HasMenu());
301 int CApplicationPlayer::GetCacheLevel() const
303 boost::shared_ptr<IPlayer> player = GetInternal();
304 if (player)
305 return player->GetCacheLevel();
306 else
307 return 0;
310 int CApplicationPlayer::GetSubtitleCount()
312 boost::shared_ptr<IPlayer> player = GetInternal();
313 if (player)
314 return player->GetSubtitleCount();
315 else
316 return 0;
319 int CApplicationPlayer::GetAudioStream()
321 boost::shared_ptr<IPlayer> player = GetInternal();
322 if (player)
323 return player->GetAudioStream();
324 else
325 return 0;
328 int CApplicationPlayer::GetSubtitle()
330 boost::shared_ptr<IPlayer> player = GetInternal();
331 if (player)
332 return player->GetSubtitle();
333 else
334 return 0;
337 bool CApplicationPlayer::GetSubtitleVisible()
339 boost::shared_ptr<IPlayer> player = GetInternal();
340 return (player && player->GetSubtitleVisible());
343 bool CApplicationPlayer::CanRecord()
345 boost::shared_ptr<IPlayer> player = GetInternal();
346 return (player && player->CanRecord());
349 bool CApplicationPlayer::CanPause()
351 boost::shared_ptr<IPlayer> player = GetInternal();
352 return (player && player->CanPause());
355 bool CApplicationPlayer::IsRecording() const
357 boost::shared_ptr<IPlayer> player = GetInternal();
358 return (player && player->IsRecording());
361 TextCacheStruct_t* CApplicationPlayer::GetTeletextCache()
363 boost::shared_ptr<IPlayer> player = GetInternal();
364 if (player)
365 return player->GetTeletextCache();
366 else
367 return NULL;
370 int64_t CApplicationPlayer::GetTotalTime() const
372 boost::shared_ptr<IPlayer> player = GetInternal();
373 if (player)
374 return player->GetTotalTime();
375 else
376 return 0;
379 float CApplicationPlayer::GetPercentage() const
381 boost::shared_ptr<IPlayer> player = GetInternal();
382 if (player)
383 return player->GetPercentage();
384 else
385 return 0.0;
388 float CApplicationPlayer::GetCachePercentage() const
390 boost::shared_ptr<IPlayer> player = GetInternal();
391 if (player)
392 return player->GetCachePercentage();
393 else
394 return 0.0;
397 void CApplicationPlayer::ToFFRW(int iSpeed)
399 boost::shared_ptr<IPlayer> player = GetInternal();
400 if (player)
401 player->ToFFRW(iSpeed);
404 void CApplicationPlayer::DoAudioWork()
406 boost::shared_ptr<IPlayer> player = GetInternal();
407 if (player)
408 player->DoAudioWork();
411 CStdString CApplicationPlayer::GetPlayerState()
413 boost::shared_ptr<IPlayer> player = GetInternal();
414 if (player)
415 return player->GetPlayerState();
416 else
417 return "";
420 bool CApplicationPlayer::QueueNextFile(const CFileItem &file)
422 boost::shared_ptr<IPlayer> player = GetInternal();
423 return (player && player->QueueNextFile(file));
426 bool CApplicationPlayer::GetStreamDetails(CStreamDetails &details)
428 boost::shared_ptr<IPlayer> player = GetInternal();
429 return (player && player->GetStreamDetails(details));
432 bool CApplicationPlayer::SetPlayerState(CStdString state)
434 boost::shared_ptr<IPlayer> player = GetInternal();
435 return (player && player->SetPlayerState(state));
438 void CApplicationPlayer::OnNothingToQueueNotify()
440 boost::shared_ptr<IPlayer> player = GetInternal();
441 if (player)
442 player->OnNothingToQueueNotify();
445 void CApplicationPlayer::GetVideoStreamInfo(SPlayerVideoStreamInfo &info)
447 boost::shared_ptr<IPlayer> player = GetInternal();
448 if (player)
449 player->GetVideoStreamInfo(info);
452 void CApplicationPlayer::GetAudioStreamInfo(int index, SPlayerAudioStreamInfo &info)
454 boost::shared_ptr<IPlayer> player = GetInternal();
455 if (player)
456 player->GetAudioStreamInfo(index, info);
459 bool CApplicationPlayer::OnAction(const CAction &action)
461 boost::shared_ptr<IPlayer> player = GetInternal();
462 return (player && player->OnAction(action));
465 bool CApplicationPlayer::Record(bool bOnOff)
467 boost::shared_ptr<IPlayer> player = GetInternal();
468 return (player && player->Record(bOnOff));
471 int CApplicationPlayer::GetAudioStreamCount()
473 boost::shared_ptr<IPlayer> player = GetInternal();
474 if (player)
475 return player->GetAudioStreamCount();
476 else
477 return 0;
480 void CApplicationPlayer::SetAudioStream(int iStream)
482 boost::shared_ptr<IPlayer> player = GetInternal();
483 if (player)
484 player->SetAudioStream(iStream);
487 void CApplicationPlayer::GetSubtitleStreamInfo(int index, SPlayerSubtitleStreamInfo &info)
489 boost::shared_ptr<IPlayer> player = GetInternal();
490 if (player)
491 player->GetSubtitleStreamInfo(index, info);
494 void CApplicationPlayer::SetSubtitle(int iStream)
496 boost::shared_ptr<IPlayer> player = GetInternal();
497 if (player)
498 player->SetSubtitle(iStream);
501 void CApplicationPlayer::SetSubtitleVisible(bool bVisible)
503 boost::shared_ptr<IPlayer> player = GetInternal();
504 if (player)
505 player->SetSubtitleVisible(bVisible);
508 int CApplicationPlayer::AddSubtitle(const CStdString& strSubPath)
510 boost::shared_ptr<IPlayer> player = GetInternal();
511 if (player)
512 return player->AddSubtitle(strSubPath);
513 else
514 return 0;
517 void CApplicationPlayer::SetSubTitleDelay(float fValue)
519 boost::shared_ptr<IPlayer> player = GetInternal();
520 if (player)
521 player->SetSubTitleDelay(fValue);
524 void CApplicationPlayer::SetAVDelay(float fValue)
526 boost::shared_ptr<IPlayer> player = GetInternal();
527 if (player)
528 player->SetAVDelay(fValue);
531 void CApplicationPlayer::SetDynamicRangeCompression(long drc)
533 boost::shared_ptr<IPlayer> player = GetInternal();
534 if (player)
535 player->SetDynamicRangeCompression(drc);
538 bool CApplicationPlayer::SwitchChannel(const PVR::CPVRChannel &channel)
540 boost::shared_ptr<IPlayer> player = GetInternal();
541 return (player && player->SwitchChannel(channel));
544 void CApplicationPlayer::LoadPage(int p, int sp, unsigned char* buffer)
546 boost::shared_ptr<IPlayer> player = GetInternal();
547 if (player)
548 player->LoadPage(p, sp, buffer);
551 void CApplicationPlayer::GetAudioCapabilities(std::vector<int> &audioCaps)
553 boost::shared_ptr<IPlayer> player = GetInternal();
554 if (player)
555 player->GetAudioCapabilities(audioCaps);
558 void CApplicationPlayer::GetSubtitleCapabilities(std::vector<int> &subCaps)
560 boost::shared_ptr<IPlayer> player = GetInternal();
561 if (player)
562 player->GetSubtitleCapabilities(subCaps);
565 void CApplicationPlayer::GetAudioInfo( CStdString& strAudioInfo)
567 boost::shared_ptr<IPlayer> player = GetInternal();
568 if (player)
569 player->GetAudioInfo(strAudioInfo);
572 void CApplicationPlayer::GetVideoInfo( CStdString& strVideoInfo)
574 boost::shared_ptr<IPlayer> player = GetInternal();
575 if (player)
576 player->GetVideoInfo(strVideoInfo);
579 void CApplicationPlayer::GetGeneralInfo( CStdString& strVideoInfo)
581 boost::shared_ptr<IPlayer> player = GetInternal();
582 if (player)
583 player->GetGeneralInfo(strVideoInfo);
586 int CApplicationPlayer::SeekChapter(int iChapter)
588 boost::shared_ptr<IPlayer> player = GetInternal();
589 if (player)
590 return player->SeekChapter(iChapter);
591 else
592 return 0;
595 void CApplicationPlayer::GetRenderFeatures(std::vector<int> &renderFeatures)
597 boost::shared_ptr<IPlayer> player = GetInternal();
598 if (player)
599 player->GetRenderFeatures(renderFeatures);
602 void CApplicationPlayer::GetDeinterlaceMethods(std::vector<int> &deinterlaceMethods)
604 boost::shared_ptr<IPlayer> player = GetInternal();
605 if (player)
606 player->GetDeinterlaceMethods(deinterlaceMethods);
609 void CApplicationPlayer::GetDeinterlaceModes(std::vector<int> &deinterlaceModes)
611 boost::shared_ptr<IPlayer> player = GetInternal();
612 if (player)
613 player->GetDeinterlaceModes(deinterlaceModes);
616 void CApplicationPlayer::GetScalingMethods(std::vector<int> &scalingMethods)
618 boost::shared_ptr<IPlayer> player = GetInternal();
619 if (player)
620 player->GetScalingMethods(scalingMethods);
623 void CApplicationPlayer::SetPlaySpeed(int iSpeed, bool bApplicationMuted)
625 boost::shared_ptr<IPlayer> player = GetInternal();
626 if (!player)
627 return;
629 if (!IsPlayingAudio() && !IsPlayingVideo())
630 return ;
631 if (m_iPlaySpeed == iSpeed)
632 return ;
633 if (!CanSeek())
634 return;
635 if (IsPaused())
637 if (
638 ((m_iPlaySpeed > 1) && (iSpeed > m_iPlaySpeed)) ||
639 ((m_iPlaySpeed < -1) && (iSpeed < m_iPlaySpeed))
642 iSpeed = m_iPlaySpeed; // from pause to ff/rw, do previous ff/rw speed
644 Pause();
646 m_iPlaySpeed = iSpeed;
648 ToFFRW(m_iPlaySpeed);
650 // if player has volume control, set it.
651 if (ControlsVolume())
653 if (m_iPlaySpeed == 1)
654 { // restore volume
655 player->SetVolume(g_application.GetVolume(false));
657 else
658 { // mute volume
659 player->SetVolume(VOLUME_MINIMUM);
661 player->SetMute(bApplicationMuted);
665 int CApplicationPlayer::GetPlaySpeed() const
667 return m_iPlaySpeed;