Now limited to playing two loops with an 8 second fade, as the previous position fetching method was broken by my own changes to DUMB which cause the position to wrap back around on every loop

CQTexperiment
Chris Moeller 2013-10-04 17:23:11 -07:00
parent e733074c01
commit 718829aabe
2 changed files with 39 additions and 5 deletions

View File

@ -21,6 +21,10 @@ extern DUMBFILE_SYSTEM dfs;
id<CogSource> source; id<CogSource> source;
long length; long length;
long loops;
long fadeTotal;
long fadeRemain;
} }
- (void)setSource:(id<CogSource>)s; - (void)setSource:(id<CogSource>)s;

View File

@ -89,6 +89,13 @@ DUMBFILE_SYSTEM dfs = {
.get_size = getsizeCallback .get_size = getsizeCallback
}; };
int callbackLoop(void *data)
{
long * loops = (long *) data;
++ *loops;
return 0;
}
- (BOOL)open:(id<CogSource>)s - (BOOL)open:(id<CogSource>)s
{ {
[self setSource:s]; [self setSource:s];
@ -143,6 +150,13 @@ DUMBFILE_SYSTEM dfs = {
DUMB_IT_SIGRENDERER * itsr = duh_get_it_sigrenderer( dsr ); DUMB_IT_SIGRENDERER * itsr = duh_get_it_sigrenderer( dsr );
dumb_it_set_ramp_style( itsr, 2 ); dumb_it_set_ramp_style( itsr, 2 );
dumb_it_set_loop_callback( itsr, callbackLoop, &loops);
dumb_it_set_xm_speed_zero_callback( itsr, dumb_it_callback_terminate, 0);
dumb_it_set_global_volume_zero_callback( itsr, dumb_it_callback_terminate, 0);
loops = 0;
fadeTotal = fadeRemain = 44100 * 8;
[self willChangeValueForKey:@"properties"]; [self willChangeValueForKey:@"properties"];
[self didChangeValueForKey:@"properties"]; [self didChangeValueForKey:@"properties"];
@ -164,11 +178,27 @@ DUMBFILE_SYSTEM dfs = {
- (int)readAudio:(void *)buf frames:(UInt32)frames - (int)readAudio:(void *)buf frames:(UInt32)frames
{ {
if (duh_sigrenderer_get_position(dsr) > length) { int rendered = duh_render(dsr, 16 /* shorts */, 0 /* not unsigned */, 1.0 /* volume */, 65536.0f / 44100.0f /* 65536 hz? */, frames, buf);
return 0;
} if ( loops >= 2 ) {
int16_t * sampleBuf = ( int16_t * ) buf;
return duh_render(dsr, 16 /* shorts */, 0 /* not unsigned */, 1.0 /* volume */, 65536.0f / 44100.0f /* 65536 hz? */, frames, buf); long fadeEnd = fadeRemain - rendered;
if ( fadeEnd < 0 )
fadeEnd = 0;
for ( long fadePos = fadeRemain; fadePos > fadeEnd; --fadePos ) {
long offset = (fadeRemain - fadePos) * 2;
int64_t sampleLeft = sampleBuf[ offset + 0 ];
int64_t sampleRight = sampleBuf[ offset + 1 ];
sampleLeft = (sampleLeft * fadePos) / fadeTotal;
sampleRight = (sampleRight * fadePos) / fadeTotal;
sampleBuf[ offset + 0 ] = sampleLeft;
sampleBuf[ offset + 1 ] = sampleRight;
}
rendered = fadeRemain - fadeEnd;
fadeRemain = fadeEnd;
}
return rendered;
} }
- (long)seek:(long)frame - (long)seek:(long)frame