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
This commit is contained in:
1 parent
8a11b0eff0
commit
e653ac87a2
1326 files changed
+154559
-4
No files matched your search
@@ -0,0 +1,257 @@
|
||||
#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);
|
||||
}
|
||||
Reference in new issue
Block a user