self.currList = "filelist"
self.coverArtFileName = ""
+ self.isAudioCD = False
self.playlistIOInternal = PlaylistIOInternal()
list = self.playlistIOInternal.open(resolveFilename(SCOPE_CONFIG, "playlist.e2pls"))
self.playlistIOInternal.clear()
for x in self.playlist.list:
self.playlistIOInternal.addService(ServiceReference(x[0]))
- self.playlistIOInternal.save(resolveFilename(SCOPE_CONFIG, "playlist.e2pls"))
+ if not self.isAudioCD:
+ self.playlistIOInternal.save(resolveFilename(SCOPE_CONFIG, "playlist.e2pls"))
self.close()
def checkSkipShowHideLock(self):
mp.playServiceRefEntry(ref)
mp.playlist.updateList()
+def audioCD_open(list, session, **kwargs):
+ from enigma import eServiceReference
+
+ mp = session.open(MediaPlayer)
+
+ mp.playlist.clear()
+ mp.isAudioCD = True
+
+ mp.switchToPlayList()
+ for file in list:
+ ref = eServiceReference(4097, 0, file.path)
+ mp.playlist.addFile(ref)
+
+ # TODO: rather play first than last file?
+ mp.playServiceRefEntry(ref)
+ mp.playlist.updateList()
+ mp.changeEntry(0)
+
def filescan(**kwargs):
from Components.Scanner import Scanner, ScanPath
return [
name = "Music",
description = "Play Music...",
openfnc = filescan_open,
+ ),
+ Scanner(mimetypes = ["audio/x-cda", "audio/x-wav"],
+ paths_to_scan =
+ [
+ ScanPath(path = "", with_subdirs = False),
+ ],
+ name = "Audio-CD",
+ description = "Play Audio-CD...",
+ openfnc = audioCD_open,
)
]
if (is_audio)
{
+ queue_audio = gst_element_factory_make("queue", "queue_audio");
+
if (!is_mp3)
{
/* decodebin has dynamic pads. When they get created, we connect them to the audio bin */
g_signal_connect (decoder, "new-decoded-pad", G_CALLBACK(gstCBnewPad), this);
g_signal_connect (decoder, "unknown-type", G_CALLBACK(gstCBunknownType), this);
+ g_object_set (G_OBJECT (sink), "preroll-queue-len", 80, NULL);
}
/* gst_bin will take the 'floating references' */
gst_bin_add_many (GST_BIN (m_gst_pipeline),
- source, decoder, NULL);
+ source, queue_audio, decoder, NULL);
if (filter)
{
g_signal_connect (filter, "pad-added", G_CALLBACK(gstCBfilterPadAdded), this);
} else
/* in decodebin's case we can just connect the source with the decodebin, and decodebin will take care about id3demux (or whatever is required) */
- gst_element_link(source, decoder);
+ gst_element_link_many(source, queue_audio, decoder, NULL);
/* create audio bin with the audioconverter, the capsfilter and the audiosink */
m_gst_audio = gst_bin_new ("audiobin");
/* in mad's case, we can directly connect the decoder to the audiobin. otherwise, we do this in gstCBnewPad */
if (is_mp3)
gst_element_link(decoder, m_gst_audio);
- } else
+ } else /* is_video */
{
gst_bin_add_many(GST_BIN(m_gst_pipeline), source, mpegdemux, audio, queue_audio, video, queue_video, NULL);
gst_element_link(source, mpegdemux);
int eServiceMP3::getInfo(int w)
{
+ gchar *tag = 0;
+
switch (w)
{
case sTitle:
case sTracknumber:
case sGenre:
return resIsString;
-
+ case sCurrentTitle:
+ tag = GST_TAG_TRACK_NUMBER;
+ break;
+ case sTotalTitles:
+ tag = GST_TAG_TRACK_COUNT;
+ break;
default:
return resNA;
}
+
+ if (!m_stream_tags || !tag)
+ return 0;
+
+ guint value;
+ if (gst_tag_list_get_uint(m_stream_tags, tag, &value))
+ return (int) value;
+
+ return 0;
+
}
std::string eServiceMP3::getInfoString(int w)
{
if (msg)
{
- gchar *string = gst_structure_to_string(gst_message_get_structure(msg));
- eDebug("gst_message: %s", string);
- g_free(string);
+ if (gst_message_get_structure(msg))
+ {
+ gchar *string = gst_structure_to_string(gst_message_get_structure(msg));
+ eDebug("gst_message: %s", string);
+ g_free(string);
+ }
+ else
+ eDebug("gst_message: %s (without structure)", GST_MESSAGE_TYPE_NAME(msg));
}
switch (GST_MESSAGE_TYPE (msg))
GstPad *audiopad;
/* only link once */
- audiopad = gst_element_get_request_pad (_this->m_gst_audio, "sink");
- if (GST_PAD_IS_LINKED (audiopad)) {
+ audiopad = gst_element_get_static_pad (_this->m_gst_audio, "sink");
+ if ( !audiopad || GST_PAD_IS_LINKED (audiopad)) {
eDebug("audio already linked!");
g_object_unref (audiopad);
return;