[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    kdesupport/akode/lib
From:       Allan Sandfeld Jensen <kde () carewolf ! com>
Date:       2005-07-28 14:25:05
Message-ID: 1122560705.898298.31952.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 439614 by carewolf:

Improve Player interface
- Make the used resampler and decoder customizable.
- Do not export std::string interface. Fixes crashes for stupid Gentoo users that \
                shouldn't compile their own packages.
- Use mmap'ed files when available.


 M  +60 -15    player.cpp  
 M  +11 -5     player.h  


--- trunk/kdesupport/akode/lib/player.cpp #439613:439614
@@ -26,6 +26,7 @@
 #include "audiobuffer.h"
 #include "decoder.h"
 #include "buffered_decoder.h"
+#include "mmapfile.h"
 #include "localfile.h"
 #include "volumefilter.h"
 
@@ -55,6 +56,8 @@
                    , volume_filter(0)
                    , sink(0)
                    , manager(0)
+                   , decoder_plugin(0)
+                   , resampler_plugin(0)
                    , sample_rate(0)
                    , state(Closed)
                    , halt(false)
@@ -74,6 +77,9 @@
     Sink *sink;
     Player::Manager *manager;
 
+    const char* decoder_plugin;
+    const char* resampler_plugin;
+
     SinkPluginHandler sink_handler;
     DecoderPluginHandler decoder_handler;
     ResamplerPluginHandler resampler_handler;
@@ -200,7 +206,7 @@
     delete d;
 }
 
-bool Player::open(string sinkname) {
+bool Player::open(const char* sinkname) {
     if (state() != Closed)
         close();
 
@@ -236,7 +242,7 @@
     setState(Closed);
 }
 
-bool Player::load(string filename) {
+bool Player::load(const char* filename) {
     if (state() == Closed) return false;
 
     if (state() == Paused || state() == Playing)
@@ -247,21 +253,44 @@
 
     assert(state() == Open);
 
+    d->src = new MMapFile(filename);
+    // Test if the file _can_ be mmaped
+    if (!d->src->openRO()) {
+        delete d->src;
+        d->src = new LocalFile(filename);
+        if (!d->src->openRO()) {
+            AKODE_DEBUG("Could not open " << filename);
+            delete d->src;
+            d->src = 0;
+            return false;
+        }
+    }
+    // Some of the later code expects it to be closed
+    d->src->close();
+
 //    d->src = new MMapFile(filename.c_str());
-    d->src = new LocalFile(filename.c_str());
+//    d->src = new LocalFile(filename.c_str());
 
-    string format = Magic::detectFile(d->src);
-    if (!format.empty())
-    	AKODE_DEBUG("Guessed format: " << format)
-    else {
-    	AKODE_DEBUG("akode: Cannot detect mimetype");
-        delete d->src;
-        d->src = 0;
-        return false;
+    if (d->decoder_plugin) {
+        if (!d->decoder_handler.load(d->decoder_plugin))
+            AKODE_DEBUG("Could not load " << d->decoder_plugin << "-decoder");
     }
 
-    if (!d->decoder_handler.load(format)) {
-    	AKODE_DEBUG("akode: Could not load " << format << "-decoder");
+    if (!d->decoder_handler.isLoaded()) {
+        string format = Magic::detectFile(d->src);
+        if (!format.empty())
+            AKODE_DEBUG("Guessed format: " << format)
+        else {
+            AKODE_DEBUG("Cannot detect mimetype");
+            delete d->src;
+            d->src = 0;
+            return false;
+        }
+        if (!d->decoder_handler.load(format))
+            AKODE_DEBUG("Could not load " << format << "-decoder");
+    }
+
+    if (!d->decoder_handler.isLoaded()) {
         delete d->src;
         d->src = 0;
         return false;
@@ -304,8 +333,14 @@
         d->sample_rate = d->sink->audioConfiguration()->sample_rate;
         if (d->sample_rate != first_frame.sample_rate) {
             if (!d->resampler) {
-                d->resampler_handler.load("fast");
-                d->resampler = d->resampler_handler.openResampler();
+                if (d->resampler_plugin) {
+                    d->resampler_handler.load(d->resampler_plugin);
+                    d->resampler = d->resampler_handler.openResampler();
+                }
+                if (!d->resampler) {
+                    d->resampler_handler.load("fast");
+                    d->resampler = d->resampler_handler.openResampler();
+                }
             }
             d->resampler->setSampleRate(d->sample_rate);
         }
@@ -531,6 +566,16 @@
     return d->state;
 }
 
+void Player::setDecoderPlugin(const char* plugin) {
+    if (plugin && strncmp(plugin, "auto", 4) == 0) plugin = 0;
+    d->decoder_plugin = plugin;
+}
+
+void Player::setResamplerPlugin(const char* plugin) {
+    if (plugin && strncmp(plugin, "fast", 4) == 0) plugin = 0;
+    d->resampler_plugin = plugin;
+}
+
 void Player::setManager(Manager *manager) {
     d->manager = manager;
 }
--- trunk/kdesupport/akode/lib/player.h #439613:439614
@@ -20,12 +20,9 @@
 
 #ifndef _AKODE_PLAYER_H
 #define _AKODE_PLAYER_H
-#include <string>
 
 #include "akode_export.h"
 
-using std::string;
-
 namespace aKode {
 
 class File;
@@ -51,7 +48,7 @@
      *
      * State: \a Closed -> \a Open
      */
-    bool open(string sinkname);
+    bool open(const char* sinkname);
     /*!
      * Closes the player and releases the sink
      * Valid in all states.
@@ -66,7 +63,7 @@
      *
      * State: \a Open -> \a Loaded
      */
-    bool load(string filename);
+    bool load(const char* filename);
     /*!
      * Unload the file and release any resources allocated while loaded
      *
@@ -186,6 +183,15 @@
      */
     void setManager(Manager *manager);
 
+    /*!
+     * Sets the decoder plugin to use. Default is auto-detect.
+     */
+    void setDecoderPlugin(const char* plugin);
+    /*!
+     * Sets the resampler plugin to use. Default is "fast".
+     */
+    void setResamplerPlugin(const char* plugin);
+
     struct private_data;
 private:
     private_data *d;


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic