diff --git a/Audjustable/Classes/AudioPlayer/AudioPlayer.m b/Audjustable/Classes/AudioPlayer/AudioPlayer.m index c44a0e0..99ff92a 100644 --- a/Audjustable/Classes/AudioPlayer/AudioPlayer.m +++ b/Audjustable/Classes/AudioPlayer/AudioPlayer.m @@ -1276,8 +1276,6 @@ static void AudioQueueIsRunningCallbackProc(void* userData, AudioQueueRef audioQ -(void) setCurrentlyReadingEntry:(QueueEntry*)entry andStartPlaying:(BOOL)startPlaying { - OSStatus error; - pthread_mutex_lock(&queueBuffersMutex); if (startPlaying) @@ -1299,15 +1297,6 @@ static void AudioQueueIsRunningCallbackProc(void* userData, AudioQueueRef audioQ audioFileStream = 0; } - error = AudioFileStreamOpen((__bridge void*)self, AudioFileStreamPropertyListenerProc, AudioFileStreamPacketsProc, kAudioFileM4AType, &audioFileStream); - - if (error) - { - pthread_mutex_unlock(&queueBuffersMutex); - - return; - } - if (currentlyReadingEntry) { currentlyReadingEntry.dataSource.delegate = nil; @@ -1869,6 +1858,16 @@ static void AudioQueueIsRunningCallbackProc(void* userData, AudioQueueRef audioQ return; } + if (audioFileStream == 0) + { + error = AudioFileStreamOpen((__bridge void*)self, AudioFileStreamPropertyListenerProc, AudioFileStreamPacketsProc, dataSourceIn.audioFileTypeHint, &audioFileStream); + + if (error) + { + return; + } + } + if (read < 0) { // iOS will shutdown network connections if the app is backgrounded (i.e. device is locked when player is paused) diff --git a/Audjustable/Classes/AudioPlayer/DataSource.h b/Audjustable/Classes/AudioPlayer/DataSource.h index 1ee0ab7..8caf7a0 100644 --- a/Audjustable/Classes/AudioPlayer/DataSource.h +++ b/Audjustable/Classes/AudioPlayer/DataSource.h @@ -33,6 +33,7 @@ **********************************************************************************/ #import +#include @class DataSource; @@ -60,5 +61,6 @@ -(void) seekToOffset:(long long)offset; -(int) readIntoBuffer:(UInt8*)buffer withSize:(int)size; +-(AudioFileTypeID) audioFileTypeHint; @end diff --git a/Audjustable/Classes/AudioPlayer/DataSource.m b/Audjustable/Classes/AudioPlayer/DataSource.m index ce0b2ca..e5d2266 100644 --- a/Audjustable/Classes/AudioPlayer/DataSource.m +++ b/Audjustable/Classes/AudioPlayer/DataSource.m @@ -74,4 +74,9 @@ return NO; } +-(AudioFileTypeID) audioFileTypeHint +{ + return 0; +} + @end diff --git a/Audjustable/Classes/AudioPlayer/DataSourceWrapper.m b/Audjustable/Classes/AudioPlayer/DataSourceWrapper.m index 1279ebc..af721c9 100644 --- a/Audjustable/Classes/AudioPlayer/DataSourceWrapper.m +++ b/Audjustable/Classes/AudioPlayer/DataSourceWrapper.m @@ -52,6 +52,11 @@ return self; } +-(AudioFileTypeID) audioFileTypeHint +{ + return self.innerDataSource.audioFileTypeHint; +} + -(void) dealloc { self.innerDataSource.delegate = nil; diff --git a/Audjustable/Classes/AudioPlayer/HttpDataSource.h b/Audjustable/Classes/AudioPlayer/HttpDataSource.h index 2e93250..ee138a1 100644 --- a/Audjustable/Classes/AudioPlayer/HttpDataSource.h +++ b/Audjustable/Classes/AudioPlayer/HttpDataSource.h @@ -42,10 +42,12 @@ int fileLength; int discontinuous; NSDictionary* httpHeaders; + AudioFileTypeID audioFileTypeHint; } @property (readwrite, retain) NSURL* url; ++(AudioFileTypeID) audioFileTypeHintFromMimeType:(NSString*)fileExtension; -(id) initWithURL:(NSURL*)url; @end diff --git a/Audjustable/Classes/AudioPlayer/HttpDataSource.m b/Audjustable/Classes/AudioPlayer/HttpDataSource.m index 4b04003..4867693 100644 --- a/Audjustable/Classes/AudioPlayer/HttpDataSource.m +++ b/Audjustable/Classes/AudioPlayer/HttpDataSource.m @@ -33,6 +33,7 @@ **********************************************************************************/ #import "HttpDataSource.h" +#import "LocalFileDataSource.h" @interface HttpDataSource() -(void) open; @@ -52,11 +53,55 @@ self.url = urlIn; [self open]; + + audioFileTypeHint = [LocalFileDataSource audioFileTypeHintFromFileExtension:urlIn.pathExtension]; } return self; } + ++(AudioFileTypeID) audioFileTypeHintFromMimeType:(NSString*)fileExtension +{ + static dispatch_once_t onceToken; + static NSDictionary* fileTypesByMimeType; + + dispatch_once(&onceToken, ^ + { + fileTypesByMimeType = + @{ + @"audio/mp3": @(kAudioFileMP3Type), + @"audio/mpg": @(kAudioFileMP3Type), + @"audio/mpeg": @(kAudioFileMP3Type), + @"audio/wav": @(kAudioFileWAVEType), + @"audio/aifc": @(kAudioFileAIFCType), + @"audio/aiff": @(kAudioFileAIFFType), + @"audio/x-m4a": @(kAudioFileM4AType), + @"audio/x-mp4": @(kAudioFileMPEG4Type), + @"audio/m4a": @(kAudioFileM4AType), + @"audio/mp4": @(kAudioFileMPEG4Type), + @"audio/caf": @(kAudioFileCAFType), + @"audio/aac": @(kAudioFileAAC_ADTSType), + @"audio/ac3": @(kAudioFileAC3Type), + @"audio/3gp": @(kAudioFile3GPType) + }; + }); + + NSNumber* number = [fileTypesByMimeType objectForKey:fileExtension]; + + if (!number) + { + return 0; + } + + return (AudioFileTypeID)number.intValue; +} + +-(AudioFileTypeID) audioFileTypeHint +{ + return audioFileTypeHint; +} + -(void) dataAvailable { if (fileLength < 0) @@ -70,6 +115,14 @@ if (seekStart == 0) { fileLength = [[httpHeaders objectForKey:@"Content-Length"] integerValue]; + + NSString* contentType = [httpHeaders objectForKey:@"Content-Type"]; + AudioFileTypeID typeIdFromMimeType = [HttpDataSource audioFileTypeHintFromMimeType:contentType]; + + if (typeIdFromMimeType != 0) + { + audioFileTypeHint = typeIdFromMimeType; + } } } diff --git a/Audjustable/Classes/AudioPlayer/LocalFileDataSource.h b/Audjustable/Classes/AudioPlayer/LocalFileDataSource.h index 047c562..bfdfc73 100644 --- a/Audjustable/Classes/AudioPlayer/LocalFileDataSource.h +++ b/Audjustable/Classes/AudioPlayer/LocalFileDataSource.h @@ -39,8 +39,11 @@ @private long long position; long long length; + AudioFileTypeID audioFileTypeHint; } ++(AudioFileTypeID) audioFileTypeHintFromFileExtension:(NSString*)fileExtension; + @property (readonly, copy) NSString* filePath; -(id) initWithFilePath:(NSString*)filePath; diff --git a/Audjustable/Classes/AudioPlayer/LocalFileDataSource.m b/Audjustable/Classes/AudioPlayer/LocalFileDataSource.m index 8f4ae64..cc1ddc2 100644 --- a/Audjustable/Classes/AudioPlayer/LocalFileDataSource.m +++ b/Audjustable/Classes/AudioPlayer/LocalFileDataSource.m @@ -50,11 +50,50 @@ self.filePath = filePathIn; [self open]; + + audioFileTypeHint = [LocalFileDataSource audioFileTypeHintFromFileExtension:filePathIn.pathExtension]; } return self; } ++(AudioFileTypeID) audioFileTypeHintFromFileExtension:(NSString*)fileExtension +{ + static dispatch_once_t onceToken; + static NSDictionary* fileTypesByFileExtensions; + + dispatch_once(&onceToken, ^ + { + fileTypesByFileExtensions = + @{ + @"mp3": @(kAudioFileMP3Type), + @"wav": @(kAudioFileWAVEType), + @"aifc": @(kAudioFileAIFCType), + @"aiff": @(kAudioFileAIFFType), + @"m4a": @(kAudioFileM4AType), + @"mp4": @(kAudioFileMPEG4Type), + @"caf": @(kAudioFileCAFType), + @"aac": @(kAudioFileAAC_ADTSType), + @"ac3": @(kAudioFileAC3Type), + @"3gp": @(kAudioFile3GPType) + }; + }); + + NSNumber* number = [fileTypesByFileExtensions objectForKey:fileExtension]; + + if (!number) + { + return 0; + } + + return (AudioFileTypeID)number.intValue; +} + +-(AudioFileTypeID) audioFileTypeHint +{ + return audioFileTypeHint; +} + -(void) dealloc { [self close];