Metadata: Now supports storing cuesheet tags and encoding quality status properties

CQTexperiment
Christopher Snowhill 2022-01-21 22:38:54 -08:00
parent 2165d37144
commit 0c4d5002f6
25 changed files with 178 additions and 37 deletions

View File

@ -15,16 +15,16 @@
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<window title="Info Inspector" separatorStyle="none" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" hidesOnDeactivate="YES" visibleAtLaunch="NO" frameAutosaveName="InfoInspector" animationBehavior="default" titlebarAppearsTransparent="YES" id="1" customClass="NSPanel">
<windowStyleMask key="styleMask" titled="YES" closable="YES" resizable="YES" utility="YES" nonactivatingPanel="YES" HUD="YES"/>
<rect key="contentRect" x="700" y="80" width="300" height="494"/>
<rect key="contentRect" x="700" y="80" width="300" height="516"/>
<rect key="screenRect" x="0.0" y="0.0" width="1920" height="1055"/>
<value key="minSize" type="size" width="240" height="420"/>
<value key="maxSize" type="size" width="400" height="600"/>
<view key="contentView" id="2">
<rect key="frame" x="0.0" y="0.0" width="300" height="494"/>
<rect key="frame" x="0.0" y="0.0" width="300" height="516"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="9">
<rect key="frame" x="60" y="438" width="45" height="14"/>
<rect key="frame" x="60" y="460" width="45" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Artist:" id="10">
<font key="font" metaFont="smallSystem"/>
@ -33,7 +33,7 @@
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="11">
<rect key="frame" x="62" y="416" width="43" height="14"/>
<rect key="frame" x="62" y="438" width="43" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Album:" id="12">
<font key="font" metaFont="smallSystem"/>
@ -42,7 +42,7 @@
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="13">
<rect key="frame" x="67" y="372" width="38" height="14"/>
<rect key="frame" x="67" y="394" width="38" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Track:" id="14">
<font key="font" metaFont="smallSystem"/>
@ -51,7 +51,7 @@
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="15">
<rect key="frame" x="60" y="350" width="45" height="14"/>
<rect key="frame" x="60" y="372" width="45" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Length:" id="16">
<font key="font" metaFont="smallSystem"/>
@ -60,7 +60,7 @@
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="17">
<rect key="frame" x="73" y="328" width="32" height="14"/>
<rect key="frame" x="73" y="350" width="32" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Year:" id="18">
<font key="font" metaFont="smallSystem"/>
@ -69,7 +69,7 @@
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="19">
<rect key="frame" x="65" y="306" width="40" height="14"/>
<rect key="frame" x="65" y="328" width="40" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Genre:" id="20">
<font key="font" metaFont="smallSystem"/>
@ -78,7 +78,7 @@
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="21">
<rect key="frame" x="32" y="262" width="73" height="14"/>
<rect key="frame" x="32" y="284" width="73" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Sample Rate:" id="22">
<font key="font" metaFont="smallSystem"/>
@ -87,7 +87,7 @@
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="27">
<rect key="frame" x="48" y="240" width="57" height="14"/>
<rect key="frame" x="48" y="262" width="57" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Channels:" id="28">
<font key="font" metaFont="smallSystem"/>
@ -96,7 +96,7 @@
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="29">
<rect key="frame" x="63" y="218" width="42" height="14"/>
<rect key="frame" x="63" y="240" width="42" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Bitrate:" id="32">
<font key="font" metaFont="smallSystem"/>
@ -105,7 +105,7 @@
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="30">
<rect key="frame" x="15" y="196" width="90" height="14"/>
<rect key="frame" x="15" y="218" width="90" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Bits Per Sample:" id="31">
<font key="font" metaFont="smallSystem"/>
@ -114,7 +114,7 @@
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="23">
<rect key="frame" x="73" y="394" width="32" height="14"/>
<rect key="frame" x="73" y="416" width="32" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Title:" id="24">
<font key="font" metaFont="smallSystem"/>
@ -123,7 +123,7 @@
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="33" customClass="ToolTipTextField">
<rect key="frame" x="113" y="438" width="170" height="14"/>
<rect key="frame" x="113" y="460" width="170" height="14"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" sendsActionOnEndEditing="YES" title="N/A" id="34">
<font key="font" metaFont="smallSystem"/>
@ -135,7 +135,7 @@
</connections>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="35" customClass="ToolTipTextField">
<rect key="frame" x="113" y="416" width="170" height="14"/>
<rect key="frame" x="113" y="438" width="170" height="14"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" sendsActionOnEndEditing="YES" title="N/A" id="36">
<font key="font" metaFont="smallSystem"/>
@ -147,7 +147,7 @@
</connections>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="37" customClass="ToolTipTextField">
<rect key="frame" x="113" y="394" width="170" height="14"/>
<rect key="frame" x="113" y="416" width="170" height="14"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" sendsActionOnEndEditing="YES" title="N/A" id="38">
<font key="font" metaFont="smallSystem"/>
@ -159,7 +159,7 @@
</connections>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="39" customClass="ToolTipTextField">
<rect key="frame" x="113" y="372" width="170" height="14"/>
<rect key="frame" x="113" y="394" width="170" height="14"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" sendsActionOnEndEditing="YES" title="N/A" id="40">
<font key="font" metaFont="smallSystem"/>
@ -171,7 +171,7 @@
</connections>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="41" customClass="ToolTipTextField">
<rect key="frame" x="113" y="350" width="170" height="14"/>
<rect key="frame" x="113" y="372" width="170" height="14"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" sendsActionOnEndEditing="YES" title="N/A" id="42">
<font key="font" metaFont="smallSystem"/>
@ -183,7 +183,7 @@
</connections>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="43" customClass="ToolTipTextField">
<rect key="frame" x="113" y="328" width="170" height="14"/>
<rect key="frame" x="113" y="350" width="170" height="14"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" sendsActionOnEndEditing="YES" title="N/A" id="44">
<font key="font" metaFont="smallSystem"/>
@ -195,7 +195,7 @@
</connections>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="45" customClass="ToolTipTextField">
<rect key="frame" x="113" y="306" width="170" height="14"/>
<rect key="frame" x="113" y="328" width="170" height="14"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" sendsActionOnEndEditing="YES" title="N/A" id="46">
<font key="font" metaFont="smallSystem"/>
@ -207,7 +207,7 @@
</connections>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="49" customClass="ToolTipTextField">
<rect key="frame" x="113" y="262" width="170" height="14"/>
<rect key="frame" x="113" y="284" width="170" height="14"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" sendsActionOnEndEditing="YES" title="N/A" id="50">
<font key="font" metaFont="smallSystem"/>
@ -219,7 +219,7 @@
</connections>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="51" customClass="ToolTipTextField">
<rect key="frame" x="113" y="240" width="170" height="14"/>
<rect key="frame" x="113" y="262" width="170" height="14"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" sendsActionOnEndEditing="YES" title="N/A" id="52">
<font key="font" metaFont="smallSystem"/>
@ -231,7 +231,7 @@
</connections>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="53" customClass="ToolTipTextField">
<rect key="frame" x="113" y="218" width="170" height="14"/>
<rect key="frame" x="113" y="240" width="170" height="14"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" sendsActionOnEndEditing="YES" title="N/A" id="54">
<font key="font" metaFont="smallSystem"/>
@ -243,7 +243,7 @@
</connections>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="55" customClass="ToolTipTextField">
<rect key="frame" x="113" y="196" width="170" height="14"/>
<rect key="frame" x="113" y="218" width="170" height="14"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" sendsActionOnEndEditing="YES" title="N/A" id="56">
<font key="font" metaFont="smallSystem"/>
@ -255,7 +255,7 @@
</connections>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="QPg-Mb-Urn">
<rect key="frame" x="60" y="174" width="45" height="14"/>
<rect key="frame" x="60" y="196" width="45" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Codec:" id="cbq-TT-CZX">
<font key="font" metaFont="smallSystem"/>
@ -264,7 +264,7 @@
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ijS-y2-eCZ" customClass="ToolTipTextField">
<rect key="frame" x="113" y="174" width="170" height="14"/>
<rect key="frame" x="113" y="196" width="170" height="14"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" sendsActionOnEndEditing="YES" title="N/A" id="Yby-OU-cqP">
<font key="font" metaFont="smallSystem"/>
@ -275,8 +275,29 @@
<binding destination="-2" name="value" keyPath="valueToDisplay.codec" id="Tle-Vx-BN5"/>
</connections>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="bti-s6-SIU">
<rect key="frame" x="38" y="174" width="67" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Encoding:" id="8e7-lp-K5l">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="L4f-rE-CN3" customClass="ToolTipTextField">
<rect key="frame" x="113" y="174" width="170" height="14"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" sendsActionOnEndEditing="YES" title="N/A" id="v14-AG-B9D">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
<binding destination="-2" name="value" keyPath="valueToDisplay.encoding" id="BWi-9r-yOR"/>
</connections>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="84">
<rect key="frame" x="49" y="284" width="56" height="14"/>
<rect key="frame" x="49" y="306" width="56" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Filename:" id="85">
<font key="font" metaFont="smallSystem"/>
@ -285,7 +306,7 @@
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="86" customClass="ToolTipTextField">
<rect key="frame" x="113" y="284" width="170" height="14"/>
<rect key="frame" x="113" y="306" width="170" height="14"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" sendsActionOnEndEditing="YES" title="N/A" id="87">
<font key="font" metaFont="smallSystem"/>
@ -311,7 +332,7 @@
</connections>
</imageView>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="vB6-9J-5qg">
<rect key="frame" x="18" y="460" width="87" height="14"/>
<rect key="frame" x="18" y="482" width="87" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Album Artist:" id="LFJ-QQ-gGr">
<font key="font" metaFont="smallSystem"/>
@ -320,7 +341,7 @@
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="cj0-Tw-xpq" customClass="ToolTipTextField">
<rect key="frame" x="113" y="460" width="170" height="14"/>
<rect key="frame" x="113" y="482" width="170" height="14"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" sendsActionOnEndEditing="YES" title="N/A" id="B8w-o8-ZBw">
<font key="font" metaFont="smallSystem"/>

View File

@ -59,6 +59,8 @@
NSString *codec;
NSString *endian;
NSString *encoding;
BOOL seekable;
@ -149,6 +151,8 @@
@property(retain) NSString *endian;
@property(retain) NSString *encoding;
@property BOOL seekable;
@property BOOL metadataLoaded;

View File

@ -59,6 +59,8 @@
@synthesize endian;
@synthesize encoding;
@synthesize seekable;
@synthesize metadataLoaded;
@ -491,6 +493,8 @@
pe->codec = [codec copyWithZone:zone];
pe->endian = [endian copyWithZone:zone];
pe->encoding = [encoding copyWithZone:zone];
pe->seekable = seekable;

View File

@ -98,6 +98,7 @@ static CAdPlugDatabase * g_database = NULL;
[NSNumber numberWithInt:2], @"channels", //output from gme_play is in stereo
[NSNumber numberWithBool:YES], @"seekable",
[NSString stringWithUTF8String:m_player->gettype().c_str()], @"codec",
@"synthesized", @"encoding",
@"host", @"endian",
nil];
}

View File

@ -349,6 +349,7 @@ static SInt64 getSizeProc(void* clientData) {
[NSNumber numberWithBool:YES], @"seekable",
codec, @"codec",
floatingPoint ? @"host" : @"big", @"endian",
floatingPoint ? @"lossy" : @"lossless", @"encoding",
nil];
}

