Files
4k_synthwave/src/song.cpp
2025-06-15 10:24:37 +03:00

115 lines
2.3 KiB
C++

#include <string>
#include "song.h"
#pragma comment(lib, "strmiids.lib")
#pragma comment(lib, "ComCtl32.lib")
#pragma comment(lib, "winmm.lib")
#pragma comment(lib, "strmbase.lib")
using namespace Leviathan;
Song::Song()
{
}
Song::Song(LPCWSTR path) : playing(false)
{
__int64 trackLength;
IGraphBuilder * graph;
CoInitialize(0);
CoCreateInstance(CLSID_FilterGraph, 0, CLSCTX_INPROC, IID_IGraphBuilder, (void**)&graph);
graph->QueryInterface(IID_IMediaControl, (void**)&mediaControl);
graph->QueryInterface(IID_IMediaSeeking, (void**)&mediaSeeking);
graph->QueryInterface(IID_IBasicAudio, (void**)&audioControl);
audioControl->put_Volume(long(-90000));
HRESULT hr = graph->RenderFile(path, 0);
if (hr == S_OK)
printf("Audio file opened successfully\n");
else
printf("Failed to open audio file\n");
graph->Release();
mediaSeeking->SetTimeFormat(&TIME_FORMAT_MEDIA_TIME);
mediaSeeking->GetDuration(&trackLength);
length = (long double)(trackLength) / (long double)10000000.0;
__int64 position = 0;
mediaSeeking->SetPositions(&position, AM_SEEKING_AbsolutePositioning, &position, AM_SEEKING_NoPositioning);
pause();
}
Song::~Song()
{
audioControl->Release();
mediaControl->Release();
mediaSeeking->Release();
}
int Song::play()
{
mediaControl->Run();
playing = true;
return 0;
}
int Song::pause()
{
mediaControl->Stop();
playing = false;
return 0;
}
int Song::toggle()
{
playing = !playing;
if (playing)
play();
else
pause();
return 0;
}
bool Song::is_playing()
{
OAFilterState state;
mediaControl->GetState(INFINITE, &state);
__int64 trackLength, position;
mediaSeeking->GetDuration(&trackLength);
mediaSeeking->GetCurrentPosition(&position);
return position<trackLength;
}
int Song::seek(long double position)
{
if (position>length)
position = length;
if (position<.0)
position = .0;
__int64 seekPosition = __int64(10000000.0*position);
if (playing)
mediaControl->Stop();
mediaSeeking->SetPositions(&seekPosition, AM_SEEKING_AbsolutePositioning, &seekPosition, AM_SEEKING_NoPositioning);
if (playing)
mediaControl->Run();
return 0;
}
long double Song::getTime()
{
__int64 position;
mediaSeeking->GetCurrentPosition(&position);
return (long double)(position) / (long double)10000000.0;
}
long double Song::getLength()
{
return length;
}