aboutsummaryrefslogtreecommitdiff
path: root/engines/cryo/clsoundgroup.c
blob: a1abaf4086f0115ce2cb9506964c1ab6fc73cac4 (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
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
#include "cryolib.h"

soundgroup_t *CLSoundGroup_New(short numSounds, short arg4, short sampleSize, float rate, short mode) {
	soundgroup_t *sg;
	short i;

	sg = (soundgroup_t *)CLMemory_Alloc(sizeof(*sg));
	if (numSounds < CL_MAX_SOUNDS)
		sg->numSounds = numSounds;
	else {
		__libError = -3;
		__osError = 0;
		CLCheckError();
		sg->numSounds = CL_MAX_SOUNDS;
	}
	for (i = 0; i < sg->numSounds; i++) {
		sound_t *sound = CLSoundRaw_New(arg4, rate, sampleSize, mode);
		sg->sound[i] = sound;
		sound->ff_1A = arg4;
	}
	sg->soundIndex = 0;
	sg->playIndex = 0;
	sg->ff_106 = 1;

	return sg;
}

void CLSoundGroup_Free(soundgroup_t *sg) {
	short i;
	for (i = 0; i < sg->numSounds; i++)
		CLSoundRaw_Free(sg->sound[i]);
	CLMemory_Free(sg);
}

void CLSoundGroup_Reverse16All(soundgroup_t *sg) {
	short i;
	for (i = 0; i < sg->numSounds; i++)
		sg->sound[i]->reversed = 1;
}

void *CLSoundGroup_GetNextBuffer(soundgroup_t *sg) {
	sound_t *sound = sg->sound[sg->soundIndex];
	if (sg->ff_106)
		while (sound->locked) ;
	return ((char *)(*sound->sndHandle)) + sound->headerLen;
}

short CLSoundGroup_AssignDatas(soundgroup_t *sg, void *buffer, int length, short isSigned) {
	sound_t *sound = sg->sound[sg->soundIndex];
	if (sg->ff_106)
		while (sound->locked) ;
	else if (sound->locked)
		return 0;
	sound->buffer = (char *)buffer;
	CLSound_SetLength(sound, length);
	sound->length = length;
//	if(sound->reversed && sound->sampleSize == 16)
//		ReverseBlock16(buffer, length);
//	if(isSigned)
//		CLSound_Signed2NonSigned(buffer, length);
	if (sg->soundIndex == sg->numSounds - 1)
		sg->soundIndex = 0;
	else
		sg->soundIndex++;

	return 1;
}

short CLSoundGroup_SetDatas(soundgroup_t *sg, void *data, int length, short isSigned) {
	void *buffer;
	sound_t *sound = sg->sound[sg->soundIndex];
	if (length >= sound->ff_1A) {
		__libError = -10;
		__osError = 0;
		CLCheckError();
	}
	if (sg->ff_106)
		while (sound->locked) ;
	else if (sound->locked)
		return 0;
	buffer = ((char *)(*sound->sndHandle)) + sound->headerLen;
	sound->buffer = (char *)buffer;
	memcpy(buffer, data, length);
	CLSound_SetLength(sound, length);
	sound->length = length;
//	if(sound->reversed && sound->sampleSize == 16)
//		ReverseBlock16(buffer, length);
//	if(isSigned)
//		CLSound_Signed2NonSigned(buffer, length);
	if (sg->soundIndex == sg->numSounds - 1)
		sg->soundIndex = 0;
	else
		sg->soundIndex++;

	return 1;
}

void CLSoundGroup_PlayNextSample(soundgroup_t *sg, soundchannel_t *ch) {
	CLSoundChannel_Play(ch, sg->sound[sg->playIndex]);
	if (sg->playIndex == sg->numSounds - 1)
		sg->playIndex = 0;
	else
		sg->playIndex++;

}