summaryrefslogtreecommitdiffstats
path: root/akode/lib/sink.h
diff options
context:
space:
mode:
Diffstat (limited to 'akode/lib/sink.h')
-rw-r--r--akode/lib/sink.h109
1 files changed, 109 insertions, 0 deletions
diff --git a/akode/lib/sink.h b/akode/lib/sink.h
new file mode 100644
index 0000000..9946127
--- /dev/null
+++ b/akode/lib/sink.h
@@ -0,0 +1,109 @@
+/* aKode: Sink abstract-type
+
+ Copyright (C) 2004 Allan Sandfeld Jensen <kde@carewolf.com>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef _AKODE_SINK_H
+#define _AKODE_SINK_H
+
+#include "pluginhandler.h"
+
+#include "akode_export.h"
+
+namespace aKode {
+
+class AudioFrame;
+class AudioBuffer;
+class AudioConfiguration;
+
+
+//! A generic interface for all sinks
+
+/*!
+ * Sinks are where an audiostream goes. It can in aKodeLib be either an
+ * encoder or an audio-output such as ALSA or OSS.
+ */
+class AKODE_EXPORT Sink {
+public:
+ virtual ~Sink() {};
+ /*!
+ * Opens the sink for playing and returns true if succesfull.
+ */
+ virtual bool open() = 0;
+ /*!
+ * Closes the sink and releases any held resources or processes.
+ */
+ virtual void close() {};
+ /*!
+ * Tries to configure the sink for the configuration \a config.
+ * Returns 0 if a perfect match was possible, positive if a close
+ * match was possible, and negative to indicate complete failure.
+ */
+ virtual int setAudioConfiguration(const AudioConfiguration* config) = 0;
+ /*!
+ * Returns the configuration the sink currently expects.
+ */
+ virtual const AudioConfiguration* audioConfiguration() const = 0;
+ /*!
+ * Writes one frame to the sink. If the frame has a different configuration
+ * than the sink expects, the result is undefined.
+ *
+ * Some sinks might handle automatic reconfiguration gracefully, but this
+ * will be plugin-specific and cannot be generally relied upon.
+ */
+ virtual bool writeFrame(AudioFrame* frame) = 0;
+ /*!
+ * Pauses buffer-playback in the sink in case it has a buffer of significance.
+ * Notice that not all sinks are capable of precise pausing.
+ */
+ virtual void pause() {};
+ /*!
+ * Resume from a paused state
+ */
+ virtual void resume() {};
+};
+
+class SinkPlugin {
+public:
+ /*!
+ * Asks the plugin to open a Sink, returns 0 if the
+ * plugin could not.
+ */
+ virtual Sink* openSink() = 0;
+};
+
+class AKODE_EXPORT SinkPluginHandler : public PluginHandler, public SinkPlugin {
+public:
+ static list<string> listSinkPlugins();
+
+ SinkPluginHandler() : sink_plugin(0) {};
+ SinkPluginHandler(const string name);
+ Sink* openSink();
+ /*!
+ * Loads the sink-plugin named \a name (alsa,oss..)
+ */
+ virtual bool load(const string name);
+ virtual void unload();
+ bool isLoaded() { return sink_plugin != 0; };
+protected:
+ SinkPlugin* sink_plugin;
+};
+
+} // namespace
+
+#endif