Setting Repeat One will now direct all synthesizing decoders to run forever, rather than merely restarting repeatedly. Playptmod now cuts off length detection after half an hour, in case some files' loops are not detected.

CQTexperiment
Chris Moeller 2014-02-13 21:16:18 -08:00
parent 7531b3324f
commit 9cd138384d
13 changed files with 57 additions and 10 deletions

View File

@ -22,6 +22,11 @@ typedef enum {
RepeatAll
} RepeatMode;
static BOOL IsRepeatOneSet()
{
return [[NSUserDefaults standardUserDefaults] integerForKey:@"repeat"] == RepeatOne;
}
typedef enum {
ShuffleOff = 0,
ShuffleAlbums,

View File

@ -96,6 +96,7 @@
83527EE918243029002F170E /* mo3.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mo3.h; path = mo3/mo3.h; sourceTree = "<group>"; };
83527EEA18243069002F170E /* mo3.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mo3.c; path = mo3/mo3.c; sourceTree = "<group>"; };
8384912B1808155E00E7332D /* Logging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Logging.h; path = ../../Utils/Logging.h; sourceTree = "<group>"; };
83FAF8A418ADD45600057CAF /* PlaylistController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PlaylistController.h; path = ../../Playlist/PlaylistController.h; sourceTree = "<group>"; };
8D5B49B6048680CD000E48DA /* Dumb.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Dumb.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
8D5B49B7048680CD000E48DA /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
D2F7E65807B2D6F200F64583 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = "<absolute>"; };
@ -150,6 +151,7 @@
08FB77AFFE84173DC02AAC07 /* Classes */ = {
isa = PBXGroup;
children = (
83FAF8A418ADD45600057CAF /* PlaylistController.h */,
8337AAE317FFA0000081AFF8 /* archive */,
8384912B1808155E00E7332D /* Logging.h */,
8335FF6517FF6FD9002D8DD2 /* DumbContainer.h */,

View File

@ -19,6 +19,8 @@
#include <sys/types.h>
#include <sys/sysctl.h>
#import "PlaylistController.h"
@implementation DumbDecoder
struct MEMANDFREEFILE
@ -260,7 +262,7 @@ int callbackLoop(void *data)
((float *)buf)[(total * 2) + i] = (float)sampptr[0][i] * scale;
}
if ( loops >= 2 ) {
if ( !IsRepeatOneSet() && loops >= 2 ) {
float * sampleBuf = ( float * ) buf + total * 2;
long fadeEnd = fadeRemain - rendered;
if ( fadeEnd < 0 )

View File

@ -69,6 +69,7 @@
17DA34B90CC052030003F6B2 /* GameMetadataReader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GameMetadataReader.m; sourceTree = "<group>"; };
32DBCF630370AF2F00C91783 /* GME_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GME_Prefix.pch; sourceTree = "<group>"; };
8384912E1808175400E7332D /* Logging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Logging.h; path = ../../Utils/Logging.h; sourceTree = "<group>"; };
83FAF8A518ADD4D100057CAF /* PlaylistController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PlaylistController.h; path = ../../Playlist/PlaylistController.h; sourceTree = "<group>"; };
8D5B49B6048680CD000E48DA /* GME.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GME.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
8D5B49B7048680CD000E48DA /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
D2F7E65807B2D6F200F64583 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = "<absolute>"; };
@ -120,6 +121,7 @@
08FB77AFFE84173DC02AAC07 /* Classes */ = {
isa = PBXGroup;
children = (
83FAF8A518ADD4D100057CAF /* PlaylistController.h */,
8384912E1808175400E7332D /* Logging.h */,
17C8F3470CBED3C7008D969D /* Plugin.h */,
17C8F33B0CBED3BE008D969D /* GameContainer.h */,

View File

@ -10,6 +10,8 @@
#import "Logging.h"
#import "PlaylistController.h"
@implementation GameDecoder
gme_err_t readCallback( void* data, void* out, long count )
@ -103,8 +105,6 @@ gme_err_t readCallback( void* data, void* out, long count )
return NO;
}
gme_set_fade( emu, length, 8000 );
length += 8000;
@ -134,6 +134,11 @@ gme_err_t readCallback( void* data, void* out, long count )
if (gme_track_ended(emu)) {
return 0;
}
if ( IsRepeatOneSet() )
gme_set_fade( emu, INT_MAX, 0 );
else
gme_set_fade( emu, length - 8000, 8000 );
gme_play(emu, numSamples, (short int *)buf);

View File

@ -181,6 +181,7 @@
83D4481B18ACA5AD000F443A /* lazyusf */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.executable"; name = lazyusf; path = ../../ThirdParty/lazyusf/lazyusf; sourceTree = "<group>"; };
83DE0C34180A9BD400269051 /* vio2sf.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = vio2sf.xcodeproj; path = ../../Frameworks/vio2sf/vio2sf.xcodeproj; sourceTree = "<group>"; };
83DE0CBF180B27C200269051 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; };
83FAF8A318ADD27F00057CAF /* PlaylistController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PlaylistController.h; path = ../../../Playlist/PlaylistController.h; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@ -283,6 +284,7 @@
8360EEED17F92AC8005208A4 /* HighlyComplete */ = {
isa = PBXGroup;
children = (
83FAF8A318ADD27F00057CAF /* PlaylistController.h */,
8324C584181513A10046F78F /* circular_buffer.h */,
834379A717F9818400584396 /* HCDecoder.mm */,
8343786117F944BD00584396 /* hebios.h */,

View File

@ -34,6 +34,8 @@
#include <dlfcn.h>
#import "PlaylistController.h"
// #define USF_LOG
@interface psf_file_container : NSObject {
@ -1428,6 +1430,8 @@ static int usf_info(void * context, const char * name, const char * value)
long frames_left = totalFrames - framesRead - silence_test_buffer.data_available() / 2;
if ( partial ) frames_left = 1024;
long free_space = silence_test_buffer.free_space() / 2;
if ( IsRepeatOneSet() )
frames_left = free_space;
if ( free_space > frames_left )
free_space = frames_left;
while ( free_space > 0 )
@ -1550,14 +1554,14 @@ static int usf_info(void * context, const char * name, const char * value)
unsigned long written = silence_test_buffer.data_available() / 2;
if ( written > frames )
written = frames;
if ( written > totalFrames - framesRead )
if ( !IsRepeatOneSet() && written > totalFrames - framesRead )
written = totalFrames - framesRead;
if ( written == 0 )
return 0;
silence_test_buffer.read( (int16_t *) buf, written * 2 );
if ( framesRead + written > framesLength ) {
if ( !IsRepeatOneSet() && framesRead + written > framesLength ) {
long fadeStart = (framesLength > framesRead) ? framesLength : framesRead;
long fadeEnd = framesRead + written;
long fadeTotal = totalFrames - framesLength;

View File

@ -47,6 +47,7 @@
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
831C7F6918ADD73F00CE4A69 /* PlaylistController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PlaylistController.h; path = ../../../Playlist/PlaylistController.h; sourceTree = "<group>"; };
836FB52D1820538700B3AD2D /* Hively.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Hively.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
836FB5301820538700B3AD2D /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
836FB5331820538700B3AD2D /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
@ -118,6 +119,7 @@
836FB5361820538700B3AD2D /* Hively */ = {
isa = PBXGroup;
children = (
831C7F6918ADD73F00CE4A69 /* PlaylistController.h */,
836FB5A31820557E00B3AD2D /* Plugin.h */,
836FB59A1820556F00B3AD2D /* HVLDecoder.h */,
836FB59B1820556F00B3AD2D /* HVLDecoder.m */,

View File

@ -8,6 +8,8 @@
#import "HVLDecoder.h"
#import "PlaylistController.h"
@implementation HVLDecoder
void oneTimeInit()
@ -99,7 +101,9 @@ void oneTimeInit()
- (int)readAudio:(void *)buf frames:(UInt32)frames
{
if (framesRead >= totalFrames)
BOOL repeatone = IsRepeatOneSet();
if (!repeatone && framesRead >= totalFrames)
return 0;
int total = 0;
@ -128,7 +132,7 @@ void oneTimeInit()
framesInBuffer = 44100 / 50;
}
if ( framesRead + total > framesLength ) {
if ( !repeatone && framesRead + total > framesLength ) {
long fadeStart = (framesLength > framesRead) ? framesLength : framesRead;
long fadeEnd = (framesRead + total) > totalFrames ? totalFrames : (framesRead + total);
long fadePos;

View File

@ -99,6 +99,7 @@
83C35701180EDB74007E9DF0 /* MIDIContainer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MIDIContainer.h; sourceTree = "<group>"; };
83C35703180EDD1C007E9DF0 /* MIDIMetadataReader.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MIDIMetadataReader.mm; sourceTree = "<group>"; };
83C35704180EDD1C007E9DF0 /* MIDIMetadataReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MIDIMetadataReader.h; sourceTree = "<group>"; };
83FAF8A618ADD60100057CAF /* PlaylistController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PlaylistController.h; path = ../../../Playlist/PlaylistController.h; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@ -162,6 +163,7 @@
83B06690180D5668008E3612 /* MIDI */ = {
isa = PBXGroup;
children = (
83FAF8A618ADD60100057CAF /* PlaylistController.h */,
83C35703180EDD1C007E9DF0 /* MIDIMetadataReader.mm */,
83C35704180EDD1C007E9DF0 /* MIDIMetadataReader.h */,
83C35700180EDB74007E9DF0 /* MIDIContainer.mm */,

View File

@ -14,6 +14,8 @@
#import <midi_processing/midi_processor.h>
#import "PlaylistController.h"
@implementation MIDIDecoder
+ (NSInteger)testExtensions:(NSString *)pathMinusExtension extensions:(NSArray *)extensionsToTest
@ -148,7 +150,9 @@
- (int)readAudio:(void *)buf frames:(UInt32)frames
{
if ( framesRead >= totalFrames )
BOOL repeatone = IsRepeatOneSet();
if ( !repeatone && framesRead >= totalFrames )
return 0;
if ( !soundFontsAssigned ) {
@ -163,7 +167,7 @@
player->Play( (float *) buf, frames );
if ( framesRead + frames > framesLength ) {
if ( !repeatone && framesRead + frames > framesLength ) {
if ( framesFade ) {
long fadeStart = (framesLength > framesRead) ? framesLength : framesRead;
long fadeEnd = (framesRead + frames > totalFrames) ? totalFrames : (framesRead + frames);

View File

@ -58,6 +58,7 @@
83A0F4DD1816D09000119DB4 /* ptmodDecoder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ptmodDecoder.m; sourceTree = "<group>"; };
83A0F4DF1816D0AF00119DB4 /* Plugin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Plugin.h; path = ../../../Audio/Plugin.h; sourceTree = "<group>"; };
83A0F4E01816D13000119DB4 /* Logging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Logging.h; path = ../../../Utils/Logging.h; sourceTree = "<group>"; };
83FAF8A718ADD65200057CAF /* PlaylistController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PlaylistController.h; path = ../../../Playlist/PlaylistController.h; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@ -113,6 +114,7 @@
83A0F4781816CE5E00119DB4 /* playptmod */ = {
isa = PBXGroup;
children = (
83FAF8A718ADD65200057CAF /* PlaylistController.h */,
83A0F4E01816D13000119DB4 /* Logging.h */,
83A0F4DF1816D0AF00119DB4 /* Plugin.h */,
83A0F4DC1816D09000119DB4 /* ptmodDecoder.h */,

View File

@ -31,12 +31,23 @@ BOOL probe_length( unsigned long * intro_length, unsigned long * loop_length, in
unsigned long length_total = 0;
unsigned long length_saved;
while ( playptmod_LoopCounter( ptmod ) < 1 )
const long length_safety = 44100 * 60 * 30;
while ( playptmod_LoopCounter( ptmod ) < 1 && length_total < length_safety )
{
playptmod_Render( ptmod, NULL, 512 );
length_total += 512;
}
if ( playptmod_LoopCounter( ptmod ) < 1 )
{
*loop_length = 0;
*intro_length = 44100 * 60 * 3;
playptmod_Stop( ptmod );
playptmod_Free( ptmod );
return YES;
}
length_saved = length_total;
while ( playptmod_LoopCounter( ptmod ) < 2 )