PS2SDK
PS2 Homebrew Libraries
Loading...
Searching...
No Matches
vm_vol.c
1/*
2# _____ ___ ____ ___ ____
3# ____| | ____| | | |____|
4# | ___| |____ ___| ____| | \ PS2DEV Open Source Project.
5#-----------------------------------------------------------------------
6# Copyright ps2dev - http://www.ps2dev.org
7# Licenced under Academic Free License version 2.0
8# Review ps2sdk README & LICENSE files for further details.
9*/
10
11#include "libsnd2_internal.h"
12
13int _SsVmSetVol(s16 seq_sep_no, s16 vab_id, s16 prog, s16 voll, s16 volr)
14{
15 int v7;
16 u8 volr_tmp;
17 libsnd2_sequence_struct_t *score_struct;
18 int v13;
19 int v20;
20 const VagAtr *vag_attr_ptr;
21 unsigned int volcalc;
22 unsigned int left_vol;
23 unsigned int pan;
24 unsigned int right_vol;
25 unsigned int mpan;
26 unsigned int vol_selfmul;
27
28 v7 = 0;
29 volr_tmp = volr;
30 score_struct = &_ss_score[(u8)seq_sep_no][(seq_sep_no & 0xFF00) >> 8];
31 _SsVmVSetUp(vab_id, prog);
32 _svm_cur.m_seq_sep_no = seq_sep_no;
33 if ( !volr )
34 volr_tmp = 1;
35 if ( !voll )
36 voll = 1;
37 for ( v13 = 0; (s16)v13 < _SsVmMaxVoice; v13 += 1 )
38 {
39 if ( (_snd_vmask & (1 << v13)) == 0 )
40 {
41 const libsnd2_spu_voice_t *voice_struct;
42
43 voice_struct = &_svm_voice[(s16)v13];
44 if (
45 voice_struct->m_seq_sep_no == seq_sep_no && voice_struct->m_prog == prog && voice_struct->m_vab_id == vab_id )
46 {
47 v20 = score_struct->m_vol[score_struct->m_channel_idx];
48 if ( (v20 != 0) || (v20 != (u16)voll) )
49 {
50 vag_attr_ptr = &_svm_tn[16 * voice_struct->m_fake_program + voice_struct->m_tone];
51 volcalc = voice_struct->m_voll1 * (u16)voll / 127 * 0x3FFF * _svm_vh->mvol / 0x3F01 * _svm_pg[prog].mvol
52 * vag_attr_ptr->vol;
53 left_vol = volcalc / 0x3F01 * (u16)score_struct->m_voll / 0x7F;
54 pan = vag_attr_ptr->pan;
55 right_vol = volcalc / 0x3F01 * (u16)score_struct->m_volr / 0x7F;
56 if ( pan >= 0x40 )
57 left_vol = left_vol * (127 - pan) / 0x3F;
58 else
59 right_vol = right_vol * pan / 0x3F;
60 mpan = _svm_pg[voice_struct->m_prog].mpan;
61 if ( mpan >= 0x40 )
62 left_vol = left_vol * (127 - mpan) / 0x3F;
63 else
64 right_vol = right_vol * _svm_pg[voice_struct->m_prog].mpan / 0x3F;
65 if ( volr_tmp >= 0x40u )
66 left_vol = left_vol * (127 - volr_tmp) / 0x3F;
67 else
68 right_vol = right_vol * volr_tmp / 0x3F;
69 vol_selfmul = left_vol * left_vol;
70 if ( _svm_stereo_mono == 1 )
71 {
72 if ( left_vol >= right_vol )
73 right_vol = left_vol;
74 else
75 left_vol = right_vol;
76 vol_selfmul = left_vol * left_vol;
77 }
78 v7 += 1;
79 _svm_sreg_dirty[(s16)v13] |= 3u;
80 _svm_sreg_buf[(s16)v13].m_vol_left = vol_selfmul / 0x3FFF;
81 _svm_sreg_buf[(s16)v13].m_vol_right = right_vol * right_vol / 0x3FFF;
82 }
83 if ( v20 != 0 )
84 {
85 score_struct->m_vol[score_struct->m_channel_idx] = 1;
86 }
87 }
88 }
89 }
90 return v7;
91}