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