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.
parent
7531b3324f
commit
9cd138384d
|
@ -22,6 +22,11 @@ typedef enum {
|
|||
RepeatAll
|
||||
} RepeatMode;
|
||||
|
||||
static BOOL IsRepeatOneSet()
|
||||
{
|
||||
return [[NSUserDefaults standardUserDefaults] integerForKey:@"repeat"] == RepeatOne;
|
||||
}
|
||||
|
||||
typedef enum {
|
||||
ShuffleOff = 0,
|
||||
ShuffleAlbums,
|
||||
|
|
|
@ -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 */,
|
||||
|
|
|
@ -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 )
|
||||
|
|
|
@ -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 */,
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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 */,
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 */,
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 */,
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 */,
|
||||
|
|
|
@ -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 )
|
||||
|
|
Loading…
Reference in New Issue