00001 /* 00002 * Copyright (C) 2003-2009 Olivier Boudeville 00003 * 00004 * This file is part of the OSDL library. 00005 * 00006 * The OSDL library is free software: you can redistribute it and/or modify 00007 * it under the terms of either the GNU Lesser General Public License or 00008 * the GNU General Public License, as they are published by the Free Software 00009 * Foundation, either version 3 of these Licenses, or (at your option) 00010 * any later version. 00011 * 00012 * The OSDL library is distributed in the hope that it will be useful, 00013 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00015 * GNU Lesser General Public License and the GNU General Public License 00016 * for more details. 00017 * 00018 * You should have received a copy of the GNU Lesser General Public 00019 * License and of the GNU General Public License along with the OSDL library. 00020 * If not, see <http://www.gnu.org/licenses/>. 00021 * 00022 * Author: Olivier Boudeville (olivier.boudeville@esperide.com) 00023 * 00024 */ 00025 00026 00027 #include "OSDLMultimediaRenderer.h" 00028 00029 #include "OSDLVideoRenderer.h" // for VideoRenderer 00030 #include "OSDLAudioRenderer.h" // for AudioRenderer 00031 00032 00033 using namespace Ceylan::Log ; 00034 00035 using namespace OSDL::Events ; 00036 using namespace OSDL::Rendering ; 00037 using namespace OSDL::Engine ; 00038 00039 using std::string ; 00040 00041 00042 00043 #ifdef OSDL_DEBUG_RENDERER 00044 00045 #define OSDL_MULTIMEDIA_RENDER_LOG(message) send( message ) ; 00046 00047 #else // OSDL_DEBUG_RENDERER 00048 00049 #define OSDL_MULTIMEDIA_RENDER_LOG(message) 00050 00051 #endif // OSDL_DEBUG_RENDERER 00052 00053 00054 00055 00056 MultimediaRenderer::MultimediaRenderer( bool registerToScheduler ) : 00057 Renderer( registerToScheduler ), 00058 _videoRenderer( 0 ), 00059 _audioRenderer( 0 ) 00060 { 00061 00062 00063 } 00064 00065 00066 00067 MultimediaRenderer::~MultimediaRenderer() throw() 00068 { 00069 00070 // Views are not owned. 00071 00072 } 00073 00074 00075 00076 00077 bool MultimediaRenderer::hasVideoRenderer() const 00078 { 00079 00080 return ( _videoRenderer != 0 ) ; 00081 00082 } 00083 00084 00085 00086 VideoRenderer & MultimediaRenderer::getVideoRenderer() const 00087 { 00088 00089 if ( _videoRenderer == 0 ) 00090 throw RenderingException( "MultimediaRenderer::getVideoRenderer: " 00091 "no video renderer registered." ) ; 00092 00093 return * _videoRenderer ; 00094 00095 } 00096 00097 00098 00099 void MultimediaRenderer::setVideoRenderer( VideoRenderer & newVideoRenderer ) 00100 { 00101 00102 if ( _videoRenderer != 0 ) 00103 delete _videoRenderer ; 00104 00105 _videoRenderer = & newVideoRenderer ; 00106 00107 } 00108 00109 00110 00111 bool MultimediaRenderer::hasAudioRenderer() const 00112 { 00113 00114 return ( _audioRenderer != 0 ) ; 00115 00116 } 00117 00118 00119 00120 AudioRenderer & MultimediaRenderer::getAudioRenderer() const 00121 { 00122 00123 if ( _audioRenderer == 0 ) 00124 throw RenderingException( "MultimediaRenderer::getAudioRenderer: " 00125 "no audio renderer registered." ) ; 00126 00127 return * _audioRenderer ; 00128 00129 } 00130 00131 00132 00133 void MultimediaRenderer::setAudioRenderer( AudioRenderer & newAudioRenderer ) 00134 { 00135 00136 if ( _audioRenderer != 0 ) 00137 delete _audioRenderer ; 00138 00139 _audioRenderer = & newAudioRenderer ; 00140 00141 } 00142 00143 00144 00145 void MultimediaRenderer::render( RenderingTick currentRenderingTick ) 00146 { 00147 00148 OSDL_MULTIMEDIA_RENDER_LOG( "Rendering ! " ) ; 00149 00150 if ( _videoRenderer != 0 ) 00151 _videoRenderer->render( currentRenderingTick ) ; 00152 else 00153 renderVideo( currentRenderingTick ) ; 00154 00155 if ( _audioRenderer != 0 ) 00156 _audioRenderer->render( currentRenderingTick ) ; 00157 else 00158 renderAudio( currentRenderingTick ) ; 00159 00160 /* 00161 * Beware, currentRenderingTick might be always zero if no scheduler 00162 * is used. 00163 * 00164 */ 00165 _renderingDone++ ; 00166 00167 } 00168 00169 00170 00171 void MultimediaRenderer::onRenderingSkipped( 00172 RenderingTick skippedRenderingTick ) 00173 { 00174 00175 OSDL_MULTIMEDIA_RENDER_LOG( "Rendering skipped." ) ; 00176 _renderingSkipped++ ; 00177 00178 } 00179 00180 00181 00182 const string MultimediaRenderer::toString( Ceylan::VerbosityLevels level ) const 00183 { 00184 00185 string res = "Multimedia renderer, " ; 00186 00187 if ( _videoRenderer != 0 ) 00188 res += "having a video renderer (" 00189 + _videoRenderer->toString( Ceylan::low ) + ")" ; 00190 else 00191 res += "with no video renderer registered" ; 00192 00193 if ( _audioRenderer != 0 ) 00194 res += ", having an audio renderer (" 00195 + _audioRenderer->toString( Ceylan::low ) + ")" ; 00196 else 00197 res += ", with no audio renderer registered" ; 00198 00199 if ( level == Ceylan::low ) 00200 return res ; 00201 00202 res += ". Last rendering tick was " + Ceylan::toString( _lastRender ) 00203 + ", having performed " + Ceylan::toString( _renderingDone ) 00204 + " rendering(s) for " 00205 + Ceylan::toString( _renderingSkipped ) + " skip(s)" ; 00206 00207 if ( _renderingDone + _renderingSkipped != 0 ) 00208 res += " (rendering proportion: " 00209 + Ceylan::toString( 00210 100 * _renderingDone / ( _renderingDone + _renderingSkipped ) ) 00211 + "%)" ; 00212 00213 return res ; 00214 00215 } 00216