summaryrefslogtreecommitdiff
path: root/libs/revolution/src/homebuttonLib/sound/synvoice.cpp
blob: 0f26528142ada6f0fc083975f07708b84dd47a55 (plain)
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
#include "synprivate.h"


#include <revolution/types.h>

#include "mix.h"

// #include <revolution/ax.h>
// #include <revolution/os.h>



void __HBMSYNClearVoiceReferences(void *p)
{
	AXVPB *axvpb;
	HBMSYNSYNTH *synth;
	HBMSYNVOICE *voice;
	int index;

	ASSERTLINE(27, p);

	axvpb = (AXVPB *)p;
	synth = (HBMSYNSYNTH *)axvpb->userContext;

	index = HBMGetIndex(axvpb->index);
	HBMFreeIndex(index);

	voice = __HBMSYNVoice + index;
	HBMMIXReleaseChannel(axvpb);

	if (synth->voice[voice->midiChannel][voice->keyNum] == voice)
		synth->voice[voice->midiChannel][voice->keyNum] = NULL;

	voice->synth = NULL;
	--synth->notes;
}

void __HBMSYNSetVoiceToRelease(HBMSYNVOICE *voice)
{
	ASSERTLINE(53, voice);

	voice->veState = EnvStateRelease;
}

void __HBMSYNServiceVoice(int i)
{
	HBMSYNVOICE *voice = __HBMSYNVoice + i;
	HBMSYNSYNTH *synth = voice->synth;

	if (!synth)
		return;

	if (voice->type == VoiceTypeNormal && voice->axvpb->pb.state == 0)
	{
		if (synth->voice[voice->midiChannel][voice->keyNum] == voice)
			synth->voice[voice->midiChannel][voice->keyNum] = NULL;

		voice->veState = EnvStateEnd;
	}

	__HBMSYNRunVolumeEnvelope(voice);

	if (voice->veState == EnvStateEnd)
	{
		voice->synth = NULL;

		HBMMIXReleaseChannel(voice->axvpb);
		HBMFreeIndexByKey(voice->axvpb->index);
		AXFreeVoice(voice->axvpb);

		--synth->notes;
	}
	else
	{
		__HBMSYNUpdateMix(voice);
		__HBMSYNUpdateSrc(voice);
	}
}