upgrade deps

This commit is contained in:
2020-11-07 17:14:10 +01:00
parent 94a09513c0
commit 45744e30d8
3 changed files with 50 additions and 15 deletions

View File

@@ -5,10 +5,10 @@ authors = ["Thomas Heck <t@b128.net>"]
edition = "2018" edition = "2018"
[dependencies] [dependencies]
gstreamer-audio = "0.15" gstreamer-audio = "0.16"
gstreamer = "0.15" gstreamer = "0.16"
gstreamer-base = "0.15" gstreamer-base = "0.16"
glib = "0.9" glib = "0.10"
futures = "0.3" futures = "0.3"
num_cpus = "1" num_cpus = "1"
walkdir = "2" walkdir = "2"

View File

@@ -9,8 +9,14 @@ in
rustc rustc
rustfmt rustfmt
rust-analyzer rust-analyzer
pkg-config
gst_all_1.gstreamer gst_all_1.gstreamer
gst_all_1.gst-plugins-base # needed for opus, resample, ...
gst_all_1.gst-plugins-good # needed for flac # needed for opus, resample, ...
gst_all_1.gst-plugins-base
# needed for flac
gst_all_1.gst-plugins-good
]; ];
} }

View File

@@ -1,10 +1,13 @@
use anyhow::{Context, Result}; use anyhow::{Context, Result};
use futures::prelude::*; use futures::prelude::*;
use glib::translate::ToGlibPtr; use glib::GString;
use gstreamer::Element; use gstreamer::Element;
use gstreamer_audio::{prelude::*, AudioEncoder}; use gstreamer_audio::{prelude::*, AudioEncoder};
use gstreamer_base::prelude::*; use gstreamer_base::prelude::*;
use std::path::{Path, PathBuf}; use std::{
ffi,
path::{Path, PathBuf},
};
fn gmake<T: IsA<Element>>(factory_name: &str) -> Result<T> { fn gmake<T: IsA<Element>>(factory_name: &str) -> Result<T> {
let res = gstreamer::ElementFactory::make(factory_name, None) let res = gstreamer::ElementFactory::make(factory_name, None)
@@ -68,17 +71,13 @@ fn main() -> Result<()> {
async fn transcode(src: &Path, dest: &Path) -> Result<()> { async fn transcode(src: &Path, dest: &Path) -> Result<()> {
let file_src: gstreamer_base::BaseSrc = gmake("filesrc")?; let file_src: gstreamer_base::BaseSrc = gmake("filesrc")?;
let src_cstring = ToGlibPtr::<*const libc::c_char>::to_glib_none(src).1; file_src.set_property("location", &path_to_gstring(src))?;
let src_gstring = glib::GString::ForeignOwned(Some(src_cstring));
file_src.set_property("location", &src_gstring)?;
// encode into a tmp file first, then rename to actuall file name, that way we're writing // encode into a tmp file first, then rename to actuall file name, that way we're writing
// "whole" files to the intended file path, ignoring partial files in the mtime check // "whole" files to the intended file path, ignoring partial files in the mtime check
let tmp_dest = dest.with_extension("tmp"); let tmp_dest = dest.with_extension("tmp");
let file_dest: gstreamer_base::BaseSink = gmake("filesink")?; let file_dest: gstreamer_base::BaseSink = gmake("filesink")?;
let tmp_dest_cstring = ToGlibPtr::<*const libc::c_char>::to_glib_none(&tmp_dest).1; file_dest.set_property("location", &path_to_gstring(&tmp_dest))?;
let tmp_dest_gstring = glib::GString::ForeignOwned(Some(tmp_dest_cstring));
file_dest.set_property("location", &tmp_dest_gstring)?;
file_dest.set_sync(false); file_dest.set_sync(false);
let resample: Element = gmake("audioresample")?; let resample: Element = gmake("audioresample")?;
@@ -119,7 +118,7 @@ async fn transcode(src: &Path, dest: &Path) -> Result<()> {
.set_state(gstreamer::State::Playing) .set_state(gstreamer::State::Playing)
.context("Unable to set the pipeline to the `Playing` state")?; .context("Unable to set the pipeline to the `Playing` state")?;
gstreamer::BusStream::new(&bus) bus.stream()
.map(|msg| { .map(|msg| {
use gstreamer::MessageView; use gstreamer::MessageView;
@@ -167,3 +166,33 @@ where
res @ Ok(..) => res, res @ Ok(..) => res,
} }
} }
fn path_to_gstring(path: &Path) -> GString {
let buf = {
let mut buf = Vec::<u8>::new();
// https://stackoverflow.com/a/59224987/5572146
#[cfg(unix)]
{
use std::os::unix::ffi::OsStrExt;
buf.extend(path.as_os_str().as_bytes());
}
#[cfg(windows)]
{
// NOT TESTED
// FIXME: test and post answer to https://stackoverflow.com/questions/38948669
use std::os::windows::ffi::OsStrExt;
buf.extend(
path.as_os_str()
.encode_wide()
.map(|char| char.to_ne_bytes())
.flatten(),
);
}
buf
};
ffi::CString::new(buf).unwrap().into()
}