View File

@ -580,6 +580,7 @@ int lockmgr_callback(void ** mutex, enum AVLockOp op)
[NSNumber numberWithBool:seekable], @"seekable",
[NSString stringWithUTF8String:avcodec_get_name(codecCtx->codec_id)], @"codec",
@"host", @"endian",
floatingPoint ? @"lossy" : @"lossless", @"encoding",
nil];
}

View File

@ -348,6 +348,7 @@ void ErrorCallback(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorS
[NSNumber numberWithInt:fileSize ? (fileSize * 8 / ((totalFrames + (frequency / 2)) / frequency)) / 1000 : 0], @"bitrate",
@"FLAC",@"codec",
@"big",@"endian",
@"lossless", @"encoding",
nil];
}

View File

@ -160,6 +160,7 @@ gme_err_t readCallback( void* data, void* out, long count )
[NSNumber numberWithInt:2], @"channels", //output from gme_play is in stereo
[NSNumber numberWithBool:[source seekable]], @"seekable",
@"host", @"endian",
@"synthesized", @"encoding",
nil];
}

View File

@ -1727,6 +1727,7 @@ static int usf_info(void * context, const char * name, const char * value)
[NSNumber numberWithFloat:volume], @"volume",
codec, @"codec",
@"host", @"endian",
@"synthesized", @"encoding",
nil];
}

