[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