X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/a9d34a0da90559741b525756944ced38bbf4538a..64de540e03c8ab04712797079e5fc76eb0135baa:/lib/service/servicemp3.cpp diff --git a/lib/service/servicemp3.cpp b/lib/service/servicemp3.cpp index 95ec274d..7701d4d5 100644 --- a/lib/service/servicemp3.cpp +++ b/lib/service/servicemp3.cpp @@ -194,7 +194,7 @@ eServiceMP3::eServiceMP3(eServiceReference ref) m_seekTimeout = eTimer::create(eApp); m_subtitle_sync_timer = eTimer::create(eApp); m_stream_tags = 0; - m_currentAudioStream = 0; + m_currentAudioStream = -1; m_currentSubtitleStream = 0; m_subtitle_widget = 0; m_currentTrickRatio = 0; @@ -335,7 +335,6 @@ eServiceMP3::eServiceMP3(eServiceReference ref) m_gst_playbin = 0; } - gst_element_set_state (m_gst_playbin, GST_STATE_PLAYING); setBufferSize(m_buffer_size); } @@ -355,7 +354,7 @@ eServiceMP3::~eServiceMP3() } } -DEFINE_REF(eServiceMP3); +DEFINE_REF(eServiceMP3); RESULT eServiceMP3::connectEvent(const Slot2 &event, ePtr &connection) { @@ -366,25 +365,30 @@ RESULT eServiceMP3::connectEvent(const Slot2 &event, RESULT eServiceMP3::start() { ASSERT(m_state == stIdle); - + m_state = stRunning; if (m_gst_playbin) { eDebug("eServiceMP3::starting pipeline"); gst_element_set_state (m_gst_playbin, GST_STATE_PLAYING); } + m_event(this, evStart); + return 0; } RESULT eServiceMP3::stop() { ASSERT(m_state != stIdle); + if (m_state == stStopped) return -1; + eDebug("eServiceMP3::stop %s", m_ref.path.c_str()); gst_element_set_state(m_gst_playbin, GST_STATE_NULL); m_state = stStopped; + return 0; } @@ -522,11 +526,11 @@ RESULT eServiceMP3::trickSeek(gdouble ratio) return seekRelative(0, 0); GstEvent *s_event; - GstSeekFlags flags; + int flags; flags = GST_SEEK_FLAG_NONE; - flags |= GstSeekFlags (GST_SEEK_FLAG_FLUSH); + flags |= GST_SEEK_FLAG_FLUSH; // flags |= GstSeekFlags (GST_SEEK_FLAG_ACCURATE); - flags |= GstSeekFlags (GST_SEEK_FLAG_KEY_UNIT); + flags |= GST_SEEK_FLAG_KEY_UNIT; // flags |= GstSeekFlags (GST_SEEK_FLAG_SEGMENT); // flags |= GstSeekFlags (GST_SEEK_FLAG_SKIP); @@ -537,13 +541,13 @@ RESULT eServiceMP3::trickSeek(gdouble ratio) if ( ratio >= 0 ) { - s_event = gst_event_new_seek (ratio, GST_FORMAT_TIME, flags, GST_SEEK_TYPE_SET, pos, GST_SEEK_TYPE_SET, len); + s_event = gst_event_new_seek (ratio, GST_FORMAT_TIME, (GstSeekFlags)flags, GST_SEEK_TYPE_SET, pos, GST_SEEK_TYPE_SET, len); eDebug("eServiceMP3::trickSeek with rate %lf to %" GST_TIME_FORMAT " ", ratio, GST_TIME_ARGS (pos)); } else { - s_event = gst_event_new_seek (ratio, GST_FORMAT_TIME, GST_SEEK_FLAG_SKIP|GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_NONE, -1, GST_SEEK_TYPE_NONE, -1); + s_event = gst_event_new_seek (ratio, GST_FORMAT_TIME, (GstSeekFlags)(GST_SEEK_FLAG_SKIP|GST_SEEK_FLAG_FLUSH), GST_SEEK_TYPE_NONE, -1, GST_SEEK_TYPE_NONE, -1); } if (!gst_element_send_event ( GST_ELEMENT (m_gst_playbin), s_event)) @@ -899,10 +903,7 @@ PyObject *eServiceMP3::getInfoObject(int w) default: break; } - gdouble value; - if ( !tag || !m_stream_tags ) - value = 0.0; - PyObject *pyValue; + if ( isBuffer ) { const GValue *gv_buffer = gst_tag_list_get_value_index(m_stream_tags, tag, 0); @@ -910,16 +911,17 @@ PyObject *eServiceMP3::getInfoObject(int w) { GstBuffer *buffer; buffer = gst_value_get_buffer (gv_buffer); - pyValue = PyBuffer_FromMemory(GST_BUFFER_DATA(buffer), GST_BUFFER_SIZE(buffer)); + return PyBuffer_FromMemory(GST_BUFFER_DATA(buffer), GST_BUFFER_SIZE(buffer)); } } else { + gdouble value = 0.0; gst_tag_list_get_double(m_stream_tags, tag, &value); - pyValue = PyFloat_FromDouble(value); + return PyFloat_FromDouble(value); } - return pyValue; + return 0; } RESULT eServiceMP3::audioChannel(ePtr &ptr) @@ -947,16 +949,24 @@ int eServiceMP3::getNumberOfTracks() int eServiceMP3::getCurrentTrack() { + if (m_currentAudioStream == -1) + g_object_get (G_OBJECT (m_gst_playbin), "current-audio", &m_currentAudioStream, NULL); return m_currentAudioStream; } RESULT eServiceMP3::selectTrack(unsigned int i) { - int ret = selectAudioStream(i); - /* flush */ pts_t ppos; getPlayPosition(ppos); - seekTo(ppos); + ppos -= 90000; + if (ppos < 0) + ppos = 0; + + int ret = selectAudioStream(i); + if (!ret) { + /* flush */ + seekTo(ppos); + } return ret; } @@ -1181,8 +1191,7 @@ void eServiceMP3::gstBusCall(GstBus *bus, GstMessage *msg) if (!caps) continue; GstStructure* str = gst_caps_get_structure(caps, 0); - gchar *g_type; - g_type = gst_structure_get_name(str); + const gchar *g_type = gst_structure_get_name(str); eDebug("AUDIO STRUCT=%s", g_type); audio.type = gstCheckAudioPad(str); g_codec = g_strdup(g_type);