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 "OSDLAudioRenderer.h" 00028 00029 00030 #include "OSDLScheduler.h" // for GetExistingScheduler 00031 #include "OSDLMultimediaRenderer.h" // for MultimediaRenderer 00032 00033 00034 using namespace OSDL::Events ; 00035 using namespace OSDL::Rendering ; 00036 using namespace OSDL::Engine ; 00037 00038 using std::string ; 00039 00040 00041 00042 #ifdef OSDL_DEBUG_AUDIO_RENDERER 00043 00044 #define OSDL_AUDIO_RENDER_LOG(message) send( message ) ; 00045 00046 #else 00047 00048 #define OSDL_AUDIO_RENDER_LOG(message) 00049 00050 #endif 00051 00052 00053 00054 00055 AudioRenderer::AudioRenderer( bool registerToRootRenderer ) : 00056 Renderer( /* registerToScheduler */ false ) 00057 { 00058 00059 if ( registerToRootRenderer ) 00060 { 00061 00062 Renderer * renderer ; 00063 00064 try 00065 { 00066 00067 // Retrieve the root renderer: 00068 renderer = & Renderer::GetExistingRootRenderer() ; 00069 00070 } 00071 catch( const RenderingException & e ) 00072 { 00073 throw RenderingException( "AudioRenderer constructor: " 00074 "no already existing root renderer (" 00075 + e.toString() 00076 + ") whereas registering had been requested." ) ; 00077 } 00078 00079 // Check it is a multimedia renderer indeed: 00080 MultimediaRenderer * multimediaRenderer = 00081 dynamic_cast<MultimediaRenderer *>( renderer ) ; 00082 00083 if ( multimediaRenderer == 0 ) 00084 throw RenderingException( "AudioRenderer constructor: " 00085 "root renderer is not a multimedia renderer, " 00086 "no registering possible." ) ; 00087 00088 multimediaRenderer->setAudioRenderer( * this ) ; 00089 00090 } 00091 00092 } 00093 00094 00095 00096 AudioRenderer::~AudioRenderer() throw() 00097 { 00098 00099 } 00100 00101 00102 00103 void AudioRenderer::render( RenderingTick currentRenderingTick ) 00104 { 00105 00106 OSDL_AUDIO_RENDER_LOG( "Audio rendering! " ) ; 00107 00108 00109 /* 00110 * Beware, currentRenderingTick might be always zero if no scheduler 00111 * is used. 00112 * 00113 */ 00114 _renderingDone++ ; 00115 00116 } 00117 00118 00119 00120 void AudioRenderer::onRenderingSkipped( RenderingTick skippedRenderingTick ) 00121 { 00122 00123 OSDL_AUDIO_RENDER_LOG( "Audio rendering skipped." ) ; 00124 _renderingSkipped++ ; 00125 00126 } 00127 00128 00129 00130 const string AudioRenderer::toString( Ceylan::VerbosityLevels level ) const 00131 { 00132 00133 string res = "Audio renderer, whose last rendering tick was " 00134 + Ceylan::toString( _lastRender ) 00135 + ", having performed " + Ceylan::toString( _renderingDone ) 00136 + " rendering(s) for " 00137 + Ceylan::toString( _renderingSkipped ) + " skip(s)" ; 00138 00139 if ( ( _renderingDone + _renderingSkipped ) != 0 ) 00140 res += " (rendering proportion: " 00141 + Ceylan::toString( 100 * _renderingDone 00142 / ( _renderingDone + _renderingSkipped ) ) 00143 + "%)" ; 00144 00145 return res ; 00146 00147 } 00148