View File

@ -96,6 +96,7 @@ static void oneTimeInit(void)
[NSNumber numberWithInt:2], @"channels",
[NSNumber numberWithBool:YES], @"seekable",
@"host", @"endian",
@"synthesized", @"encoding",
nil];
}

View File

@ -115,6 +115,7 @@ static OSType getOSType(const char * in_)
[NSNumber numberWithBool:YES], @"seekable",
@"MIDI", @"codec",
@"host", @"endian",
@"synthesized", @"encoding",
nil];
}

View File

@ -213,6 +213,7 @@ mpc_bool_t CanSeekProc(mpc_reader *p_reader)
[NSNumber numberWithBool:[source seekable]], @"seekable",
@"Musepack", @"codec",
@"host",@"endian",
@"lossy", @"encoding",
nil];
}

View File

@ -106,6 +106,7 @@ static void g_push_archive_extensions(std::vector<std::string> & list)
[NSNumber numberWithInt:2], @"channels", //output from gme_play is in stereo
[NSNumber numberWithBool:YES], @"seekable",
@"host", @"endian",
@"synthesized", @"encoding",
nil];
}

View File

@ -103,6 +103,7 @@ static void g_push_archive_extensions(std::vector<std::string> & list)
[NSNumber numberWithInt:2], @"channels", //output from gme_play is in stereo
[NSNumber numberWithBool:YES], @"seekable",
@"host", @"endian",
@"synthesized", @"encoding",
nil];
}

View File

@ -169,6 +169,7 @@ opus_int64 sourceTell(void *_stream)
[NSNumber numberWithBool:([source seekable] && seekable)], @"seekable",
@"Opus", @"codec",
@"host", @"endian",
@"lossy", @"encoding",
nil];
}

View File

@ -95,6 +95,7 @@
[NSNumber numberWithBool:seekable ],@"seekable",
@"Shorten",@"codec",
@"little",@"endian",
@"lossless", @"encoding",
nil];
}

View File

@ -46,6 +46,7 @@ enum { channels = 2 };
[NSNumber numberWithInt:channels], @"channels",
[NSNumber numberWithBool:YES], @"seekable",
@"host", @"endian",
@"synthesized", @"encoding",
nil];
}

View File

@ -161,6 +161,7 @@ long sourceTell(void *datasource)
[NSNumber numberWithBool:([source seekable] && seekable)], @"seekable",
@"Vorbis", @"codec",
@"host", @"endian",
@"lossy", @"encoding",
nil];
}

View File

@ -37,6 +37,7 @@
size_t inputBufferSize;
BOOL isDSD;
BOOL isLossy;
int bitsPerSample;
int channels;

View File

@ -187,6 +187,8 @@ int32_t WriteBytesProc(void *ds, void *data, int32_t bcount)
bitrate = (int)(WavpackGetAverageBitrate(wpc, TRUE)/1000.0);
floatingPoint = MODE_FLOAT & WavpackGetMode(wpc) && 127 == WavpackGetFloatNormExp(wpc);
isLossy = !(WavpackGetMode(wpc) & MODE_LOSSLESS);
[self willChangeValueForKey:@"properties"];
[self didChangeValueForKey:@"properties"];
@ -313,6 +315,7 @@ int32_t WriteBytesProc(void *ds, void *data, int32_t bcount)
[NSNumber numberWithBool:[[wv source] seekable]], @"seekable",
@"Wavpack",@"codec",
@"little",@"endian",
isLossy ? @"lossy" : @"lossless", @"encoding",
nil];
}

View File

@ -204,6 +204,7 @@ const int masterVol = 0x10000; // Fixed point 16.16
[NSNumber numberWithInt:numChannels], @"channels", //output from gme_play is in stereo
[NSNumber numberWithBool:[source seekable]], @"seekable",
@"host", @"endian",
@"synthesized", @"encoding",
nil];
}

View File

@ -209,6 +209,7 @@ static void sidTuneLoader(const char* fileName, std::vector<uint8_t>& bufferRef)
[NSNumber numberWithInt:n_channels], @"channels", //output from gme_play is in stereo
[NSNumber numberWithBool:[source seekable]], @"seekable",
@"host", @"endian",
@"synthesized", @"encoding",
nil];
}

View File

@ -174,6 +174,7 @@ static NSString* get_description_tag(const char* description, const char *tag, c
rgTrackPeak, @"replayGainTrackPeak",
codec, @"codec",
@"host", @"endian",
@"lossy/lossless", @"encoding",
nil];
if ( [title isEqualToString:@""] ) {
@ -315,6 +316,7 @@ static NSString* get_description_tag(const char* description, const char *tag, c
[NSNumber numberWithInt:channels], @"channels",
[NSNumber numberWithBool:YES], @"seekable",
@"host", @"endian",
@"lossy/lossless", @"encoding",
nil];
}

View File

@ -14,7 +14,7 @@
{
@private NSString *g_databasePath;
@private sqlite3 *g_database;
@private sqlite3_stmt *stmt[38];
@private sqlite3_stmt *stmt[39];
@private NSMutableArray *databaseMirror;
}

View File

@ -7,6 +7,7 @@
#import <Foundation/Foundation.h>
#import "SQLiteStore.h"
#import "Logging.h"
NSString * getDatabasePath(void)
{
@ -16,6 +17,8 @@ NSString * getDatabasePath(void)
return [basePath stringByAppendingPathComponent:filename];
}
static int64_t currentSchemaVersion = 1;
NSArray * createSchema(void)
{
return @[
@ -40,6 +43,8 @@ NSArray * createSchema(void)
titleid INTEGER, \
genreid INTEGER, \
codecid INTEGER, \
encodingid INTEGER, \
cuesheetid INTEGER, \
track INTEGER, \
year INTEGER, \
unsigned INTEGER, \
@ -73,7 +78,9 @@ NSArray * createSchema(void)
enum
{
stmt_select_string = 0,
stmt_user_version_get = 0,
stmt_select_string,
stmt_select_string_refcount,
stmt_select_string_value,
stmt_bump_string,
@ -119,6 +126,14 @@ enum
stmt_count,
};
enum
{
user_version_get_out_version_number = 0,
};
const char * query_user_version_get = "PRAGMA user_version";
enum
{
select_string_in_id = 1,
@ -264,6 +279,8 @@ enum
select_track_data_out_title_id,
select_track_data_out_genre_id,
select_track_data_out_codec_id,
select_track_data_out_cuesheet_id,
select_track_data_out_encoding_id,
select_track_data_out_track,
select_track_data_out_year,
select_track_data_out_unsigned,
@ -283,7 +300,7 @@ enum
select_track_data_out_replaygaintrackpeak,
};
const char * query_select_track_data = "SELECT urlid, artid, albumid, albumartistid, artistid, titleid, genreid, codecid, track, year, unsigned, bitrate, samplerate, bitspersample, channels, endianid, floatingpoint, totalframes, metadataloaded, seekable, volume, replaygainalbumgain, replaygainalbumpeak, replaygaintrackgain, replaygaintrackpeak FROM knowntracks WHERE (trackid = ?) LIMIT 1";
const char * query_select_track_data = "SELECT urlid, artid, albumid, albumartistid, artistid, titleid, genreid, codecid, cuesheetid, encodingid, track, year, unsigned, bitrate, samplerate, bitspersample, channels, endianid, floatingpoint, totalframes, metadataloaded, seekable, volume, replaygainalbumgain, replaygainalbumpeak, replaygaintrackgain, replaygaintrackpeak FROM knowntracks WHERE (trackid = ?) LIMIT 1";
enum
{
@ -309,6 +326,8 @@ enum
add_track_in_title_id,
add_track_in_genre_id,
add_track_in_codec_id,
add_track_in_cuesheet_id,
add_track_in_encoding_id,
add_track_in_track,
add_track_in_year,
add_track_in_unsigned,
@ -328,7 +347,7 @@ enum
add_track_in_replaygaintrackpeak,
};
const char * query_add_track = "INSERT INTO knowntracks (referencecount, urlid, artid, albumid, albumartistid, artistid, titleid, genreid, codecid, track, year, unsigned, bitrate, samplerate, bitspersample, channels, endianid, floatingpoint, totalframes, metadataloaded, seekable, volume, replaygainalbumgain, replaygainalbumpeak, replaygaintrackgain, replaygaintrackpeak) VALUES (1, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
const char * query_add_track = "INSERT INTO knowntracks (referencecount, urlid, artid, albumid, albumartistid, artistid, titleid, genreid, codecid, cuesheetid, encodingid, track, year, unsigned, bitrate, samplerate, bitspersample, channels, endianid, floatingpoint, totalframes, metadataloaded, seekable, volume, replaygainalbumgain, replaygainalbumpeak, replaygaintrackgain, replaygaintrackpeak) VALUES (1, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
enum
{
@ -347,6 +366,8 @@ enum
update_track_in_title_id,
update_track_in_genre_id,
update_track_in_codec_id,
update_track_in_cuesheet_id,
update_track_in_encoding_id,
update_track_in_track,
update_track_in_year,
update_track_in_unsigned,
@ -367,7 +388,7 @@ enum
update_track_in_id
};
const char * query_update_track = "UPDATE knowntracks SET urlid = ?, artid = ?, albumid = ?, albumartistid = ?, artistid = ?, titleid = ?, genreid = ?, codecid = ?, track = ?, year = ?, unsigned = ?, bitrate = ?, samplerate = ?, bitspersample = ?, channels = ?, endianid = ?, floatingpoint = ?, totalframes = ?, metadataloaded = ?, seekable = ?, volume = ?, replaygainalbumgain = ?, replaygainalbumpeak = ?, replaygaintrackgain = ?, replaygaintrackpeak = ? WHERE trackid = ?";
const char * query_update_track = "UPDATE knowntracks SET urlid = ?, artid = ?, albumid = ?, albumartistid = ?, artistid = ?, titleid = ?, genreid = ?, codecid = ?, cuesheetid = ?, encodingid = ?, track = ?, year = ?, unsigned = ?, bitrate = ?, samplerate = ?, bitspersample = ?, channels = ?, endianid = ?, floatingpoint = ?, totalframes = ?, metadataloaded = ?, seekable = ?, volume = ?, replaygainalbumgain = ?, replaygainalbumpeak = ?, replaygaintrackgain = ?, replaygaintrackpeak = ? WHERE trackid = ?";
enum
@ -575,18 +596,62 @@ static SQLiteStore *g_sharedStore = NULL;
if (sqlite3_open([g_databasePath UTF8String], &g_database) == SQLITE_OK)
{
char * error;
NSArray * schemas = createSchema();
for (NSString *schema in schemas)
{
char * error;
if (sqlite3_exec(g_database, [schema UTF8String], NULL, NULL, &error) != SQLITE_OK)
{
DLog(@"SQLite error: %s", error);
return nil;
}
}
#define PREPARE(name) (sqlite3_prepare(g_database, query_##name, (int)strlen(query_##name), &stmt[stmt_##name], NULL))
#define PREPARE(name) (sqlite3_prepare_v2(g_database, query_##name, (int)strlen(query_##name), &stmt[stmt_##name], NULL))
if (PREPARE(user_version_get))
{
DLog(@"SQlite error: %s", error);
return nil;
}
sqlite3_stmt * st = stmt[stmt_user_version_get];
if (sqlite3_reset(st) ||
sqlite3_step(st) != SQLITE_ROW)
{
return nil;
}
int64_t knownVersion = sqlite3_column_int64(st, user_version_get_out_version_number);
sqlite3_reset(st);
if (knownVersion < currentSchemaVersion)
{
switch (knownVersion)
{
case 0:
// Schema 0 to 1: Add cuesheet and encoding text fields to the knowntracks table
if (sqlite3_exec(g_database, "ALTER TABLE knowntracks ADD encodingid INTEGER; ALTER TABLE knowntracks ADD cuesheetid INTEGER", NULL, NULL, &error))
{
DLog(@"SQLite error: %s", error);
return nil;
}
break;
default:
break;
}
NSString * updateVersion = [NSString stringWithFormat:@"PRAGMA user_version = %lld", currentSchemaVersion];
if (sqlite3_exec(g_database, [updateVersion UTF8String], NULL, NULL, &error))
{
DLog(@"SQLite error: %s", error);
return nil;
}
}
if (PREPARE(select_string) ||
PREPARE(select_string_refcount) ||
@ -1031,6 +1096,8 @@ static SQLiteStore *g_sharedStore = NULL;
int64_t titleId = [self addString:[track rawTitle]];
int64_t genreId = [self addString:[track genre]];
int64_t codecId = [self addString:[track codec]];
int64_t cuesheetId = [self addString:[track cuesheet]];
int64_t encodingId = [self addString:[track encoding]];
int64_t trackNr = [[track track] intValue] | (((uint64_t)[[track disc] intValue]) << 32);
int64_t year = [[track year] intValue];
int64_t unsignedFmt = [track Unsigned];
@ -1066,6 +1133,8 @@ static SQLiteStore *g_sharedStore = NULL;
sqlite3_bind_int64(st, add_track_in_title_id, titleId) ||
sqlite3_bind_int64(st, add_track_in_genre_id, genreId) ||
sqlite3_bind_int64(st, add_track_in_codec_id, codecId) ||
sqlite3_bind_int64(st, add_track_in_cuesheet_id, cuesheetId) ||
sqlite3_bind_int64(st, add_track_in_encoding_id, encodingId) ||
sqlite3_bind_int64(st, add_track_in_track, trackNr) ||
sqlite3_bind_int64(st, add_track_in_year, year) ||
sqlite3_bind_int64(st, add_track_in_unsigned, unsignedFmt) ||
@ -1094,6 +1163,8 @@ static SQLiteStore *g_sharedStore = NULL;
[self removeString:titleId];
[self removeString:genreId];
[self removeString:codecId];
[self removeString:cuesheetId];
[self removeString:encodingId];
[self removeString:endianId];
[self removeString:urlId];
@ -1200,6 +1271,8 @@ static SQLiteStore *g_sharedStore = NULL;
int64_t titleId = sqlite3_column_int64(st, select_track_data_out_title_id);
int64_t genreId = sqlite3_column_int64(st, select_track_data_out_genre_id);
int64_t codecId = sqlite3_column_int64(st, select_track_data_out_codec_id);
int64_t cuesheetId = sqlite3_column_int64(st, select_track_data_out_cuesheet_id);
int64_t encodingId = sqlite3_column_int64(st, select_track_data_out_encoding_id);
int64_t endianId = sqlite3_column_int64(st, select_track_data_out_endian_id);
[self removeArt:artId];
@ -1211,6 +1284,8 @@ static SQLiteStore *g_sharedStore = NULL;
[self removeString:titleId];
[self removeString:genreId];
[self removeString:codecId];
[self removeString:cuesheetId];
[self removeString:encodingId];
[self removeString:endianId];
}
@ -1223,6 +1298,8 @@ static SQLiteStore *g_sharedStore = NULL;
int64_t titleId = [self addString:[track rawTitle]];
int64_t genreId = [self addString:[track genre]];
int64_t codecId = [self addString:[track codec]];
int64_t cuesheetId = [self addString:[track cuesheet]];
int64_t encodingId = [self addString:[track encoding]];
int64_t trackNr = [[track track] intValue] | (((uint64_t)[[track disc] intValue]) << 32);
int64_t year = [[track year] intValue];
int64_t unsignedFmt = [track Unsigned];
@ -1258,6 +1335,8 @@ static SQLiteStore *g_sharedStore = NULL;
sqlite3_bind_int64(st, update_track_in_title_id, titleId) ||
sqlite3_bind_int64(st, update_track_in_genre_id, genreId) ||
sqlite3_bind_int64(st, update_track_in_codec_id, codecId) ||
sqlite3_bind_int64(st, update_track_in_cuesheet_id, cuesheetId) ||
sqlite3_bind_int64(st, update_track_in_encoding_id, encodingId) ||
sqlite3_bind_int64(st, update_track_in_track, trackNr) ||
sqlite3_bind_int64(st, update_track_in_year, year) ||
sqlite3_bind_int64(st, update_track_in_unsigned, unsignedFmt) ||
@ -1287,6 +1366,8 @@ static SQLiteStore *g_sharedStore = NULL;
[self removeString:titleId];
[self removeString:genreId];
[self removeString:codecId];
[self removeString:cuesheetId];
[self removeString:encodingId];
[self removeString:endianId];
[self removeString:urlId];
@ -1331,6 +1412,8 @@ static SQLiteStore *g_sharedStore = NULL;
int64_t titleId = sqlite3_column_int64(st, select_track_data_out_title_id);
int64_t genreId = sqlite3_column_int64(st, select_track_data_out_genre_id);
int64_t codecId = sqlite3_column_int64(st, select_track_data_out_codec_id);
int64_t cuesheetId = sqlite3_column_int64(st, select_track_data_out_cuesheet_id);
int64_t encodingId = sqlite3_column_int64(st, select_track_data_out_encoding_id);
int64_t trackNr = sqlite3_column_int64(st, select_track_data_out_track);
int64_t year = sqlite3_column_int64(st, select_track_data_out_year);
int64_t unsignedFmt = sqlite3_column_int64(st, select_track_data_out_unsigned);
@ -1360,6 +1443,8 @@ static SQLiteStore *g_sharedStore = NULL;
[entry setTitle:[self getString:titleId]];
[entry setGenre:[self getString:genreId]];
[entry setCodec:[self getString:codecId]];
[entry setCuesheet:[self getString:cuesheetId]];
[entry setEncoding:[self getString:encodingId]];
[entry setTrack:[NSNumber numberWithInteger:trackNr]];
[entry setDisc:[NSNumber numberWithInteger:discNr]];
[entry setYear:[NSNumber numberWithInteger:year]];
@ -1442,6 +1527,8 @@ static SQLiteStore *g_sharedStore = NULL;
int64_t titleId = sqlite3_column_int64(st, select_track_data_out_title_id);
int64_t genreId = sqlite3_column_int64(st, select_track_data_out_genre_id);
int64_t codecId = sqlite3_column_int64(st, select_track_data_out_codec_id);
int64_t cuesheetId = sqlite3_column_int64(st, select_track_data_out_cuesheet_id);
int64_t encodingId = sqlite3_column_int64(st, select_track_data_out_encoding_id);
int64_t endianId = sqlite3_column_int64(st, select_track_data_out_endian_id);
sqlite3_reset(st);
@ -1455,6 +1542,8 @@ static SQLiteStore *g_sharedStore = NULL;
[self removeString:titleId];
[self removeString:genreId];
[self removeString:codecId];
[self removeString:cuesheetId];
[self removeString:encodingId];
[self removeString:endianId];
}