Moved WavPack and MusePack over to the source system.

CQTexperiment
vspader 2007-03-04 20:47:49 +00:00
parent 657d6a2860
commit 130a17cbf7
8 changed files with 224 additions and 31 deletions

View File

@ -242,8 +242,6 @@
"$(FRAMEWORK_SEARCH_PATHS_QUOTED_2)",
"$(FRAMEWORK_SEARCH_PATHS_QUOTED_3)",
);
FRAMEWORK_SEARCH_PATHS_QUOTED_1 = "\"$(SRCROOT)/../../../MPCDec/build/Release\"";
FRAMEWORK_SEARCH_PATHS_QUOTED_2 = "\"$(SRCROOT)/../../../Frameworks/MPCDec/build/Release\"";
FRAMEWORK_SEARCH_PATHS_QUOTED_3 = "\"$(SRCROOT)/../../Frameworks/MPCDec/build/Release\"";
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
GCC_MODEL_TUNING = G5;

View File

@ -14,7 +14,9 @@
{
id<CogSource> source;
mpc_decoder decoder;
mpc_streaminfo info;
mpc_reader reader;
char buffer[MPC_FRAME_LENGTH*4];
int bufferAmount;

View File

@ -12,6 +12,7 @@
mpc_int32_t ReadProc(void *data, void *ptr, mpc_int32_t size)
{
NSLog(@"MPC Read: %i", size);
MusepackDecoder *decoder = (MusepackDecoder *) data;
return [[decoder source] read:ptr amount:size];
@ -20,12 +21,13 @@ mpc_int32_t ReadProc(void *data, void *ptr, mpc_int32_t size)
mpc_bool_t SeekProc(void *data, mpc_int32_t offset)
{
MusepackDecoder *decoder = (MusepackDecoder *) data;
NSLog(@"MPC Seek: %i", offset);
return [[decoder source] seek:offset whence:SEEK_SET];
}
mpc_int32_t TellProc(void *data)
{
NSLog(@"MPC Tell");
MusepackDecoder *decoder = (MusepackDecoder *) data;
return [[decoder source] tell];
@ -33,6 +35,7 @@ mpc_int32_t TellProc(void *data)
mpc_int32_t GetSizeProc(void *data)
{
NSLog(@"MPC GetSize");
MusepackDecoder *decoder = (MusepackDecoder *) data;
if ([[decoder source] seekable]) {
@ -52,6 +55,7 @@ mpc_int32_t GetSizeProc(void *data)
mpc_bool_t CanSeekProc(void *data)
{
NSLog(@"MPC Canseek");
MusepackDecoder *decoder = (MusepackDecoder *) data;
return [[decoder source] seekable];
@ -61,15 +65,14 @@ mpc_bool_t CanSeekProc(void *data)
{
[self setSource: s];
mpc_reader reader = {
read: ReadProc,
seek: SeekProc,
tell: TellProc,
get_size: GetSizeProc,
canseek: CanSeekProc
};
reader.read = ReadProc;
reader.seek = SeekProc;
reader.tell = TellProc;
reader.get_size = GetSizeProc;
reader.canseek = CanSeekProc;
reader.data = self;
NSLog(@"%@", reader.data);
mpc_streaminfo info;
mpc_streaminfo_init(&info);
if (mpc_streaminfo_read(&info, &reader) != ERROR_CODE_OK)
{
@ -77,7 +80,7 @@ mpc_bool_t CanSeekProc(void *data)
return NO;
}
/* instantiate a decoder with our file reader */
/* instantiate a decoder with our reader */
mpc_decoder_setup(&decoder, &reader);
if (!mpc_decoder_initialize(&decoder, &info))
{
@ -218,7 +221,7 @@ mpc_bool_t CanSeekProc(void *data)
[NSNumber numberWithDouble:length], @"length",
[NSNumber numberWithInt:16], @"bitsPerSample",
[NSNumber numberWithInt:2], @"channels",
@"little",@"endian",
@"host",@"endian",
nil];
}

View File

@ -9,12 +9,10 @@
/* Begin PBXBuildFile section */
1745C4DA0B90C42500A6768C /* WavPackDecoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 1745C4D60B90C42500A6768C /* WavPackDecoder.m */; };
1745C4DB0B90C42500A6768C /* WavPackPropertiesReader.m in Sources */ = {isa = PBXBuildFile; fileRef = 1745C4D80B90C42500A6768C /* WavPackPropertiesReader.m */; };
177FCF950B90C9450011C3B5 /* Plugin.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 177FCF940B90C9450011C3B5 /* Plugin.h */; };
179CFD490B90C6DC00C8C4DB /* WavPack.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 179CFD480B90C6DC00C8C4DB /* WavPack.framework */; };
179CFD4C0B90C6DF00C8C4DB /* WavPack.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 179CFD480B90C6DC00C8C4DB /* WavPack.framework */; };
17ADB2620B97946600257CA2 /* WavPackPlugin.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 17ADB2600B97946600257CA2 /* WavPackPlugin.h */; };
17ADB2630B97946600257CA2 /* WavPackPlugin.m in Sources */ = {isa = PBXBuildFile; fileRef = 17ADB2610B97946600257CA2 /* WavPackPlugin.m */; };
8D5B49B4048680CD000E48DA /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7ADFEA557BF11CA2CBB /* Cocoa.framework */; };
8E2B8FE40B9B63CD00F2D9E8 /* WavPack.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8E2B8FE30B9B63CD00F2D9E8 /* WavPack.framework */; };
8E2B8FE70B9B63CF00F2D9E8 /* WavPack.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8E2B8FE30B9B63CD00F2D9E8 /* WavPack.framework */; };
/* End PBXBuildFile section */
/* Begin PBXCopyFilesBuildPhase section */
@ -24,9 +22,7 @@
dstPath = "";
dstSubfolderSpec = 10;
files = (
179CFD4C0B90C6DF00C8C4DB /* WavPack.framework in CopyFiles */,
177FCF950B90C9450011C3B5 /* Plugin.h in CopyFiles */,
17ADB2620B97946600257CA2 /* WavPackPlugin.h in CopyFiles */,
8E2B8FE70B9B63CF00F2D9E8 /* WavPack.framework in CopyFiles */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -41,12 +37,12 @@
1745C4D70B90C42500A6768C /* WavPackPropertiesReader.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = WavPackPropertiesReader.h; sourceTree = "<group>"; };
1745C4D80B90C42500A6768C /* WavPackPropertiesReader.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = WavPackPropertiesReader.m; sourceTree = "<group>"; };
177FCF940B90C9450011C3B5 /* Plugin.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = Plugin.h; path = ../../Audio/Plugin.h; sourceTree = SOURCE_ROOT; };
179CFD480B90C6DC00C8C4DB /* WavPack.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WavPack.framework; path = ../../Frameworks/WavPack/build/Release/WavPack.framework; sourceTree = SOURCE_ROOT; };
17ADB2600B97946600257CA2 /* WavPackPlugin.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = WavPackPlugin.h; sourceTree = "<group>"; };
17ADB2610B97946600257CA2 /* WavPackPlugin.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = WavPackPlugin.m; sourceTree = "<group>"; };
32DBCF630370AF2F00C91783 /* WavPack_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WavPack_Prefix.pch; sourceTree = "<group>"; };
8D5B49B6048680CD000E48DA /* WavPack.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = WavPack.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
8D5B49B7048680CD000E48DA /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = Info.plist; sourceTree = "<group>"; };
8E2B8FE30B9B63CD00F2D9E8 /* WavPack.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WavPack.framework; path = ../../Frameworks/WavPack/build/Release/WavPack.framework; sourceTree = SOURCE_ROOT; };
D2F7E65807B2D6F200F64583 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = "<absolute>"; };
/* End PBXFileReference section */
@ -56,7 +52,7 @@
buildActionMask = 2147483647;
files = (
8D5B49B4048680CD000E48DA /* Cocoa.framework in Frameworks */,
179CFD490B90C6DC00C8C4DB /* WavPack.framework in Frameworks */,
8E2B8FE40B9B63CD00F2D9E8 /* WavPack.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -109,7 +105,7 @@
1058C7ACFEA557BF11CA2CBB /* Linked Frameworks */ = {
isa = PBXGroup;
children = (
179CFD480B90C6DC00C8C4DB /* WavPack.framework */,
8E2B8FE30B9B63CD00F2D9E8 /* WavPack.framework */,
1058C7ADFEA557BF11CA2CBB /* Cocoa.framework */,
);
name = "Linked Frameworks";
@ -210,9 +206,13 @@
"$(inherited)",
"$(FRAMEWORK_SEARCH_PATHS_QUOTED_1)",
"$(FRAMEWORK_SEARCH_PATHS_QUOTED_2)",
"$(FRAMEWORK_SEARCH_PATHS_QUOTED_3)",
"$(FRAMEWORK_SEARCH_PATHS_QUOTED_4)",
);
FRAMEWORK_SEARCH_PATHS_QUOTED_1 = "\"$(SRCROOT)/../../../Frameworks/WavPack/build/Release\"";
FRAMEWORK_SEARCH_PATHS_QUOTED_2 = "\"$(SRCROOT)/../../Frameworks/WavPack/build/Release\"";
FRAMEWORK_SEARCH_PATHS_QUOTED_3 = "\"$(SRCROOT)/../../Frameworks/WavPack/build/Debug\"";
FRAMEWORK_SEARCH_PATHS_QUOTED_4 = "\"$(SRCROOT)/../../Frameworks/WavPack/build/Release\"";
GCC_DYNAMIC_NO_PIC = NO;
GCC_ENABLE_FIX_AND_CONTINUE = YES;
GCC_MODEL_TUNING = G5;
@ -238,9 +238,13 @@
"$(inherited)",
"$(FRAMEWORK_SEARCH_PATHS_QUOTED_1)",
"$(FRAMEWORK_SEARCH_PATHS_QUOTED_2)",
"$(FRAMEWORK_SEARCH_PATHS_QUOTED_3)",
"$(FRAMEWORK_SEARCH_PATHS_QUOTED_4)",
);
FRAMEWORK_SEARCH_PATHS_QUOTED_1 = "\"$(SRCROOT)/../../../Frameworks/WavPack/build/Release\"";
FRAMEWORK_SEARCH_PATHS_QUOTED_2 = "\"$(SRCROOT)/../../Frameworks/WavPack/build/Release\"";
FRAMEWORK_SEARCH_PATHS_QUOTED_3 = "\"$(SRCROOT)/../../Frameworks/WavPack/build/Debug\"";
FRAMEWORK_SEARCH_PATHS_QUOTED_4 = "\"$(SRCROOT)/../../Frameworks/WavPack/build/Release\"";
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
GCC_MODEL_TUNING = G5;
GCC_PRECOMPILE_PREFIX_HEADER = YES;

View File

@ -14,6 +14,9 @@
@interface WavPackDecoder : NSObject <CogDecoder>
{
WavpackContext *wpc;
WavpackStreamReader reader;
id<CogSource> source;
int bitsPerSample;
int channels;
@ -22,4 +25,7 @@
double length;
}
- (void)setSource:(id<CogSource>)s;
- (id<CogSource>)source;
@end

View File

@ -11,14 +11,102 @@
@implementation WavPackDecoder
- (BOOL)open:(NSURL *)url
int32_t ReadBytesProc(void *ds, void *data, int32_t bcount)
{
WavPackDecoder *decoder = (WavPackDecoder *)ds;
return [[decoder source] read:data amount:bcount];
}
uint32_t GetPosProc(void *ds)
{
WavPackDecoder *decoder = (WavPackDecoder *)ds;
return [[decoder source] tell];
}
int SetPosAbsProc(void *ds, uint32_t pos)
{
WavPackDecoder *decoder = (WavPackDecoder *)ds;
return ([[decoder source] seek:pos whence:SEEK_SET] ? 0: -1);
}
int SetPosRelProc(void *ds, int32_t delta, int mode)
{
WavPackDecoder *decoder = (WavPackDecoder *)ds;
return ([[decoder source] seek:delta whence:mode] ? 0: -1);
}
int PushBackByteProc(void *ds, int c)
{
WavPackDecoder *decoder = (WavPackDecoder *)ds;
if ([[decoder source] seekable]) {
[[decoder source] seek:-1 whence:SEEK_CUR];
return c;
}
else {
return -1;
}
}
uint32_t GetLengthProc(void *ds)
{
WavPackDecoder *decoder = (WavPackDecoder *)ds;
if ([[decoder source] seekable]) {
long currentPos = [[decoder source] tell];
[[decoder source] seek:0 whence:SEEK_END];
long size = [[decoder source] tell];
[[decoder source] seek:currentPos whence:SEEK_SET];
return size;
}
else {
return 0;
}
}
int CanSeekProc(void *ds)
{
WavPackDecoder *decoder = (WavPackDecoder *)ds;
return [[decoder source] seekable];
}
int32_t WriteBytesProc(void *ds, void *data, int32_t bcount)
{
return -1;
}
- (BOOL)open:(id<CogSource>)s
{
int open_flags = 0;
char error[80];
[self setSource:s];
wpc = WavpackOpenFileInput([[url path] UTF8String], error, open_flags, 0);
if (!wpc)
reader.read_bytes = ReadBytesProc;
reader.get_pos = GetPosProc;
reader.set_pos_abs = SetPosAbsProc;
reader.set_pos_rel = SetPosRelProc;
reader.push_back_byte = PushBackByteProc;
reader.get_length = GetLengthProc;
reader.can_seek = CanSeekProc;
reader.write_bytes = WriteBytesProc;
//No corrections file (WVC) support at the moment.
wpc = WavpackOpenFileInputEx(&reader, self, NULL, error, open_flags, 0);
if (!wpc) {
NSLog(@"Unable to open file..");
return NO;
}
channels = WavpackGetNumChannels(wpc);
bitsPerSample = WavpackGetBitsPerSample(wpc);
@ -29,9 +117,12 @@
bitrate = (int)(WavpackGetAverageBitrate(wpc, TRUE)/1000.0);
[self willChangeValueForKey:@"properties"];
[self didChangeValueForKey:@"properties"];
return YES;
}
/*
- (int)fillBuffer:(void *)buf ofSize:(UInt32)size
{
int numsamples;
@ -47,12 +138,85 @@
{
((UInt16 *)buf)[i] = ((UInt32 *)sampleBuf)[i];
}
n *= (bitsPerSample/8)*channels;
free(sampleBuf);
return n;
}
*/
- (int)fillBuffer:(void *)buf ofSize:(UInt32)size
{
uint32_t sample;
int32_t audioSample;
uint32_t samplesRead;
int8_t *alias8;
int16_t *alias16;
int32_t *alias32;
int inputBufferLength = size / (bitsPerSample/8);
int32_t *inputBuffer = malloc(inputBufferLength*sizeof(int32_t));
// Wavpack uses "complete" samples (one sample across all channels), i.e. a Core Audio frame
samplesRead = WavpackUnpackSamples(wpc, inputBuffer, inputBufferLength/channels);
// Handle floating point files
// Perform hard clipping and convert to integers
if(MODE_FLOAT & WavpackGetMode(wpc) && 127 == WavpackGetFloatNormExp(wpc)) {
float f;
alias32 = inputBuffer;
for(sample = 0; sample < samplesRead * channels; ++sample) {
f = * ((float *) alias32);
if(f > 1.0) { f = 1.0; }
if(f < -1.0) { f = -1.0; }
// *alias32++ = (int32_t) (f * 2147483647.0);
*alias32++ = (int32_t) (f * 32767.0);
}
}
switch(bitsPerSample) {
case 8:
// No need for byte swapping
alias8 = buf;
for(sample = 0; sample < samplesRead * channels; ++sample) {
*alias8++ = (int8_t)inputBuffer[sample];
}
break;
case 16:
// Convert to big endian byte order
alias16 = buf;
for(sample = 0; sample < samplesRead*channels; ++sample) {
*alias16++ = (int16_t)OSSwapHostToBigInt16((int16_t)inputBuffer[sample]);
}
break;
case 24:
// Convert to big endian byte order
alias8 = buf;
for(sample = 0; sample < samplesRead * channels; ++sample) {
audioSample = OSSwapHostToBigInt32(inputBuffer[sample]);
*alias8++ = (int8_t)(audioSample >> 16);
*alias8++ = (int8_t)(audioSample >> 8);
*alias8++ = (int8_t)audioSample;
}
break;
case 32:
// Convert to big endian byte order
alias32 = buf;
for(sample = 0; sample < samplesRead * channels; ++sample) {
*alias32++ = OSSwapHostToBigInt32(inputBuffer[sample]);
}
break;
default:
NSLog(@"Unsupported sample size..");
}
free(inputBuffer);
return samplesRead * channels * (bitsPerSample/8);
}
- (double)seekToTime:(double)milliseconds
{
@ -69,6 +233,22 @@
WavpackCloseFile(wpc);
}
- (void)setSource:(id<CogSource>)s
{
[s retain];
[source release];
source = s;
}
- (id<CogSource>)source
{
return source;
}
- (BOOL)seekable
{
return [source seekable];
}
- (NSDictionary *)properties
{

View File

@ -16,7 +16,7 @@
{
return [NSDictionary dictionaryWithObjectsAndKeys:
kCogDecoder, [WavPackDecoder className],
kCogPropertiesReader, [WavPackPropertiesReader className,
kCogPropertiesReader, [WavPackPropertiesReader className],
nil
];
}

View File

@ -11,13 +11,13 @@
@implementation WavPackPropertiesReader
- (NSDictionary *)propertiesForURL:(NSURL *)url
+ (NSDictionary *)propertiesForSource:(id<CogSource>)source
{
NSDictionary *properties;
WavPackDecoder *decoder;
decoder = [[WavPackDecoder alloc] init];
if (![decoder open:url])
if (![decoder open:source])
{
return nil;
}