added support for clipStart and clipEnd

This commit is contained in:
nebojsa 2009-10-12 02:40:09 +00:00
parent 60518f7074
commit f6c9fef31a
14 changed files with 251 additions and 16 deletions

View file

@ -748,6 +748,24 @@ class Playlist : public Configurable,
Ptr<FadeInfo>::Ref fadeInfo) Ptr<FadeInfo>::Ref fadeInfo)
throw (std::invalid_argument); throw (std::invalid_argument);
/**
* Set clipStart for a playlist element.
*
*/
void
setClipStart(Ptr<UniqueId>::Ref playlistElementId,
Ptr<time_duration>::Ref newStart)
throw (std::invalid_argument);
/**
* Set clipEnd for a playlist element.
*
*/
void
setClipEnd(Ptr<UniqueId>::Ref playlistElementId,
Ptr<time_duration>::Ref newEnd)
throw (std::invalid_argument);
/** /**
* Remove a playlist element from the playlist. * Remove a playlist element from the playlist.
* *

View file

@ -130,6 +130,8 @@ class PlaylistElement : public Configurable
* The starting time of the event. * The starting time of the event.
*/ */
Ptr<time_duration>::Ref relativeOffset; Ptr<time_duration>::Ref relativeOffset;
Ptr<time_duration>::Ref clipStart;
Ptr<time_duration>::Ref clipEnd;
/** /**
* The type of the entry (audio clip or sub-playlist). * The type of the entry (audio clip or sub-playlist).
@ -204,6 +206,9 @@ class PlaylistElement : public Configurable
this->playable = audioClip; this->playable = audioClip;
this->fadeInfo = fadeInfo; this->fadeInfo = fadeInfo;
this->type = AudioClipType; this->type = AudioClipType;
setClipStart(Ptr<time_duration>::Ref(new time_duration(0,0,0,0)));
setClipEnd(Ptr<time_duration>::Ref(new time_duration(0,0,0,0)));
} }
/** /**
@ -228,7 +233,10 @@ class PlaylistElement : public Configurable
this->playable = audioClip; this->playable = audioClip;
this->fadeInfo = fadeInfo; this->fadeInfo = fadeInfo;
this->type = AudioClipType; this->type = AudioClipType;
}
setClipStart(Ptr<time_duration>::Ref(new time_duration(0,0,0,0)));
setClipEnd(Ptr<time_duration>::Ref(new time_duration(0,0,0,0)));
}
/** /**
* Create a new sub-playlist playlist element, with a new UniqueId, * Create a new sub-playlist playlist element, with a new UniqueId,
@ -252,7 +260,10 @@ class PlaylistElement : public Configurable
this->playable = playlist; this->playable = playlist;
this->fadeInfo = fadeInfo; this->fadeInfo = fadeInfo;
this->type = PlaylistType; this->type = PlaylistType;
}
setClipStart(Ptr<time_duration>::Ref(new time_duration(0,0,0,0)));
setClipEnd(Ptr<time_duration>::Ref(new time_duration(0,0,0,0)));
}
/** /**
* A virtual destructor, as this class has virtual functions. * A virtual destructor, as this class has virtual functions.
@ -324,6 +335,40 @@ class PlaylistElement : public Configurable
return relativeOffset; return relativeOffset;
} }
/**
*/
void
setClipStart(Ptr<time_duration>::Ref newStart)
throw ()
{
clipStart = newStart;
}
/**
*/
Ptr<time_duration>::Ref
getClipStart(void) const throw ()
{
return clipStart;
}
/**
*/
void
setClipEnd(Ptr<time_duration>::Ref newEnd)
throw ()
{
clipEnd = newEnd;
}
/**
*/
Ptr<time_duration>::Ref
getClipEnd(void) const throw ()
{
return clipEnd;
}
/** /**
* Return the type of this playlist element. If the return * Return the type of this playlist element. If the return
* value is PlaylistElement::AudioClipType (resp. PlaylistType), * value is PlaylistElement::AudioClipType (resp. PlaylistType),

View file

@ -180,6 +180,30 @@ class XmlRpcTools
extractRelativeOffset(XmlRpc::XmlRpcValue & xmlRpcValue) extractRelativeOffset(XmlRpc::XmlRpcValue & xmlRpcValue)
throw (std::invalid_argument); throw (std::invalid_argument);
/**
* Extract the relative offset from the XML-RPC parameters.
*
* @param xmlRpcValue the XML-RPC parameter to extract from.
* @return a time_duration that was found in the XML-RPC parameter.
* @exception std::invalid_argument if there was no relativeOffset
* member in xmlRpcValue
*/
static Ptr<time_duration>::Ref
extractClipStart(XmlRpc::XmlRpcValue & xmlRpcValue)
throw (std::invalid_argument);
/**
* Extract the relative offset from the XML-RPC parameters.
*
* @param xmlRpcValue the XML-RPC parameter to extract from.
* @return a time_duration that was found in the XML-RPC parameter.
* @exception std::invalid_argument if there was no relativeOffset
* member in xmlRpcValue
*/
static Ptr<time_duration>::Ref
extractClipEnd(XmlRpc::XmlRpcValue & xmlRpcValue)
throw (std::invalid_argument);
/** /**
* Convert a Playlist to an XmlRpcValue * Convert a Playlist to an XmlRpcValue
* *

View file

@ -545,6 +545,50 @@ Playlist::setFadeInfo(Ptr<UniqueId>::Ref playlistElementId,
it->second->setFadeInfo(fadeInfo); it->second->setFadeInfo(fadeInfo);
} }
/*------------------------------------------------------------------------------
* Change clipStart of a playlist element.
*----------------------------------------------------------------------------*/
void
Playlist::setClipStart(Ptr<UniqueId>::Ref playlistElementId,
Ptr<time_duration>::Ref newStart)
throw (std::invalid_argument)
{
Playlist::iterator it = this->find(playlistElementId);
if (it == this->end()) {
throw std::invalid_argument("no playlist element with this ID");
}
Ptr<time_duration>::Ref endOffset(new time_duration(
*it->second->getRelativeOffset()
+ *it->second->getPlayable()->getPlaylength() - *newStart));
setPlaylength(endOffset);
it->second->setClipStart(newStart);
}
/*------------------------------------------------------------------------------
* Change clipEnd of a playlist element.
*----------------------------------------------------------------------------*/
void
Playlist::setClipEnd(Ptr<UniqueId>::Ref playlistElementId,
Ptr<time_duration>::Ref newEnd)
throw (std::invalid_argument)
{
Playlist::iterator it = this->find(playlistElementId);
if (it == this->end()) {
throw std::invalid_argument("no playlist element with this ID");
}
Ptr<time_duration>::Ref endOffset(new time_duration(
*it->second->getRelativeOffset()
+ *newEnd - *it->second->getClipStart()));
setPlaylength(endOffset);
it->second->setClipEnd(newEnd);
}
/*------------------------------------------------------------------------------ /*------------------------------------------------------------------------------
* Remove a playlist element from the playlist. * Remove a playlist element from the playlist.

View file

@ -63,6 +63,14 @@ static const std::string idAttrName = "id";
*/ */
static const std::string relativeOffsetAttrName = "relativeOffset"; static const std::string relativeOffsetAttrName = "relativeOffset";
/**
*/
static const std::string clipStartAttrName = "clipStart";
/**
*/
static const std::string clipEndAttrName = "clipEnd";
/** /**
* The name of the audio clip child element of the playlist element. * The name of the audio clip child element of the playlist element.
*/ */
@ -117,6 +125,24 @@ PlaylistElement :: configure(const xmlpp::Element & element)
attribute->get_value() )); attribute->get_value() ));
relativeOffset = TimeConversion::parseTimeDuration(relativeOffsetString); relativeOffset = TimeConversion::parseTimeDuration(relativeOffsetString);
// set clip start
if (attribute = element.get_attribute(clipStartAttrName)) {
Ptr<std::string>::Ref clipStartString(new std::string(
attribute->get_value() ));
clipStart = TimeConversion::parseTimeDuration(clipStartString);
} else {
setClipStart(Ptr<time_duration>::Ref(new time_duration(0,0,0,0)));
}
// set clip end
if (attribute = element.get_attribute(clipEndAttrName)) {
Ptr<std::string>::Ref clipEndString(new std::string(
attribute->get_value() ));
clipEnd = TimeConversion::parseTimeDuration(clipEndString);
} else {
setClipEnd(Ptr<time_duration>::Ref(new time_duration(0,0,0,0)));
}
// set audio clip // set audio clip
xmlpp::Node::NodeList childNodes xmlpp::Node::NodeList childNodes
= element.get_children(audioClipElementName); = element.get_children(audioClipElementName);
@ -202,6 +228,12 @@ PlaylistElement :: getXmlElementString(void) throw ()
+ "\" "); + "\" ");
xmlString->append(relativeOffsetAttrName + "=\"" xmlString->append(relativeOffsetAttrName + "=\""
+ toFixedString(relativeOffset) + toFixedString(relativeOffset)
+ "\" ");
xmlString->append(clipStartAttrName + "=\""
+ toFixedString(clipStart)
+ "\" ");
xmlString->append(clipEndAttrName + "=\""
+ toFixedString(clipEnd)
+ "\">\n"); + "\">\n");
xmlString->append(*getPlayable()->getXmlElementString() + "\n"); xmlString->append(*getPlayable()->getXmlElementString() + "\n");

