Files
Vocaluxe/GstreamerHelper/GstreamerAudio.cpp
T
Stephan Sundermann e653ac87a2 Added initial gstreamer audio playback.
x86 might not work due to misconfiguration because I could not test it since acinerella is broken in x86 currenty. Gstreamer video support is yet to follow.
Please report back any bugs you experience. To compile you will need Visual C++, I hope all files are included
2013-02-09 23:32:02 +01:00

257 lines
5.0 KiB
C++

#include "stdafx.h"
#include "GstreamerAudio.h"
#include "GstreamerAudioStream.h"
#include "gst\gst.h"
#include <string>
#include <sstream>
#include <map>
#include <queue>
#define DllExport extern "C" __declspec(dllexport)
map<int, GstreamerAudioStream*> Streams;
queue<int> IDs;
EXTERN_C IMAGE_DOS_HEADER __ImageBase;
DllExport void SetLogCallback (LogCallback Callback)
{
Log = Callback;
}
DllExport bool Init()
{
for(int i = 0; i < 1000; i++)
{
IDs.push(i);
}
#if _WIN64
SetDllDirectory(L".\\x64\\gstreamer");
#else
SetDllDirectory(L".\\x86\gstreamer");
#endif
gst_init(NULL, NULL);
GstRegistry* registry = gst_registry_get();
#if _WIN64
gst_registry_scan_path(registry, ".\\x64\\gstreamer");
#else
gst_registry_scan_path(registry, ".\\x86\\gstreamer");
#endif
return true;
}
DllExport void SetGlobalVolume(float Volume)
{
map<int, GstreamerAudioStream*>::iterator p;
for(p = Streams.begin(); p != Streams.end(); p++) {
p->second->SetStreamVolume(Volume);
}
}
DllExport int GetStreamCount(void)
{
return Streams.size();
}
DllExport void CloseAll(void)
{
map<int, GstreamerAudioStream*>::iterator p;
for(p = Streams.begin(); p != Streams.end(); p++) {
p->second->Close();
}
}
DllExport int Load(const wchar_t* Media)
{
GstreamerAudioStream *s = new GstreamerAudioStream(IDs.front());
Streams.insert(pair<int, GstreamerAudioStream*> (IDs.front(), s));
IDs.pop();
return s->Load(Media);
}
DllExport int LoadPrescan(const wchar_t* Media, bool Prescan)
{
GstreamerAudioStream *s = new GstreamerAudioStream(IDs.front());
Streams.insert(pair<int, GstreamerAudioStream*> (IDs.front(), s));
IDs.pop();
return s->Load(Media, Prescan);
}
DllExport void Close(int Stream)
{
map<int,GstreamerAudioStream*>::iterator it = Streams.find(Stream);
if(it != Streams.end())
{
delete it->second;
Streams.erase(it);
}
}
DllExport void Play(int Stream)
{
map<int,GstreamerAudioStream*>::iterator it = Streams.find(Stream);
if(it != Streams.end())
{
it->second->Play();
}
}
DllExport void PlayLoop(int Stream, bool Loop)
{
map<int,GstreamerAudioStream*>::iterator it = Streams.find(Stream);
if(it != Streams.end())
{
it->second->Play(Loop);
}
}
DllExport void Pause(int Stream)
{
map<int,GstreamerAudioStream*>::iterator it = Streams.find(Stream);
if(it != Streams.end())
{
it->second->Pause();
}
}
DllExport void Stop(int Stream)
{
map<int,GstreamerAudioStream*>::iterator it = Streams.find(Stream);
if(it != Streams.end())
{
it->second->Stop();
}
}
DllExport void Fade(int Stream, float TargetVolume, float Seconds)
{
map<int,GstreamerAudioStream*>::iterator it = Streams.find(Stream);
if(it != Streams.end())
{
it->second->Fade(TargetVolume, Seconds);
}
}
DllExport void FadeAndPause(int Stream, float TargetVolume, float Seconds)
{
map<int,GstreamerAudioStream*>::iterator it = Streams.find(Stream);
if(it != Streams.end())
{
it->second->FadeAndPause(TargetVolume, Seconds);
}
}
DllExport void FadeAndStop(int Stream, float TargetVolume, float Seconds)
{
map<int,GstreamerAudioStream*>::iterator it = Streams.find(Stream);
if(it != Streams.end())
{
it->second->FadeAndStop(TargetVolume, Seconds);
}
}
DllExport void SetStreamVolume(int Stream, float Volume)
{
map<int,GstreamerAudioStream*>::iterator it = Streams.find(Stream);
if(it != Streams.end())
{
return it->second->SetStreamVolume(Volume);
}
}
DllExport void SetStreamVolumeMax(int Stream, float Volume)
{
map<int,GstreamerAudioStream*>::iterator it = Streams.find(Stream);
if(it != Streams.end())
{
return it->second->SetStreamVolumeMax(Volume);
}
}
DllExport float GetLength(int Stream)
{
map<int,GstreamerAudioStream*>::iterator it = Streams.find(Stream);
if(it != Streams.end())
{
return it->second->GetLength();
}
else return -1.0;
}
DllExport float GetPosition(int Stream)
{
map<int,GstreamerAudioStream*>::iterator it = Streams.find(Stream);
if(it != Streams.end())
{
return it->second->GetPosition();
}
else return -1;
}
DllExport bool IsPlaying(int Stream)
{
map<int,GstreamerAudioStream*>::iterator it = Streams.find(Stream);
if(it != Streams.end())
{
return it->second->IsPlaying();
}
else return false;
}
DllExport bool IsPaused(int Stream)
{
map<int,GstreamerAudioStream*>::iterator it = Streams.find(Stream);
if(it != Streams.end())
{
return it->second->IsPaused();
}
else return false;
}
DllExport bool IsFinished(int Stream)
{
map<int,GstreamerAudioStream*>::iterator it = Streams.find(Stream);
if(it != Streams.end())
{
return it->second->IsFinished();
}
else return false;
}
DllExport void SetPosition(int Stream, float Position)
{
map<int,GstreamerAudioStream*>::iterator it = Streams.find(Stream);
if(it != Streams.end())
{
return it->second->SetPosition(Position);
}
}
DllExport void Update(void)
{
map<int, GstreamerAudioStream*>::iterator p = Streams.begin();
while(p != Streams.end())
{
if(p->second->Closed)
{
delete p->second;
Streams.erase(p++);
}
else {
p->second->Update();
++p;
}
}
}
void LogError(const char* msg)
{
Log(msg);
}