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

📄 gstreamer_audio_renderer.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//#define AM_DBG#ifndef AM_DBG#define AM_DBG if(0)#endif#include "ambulant/gui/gstreamer/gstreamer_audio_renderer.h"#include "ambulant/gui/gstreamer/gstreamer_player.h"#include "ambulant/net/posix_datasource.h"#include "ambulant/common/region_info.h"#include <stdlib.h>using namespace ambulant;using namespace gui::gstreamer;// ***************** gstreamer_audio_renderer **************************typedef lib::no_arg_callback<gui::gstreamer::gstreamer_audio_renderer> readdone_callback;gstreamer_audio_renderer::gstreamer_audio_renderer(	common::playable_notification *context,	common::playable_notification::cookie_type cookie,	const lib::node *node,	lib::event_processor *evp,	common::factories *factory):	common::renderer_playable(context, cookie, node, evp),	m_player(NULL),	m_is_playing(false),	m_is_paused(false),	m_read_ptr_called(false),	m_volcount(0),	m_intransition(NULL),	m_outtransition(NULL),	m_transition_engine(NULL){	init_player(node);}gstreamer_audio_renderer::gstreamer_audio_renderer(	common::playable_notification *context,	common::playable_notification::cookie_type cookie,	const lib::node *node,	lib::event_processor *evp,	common::factories* factory,	net::audio_datasource *ds):	common::renderer_playable(context, cookie, node, evp),	m_player(NULL),	m_is_playing(false),	m_is_paused(false),	m_read_ptr_called(false),	m_intransition(NULL),	m_outtransition(NULL),	m_transition_engine(NULL){        init_player(node);}gstreamer_audio_renderer::~gstreamer_audio_renderer(){	m_lock.enter();	AM_DBG lib::logger::get_logger()->debug("gstreamer_audio_renderer::~gstreamer_audio_renderer(0x%x) m_url=%s",  this, m_url.get_url().c_str());			if (m_transition_engine) {		delete m_transition_engine;		m_transition_engine = NULL;	}	if (m_player) delete m_player;	m_player = NULL;	m_lock.leave();}voidgstreamer_audio_renderer::init_player(const lib::node *node){	m_lock.enter();	assert (node);	m_url = node->get_url("src");	AM_DBG lib::logger::get_logger()->debug("gstreamer_audio_renderer::init_player(0x%x) url=%s",  this, m_url.get_url().c_str());	_init_clip_begin_end();	m_player = new gstreamer_player(m_url.get_url().c_str(), this);	m_lock.leave();}voidgstreamer_audio_renderer::set_intransition(const lib::transition_info* info) { 	if (m_transition_engine)		delete m_transition_engine;	m_intransition = info;	m_transition_engine = new smil2::audio_transition_engine();	m_transition_engine->init(m_event_processor, false, info);}voidgstreamer_audio_renderer::start_outtransition(const lib::transition_info* info){ 	if (m_transition_engine)		delete m_transition_engine;	m_outtransition = info;	m_transition_engine = new smil2::audio_transition_engine();	m_transition_engine->init(m_event_processor, true, info);}boolgstreamer_audio_renderer::is_supported(const lib::node *node){	if ( ! node)    		return false;	std::string mimetype(node->get_url("src").guesstype());	#ifdef  WITH_NOKIA770	if (mimetype == "audio/mpeg") // .mp3		return true;#else //WITH_NOKIA770	if (mimetype == "audio/wav") // .wav		return true;#endif//WITH_NOKIA770	return false;}boolgstreamer_audio_renderer::is_paused(){	m_lock.enter();	bool rv;	rv = m_is_paused;	m_lock.leave();	return rv;}boolgstreamer_audio_renderer::is_stopped(){	m_lock.enter();	bool rv;	rv = !m_is_playing;	m_lock.leave();	return rv;}boolgstreamer_audio_renderer::is_playing(){	m_lock.enter();	bool rv;	rv = m_is_playing;	m_lock.leave();	return rv;}voidgstreamer_audio_renderer::stop(){	m_lock.enter();	_stop();	m_lock.leave();}voidgstreamer_audio_renderer::stopped(){	m_lock.enter();	_stopped();	m_lock.leave();}voidgstreamer_audio_renderer::pause(){	AM_DBG lib::logger::get_logger()->debug("gstreamer_audio_renderer.pause(0x%x)", (void *)this);	m_lock.enter();	_pause();	m_lock.leave();}voidgstreamer_audio_renderer::resume(){	m_lock.enter();	_resume();	m_lock.leave();}voidgstreamer_audio_renderer::start(double where){	m_lock.enter();	_start(where);	m_lock.leave();}voidgstreamer_audio_renderer::seek(double where){	m_lock.enter();	_seek(where);	m_lock.leave();}common::duration gstreamer_audio_renderer::get_dur(){	common::duration rv(false, 0.0);	double dur = 0.0;	AM_DBG lib::logger::get_logger()->debug("gstreamer_audio_renderer.get_dur(0x%x)", (void *)this);	m_lock.enter();	if (m_player) {		dur = m_player->get_dur();	}	m_lock.leave();	if (dur != 0.0) {	        double microsec = 1e6;		double clip_begin = m_clip_begin / microsec;		double clip_end   = m_clip_end / microsec;		if (clip_end > 0 && dur > clip_end)	               dur = clip_end;		if (clip_begin > 0)	               dur -= clip_begin;		lib::logger::get_logger()->trace("gstreamer_audio_renderer: get_dur() clip_begin=%f clip_end=%f dur=%f", clip_begin, clip_end, dur);		rv = common::duration(true, dur);  	}	return rv;}// private functions -- to be called under semaphore protectionvoidgstreamer_audio_renderer::_start(double where){	AM_DBG lib::logger::get_logger()->debug("gstreamer_audio_renderer.start(0x%x): url=%s, where=%f", (void *)this, m_url.get_url().c_str(),where);	_pause();	_seek(where);	_resume(); // turn on playing	m_context->started(m_cookie, 0);}voidgstreamer_audio_renderer::_stop(){	AM_DBG lib::logger::get_logger()->debug("gstreamer_audio_renderer::stop(0x%x)",(void*)this);	if (m_player) {		m_player->stop_player();		m_player = NULL;	}	_stopped();}voidgstreamer_audio_renderer::_stopped(){	AM_DBG lib::logger::get_logger()->debug("gstreamer_audio_renderer::stopedp(0x%x)",(void*)this);	if (m_is_playing) {		// inform scheduler 		m_context->stopped(m_cookie, 0);		m_is_playing = false;	}}voidgstreamer_audio_renderer::_pause(){	AM_DBG lib::logger::get_logger()->debug("gstreamer_audio_renderer.pause(0x%x)", (void *)this);	if (m_player)		m_player->pause();	m_is_paused = true;}voidgstreamer_audio_renderer::_resume(){	AM_DBG lib::logger::get_logger()->debug("gstreamer_audio_renderer.resume(0x%x)", (void *)this);	if (m_player)		m_player->play();	m_is_playing = true;	m_is_paused = false;}voidgstreamer_audio_renderer::_seek(double where){	double microsec = 1e6; 	AM_DBG  lib::logger::get_logger()->trace("gstreamer_audio_renderer: seek(%f) NOT YET IMPLEMENETD", where); 	where += (m_clip_begin / microsec);	if (m_player)		m_player->seek(where);}

⌨️ 快捷键说明

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