-
Notifications
You must be signed in to change notification settings - Fork 1
/
mp3music.cpp
110 lines (89 loc) · 2.21 KB
/
mp3music.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#define WIN32_LEAN_AND_MEAN
#define WIN32_EXTRA_LEAN
#include <Windows.h>
#include <dshow.h>
#include "mp3music.h"
#pragma comment(lib, "strmiids")
Music::Music(LPCWSTR filepath)
{
IPin * pin;
IBaseFilter * src;
//IBasicAudio * audiocontrol;
long long lduration;
IGraphBuilder * graphbuilder;
CoInitialize(0);
CoCreateInstance(CLSID_FilterGraph, 0, CLSCTX_INPROC, IID_IGraphBuilder, (void**)&graphbuilder);
graphbuilder->QueryInterface(IID_IMediaControl, (void**)&mediacontrol);
graphbuilder->QueryInterface(IID_IMediaSeeking, (void**)&mediaseeking);
graphbuilder->QueryInterface(IID_IBasicAudio , (void**)&audiocontrol);
graphbuilder->AddSourceFilter(filepath, L"piisi", &src);
src->FindPin(L"Output", &pin);
graphbuilder->Render(pin);
//audiocontrol->put_Volume((long)-200);
setVolume(-0.2); // only a small reduction to reduce clipping
pin->Release();
src->Release();
//audiocontrol->Release();
//graphbuilder->Release();
mediaseeking->SetTimeFormat(&TIME_FORMAT_MEDIA_TIME);
mediaseeking->GetDuration(&lduration);
duration = (long double)lduration/(long double)10000000.0;
long long pos = 0;
mediaseeking->SetPositions(&pos, AM_SEEKING_AbsolutePositioning, &pos, AM_SEEKING_NoPositioning);
playing = false;
}
Music::~Music()
{
audiocontrol->Release();
mediacontrol->Release();
mediaseeking->Release();
}
int Music::play()
{
mediacontrol->Run();
playing = true;
return 0;
}
int Music::pause()
{
mediacontrol->Pause();
playing = false;
return 0;
}
void Music::togglePlaying() {
if (playing) {
pause();
} else {
play();
}
}
int Music::seek(long double time)
{
long long pos = __int64(10000000.0*min(duration, max(.0,time)));
mediacontrol->Stop();
mediaseeking->SetPositions(&pos, AM_SEEKING_AbsolutePositioning, &pos, AM_SEEKING_NoPositioning);
if (playing) {
mediacontrol->Run();
}
return 0;
}
double Music::getTime()
{
long long res;
mediaseeking->GetCurrentPosition((LONGLONG*)&res);
return (double)(res)/(double)10000000.0;
}
int Music::setVolume(double decibels)
{
audiocontrol->put_Volume(long(decibels * 100.0));
return 0;
}
double Music::getVolume()
{
long vol;
audiocontrol->get_Volume(&vol);
return double(vol)/100.0;
}
double Music::getDuration() {
return duration;
}