00001 #include "OSDLMultimediaRenderer.h"
00002
00003 #include "OSDLVideoRenderer.h"
00004 #include "OSDLAudioRenderer.h"
00005
00006
00007 using namespace Ceylan::Log ;
00008
00009 using namespace OSDL::Events ;
00010 using namespace OSDL::Rendering ;
00011 using namespace OSDL::Engine ;
00012
00013 using std::string ;
00014
00015
00016
00017 #ifdef OSDL_DEBUG_RENDERER
00018
00019 #define OSDL_MULTIMEDIA_RENDER_LOG(message) send( message ) ;
00020
00021 #else // OSDL_DEBUG_RENDERER
00022
00023 #define OSDL_MULTIMEDIA_RENDER_LOG(message)
00024
00025 #endif // OSDL_DEBUG_RENDERER
00026
00027
00028
00029 MultimediaRenderer::MultimediaRenderer( bool registerToScheduler )
00030 throw( RenderingException ) :
00031 Renderer( registerToScheduler ),
00032 _videoRenderer( 0 ),
00033 _audioRenderer( 0 )
00034 {
00035
00036
00037 }
00038
00039
00040 MultimediaRenderer::~MultimediaRenderer() throw()
00041 {
00042
00043
00044
00045 }
00046
00047
00048
00049 bool MultimediaRenderer::hasVideoRenderer() const throw()
00050 {
00051
00052 return ( _videoRenderer != 0 ) ;
00053
00054 }
00055
00056
00057
00058 VideoRenderer & MultimediaRenderer::getVideoRenderer() const
00059 throw( RenderingException )
00060 {
00061
00062 if ( _videoRenderer == 0 )
00063 throw RenderingException( "MultimediaRenderer::getVideoRenderer : "
00064 "no video renderer registered." ) ;
00065
00066 return * _videoRenderer ;
00067
00068 }
00069
00070
00071
00072 void MultimediaRenderer::setVideoRenderer( VideoRenderer & newVideoRenderer )
00073 throw()
00074 {
00075
00076 if ( _videoRenderer != 0 )
00077 delete _videoRenderer ;
00078
00079 _videoRenderer = & newVideoRenderer ;
00080
00081 }
00082
00083
00084
00085 bool MultimediaRenderer::hasAudioRenderer() const throw()
00086 {
00087
00088 return ( _audioRenderer != 0 ) ;
00089
00090 }
00091
00092
00093
00094 AudioRenderer & MultimediaRenderer::getAudioRenderer() const
00095 throw( RenderingException )
00096 {
00097
00098 if ( _audioRenderer == 0 )
00099 throw RenderingException( "MultimediaRenderer::getAudioRenderer : "
00100 "no audio renderer registered." ) ;
00101
00102 return * _audioRenderer ;
00103
00104 }
00105
00106
00107
00108 void MultimediaRenderer::setAudioRenderer( AudioRenderer & newAudioRenderer )
00109 throw()
00110 {
00111
00112 if ( _audioRenderer != 0 )
00113 delete _audioRenderer ;
00114
00115 _audioRenderer = & newAudioRenderer ;
00116
00117 }
00118
00119
00120
00121 void MultimediaRenderer::render( Events::RenderingTick currentRenderingTick )
00122 throw()
00123 {
00124
00125 OSDL_MULTIMEDIA_RENDER_LOG( "Rendering ! " ) ;
00126
00127 if ( _videoRenderer != 0 )
00128 _videoRenderer->render( currentRenderingTick ) ;
00129 else
00130 renderVideo( currentRenderingTick ) ;
00131
00132 if ( _audioRenderer != 0 )
00133 _audioRenderer->render( currentRenderingTick ) ;
00134 else
00135 renderAudio( currentRenderingTick ) ;
00136
00137
00138
00139
00140
00141
00142 _renderingDone++ ;
00143
00144 }
00145
00146
00147
00148 void MultimediaRenderer::onRenderingSkipped(
00149 RenderingTick skippedRenderingTick ) throw()
00150 {
00151
00152 OSDL_MULTIMEDIA_RENDER_LOG( "Rendering skipped." ) ;
00153 _renderingSkipped++ ;
00154
00155 }
00156
00157
00158
00159 const string MultimediaRenderer::toString( Ceylan::VerbosityLevels level )
00160 const throw()
00161 {
00162
00163 string res = "Multimedia renderer, " ;
00164
00165 if ( _videoRenderer != 0 )
00166 res += "having a video renderer ("
00167 + _videoRenderer->toString( Ceylan::low ) + ")" ;
00168 else
00169 res += "with no video renderer registered" ;
00170
00171 if ( _audioRenderer != 0 )
00172 res += ", having an audio renderer ("
00173 + _audioRenderer->toString( Ceylan::low ) + ")" ;
00174 else
00175 res += ", with no audio renderer registered" ;
00176
00177 if ( level == Ceylan::low )
00178 return res ;
00179
00180 res += ". Last rendering tick was " + Ceylan::toString( _lastRender )
00181 + ", having performed " + Ceylan::toString( _renderingDone )
00182 + " rendering(s) for "
00183 + Ceylan::toString( _renderingSkipped ) + " skip(s)" ;
00184
00185 if ( _renderingDone + _renderingSkipped != 0 )
00186 res += " (rendering proportion : "
00187 + Ceylan::toString(
00188 100 * _renderingDone / ( _renderingDone + _renderingSkipped ) )
00189 + "%)" ;
00190
00191 return res ;
00192
00193 }
00194