@@ -45,52 +45,55 @@ Paula::Voice::Voice()
45
45
volume_(0 ) {}
46
46
47
47
48
- void Paula::Voice::Render (float * buffer, int numSamples) {
48
+ void Paula::Voice::Render (int * buffer, int numSamples) {
49
49
if (samplePtr_ == NULL ) {
50
50
return ; }
51
51
52
- const float gain = (volume_ == 0 ) ? 0 . 0f : volume_ / 64.0 ;
52
+ int speed = 3546895 / period_ / kOutputFreqInHz * 65536 . 0f ;
53
53
54
- float speed = (3546895 / period_ / kOutputFreqInHz );
55
54
int8_t * smp = samplePtr_;
56
55
for (int i=0 ; i<numSamples; i++) {
57
- int p1 = int ( pos_) ;
58
- float frac = pos_ - p1 ;
56
+ int p1 = pos_>> 16 ;
57
+ int frac = pos_& 0xffff ;
59
58
pos_ += speed;
60
- if (pos_ >= sampleLen_) {
61
- pos_ -= loopLen_; }
62
- int p2 = int (pos_);
63
- float smp1 = int8ToFloat (smp[p1]);
64
- float smp2 = int8ToFloat (smp[p2]);
65
- float cur = smp1*(1.0 -frac) + smp2*frac;
59
+ if (pos_ >= sampleLen_<<16 ) {
60
+ pos_ -= loopLen_<<16 ; }
61
+ int p2 = pos_>>16 ;
62
+ int smp1 = smp[p1];
63
+ int smp2 = smp[p2];
66
64
67
- buffer[i] += cur * gain; }}
65
+ // int cur = smp1 * 65536; // cur is 16:16 [-128, 127]
66
+ int s = smp1*(0x10000 -frac) + smp2*frac;
67
+ s = s*volume_ >> 6 ; // s is unchanged
68
+ s = s >> 7 ; // s is 16:16 [-1, 1]
69
+ buffer[i] += s; }}
68
70
69
71
70
72
void Paula::Voice::Trigger (int8_t * samplePtr, int sampleLen, int loopLen, int offs) {
71
73
samplePtr_ = samplePtr;
72
74
sampleLen_ = sampleLen;
73
75
loopLen_ = loopLen;
74
- pos_ = std::min (offs, sampleLen-1 ); }
76
+ pos_ = std::min (offs, sampleLen-1 ) << 16 ; }
75
77
76
78
77
- Paula::Paula () :masterGain_(0 .5f ) {}
79
+ Paula::Paula () :masterGain_(0 .25f ) {}
78
80
79
81
80
- void Paula::Render (float * lb, float * rb, int numSamples) {
82
+ void Paula::Render (int * lb, int * rb, int numSamples) {
81
83
// const float pan = 0.5f + 0.5f * masterSeparation_;
82
84
// const float vm0 = masterGain_ * sqrt(pan);
83
85
// const float vm1 = masterGain_ * sqrt(1-pan);
86
+ const int mg = masterGain_ * 65536 .0f ;
84
87
85
88
for (int i=0 ; i<numSamples; i++) {
86
89
out_[i] = 0 ;
87
90
out_[i+4096 ] = 0 ; }
88
91
for (int vi=0 ; vi<kNumVoices ; vi++) {
89
- float * dst = (vi==1 ||vi==2 ) ? out_ + 4096 : out_;
92
+ int * dst = (vi==1 ||vi==2 ) ? out_ + 4096 : out_;
90
93
voice_[vi].Render (dst, numSamples); }
91
94
for (int s=0 ; s<numSamples; s++) {
92
- *lb++ = out_[s] * masterGain_ ;
93
- *rb++ = out_[s+4096 ] * masterGain_ ; }}
95
+ *lb++ = out_[s] *mg >> 16 ;
96
+ *rb++ = out_[s+4096 ]*mg >> 16 ; }}
94
97
95
98
96
99
void ModPlayer::Sample::Prepare () {
@@ -439,7 +442,7 @@ ModPlayer::ModPlayer(Paula* p, uint8_t* moddata) :paula_(p) {
439
442
Reset (); }
440
443
441
444
442
- void ModPlayer::Render (float * lb, float * rb, int numSamples) {
445
+ void ModPlayer::Render (int * lb, int * rb, int numSamples) {
443
446
while (numSamples) {
444
447
int todo = std::min (numSamples, trCounter_);
445
448
if (todo) {
@@ -453,7 +456,7 @@ void ModPlayer::Render(float* lb, float* rb, int numSamples) {
453
456
trCounter_ = tickRate_; }}}
454
457
455
458
456
- void ModPlayer::RenderJmp (void * param, float * lb, float * rb, int len) {
459
+ void ModPlayer::RenderJmp (void * param, int * lb, int * rb, int len) {
457
460
((ModPlayer*)param)->Render (lb, rb, len); }
458
461
459
462
0 commit comments