banshee r3624 - in trunk/banshee: . libbanshee src/Extensions src/Extensions/Banshee.Daap
- From: abock svn gnome org
- To: svn-commits-list gnome org
- Subject: banshee r3624 - in trunk/banshee: . libbanshee src/Extensions src/Extensions/Banshee.Daap
- Date: Mon, 31 Mar 2008 21:25:47 +0100 (BST)
Author: abock
Date: Mon Mar 31 21:25:47 2008
New Revision: 3624
URL: http://svn.gnome.org/viewvc/banshee?rev=3624&view=rev
Log:
2008-03-31 Aaron Bockover <abock gnome org>
* libbanshee/banshee-player.c:
* libbanshee/banshee-player.h:
* libbanshee/banshee-player-missing-elements.c:
* libbanshee/banshee-player-missing-elements.h: Moved code that handles
missing plugins/plugin installation into a separate module
Added:
trunk/banshee/libbanshee/banshee-player-missing-elements.c
trunk/banshee/libbanshee/banshee-player-missing-elements.h
Modified:
trunk/banshee/ChangeLog
trunk/banshee/libbanshee/Makefile.am
trunk/banshee/libbanshee/banshee-player.c
trunk/banshee/libbanshee/banshee-player.h
trunk/banshee/libbanshee/libbanshee.mdp
trunk/banshee/src/Extensions/Banshee.Daap/Banshee.Daap.mdp
trunk/banshee/src/Extensions/Banshee.Daap/Makefile.am
trunk/banshee/src/Extensions/Extensions.mds
Modified: trunk/banshee/libbanshee/Makefile.am
==============================================================================
--- trunk/banshee/libbanshee/Makefile.am (original)
+++ trunk/banshee/libbanshee/Makefile.am Mon Mar 31 21:25:47 2008
@@ -14,6 +14,7 @@
libbanshee_la_SOURCES = \
banshee-player.c \
banshee-player-cdda.c \
+ banshee-player-missing-elements.c \
gst-cd-rip-0.10.c \
gst-misc-0.10.c \
gst-transcode-0.10.c
@@ -21,6 +22,7 @@
noinst_HEADERS = \
banshee-player.h \
banshee-player-cdda.h \
+ banshee-player-missing-elements.h \
gst-cd-rip.h \
gst-misc.h \
gst-transcode.h
Added: trunk/banshee/libbanshee/banshee-player-missing-elements.c
==============================================================================
--- (empty file)
+++ trunk/banshee/libbanshee/banshee-player-missing-elements.c Mon Mar 31 21:25:47 2008
@@ -0,0 +1,174 @@
+//
+// banshee-player-missing-elements.c
+//
+// Author:
+// Aaron Bockover <abockover novell com>
+//
+// Copyright (C) 2005-2008 Novell, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+#include "banshee-player-missing-elements.h"
+
+// ---------------------------------------------------------------------------
+// Private Functions
+// ---------------------------------------------------------------------------
+
+static gchar **
+bp_slist_to_ptr_array (const GSList *elements)
+{
+ GPtrArray *vector = g_ptr_array_new ();
+
+ while (elements != NULL) {
+ g_ptr_array_add (vector, g_strdup (elements->data));
+ elements = elements->next;
+ }
+
+ g_ptr_array_add (vector, NULL);
+ return (gchar **)g_ptr_array_free (vector, FALSE);
+}
+
+static void
+bp_slist_destroy (GSList *list)
+{
+ GSList *node = list;
+
+ for (; node != NULL; node = node->next) {
+ g_free (node->data);
+ }
+
+ g_slist_free (list);
+}
+
+#ifdef HAVE_GST_PBUTILS
+
+static void
+bp_missing_elements_handle_install_failed (BansheePlayer *player)
+{
+ g_return_if_fail (IS_BANSHEE_PLAYER (player));
+
+ bp_slist_destroy (player->missing_element_details);
+ player->missing_element_details = NULL;
+ gst_element_set_state (player->playbin, GST_STATE_READY);
+
+ if (player->error_cb != NULL) {
+ player->error_cb (player, GST_CORE_ERROR, GST_CORE_ERROR_MISSING_PLUGIN, NULL, NULL);
+ }
+}
+
+static void
+bp_missing_elements_handle_install_result (GstInstallPluginsReturn result, gpointer data)
+{
+ BansheePlayer *player = (BansheePlayer *)data;
+
+ g_return_if_fail (IS_BANSHEE_PLAYER (player));
+
+ // TODO: Actually handle a successful plugin installation
+ // if (result == GST_INSTALL_PLUGINS_SUCCESS) {
+ // }
+
+ player->install_plugins_noprompt = TRUE;
+
+ bp_missing_elements_handle_install_failed (player);
+
+ gst_install_plugins_context_free (player->install_plugins_context);
+ player->install_plugins_context = NULL;
+}
+
+#endif
+
+// ---------------------------------------------------------------------------
+// Internal Functions
+// ---------------------------------------------------------------------------
+
+void _bp_missing_elements_destroy (BansheePlayer *player)
+{
+ g_return_if_fail (IS_BANSHEE_PLAYER (player));
+
+ bp_slist_destroy (player->missing_element_details);
+
+ #ifdef HAVE_GST_PBUTILS
+ if (player->install_plugins_context != NULL) {
+ gst_install_plugins_context_free (player->install_plugins_context);
+ }
+ #endif
+}
+
+void
+_bp_missing_elements_process_message (BansheePlayer *player, GstMessage *message)
+{
+ #ifdef HAVE_GST_PBUTILS
+ g_return_if_fail (IS_BANSHEE_PLAYER (player));
+ g_return_if_fail (message != NULL);
+
+ if (gst_is_missing_plugin_message (message)) {
+ player->missing_element_details = g_slist_append (player->missing_element_details,
+ gst_missing_plugin_message_get_installer_detail (message));
+ }
+ #endif
+}
+
+void
+_bp_missing_elements_handle_state_changed (BansheePlayer *player, GstState old, GstState new)
+{
+ #ifdef HAVE_GST_PBUTILS
+ GstInstallPluginsReturn install_return;
+ gchar **details;
+
+ if (old != GST_STATE_READY || new != GST_STATE_PAUSED) {
+ return;
+ }
+
+ g_return_if_fail (IS_BANSHEE_PLAYER (player));
+
+ if (player->missing_element_details == NULL) {
+ return;
+ }
+
+ g_return_if_fail (player->install_plugins_context != NULL);
+
+ if (player->install_plugins_noprompt) {
+ bp_missing_elements_handle_install_failed (player);
+ return;
+ }
+
+ details = bp_slist_to_ptr_array (player->missing_element_details);
+ player->install_plugins_context = gst_install_plugins_context_new ();
+
+ #ifdef GDK_WINDOWING_X11
+ if (player->window != NULL) {
+ gst_install_plugins_context_set_xid (player->install_plugins_context, GDK_WINDOW_XWINDOW (player->window));
+ }
+ #endif
+
+ install_return = gst_install_plugins_async (details, player->install_plugins_context,
+ bp_missing_elements_handle_install_result, player);
+
+ if (install_return != GST_INSTALL_PLUGINS_STARTED_OK) {
+ bp_missing_elements_handle_install_failed (player);
+
+ gst_install_plugins_context_free (player->install_plugins_context);
+ player->install_plugins_context = NULL;
+ }
+
+ g_strfreev (details);
+ #endif
+}
Added: trunk/banshee/libbanshee/banshee-player-missing-elements.h
==============================================================================
--- (empty file)
+++ trunk/banshee/libbanshee/banshee-player-missing-elements.h Mon Mar 31 21:25:47 2008
@@ -0,0 +1,38 @@
+//
+// banshee-player-missing-elements.h
+//
+// Author:
+// Aaron Bockover <abockover novell com>
+//
+// Copyright (C) 2005-2008 Novell, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+#ifndef _BANSHEE_PLAYER_MISSING_ELEMENTS_H
+#define _BANSHEE_PLAYER_MISSING_ELEMENTS_H
+
+#include "banshee-player.h"
+
+void _bp_missing_elements_destroy (BansheePlayer *player);
+void _bp_missing_elements_process_message (BansheePlayer *player, GstMessage *message);
+void _bp_missing_elements_handle_state_changed (BansheePlayer *player, GstState old, GstState new);
+
+#endif /* _BANSHEE_PLAYER_MISSING_ELEMENTS_H */
Modified: trunk/banshee/libbanshee/banshee-player.c
==============================================================================
--- trunk/banshee/libbanshee/banshee-player.c (original)
+++ trunk/banshee/libbanshee/banshee-player.c Mon Mar 31 21:25:47 2008
@@ -27,10 +27,9 @@
* DEALINGS IN THE SOFTWARE.
*/
-#define _BANSHEE_PLAYER_C
-
#include "banshee-player.h"
#include "banshee-player-cdda.h"
+#include "banshee-player-missing-elements.h"
#ifdef GDK_WINDOWING_X11
static gboolean bp_find_xoverlay (BansheePlayer *player);
@@ -54,20 +53,6 @@
}
}
-// private methods
-
-static void
-bp_nuke_slist(GSList *list)
-{
- GSList *node = list;
-
- for(; node != NULL; node = node->next) {
- g_free(node->data);
- }
-
- g_slist_free(list);
-}
-
static void
bp_destroy_pipeline(BansheePlayer *player)
{
@@ -86,89 +71,6 @@
player->playbin = NULL;
}
-#ifdef HAVE_GST_PBUTILS
-static gchar **
-bp_missing_element_details_vectorize(const GSList *elements)
-{
- GPtrArray *vector = g_ptr_array_new();
-
- while(elements != NULL) {
- g_ptr_array_add(vector, g_strdup(elements->data));
- elements = elements->next;
- }
-
- g_ptr_array_add(vector, NULL);
- return (gchar **)g_ptr_array_free(vector, FALSE);
-}
-
-static void
-bp_handle_missing_elements_failed(BansheePlayer *player)
-{
- bp_nuke_slist(player->missing_element_details);
- player->missing_element_details = NULL;
- gst_element_set_state(player->playbin, GST_STATE_READY);
-
- if(player->error_cb != NULL) {
- player->error_cb(player, GST_CORE_ERROR, GST_CORE_ERROR_MISSING_PLUGIN, NULL, NULL);
- }
-}
-
-static void
-bp_handle_missing_elements_installer_result(GstInstallPluginsReturn result, gpointer data)
-{
- BansheePlayer *player = (BansheePlayer *)data;
-
- g_return_if_fail(IS_BANSHEE_PLAYER(player));
-
- // TODO: Actually handle a successful plugin installation
- // if(result == GST_INSTALL_PLUGINS_SUCCESS) {
- // }
-
- player->install_plugins_noprompt = TRUE;
-
- bp_handle_missing_elements_failed(player);
-
- gst_install_plugins_context_free(player->install_plugins_context);
- player->install_plugins_context = NULL;
-}
-
-static void
-bp_handle_missing_elements(BansheePlayer *player)
-{
- GstInstallPluginsReturn install_return;
- gchar **details;
-
- if(player->install_plugins_context != NULL) {
- return;
- } else if(player->install_plugins_noprompt) {
- bp_handle_missing_elements_failed(player);
- return;
- }
-
- details = bp_missing_element_details_vectorize(player->missing_element_details);
- player->install_plugins_context = gst_install_plugins_context_new();
-
- #ifdef GDK_WINDOWING_X11
- if(player->window != NULL) {
- gst_install_plugins_context_set_xid(player->install_plugins_context,
- GDK_WINDOW_XWINDOW(player->window));
- }
- #endif
-
- install_return = gst_install_plugins_async(details, player->install_plugins_context,
- bp_handle_missing_elements_installer_result, player);
-
- if(install_return != GST_INSTALL_PLUGINS_STARTED_OK) {
- bp_handle_missing_elements_failed(player);
-
- gst_install_plugins_context_free(player->install_plugins_context);
- player->install_plugins_context = NULL;
- }
-
- g_strfreev(details);
-}
-#endif
-
static gboolean
bp_bus_callback(GstBus *bus, GstMessage *message, gpointer data)
{
@@ -200,39 +102,30 @@
break;
}
- #ifdef HAVE_GST_PBUTILS
case GST_MESSAGE_ELEMENT: {
- if(gst_is_missing_plugin_message(message)) {
- player->missing_element_details = g_slist_append(player->missing_element_details,
- gst_missing_plugin_message_get_installer_detail(message));
- }
-
+ _bp_missing_elements_process_message (player, message);
break;
}
- #endif
- case GST_MESSAGE_EOS:
+ case GST_MESSAGE_EOS: {
if(player->eos_cb != NULL) {
player->eos_cb(player);
}
break;
+ }
+
case GST_MESSAGE_STATE_CHANGED: {
GstState old, new, pending;
- gst_message_parse_state_changed(message, &old, &new, &pending);
+ gst_message_parse_state_changed (message, &old, &new, &pending);
- #ifdef HAVE_GST_PBUTILS
- if(old == GST_STATE_READY && new == GST_STATE_PAUSED) {
- if(player->missing_element_details != NULL) {
- bp_handle_missing_elements(player);
- }
- }
- #endif
+ _bp_missing_elements_handle_state_changed (player, old, new);
- if(player->state_changed_cb != NULL) {
- player->state_changed_cb(player, old, new, pending);
+ if (player->state_changed_cb != NULL) {
+ player->state_changed_cb (player, old, new, pending);
}
break;
}
+
case GST_MESSAGE_BUFFERING: {
const GstStructure *buffering_struct;
gint buffering_progress = 0;
@@ -476,35 +369,30 @@
}
void
-bp_free(BansheePlayer *player)
+bp_free (BansheePlayer *player)
{
- g_return_if_fail(IS_BANSHEE_PLAYER(player));
+ g_return_if_fail (IS_BANSHEE_PLAYER (player));
g_mutex_free (player->mutex);
- if(GST_IS_OBJECT(player->playbin)) {
+ if (GST_IS_OBJECT (player->playbin)) {
player->target_state = GST_STATE_NULL;
- gst_element_set_state(player->playbin, GST_STATE_NULL);
- gst_object_unref(GST_OBJECT(player->playbin));
+ gst_element_set_state (player->playbin, GST_STATE_NULL);
+ gst_object_unref (GST_OBJECT (player->playbin));
}
- if(player->cdda_device != NULL) {
- g_free(player->cdda_device);
- player->cdda_device = NULL;
+ if (player->cdda_device != NULL) {
+ g_free (player->cdda_device);
}
- bp_nuke_slist(player->missing_element_details);
- player->missing_element_details = NULL;
-
- #ifdef HAVE_GST_PBUTILS
- if(player->install_plugins_context != NULL) {
- gst_install_plugins_context_free(player->install_plugins_context);
- player->install_plugins_context = NULL;
- }
- #endif
+ _bp_missing_elements_destroy (player);
+
+ memset (player, 0, sizeof (BansheePlayer));
- g_free(player);
+ g_free (player);
player = NULL;
+
+ bp_debug ("bp: disposed player");
}
void
Modified: trunk/banshee/libbanshee/banshee-player.h
==============================================================================
--- trunk/banshee/libbanshee/banshee-player.h (original)
+++ trunk/banshee/libbanshee/banshee-player.h Mon Mar 31 21:25:47 2008
@@ -5,22 +5,17 @@
# include "config.h"
#endif
-#include <stdio.h>
-#include <stdlib.h>
#include <string.h>
-#include <glib.h>
-#include <glib/gstdio.h>
-
#include <gst/gst.h>
+#include <gdk/gdk.h>
#ifdef HAVE_GST_PBUTILS
# include <gst/pbutils/pbutils.h>
#endif
-#include <gdk/gdk.h>
#ifdef GDK_WINDOWING_X11
-#include <gdk/gdkx.h>
-#include <gst/interfaces/xoverlay.h>
+# include <gdk/gdkx.h>
+# include <gst/interfaces/xoverlay.h>
#endif
#define IS_BANSHEE_PLAYER(e) (e != NULL)
Modified: trunk/banshee/libbanshee/libbanshee.mdp
==============================================================================
--- trunk/banshee/libbanshee/libbanshee.mdp (original)
+++ trunk/banshee/libbanshee/libbanshee.mdp Mon Mar 31 21:25:47 2008
@@ -18,6 +18,8 @@
<File name="gst-misc.h" subtype="Code" buildaction="Nothing" />
<File name="gst-transcode.h" subtype="Code" buildaction="Nothing" />
<File name="banshee-player-cdda.c" subtype="Code" buildaction="Compile" />
+ <File name="banshee-player-missing-elements.c" subtype="Code" buildaction="Compile" />
+ <File name="banshee-player-missing-elements.h" subtype="Code" buildaction="Nothing" />
</Contents>
<compiler ctype="GccCompiler" />
<MonoDevelop.Autotools.MakefileInfo IntegrationEnabled="True" RelativeMakefileName="Makefile.am">
Modified: trunk/banshee/src/Extensions/Banshee.Daap/Banshee.Daap.mdp
==============================================================================
--- trunk/banshee/src/Extensions/Banshee.Daap/Banshee.Daap.mdp (original)
+++ trunk/banshee/src/Extensions/Banshee.Daap/Banshee.Daap.mdp Mon Mar 31 21:25:47 2008
@@ -8,7 +8,28 @@
</Configuration>
</Configurations>
<Contents>
- <File name="Banshee.Daap.addin.xml" subtype="Code" buildaction="EmbedAsResource" />
+ <File name="Banshee.Daap/DaapService.cs" subtype="Code" buildaction="Compile" />
+ <File name="Banshee.Daap/DaapContainerSource.cs" subtype="Code" buildaction="Compile" />
+ <File name="Banshee.Daap/DaapSource.cs" subtype="Code" buildaction="Compile" />
+ <File name="Daap/content-codes" subtype="Code" buildaction="EmbedAsResource" />
+ <File name="Resources/Banshee.Daap.addin.xml" subtype="Code" buildaction="EmbedAsResource" />
+ <File name="Daap/AuthenticationException.cs" subtype="Code" buildaction="Compile" />
+ <File name="Daap/BrokenMD5.cs" subtype="Code" buildaction="Compile" />
+ <File name="Daap/Client.cs" subtype="Code" buildaction="Compile" />
+ <File name="Daap/ContentCodeBag.cs" subtype="Code" buildaction="Compile" />
+ <File name="Daap/ContentFetcher.cs" subtype="Code" buildaction="Compile" />
+ <File name="Daap/ContentParser.cs" subtype="Code" buildaction="Compile" />
+ <File name="Daap/ContentWriter.cs" subtype="Code" buildaction="Compile" />
+ <File name="Daap/Database.cs" subtype="Code" buildaction="Compile" />
+ <File name="Daap/Hasher.cs" subtype="Code" buildaction="Compile" />
+ <File name="Daap/LoginException.cs" subtype="Code" buildaction="Compile" />
+ <File name="Daap/Playlist.cs" subtype="Code" buildaction="Compile" />
+ <File name="Daap/Server.cs" subtype="Code" buildaction="Compile" />
+ <File name="Daap/ServerInfo.cs" subtype="Code" buildaction="Compile" />
+ <File name="Daap/ServiceLocator.cs" subtype="Code" buildaction="Compile" />
+ <File name="Daap/Track.cs" subtype="Code" buildaction="Compile" />
+ <File name="Daap/User.cs" subtype="Code" buildaction="Compile" />
+ <File name="Daap/Utility.cs" subtype="Code" buildaction="Compile" />
</Contents>
<References>
<ProjectReference type="Project" localcopy="True" refto="Banshee.Core" />
@@ -25,4 +46,4 @@
<AsmRefVar />
<ProjectRefVar />
</MonoDevelop.Autotools.MakefileInfo>
-</Project>
+</Project>
\ No newline at end of file
Modified: trunk/banshee/src/Extensions/Banshee.Daap/Makefile.am
==============================================================================
--- trunk/banshee/src/Extensions/Banshee.Daap/Makefile.am (original)
+++ trunk/banshee/src/Extensions/Banshee.Daap/Makefile.am Mon Mar 31 21:25:47 2008
@@ -3,15 +3,31 @@
LINK = $(REF_EXTENSION_DAAP)
INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR)
-SOURCES = \
+SOURCES = \
+ Banshee.Daap/DaapContainerSource.cs \
Banshee.Daap/DaapService.cs \
- Banshee.Daap/DaapContainerSource.cs \
- Banshee.Daap/DaapSource.cs \
- Daap/*.cs
+ Banshee.Daap/DaapSource.cs \
+ Daap/AuthenticationException.cs \
+ Daap/BrokenMD5.cs \
+ Daap/Client.cs \
+ Daap/ContentCodeBag.cs \
+ Daap/ContentFetcher.cs \
+ Daap/ContentParser.cs \
+ Daap/ContentWriter.cs \
+ Daap/Database.cs \
+ Daap/Hasher.cs \
+ Daap/LoginException.cs \
+ Daap/Playlist.cs \
+ Daap/Server.cs \
+ Daap/ServerInfo.cs \
+ Daap/ServiceLocator.cs \
+ Daap/Track.cs \
+ Daap/User.cs \
+ Daap/Utility.cs
-RESOURCES = \
+RESOURCES = \
Daap/content-codes \
- Resources/Banshee.Daap.addin.xml
+ Resources/Banshee.Daap.addin.xml
include $(top_srcdir)/build/build.mk
Modified: trunk/banshee/src/Extensions/Extensions.mds
==============================================================================
--- trunk/banshee/src/Extensions/Extensions.mds (original)
+++ trunk/banshee/src/Extensions/Extensions.mds Mon Mar 31 21:25:47 2008
@@ -21,7 +21,7 @@
<Execute type="None" entry="Banshee.AudioCd" />
</StartMode>
<Entries>
- <Entry filename="Banshee.NotificationArea/Banshee.Daap.mdp" />
+ <Entry filename="Banshee.Daap/Banshee.Daap.mdp" />
<Entry filename="Banshee.NotificationArea/Banshee.NotificationArea.mdp" />
<Entry filename="Banshee.MultimediaKeys/Banshee.MultimediaKeys.mdp" />
<Entry filename="Banshee.PlayQueue/Banshee.PlayQueue.mdp" />
@@ -30,4 +30,4 @@
<Entry filename="Banshee.Bookmarks/Banshee.Bookmarks.mdp" />
<Entry filename="Banshee.AudioCd/Banshee.AudioCd.mdp" />
</Entries>
-</Combine>
\ No newline at end of file
+</Combine>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]