View file

@ -81,6 +81,16 @@ const std::string playlistElementIdName = "playlistElementId";
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
const std::string relativeOffsetName = "relativeOffset"; const std::string relativeOffsetName = "relativeOffset";
/*------------------------------------------------------------------------------
* The name of the relative offset member in the XML-RPC parameter structure
*----------------------------------------------------------------------------*/
const std::string clipStartName = "clipStart";
/*------------------------------------------------------------------------------
* The name of the relative offset member in the XML-RPC parameter structure
*----------------------------------------------------------------------------*/
const std::string clipEndName = "clipEnd";
/*------------------------------------------------------------------------------ /*------------------------------------------------------------------------------
* The name of the from member in the XML-RPC parameter structure. * The name of the from member in the XML-RPC parameter structure.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
@ -272,6 +282,42 @@ XmlRpcTools :: extractAudioClipId(XmlRpc::XmlRpcValue & xmlRpcValue)
return id; return id;
} }
/*------------------------------------------------------------------------------
* Extract the relative offset from an XML-RPC function call parameter
*----------------------------------------------------------------------------*/
Ptr<time_duration>::Ref
XmlRpcTools :: extractClipStart(XmlRpc::XmlRpcValue & xmlRpcValue)
throw (std::invalid_argument)
{
if (!xmlRpcValue.hasMember(clipStartName)
|| xmlRpcValue[clipStartName].getType()
!= XmlRpc::XmlRpcValue::TypeInt) {
throw std::invalid_argument("missing clip start argument");
}
Ptr<time_duration>::Ref clipStart(new time_duration(0,0,
int(xmlRpcValue[clipStartName]), 0));
return clipStart;
}
/*------------------------------------------------------------------------------
* Extract the relative offset from an XML-RPC function call parameter
*----------------------------------------------------------------------------*/
Ptr<time_duration>::Ref
XmlRpcTools :: extractClipEnd(XmlRpc::XmlRpcValue & xmlRpcValue)
throw (std::invalid_argument)
{
if (!xmlRpcValue.hasMember(clipEndName)
|| xmlRpcValue[clipEndName].getType()
!= XmlRpc::XmlRpcValue::TypeInt) {
throw std::invalid_argument("missing clip end argument");
}
Ptr<time_duration>::Ref clipEnd(new time_duration(0,0,
int(xmlRpcValue[clipEndName]), 0));
return clipEnd;
}
/*------------------------------------------------------------------------------ /*------------------------------------------------------------------------------
* Extract the relative offset from an XML-RPC function call parameter * Extract the relative offset from an XML-RPC function call parameter

View file

@ -134,7 +134,19 @@ public:
} }
void playContext(){ void playContext(){
gst_element_set_state (m_pipeline, GST_STATE_PLAYING); GstStateChangeReturn st = gst_element_set_state (m_pipeline, GST_STATE_PLAYING);
if(NULL != m_audioDescription)
{
//enforce PLAYING state in case this was an asynch state change
//this is essential for seek to succeed
if(GST_STATE_CHANGE_ASYNC == st)
{
GstState state, pending;
gst_element_get_state (m_pipeline, &state, &pending, 2000000000);//just in case, do not wait for more than 2 sec
}
gst_element_seek(m_pipeline, 1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET,
m_audioDescription->m_clipBegin*GST_NSECOND, GST_SEEK_TYPE_SET, m_audioDescription->m_clipEnd*GST_NSECOND);
}
g_object_set(G_OBJECT(m_volume), "volume", 1.0, NULL); g_object_set(G_OBJECT(m_volume), "volume", 1.0, NULL);
} }
@ -359,7 +371,7 @@ private:
* Prepare animations bin. * Prepare animations bin.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
bool prepareAnimations(){ bool prepareAnimations(){
if(m_audioDescription && m_audioDescription->m_animations.size() > 0){ if(m_audioDescription && m_audioDescription->m_animations.size() > 0){
m_ctrl = gst_controller_new (G_OBJECT (m_volume), "volume", NULL); m_ctrl = gst_controller_new (G_OBJECT (m_volume), "volume", NULL);
if (m_ctrl == NULL) { if (m_ctrl == NULL) {
return false; return false;

View file

@ -166,6 +166,8 @@ class M3uPlaylist {
$gunid2 = StoredFile::CreateGunid(); $gunid2 = StoredFile::CreateGunid();
$length = Playlist::secondsToPlaylistTime($length); $length = Playlist::secondsToPlaylistTime($length);
$offset = '???'; $offset = '???';
$clipStart = '???';
$clipEnd = '???';
$uri_h = preg_replace("|--|", "&#2d;&#2d;", htmlspecialchars("$uri")); $uri_h = preg_replace("|--|", "&#2d;&#2d;", htmlspecialchars("$uri"));
if (preg_match("|\.([a-zA-Z0-9]+)$|", $uri, $va)) { if (preg_match("|\.([a-zA-Z0-9]+)$|", $uri, $va)) {
switch (strtolower($ext = $va[1])) { switch (strtolower($ext = $va[1])) {
@ -184,7 +186,7 @@ class M3uPlaylist {
break; break;
} }
} }
$res .= "$ind2<playlistElement id=\"$gunid\" relativeOffset=\"$offset\">\n". $res .= "$ind2<playlistElement id=\"$gunid\" relativeOffset=\"$offset\" clipStart=\"$clipStart\" clipEnd=\"$clipEnd\">\n".
$acOrPl. $acOrPl.
"$ind2</playlistElement>\n"; "$ind2</playlistElement>\n";
} }

View file

@ -414,6 +414,16 @@ class Playlist extends StoredFile {
if (PEAR::isError($offArr)) { if (PEAR::isError($offArr)) {
return $offArr; return $offArr;
} }
// get clipStart:
$startArr = $this->md->getMetadataElement('clipStart', $elId);
if (PEAR::isError($startArr)) {
return $startArr;
}
// get clipEnd:
$endArr = $this->md->getMetadataElement('clipEnd', $elId);
if (PEAR::isError($endArr)) {
return $endArr;
}
$offsetId = $offArr[0]['mid']; $offsetId = $offArr[0]['mid'];
$offset = $offArr[0]['value']; $offset = $offArr[0]['value'];
// get audioClip: // get audioClip:
@ -460,10 +470,6 @@ class Playlist extends StoredFile {
"Playlist::recalculateTimes: fadeIn too big"); "Playlist::recalculateTimes: fadeIn too big");
} }
} }
// $peArr[] = array('id'=>$elId, 'gunid'=>$plElGunid, 'len'=>$acLen,
// 'offset'=>$offset, 'offsetId'=>$offsetId,
// 'fadeIn'=>$fadeIn, 'fadeOut'=>$fadeOut);
// set relativeOffset:
if ($len > 0) { if ($len > 0) {
$len = $len - $fadeInS; $len = $len - $fadeInS;
} }

View file

@ -276,7 +276,9 @@ class SmilPlaylistAudioElement {
$title = basename($tree->attrs['src']->val); $title = basename($tree->attrs['src']->val);
$offset = Playlist::secondsToPlaylistTime($tree->attrs['begin']->val); $offset = Playlist::secondsToPlaylistTime($tree->attrs['begin']->val);
$res = "$ind<playlistElement id=\"$plElGunid\" relativeOffset=\"$offset\">\n". $clipStart = Playlist::secondsToPlaylistTime($tree->attrs['clipStart']->val);
$clipEnd = Playlist::secondsToPlaylistTime($tree->attrs['clipEnd']->val);
$res = "$ind<playlistElement id=\"$plElGunid\" relativeOffset=\"$offset\" clipStart=\"$clipStart\" clipEnd=\"$clipEnd\">\n".
"$ind2<$type id=\"$acGunid\" playlength=\"$playlength\" title=\"$title\"/>\n". "$ind2<$type id=\"$acGunid\" playlength=\"$playlength\" title=\"$title\"/>\n".
$fInfo. $fInfo.
"$ind</playlistElement>\n"; "$ind</playlistElement>\n";

View file

@ -29,7 +29,7 @@ $playlistFormat = array(
'optional'=>array('fadeInfo'), 'optional'=>array('fadeInfo'),
), ),
'attrs'=>array( 'attrs'=>array(
'required'=>array('id', 'relativeOffset'), 'required'=>array('id', 'relativeOffset', 'clipStart', 'clipEnd'),
), ),
), ),
'audioClip'=>array( 'audioClip'=>array(

View file

@ -26,8 +26,8 @@ $mdefs = array(
"listMethods" => array('m'=>"system.listMethods", 'p'=>NULL, 't'=>NULL), "listMethods" => array('m'=>"system.listMethods", 'p'=>NULL, 't'=>NULL),
"AddAudioClipToPlaylistMethod" => array( "AddAudioClipToPlaylistMethod" => array(
'm'=>'addAudioClipToPlaylist', 'm'=>'addAudioClipToPlaylist',
'p'=>array('sessionId'/*string*/, 'playlistId'/*string*/, 'audioClipId'/*string*/, 'relativeOffset'/*int*/), 'p'=>array('sessionId'/*string*/, 'playlistId'/*string*/, 'audioClipId'/*string*/, 'relativeOffset'/*int*/, 'clipStart'/*int*/, 'clipEnd'/*int*/),
't'=>array('string', 'string', 'string', 'int'), 't'=>array('string', 'string', 'string', 'int', 'int', 'int'),
'r'=>array('playlistElementId'/*string*/), 'r'=>array('playlistElementId'/*string*/),
'e'=>array( 'e'=>array(
'301'=>'invalid argument format', '301'=>'invalid argument format',

View file

@ -1175,7 +1175,7 @@ GLiveSupport :: cancelEditedPlaylist(void)
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void void
LiveSupport :: GLiveSupport :: LiveSupport :: GLiveSupport ::
GLiveSupport :: addToPlaylist(Ptr<const UniqueId>::Ref id) GLiveSupport :: addToPlaylist(Ptr<UniqueId>::Ref id)
throw (XmlRpcException) throw (XmlRpcException)
{ {
if (!editedPlaylist.get()) { if (!editedPlaylist.get()) {
@ -1188,7 +1188,11 @@ GLiveSupport :: addToPlaylist(Ptr<const UniqueId>::Ref id)
editedPlaylist->addPlaylist(playlist, editedPlaylist->getPlaylength()); editedPlaylist->addPlaylist(playlist, editedPlaylist->getPlaylength());
} else if (existsAudioClip(id)) { } else if (existsAudioClip(id)) {
Ptr<AudioClip>::Ref clip = getAudioClip(id); Ptr<AudioClip>::Ref clip = getAudioClip(id);
editedPlaylist->addAudioClip(clip, editedPlaylist->getPlaylength()); Ptr<UniqueId>::Ref elid = editedPlaylist->addAudioClip(clip, editedPlaylist->getPlaylength());
//TODO: for testing only!!!!!!!!!
// editedPlaylist->setClipStart(elid, Ptr<time_duration>::Ref(new time_duration(seconds(5))));
// editedPlaylist->setClipEnd(elid, Ptr<time_duration>::Ref(new time_duration(seconds(10))));
} }
masterPanel->updatePlaylistWindow(); masterPanel->updatePlaylistWindow();

View file

@ -906,7 +906,7 @@ class GLiveSupport : public LocalizedConfigurable,
* @see #releaseEditedPlaylist * @see #releaseEditedPlaylist
*/ */
void void
addToPlaylist(Ptr<const UniqueId>::Ref id) addToPlaylist(Ptr<UniqueId>::Ref id)
throw (XmlRpcException); throw (XmlRpcException);
/** /**
* Save the currently edited playlist in storage. * Save the currently edited playlist in storage.