Added support for file format hint detection to DataSource, LocalFileDataSource and HttpDataSource using file extensions and mime types

This commit is contained in:
Thong Nguyen 2013-04-03 16:41:09 +01:00
parent c67999ac3c
commit 1aeb06774f
8 changed files with 119 additions and 11 deletions

View File

@ -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)

View File

@ -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

View File

@ -74,4 +74,9 @@
return NO;
}
-(AudioFileTypeID) audioFileTypeHint
{
return 0;
}
@end

View File

@ -52,6 +52,11 @@
return self;
}
-(AudioFileTypeID) audioFileTypeHint
{
return self.innerDataSource.audioFileTypeHint;
}
-(void) dealloc
{
self.innerDataSource.delegate = nil;

View File

@ -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

View File

@ -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;
}
}
}

View File

@ -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;

View File

@ -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];