⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 renderer_impl.cpp

📁 彩信浏览器
💻 CPP
字号:
// This file is part of Ambulant Player, www.ambulantplayer.org.//// Copyright (C) 2003-2007 Stichting CWI, // Kruislaan 413, 1098 SJ Amsterdam, The Netherlands.//// Ambulant Player is free software; you can redistribute it and/or modify// it under the terms of the GNU Lesser General Public License as published by// the Free Software Foundation; either version 2.1 of the License, or// (at your option) any later version.//// Ambulant Player is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the// GNU Lesser General Public License for more details.//// You should have received a copy of the GNU Lesser General Public License// along with Ambulant Player; if not, write to the Free Software// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA/*  * @$Id: renderer_impl.cpp,v 1.15 2007/02/12 14:14:47 jackjansen Exp $  */#include "ambulant/config/config.h"#include "ambulant/lib/logger.h"#include "ambulant/lib/transition_info.h"#include "ambulant/common/renderer_impl.h"#include "ambulant/gui/none/none_gui.h"#include "ambulant/net/datasource.h"#include "ambulant/lib/parselets.h"//#define AM_DBG#ifndef AM_DBG#define AM_DBG if(0)#endifusing namespace ambulant;using namespace common;typedef lib::no_arg_callback<renderer_playable_ds> readdone_callback;renderer_playable::renderer_playable(	playable_notification *context,	cookie_type cookie,	const lib::node *node,	lib::event_processor* evp) :	playable_imp(context, cookie, node, evp),	m_dest(0),	m_alignment(0),	m_activated(false),	m_erase_never(false),	m_clip_begin(0),	m_clip_end(-1){	const char *erase = m_node->get_attribute("erase");	if (erase && strcmp(erase, "never") == 0)		m_erase_never = true;}voidrenderer_playable::start(double t){	AM_DBG lib::logger::get_logger()->debug("renderer_playable.start(0x%x)", (void *)this);	if (m_activated) {		lib::logger::get_logger()->trace("renderer_playable.start(0x%x): already started", (void*)this);		return;	}	m_activated = true;	if (!m_dest) {		lib::logger::get_logger()->trace("renderer_playable.start: no destination surface, skipping media item");		m_context->stopped(m_cookie, 0);		return;	}	m_dest->show(this);}voidrenderer_playable::stop(){	AM_DBG lib::logger::get_logger()->debug("renderer_playable.stop(0x%x)", (void *)this);	if (!m_activated) {		lib::logger::get_logger()->trace("renderer_playable.stop(0x%x): not started", (void*)this);	} else {		if (m_dest)			m_dest->renderer_done(this);	}	m_activated = false;}voidrenderer_playable::user_event(const lib::point &where, int what) {	if (what == user_event_click) m_context->clicked(m_cookie, 0);	else if (what == user_event_mouse_over) m_context->pointed(m_cookie, 0);	else assert(0);}voidrenderer_playable::_init_clip_begin_end(){	// here we have to get clip_begin/clip_end from the node	const char *clip_begin_attr = m_node->get_attribute("clipBegin");	net::timestamp_t cb = 0;		if (!clip_begin_attr) {		clip_begin_attr = m_node->get_attribute("clip-begin");	}		if (clip_begin_attr) {		lib::mediaclipping_p parser;		std::string s(clip_begin_attr);		std::string::const_iterator b = s.begin();		std::string::const_iterator e = s.end();		std::ptrdiff_t d = parser.parse(b, e);		if (d == -1) {			lib::logger::get_logger()->warn("Cannot parse clipBegin");		} else {			cb = parser.get_time() * 1000 ;	// get_time returns ms !			// lib::logger::get_logger()->warn("parsed clipBegin cb=%lld", cb);		}	}		const char *clip_end_attr = m_node->get_attribute("clipEnd");	net::timestamp_t ce = -1;	if (!clip_end_attr) {		clip_end_attr = m_node->get_attribute("clip-end");	}		if (clip_end_attr) {		lib::mediaclipping_p parser;		std::string s(clip_end_attr);		std::string::const_iterator b = s.begin();		std::string::const_iterator e = s.end();		std::ptrdiff_t d = parser.parse(b, e);		if (d == -1) {			lib::logger::get_logger()->warn("Cannot parse clipEnd");		} else {			ce = parser.get_time() *1000;	// get_time returns ms !		}		}	AM_DBG lib::logger::get_logger()->debug("renderer_playable::init_clip_begin_end: cb=%lld, ce=%lld", cb,ce);	m_clip_begin = cb;	m_clip_end = ce;}renderer_playable_ds::renderer_playable_ds(	playable_notification *context,	playable_notification::cookie_type cookie,	const lib::node *node,	lib::event_processor *evp,	common::factories *factory):	renderer_playable(context, cookie, node, evp),	m_src(NULL){	// XXXX m_src = passive_datasource(node->get_url("src"))->activate()	net::url url = node->get_url("src");	m_src = factory->get_datasource_factory()->new_raw_datasource(url);	}renderer_playable_ds::~renderer_playable_ds(){	AM_DBG lib::logger::get_logger()->debug("~renderer_playable_ds(0x%x)", (void *)this);  	if (m_src) {		m_src->release();		m_src = NULL;	}}voidrenderer_playable_ds::start(double t){	AM_DBG lib::logger::get_logger()->debug("renderer_playable_ds.start(0x%x %s)", (void *)this, m_node->get_sig().c_str());	if (m_activated) {		lib::logger::get_logger()->trace("renderer_playable_ds.start(0x%x): already started", (void*)this);		return;	}	renderer_playable::start(t);	if (m_src) {		lib::event *e = new readdone_callback(this, &renderer_playable_ds::readdone);		m_src->start(m_event_processor, e);		m_context->started(m_cookie, 0);	} else {		lib::logger::get_logger()->trace("renderer_playable_ds.start: no datasource, skipping media item");		m_context->stopped(m_cookie, 0);	}}voidrenderer_playable_ds::seek(double t){	lib::logger::get_logger()->trace("renderer_playable_ds: seek(%f) not implemented", t);}voidrenderer_playable_ds::stop(){	AM_DBG lib::logger::get_logger()->debug("renderer_playable_ds.stop(0x%x %s)", (void *)this, m_node->get_sig().c_str());	renderer_playable::stop();	if (m_src) {		m_src->stop();		m_src->release();	}	m_src = NULL;	if (m_context)		m_context->stopped(m_cookie, 0);}renderer_playable_dsall::~renderer_playable_dsall(){	if (m_data) free(m_data);}voidrenderer_playable_dsall::readdone(){	if (!m_src) return;		unsigned cur_size = m_src->size();	AM_DBG lib::logger::get_logger()->debug("renderer_playable_dsall.readdone(0x%x, size=%d) cookie=%d", (void *)this, cur_size, m_cookie);		if (!m_data)		m_data = malloc(cur_size);	else		m_data = realloc(m_data, m_data_size + cur_size);		if (m_data == NULL) {		lib::logger::get_logger()->fatal("renderer_playable_dsall.readdone: cannot allocate %d bytes", cur_size);		// What else can we do...		m_context->stopped(m_cookie, 0);	}	AM_DBG lib::logger::get_logger()->debug("renderer_playable_dsall.readdone(0x%x): calling m_src->get_read_ptr() m_src=0x%x", (void *)this,m_src);	char *cur_data = m_src->get_read_ptr();	memcpy((char *)m_data + m_data_size, cur_data, cur_size);	m_data_size += cur_size;	AM_DBG lib::logger::get_logger()->debug("renderer_playable_dsall.readdone(0x%x): calling m_src->readdone(%d)", (void *)this,m_data_size);	m_src->readdone(cur_size);		if (m_src->end_of_file()) {		// All done		AM_DBG lib::logger::get_logger()->debug("renderer_playable_dsall.readdone(0x%x):  all done, calling need_redraw() and stopped_callback", (void *)this);		if (m_dest)			m_dest->need_redraw();		m_src->stop();		m_context->stopped(m_cookie, 0);	} else {		// Continue reading		AM_DBG lib::logger::get_logger()->debug("renderer_playable_dsall.readdone(0x%x):  more to come, calling m_src->start()", (void *)this);		lib::event *e = new readdone_callback(this, &renderer_playable_ds::readdone);		m_src->start(m_event_processor, e);	}	}global_playable_factory_impl::global_playable_factory_impl():   m_default_factory(new gui::none::none_playable_factory()){}global_playable_factory_impl::~global_playable_factory_impl(){    // XXXX Should I delete the factories in m_factories? I think    // so, but I'm not sure...    delete m_default_factory;}    voidglobal_playable_factory_impl::add_factory(playable_factory *rf){    m_factories.push_back(rf);}    playable *global_playable_factory_impl::new_playable(	playable_notification *context,	playable_notification::cookie_type cookie,	const lib::node *node,	lib::event_processor *evp){    std::vector<playable_factory *>::iterator i;    playable *rv;        for(i=m_factories.begin(); i != m_factories.end(); i++) {        rv = (*i)->new_playable(context, cookie, node, evp);        if (rv) return rv;    }    return m_default_factory->new_playable(context, cookie, node, evp);}playable *global_playable_factory_impl::new_aux_audio_playable(	playable_notification *context,	playable_notification::cookie_type cookie,	const lib::node *node,	lib::event_processor *evp,	net::audio_datasource *src){    std::vector<playable_factory *>::iterator i;    playable *rv;        for(i=m_factories.begin(); i != m_factories.end(); i++) {        rv = (*i)->new_aux_audio_playable(context, cookie, node, evp, src);        if (rv) return rv;    }	    return m_default_factory->new_playable(context, cookie, node, evp);}global_playable_factory *common::get_global_playable_factory(){    return new global_playable_factory_impl();}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -