add ffi and metadata
parent
ebd93fd55f
commit
eb6b7e9c10
|
@ -0,0 +1,147 @@
|
|||
! Copyright (C) 2020 .
|
||||
! See http://factorcode.org/license.txt for BSD license.
|
||||
|
||||
USING: system combinators alien alien.libraries alien.syntax alien.c-types classes.struct ;
|
||||
IN: flac.ffi
|
||||
|
||||
<<
|
||||
"avcodec" {
|
||||
{ [ os unix? ] [ "libFLAC.so" ] }
|
||||
} cond cdecl add-library
|
||||
>>
|
||||
|
||||
TYPEDEF: int FLAC__bool
|
||||
TYPEDEF: int16_t FLAC__int16
|
||||
TYPEDEF: int32_t FLAC__int32
|
||||
TYPEDEF: int64_t FLAC__int64
|
||||
TYPEDEF: uint FLAC__uint8
|
||||
TYPEDEF: uint16_t FLAC__uint16
|
||||
TYPEDEF: uint32_t FLAC__uint32
|
||||
TYPEDEF: uint64_t FLAC__uint64
|
||||
TYPEDEF: uint unsigned
|
||||
TYPEDEF: uint8_t FLAC__byte
|
||||
|
||||
ENUM: FLAC__MetadataType
|
||||
FLAC__METADATA_TYPE_STREAMINFO
|
||||
FLAC__METADATA_TYPE_PADDING
|
||||
FLAC__METADATA_TYPE_APPLICATION
|
||||
FLAC__METADATA_TYPE_SEEKTABLE
|
||||
FLAC__METADATA_TYPE_VORBIS_COMMENT
|
||||
FLAC__METADATA_TYPE_CUESHEET
|
||||
FLAC__METADATA_TYPE_PICTURE
|
||||
FLAC__METADATA_TYPE_UNDEFINED
|
||||
FLAC__METADATA_TYPE_TYPE ;
|
||||
|
||||
STRUCT: FLAC__StreamMetadata_StreamInfo
|
||||
{ min_blocksize unsigned }
|
||||
{ max_blocksize unsigned }
|
||||
{ min_framesize unsigned }
|
||||
{ max_framesize unsigned }
|
||||
{ sample_rate unsigned }
|
||||
{ channels unsigned }
|
||||
{ bits_per_sample unsigned }
|
||||
{ total_samples FLAC__uint64 }
|
||||
{ md5sum FLAC__byte[16] } ;
|
||||
|
||||
STRUCT: FLAC__StreamMetadata_Padding
|
||||
{ dummy int } ;
|
||||
|
||||
STRUCT: FLAC__StreamMetadata_Application
|
||||
{ id FLAC__byte[4] }
|
||||
{ data FLAC__byte* } ;
|
||||
|
||||
STRUCT: FLAC__StreamMetadata_SeekPoint
|
||||
{ sample_number FLAC__uint64 }
|
||||
{ stream_offset FLAC__uint64 }
|
||||
{ frame_samples unsigned } ;
|
||||
|
||||
STRUCT: FLAC__StreamMetadata_SeekTable
|
||||
{ num_points unsigned }
|
||||
{ points FLAC__StreamMetadata_SeekPoint* } ;
|
||||
|
||||
STRUCT: FLAC__StreamMetadata_VorbisComment_Entry
|
||||
{ length FLAC__uint32 }
|
||||
{ entry FLAC__byte* } ;
|
||||
|
||||
STRUCT: FLAC__StreamMetadata_VorbisComment
|
||||
{ vendor_string FLAC__StreamMetadata_VorbisComment_Entry }
|
||||
{ num_comments FLAC__uint32 }
|
||||
{ comments FLAC__StreamMetadata_VorbisComment_Entry* } ;
|
||||
|
||||
STRUCT: FLAC__StreamMetadata_CueSheet_Index
|
||||
{ offset FLAC__uint64 }
|
||||
{ number FLAC__byte } ;
|
||||
|
||||
STRUCT: FLAC__StreamMetadata_CueSheet_Track
|
||||
{ offset FLAC__uint64 }
|
||||
{ number FLAC__byte }
|
||||
{ isrc char[13] }
|
||||
{ type unsigned bits: 1 }
|
||||
{ pre_emphasis unsigned bits: 1 }
|
||||
{ num_indices FLAC__byte }
|
||||
{ indices FLAC__StreamMetadata_CueSheet_Index* } ;
|
||||
|
||||
STRUCT: FLAC__StreamMetadata_CueSheet
|
||||
{ media_catalog_number char[129] }
|
||||
{ lead_in FLAC__uint64 }
|
||||
{ is_cd FLAC__bool }
|
||||
{ num_tracks unsigned }
|
||||
{ tracks FLAC__StreamMetadata_CueSheet_Track* } ;
|
||||
|
||||
ENUM: FLAC__StreamMetadata_Picture_Type
|
||||
FLAC__STREAM_METADATA_PICTURE_TYPE_OTHER
|
||||
FLAC__STREAM_METADATA_PICTURE_TYPE_FILE_ICON_STANDARD
|
||||
FLAC__STREAM_METADATA_PICTURE_TYPE_FILE_ICON
|
||||
FLAC__STREAM_METADATA_PICTURE_TYPE_FRONT_COVER
|
||||
FLAC__STREAM_METADATA_PICTURE_TYPE_BACK_COVER
|
||||
FLAC__STREAM_METADATA_PICTURE_TYPE_LEAFLET_PAGE
|
||||
FLAC__STREAM_METADATA_PICTURE_TYPE_MEDIA
|
||||
FLAC__STREAM_METADATA_PICTURE_TYPE_LEAD_ARTIST
|
||||
FLAC__STREAM_METADATA_PICTURE_TYPE_ARTIST
|
||||
FLAC__STREAM_METADATA_PICTURE_TYPE_CONDUCTOR
|
||||
FLAC__STREAM_METADATA_PICTURE_TYPE_BAND
|
||||
FLAC__STREAM_METADATA_PICTURE_TYPE_COMPOSER
|
||||
FLAC__STREAM_METADATA_PICTURE_TYPE_LYRICIST
|
||||
FLAC__STREAM_METADATA_PICTURE_TYPE_RECORDING_LOCATION
|
||||
FLAC__STREAM_METADATA_PICTURE_TYPE_DURING_RECORDING
|
||||
FLAC__STREAM_METADATA_PICTURE_TYPE_DURING_PERFORMANCE
|
||||
FLAC__STREAM_METADATA_PICTURE_TYPE_VIDEO_SCREEN_CAPTURE
|
||||
FLAC__STREAM_METADATA_PICTURE_TYPE_FISH
|
||||
FLAC__STREAM_METADATA_PICTURE_TYPE_ILLUSTRATION
|
||||
FLAC__STREAM_METADATA_PICTURE_TYPE_BAND_LOGOTYPE
|
||||
FLAC__STREAM_METADATA_PICTURE_TYPE_PUBLISHER_LOGOTYPE ;
|
||||
|
||||
STRUCT: FLAC__StreamMetadata_Picture
|
||||
{ type FLAC__StreamMetadata_Picture_Type }
|
||||
{ mime_type char* }
|
||||
{ description FLAC__byte* }
|
||||
{ width FLAC__uint32 }
|
||||
{ height FLAC__uint32 }
|
||||
{ depth FLAC__uint32 }
|
||||
{ colors FLAC__uint32 }
|
||||
{ data_length FLAC__uint32 }
|
||||
{ data FLAC__byte* } ;
|
||||
|
||||
STRUCT: FLAC__StreamMetadata_Unknown
|
||||
{ data FLAC__byte* } ;
|
||||
|
||||
UNION-STRUCT: metadata-union
|
||||
{ stream_info FLAC__StreamMetadata_StreamInfo }
|
||||
{ padding FLAC__StreamMetadata_Padding }
|
||||
{ application FLAC__StreamMetadata_Application }
|
||||
{ seek_table FLAC__StreamMetadata_SeekTable }
|
||||
{ vorbis_comment FLAC__StreamMetadata_VorbisComment }
|
||||
{ cue_sheet FLAC__StreamMetadata_CueSheet }
|
||||
{ picture FLAC__StreamMetadata_Picture }
|
||||
{ unknown FLAC__StreamMetadata_Unknown } ;
|
||||
|
||||
STRUCT: FLAC__StreamMetadata
|
||||
{ type FLAC__MetadataType }
|
||||
{ is_last FLAC__bool }
|
||||
{ length unsigned }
|
||||
{ data metadata-union } ;
|
||||
|
||||
FUNCTION: FLAC__bool FLAC__metadata_get_streaminfo ( c-string filename, FLAC__StreamMetadata* streaminfo )
|
||||
FUNCTION: FLAC__bool FLAC__metadata_get_tags ( c-string filename, FLAC__StreamMetadata** streaminfo )
|
||||
|
||||
|
|
@ -0,0 +1,140 @@
|
|||
! Copyright (C) 2020 .
|
||||
! See http://factorcode.org/license.txt for BSD license.
|
||||
USING: endian sequences kernel classes.struct io.binary io.files io.encodings io.encodings.string io.encodings.utf8 io.encodings.binary alien.c-types alien.endian math locals accessors prettyprint combinators math.parser strings arrays io.streams.byte-array sequences.generalizations assocs splitting byte-arrays alien.syntax alien.enums io.encodings.ascii pack ;
|
||||
USING: flac.bitstream flac.format ;
|
||||
|
||||
QUALIFIED: bitstreams
|
||||
QUALIFIED: io
|
||||
|
||||
IN: flac.metadata
|
||||
|
||||
ERROR: cuesheet-index-reserved-must-be-zero ;
|
||||
|
||||
: read-metadata-block-header ( -- header )
|
||||
1 flac-read-uint 1 =
|
||||
7 flac-read-uint <metadata-type>
|
||||
24 flac-read-uint
|
||||
metadata-block-header boa ;
|
||||
|
||||
: read-metadata-block-stream-info ( -- stream-info )
|
||||
16 flac-read-uint
|
||||
16 flac-read-uint
|
||||
24 flac-read-uint
|
||||
24 flac-read-uint
|
||||
20 flac-read-uint
|
||||
3 flac-read-uint 1 +
|
||||
5 flac-read-uint 1 +
|
||||
36 flac-read-uint
|
||||
128 flac-read-uint 16 >be bytes>hex-string
|
||||
stream-info boa ;
|
||||
|
||||
: read-metadata-block-seek-table ( length -- seek-table )
|
||||
18 / <iota> [
|
||||
drop
|
||||
64 flac-read-uint
|
||||
64 flac-read-uint
|
||||
16 flac-read-uint
|
||||
seek-point boa
|
||||
] map
|
||||
seek-table boa ;
|
||||
|
||||
|
||||
: read-metadata-block-vorbis-comment ( length -- vorbis-comment )
|
||||
! vorbis comments are in little endian...
|
||||
drop
|
||||
32 flac-read-uint 4 >le be> dup 8 * flac-read-uint swap >n-byte-array utf8 decode
|
||||
32 flac-read-uint 4 >le be> <iota>
|
||||
[
|
||||
drop
|
||||
32 flac-read-uint 4 >le be> dup 8 * flac-read-uint swap >n-byte-array utf8 decode
|
||||
"=" split
|
||||
] map
|
||||
>alist vorbis-comment boa ;
|
||||
|
||||
: encode-vorbis-string ( str -- byte-array )
|
||||
dup binary [ length 4 >le io:write utf8 encode io:write ] with-byte-writer ;
|
||||
|
||||
: encode-vorbis-comments ( assoc -- byte-array )
|
||||
dup binary [
|
||||
length 4 >le io:write
|
||||
[ 2array "=" join encode-vorbis-string io:write ] assoc-each
|
||||
] with-byte-writer ;
|
||||
|
||||
: encode-vorbis-comment ( vorbis-comment -- byte-array )
|
||||
binary [
|
||||
[ vendor-string>> encode-vorbis-string io:write ]
|
||||
[ comments>> encode-vorbis-comments io:write ] bi
|
||||
] with-byte-writer ;
|
||||
|
||||
: encode-padding ( padding -- byte-array )
|
||||
length>> <byte-array> ;
|
||||
|
||||
: read-metadata-block-padding ( length -- padding )
|
||||
dup 8 * flac-read-uint drop flac-padding boa ;
|
||||
|
||||
: read-metadata-block-application ( length -- application )
|
||||
8 * flac-read-uint drop application new ;
|
||||
|
||||
: read-metadata-block-cuesheet ( length -- cuesheet )
|
||||
dup [ 8 * flac-read-uint ] dip >be
|
||||
binary
|
||||
[
|
||||
128 io:read ascii decode
|
||||
8 io:read be>
|
||||
259 io:read drop f
|
||||
1 io:read be> <iota> [
|
||||
drop
|
||||
8 io:read be>
|
||||
1 io:read be>
|
||||
12 io:read ascii decode
|
||||
21 io:read drop 0 <cuesheet-track-type> t
|
||||
1 io:read <iota> [
|
||||
drop
|
||||
8 io:read be>
|
||||
1 io:read be>
|
||||
3 io:read be> = 0 [ cuesheet-index-reserved-must-be-zero ] unless
|
||||
cuesheet-index boa
|
||||
] map
|
||||
cuesheet-track boa
|
||||
] map
|
||||
] with-byte-reader cuesheet boa ;
|
||||
|
||||
: read-metadata-block-picture ( length -- picture )
|
||||
drop
|
||||
32 flac-read-uint <picture-type>
|
||||
32 flac-read-uint dup 8 * flac-read-uint swap >n-byte-array utf8 decode
|
||||
32 flac-read-uint dup 8 * flac-read-uint swap >n-byte-array utf8 decode
|
||||
32 flac-read-uint
|
||||
32 flac-read-uint
|
||||
32 flac-read-uint
|
||||
32 flac-read-uint
|
||||
32 flac-read-uint dup 8 * flac-read-uint swap >n-byte-array
|
||||
picture boa ;
|
||||
|
||||
: read-metadata-block ( metadata length type -- metadata )
|
||||
[
|
||||
{
|
||||
{ metadata-stream-info [ drop read-metadata-block-stream-info >>stream-info ] }
|
||||
{ metadata-padding [ read-metadata-block-padding >>padding ] }
|
||||
{ metadata-application [ read-metadata-block-application >>application ] }
|
||||
{ metadata-seek-table [ read-metadata-block-seek-table >>seek-table ] }
|
||||
{ metadata-vorbis-comment [ read-metadata-block-vorbis-comment >>vorbis-comment ] }
|
||||
{ metadata-cuesheet [ read-metadata-block-cuesheet >>cuesheet ] }
|
||||
{ metadata-picture [ read-metadata-block-picture >>picture ] }
|
||||
} case
|
||||
] with-big-endian ;
|
||||
|
||||
: read/assert-flac-magic ( -- )
|
||||
32 flac-read-uint FLAC-MAGIC = [ not-a-flac-file ] unless ;
|
||||
|
||||
: read-flac-metadata ( -- metadata )
|
||||
read/assert-flac-magic
|
||||
metadata new
|
||||
[
|
||||
read-metadata-block-header
|
||||
[ length>> ] [ type>> ] [ last?>> not ] tri
|
||||
[ read-metadata-block ] dip
|
||||
] loop ;
|
||||
|
||||
: <flac-metadata> ( filename -- metadata )
|
||||
[ read-flac-metadata ] with-flac-file-reader ;
|
Loading…
Reference in New Issue