File: Mixer.cs

package info (click to toggle)
cadencii 3.3.9%2Bsvn20110818.r1732-6
  • links: PTS
  • area: main
  • in suites: buster
  • size: 35,916 kB
  • sloc: cs: 160,836; java: 42,449; cpp: 7,605; ansic: 1,728; perl: 1,087; makefile: 236; php: 142; xml: 117; sh: 21
file content (148 lines) | stat: -rw-r--r-- 4,657 bytes parent folder | download | duplicates (5)
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
/*
 * Mixer.cs
 * Copyright © 2010-2011 kbinani
 *
 * This file is part of org.kbinani.cadencii.
 *
 * org.kbinani.cadencii is free software; you can redistribute it and/or
 * modify it under the terms of the GPLv3 License.
 *
 * org.kbinani.cadencii is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 */
#if JAVA
package org.kbinani.cadencii;

import java.awt.*;
import java.util.*;
import org.kbinani.*;
#else
using System;
using org.kbinani.java.awt;
using org.kbinani.java.util;

namespace org.kbinani.cadencii {
#endif

#if JAVA
    public class Mixer extends WaveUnit implements WaveSender, WaveReceiver {
#else
    public class Mixer : WaveUnit, WaveSender, WaveReceiver {
#endif
        private const int BUFLEN = 1024;

        private WaveReceiver mReceiver = null;
        private Vector<WaveSender> mSenders = new Vector<WaveSender>();
        private double[] mBufferL = new double[BUFLEN];
        private double[] mBufferR = new double[BUFLEN];
        private double[] mBuffer2L = new double[BUFLEN];
        private double[] mBuffer2R = new double[BUFLEN];
        private int mVersion = 0;

        public override int getVersion()
        {
            return mVersion;
        }

        public override void setConfig( String parameter ) {
            // do nothing
        }

        public void push( double[] l, double[] r, int length ) {
            int remain = length;
            int offset = 0;
            while ( remain > 0 ) {
                int amount = (remain > BUFLEN) ? BUFLEN : remain;
                for ( int i = 0; i < BUFLEN; i++ ) {
                    mBufferL[i] = l[i + offset];
                    mBufferR[i] = r[i + offset];
                }
                foreach ( WaveSender s in mSenders ) {
                    s.pull( mBuffer2L, mBuffer2R, amount );
                    for ( int i = 0; i < BUFLEN; i++ ) {
                        mBufferL[i] += mBuffer2L[i];
                        mBufferR[i] += mBuffer2R[i];
                    }
                }
                if ( mReceiver != null ) {
                    mReceiver.push( mBufferL, mBufferR, amount );
                }
                remain -= amount;
                offset += amount;
            }
        }

        public void pull( double[] l, double[] r, int length ) {
            int remain = length;
            int offset = 0;
            while ( remain > 0 ) {
                int amount = (remain > BUFLEN) ? BUFLEN : remain;
                for ( int i = 0; i < amount; i++ ) {
                    mBuffer2L[i] = 0.0;
                    mBuffer2R[i] = 0.0;
                }
                foreach ( WaveSender s in mSenders ) {
                    if ( s == null ) {
                        continue;
                    }
                    s.pull( mBufferL, mBufferR, amount );
                    for ( int i = 0; i < amount; i++ ) {
                        mBuffer2L[i] += mBufferL[i];
                        mBuffer2R[i] += mBufferR[i];
                    }
                }
                if ( mReceiver != null ) {
                    mReceiver.push( mBuffer2L, mBuffer2R, amount );
                }
                for ( int i = 0; i < amount; i++ ) {
                    l[i + offset] = mBuffer2L[i];
                    r[i + offset] = mBuffer2R[i];
                }
                remain -= amount;
                offset += amount;
            }
        }

        public void setReceiver( WaveReceiver r ) {
            if ( mReceiver != null ) {
                mReceiver.end();
            }
            mReceiver = r;
        }

        public void setSender( WaveSender s ) {
            addSender( s );
        }

        public void end() {
            if ( mReceiver != null ) {
                mReceiver.end();
            }
            foreach ( WaveSender s in mSenders ) {
                if ( s != null ) {
                    s.end();
                }
            }
        }

        public void addSender( WaveSender s ) {
            if ( s == null ) {
                return;
            }
            if ( !mSenders.contains( s ) ) {
                mSenders.add( s );
#if DEBUG
                sout.println( "Mixer#addSender; sender added" );
#endif
            } else {
#if DEBUG
                sout.println( "Mixer#addSender; sender NOT added" );
#endif
            }
        }
    }

#if !JAVA
}
#endif