Added support for file format hint detection to DataSource, LocalFileDataSource and HttpDataSource using file extensions and mime types
This commit is contained in:
parent
c67999ac3c
commit
1aeb06774f
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@
|
|||
**********************************************************************************/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#include <AudioToolbox/AudioToolbox.h>
|
||||
|
||||
@class DataSource;
|
||||
|
||||
|
|
@ -60,5 +61,6 @@
|
|||
|
||||
-(void) seekToOffset:(long long)offset;
|
||||
-(int) readIntoBuffer:(UInt8*)buffer withSize:(int)size;
|
||||
-(AudioFileTypeID) audioFileTypeHint;
|
||||
|
||||
@end
|
||||
|
|
|
|||
|
|
@ -74,4 +74,9 @@
|
|||
return NO;
|
||||
}
|
||||
|
||||
-(AudioFileTypeID) audioFileTypeHint
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
@end
|
||||
|
|
|
|||
|
|
@ -52,6 +52,11 @@
|
|||
return self;
|
||||
}
|
||||
|
||||
-(AudioFileTypeID) audioFileTypeHint
|
||||
{
|
||||
return self.innerDataSource.audioFileTypeHint;
|
||||
}
|
||||
|
||||
-(void) dealloc
|
||||
{
|
||||
self.innerDataSource.delegate = nil;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
|
|
|
|||
Loading…
Reference in New Issue