diff --git a/Application/PlaybackController.m b/Application/PlaybackController.m index f63a9bb9a..a10d4a815 100644 --- a/Application/PlaybackController.m +++ b/Application/PlaybackController.m @@ -768,6 +768,11 @@ NSDictionary *makeRGInfo(PlaylistEntry *pe) { [[NSNotificationCenter defaultCenter] postNotificationName:CogPlaybackDidBeginNotficiation object:pe]; } +- (void)audioPlayer:(AudioPlayer *)player setError:(NSNumber *)status toTrack:(id)userInfo { + PlaylistEntry *pe = (PlaylistEntry *)userInfo; + [pe setError:[status boolValue]]; +} + - (void)removeHDCD:(id)sender { MainWindow *mainWindow = (MainWindow *)appController.mainWindow; [mainWindow showHDCDLogo:NO]; diff --git a/Audio/AudioPlayer.h b/Audio/AudioPlayer.h index 14e127644..2cbfb08ca 100644 --- a/Audio/AudioPlayer.h +++ b/Audio/AudioPlayer.h @@ -127,4 +127,5 @@ - (void)audioPlayer:(AudioPlayer *)player sustainHDCD:(id)userInfo; - (void)audioPlayer:(AudioPlayer *)player restartPlaybackAtCurrentPosition:(id)userInfo; - (void)audioPlayer:(AudioPlayer *)player pushInfo:(NSDictionary *)info toTrack:(id)userInfo; +- (void)audioPlayer:(AudioPlayer *)player setError:(NSNumber *)status toTrack:(id)userInfo; @end diff --git a/Audio/AudioPlayer.m b/Audio/AudioPlayer.m index 19f274d48..810d462ef 100644 --- a/Audio/AudioPlayer.m +++ b/Audio/AudioPlayer.m @@ -492,6 +492,10 @@ [self sendDelegateMethod:@selector(audioPlayer:sustainHDCD:) withObject:[bufferChain userInfo] waitUntilDone:NO]; } +- (void)setError:(BOOL)status { + [self sendDelegateMethod:@selector(audioPlayer:setError:toTrack:) withObject:[NSNumber numberWithBool:status] withObject:[bufferChain userInfo] waitUntilDone:NO]; +} + - (void)setPlaybackStatus:(int)status { [self setPlaybackStatus:status waitUntilDone:NO]; } diff --git a/Audio/Chain/BufferChain.h b/Audio/Chain/BufferChain.h index 0e0c04794..8eb35a922 100644 --- a/Audio/Chain/BufferChain.h +++ b/Audio/Chain/BufferChain.h @@ -79,4 +79,6 @@ - (void)pushInfo:(NSDictionary *)info; +- (void)setError:(BOOL)status; + @end diff --git a/Audio/Chain/BufferChain.m b/Audio/Chain/BufferChain.m index 4a3003cc3..eb433499c 100644 --- a/Audio/Chain/BufferChain.m +++ b/Audio/Chain/BufferChain.m @@ -268,4 +268,8 @@ [controller pushInfo:info]; } +- (void)setError:(BOOL)status { + [controller setError:status]; +} + @end diff --git a/Audio/Chain/InputNode.m b/Audio/Chain/InputNode.m index d666548b5..a26f3bb1e 100644 --- a/Audio/Chain/InputNode.m +++ b/Audio/Chain/InputNode.m @@ -139,6 +139,16 @@ BOOL shouldClose = YES; BOOL seekError = NO; + BOOL isError = NO; + + if([decoder respondsToSelector:@selector(isSilence)]) { + if([decoder isSilence]) { + isError = YES; + } + } + + [controller setError:isError]; + while([self shouldContinue] == YES && [self endOfStream] == NO) { if(shouldSeek == YES) { BufferChain *bufferChain = [[controller controller] bufferChain]; @@ -159,6 +169,10 @@ shouldSeek = NO; DLog(@"Seeked! Resetting Buffer"); initialBufferFilled = NO; + + if(seekError) { + [controller setError:YES]; + } } if(amountInBuffer < CHUNK_SIZE) { diff --git a/Audio/Plugin.h b/Audio/Plugin.h index 0e2ed4933..aebf2f4bb 100644 --- a/Audio/Plugin.h +++ b/Audio/Plugin.h @@ -53,6 +53,8 @@ // These are in NSObject, so as long as you are a subclass of that, you are ok. - (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context; - (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath; + +- (BOOL)isSilence; @end @protocol CogMetadataReader diff --git a/Plugins/APL/APLDecoder.m b/Plugins/APL/APLDecoder.m index 3d586edf4..1b9f74f9b 100644 --- a/Plugins/APL/APLDecoder.m +++ b/Plugins/APL/APLDecoder.m @@ -122,4 +122,10 @@ return n; } +- (BOOL)isSilence { + if([decoder respondsToSelector:@selector(isSilence)]) + return [decoder isSilence]; + return NO; +} + @end diff --git a/Plugins/CueSheet/CueSheetDecoder.m b/Plugins/CueSheet/CueSheetDecoder.m index 0dac57c5c..bf6513131 100644 --- a/Plugins/CueSheet/CueSheetDecoder.m +++ b/Plugins/CueSheet/CueSheetDecoder.m @@ -295,4 +295,10 @@ return n; } +- (BOOL)isSilence { + if([decoder respondsToSelector:@selector(isSilence)]) + return [decoder isSilence]; + return NO; +} + @end diff --git a/Plugins/SilenceDecoder/SilenceDecoder/SilenceDecoder.m b/Plugins/SilenceDecoder/SilenceDecoder/SilenceDecoder.m index 7994ff2a5..f88ba705e 100644 --- a/Plugins/SilenceDecoder/SilenceDecoder/SilenceDecoder.m +++ b/Plugins/SilenceDecoder/SilenceDecoder/SilenceDecoder.m @@ -85,6 +85,10 @@ enum { channels = 2 }; return source; } +- (BOOL)isSilence { + return YES; +} + + (NSArray *)fileTypes { return @[]; }