From 024cadf5308b9031d73cd7a5f8c93aa8bd49e911 Mon Sep 17 00:00:00 2001 From: Alexander Capehart Date: Mon, 17 Feb 2025 08:39:09 -0700 Subject: [PATCH] musikr: add id3v1 tag --- musikr/src/main/jni/build.rs | 3 +- musikr/src/main/jni/shim/id3v1_shim.cpp | 31 ++++++++++++ musikr/src/main/jni/shim/id3v1_shim.hpp | 15 ++++++ .../jni/shim/{id3_shim.cpp => id3v2_shim.cpp} | 2 +- .../jni/shim/{id3_shim.hpp => id3v2_shim.hpp} | 0 musikr/src/main/jni/src/taglib/bridge.rs | 15 +++++- musikr/src/main/jni/src/taglib/id3v1.rs | 49 +++++++++++++++++++ musikr/src/main/jni/src/taglib/mod.rs | 18 +++---- 8 files changed, 121 insertions(+), 12 deletions(-) create mode 100644 musikr/src/main/jni/shim/id3v1_shim.cpp create mode 100644 musikr/src/main/jni/shim/id3v1_shim.hpp rename musikr/src/main/jni/shim/{id3_shim.cpp => id3v2_shim.cpp} (98%) rename musikr/src/main/jni/shim/{id3_shim.hpp => id3v2_shim.hpp} (100%) create mode 100644 musikr/src/main/jni/src/taglib/id3v1.rs diff --git a/musikr/src/main/jni/build.rs b/musikr/src/main/jni/build.rs index 49510530c..58b4dc62a 100644 --- a/musikr/src/main/jni/build.rs +++ b/musikr/src/main/jni/build.rs @@ -121,7 +121,8 @@ fn main() { .file("shim/tk_shim.cpp") .file("shim/picture_shim.cpp") .file("shim/xiph_shim.cpp") - .file("shim/id3_shim.cpp") + .file("shim/id3v1_shim.cpp") + .file("shim/id3v2_shim.cpp") .include(format!("taglib/pkg/{}/include", target)) .include(".") // Add the current directory to include path .flag_if_supported("-std=c++14"); diff --git a/musikr/src/main/jni/shim/id3v1_shim.cpp b/musikr/src/main/jni/shim/id3v1_shim.cpp new file mode 100644 index 000000000..8e6abcebe --- /dev/null +++ b/musikr/src/main/jni/shim/id3v1_shim.cpp @@ -0,0 +1,31 @@ +#include "id3v1_shim.hpp" + +namespace taglib_shim { + std::unique_ptr ID3v1Tag_title(const ID3v1::Tag& tag) { + return std::make_unique(tag.title()); + } + + std::unique_ptr ID3v1Tag_artist(const ID3v1::Tag& tag) { + return std::make_unique(tag.artist()); + } + + std::unique_ptr ID3v1Tag_album(const ID3v1::Tag& tag) { + return std::make_unique(tag.album()); + } + + std::unique_ptr ID3v1Tag_comment(const ID3v1::Tag& tag) { + return std::make_unique(tag.comment()); + } + + uint ID3v1Tag_genreIndex(const ID3v1::Tag& tag) { + return tag.genreIndex(); + } + + uint ID3v1Tag_year(const ID3v1::Tag& tag) { + return tag.year(); + } + + uint ID3v1Tag_track(const ID3v1::Tag& tag) { + return tag.track(); + } +} \ No newline at end of file diff --git a/musikr/src/main/jni/shim/id3v1_shim.hpp b/musikr/src/main/jni/shim/id3v1_shim.hpp new file mode 100644 index 000000000..95d937f2a --- /dev/null +++ b/musikr/src/main/jni/shim/id3v1_shim.hpp @@ -0,0 +1,15 @@ +#pragma once + +#include +#include +#include + +namespace taglib_shim { + std::unique_ptr ID3v1Tag_title(const TagLib::ID3v1::Tag& tag); + std::unique_ptr ID3v1Tag_artist(const TagLib::ID3v1::Tag& tag); + std::unique_ptr ID3v1Tag_album(const TagLib::ID3v1::Tag& tag); + std::unique_ptr ID3v1Tag_comment(const TagLib::ID3v1::Tag& tag); + uint ID3v1Tag_genreIndex(const TagLib::ID3v1::Tag& tag); + uint ID3v1Tag_year(const TagLib::ID3v1::Tag& tag); + uint ID3v1Tag_track(const TagLib::ID3v1::Tag& tag); +} \ No newline at end of file diff --git a/musikr/src/main/jni/shim/id3_shim.cpp b/musikr/src/main/jni/shim/id3v2_shim.cpp similarity index 98% rename from musikr/src/main/jni/shim/id3_shim.cpp rename to musikr/src/main/jni/shim/id3v2_shim.cpp index 13a3ab558..b65270146 100644 --- a/musikr/src/main/jni/shim/id3_shim.cpp +++ b/musikr/src/main/jni/shim/id3v2_shim.cpp @@ -1,4 +1,4 @@ -#include "id3_shim.hpp" +#include "id3v2_shim.hpp" namespace taglib_shim { std::unique_ptr Tag_frameList(const TagLib::ID3v2::Tag& tag) { diff --git a/musikr/src/main/jni/shim/id3_shim.hpp b/musikr/src/main/jni/shim/id3v2_shim.hpp similarity index 100% rename from musikr/src/main/jni/shim/id3_shim.hpp rename to musikr/src/main/jni/shim/id3v2_shim.hpp diff --git a/musikr/src/main/jni/src/taglib/bridge.rs b/musikr/src/main/jni/src/taglib/bridge.rs index 51a6500a4..a1d6b2d56 100644 --- a/musikr/src/main/jni/src/taglib/bridge.rs +++ b/musikr/src/main/jni/src/taglib/bridge.rs @@ -32,7 +32,8 @@ mod bridge_impl { include!("shim/tk_shim.hpp"); include!("shim/picture_shim.hpp"); include!("shim/xiph_shim.hpp"); - include!("shim/id3_shim.hpp"); + include!("shim/id3v2_shim.hpp"); + include!("shim/id3v1_shim.hpp"); include!("taglib/mpegfile.h"); #[namespace = "TagLib"] @@ -234,6 +235,18 @@ mod bridge_impl { type CPPByteVector; fn size(self: Pin<&CPPByteVector>) -> u32; fn data(self: Pin<&CPPByteVector>) -> *const c_char; + + #[namespace = "TagLib::ID3v1"] + #[cxx_name = "Tag"] + type CPPID3v1Tag; + + fn ID3v1Tag_title(tag: Pin<&CPPID3v1Tag>) -> UniquePtr; + fn ID3v1Tag_artist(tag: Pin<&CPPID3v1Tag>) -> UniquePtr; + fn ID3v1Tag_album(tag: Pin<&CPPID3v1Tag>) -> UniquePtr; + fn ID3v1Tag_comment(tag: Pin<&CPPID3v1Tag>) -> UniquePtr; + fn ID3v1Tag_genreIndex(tag: Pin<&CPPID3v1Tag>) -> u32; + fn ID3v1Tag_year(tag: Pin<&CPPID3v1Tag>) -> u32; + fn ID3v1Tag_track(tag: Pin<&CPPID3v1Tag>) -> u32; } } diff --git a/musikr/src/main/jni/src/taglib/id3v1.rs b/musikr/src/main/jni/src/taglib/id3v1.rs new file mode 100644 index 000000000..15f75f104 --- /dev/null +++ b/musikr/src/main/jni/src/taglib/id3v1.rs @@ -0,0 +1,49 @@ +use super::bridge::{self, CPPID3v1Tag}; +use super::this::{RefThisMut, RefThis, This, OwnedThis}; +use super::tk::{String, OwnedString}; + +pub struct ID3v1Tag<'file_ref> { + this: RefThisMut<'file_ref, CPPID3v1Tag>, +} + +impl<'file_ref> ID3v1Tag<'file_ref> { + pub(super) fn new(this: RefThisMut<'file_ref, CPPID3v1Tag>) -> Self { + Self { this } + } + + pub fn title(&self) -> Option> { + let title = bridge::ID3v1Tag_title(self.this.pin()); + let string_this = unsafe { OwnedThis::new(title) }; + string_this.map(|this| String::new(this)) + } + + pub fn artist(&self) -> Option> { + let artist = bridge::ID3v1Tag_artist(self.this.pin()); + let string_this = unsafe { OwnedThis::new(artist) }; + string_this.map(|this| String::new(this)) + } + + pub fn album(&self) -> Option> { + let album = bridge::ID3v1Tag_album(self.this.pin()); + let string_this = unsafe { OwnedThis::new(album) }; + string_this.map(|this| String::new(this)) + } + + pub fn comment(&self) -> Option> { + let comment = bridge::ID3v1Tag_comment(self.this.pin()); + let string_this = unsafe { OwnedThis::new(comment) }; + string_this.map(|this| String::new(this)) + } + + pub fn genre_index(&self) -> u32 { + bridge::ID3v1Tag_genreIndex(self.this.pin()) + } + + pub fn year(&self) -> u32 { + bridge::ID3v1Tag_year(self.this.pin()) + } + + pub fn track(&self) -> u32 { + bridge::ID3v1Tag_track(self.this.pin()) + } +} \ No newline at end of file diff --git a/musikr/src/main/jni/src/taglib/mod.rs b/musikr/src/main/jni/src/taglib/mod.rs index f5d2f6fb7..976ec4bbd 100644 --- a/musikr/src/main/jni/src/taglib/mod.rs +++ b/musikr/src/main/jni/src/taglib/mod.rs @@ -1,13 +1,13 @@ mod bridge; - -pub mod audioproperties; -pub mod file; -pub mod file_ref; -pub mod flac; -pub mod id3v2; +mod this; pub mod iostream; -pub mod mpeg; +pub mod file_ref; +pub mod file; +pub mod audioproperties; pub mod ogg; -pub mod tk; +pub mod mpeg; +pub mod flac; pub mod xiph; -pub mod this; \ No newline at end of file +pub mod tk; +pub mod id3v2; +pub mod id3v1;