Cleaned up multiple files, testing new ways of grabbing info

This commit is contained in:
G2-Games 2023-09-27 13:59:03 -05:00
parent 02338a69a6
commit 6e100399d8
7 changed files with 132 additions and 31 deletions

8
.gitignore vendored
View file

@ -12,3 +12,11 @@ Cargo.lock
# MSVC Windows builds of rustc generate these, which store debugging information # MSVC Windows builds of rustc generate these, which store debugging information
*.pdb *.pdb
# Stuff from various IDEs
.idea/
*.kate-swp
# Flamegraph things
flamegraph.svg
perf.data*

View file

@ -1,8 +1,7 @@
//! This crate is an interface in rust to control NetMD and Hi-MD minidisc devices. /*!
//! * This crate is an interface in rust to control NetMD and Hi-MD minidisc devices.
//! Documentation coming soon *
* Documentation coming soon
*/
/// This is a test
pub mod netmd; pub mod netmd;
use netmd::interface::NetMDInterface;

View file

@ -938,6 +938,47 @@ impl NetMDInterface {
.into()) .into())
} }
pub fn all_track_titles(&self, wchar: bool) -> Result<Vec<String>, Box<dyn Error>> {
let wchar_value = match wchar {
true => 3,
false => 2,
};
let descriptor_type = match wchar {
true => Descriptor::AudioUTOC4TD,
false => Descriptor::AudioUTOC1TD,
};
self.change_descriptor_state(&descriptor_type, &DescriptorAction::OpenRead);
let mut track_titles: Vec<String> = vec![];
for i in 0..self.track_count().unwrap() {
let mut query = format_query(
"1806 022018%b %w 3000 0a00 ff00 00000000".to_string(),
vec![QueryValue::Number(wchar_value), QueryValue::Number(i as i64)],
)
.unwrap();
let reply = self.send_query(&mut query, false, false)?;
let res = scan_query(
reply,
"1806 022018%? %?%? %?%? %?%? 1000 00%?0000 00%?000a %x".to_string(),
)
.unwrap();
track_titles.push(encoding_rs::SHIFT_JIS
.decode(&res[0].to_vec().unwrap())
.0
.into())
}
self.change_descriptor_state(&descriptor_type, &DescriptorAction::Close);
Ok(track_titles)
}
// Sets the title of the disc // Sets the title of the disc
pub fn set_disc_title(&self, title: String, wchar: bool) -> Result<(), Box<dyn Error>> { pub fn set_disc_title(&self, title: String, wchar: bool) -> Result<(), Box<dyn Error>> {
let current_title = self._disc_title(wchar)?; let current_title = self._disc_title(wchar)?;
@ -1086,11 +1127,42 @@ impl NetMDInterface {
let reply = self.send_query(&mut query, false, false)?; let reply = self.send_query(&mut query, false, false)?;
let res = scan_query(reply, "1806 02201001 %?%? %?%? %?%? 1000 00%?0000 %x".to_string())?; let res = scan_query(reply, "1806 02201001 %?%? %?%? %?%? 1000 00%?0000 %x".to_string())?;
self.change_descriptor_state(&Descriptor::AudioContentsTD, &DescriptorAction::OpenRead); self.change_descriptor_state(&Descriptor::AudioContentsTD, &DescriptorAction::Close);
return Ok(res[0].to_vec().unwrap()); return Ok(res[0].to_vec().unwrap());
} }
pub fn all_track_length(&self) -> Result<Vec<std::time::Duration>, Box<dyn Error>> {
let mut times: Vec<std::time::Duration> = vec![];
self.change_descriptor_state(&Descriptor::AudioContentsTD, &DescriptorAction::OpenRead);
for track in 0..self.track_count()? {
let mut query = format_query(
"1806 02201001 %w %w %w ff00 00000000".to_string(),
vec![
QueryValue::Number(track as i64),
QueryValue::Number(0x3000),
QueryValue::Number(0x0100),
],
)?;
let reply = self.send_query(&mut query, false, false)?;
let res = scan_query(reply, "1806 02201001 %?%? %?%? %?%? 1000 00%?0000 %x".to_string())?;
let result = scan_query(res[0].to_vec().unwrap(), "01 0006 0000 %B %B %B %B".to_string())?;
let times_num: Vec<u64> = result.into_iter().map(|v| v.to_i64().unwrap() as u64).collect();
let time_micros = (times_num[0] * 3600000000) + (times_num[1] * 60000000) + (times_num[2] * 1000000) + (times_num[3] * 11600);
times.push(std::time::Duration::from_micros(time_micros));
}
self.change_descriptor_state(&Descriptor::AudioContentsTD, &DescriptorAction::Close);
Ok(times)
}
/// Gets the length of a track as a `std::time::Duration` /// Gets the length of a track as a `std::time::Duration`
pub fn track_length(&self, track_number: u16) -> Result<std::time::Duration, Box<dyn Error>> { pub fn track_length(&self, track_number: u16) -> Result<std::time::Duration, Box<dyn Error>> {
let raw_value = self._get_track_info(track_number, 0x3000, 0x0100)?; let raw_value = self._get_track_info(track_number, 0x3000, 0x0100)?;

View file

@ -1,3 +1,9 @@
/*!
* This crate is an interface in rust to control NetMD and Hi-MD minidisc devices.
*
* Documentation coming soon
*/
mod base; mod base;
pub mod interface; pub mod interface;
mod query_utils; mod query_utils;

View file

@ -3,17 +3,7 @@ use once_cell::sync::Lazy;
use std::collections::hash_map::HashMap; use std::collections::hash_map::HashMap;
use std::error::Error; use std::error::Error;
// prettier-ignore /**
const FORMAT_TYPE_LEN_DICT: Lazy<HashMap<char, i32>> = Lazy::new(|| {
HashMap::from([
('b', 1), // byte
('w', 2), // word
('d', 4), // doubleword
('q', 8), // quadword
])
});
/*
%b, w, d, q - explained above (can have endiannes overriden by '>' and '<' operators, f. ex. %>d %<q) %b, w, d, q - explained above (can have endiannes overriden by '>' and '<' operators, f. ex. %>d %<q)
%s - Uint8Array preceded by 2 bytes of length %s - Uint8Array preceded by 2 bytes of length
%x - Uint8Array preceded by 2 bytes of length %x - Uint8Array preceded by 2 bytes of length
@ -23,6 +13,15 @@ const FORMAT_TYPE_LEN_DICT: Lazy<HashMap<char, i32>> = Lazy::new(|| {
%W - BCD-encoded 2-byte number %W - BCD-encoded 2-byte number
*/ */
const FORMAT_TYPE_LEN_DICT: Lazy<HashMap<char, i32>> = Lazy::new(|| {
HashMap::from([
('b', 1), // byte
('w', 2), // word
('d', 4), // doubleword
('q', 8), // quadword
])
});
const DEBUG: bool = false; const DEBUG: bool = false;
#[derive(Clone, Debug)] #[derive(Clone, Debug)]

View file

@ -107,6 +107,8 @@ pub fn sanitize_half_width_title(mut title: String) -> Vec<u8> {
title = hira2kata(&title); title = hira2kata(&title);
title = combine(&title); title = combine(&title);
println!("{}", title);
let new_title: String = title let new_title: String = title
.chars() .chars()
.map(|c| { .map(|c| {

View file

@ -27,34 +27,49 @@ fn main() {
Err(_) => continue Err(_) => continue
}; };
println!("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
println!( println!(
"Player Model: {}", "Player Model: {}",
player_controller.net_md_device.device_name().clone().unwrap() player_controller.net_md_device.device_name().clone().unwrap()
); );
println!("Track Count: {:?}", player_controller.track_count().unwrap()); //println!("TEST CASE: {:?}", player_controller.set_track_title(3, "初音ミクの消失".to_string(), false).unwrap());
println!("TEST CASE: {:?}", player_controller.disc_capacity().unwrap()); let now = std::time::SystemTime::now();
let times = player_controller.all_track_length().unwrap();
let titles_hw = player_controller.all_track_titles(false).unwrap();
let titles_fw = player_controller.all_track_titles(true).unwrap();
/*
let now = std::time::SystemTime::now();
for i in 0..player_controller.track_count().unwrap() {
player_controller.track_length(i as u16);
player_controller.track_title(i as u16, false);
player_controller.track_title(i as u16, true);
}
println!("Individual: {}ms", now.elapsed().unwrap().as_millis());
*/
println!( println!(
"Disc Title: {: >18} | {}\n-----------------------------------------------------------------", "━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━
Tracks: {: <21}
Disc Title: {: >21} {}
",
player_controller.track_count().unwrap(),
player_controller.disc_title(false).unwrap(), player_controller.disc_title(false).unwrap(),
player_controller.disc_title(true).unwrap() player_controller.disc_title(true).unwrap()
); );
let mut total = 0;
for i in 0..player_controller.track_count().unwrap() { for i in 0..player_controller.track_count().unwrap() {
println!( println!(
"{: >2} | {:0>2}:{:0>2}:{:0>2} | {:?} : {: >21} | {}", " {: >2} │ {:0>2}:{:0>2}:{:0>2} │ {: >21} │ {}",
i + 1, i + 1,
(player_controller.track_length(i as u16).unwrap().as_secs() / 60) / 60, (times[i as usize].as_secs() / 60) / 60,
(player_controller.track_length(i as u16).unwrap().as_secs() / 60) % 60, (times[i as usize].as_secs() / 60) % 60,
player_controller.track_length(i as u16).unwrap().as_secs() % 60, times[i as usize].as_secs() % 60,
player_controller.track_encoding(i as u16).unwrap(), titles_hw[i as usize],
player_controller.track_title(i as u16, false).unwrap(), titles_fw[i as usize]
player_controller.track_title(i as u16, true).unwrap()
); );
total += player_controller.track_length(i as u16).unwrap().as_secs();
} }
println!("{}", total); println!("────┴──────────┴───────────────────────┴─────────────────────────\nFinished in: [{}ms]", now.elapsed().unwrap().as_millis());
} }
} }