Adding a transpiled version of [Ralph Irving's squeezelite](https://github.com/ralph-irving/squeezelite).
Transpiled by c2rust: `c2rust transpile --binary main compile_commands.json -r --reduce-type-annotations -o ../squeezers -- -I/usr/lib/clang/9.0.1/include`
This commit is contained in:
commit
33155c6ce2
81
.gitignore
vendored
Normal file
81
.gitignore
vendored
Normal file
@ -0,0 +1,81 @@
|
||||
# ---> Rust
|
||||
# Generated by Cargo
|
||||
# will have compiled files and executables
|
||||
/target/
|
||||
|
||||
# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries
|
||||
# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html
|
||||
Cargo.lock
|
||||
|
||||
# These are backup files generated by rustfmt
|
||||
**/*.rs.bk
|
||||
|
||||
# ---> JetBrains
|
||||
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm
|
||||
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
|
||||
|
||||
# User-specific stuff
|
||||
.idea/**/workspace.xml
|
||||
.idea/**/tasks.xml
|
||||
.idea/**/usage.statistics.xml
|
||||
.idea/**/dictionaries
|
||||
.idea/**/shelf
|
||||
|
||||
# Generated files
|
||||
.idea/**/contentModel.xml
|
||||
|
||||
# Sensitive or high-churn files
|
||||
.idea/**/dataSources/
|
||||
.idea/**/dataSources.ids
|
||||
.idea/**/dataSources.local.xml
|
||||
.idea/**/sqlDataSources.xml
|
||||
.idea/**/dynamic.xml
|
||||
.idea/**/uiDesigner.xml
|
||||
.idea/**/dbnavigator.xml
|
||||
|
||||
# Gradle
|
||||
.idea/**/gradle.xml
|
||||
.idea/**/libraries
|
||||
|
||||
# Gradle and Maven with auto-import
|
||||
# When using Gradle or Maven with auto-import, you should exclude module files,
|
||||
# since they will be recreated, and may cause churn. Uncomment if using
|
||||
# auto-import.
|
||||
# .idea/modules.xml
|
||||
# .idea/*.iml
|
||||
# .idea/modules
|
||||
|
||||
# CMake
|
||||
cmake-build-*/
|
||||
|
||||
# Mongo Explorer plugin
|
||||
.idea/**/mongoSettings.xml
|
||||
|
||||
# File-based project format
|
||||
*.iws
|
||||
|
||||
# IntelliJ
|
||||
out/
|
||||
|
||||
# mpeltonen/sbt-idea plugin
|
||||
.idea_modules/
|
||||
|
||||
# JIRA plugin
|
||||
atlassian-ide-plugin.xml
|
||||
|
||||
# Cursive Clojure plugin
|
||||
.idea/replstate.xml
|
||||
|
||||
# Crashlytics plugin (for Android Studio and IntelliJ)
|
||||
com_crashlytics_export_strings.xml
|
||||
crashlytics.properties
|
||||
crashlytics-build.properties
|
||||
fabric.properties
|
||||
|
||||
# Editor-based Rest Client
|
||||
.idea/httpRequests
|
||||
|
||||
# Android studio 3.1+ serialized cache file
|
||||
.idea/caches/build_file_checksums.ser
|
||||
|
||||
|
29
Cargo.toml
Normal file
29
Cargo.toml
Normal file
@ -0,0 +1,29 @@
|
||||
[workspace]
|
||||
members = [
|
||||
]
|
||||
|
||||
[package]
|
||||
name = "squeezers"
|
||||
authors = ["C2Rust"]
|
||||
version = "0.0.0"
|
||||
publish = false
|
||||
edition = "2018"
|
||||
autobins = false
|
||||
|
||||
[lib]
|
||||
name = "squeezers"
|
||||
path = "lib.rs"
|
||||
crate-type = ["staticlib", "rlib"]
|
||||
|
||||
|
||||
[[bin]]
|
||||
path = "src/main.rs"
|
||||
name = "main"
|
||||
|
||||
[dependencies]
|
||||
c2rust-bitfields = "0.3"
|
||||
c2rust-asm-casts = "0.1"
|
||||
libc = "0.2"
|
||||
|
||||
|
||||
|
33
README.md
Normal file
33
README.md
Normal file
@ -0,0 +1,33 @@
|
||||
Squeezelite v1.9.x, Copyright 2012-2015 Adrian Smith, 2015-2019 Ralph Irving.
|
||||
|
||||
See the squeezelite manpage for usage details.
|
||||
https://ralph-irving.github.io/squeezelite.html
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Contains dsd2pcm library Copyright 2009, 2011 Sebastian Gesemann which
|
||||
is subject to its own license.
|
||||
|
||||
Contains the Daphile Project full dsd patch Copyright 2013-2017 Daphile,
|
||||
which is subject to its own license.
|
||||
|
||||
Option to allow server side upsampling for PCM streams (-W) from
|
||||
squeezelite-R2 (c) Marco Curti 2015, marcoc1712@gmail.com.
|
||||
|
||||
RaspberryPi minimal GPIO Interface
|
||||
http://abyz.me.uk/rpi/pigpio/examples.html#Misc_minimal_gpio.
|
||||
|
||||
This software uses libraries from the FFmpeg project under
|
||||
the LGPLv2.1 and its source can be downloaded from
|
||||
https://sourceforge.net/projects/lmsclients/files/source/
|
13
build.rs
Normal file
13
build.rs
Normal file
@ -0,0 +1,13 @@
|
||||
#[cfg(all(unix, not(target_os = "macos")))]
|
||||
fn main() {
|
||||
|
||||
// add unix dependencies below
|
||||
// println!("cargo:rustc-flags=-l readline");
|
||||
}
|
||||
|
||||
#[cfg(target_os = "macos")]
|
||||
fn main() {
|
||||
|
||||
// add macos dependencies below
|
||||
// println!("cargo:rustc-flags=-l edit");
|
||||
}
|
51
lib.rs
Normal file
51
lib.rs
Normal file
@ -0,0 +1,51 @@
|
||||
#![allow(dead_code)]
|
||||
#![allow(mutable_transmutes)]
|
||||
#![allow(non_camel_case_types)]
|
||||
#![allow(non_snake_case)]
|
||||
#![allow(non_upper_case_globals)]
|
||||
#![allow(unused_assignments)]
|
||||
#![allow(unused_mut)]
|
||||
#![feature(asm)]
|
||||
#![feature(c_variadic)]
|
||||
#![feature(const_raw_ptr_to_usize_cast)]
|
||||
#![feature(extern_types)]
|
||||
#![feature(main)]
|
||||
#![feature(ptr_wrapping_offset_from)]
|
||||
#![feature(register_tool)]
|
||||
#![register_tool(c2rust)]
|
||||
|
||||
#[path = "src/internal.rs"]
|
||||
pub mod internal;
|
||||
#[path = "src/squeezelite_h.rs"]
|
||||
pub mod squeezelite_h;
|
||||
#[path = "src/stdarg_h.rs"]
|
||||
pub mod stdarg_h;
|
||||
#[path = "src/stddef_h.rs"]
|
||||
pub mod stddef_h;
|
||||
#[path = "src/stdlib.rs"]
|
||||
pub mod stdlib;
|
||||
#[macro_use]
|
||||
extern crate c2rust_bitfields;
|
||||
#[macro_use]
|
||||
extern crate c2rust_asm_casts;
|
||||
extern crate libc;
|
||||
|
||||
pub mod src {
|
||||
pub mod buffer;
|
||||
pub mod decode;
|
||||
pub mod faad;
|
||||
pub mod flac;
|
||||
pub mod mad;
|
||||
pub mod mpg;
|
||||
pub mod output;
|
||||
pub mod output_alsa;
|
||||
pub mod output_pa;
|
||||
pub mod output_pack;
|
||||
pub mod output_pulse;
|
||||
pub mod output_stdout;
|
||||
pub mod pcm;
|
||||
pub mod slimproto;
|
||||
pub mod stream;
|
||||
pub mod utils;
|
||||
pub mod vorbis;
|
||||
} // mod src
|
1
rust-toolchain
Normal file
1
rust-toolchain
Normal file
@ -0,0 +1 @@
|
||||
nightly-2019-12-05
|
227
src/buffer.rs
Normal file
227
src/buffer.rs
Normal file
@ -0,0 +1,227 @@
|
||||
use ::libc;
|
||||
|
||||
pub use crate::stddef_h::size_t;
|
||||
pub use crate::stdlib::__uint8_t;
|
||||
pub use crate::stdlib::u_int8_t;
|
||||
|
||||
pub use crate::squeezelite_h::buffer;
|
||||
pub use crate::squeezelite_h::u8_t;
|
||||
pub use crate::stdlib::__pthread_internal_list;
|
||||
pub use crate::stdlib::__pthread_list_t;
|
||||
pub use crate::stdlib::__pthread_mutex_s;
|
||||
use crate::stdlib::free;
|
||||
use crate::stdlib::malloc;
|
||||
pub use crate::stdlib::pthread_mutex_destroy;
|
||||
pub use crate::stdlib::pthread_mutex_init;
|
||||
pub use crate::stdlib::pthread_mutex_lock;
|
||||
pub use crate::stdlib::pthread_mutex_t;
|
||||
pub use crate::stdlib::pthread_mutex_unlock;
|
||||
pub use crate::stdlib::pthread_mutexattr_destroy;
|
||||
pub use crate::stdlib::pthread_mutexattr_init;
|
||||
pub use crate::stdlib::pthread_mutexattr_setprotocol;
|
||||
pub use crate::stdlib::pthread_mutexattr_t;
|
||||
pub use crate::stdlib::C2RustUnnamed_0;
|
||||
pub use crate::stdlib::PTHREAD_PRIO_INHERIT;
|
||||
pub use crate::stdlib::PTHREAD_PRIO_NONE;
|
||||
pub use crate::stdlib::PTHREAD_PRIO_PROTECT;
|
||||
/*
|
||||
* Squeezelite - lightweight headless squeezebox emulator
|
||||
*
|
||||
* (c) Adrian Smith 2012-2015, triode1@btinternet.com
|
||||
* Ralph Irving 2015-2017, ralph_irving@hotmail.com
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
// fifo bufffers
|
||||
// _* called with muxtex locked
|
||||
#[inline]
|
||||
|
||||
unsafe extern "C" fn _buf_used(mut buf: *mut crate::squeezelite_h::buffer) -> libc::c_uint {
|
||||
return if (*buf).writep >= (*buf).readp {
|
||||
(*buf).writep.wrapping_offset_from((*buf).readp) as libc::c_long as libc::c_ulong
|
||||
} else {
|
||||
(*buf).size.wrapping_sub(
|
||||
(*buf).readp.wrapping_offset_from((*buf).writep) as libc::c_long as libc::c_ulong,
|
||||
)
|
||||
} as libc::c_uint;
|
||||
}
|
||||
#[no_mangle]
|
||||
|
||||
pub unsafe extern "C" fn _buf_space(mut buf: *mut crate::squeezelite_h::buffer) -> libc::c_uint {
|
||||
return (*buf)
|
||||
.size
|
||||
.wrapping_sub(_buf_used(buf) as libc::c_ulong)
|
||||
.wrapping_sub(1 as libc::c_int as libc::c_ulong) as libc::c_uint;
|
||||
// reduce by one as full same as empty otherwise
|
||||
}
|
||||
#[no_mangle]
|
||||
|
||||
pub unsafe extern "C" fn _buf_cont_read(
|
||||
mut buf: *mut crate::squeezelite_h::buffer,
|
||||
) -> libc::c_uint {
|
||||
return if (*buf).writep >= (*buf).readp {
|
||||
(*buf).writep.wrapping_offset_from((*buf).readp) as libc::c_long
|
||||
} else {
|
||||
(*buf).wrap.wrapping_offset_from((*buf).readp) as libc::c_long
|
||||
} as libc::c_uint;
|
||||
}
|
||||
#[no_mangle]
|
||||
|
||||
pub unsafe extern "C" fn _buf_cont_write(
|
||||
mut buf: *mut crate::squeezelite_h::buffer,
|
||||
) -> libc::c_uint {
|
||||
return if (*buf).writep >= (*buf).readp {
|
||||
(*buf).wrap.wrapping_offset_from((*buf).writep) as libc::c_long
|
||||
} else {
|
||||
(*buf).readp.wrapping_offset_from((*buf).writep) as libc::c_long
|
||||
} as libc::c_uint;
|
||||
}
|
||||
#[no_mangle]
|
||||
|
||||
pub unsafe extern "C" fn _buf_inc_readp(
|
||||
mut buf: *mut crate::squeezelite_h::buffer,
|
||||
mut by: libc::c_uint,
|
||||
) {
|
||||
(*buf).readp = (*buf).readp.offset(by as isize);
|
||||
if (*buf).readp >= (*buf).wrap {
|
||||
(*buf).readp = (*buf).readp.offset(-((*buf).size as isize))
|
||||
};
|
||||
}
|
||||
#[no_mangle]
|
||||
|
||||
pub unsafe extern "C" fn _buf_inc_writep(
|
||||
mut buf: *mut crate::squeezelite_h::buffer,
|
||||
mut by: libc::c_uint,
|
||||
) {
|
||||
(*buf).writep = (*buf).writep.offset(by as isize);
|
||||
if (*buf).writep >= (*buf).wrap {
|
||||
(*buf).writep = (*buf).writep.offset(-((*buf).size as isize))
|
||||
};
|
||||
}
|
||||
#[no_mangle]
|
||||
|
||||
pub unsafe extern "C" fn buf_flush(mut buf: *mut crate::squeezelite_h::buffer) {
|
||||
crate::stdlib::pthread_mutex_lock(&mut (*buf).mutex);
|
||||
(*buf).readp = (*buf).buf;
|
||||
(*buf).writep = (*buf).buf;
|
||||
crate::stdlib::pthread_mutex_unlock(&mut (*buf).mutex);
|
||||
}
|
||||
// adjust buffer to multiple of mod bytes so reading in multiple always wraps on frame boundary
|
||||
#[no_mangle]
|
||||
|
||||
pub unsafe extern "C" fn buf_adjust(
|
||||
mut buf: *mut crate::squeezelite_h::buffer,
|
||||
mut mod_0: crate::stddef_h::size_t,
|
||||
) {
|
||||
let mut size: crate::stddef_h::size_t = 0;
|
||||
crate::stdlib::pthread_mutex_lock(&mut (*buf).mutex);
|
||||
size =
|
||||
((*buf).base_size.wrapping_div(mod_0) as libc::c_uint as libc::c_ulong).wrapping_mul(mod_0);
|
||||
(*buf).readp = (*buf).buf;
|
||||
(*buf).writep = (*buf).buf;
|
||||
(*buf).wrap = (*buf).buf.offset(size as isize);
|
||||
(*buf).size = size;
|
||||
crate::stdlib::pthread_mutex_unlock(&mut (*buf).mutex);
|
||||
}
|
||||
// called with mutex locked to resize, does not retain contents, reverts to original size if fails
|
||||
#[no_mangle]
|
||||
|
||||
pub unsafe extern "C" fn _buf_resize(
|
||||
mut buf: *mut crate::squeezelite_h::buffer,
|
||||
mut size: crate::stddef_h::size_t,
|
||||
) {
|
||||
crate::stdlib::free((*buf).buf as *mut libc::c_void);
|
||||
(*buf).buf = crate::stdlib::malloc(size) as *mut crate::squeezelite_h::u8_t;
|
||||
if (*buf).buf.is_null() {
|
||||
size = (*buf).size;
|
||||
(*buf).buf = crate::stdlib::malloc(size) as *mut crate::squeezelite_h::u8_t;
|
||||
if (*buf).buf.is_null() {
|
||||
size = 0 as libc::c_int as crate::stddef_h::size_t
|
||||
}
|
||||
}
|
||||
(*buf).readp = (*buf).buf;
|
||||
(*buf).writep = (*buf).buf;
|
||||
(*buf).wrap = (*buf).buf.offset(size as isize);
|
||||
(*buf).size = size;
|
||||
(*buf).base_size = size;
|
||||
}
|
||||
#[no_mangle]
|
||||
|
||||
pub unsafe extern "C" fn buf_init(
|
||||
mut buf: *mut crate::squeezelite_h::buffer,
|
||||
mut size: crate::stddef_h::size_t,
|
||||
) {
|
||||
(*buf).buf = crate::stdlib::malloc(size) as *mut crate::squeezelite_h::u8_t;
|
||||
(*buf).readp = (*buf).buf;
|
||||
(*buf).writep = (*buf).buf;
|
||||
(*buf).wrap = (*buf).buf.offset(size as isize);
|
||||
(*buf).size = size;
|
||||
(*buf).base_size = size;
|
||||
let mut attr = crate::stdlib::pthread_mutexattr_t { __size: [0; 4] };
|
||||
crate::stdlib::pthread_mutexattr_init(&mut attr);
|
||||
crate::stdlib::pthread_mutexattr_setprotocol(
|
||||
&mut attr,
|
||||
crate::stdlib::PTHREAD_PRIO_INHERIT as libc::c_int,
|
||||
);
|
||||
crate::stdlib::pthread_mutex_init(&mut (*buf).mutex, &mut attr);
|
||||
crate::stdlib::pthread_mutexattr_destroy(&mut attr);
|
||||
}
|
||||
/*
|
||||
* Squeezelite - lightweight headless squeezebox emulator
|
||||
*
|
||||
* (c) Adrian Smith 2012-2015, triode1@btinternet.com
|
||||
* Ralph Irving 2015-2017, ralph_irving@hotmail.com
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Additions (c) Paul Hermann, 2015-2017 under the same license terms
|
||||
* -Control of Raspberry pi GPIO for amplifier power
|
||||
* -Launch script on power status change from LMS
|
||||
*/
|
||||
// make may define: PORTAUDIO, SELFPIPE, RESAMPLE, RESAMPLE_MP, VISEXPORT, GPIO, IR, DSD, LINKALL to influence build
|
||||
// build detection
|
||||
// dynamically loaded libraries at run time
|
||||
// !LINKALL
|
||||
// config options
|
||||
// do not reduce as icy-meta max is 4080
|
||||
/* SUN */
|
||||
/* SUN */
|
||||
// printf/scanf formats for u64_t
|
||||
// logging
|
||||
// utils.c (non logging)
|
||||
// buffer.c
|
||||
// _* called with mutex locked
|
||||
#[no_mangle]
|
||||
|
||||
pub unsafe extern "C" fn buf_destroy(mut buf: *mut crate::squeezelite_h::buffer) {
|
||||
if !(*buf).buf.is_null() {
|
||||
crate::stdlib::free((*buf).buf as *mut libc::c_void);
|
||||
(*buf).buf = 0 as *mut crate::squeezelite_h::u8_t;
|
||||
(*buf).size = 0 as libc::c_int as crate::stddef_h::size_t;
|
||||
(*buf).base_size = 0 as libc::c_int as crate::stddef_h::size_t;
|
||||
crate::stdlib::pthread_mutex_destroy(&mut (*buf).mutex);
|
||||
};
|
||||
}
|
669
src/decode.rs
Normal file
669
src/decode.rs
Normal file
@ -0,0 +1,669 @@
|
||||
use ::libc;
|
||||
|
||||
pub use crate::stddef_h::size_t;
|
||||
pub use crate::stdlib::__int32_t;
|
||||
pub use crate::stdlib::__uint32_t;
|
||||
pub use crate::stdlib::__uint64_t;
|
||||
pub use crate::stdlib::__uint8_t;
|
||||
pub use crate::stdlib::__useconds_t;
|
||||
pub use crate::stdlib::int32_t;
|
||||
|
||||
pub use crate::squeezelite_h::_buf_used;
|
||||
pub use crate::squeezelite_h::buffer;
|
||||
pub use crate::squeezelite_h::codec;
|
||||
pub use crate::squeezelite_h::decode_state;
|
||||
pub use crate::squeezelite_h::decodestate;
|
||||
pub use crate::squeezelite_h::disconnect_code;
|
||||
pub use crate::squeezelite_h::fade_dir;
|
||||
pub use crate::squeezelite_h::fade_mode;
|
||||
pub use crate::squeezelite_h::fade_state;
|
||||
pub use crate::squeezelite_h::frames_t;
|
||||
pub use crate::squeezelite_h::lDEBUG;
|
||||
pub use crate::squeezelite_h::lERROR;
|
||||
pub use crate::squeezelite_h::lINFO;
|
||||
pub use crate::squeezelite_h::lSDEBUG;
|
||||
pub use crate::squeezelite_h::lWARN;
|
||||
pub use crate::squeezelite_h::log_level;
|
||||
pub use crate::squeezelite_h::output_format;
|
||||
pub use crate::squeezelite_h::output_state;
|
||||
pub use crate::squeezelite_h::outputstate;
|
||||
pub use crate::squeezelite_h::s32_t;
|
||||
pub use crate::squeezelite_h::stream_state;
|
||||
pub use crate::squeezelite_h::streamstate;
|
||||
pub use crate::squeezelite_h::u32_t;
|
||||
pub use crate::squeezelite_h::u64_t;
|
||||
pub use crate::squeezelite_h::u8_t;
|
||||
pub use crate::squeezelite_h::C2RustUnnamed_1;
|
||||
pub use crate::squeezelite_h::DECODE_COMPLETE;
|
||||
pub use crate::squeezelite_h::DECODE_ERROR;
|
||||
pub use crate::squeezelite_h::DECODE_READY;
|
||||
pub use crate::squeezelite_h::DECODE_RUNNING;
|
||||
pub use crate::squeezelite_h::DECODE_STOPPED;
|
||||
pub use crate::squeezelite_h::DISCONNECT;
|
||||
pub use crate::squeezelite_h::DISCONNECT_OK;
|
||||
pub use crate::squeezelite_h::FADE_ACTIVE;
|
||||
pub use crate::squeezelite_h::FADE_CROSS;
|
||||
pub use crate::squeezelite_h::FADE_CROSSFADE;
|
||||
pub use crate::squeezelite_h::FADE_DOWN;
|
||||
pub use crate::squeezelite_h::FADE_DUE;
|
||||
pub use crate::squeezelite_h::FADE_IN;
|
||||
pub use crate::squeezelite_h::FADE_INACTIVE;
|
||||
pub use crate::squeezelite_h::FADE_INOUT;
|
||||
pub use crate::squeezelite_h::FADE_NONE;
|
||||
pub use crate::squeezelite_h::FADE_OUT;
|
||||
pub use crate::squeezelite_h::FADE_UP;
|
||||
pub use crate::squeezelite_h::LOCAL_DISCONNECT;
|
||||
pub use crate::squeezelite_h::OUTPUT_BUFFER;
|
||||
pub use crate::squeezelite_h::OUTPUT_OFF;
|
||||
pub use crate::squeezelite_h::OUTPUT_PAUSE_FRAMES;
|
||||
pub use crate::squeezelite_h::OUTPUT_RUNNING;
|
||||
pub use crate::squeezelite_h::OUTPUT_SKIP_FRAMES;
|
||||
pub use crate::squeezelite_h::OUTPUT_START_AT;
|
||||
pub use crate::squeezelite_h::OUTPUT_STOPPED;
|
||||
pub use crate::squeezelite_h::RECV_HEADERS;
|
||||
pub use crate::squeezelite_h::REMOTE_DISCONNECT;
|
||||
pub use crate::squeezelite_h::S16_LE;
|
||||
pub use crate::squeezelite_h::S24_3LE;
|
||||
pub use crate::squeezelite_h::S24_LE;
|
||||
pub use crate::squeezelite_h::S32_LE;
|
||||
pub use crate::squeezelite_h::SEND_HEADERS;
|
||||
pub use crate::squeezelite_h::STOPPED;
|
||||
pub use crate::squeezelite_h::STREAMING_BUFFERING;
|
||||
pub use crate::squeezelite_h::STREAMING_FILE;
|
||||
pub use crate::squeezelite_h::STREAMING_HTTP;
|
||||
pub use crate::squeezelite_h::STREAMING_WAIT;
|
||||
pub use crate::squeezelite_h::TIMEOUT;
|
||||
pub use crate::squeezelite_h::UNREACHABLE;
|
||||
pub use crate::src::buffer::_buf_space;
|
||||
pub use crate::src::faad::register_faad;
|
||||
pub use crate::src::flac::register_flac;
|
||||
pub use crate::src::mad::register_mad;
|
||||
pub use crate::src::mpg::register_mpg;
|
||||
pub use crate::src::output::_checkfade;
|
||||
pub use crate::src::pcm::register_pcm;
|
||||
pub use crate::src::slimproto::wake_controller;
|
||||
pub use crate::src::utils::logprint;
|
||||
pub use crate::src::utils::logtime;
|
||||
pub use crate::src::vorbis::register_vorbis;
|
||||
pub use crate::stdlib::__pthread_internal_list;
|
||||
pub use crate::stdlib::__pthread_list_t;
|
||||
pub use crate::stdlib::__pthread_mutex_s;
|
||||
use crate::stdlib::pthread_attr_destroy;
|
||||
use crate::stdlib::pthread_attr_init;
|
||||
use crate::stdlib::pthread_attr_setstacksize;
|
||||
pub use crate::stdlib::pthread_attr_t;
|
||||
use crate::stdlib::pthread_create;
|
||||
use crate::stdlib::pthread_join;
|
||||
use crate::stdlib::pthread_mutex_destroy;
|
||||
use crate::stdlib::pthread_mutex_init;
|
||||
use crate::stdlib::pthread_mutex_lock;
|
||||
pub use crate::stdlib::pthread_mutex_t;
|
||||
use crate::stdlib::pthread_mutex_unlock;
|
||||
pub use crate::stdlib::pthread_mutexattr_t;
|
||||
pub use crate::stdlib::pthread_t;
|
||||
use crate::stdlib::strstr;
|
||||
pub use crate::stdlib::u_int32_t;
|
||||
pub use crate::stdlib::u_int64_t;
|
||||
pub use crate::stdlib::u_int8_t;
|
||||
use crate::stdlib::usleep;
|
||||
extern "C" {
|
||||
#[no_mangle]
|
||||
pub static mut streambuf: *mut crate::squeezelite_h::buffer;
|
||||
#[no_mangle]
|
||||
pub static mut outputbuf: *mut crate::squeezelite_h::buffer;
|
||||
#[no_mangle]
|
||||
pub static mut stream: crate::squeezelite_h::streamstate;
|
||||
#[no_mangle]
|
||||
pub static mut output: crate::squeezelite_h::outputstate;
|
||||
}
|
||||
/*
|
||||
* Squeezelite - lightweight headless squeezebox emulator
|
||||
*
|
||||
* (c) Adrian Smith 2012-2015, triode1@btinternet.com
|
||||
* Ralph Irving 2015-2017, ralph_irving@hotmail.com
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
// decode thread
|
||||
#[no_mangle]
|
||||
|
||||
pub static mut loglevel: crate::squeezelite_h::log_level = crate::squeezelite_h::lERROR;
|
||||
#[no_mangle]
|
||||
|
||||
pub static mut decode: crate::squeezelite_h::decodestate = crate::squeezelite_h::decodestate {
|
||||
state: crate::squeezelite_h::DECODE_STOPPED,
|
||||
new_stream: false,
|
||||
mutex: crate::stdlib::pthread_mutex_t {
|
||||
__data: crate::stdlib::__pthread_mutex_s {
|
||||
__lock: 0,
|
||||
__count: 0,
|
||||
__owner: 0,
|
||||
__nusers: 0,
|
||||
__kind: 0,
|
||||
__spins: 0,
|
||||
__elision: 0,
|
||||
__list: crate::stdlib::__pthread_list_t {
|
||||
__prev: 0 as *const crate::stdlib::__pthread_internal_list
|
||||
as *mut crate::stdlib::__pthread_internal_list,
|
||||
__next: 0 as *const crate::stdlib::__pthread_internal_list
|
||||
as *mut crate::stdlib::__pthread_internal_list,
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
#[no_mangle]
|
||||
|
||||
pub static mut codecs: [*mut crate::squeezelite_h::codec; 10] =
|
||||
[0 as *const crate::squeezelite_h::codec as *mut crate::squeezelite_h::codec; 10];
|
||||
#[no_mangle]
|
||||
|
||||
pub static mut codec: *mut crate::squeezelite_h::codec =
|
||||
0 as *const crate::squeezelite_h::codec as *mut crate::squeezelite_h::codec;
|
||||
|
||||
static mut flac_container: crate::squeezelite_h::u8_t = '?' as i32 as crate::squeezelite_h::u8_t;
|
||||
|
||||
static mut running: bool = 1 as libc::c_int != 0;
|
||||
|
||||
unsafe extern "C" fn decode_thread() -> *mut libc::c_void {
|
||||
while running {
|
||||
let mut bytes: crate::stddef_h::size_t = 0;
|
||||
let mut space: crate::stddef_h::size_t = 0;
|
||||
let mut min_space: crate::stddef_h::size_t = 0;
|
||||
let mut toend: bool = false;
|
||||
let mut ran = 0 as libc::c_int != 0;
|
||||
crate::stdlib::pthread_mutex_lock(&mut (*streambuf).mutex);
|
||||
bytes = crate::squeezelite_h::_buf_used(streambuf) as crate::stddef_h::size_t;
|
||||
toend = stream.state as libc::c_uint
|
||||
<= crate::squeezelite_h::DISCONNECT as libc::c_int as libc::c_uint;
|
||||
crate::stdlib::pthread_mutex_unlock(&mut (*streambuf).mutex);
|
||||
crate::stdlib::pthread_mutex_lock(&mut (*outputbuf).mutex);
|
||||
space = crate::src::buffer::_buf_space(outputbuf) as crate::stddef_h::size_t;
|
||||
crate::stdlib::pthread_mutex_unlock(&mut (*outputbuf).mutex);
|
||||
crate::stdlib::pthread_mutex_lock(&mut decode.mutex);
|
||||
if decode.state as libc::c_uint
|
||||
== crate::squeezelite_h::DECODE_RUNNING as libc::c_int as libc::c_uint
|
||||
&& !codec.is_null()
|
||||
{
|
||||
if loglevel as libc::c_uint
|
||||
>= crate::squeezelite_h::lSDEBUG as libc::c_int as libc::c_uint
|
||||
{
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d streambuf bytes: %u outputbuf space: %u\n\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 14], &[libc::c_char; 14]>(
|
||||
b"decode_thread\x00",
|
||||
))
|
||||
.as_ptr(),
|
||||
76 as libc::c_int,
|
||||
bytes,
|
||||
space,
|
||||
);
|
||||
}
|
||||
min_space = (*codec).min_space as crate::stddef_h::size_t;
|
||||
if space > min_space
|
||||
&& (bytes > (*codec).min_read_bytes as libc::c_ulong || toend as libc::c_int != 0)
|
||||
{
|
||||
decode.state = (*codec).decode.expect("non-null function pointer")();
|
||||
if decode.state as libc::c_uint
|
||||
!= crate::squeezelite_h::DECODE_RUNNING as libc::c_int as libc::c_uint
|
||||
{
|
||||
if loglevel as libc::c_uint
|
||||
>= crate::squeezelite_h::lINFO as libc::c_int as libc::c_uint
|
||||
{
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d decode %s\n\x00" as *const u8 as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 14], &[libc::c_char; 14]>(
|
||||
b"decode_thread\x00",
|
||||
))
|
||||
.as_ptr(),
|
||||
101 as libc::c_int,
|
||||
if decode.state as libc::c_uint
|
||||
== crate::squeezelite_h::DECODE_COMPLETE as libc::c_int
|
||||
as libc::c_uint
|
||||
{
|
||||
b"complete\x00" as *const u8 as *const libc::c_char
|
||||
} else {
|
||||
b"error\x00" as *const u8 as *const libc::c_char
|
||||
},
|
||||
);
|
||||
}
|
||||
crate::stdlib::pthread_mutex_lock(&mut (*outputbuf).mutex);
|
||||
if output.fade_mode as u64 != 0 {
|
||||
crate::src::output::_checkfade(0 as libc::c_int != 0);
|
||||
}
|
||||
crate::stdlib::pthread_mutex_unlock(&mut (*outputbuf).mutex);
|
||||
crate::src::slimproto::wake_controller();
|
||||
}
|
||||
ran = 1 as libc::c_int != 0
|
||||
}
|
||||
}
|
||||
crate::stdlib::pthread_mutex_unlock(&mut decode.mutex);
|
||||
if !ran {
|
||||
crate::stdlib::usleep(100000 as libc::c_int as crate::stdlib::__useconds_t);
|
||||
}
|
||||
}
|
||||
return 0 as *mut libc::c_void;
|
||||
}
|
||||
|
||||
unsafe extern "C" fn sort_codecs(mut pry: libc::c_int, mut ptr: *mut crate::squeezelite_h::codec) {
|
||||
static mut priority: [libc::c_int; 10] = [0; 10];
|
||||
let mut i: libc::c_int = 0;
|
||||
let mut tpry: libc::c_int = 0;
|
||||
let mut tptr = 0 as *mut crate::squeezelite_h::codec;
|
||||
i = 0 as libc::c_int;
|
||||
while i < 10 as libc::c_int {
|
||||
if codecs[i as usize].is_null() {
|
||||
codecs[i as usize] = ptr;
|
||||
priority[i as usize] = pry;
|
||||
return;
|
||||
}
|
||||
if pry < priority[i as usize] {
|
||||
tptr = codecs[i as usize];
|
||||
codecs[i as usize] = ptr;
|
||||
ptr = tptr;
|
||||
tpry = priority[i as usize];
|
||||
priority[i as usize] = pry;
|
||||
pry = tpry
|
||||
}
|
||||
i += 1
|
||||
}
|
||||
}
|
||||
|
||||
static mut thread: crate::stdlib::pthread_t = 0;
|
||||
#[no_mangle]
|
||||
|
||||
pub unsafe extern "C" fn decode_init(
|
||||
mut level: crate::squeezelite_h::log_level,
|
||||
mut include_codecs: *const libc::c_char,
|
||||
mut exclude_codecs: *const libc::c_char,
|
||||
) {
|
||||
let mut i: libc::c_int = 0;
|
||||
let mut order_codecs = 0 as *mut libc::c_char;
|
||||
loglevel = level;
|
||||
if loglevel as libc::c_uint >= crate::squeezelite_h::lINFO as libc::c_int as libc::c_uint {
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d init decode\n\x00" as *const u8 as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 12], &[libc::c_char; 12]>(b"decode_init\x00")).as_ptr(),
|
||||
154 as libc::c_int,
|
||||
);
|
||||
}
|
||||
// register codecs
|
||||
// dsf,dff,alc,wma,wmap,wmal,aac,spt,ogg,ogf,flc,aif,pcm,mp3
|
||||
i = 0 as libc::c_int;
|
||||
if crate::stdlib::strstr(
|
||||
exclude_codecs,
|
||||
b"aac\x00" as *const u8 as *const libc::c_char,
|
||||
)
|
||||
.is_null()
|
||||
&& (include_codecs.is_null() || {
|
||||
order_codecs = crate::stdlib::strstr(
|
||||
include_codecs,
|
||||
b"aac\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
!order_codecs.is_null()
|
||||
})
|
||||
{
|
||||
sort_codecs(
|
||||
if !include_codecs.is_null() {
|
||||
order_codecs.wrapping_offset_from(include_codecs) as libc::c_long
|
||||
} else {
|
||||
i as libc::c_long
|
||||
} as libc::c_int,
|
||||
crate::src::faad::register_faad(),
|
||||
);
|
||||
}
|
||||
if crate::stdlib::strstr(
|
||||
exclude_codecs,
|
||||
b"ogg\x00" as *const u8 as *const libc::c_char,
|
||||
)
|
||||
.is_null()
|
||||
&& (include_codecs.is_null() || {
|
||||
order_codecs = crate::stdlib::strstr(
|
||||
include_codecs,
|
||||
b"ogg\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
!order_codecs.is_null()
|
||||
})
|
||||
{
|
||||
sort_codecs(
|
||||
if !include_codecs.is_null() {
|
||||
order_codecs.wrapping_offset_from(include_codecs) as libc::c_long
|
||||
} else {
|
||||
i as libc::c_long
|
||||
} as libc::c_int,
|
||||
crate::src::vorbis::register_vorbis(),
|
||||
);
|
||||
}
|
||||
if crate::stdlib::strstr(
|
||||
exclude_codecs,
|
||||
b"flac\x00" as *const u8 as *const libc::c_char,
|
||||
)
|
||||
.is_null()
|
||||
&& (include_codecs.is_null() || {
|
||||
order_codecs = crate::stdlib::strstr(
|
||||
include_codecs,
|
||||
b"flac\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
!order_codecs.is_null()
|
||||
})
|
||||
{
|
||||
sort_codecs(
|
||||
if !include_codecs.is_null() {
|
||||
order_codecs.wrapping_offset_from(include_codecs) as libc::c_long
|
||||
} else {
|
||||
i as libc::c_long
|
||||
} as libc::c_int,
|
||||
crate::src::flac::register_flac(),
|
||||
);
|
||||
}
|
||||
if crate::stdlib::strstr(
|
||||
exclude_codecs,
|
||||
b"pcm\x00" as *const u8 as *const libc::c_char,
|
||||
)
|
||||
.is_null()
|
||||
&& (include_codecs.is_null() || {
|
||||
order_codecs = crate::stdlib::strstr(
|
||||
include_codecs,
|
||||
b"pcm\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
!order_codecs.is_null()
|
||||
})
|
||||
{
|
||||
sort_codecs(
|
||||
if !include_codecs.is_null() {
|
||||
order_codecs.wrapping_offset_from(include_codecs) as libc::c_long
|
||||
} else {
|
||||
i as libc::c_long
|
||||
} as libc::c_int,
|
||||
crate::src::pcm::register_pcm(),
|
||||
);
|
||||
}
|
||||
// try mad then mpg for mp3 unless command line option passed
|
||||
if !(!crate::stdlib::strstr(
|
||||
exclude_codecs,
|
||||
b"mp3\x00" as *const u8 as *const libc::c_char,
|
||||
)
|
||||
.is_null()
|
||||
|| !crate::stdlib::strstr(
|
||||
exclude_codecs,
|
||||
b"mad\x00" as *const u8 as *const libc::c_char,
|
||||
)
|
||||
.is_null())
|
||||
&& (include_codecs.is_null()
|
||||
|| {
|
||||
order_codecs = crate::stdlib::strstr(
|
||||
include_codecs,
|
||||
b"mp3\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
!order_codecs.is_null()
|
||||
}
|
||||
|| {
|
||||
order_codecs = crate::stdlib::strstr(
|
||||
include_codecs,
|
||||
b"mad\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
!order_codecs.is_null()
|
||||
})
|
||||
{
|
||||
sort_codecs(
|
||||
if !include_codecs.is_null() {
|
||||
order_codecs.wrapping_offset_from(include_codecs) as libc::c_long
|
||||
} else {
|
||||
i as libc::c_long
|
||||
} as libc::c_int,
|
||||
crate::src::mad::register_mad(),
|
||||
);
|
||||
} else if !(!crate::stdlib::strstr(
|
||||
exclude_codecs,
|
||||
b"mp3\x00" as *const u8 as *const libc::c_char,
|
||||
)
|
||||
.is_null()
|
||||
|| !crate::stdlib::strstr(
|
||||
exclude_codecs,
|
||||
b"mpg\x00" as *const u8 as *const libc::c_char,
|
||||
)
|
||||
.is_null())
|
||||
&& (include_codecs.is_null()
|
||||
|| {
|
||||
order_codecs = crate::stdlib::strstr(
|
||||
include_codecs,
|
||||
b"mp3\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
!order_codecs.is_null()
|
||||
}
|
||||
|| {
|
||||
order_codecs = crate::stdlib::strstr(
|
||||
include_codecs,
|
||||
b"mpg\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
!order_codecs.is_null()
|
||||
})
|
||||
{
|
||||
sort_codecs(
|
||||
if !include_codecs.is_null() {
|
||||
order_codecs.wrapping_offset_from(include_codecs) as libc::c_long
|
||||
} else {
|
||||
i as libc::c_long
|
||||
} as libc::c_int,
|
||||
crate::src::mpg::register_mpg(),
|
||||
);
|
||||
}
|
||||
if loglevel as libc::c_uint >= crate::squeezelite_h::lDEBUG as libc::c_int as libc::c_uint {
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d include codecs: %s exclude codecs: %s\n\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 12], &[libc::c_char; 12]>(b"decode_init\x00")).as_ptr(),
|
||||
195 as libc::c_int,
|
||||
if !include_codecs.is_null() {
|
||||
include_codecs
|
||||
} else {
|
||||
b"\x00" as *const u8 as *const libc::c_char
|
||||
},
|
||||
exclude_codecs,
|
||||
);
|
||||
}
|
||||
crate::stdlib::pthread_mutex_init(
|
||||
&mut decode.mutex,
|
||||
0 as *const crate::stdlib::pthread_mutexattr_t,
|
||||
);
|
||||
let mut attr = crate::stdlib::pthread_attr_t { __size: [0; 56] };
|
||||
crate::stdlib::pthread_attr_init(&mut attr);
|
||||
crate::stdlib::pthread_attr_setstacksize(
|
||||
&mut attr,
|
||||
(16384 as libc::c_int + 128 as libc::c_int * 1024 as libc::c_int)
|
||||
as crate::stddef_h::size_t,
|
||||
);
|
||||
crate::stdlib::pthread_create(
|
||||
&mut thread,
|
||||
&mut attr,
|
||||
::std::mem::transmute::<
|
||||
Option<unsafe extern "C" fn() -> *mut libc::c_void>,
|
||||
Option<unsafe extern "C" fn(_: *mut libc::c_void) -> *mut libc::c_void>,
|
||||
>(Some(::std::mem::transmute::<
|
||||
unsafe extern "C" fn() -> *mut libc::c_void,
|
||||
unsafe extern "C" fn() -> *mut libc::c_void,
|
||||
>(decode_thread))),
|
||||
0 as *mut libc::c_void,
|
||||
);
|
||||
crate::stdlib::pthread_attr_destroy(&mut attr);
|
||||
decode.new_stream = 1 as libc::c_int != 0;
|
||||
decode.state = crate::squeezelite_h::DECODE_STOPPED;
|
||||
}
|
||||
#[no_mangle]
|
||||
|
||||
pub unsafe extern "C" fn decode_close() {
|
||||
if loglevel as libc::c_uint >= crate::squeezelite_h::lINFO as libc::c_int as libc::c_uint {
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d close decode\n\x00" as *const u8 as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 13], &[libc::c_char; 13]>(b"decode_close\x00"))
|
||||
.as_ptr(),
|
||||
222 as libc::c_int,
|
||||
);
|
||||
}
|
||||
crate::stdlib::pthread_mutex_lock(&mut decode.mutex);
|
||||
if !codec.is_null() {
|
||||
(*codec).close.expect("non-null function pointer")();
|
||||
codec = 0 as *mut crate::squeezelite_h::codec
|
||||
}
|
||||
running = 0 as libc::c_int != 0;
|
||||
crate::stdlib::pthread_mutex_unlock(&mut decode.mutex);
|
||||
crate::stdlib::pthread_join(thread, 0 as *mut *mut libc::c_void);
|
||||
crate::stdlib::pthread_mutex_destroy(&mut decode.mutex);
|
||||
}
|
||||
#[no_mangle]
|
||||
|
||||
pub unsafe extern "C" fn decode_flush() {
|
||||
if loglevel as libc::c_uint >= crate::squeezelite_h::lINFO as libc::c_int as libc::c_uint {
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d decode flush\n\x00" as *const u8 as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 13], &[libc::c_char; 13]>(b"decode_flush\x00"))
|
||||
.as_ptr(),
|
||||
237 as libc::c_int,
|
||||
);
|
||||
}
|
||||
crate::stdlib::pthread_mutex_lock(&mut decode.mutex);
|
||||
decode.state = crate::squeezelite_h::DECODE_STOPPED;
|
||||
crate::stdlib::pthread_mutex_unlock(&mut decode.mutex);
|
||||
}
|
||||
#[no_mangle]
|
||||
|
||||
pub unsafe extern "C" fn decode_newstream(
|
||||
mut sample_rate: libc::c_uint,
|
||||
mut supported_rates: *mut libc::c_uint,
|
||||
) -> libc::c_uint {
|
||||
// called with O locked to get sample rate for potentially processed output stream
|
||||
// release O mutex during process_newstream as it can take some time
|
||||
return sample_rate;
|
||||
}
|
||||
/*
|
||||
* Squeezelite - lightweight headless squeezebox emulator
|
||||
*
|
||||
* (c) Adrian Smith 2012-2015, triode1@btinternet.com
|
||||
* Ralph Irving 2015-2017, ralph_irving@hotmail.com
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Additions (c) Paul Hermann, 2015-2017 under the same license terms
|
||||
* -Control of Raspberry pi GPIO for amplifier power
|
||||
* -Launch script on power status change from LMS
|
||||
*/
|
||||
// make may define: PORTAUDIO, SELFPIPE, RESAMPLE, RESAMPLE_MP, VISEXPORT, GPIO, IR, DSD, LINKALL to influence build
|
||||
// build detection
|
||||
// dynamically loaded libraries at run time
|
||||
// !LINKALL
|
||||
// config options
|
||||
// do not reduce as icy-meta max is 4080
|
||||
/* SUN */
|
||||
/* SUN */
|
||||
// printf/scanf formats for u64_t
|
||||
// logging
|
||||
// utils.c (non logging)
|
||||
// buffer.c
|
||||
// _* called with mutex locked
|
||||
// slimproto.c
|
||||
// stream.c
|
||||
// decode.c
|
||||
#[no_mangle]
|
||||
|
||||
pub unsafe extern "C" fn codec_open(
|
||||
mut format: crate::squeezelite_h::u8_t,
|
||||
mut sample_size: crate::squeezelite_h::u8_t,
|
||||
mut sample_rate: crate::squeezelite_h::u8_t,
|
||||
mut channels: crate::squeezelite_h::u8_t,
|
||||
mut endianness: crate::squeezelite_h::u8_t,
|
||||
) {
|
||||
let mut i: libc::c_int = 0;
|
||||
if loglevel as libc::c_uint >= crate::squeezelite_h::lINFO as libc::c_int as libc::c_uint {
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d codec open: \'%c\'\n\x00" as *const u8 as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 11], &[libc::c_char; 11]>(b"codec_open\x00")).as_ptr(),
|
||||
265 as libc::c_int,
|
||||
format as libc::c_int,
|
||||
);
|
||||
}
|
||||
crate::stdlib::pthread_mutex_lock(&mut decode.mutex);
|
||||
decode.new_stream = 1 as libc::c_int != 0;
|
||||
decode.state = crate::squeezelite_h::DECODE_STOPPED;
|
||||
// potentially changed within codec when processing enabled
|
||||
// find the required codec
|
||||
i = 0 as libc::c_int;
|
||||
while i < 10 as libc::c_int {
|
||||
if !codecs[i as usize].is_null()
|
||||
&& (*codecs[i as usize]).id as libc::c_int == format as libc::c_int
|
||||
{
|
||||
// close codec if format or flac container changed
|
||||
if !codec.is_null()
|
||||
&& (codec != codecs[i as usize]
|
||||
|| (*codecs[i as usize]).id as libc::c_int == 'f' as i32
|
||||
&& flac_container as libc::c_int != sample_size as libc::c_int)
|
||||
{
|
||||
if loglevel as libc::c_uint
|
||||
>= crate::squeezelite_h::lINFO as libc::c_int as libc::c_uint
|
||||
{
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d closing codec: \'%c\'\n\x00" as *const u8 as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 11], &[libc::c_char; 11]>(
|
||||
b"codec_open\x00",
|
||||
))
|
||||
.as_ptr(),
|
||||
283 as libc::c_int,
|
||||
(*codec).id as libc::c_int,
|
||||
);
|
||||
}
|
||||
(*codec).close.expect("non-null function pointer")();
|
||||
}
|
||||
codec = codecs[i as usize];
|
||||
if (*codec).id as libc::c_int == 'f' as i32 {
|
||||
flac_container = sample_size
|
||||
}
|
||||
(*codec).open.expect("non-null function pointer")(
|
||||
sample_size,
|
||||
sample_rate,
|
||||
channels,
|
||||
endianness,
|
||||
);
|
||||
decode.state = crate::squeezelite_h::DECODE_READY;
|
||||
crate::stdlib::pthread_mutex_unlock(&mut decode.mutex);
|
||||
return;
|
||||
}
|
||||
i += 1
|
||||
}
|
||||
crate::stdlib::pthread_mutex_unlock(&mut decode.mutex);
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d codec not found\n\x00" as *const u8 as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 11], &[libc::c_char; 11]>(b"codec_open\x00")).as_ptr(),
|
||||
303 as libc::c_int,
|
||||
);
|
||||
}
|
1553
src/faad.rs
Normal file
1553
src/faad.rs
Normal file
File diff suppressed because it is too large
Load Diff
927
src/flac.rs
Normal file
927
src/flac.rs
Normal file
@ -0,0 +1,927 @@
|
||||
use ::c2rust_bitfields;
|
||||
use ::libc;
|
||||
|
||||
pub use crate::stddef_h::size_t;
|
||||
pub use crate::stdlib::__int32_t;
|
||||
pub use crate::stdlib::__uint16_t;
|
||||
pub use crate::stdlib::__uint32_t;
|
||||
pub use crate::stdlib::__uint64_t;
|
||||
pub use crate::stdlib::__uint8_t;
|
||||
pub use crate::stdlib::int32_t;
|
||||
|
||||
pub use crate::stdlib::__pthread_internal_list;
|
||||
pub use crate::stdlib::__pthread_list_t;
|
||||
pub use crate::stdlib::__pthread_mutex_s;
|
||||
pub use crate::stdlib::pthread_mutex_t;
|
||||
pub use crate::stdlib::u_int32_t;
|
||||
pub use crate::stdlib::u_int64_t;
|
||||
pub use crate::stdlib::u_int8_t;
|
||||
|
||||
pub use crate::squeezelite_h::buffer;
|
||||
pub use crate::squeezelite_h::codec;
|
||||
pub use crate::squeezelite_h::decode_state;
|
||||
pub use crate::squeezelite_h::decodestate;
|
||||
pub use crate::squeezelite_h::disconnect_code;
|
||||
pub use crate::squeezelite_h::fade_dir;
|
||||
pub use crate::squeezelite_h::fade_mode;
|
||||
pub use crate::squeezelite_h::fade_state;
|
||||
pub use crate::squeezelite_h::frames_t;
|
||||
pub use crate::squeezelite_h::lDEBUG;
|
||||
pub use crate::squeezelite_h::lERROR;
|
||||
pub use crate::squeezelite_h::lINFO;
|
||||
pub use crate::squeezelite_h::lSDEBUG;
|
||||
pub use crate::squeezelite_h::lWARN;
|
||||
pub use crate::squeezelite_h::log_level;
|
||||
pub use crate::squeezelite_h::output_format;
|
||||
pub use crate::squeezelite_h::output_state;
|
||||
pub use crate::squeezelite_h::outputstate;
|
||||
pub use crate::squeezelite_h::s32_t;
|
||||
pub use crate::squeezelite_h::stream_state;
|
||||
pub use crate::squeezelite_h::streamstate;
|
||||
pub use crate::squeezelite_h::u32_t;
|
||||
pub use crate::squeezelite_h::u64_t;
|
||||
pub use crate::squeezelite_h::u8_t;
|
||||
pub use crate::squeezelite_h::C2RustUnnamed_1;
|
||||
pub use crate::squeezelite_h::_buf_used;
|
||||
pub use crate::squeezelite_h::DECODE_COMPLETE;
|
||||
pub use crate::squeezelite_h::DECODE_ERROR;
|
||||
pub use crate::squeezelite_h::DECODE_READY;
|
||||
pub use crate::squeezelite_h::DECODE_RUNNING;
|
||||
pub use crate::squeezelite_h::DECODE_STOPPED;
|
||||
pub use crate::squeezelite_h::DISCONNECT;
|
||||
pub use crate::squeezelite_h::DISCONNECT_OK;
|
||||
pub use crate::squeezelite_h::FADE_ACTIVE;
|
||||
pub use crate::squeezelite_h::FADE_CROSS;
|
||||
pub use crate::squeezelite_h::FADE_CROSSFADE;
|
||||
pub use crate::squeezelite_h::FADE_DOWN;
|
||||
pub use crate::squeezelite_h::FADE_DUE;
|
||||
pub use crate::squeezelite_h::FADE_IN;
|
||||
pub use crate::squeezelite_h::FADE_INACTIVE;
|
||||
pub use crate::squeezelite_h::FADE_INOUT;
|
||||
pub use crate::squeezelite_h::FADE_NONE;
|
||||
pub use crate::squeezelite_h::FADE_OUT;
|
||||
pub use crate::squeezelite_h::FADE_UP;
|
||||
pub use crate::squeezelite_h::LOCAL_DISCONNECT;
|
||||
pub use crate::squeezelite_h::OUTPUT_BUFFER;
|
||||
pub use crate::squeezelite_h::OUTPUT_OFF;
|
||||
pub use crate::squeezelite_h::OUTPUT_PAUSE_FRAMES;
|
||||
pub use crate::squeezelite_h::OUTPUT_RUNNING;
|
||||
pub use crate::squeezelite_h::OUTPUT_SKIP_FRAMES;
|
||||
pub use crate::squeezelite_h::OUTPUT_START_AT;
|
||||
pub use crate::squeezelite_h::OUTPUT_STOPPED;
|
||||
pub use crate::squeezelite_h::RECV_HEADERS;
|
||||
pub use crate::squeezelite_h::REMOTE_DISCONNECT;
|
||||
pub use crate::squeezelite_h::S16_LE;
|
||||
pub use crate::squeezelite_h::S24_3LE;
|
||||
pub use crate::squeezelite_h::S24_LE;
|
||||
pub use crate::squeezelite_h::S32_LE;
|
||||
pub use crate::squeezelite_h::SEND_HEADERS;
|
||||
pub use crate::squeezelite_h::STOPPED;
|
||||
pub use crate::squeezelite_h::STREAMING_BUFFERING;
|
||||
pub use crate::squeezelite_h::STREAMING_FILE;
|
||||
pub use crate::squeezelite_h::STREAMING_HTTP;
|
||||
pub use crate::squeezelite_h::STREAMING_WAIT;
|
||||
pub use crate::squeezelite_h::TIMEOUT;
|
||||
pub use crate::squeezelite_h::UNREACHABLE;
|
||||
pub use crate::src::buffer::_buf_cont_read;
|
||||
pub use crate::src::buffer::_buf_cont_write;
|
||||
pub use crate::src::buffer::_buf_inc_readp;
|
||||
pub use crate::src::buffer::_buf_inc_writep;
|
||||
pub use crate::src::buffer::_buf_space;
|
||||
pub use crate::src::decode::decode_newstream;
|
||||
pub use crate::src::output::_checkfade;
|
||||
pub use crate::src::utils::logprint;
|
||||
pub use crate::src::utils::logtime;
|
||||
use crate::stdlib::malloc;
|
||||
use crate::stdlib::memcpy;
|
||||
pub use crate::stdlib::uint16_t;
|
||||
pub use crate::stdlib::uint32_t;
|
||||
pub use crate::stdlib::uint64_t;
|
||||
pub use crate::stdlib::uint8_t;
|
||||
pub use crate::stdlib::C2RustUnnamed_4;
|
||||
pub use crate::stdlib::C2RustUnnamed_5;
|
||||
pub use crate::stdlib::C2RustUnnamed_6;
|
||||
pub use crate::stdlib::C2RustUnnamed_7;
|
||||
pub use crate::stdlib::FLAC__ChannelAssignment;
|
||||
pub use crate::stdlib::FLAC__EntropyCodingMethod;
|
||||
pub use crate::stdlib::FLAC__EntropyCodingMethodType;
|
||||
pub use crate::stdlib::FLAC__EntropyCodingMethod_PartitionedRice;
|
||||
pub use crate::stdlib::FLAC__EntropyCodingMethod_PartitionedRiceContents;
|
||||
pub use crate::stdlib::FLAC__Frame;
|
||||
pub use crate::stdlib::FLAC__FrameFooter;
|
||||
pub use crate::stdlib::FLAC__FrameHeader;
|
||||
pub use crate::stdlib::FLAC__FrameNumberType;
|
||||
pub use crate::stdlib::FLAC__MetadataType;
|
||||
pub use crate::stdlib::FLAC__StreamDecoder;
|
||||
pub use crate::stdlib::FLAC__StreamDecoderEofCallback;
|
||||
pub use crate::stdlib::FLAC__StreamDecoderErrorCallback;
|
||||
pub use crate::stdlib::FLAC__StreamDecoderErrorStatus;
|
||||
pub use crate::stdlib::FLAC__StreamDecoderInitStatus;
|
||||
pub use crate::stdlib::FLAC__StreamDecoderLengthCallback;
|
||||
pub use crate::stdlib::FLAC__StreamDecoderLengthStatus;
|
||||
pub use crate::stdlib::FLAC__StreamDecoderMetadataCallback;
|
||||
pub use crate::stdlib::FLAC__StreamDecoderPrivate;
|
||||
pub use crate::stdlib::FLAC__StreamDecoderProtected;
|
||||
pub use crate::stdlib::FLAC__StreamDecoderReadCallback;
|
||||
pub use crate::stdlib::FLAC__StreamDecoderReadStatus;
|
||||
pub use crate::stdlib::FLAC__StreamDecoderSeekCallback;
|
||||
pub use crate::stdlib::FLAC__StreamDecoderSeekStatus;
|
||||
pub use crate::stdlib::FLAC__StreamDecoderState;
|
||||
pub use crate::stdlib::FLAC__StreamDecoderTellCallback;
|
||||
pub use crate::stdlib::FLAC__StreamDecoderTellStatus;
|
||||
pub use crate::stdlib::FLAC__StreamDecoderWriteCallback;
|
||||
pub use crate::stdlib::FLAC__StreamDecoderWriteStatus;
|
||||
pub use crate::stdlib::FLAC__StreamMetadata;
|
||||
pub use crate::stdlib::FLAC__StreamMetadata_Application;
|
||||
pub use crate::stdlib::FLAC__StreamMetadata_CueSheet;
|
||||
pub use crate::stdlib::FLAC__StreamMetadata_CueSheet_Index;
|
||||
pub use crate::stdlib::FLAC__StreamMetadata_CueSheet_Track;
|
||||
pub use crate::stdlib::FLAC__StreamMetadata_Padding;
|
||||
pub use crate::stdlib::FLAC__StreamMetadata_Picture;
|
||||
pub use crate::stdlib::FLAC__StreamMetadata_Picture_Type;
|
||||
pub use crate::stdlib::FLAC__StreamMetadata_SeekPoint;
|
||||
pub use crate::stdlib::FLAC__StreamMetadata_SeekTable;
|
||||
pub use crate::stdlib::FLAC__StreamMetadata_StreamInfo;
|
||||
pub use crate::stdlib::FLAC__StreamMetadata_Unknown;
|
||||
pub use crate::stdlib::FLAC__StreamMetadata_VorbisComment;
|
||||
pub use crate::stdlib::FLAC__StreamMetadata_VorbisComment_Entry;
|
||||
pub use crate::stdlib::FLAC__Subframe;
|
||||
pub use crate::stdlib::FLAC__SubframeType;
|
||||
pub use crate::stdlib::FLAC__Subframe_Constant;
|
||||
pub use crate::stdlib::FLAC__Subframe_Fixed;
|
||||
pub use crate::stdlib::FLAC__Subframe_LPC;
|
||||
pub use crate::stdlib::FLAC__Subframe_Verbatim;
|
||||
pub use crate::stdlib::FLAC__bool;
|
||||
pub use crate::stdlib::FLAC__byte;
|
||||
pub use crate::stdlib::FLAC__int32;
|
||||
pub use crate::stdlib::FLAC__uint16;
|
||||
pub use crate::stdlib::FLAC__uint32;
|
||||
pub use crate::stdlib::FLAC__uint64;
|
||||
pub use crate::stdlib::FLAC__uint8;
|
||||
pub use crate::stdlib::FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT;
|
||||
pub use crate::stdlib::FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE;
|
||||
pub use crate::stdlib::FLAC__CHANNEL_ASSIGNMENT_MID_SIDE;
|
||||
pub use crate::stdlib::FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE;
|
||||
pub use crate::stdlib::FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE;
|
||||
pub use crate::stdlib::FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2;
|
||||
pub use crate::stdlib::FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER;
|
||||
pub use crate::stdlib::FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER;
|
||||
pub use crate::stdlib::FLAC__MAX_METADATA_TYPE;
|
||||
pub use crate::stdlib::FLAC__METADATA_TYPE_APPLICATION;
|
||||
pub use crate::stdlib::FLAC__METADATA_TYPE_CUESHEET;
|
||||
pub use crate::stdlib::FLAC__METADATA_TYPE_PADDING;
|
||||
pub use crate::stdlib::FLAC__METADATA_TYPE_PICTURE;
|
||||
pub use crate::stdlib::FLAC__METADATA_TYPE_SEEKTABLE;
|
||||
pub use crate::stdlib::FLAC__METADATA_TYPE_STREAMINFO;
|
||||
pub use crate::stdlib::FLAC__METADATA_TYPE_UNDEFINED;
|
||||
pub use crate::stdlib::FLAC__METADATA_TYPE_VORBIS_COMMENT;
|
||||
pub use crate::stdlib::FLAC__STREAM_DECODER_ABORTED;
|
||||
pub use crate::stdlib::FLAC__STREAM_DECODER_END_OF_STREAM;
|
||||
pub use crate::stdlib::FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER;
|
||||
pub use crate::stdlib::FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH;
|
||||
pub use crate::stdlib::FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC;
|
||||
pub use crate::stdlib::FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM;
|
||||
pub use crate::stdlib::FLAC__STREAM_DECODER_INIT_STATUS_ALREADY_INITIALIZED;
|
||||
pub use crate::stdlib::FLAC__STREAM_DECODER_INIT_STATUS_ERROR_OPENING_FILE;
|
||||
pub use crate::stdlib::FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS;
|
||||
pub use crate::stdlib::FLAC__STREAM_DECODER_INIT_STATUS_MEMORY_ALLOCATION_ERROR;
|
||||
pub use crate::stdlib::FLAC__STREAM_DECODER_INIT_STATUS_OK;
|
||||
pub use crate::stdlib::FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER;
|
||||
pub use crate::stdlib::FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR;
|
||||
pub use crate::stdlib::FLAC__STREAM_DECODER_LENGTH_STATUS_OK;
|
||||
pub use crate::stdlib::FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED;
|
||||
pub use crate::stdlib::FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR;
|
||||
pub use crate::stdlib::FLAC__STREAM_DECODER_OGG_ERROR;
|
||||
pub use crate::stdlib::FLAC__STREAM_DECODER_READ_FRAME;
|
||||
pub use crate::stdlib::FLAC__STREAM_DECODER_READ_METADATA;
|
||||
pub use crate::stdlib::FLAC__STREAM_DECODER_READ_STATUS_ABORT;
|
||||
pub use crate::stdlib::FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
|
||||
pub use crate::stdlib::FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM;
|
||||
pub use crate::stdlib::FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC;
|
||||
pub use crate::stdlib::FLAC__STREAM_DECODER_SEARCH_FOR_METADATA;
|
||||
pub use crate::stdlib::FLAC__STREAM_DECODER_SEEK_ERROR;
|
||||
pub use crate::stdlib::FLAC__STREAM_DECODER_SEEK_STATUS_ERROR;
|
||||
pub use crate::stdlib::FLAC__STREAM_DECODER_SEEK_STATUS_OK;
|
||||
pub use crate::stdlib::FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED;
|
||||
pub use crate::stdlib::FLAC__STREAM_DECODER_TELL_STATUS_ERROR;
|
||||
pub use crate::stdlib::FLAC__STREAM_DECODER_TELL_STATUS_OK;
|
||||
pub use crate::stdlib::FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED;
|
||||
pub use crate::stdlib::FLAC__STREAM_DECODER_UNINITIALIZED;
|
||||
pub use crate::stdlib::FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
|
||||
pub use crate::stdlib::FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
|
||||
pub use crate::stdlib::FLAC__STREAM_METADATA_PICTURE_TYPE_ARTIST;
|
||||
pub use crate::stdlib::FLAC__STREAM_METADATA_PICTURE_TYPE_BACK_COVER;
|
||||
pub use crate::stdlib::FLAC__STREAM_METADATA_PICTURE_TYPE_BAND;
|
||||
pub use crate::stdlib::FLAC__STREAM_METADATA_PICTURE_TYPE_BAND_LOGOTYPE;
|
||||
pub use crate::stdlib::FLAC__STREAM_METADATA_PICTURE_TYPE_COMPOSER;
|
||||
pub use crate::stdlib::FLAC__STREAM_METADATA_PICTURE_TYPE_CONDUCTOR;
|
||||
pub use crate::stdlib::FLAC__STREAM_METADATA_PICTURE_TYPE_DURING_PERFORMANCE;
|
||||
pub use crate::stdlib::FLAC__STREAM_METADATA_PICTURE_TYPE_DURING_RECORDING;
|
||||
pub use crate::stdlib::FLAC__STREAM_METADATA_PICTURE_TYPE_FILE_ICON;
|
||||
pub use crate::stdlib::FLAC__STREAM_METADATA_PICTURE_TYPE_FILE_ICON_STANDARD;
|
||||
pub use crate::stdlib::FLAC__STREAM_METADATA_PICTURE_TYPE_FISH;
|
||||
pub use crate::stdlib::FLAC__STREAM_METADATA_PICTURE_TYPE_FRONT_COVER;
|
||||
pub use crate::stdlib::FLAC__STREAM_METADATA_PICTURE_TYPE_ILLUSTRATION;
|
||||
pub use crate::stdlib::FLAC__STREAM_METADATA_PICTURE_TYPE_LEAD_ARTIST;
|
||||
pub use crate::stdlib::FLAC__STREAM_METADATA_PICTURE_TYPE_LEAFLET_PAGE;
|
||||
pub use crate::stdlib::FLAC__STREAM_METADATA_PICTURE_TYPE_LYRICIST;
|
||||
pub use crate::stdlib::FLAC__STREAM_METADATA_PICTURE_TYPE_MEDIA;
|
||||
pub use crate::stdlib::FLAC__STREAM_METADATA_PICTURE_TYPE_OTHER;
|
||||
pub use crate::stdlib::FLAC__STREAM_METADATA_PICTURE_TYPE_PUBLISHER_LOGOTYPE;
|
||||
pub use crate::stdlib::FLAC__STREAM_METADATA_PICTURE_TYPE_RECORDING_LOCATION;
|
||||
pub use crate::stdlib::FLAC__STREAM_METADATA_PICTURE_TYPE_UNDEFINED;
|
||||
pub use crate::stdlib::FLAC__STREAM_METADATA_PICTURE_TYPE_VIDEO_SCREEN_CAPTURE;
|
||||
pub use crate::stdlib::FLAC__SUBFRAME_TYPE_CONSTANT;
|
||||
pub use crate::stdlib::FLAC__SUBFRAME_TYPE_FIXED;
|
||||
pub use crate::stdlib::FLAC__SUBFRAME_TYPE_LPC;
|
||||
pub use crate::stdlib::FLAC__SUBFRAME_TYPE_VERBATIM;
|
||||
|
||||
use crate::stdlib::dlerror;
|
||||
use crate::stdlib::dlopen;
|
||||
use crate::stdlib::dlsym;
|
||||
use crate::stdlib::pthread_mutex_lock;
|
||||
use crate::stdlib::pthread_mutex_unlock;
|
||||
extern "C" {
|
||||
#[no_mangle]
|
||||
pub static mut loglevel: crate::squeezelite_h::log_level;
|
||||
#[no_mangle]
|
||||
pub static mut streambuf: *mut crate::squeezelite_h::buffer;
|
||||
#[no_mangle]
|
||||
pub static mut outputbuf: *mut crate::squeezelite_h::buffer;
|
||||
#[no_mangle]
|
||||
pub static mut stream: crate::squeezelite_h::streamstate;
|
||||
#[no_mangle]
|
||||
pub static mut output: crate::squeezelite_h::outputstate;
|
||||
#[no_mangle]
|
||||
pub static mut decode: crate::squeezelite_h::decodestate;
|
||||
}
|
||||
/*
|
||||
* Squeezelite - lightweight headless squeezeplay emulator for linux
|
||||
*
|
||||
* (c) Adrian Smith 2012, triode1@btinternet.com
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
#[repr(C)]
|
||||
#[derive(Copy, Clone)]
|
||||
pub struct flac {
|
||||
pub decoder: *mut crate::stdlib::FLAC__StreamDecoder,
|
||||
pub FLAC__StreamDecoderErrorStatusString: *mut *const libc::c_char,
|
||||
pub FLAC__StreamDecoderStateString: *mut *const libc::c_char,
|
||||
pub FLAC__stream_decoder_new:
|
||||
Option<unsafe extern "C" fn() -> *mut crate::stdlib::FLAC__StreamDecoder>,
|
||||
pub FLAC__stream_decoder_reset: Option<
|
||||
unsafe extern "C" fn(
|
||||
_: *mut crate::stdlib::FLAC__StreamDecoder,
|
||||
) -> crate::stdlib::FLAC__bool,
|
||||
>,
|
||||
pub FLAC__stream_decoder_delete:
|
||||
Option<unsafe extern "C" fn(_: *mut crate::stdlib::FLAC__StreamDecoder) -> ()>,
|
||||
pub FLAC__stream_decoder_init_stream: Option<
|
||||
unsafe extern "C" fn(
|
||||
_: *mut crate::stdlib::FLAC__StreamDecoder,
|
||||
_: crate::stdlib::FLAC__StreamDecoderReadCallback,
|
||||
_: crate::stdlib::FLAC__StreamDecoderSeekCallback,
|
||||
_: crate::stdlib::FLAC__StreamDecoderTellCallback,
|
||||
_: crate::stdlib::FLAC__StreamDecoderLengthCallback,
|
||||
_: crate::stdlib::FLAC__StreamDecoderEofCallback,
|
||||
_: crate::stdlib::FLAC__StreamDecoderWriteCallback,
|
||||
_: crate::stdlib::FLAC__StreamDecoderMetadataCallback,
|
||||
_: crate::stdlib::FLAC__StreamDecoderErrorCallback,
|
||||
_: *mut libc::c_void,
|
||||
) -> crate::stdlib::FLAC__StreamDecoderInitStatus,
|
||||
>,
|
||||
pub FLAC__stream_decoder_init_ogg_stream: Option<
|
||||
unsafe extern "C" fn(
|
||||
_: *mut crate::stdlib::FLAC__StreamDecoder,
|
||||
_: crate::stdlib::FLAC__StreamDecoderReadCallback,
|
||||
_: crate::stdlib::FLAC__StreamDecoderSeekCallback,
|
||||
_: crate::stdlib::FLAC__StreamDecoderTellCallback,
|
||||
_: crate::stdlib::FLAC__StreamDecoderLengthCallback,
|
||||
_: crate::stdlib::FLAC__StreamDecoderEofCallback,
|
||||
_: crate::stdlib::FLAC__StreamDecoderWriteCallback,
|
||||
_: crate::stdlib::FLAC__StreamDecoderMetadataCallback,
|
||||
_: crate::stdlib::FLAC__StreamDecoderErrorCallback,
|
||||
_: *mut libc::c_void,
|
||||
) -> crate::stdlib::FLAC__StreamDecoderInitStatus,
|
||||
>,
|
||||
pub FLAC__stream_decoder_process_single: Option<
|
||||
unsafe extern "C" fn(
|
||||
_: *mut crate::stdlib::FLAC__StreamDecoder,
|
||||
) -> crate::stdlib::FLAC__bool,
|
||||
>,
|
||||
pub FLAC__stream_decoder_get_state: Option<
|
||||
unsafe extern "C" fn(
|
||||
_: *const crate::stdlib::FLAC__StreamDecoder,
|
||||
) -> crate::stdlib::FLAC__StreamDecoderState,
|
||||
>,
|
||||
}
|
||||
|
||||
static mut f: *mut flac = 0 as *const flac as *mut flac;
|
||||
|
||||
unsafe extern "C" fn read_cb(
|
||||
mut decoder: *const crate::stdlib::FLAC__StreamDecoder,
|
||||
mut buffer: *mut crate::stdlib::FLAC__byte,
|
||||
mut want: *mut crate::stddef_h::size_t,
|
||||
mut client_data: *mut libc::c_void,
|
||||
) -> crate::stdlib::FLAC__StreamDecoderReadStatus {
|
||||
let mut bytes: crate::stddef_h::size_t = 0;
|
||||
let mut end: bool = false;
|
||||
crate::stdlib::pthread_mutex_lock(&mut (*streambuf).mutex);
|
||||
bytes = if crate::squeezelite_h::_buf_used(streambuf)
|
||||
< crate::src::buffer::_buf_cont_read(streambuf)
|
||||
{
|
||||
crate::squeezelite_h::_buf_used(streambuf)
|
||||
} else {
|
||||
crate::src::buffer::_buf_cont_read(streambuf)
|
||||
} as crate::stddef_h::size_t;
|
||||
bytes = if bytes < *want { bytes } else { *want };
|
||||
end = stream.state as libc::c_uint
|
||||
<= crate::squeezelite_h::DISCONNECT as libc::c_int as libc::c_uint
|
||||
&& bytes == 0 as libc::c_int as libc::c_ulong;
|
||||
crate::stdlib::memcpy(
|
||||
buffer as *mut libc::c_void,
|
||||
(*streambuf).readp as *const libc::c_void,
|
||||
bytes,
|
||||
);
|
||||
crate::src::buffer::_buf_inc_readp(streambuf, bytes as libc::c_uint);
|
||||
crate::stdlib::pthread_mutex_unlock(&mut (*streambuf).mutex);
|
||||
*want = bytes;
|
||||
return if end as libc::c_int != 0 {
|
||||
crate::stdlib::FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM as libc::c_int
|
||||
} else {
|
||||
crate::stdlib::FLAC__STREAM_DECODER_READ_STATUS_CONTINUE as libc::c_int
|
||||
} as crate::stdlib::FLAC__StreamDecoderReadStatus;
|
||||
}
|
||||
|
||||
unsafe extern "C" fn write_cb(
|
||||
mut decoder: *const crate::stdlib::FLAC__StreamDecoder,
|
||||
mut frame: *const crate::stdlib::FLAC__Frame,
|
||||
mut buffer: *const *const crate::stdlib::FLAC__int32,
|
||||
mut client_data: *mut libc::c_void,
|
||||
) -> crate::stdlib::FLAC__StreamDecoderWriteStatus {
|
||||
let mut frames = (*frame).header.blocksize as crate::stddef_h::size_t;
|
||||
let mut bits_per_sample = (*frame).header.bits_per_sample;
|
||||
let mut channels = (*frame).header.channels;
|
||||
let mut lptr = *buffer.offset(0 as libc::c_int as isize) as *mut crate::stdlib::FLAC__int32;
|
||||
let mut rptr = *buffer.offset(if channels > 1 as libc::c_int as libc::c_uint {
|
||||
1 as libc::c_int
|
||||
} else {
|
||||
0 as libc::c_int
|
||||
} as isize) as *mut crate::stdlib::FLAC__int32;
|
||||
if decode.new_stream {
|
||||
crate::stdlib::pthread_mutex_lock(&mut (*outputbuf).mutex);
|
||||
if loglevel as libc::c_uint >= crate::squeezelite_h::lINFO as libc::c_int as libc::c_uint {
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d setting track_start\n\x00" as *const u8 as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 9], &[libc::c_char; 9]>(b"write_cb\x00")).as_ptr(),
|
||||
128 as libc::c_int,
|
||||
);
|
||||
}
|
||||
output.track_start = (*outputbuf).writep;
|
||||
decode.new_stream = 0 as libc::c_int != 0;
|
||||
output.next_sample_rate = crate::src::decode::decode_newstream(
|
||||
(*frame).header.sample_rate,
|
||||
output.supported_rates.as_mut_ptr(),
|
||||
);
|
||||
if output.fade_mode as u64 != 0 {
|
||||
crate::src::output::_checkfade(1 as libc::c_int != 0);
|
||||
}
|
||||
crate::stdlib::pthread_mutex_unlock(&mut (*outputbuf).mutex);
|
||||
}
|
||||
crate::stdlib::pthread_mutex_lock(&mut (*outputbuf).mutex);
|
||||
while frames > 0 as libc::c_int as libc::c_ulong {
|
||||
let mut f_0: crate::squeezelite_h::frames_t = 0;
|
||||
let mut count: crate::squeezelite_h::frames_t = 0;
|
||||
let mut optr = 0 as *mut crate::squeezelite_h::s32_t;
|
||||
optr = (*outputbuf).writep as *mut crate::squeezelite_h::s32_t;
|
||||
f_0 = (if crate::src::buffer::_buf_space(outputbuf)
|
||||
< crate::src::buffer::_buf_cont_write(outputbuf)
|
||||
{
|
||||
crate::src::buffer::_buf_space(outputbuf)
|
||||
} else {
|
||||
crate::src::buffer::_buf_cont_write(outputbuf)
|
||||
})
|
||||
.wrapping_div(8 as libc::c_int as libc::c_uint);
|
||||
f_0 = if (f_0 as libc::c_ulong) < frames {
|
||||
f_0 as libc::c_ulong
|
||||
} else {
|
||||
frames
|
||||
} as crate::squeezelite_h::frames_t;
|
||||
count = f_0;
|
||||
if bits_per_sample == 8 as libc::c_int as libc::c_uint {
|
||||
loop {
|
||||
let fresh0 = count;
|
||||
count = count.wrapping_sub(1);
|
||||
if !(fresh0 != 0) {
|
||||
break;
|
||||
}
|
||||
let fresh1 = lptr;
|
||||
lptr = lptr.offset(1);
|
||||
let fresh2 = optr;
|
||||
optr = optr.offset(1);
|
||||
*fresh2 = *fresh1 << 24 as libc::c_int;
|
||||
let fresh3 = rptr;
|
||||
rptr = rptr.offset(1);
|
||||
let fresh4 = optr;
|
||||
optr = optr.offset(1);
|
||||
*fresh4 = *fresh3 << 24 as libc::c_int
|
||||
}
|
||||
} else if bits_per_sample == 16 as libc::c_int as libc::c_uint {
|
||||
loop {
|
||||
let fresh5 = count;
|
||||
count = count.wrapping_sub(1);
|
||||
if !(fresh5 != 0) {
|
||||
break;
|
||||
}
|
||||
let fresh6 = lptr;
|
||||
lptr = lptr.offset(1);
|
||||
let fresh7 = optr;
|
||||
optr = optr.offset(1);
|
||||
*fresh7 = *fresh6 << 16 as libc::c_int;
|
||||
let fresh8 = rptr;
|
||||
rptr = rptr.offset(1);
|
||||
let fresh9 = optr;
|
||||
optr = optr.offset(1);
|
||||
*fresh9 = *fresh8 << 16 as libc::c_int
|
||||
}
|
||||
} else if bits_per_sample == 24 as libc::c_int as libc::c_uint {
|
||||
loop {
|
||||
let fresh10 = count;
|
||||
count = count.wrapping_sub(1);
|
||||
if !(fresh10 != 0) {
|
||||
break;
|
||||
}
|
||||
let fresh11 = lptr;
|
||||
lptr = lptr.offset(1);
|
||||
let fresh12 = optr;
|
||||
optr = optr.offset(1);
|
||||
*fresh12 = *fresh11 << 8 as libc::c_int;
|
||||
let fresh13 = rptr;
|
||||
rptr = rptr.offset(1);
|
||||
let fresh14 = optr;
|
||||
optr = optr.offset(1);
|
||||
*fresh14 = *fresh13 << 8 as libc::c_int
|
||||
}
|
||||
} else if bits_per_sample == 32 as libc::c_int as libc::c_uint {
|
||||
loop {
|
||||
let fresh15 = count;
|
||||
count = count.wrapping_sub(1);
|
||||
if !(fresh15 != 0) {
|
||||
break;
|
||||
}
|
||||
let fresh16 = lptr;
|
||||
lptr = lptr.offset(1);
|
||||
let fresh17 = optr;
|
||||
optr = optr.offset(1);
|
||||
*fresh17 = *fresh16;
|
||||
let fresh18 = rptr;
|
||||
rptr = rptr.offset(1);
|
||||
let fresh19 = optr;
|
||||
optr = optr.offset(1);
|
||||
*fresh19 = *fresh18
|
||||
}
|
||||
} else {
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d unsupported bits per sample: %u\n\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 9], &[libc::c_char; 9]>(b"write_cb\x00")).as_ptr(),
|
||||
200 as libc::c_int,
|
||||
bits_per_sample,
|
||||
);
|
||||
}
|
||||
frames = (frames as libc::c_ulong).wrapping_sub(f_0 as libc::c_ulong)
|
||||
as crate::stddef_h::size_t as crate::stddef_h::size_t;
|
||||
crate::src::buffer::_buf_inc_writep(
|
||||
outputbuf,
|
||||
f_0.wrapping_mul(8 as libc::c_int as libc::c_uint),
|
||||
);
|
||||
}
|
||||
crate::stdlib::pthread_mutex_unlock(&mut (*outputbuf).mutex);
|
||||
return crate::stdlib::FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
|
||||
}
|
||||
|
||||
unsafe extern "C" fn error_cb(
|
||||
mut decoder: *const crate::stdlib::FLAC__StreamDecoder,
|
||||
mut status: crate::stdlib::FLAC__StreamDecoderErrorStatus,
|
||||
mut client_data: *mut libc::c_void,
|
||||
) {
|
||||
if loglevel as libc::c_uint >= crate::squeezelite_h::lINFO as libc::c_int as libc::c_uint {
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d flac error: %s\n\x00" as *const u8 as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 9], &[libc::c_char; 9]>(b"error_cb\x00")).as_ptr(),
|
||||
220 as libc::c_int,
|
||||
*(*f)
|
||||
.FLAC__StreamDecoderErrorStatusString
|
||||
.offset(status as isize),
|
||||
);
|
||||
};
|
||||
}
|
||||
|
||||
unsafe extern "C" fn flac_open(
|
||||
mut sample_size: crate::squeezelite_h::u8_t,
|
||||
mut sample_rate: crate::squeezelite_h::u8_t,
|
||||
mut channels: crate::squeezelite_h::u8_t,
|
||||
mut endianness: crate::squeezelite_h::u8_t,
|
||||
) {
|
||||
if !(*f).decoder.is_null() {
|
||||
(*f).FLAC__stream_decoder_reset
|
||||
.expect("non-null function pointer")((*f).decoder);
|
||||
} else {
|
||||
(*f).decoder = (*f)
|
||||
.FLAC__stream_decoder_new
|
||||
.expect("non-null function pointer")()
|
||||
}
|
||||
if sample_size as libc::c_int == 'o' as i32 {
|
||||
if loglevel as libc::c_uint >= crate::squeezelite_h::lDEBUG as libc::c_int as libc::c_uint {
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d ogg/flac container - using init_ogg_stream\n\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 10], &[libc::c_char; 10]>(b"flac_open\x00"))
|
||||
.as_ptr(),
|
||||
231 as libc::c_int,
|
||||
);
|
||||
}
|
||||
(*f).FLAC__stream_decoder_init_ogg_stream
|
||||
.expect("non-null function pointer")(
|
||||
(*f).decoder,
|
||||
Some(
|
||||
read_cb
|
||||
as unsafe extern "C" fn(
|
||||
_: *const crate::stdlib::FLAC__StreamDecoder,
|
||||
_: *mut crate::stdlib::FLAC__byte,
|
||||
_: *mut crate::stddef_h::size_t,
|
||||
_: *mut libc::c_void,
|
||||
)
|
||||
-> crate::stdlib::FLAC__StreamDecoderReadStatus,
|
||||
),
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
Some(
|
||||
write_cb
|
||||
as unsafe extern "C" fn(
|
||||
_: *const crate::stdlib::FLAC__StreamDecoder,
|
||||
_: *const crate::stdlib::FLAC__Frame,
|
||||
_: *const *const crate::stdlib::FLAC__int32,
|
||||
_: *mut libc::c_void,
|
||||
)
|
||||
-> crate::stdlib::FLAC__StreamDecoderWriteStatus,
|
||||
),
|
||||
None,
|
||||
Some(
|
||||
error_cb
|
||||
as unsafe extern "C" fn(
|
||||
_: *const crate::stdlib::FLAC__StreamDecoder,
|
||||
_: crate::stdlib::FLAC__StreamDecoderErrorStatus,
|
||||
_: *mut libc::c_void,
|
||||
) -> (),
|
||||
),
|
||||
0 as *mut libc::c_void,
|
||||
);
|
||||
} else {
|
||||
(*f).FLAC__stream_decoder_init_stream
|
||||
.expect("non-null function pointer")(
|
||||
(*f).decoder,
|
||||
Some(
|
||||
read_cb
|
||||
as unsafe extern "C" fn(
|
||||
_: *const crate::stdlib::FLAC__StreamDecoder,
|
||||
_: *mut crate::stdlib::FLAC__byte,
|
||||
_: *mut crate::stddef_h::size_t,
|
||||
_: *mut libc::c_void,
|
||||
)
|
||||
-> crate::stdlib::FLAC__StreamDecoderReadStatus,
|
||||
),
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
Some(
|
||||
write_cb
|
||||
as unsafe extern "C" fn(
|
||||
_: *const crate::stdlib::FLAC__StreamDecoder,
|
||||
_: *const crate::stdlib::FLAC__Frame,
|
||||
_: *const *const crate::stdlib::FLAC__int32,
|
||||
_: *mut libc::c_void,
|
||||
)
|
||||
-> crate::stdlib::FLAC__StreamDecoderWriteStatus,
|
||||
),
|
||||
None,
|
||||
Some(
|
||||
error_cb
|
||||
as unsafe extern "C" fn(
|
||||
_: *const crate::stdlib::FLAC__StreamDecoder,
|
||||
_: crate::stdlib::FLAC__StreamDecoderErrorStatus,
|
||||
_: *mut libc::c_void,
|
||||
) -> (),
|
||||
),
|
||||
0 as *mut libc::c_void,
|
||||
);
|
||||
};
|
||||
}
|
||||
|
||||
unsafe extern "C" fn flac_close() {
|
||||
(*f).FLAC__stream_decoder_delete
|
||||
.expect("non-null function pointer")((*f).decoder);
|
||||
(*f).decoder = 0 as *mut crate::stdlib::FLAC__StreamDecoder;
|
||||
}
|
||||
|
||||
unsafe extern "C" fn flac_decode() -> crate::squeezelite_h::decode_state {
|
||||
let mut ok = (*f)
|
||||
.FLAC__stream_decoder_process_single
|
||||
.expect("non-null function pointer")((*f).decoder)
|
||||
!= 0;
|
||||
let mut state = (*f)
|
||||
.FLAC__stream_decoder_get_state
|
||||
.expect("non-null function pointer")((*f).decoder);
|
||||
if !ok
|
||||
&& state as libc::c_uint
|
||||
!= crate::stdlib::FLAC__STREAM_DECODER_END_OF_STREAM as libc::c_int as libc::c_uint
|
||||
{
|
||||
if loglevel as libc::c_uint >= crate::squeezelite_h::lINFO as libc::c_int as libc::c_uint {
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d flac error: %s\n\x00" as *const u8 as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 12], &[libc::c_char; 12]>(b"flac_decode\x00"))
|
||||
.as_ptr(),
|
||||
249 as libc::c_int,
|
||||
*(*f).FLAC__StreamDecoderStateString.offset(state as isize),
|
||||
);
|
||||
}
|
||||
}
|
||||
if state as libc::c_uint
|
||||
== crate::stdlib::FLAC__STREAM_DECODER_END_OF_STREAM as libc::c_int as libc::c_uint
|
||||
{
|
||||
return crate::squeezelite_h::DECODE_COMPLETE;
|
||||
} else if state as libc::c_uint
|
||||
> crate::stdlib::FLAC__STREAM_DECODER_END_OF_STREAM as libc::c_int as libc::c_uint
|
||||
{
|
||||
return crate::squeezelite_h::DECODE_ERROR;
|
||||
} else {
|
||||
return crate::squeezelite_h::DECODE_RUNNING;
|
||||
};
|
||||
}
|
||||
|
||||
unsafe extern "C" fn load_flac() -> bool {
|
||||
let mut handle = crate::stdlib::dlopen(
|
||||
b"libFLAC.so.8\x00" as *const u8 as *const libc::c_char,
|
||||
0x2 as libc::c_int,
|
||||
);
|
||||
let mut err = 0 as *mut libc::c_char;
|
||||
if handle.is_null() {
|
||||
if loglevel as libc::c_uint >= crate::squeezelite_h::lINFO as libc::c_int as libc::c_uint {
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d dlerror: %s\n\x00" as *const u8 as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 10], &[libc::c_char; 10]>(b"load_flac\x00"))
|
||||
.as_ptr(),
|
||||
267 as libc::c_int,
|
||||
crate::stdlib::dlerror(),
|
||||
);
|
||||
}
|
||||
return 0 as libc::c_int != 0;
|
||||
}
|
||||
(*f).FLAC__StreamDecoderErrorStatusString = crate::stdlib::dlsym(
|
||||
handle,
|
||||
b"FLAC__StreamDecoderErrorStatusString\x00" as *const u8 as *const libc::c_char,
|
||||
) as *mut *const libc::c_char;
|
||||
(*f).FLAC__StreamDecoderStateString = crate::stdlib::dlsym(
|
||||
handle,
|
||||
b"FLAC__StreamDecoderStateString\x00" as *const u8 as *const libc::c_char,
|
||||
) as *mut *const libc::c_char;
|
||||
(*f).FLAC__stream_decoder_new = ::std::mem::transmute::<
|
||||
*mut libc::c_void,
|
||||
Option<unsafe extern "C" fn() -> *mut crate::stdlib::FLAC__StreamDecoder>,
|
||||
>(crate::stdlib::dlsym(
|
||||
handle,
|
||||
b"FLAC__stream_decoder_new\x00" as *const u8 as *const libc::c_char,
|
||||
));
|
||||
(*f).FLAC__stream_decoder_reset = ::std::mem::transmute::<
|
||||
*mut libc::c_void,
|
||||
Option<
|
||||
unsafe extern "C" fn(
|
||||
_: *mut crate::stdlib::FLAC__StreamDecoder,
|
||||
) -> crate::stdlib::FLAC__bool,
|
||||
>,
|
||||
>(crate::stdlib::dlsym(
|
||||
handle,
|
||||
b"FLAC__stream_decoder_reset\x00" as *const u8 as *const libc::c_char,
|
||||
));
|
||||
(*f).FLAC__stream_decoder_delete = ::std::mem::transmute::<
|
||||
*mut libc::c_void,
|
||||
Option<unsafe extern "C" fn(_: *mut crate::stdlib::FLAC__StreamDecoder) -> ()>,
|
||||
>(crate::stdlib::dlsym(
|
||||
handle,
|
||||
b"FLAC__stream_decoder_delete\x00" as *const u8 as *const libc::c_char,
|
||||
));
|
||||
(*f).FLAC__stream_decoder_init_stream = ::std::mem::transmute::<
|
||||
*mut libc::c_void,
|
||||
Option<
|
||||
unsafe extern "C" fn(
|
||||
_: *mut crate::stdlib::FLAC__StreamDecoder,
|
||||
_: crate::stdlib::FLAC__StreamDecoderReadCallback,
|
||||
_: crate::stdlib::FLAC__StreamDecoderSeekCallback,
|
||||
_: crate::stdlib::FLAC__StreamDecoderTellCallback,
|
||||
_: crate::stdlib::FLAC__StreamDecoderLengthCallback,
|
||||
_: crate::stdlib::FLAC__StreamDecoderEofCallback,
|
||||
_: crate::stdlib::FLAC__StreamDecoderWriteCallback,
|
||||
_: crate::stdlib::FLAC__StreamDecoderMetadataCallback,
|
||||
_: crate::stdlib::FLAC__StreamDecoderErrorCallback,
|
||||
_: *mut libc::c_void,
|
||||
) -> crate::stdlib::FLAC__StreamDecoderInitStatus,
|
||||
>,
|
||||
>(crate::stdlib::dlsym(
|
||||
handle,
|
||||
b"FLAC__stream_decoder_init_stream\x00" as *const u8 as *const libc::c_char,
|
||||
));
|
||||
(*f).FLAC__stream_decoder_init_ogg_stream = ::std::mem::transmute::<
|
||||
*mut libc::c_void,
|
||||
Option<
|
||||
unsafe extern "C" fn(
|
||||
_: *mut crate::stdlib::FLAC__StreamDecoder,
|
||||
_: crate::stdlib::FLAC__StreamDecoderReadCallback,
|
||||
_: crate::stdlib::FLAC__StreamDecoderSeekCallback,
|
||||
_: crate::stdlib::FLAC__StreamDecoderTellCallback,
|
||||
_: crate::stdlib::FLAC__StreamDecoderLengthCallback,
|
||||
_: crate::stdlib::FLAC__StreamDecoderEofCallback,
|
||||
_: crate::stdlib::FLAC__StreamDecoderWriteCallback,
|
||||
_: crate::stdlib::FLAC__StreamDecoderMetadataCallback,
|
||||
_: crate::stdlib::FLAC__StreamDecoderErrorCallback,
|
||||
_: *mut libc::c_void,
|
||||
) -> crate::stdlib::FLAC__StreamDecoderInitStatus,
|
||||
>,
|
||||
>(crate::stdlib::dlsym(
|
||||
handle,
|
||||
b"FLAC__stream_decoder_init_ogg_stream\x00" as *const u8 as *const libc::c_char,
|
||||
));
|
||||
(*f).FLAC__stream_decoder_process_single = ::std::mem::transmute::<
|
||||
*mut libc::c_void,
|
||||
Option<
|
||||
unsafe extern "C" fn(
|
||||
_: *mut crate::stdlib::FLAC__StreamDecoder,
|
||||
) -> crate::stdlib::FLAC__bool,
|
||||
>,
|
||||
>(crate::stdlib::dlsym(
|
||||
handle,
|
||||
b"FLAC__stream_decoder_process_single\x00" as *const u8 as *const libc::c_char,
|
||||
));
|
||||
(*f).FLAC__stream_decoder_get_state = ::std::mem::transmute::<
|
||||
*mut libc::c_void,
|
||||
Option<
|
||||
unsafe extern "C" fn(
|
||||
_: *const crate::stdlib::FLAC__StreamDecoder,
|
||||
) -> crate::stdlib::FLAC__StreamDecoderState,
|
||||
>,
|
||||
>(crate::stdlib::dlsym(
|
||||
handle,
|
||||
b"FLAC__stream_decoder_get_state\x00" as *const u8 as *const libc::c_char,
|
||||
));
|
||||
err = crate::stdlib::dlerror();
|
||||
if !err.is_null() {
|
||||
if loglevel as libc::c_uint >= crate::squeezelite_h::lINFO as libc::c_int as libc::c_uint {
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d dlerror: %s\n\x00" as *const u8 as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 10], &[libc::c_char; 10]>(b"load_flac\x00"))
|
||||
.as_ptr(),
|
||||
282 as libc::c_int,
|
||||
err,
|
||||
);
|
||||
}
|
||||
return 0 as libc::c_int != 0;
|
||||
}
|
||||
if loglevel as libc::c_uint >= crate::squeezelite_h::lINFO as libc::c_int as libc::c_uint {
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d loaded libFLAC.so.8\n\x00" as *const u8 as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 10], &[libc::c_char; 10]>(b"load_flac\x00")).as_ptr(),
|
||||
286 as libc::c_int,
|
||||
);
|
||||
}
|
||||
return 1 as libc::c_int != 0;
|
||||
}
|
||||
/*
|
||||
* Squeezelite - lightweight headless squeezebox emulator
|
||||
*
|
||||
* (c) Adrian Smith 2012-2015, triode1@btinternet.com
|
||||
* Ralph Irving 2015-2017, ralph_irving@hotmail.com
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Additions (c) Paul Hermann, 2015-2017 under the same license terms
|
||||
* -Control of Raspberry pi GPIO for amplifier power
|
||||
* -Launch script on power status change from LMS
|
||||
*/
|
||||
// make may define: PORTAUDIO, SELFPIPE, RESAMPLE, RESAMPLE_MP, VISEXPORT, GPIO, IR, DSD, LINKALL to influence build
|
||||
// build detection
|
||||
// dynamically loaded libraries at run time
|
||||
// !LINKALL
|
||||
// config options
|
||||
// do not reduce as icy-meta max is 4080
|
||||
/* SUN */
|
||||
/* SUN */
|
||||
// printf/scanf formats for u64_t
|
||||
// logging
|
||||
// utils.c (non logging)
|
||||
// buffer.c
|
||||
// _* called with mutex locked
|
||||
// slimproto.c
|
||||
// stream.c
|
||||
// decode.c
|
||||
// output.c output_alsa.c output_pa.c output_pack.c
|
||||
// frames played at the point delay is measured
|
||||
// ordered largest first so [0] is max_rate
|
||||
// set in decode thread
|
||||
// set in decode thread
|
||||
// set by slimproto
|
||||
// set by slimproto
|
||||
// set by slimproto
|
||||
// set by slimproto
|
||||
// set by slimproto
|
||||
// set by slimproto
|
||||
// set by slimproto
|
||||
// _* called with mutex locked
|
||||
// output_alsa.c
|
||||
// output_pa.c
|
||||
// output_pulse.c
|
||||
// output_stdout.c
|
||||
// output_pack.c
|
||||
// output_vis.c
|
||||
// dop.c
|
||||
// codecs
|
||||
#[no_mangle]
|
||||
|
||||
pub unsafe extern "C" fn register_flac() -> *mut crate::squeezelite_h::codec {
|
||||
static mut ret: crate::squeezelite_h::codec = unsafe {
|
||||
{
|
||||
let mut init = crate::squeezelite_h::codec {
|
||||
id: 'f' as i32 as libc::c_char,
|
||||
types: b"ogf,flc\x00" as *const u8 as *const libc::c_char as *mut libc::c_char,
|
||||
min_read_bytes: 16384 as libc::c_int as libc::c_uint,
|
||||
min_space: 204800 as libc::c_int as libc::c_uint,
|
||||
open: Some(
|
||||
flac_open
|
||||
as unsafe extern "C" fn(
|
||||
_: crate::squeezelite_h::u8_t,
|
||||
_: crate::squeezelite_h::u8_t,
|
||||
_: crate::squeezelite_h::u8_t,
|
||||
_: crate::squeezelite_h::u8_t,
|
||||
) -> (),
|
||||
),
|
||||
close: Some(flac_close as unsafe extern "C" fn() -> ()),
|
||||
decode: Some(
|
||||
flac_decode as unsafe extern "C" fn() -> crate::squeezelite_h::decode_state,
|
||||
),
|
||||
};
|
||||
init
|
||||
}
|
||||
};
|
||||
f = crate::stdlib::malloc(::std::mem::size_of::<flac>() as libc::c_ulong) as *mut flac;
|
||||
if f.is_null() {
|
||||
return 0 as *mut crate::squeezelite_h::codec;
|
||||
}
|
||||
(*f).decoder = 0 as *mut crate::stdlib::FLAC__StreamDecoder;
|
||||
if !load_flac() {
|
||||
return 0 as *mut crate::squeezelite_h::codec;
|
||||
}
|
||||
if loglevel as libc::c_uint >= crate::squeezelite_h::lINFO as libc::c_int as libc::c_uint {
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d using flac to decode ogf,flc\n\x00" as *const u8 as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 14], &[libc::c_char; 14]>(b"register_flac\x00"))
|
||||
.as_ptr(),
|
||||
314 as libc::c_int,
|
||||
);
|
||||
}
|
||||
return &mut ret;
|
||||
}
|
9
src/internal.rs
Normal file
9
src/internal.rs
Normal file
@ -0,0 +1,9 @@
|
||||
pub type __builtin_va_list = [crate::internal::__va_list_tag; 1];
|
||||
#[repr(C)]
|
||||
#[derive(Copy, Clone)]
|
||||
pub struct __va_list_tag {
|
||||
pub gp_offset: libc::c_uint,
|
||||
pub fp_offset: libc::c_uint,
|
||||
pub overflow_arg_area: *mut libc::c_void,
|
||||
pub reg_save_area: *mut libc::c_void,
|
||||
}
|
989
src/mad.rs
Normal file
989
src/mad.rs
Normal file
@ -0,0 +1,989 @@
|
||||
use ::libc;
|
||||
|
||||
pub use crate::stddef_h::size_t;
|
||||
pub use crate::stdlib::__int32_t;
|
||||
pub use crate::stdlib::__uint32_t;
|
||||
pub use crate::stdlib::__uint64_t;
|
||||
pub use crate::stdlib::__uint8_t;
|
||||
pub use crate::stdlib::int32_t;
|
||||
|
||||
pub use crate::stdlib::__pthread_internal_list;
|
||||
pub use crate::stdlib::__pthread_list_t;
|
||||
pub use crate::stdlib::__pthread_mutex_s;
|
||||
pub use crate::stdlib::pthread_mutex_t;
|
||||
pub use crate::stdlib::u_int32_t;
|
||||
pub use crate::stdlib::u_int64_t;
|
||||
pub use crate::stdlib::u_int8_t;
|
||||
|
||||
pub use crate::squeezelite_h::buffer;
|
||||
pub use crate::squeezelite_h::codec;
|
||||
pub use crate::squeezelite_h::decode_state;
|
||||
pub use crate::squeezelite_h::decodestate;
|
||||
pub use crate::squeezelite_h::disconnect_code;
|
||||
pub use crate::squeezelite_h::fade_dir;
|
||||
pub use crate::squeezelite_h::fade_mode;
|
||||
pub use crate::squeezelite_h::fade_state;
|
||||
pub use crate::squeezelite_h::frames_t;
|
||||
pub use crate::squeezelite_h::lDEBUG;
|
||||
pub use crate::squeezelite_h::lERROR;
|
||||
pub use crate::squeezelite_h::lINFO;
|
||||
pub use crate::squeezelite_h::lSDEBUG;
|
||||
pub use crate::squeezelite_h::lWARN;
|
||||
pub use crate::squeezelite_h::log_level;
|
||||
pub use crate::squeezelite_h::output_format;
|
||||
pub use crate::squeezelite_h::output_state;
|
||||
pub use crate::squeezelite_h::outputstate;
|
||||
pub use crate::squeezelite_h::s32_t;
|
||||
pub use crate::squeezelite_h::stream_state;
|
||||
pub use crate::squeezelite_h::streamstate;
|
||||
pub use crate::squeezelite_h::u32_t;
|
||||
pub use crate::squeezelite_h::u64_t;
|
||||
pub use crate::squeezelite_h::u8_t;
|
||||
pub use crate::squeezelite_h::C2RustUnnamed_1;
|
||||
pub use crate::squeezelite_h::_buf_used;
|
||||
pub use crate::squeezelite_h::DECODE_COMPLETE;
|
||||
pub use crate::squeezelite_h::DECODE_ERROR;
|
||||
pub use crate::squeezelite_h::DECODE_READY;
|
||||
pub use crate::squeezelite_h::DECODE_RUNNING;
|
||||
pub use crate::squeezelite_h::DECODE_STOPPED;
|
||||
pub use crate::squeezelite_h::DISCONNECT;
|
||||
pub use crate::squeezelite_h::DISCONNECT_OK;
|
||||
pub use crate::squeezelite_h::FADE_ACTIVE;
|
||||
pub use crate::squeezelite_h::FADE_CROSS;
|
||||
pub use crate::squeezelite_h::FADE_CROSSFADE;
|
||||
pub use crate::squeezelite_h::FADE_DOWN;
|
||||
pub use crate::squeezelite_h::FADE_DUE;
|
||||
pub use crate::squeezelite_h::FADE_IN;
|
||||
pub use crate::squeezelite_h::FADE_INACTIVE;
|
||||
pub use crate::squeezelite_h::FADE_INOUT;
|
||||
pub use crate::squeezelite_h::FADE_NONE;
|
||||
pub use crate::squeezelite_h::FADE_OUT;
|
||||
pub use crate::squeezelite_h::FADE_UP;
|
||||
pub use crate::squeezelite_h::LOCAL_DISCONNECT;
|
||||
pub use crate::squeezelite_h::OUTPUT_BUFFER;
|
||||
pub use crate::squeezelite_h::OUTPUT_OFF;
|
||||
pub use crate::squeezelite_h::OUTPUT_PAUSE_FRAMES;
|
||||
pub use crate::squeezelite_h::OUTPUT_RUNNING;
|
||||
pub use crate::squeezelite_h::OUTPUT_SKIP_FRAMES;
|
||||
pub use crate::squeezelite_h::OUTPUT_START_AT;
|
||||
pub use crate::squeezelite_h::OUTPUT_STOPPED;
|
||||
pub use crate::squeezelite_h::RECV_HEADERS;
|
||||
pub use crate::squeezelite_h::REMOTE_DISCONNECT;
|
||||
pub use crate::squeezelite_h::S16_LE;
|
||||
pub use crate::squeezelite_h::S24_3LE;
|
||||
pub use crate::squeezelite_h::S24_LE;
|
||||
pub use crate::squeezelite_h::S32_LE;
|
||||
pub use crate::squeezelite_h::SEND_HEADERS;
|
||||
pub use crate::squeezelite_h::STOPPED;
|
||||
pub use crate::squeezelite_h::STREAMING_BUFFERING;
|
||||
pub use crate::squeezelite_h::STREAMING_FILE;
|
||||
pub use crate::squeezelite_h::STREAMING_HTTP;
|
||||
pub use crate::squeezelite_h::STREAMING_WAIT;
|
||||
pub use crate::squeezelite_h::TIMEOUT;
|
||||
pub use crate::squeezelite_h::UNREACHABLE;
|
||||
pub use crate::src::buffer::_buf_cont_read;
|
||||
pub use crate::src::buffer::_buf_cont_write;
|
||||
pub use crate::src::buffer::_buf_inc_readp;
|
||||
pub use crate::src::buffer::_buf_inc_writep;
|
||||
pub use crate::src::buffer::_buf_space;
|
||||
pub use crate::src::decode::decode_newstream;
|
||||
pub use crate::src::output::_checkfade;
|
||||
pub use crate::src::utils::logprint;
|
||||
pub use crate::src::utils::logtime;
|
||||
pub use crate::src::utils::unpackN;
|
||||
use crate::stdlib::dlerror;
|
||||
use crate::stdlib::dlopen;
|
||||
use crate::stdlib::dlsym;
|
||||
use crate::stdlib::free;
|
||||
pub use crate::stdlib::mad_bitptr;
|
||||
pub use crate::stdlib::mad_emphasis;
|
||||
pub use crate::stdlib::mad_error;
|
||||
pub use crate::stdlib::mad_fixed_t;
|
||||
pub use crate::stdlib::mad_frame;
|
||||
pub use crate::stdlib::mad_header;
|
||||
pub use crate::stdlib::mad_layer;
|
||||
pub use crate::stdlib::mad_mode;
|
||||
pub use crate::stdlib::mad_pcm;
|
||||
pub use crate::stdlib::mad_stream;
|
||||
pub use crate::stdlib::mad_synth;
|
||||
pub use crate::stdlib::mad_timer_t;
|
||||
use crate::stdlib::malloc;
|
||||
use crate::stdlib::memcmp;
|
||||
use crate::stdlib::memcpy;
|
||||
use crate::stdlib::memmove;
|
||||
use crate::stdlib::memset;
|
||||
use crate::stdlib::pthread_mutex_lock;
|
||||
use crate::stdlib::pthread_mutex_unlock;
|
||||
pub use crate::stdlib::MAD_EMPHASIS_50_15_US;
|
||||
pub use crate::stdlib::MAD_EMPHASIS_CCITT_J_17;
|
||||
pub use crate::stdlib::MAD_EMPHASIS_NONE;
|
||||
pub use crate::stdlib::MAD_EMPHASIS_RESERVED;
|
||||
pub use crate::stdlib::MAD_ERROR_BADBIGVALUES;
|
||||
pub use crate::stdlib::MAD_ERROR_BADBITALLOC;
|
||||
pub use crate::stdlib::MAD_ERROR_BADBITRATE;
|
||||
pub use crate::stdlib::MAD_ERROR_BADBLOCKTYPE;
|
||||
pub use crate::stdlib::MAD_ERROR_BADCRC;
|
||||
pub use crate::stdlib::MAD_ERROR_BADDATAPTR;
|
||||
pub use crate::stdlib::MAD_ERROR_BADEMPHASIS;
|
||||
pub use crate::stdlib::MAD_ERROR_BADFRAMELEN;
|
||||
pub use crate::stdlib::MAD_ERROR_BADHUFFDATA;
|
||||
pub use crate::stdlib::MAD_ERROR_BADHUFFTABLE;
|
||||
pub use crate::stdlib::MAD_ERROR_BADLAYER;
|
||||
pub use crate::stdlib::MAD_ERROR_BADMODE;
|
||||
pub use crate::stdlib::MAD_ERROR_BADPART3LEN;
|
||||
pub use crate::stdlib::MAD_ERROR_BADSAMPLERATE;
|
||||
pub use crate::stdlib::MAD_ERROR_BADSCALEFACTOR;
|
||||
pub use crate::stdlib::MAD_ERROR_BADSCFSI;
|
||||
pub use crate::stdlib::MAD_ERROR_BADSTEREO;
|
||||
pub use crate::stdlib::MAD_ERROR_BUFLEN;
|
||||
pub use crate::stdlib::MAD_ERROR_BUFPTR;
|
||||
pub use crate::stdlib::MAD_ERROR_LOSTSYNC;
|
||||
pub use crate::stdlib::MAD_ERROR_NOMEM;
|
||||
pub use crate::stdlib::MAD_ERROR_NONE;
|
||||
pub use crate::stdlib::MAD_LAYER_I;
|
||||
pub use crate::stdlib::MAD_LAYER_II;
|
||||
pub use crate::stdlib::MAD_LAYER_III;
|
||||
pub use crate::stdlib::MAD_MODE_DUAL_CHANNEL;
|
||||
pub use crate::stdlib::MAD_MODE_JOINT_STEREO;
|
||||
pub use crate::stdlib::MAD_MODE_SINGLE_CHANNEL;
|
||||
pub use crate::stdlib::MAD_MODE_STEREO;
|
||||
extern "C" {
|
||||
#[no_mangle]
|
||||
pub static mut loglevel: crate::squeezelite_h::log_level;
|
||||
#[no_mangle]
|
||||
pub static mut streambuf: *mut crate::squeezelite_h::buffer;
|
||||
#[no_mangle]
|
||||
pub static mut outputbuf: *mut crate::squeezelite_h::buffer;
|
||||
#[no_mangle]
|
||||
pub static mut stream: crate::squeezelite_h::streamstate;
|
||||
#[no_mangle]
|
||||
pub static mut output: crate::squeezelite_h::outputstate;
|
||||
#[no_mangle]
|
||||
pub static mut decode: crate::squeezelite_h::decodestate;
|
||||
}
|
||||
// local buffer used by decoder: FIXME merge with any other decoders needing one?
|
||||
|
||||
#[repr(C)]
|
||||
#[derive(Copy, Clone)]
|
||||
pub struct mad {
|
||||
pub readbuf: *mut crate::squeezelite_h::u8_t,
|
||||
pub readbuf_len: libc::c_uint,
|
||||
pub stream: crate::stdlib::mad_stream,
|
||||
pub frame: crate::stdlib::mad_frame,
|
||||
pub synth: crate::stdlib::mad_synth,
|
||||
pub last_error: crate::stdlib::mad_error,
|
||||
pub checktags: libc::c_int,
|
||||
pub consume: crate::squeezelite_h::u32_t,
|
||||
pub skip: crate::squeezelite_h::u32_t,
|
||||
pub samples: crate::squeezelite_h::u64_t,
|
||||
pub padding: crate::squeezelite_h::u32_t,
|
||||
pub mad_stream_init: Option<unsafe extern "C" fn(_: *mut crate::stdlib::mad_stream) -> ()>,
|
||||
pub mad_frame_init: Option<unsafe extern "C" fn(_: *mut crate::stdlib::mad_frame) -> ()>,
|
||||
pub mad_synth_init: Option<unsafe extern "C" fn(_: *mut crate::stdlib::mad_synth) -> ()>,
|
||||
pub mad_frame_finish: Option<unsafe extern "C" fn(_: *mut crate::stdlib::mad_frame) -> ()>,
|
||||
pub mad_stream_finish: Option<unsafe extern "C" fn(_: *mut crate::stdlib::mad_stream) -> ()>,
|
||||
pub mad_stream_buffer: Option<
|
||||
unsafe extern "C" fn(
|
||||
_: *mut crate::stdlib::mad_stream,
|
||||
_: *const libc::c_uchar,
|
||||
_: libc::c_ulong,
|
||||
) -> (),
|
||||
>,
|
||||
pub mad_frame_decode: Option<
|
||||
unsafe extern "C" fn(
|
||||
_: *mut crate::stdlib::mad_frame,
|
||||
_: *mut crate::stdlib::mad_stream,
|
||||
) -> libc::c_int,
|
||||
>,
|
||||
pub mad_synth_frame: Option<
|
||||
unsafe extern "C" fn(
|
||||
_: *mut crate::stdlib::mad_synth,
|
||||
_: *const crate::stdlib::mad_frame,
|
||||
) -> (),
|
||||
>,
|
||||
pub mad_stream_errorstr:
|
||||
Option<unsafe extern "C" fn(_: *const crate::stdlib::mad_stream) -> *const libc::c_char>,
|
||||
}
|
||||
|
||||
static mut m: *mut mad = 0 as *const mad as *mut mad;
|
||||
// based on libmad minimad.c scale
|
||||
#[inline]
|
||||
|
||||
unsafe extern "C" fn scale(mut sample: crate::stdlib::mad_fixed_t) -> crate::squeezelite_h::u32_t {
|
||||
sample = (sample as libc::c_long
|
||||
+ ((1 as libc::c_long) << 28 as libc::c_int - 24 as libc::c_int))
|
||||
as crate::stdlib::mad_fixed_t;
|
||||
if sample >= 0x10000000 as libc::c_long as crate::stdlib::mad_fixed_t {
|
||||
sample = 0x10000000 as libc::c_long as crate::stdlib::mad_fixed_t - 1 as libc::c_int
|
||||
} else if sample < -(0x10000000 as libc::c_long as crate::stdlib::mad_fixed_t) {
|
||||
sample = -(0x10000000 as libc::c_long as crate::stdlib::mad_fixed_t)
|
||||
}
|
||||
return ((sample >> 28 as libc::c_int + 1 as libc::c_int - 24 as libc::c_int)
|
||||
<< 8 as libc::c_int) as crate::squeezelite_h::u32_t;
|
||||
}
|
||||
// check for id3.2 tag at start of file - http://id3.org/id3v2.4.0-structure, return length
|
||||
|
||||
unsafe extern "C" fn _check_id3_tag(mut bytes: crate::stddef_h::size_t) -> libc::c_uint {
|
||||
let mut ptr = (*streambuf).readp;
|
||||
let mut size = 0 as libc::c_int as crate::squeezelite_h::u32_t;
|
||||
if bytes > 10 as libc::c_int as libc::c_ulong
|
||||
&& *ptr as libc::c_int == 'I' as i32
|
||||
&& *ptr.offset(1 as libc::c_int as isize) as libc::c_int == 'D' as i32
|
||||
&& *ptr.offset(2 as libc::c_int as isize) as libc::c_int == '3' as i32
|
||||
{
|
||||
// size is encoded as syncsafe integer, add 10 if footer present
|
||||
if (*ptr.offset(6 as libc::c_int as isize) as libc::c_int) < 0x80 as libc::c_int
|
||||
&& (*ptr.offset(7 as libc::c_int as isize) as libc::c_int) < 0x80 as libc::c_int
|
||||
&& (*ptr.offset(8 as libc::c_int as isize) as libc::c_int) < 0x80 as libc::c_int
|
||||
&& (*ptr.offset(9 as libc::c_int as isize) as libc::c_int) < 0x80 as libc::c_int
|
||||
{
|
||||
size = (10 as libc::c_int
|
||||
+ ((*ptr.offset(6 as libc::c_int as isize) as libc::c_int) << 21 as libc::c_int)
|
||||
+ ((*ptr.offset(7 as libc::c_int as isize) as libc::c_int) << 14 as libc::c_int)
|
||||
+ ((*ptr.offset(8 as libc::c_int as isize) as libc::c_int) << 7 as libc::c_int)
|
||||
+ *ptr.offset(9 as libc::c_int as isize) as libc::c_int
|
||||
+ (if *ptr.offset(5 as libc::c_int as isize) as libc::c_int & 0x10 as libc::c_int
|
||||
!= 0
|
||||
{
|
||||
10 as libc::c_int
|
||||
} else {
|
||||
0 as libc::c_int
|
||||
})) as crate::squeezelite_h::u32_t;
|
||||
if loglevel as libc::c_uint
|
||||
>= crate::squeezelite_h::lDEBUG as libc::c_int as libc::c_uint
|
||||
{
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d id3.2 tag len: %u\n\x00" as *const u8 as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 15], &[libc::c_char; 15]>(
|
||||
b"_check_id3_tag\x00",
|
||||
))
|
||||
.as_ptr(),
|
||||
111 as libc::c_int,
|
||||
size,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
return size;
|
||||
}
|
||||
// check for lame gapless params, don't advance streambuf
|
||||
|
||||
unsafe extern "C" fn _check_lame_header(mut bytes: crate::stddef_h::size_t) {
|
||||
let mut ptr = (*streambuf).readp;
|
||||
if *ptr as libc::c_int == 0xff as libc::c_int
|
||||
&& *ptr.offset(1 as libc::c_int as isize) as libc::c_int & 0xf0 as libc::c_int
|
||||
== 0xf0 as libc::c_int
|
||||
&& bytes > 180 as libc::c_int as libc::c_ulong
|
||||
{
|
||||
let mut frame_count = 0 as libc::c_int as crate::squeezelite_h::u32_t;
|
||||
let mut enc_delay = 0 as libc::c_int as crate::squeezelite_h::u32_t;
|
||||
let mut enc_padding = 0 as libc::c_int as crate::squeezelite_h::u32_t;
|
||||
let mut flags: crate::squeezelite_h::u8_t = 0;
|
||||
// 2 channels
|
||||
if crate::stdlib::memcmp(
|
||||
ptr.offset(36 as libc::c_int as isize) as *const libc::c_void,
|
||||
b"Xing\x00" as *const u8 as *const libc::c_char as *const libc::c_void,
|
||||
4 as libc::c_int as libc::c_ulong,
|
||||
) == 0
|
||||
|| crate::stdlib::memcmp(
|
||||
ptr.offset(36 as libc::c_int as isize) as *const libc::c_void,
|
||||
b"Info\x00" as *const u8 as *const libc::c_char as *const libc::c_void,
|
||||
4 as libc::c_int as libc::c_ulong,
|
||||
) == 0
|
||||
{
|
||||
ptr = ptr.offset((36 as libc::c_int + 7 as libc::c_int) as isize)
|
||||
// mono
|
||||
} else if crate::stdlib::memcmp(
|
||||
ptr.offset(21 as libc::c_int as isize) as *const libc::c_void,
|
||||
b"Xing\x00" as *const u8 as *const libc::c_char as *const libc::c_void,
|
||||
4 as libc::c_int as libc::c_ulong,
|
||||
) == 0
|
||||
|| crate::stdlib::memcmp(
|
||||
ptr.offset(21 as libc::c_int as isize) as *const libc::c_void,
|
||||
b"Info\x00" as *const u8 as *const libc::c_char as *const libc::c_void,
|
||||
4 as libc::c_int as libc::c_ulong,
|
||||
) == 0
|
||||
{
|
||||
ptr = ptr.offset((21 as libc::c_int + 7 as libc::c_int) as isize)
|
||||
}
|
||||
flags = *ptr;
|
||||
if flags as libc::c_int & 0x1 as libc::c_int != 0 {
|
||||
frame_count = crate::src::utils::unpackN(
|
||||
ptr.offset(1 as libc::c_int as isize) as *mut crate::squeezelite_h::u32_t
|
||||
);
|
||||
ptr = ptr.offset(4 as libc::c_int as isize)
|
||||
}
|
||||
if flags as libc::c_int & 0x2 as libc::c_int != 0 {
|
||||
ptr = ptr.offset(4 as libc::c_int as isize)
|
||||
}
|
||||
if flags as libc::c_int & 0x4 as libc::c_int != 0 {
|
||||
ptr = ptr.offset(100 as libc::c_int as isize)
|
||||
}
|
||||
if flags as libc::c_int & 0x8 as libc::c_int != 0 {
|
||||
ptr = ptr.offset(4 as libc::c_int as isize)
|
||||
}
|
||||
if crate::stdlib::memcmp(
|
||||
ptr.offset(1 as libc::c_int as isize) as *const libc::c_void,
|
||||
b"LAME\x00" as *const u8 as *const libc::c_char as *const libc::c_void,
|
||||
4 as libc::c_int as libc::c_ulong,
|
||||
) != 0
|
||||
{
|
||||
return;
|
||||
}
|
||||
ptr = ptr.offset(22 as libc::c_int as isize);
|
||||
enc_delay = (((*ptr as libc::c_int) << 4 as libc::c_int
|
||||
| *ptr.offset(1 as libc::c_int as isize) as libc::c_int >> 4 as libc::c_int)
|
||||
+ 529 as libc::c_int) as crate::squeezelite_h::u32_t;
|
||||
enc_padding = ((*ptr.offset(1 as libc::c_int as isize) as libc::c_int & 0xf as libc::c_int)
|
||||
<< 8 as libc::c_int
|
||||
| *ptr.offset(2 as libc::c_int as isize) as libc::c_int)
|
||||
as crate::squeezelite_h::u32_t;
|
||||
enc_padding = if enc_padding > 529 as libc::c_int as libc::c_uint {
|
||||
enc_padding.wrapping_sub(529 as libc::c_int as libc::c_uint)
|
||||
} else {
|
||||
0 as libc::c_int as libc::c_uint
|
||||
};
|
||||
// add one frame to initial skip for this (empty) frame
|
||||
(*m).skip = enc_delay.wrapping_add(1152 as libc::c_int as libc::c_uint);
|
||||
(*m).samples = frame_count
|
||||
.wrapping_mul(1152 as libc::c_int as libc::c_uint)
|
||||
.wrapping_sub(enc_delay)
|
||||
.wrapping_sub(enc_padding) as crate::squeezelite_h::u64_t;
|
||||
(*m).padding = enc_padding;
|
||||
if loglevel as libc::c_uint >= crate::squeezelite_h::lINFO as libc::c_int as libc::c_uint {
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d gapless: skip: %u samples: %lu delay: %u padding: %u\n\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 19], &[libc::c_char; 19]>(
|
||||
b"_check_lame_header\x00",
|
||||
))
|
||||
.as_ptr(),
|
||||
160 as libc::c_int,
|
||||
(*m).skip,
|
||||
(*m).samples,
|
||||
enc_delay,
|
||||
enc_padding,
|
||||
);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
unsafe extern "C" fn mad_decode() -> crate::squeezelite_h::decode_state {
|
||||
let mut bytes: crate::stddef_h::size_t = 0;
|
||||
let mut eos = 0 as libc::c_int != 0;
|
||||
crate::stdlib::pthread_mutex_lock(&mut (*streambuf).mutex);
|
||||
bytes = if crate::squeezelite_h::_buf_used(streambuf)
|
||||
< crate::src::buffer::_buf_cont_read(streambuf)
|
||||
{
|
||||
crate::squeezelite_h::_buf_used(streambuf)
|
||||
} else {
|
||||
crate::src::buffer::_buf_cont_read(streambuf)
|
||||
} as crate::stddef_h::size_t;
|
||||
if (*m).checktags != 0 {
|
||||
if (*m).checktags == 1 as libc::c_int {
|
||||
(*m).consume = _check_id3_tag(bytes);
|
||||
(*m).checktags = 2 as libc::c_int
|
||||
}
|
||||
if (*m).consume != 0 {
|
||||
let mut consume = if ((*m).consume as libc::c_ulong) < bytes {
|
||||
(*m).consume as libc::c_ulong
|
||||
} else {
|
||||
bytes
|
||||
} as crate::squeezelite_h::u32_t;
|
||||
if loglevel as libc::c_uint
|
||||
>= crate::squeezelite_h::lDEBUG as libc::c_int as libc::c_uint
|
||||
{
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d consume: %u of %u\n\x00" as *const u8 as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 11], &[libc::c_char; 11]>(b"mad_decode\x00"))
|
||||
.as_ptr(),
|
||||
178 as libc::c_int,
|
||||
consume,
|
||||
(*m).consume,
|
||||
);
|
||||
}
|
||||
crate::src::buffer::_buf_inc_readp(streambuf, consume);
|
||||
(*m).consume = ((*m).consume as libc::c_uint).wrapping_sub(consume)
|
||||
as crate::squeezelite_h::u32_t
|
||||
as crate::squeezelite_h::u32_t;
|
||||
crate::stdlib::pthread_mutex_unlock(&mut (*streambuf).mutex);
|
||||
return crate::squeezelite_h::DECODE_RUNNING;
|
||||
}
|
||||
if (*m).checktags == 2 as libc::c_int {
|
||||
if stream.meta_interval == 0 {
|
||||
_check_lame_header(bytes);
|
||||
}
|
||||
(*m).checktags = 0 as libc::c_int
|
||||
}
|
||||
}
|
||||
if !(*m).stream.next_frame.is_null() && (*m).readbuf_len != 0 {
|
||||
(*m).readbuf_len = ((*m).readbuf_len as libc::c_long
|
||||
- (*m).stream.next_frame.wrapping_offset_from((*m).readbuf) as libc::c_long)
|
||||
as libc::c_uint;
|
||||
crate::stdlib::memmove(
|
||||
(*m).readbuf as *mut libc::c_void,
|
||||
(*m).stream.next_frame as *const libc::c_void,
|
||||
(*m).readbuf_len as libc::c_ulong,
|
||||
);
|
||||
}
|
||||
bytes = if bytes
|
||||
< (2048 as libc::c_int as libc::c_uint).wrapping_sub((*m).readbuf_len) as libc::c_ulong
|
||||
{
|
||||
bytes
|
||||
} else {
|
||||
(2048 as libc::c_int as libc::c_uint).wrapping_sub((*m).readbuf_len) as libc::c_ulong
|
||||
};
|
||||
crate::stdlib::memcpy(
|
||||
(*m).readbuf.offset((*m).readbuf_len as isize) as *mut libc::c_void,
|
||||
(*streambuf).readp as *const libc::c_void,
|
||||
bytes,
|
||||
);
|
||||
(*m).readbuf_len =
|
||||
((*m).readbuf_len as libc::c_ulong).wrapping_add(bytes) as libc::c_uint as libc::c_uint;
|
||||
crate::src::buffer::_buf_inc_readp(streambuf, bytes as libc::c_uint);
|
||||
if stream.state as libc::c_uint
|
||||
<= crate::squeezelite_h::DISCONNECT as libc::c_int as libc::c_uint
|
||||
&& crate::squeezelite_h::_buf_used(streambuf) == 0 as libc::c_int as libc::c_uint
|
||||
{
|
||||
eos = 1 as libc::c_int != 0;
|
||||
if loglevel as libc::c_uint >= crate::squeezelite_h::lDEBUG as libc::c_int as libc::c_uint {
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d end of stream\n\x00" as *const u8 as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 11], &[libc::c_char; 11]>(b"mad_decode\x00"))
|
||||
.as_ptr(),
|
||||
204 as libc::c_int,
|
||||
);
|
||||
}
|
||||
crate::stdlib::memset(
|
||||
(*m).readbuf.offset((*m).readbuf_len as isize) as *mut libc::c_void,
|
||||
0 as libc::c_int,
|
||||
8 as libc::c_int as libc::c_ulong,
|
||||
);
|
||||
(*m).readbuf_len = (*m)
|
||||
.readbuf_len
|
||||
.wrapping_add(8 as libc::c_int as libc::c_uint)
|
||||
}
|
||||
crate::stdlib::pthread_mutex_unlock(&mut (*streambuf).mutex);
|
||||
(*m).mad_stream_buffer.expect("non-null function pointer")(
|
||||
&mut (*m).stream,
|
||||
(*m).readbuf,
|
||||
(*m).readbuf_len as libc::c_ulong,
|
||||
);
|
||||
loop {
|
||||
let mut frames: crate::stddef_h::size_t = 0;
|
||||
let mut iptrl = 0 as *mut crate::squeezelite_h::s32_t;
|
||||
let mut iptrr = 0 as *mut crate::squeezelite_h::s32_t;
|
||||
let mut max_frames: libc::c_uint = 0;
|
||||
if (*m).mad_frame_decode.expect("non-null function pointer")(
|
||||
&mut (*m).frame,
|
||||
&mut (*m).stream,
|
||||
) == -(1 as libc::c_int)
|
||||
{
|
||||
let mut ret = crate::squeezelite_h::DECODE_STOPPED;
|
||||
if !eos
|
||||
&& (*m).stream.error as libc::c_uint
|
||||
== crate::stdlib::MAD_ERROR_BUFLEN as libc::c_int as libc::c_uint
|
||||
{
|
||||
ret = crate::squeezelite_h::DECODE_RUNNING
|
||||
} else if eos as libc::c_int != 0
|
||||
&& ((*m).stream.error as libc::c_uint
|
||||
== crate::stdlib::MAD_ERROR_BUFLEN as libc::c_int as libc::c_uint
|
||||
|| (*m).stream.error as libc::c_uint
|
||||
== crate::stdlib::MAD_ERROR_LOSTSYNC as libc::c_int as libc::c_uint
|
||||
|| (*m).stream.error as libc::c_uint
|
||||
== crate::stdlib::MAD_ERROR_BADBITRATE as libc::c_int as libc::c_uint)
|
||||
{
|
||||
ret = crate::squeezelite_h::DECODE_COMPLETE
|
||||
} else if (*m).stream.error as libc::c_uint & 0xff00 as libc::c_int as libc::c_uint == 0
|
||||
{
|
||||
if loglevel as libc::c_uint
|
||||
>= crate::squeezelite_h::lINFO as libc::c_int as libc::c_uint
|
||||
{
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d mad_frame_decode error: %s - stopping decoder\n\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 11], &[libc::c_char; 11]>(
|
||||
b"mad_decode\x00",
|
||||
))
|
||||
.as_ptr(),
|
||||
227 as libc::c_int,
|
||||
(*m).mad_stream_errorstr.expect("non-null function pointer")(
|
||||
&mut (*m).stream,
|
||||
),
|
||||
);
|
||||
}
|
||||
ret = crate::squeezelite_h::DECODE_COMPLETE
|
||||
} else {
|
||||
if (*m).stream.error as libc::c_uint != (*m).last_error as libc::c_uint {
|
||||
// suppress repeat error messages
|
||||
if loglevel as libc::c_uint
|
||||
>= crate::squeezelite_h::lDEBUG as libc::c_int as libc::c_uint
|
||||
{
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d mad_frame_decode error: %s\n\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 11], &[libc::c_char; 11]>(
|
||||
b"mad_decode\x00",
|
||||
))
|
||||
.as_ptr(),
|
||||
232 as libc::c_int,
|
||||
(*m).mad_stream_errorstr.expect("non-null function pointer")(
|
||||
&mut (*m).stream,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
ret = crate::squeezelite_h::DECODE_RUNNING
|
||||
}
|
||||
(*m).last_error = (*m).stream.error;
|
||||
return ret;
|
||||
}
|
||||
(*m).mad_synth_frame.expect("non-null function pointer")(&mut (*m).synth, &mut (*m).frame);
|
||||
if decode.new_stream {
|
||||
crate::stdlib::pthread_mutex_lock(&mut (*outputbuf).mutex);
|
||||
if loglevel as libc::c_uint
|
||||
>= crate::squeezelite_h::lINFO as libc::c_int as libc::c_uint
|
||||
{
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d setting track_start\n\x00" as *const u8 as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 11], &[libc::c_char; 11]>(b"mad_decode\x00"))
|
||||
.as_ptr(),
|
||||
244 as libc::c_int,
|
||||
);
|
||||
}
|
||||
output.next_sample_rate = crate::src::decode::decode_newstream(
|
||||
(*m).synth.pcm.samplerate,
|
||||
output.supported_rates.as_mut_ptr(),
|
||||
);
|
||||
output.track_start = (*outputbuf).writep;
|
||||
if output.fade_mode as u64 != 0 {
|
||||
crate::src::output::_checkfade(1 as libc::c_int != 0);
|
||||
}
|
||||
decode.new_stream = 0 as libc::c_int != 0;
|
||||
crate::stdlib::pthread_mutex_unlock(&mut (*outputbuf).mutex);
|
||||
}
|
||||
crate::stdlib::pthread_mutex_lock(&mut (*outputbuf).mutex);
|
||||
max_frames = crate::src::buffer::_buf_space(outputbuf)
|
||||
.wrapping_div(8 as libc::c_int as libc::c_uint);
|
||||
if (*m).synth.pcm.length as libc::c_uint > max_frames {
|
||||
if loglevel as libc::c_uint
|
||||
>= crate::squeezelite_h::lWARN as libc::c_int as libc::c_uint
|
||||
{
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d too many samples - dropping samples\n\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 11], &[libc::c_char; 11]>(b"mad_decode\x00"))
|
||||
.as_ptr(),
|
||||
263 as libc::c_int,
|
||||
);
|
||||
}
|
||||
(*m).synth.pcm.length = max_frames as libc::c_ushort
|
||||
}
|
||||
frames = (*m).synth.pcm.length as crate::stddef_h::size_t;
|
||||
iptrl = (*m).synth.pcm.samples[0 as libc::c_int as usize].as_mut_ptr();
|
||||
iptrr = (*m).synth.pcm.samples
|
||||
[((*m).synth.pcm.channels as libc::c_int - 1 as libc::c_int) as usize]
|
||||
.as_mut_ptr();
|
||||
if (*m).skip != 0 {
|
||||
let mut skip = if ((*m).skip as libc::c_ulong) < frames {
|
||||
(*m).skip as libc::c_ulong
|
||||
} else {
|
||||
frames
|
||||
} as crate::squeezelite_h::u32_t;
|
||||
if loglevel as libc::c_uint
|
||||
>= crate::squeezelite_h::lDEBUG as libc::c_int as libc::c_uint
|
||||
{
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d gapless: skipping %u frames at start\n\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 11], &[libc::c_char; 11]>(b"mad_decode\x00"))
|
||||
.as_ptr(),
|
||||
273 as libc::c_int,
|
||||
skip,
|
||||
);
|
||||
}
|
||||
frames = (frames as libc::c_ulong).wrapping_sub(skip as libc::c_ulong)
|
||||
as crate::stddef_h::size_t as crate::stddef_h::size_t;
|
||||
(*m).skip = ((*m).skip as libc::c_uint).wrapping_sub(skip)
|
||||
as crate::squeezelite_h::u32_t
|
||||
as crate::squeezelite_h::u32_t;
|
||||
iptrl = iptrl.offset(skip as isize);
|
||||
iptrr = iptrr.offset(skip as isize)
|
||||
}
|
||||
if (*m).samples != 0 {
|
||||
if (*m).samples < frames {
|
||||
if loglevel as libc::c_uint
|
||||
>= crate::squeezelite_h::lDEBUG as libc::c_int as libc::c_uint
|
||||
{
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d gapless: trimming %u frames from end\n\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 11], &[libc::c_char; 11]>(
|
||||
b"mad_decode\x00",
|
||||
))
|
||||
.as_ptr(),
|
||||
282 as libc::c_int,
|
||||
frames.wrapping_sub((*m).samples),
|
||||
);
|
||||
}
|
||||
frames = (*m).samples
|
||||
}
|
||||
(*m).samples = ((*m).samples as libc::c_ulong).wrapping_sub(frames)
|
||||
as crate::squeezelite_h::u64_t
|
||||
as crate::squeezelite_h::u64_t;
|
||||
if (*m).samples > 0 as libc::c_int as libc::c_ulong
|
||||
&& eos as libc::c_int != 0
|
||||
&& !(*(*m).stream.next_frame.offset(0 as libc::c_int as isize) as libc::c_int
|
||||
== 0xff as libc::c_int
|
||||
&& *(*m).stream.next_frame.offset(1 as libc::c_int as isize) as libc::c_int
|
||||
& 0xf0 as libc::c_int
|
||||
== 0xf0 as libc::c_int)
|
||||
{
|
||||
// this is the last frame to be decoded, but more samples expected so we must have skipped, remove padding
|
||||
// note this only works if the padding is less than one frame of 1152 bytes otherswise some gap will remain
|
||||
if loglevel as libc::c_uint
|
||||
>= crate::squeezelite_h::lDEBUG as libc::c_int as libc::c_uint
|
||||
{
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d gapless: early end - trimming padding from end\n\x00"
|
||||
as *const u8 as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 11], &[libc::c_char; 11]>(
|
||||
b"mad_decode\x00",
|
||||
))
|
||||
.as_ptr(),
|
||||
289 as libc::c_int,
|
||||
);
|
||||
}
|
||||
if frames >= (*m).padding as libc::c_ulong {
|
||||
frames = (frames as libc::c_ulong).wrapping_sub((*m).padding as libc::c_ulong)
|
||||
as crate::stddef_h::size_t
|
||||
as crate::stddef_h::size_t
|
||||
} else {
|
||||
frames = 0 as libc::c_int as crate::stddef_h::size_t
|
||||
}
|
||||
(*m).samples = 0 as libc::c_int as crate::squeezelite_h::u64_t
|
||||
}
|
||||
}
|
||||
if loglevel as libc::c_uint >= crate::squeezelite_h::lSDEBUG as libc::c_int as libc::c_uint
|
||||
{
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d write %u frames\n\x00" as *const u8 as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 11], &[libc::c_char; 11]>(b"mad_decode\x00"))
|
||||
.as_ptr(),
|
||||
299 as libc::c_int,
|
||||
frames,
|
||||
);
|
||||
}
|
||||
while frames > 0 as libc::c_int as libc::c_ulong {
|
||||
let mut f: crate::stddef_h::size_t = 0;
|
||||
let mut count: crate::stddef_h::size_t = 0;
|
||||
let mut optr = 0 as *mut crate::squeezelite_h::s32_t;
|
||||
f = if frames
|
||||
< crate::src::buffer::_buf_cont_write(outputbuf)
|
||||
.wrapping_div(8 as libc::c_int as libc::c_uint)
|
||||
as libc::c_ulong
|
||||
{
|
||||
frames
|
||||
} else {
|
||||
crate::src::buffer::_buf_cont_write(outputbuf)
|
||||
.wrapping_div(8 as libc::c_int as libc::c_uint) as libc::c_ulong
|
||||
};
|
||||
optr = (*outputbuf).writep as *mut crate::squeezelite_h::s32_t;
|
||||
count = f;
|
||||
loop {
|
||||
let fresh0 = count;
|
||||
count = count.wrapping_sub(1);
|
||||
if !(fresh0 != 0) {
|
||||
break;
|
||||
}
|
||||
let fresh1 = iptrl;
|
||||
iptrl = iptrl.offset(1);
|
||||
let fresh2 = optr;
|
||||
optr = optr.offset(1);
|
||||
*fresh2 = scale(*fresh1) as crate::squeezelite_h::s32_t;
|
||||
let fresh3 = iptrr;
|
||||
iptrr = iptrr.offset(1);
|
||||
let fresh4 = optr;
|
||||
optr = optr.offset(1);
|
||||
*fresh4 = scale(*fresh3) as crate::squeezelite_h::s32_t
|
||||
}
|
||||
frames = (frames as libc::c_ulong).wrapping_sub(f) as crate::stddef_h::size_t
|
||||
as crate::stddef_h::size_t;
|
||||
crate::src::buffer::_buf_inc_writep(
|
||||
outputbuf,
|
||||
f.wrapping_mul(8 as libc::c_int as libc::c_ulong) as libc::c_uint,
|
||||
);
|
||||
}
|
||||
crate::stdlib::pthread_mutex_unlock(&mut (*outputbuf).mutex);
|
||||
}
|
||||
}
|
||||
|
||||
unsafe extern "C" fn mad_open(
|
||||
mut size: crate::squeezelite_h::u8_t,
|
||||
mut rate: crate::squeezelite_h::u8_t,
|
||||
mut chan: crate::squeezelite_h::u8_t,
|
||||
mut endianness: crate::squeezelite_h::u8_t,
|
||||
) {
|
||||
if (*m).readbuf.is_null() {
|
||||
(*m).readbuf =
|
||||
crate::stdlib::malloc((2048 as libc::c_int + 8 as libc::c_int) as libc::c_ulong)
|
||||
as *mut crate::squeezelite_h::u8_t
|
||||
}
|
||||
(*m).checktags = 1 as libc::c_int;
|
||||
(*m).consume = 0 as libc::c_int as crate::squeezelite_h::u32_t;
|
||||
(*m).skip = 529 as libc::c_int as crate::squeezelite_h::u32_t;
|
||||
(*m).samples = 0 as libc::c_int as crate::squeezelite_h::u64_t;
|
||||
(*m).readbuf_len = 0 as libc::c_int as libc::c_uint;
|
||||
(*m).last_error = crate::stdlib::MAD_ERROR_NONE;
|
||||
(*m).mad_stream_init.expect("non-null function pointer")(&mut (*m).stream);
|
||||
(*m).mad_frame_init.expect("non-null function pointer")(&mut (*m).frame);
|
||||
(*m).mad_synth_init.expect("non-null function pointer")(&mut (*m).synth);
|
||||
}
|
||||
|
||||
unsafe extern "C" fn mad_close() {
|
||||
// macro only in current version
|
||||
(*m).mad_frame_finish.expect("non-null function pointer")(&mut (*m).frame);
|
||||
(*m).mad_stream_finish.expect("non-null function pointer")(&mut (*m).stream);
|
||||
crate::stdlib::free((*m).readbuf as *mut libc::c_void);
|
||||
(*m).readbuf = 0 as *mut crate::squeezelite_h::u8_t;
|
||||
}
|
||||
|
||||
unsafe extern "C" fn load_mad() -> bool {
|
||||
let mut handle = crate::stdlib::dlopen(
|
||||
b"libmad.so.0\x00" as *const u8 as *const libc::c_char,
|
||||
0x2 as libc::c_int,
|
||||
);
|
||||
let mut err = 0 as *mut libc::c_char;
|
||||
if handle.is_null() {
|
||||
if loglevel as libc::c_uint >= crate::squeezelite_h::lINFO as libc::c_int as libc::c_uint {
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d dlerror: %s\n\x00" as *const u8 as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 9], &[libc::c_char; 9]>(b"load_mad\x00")).as_ptr(),
|
||||
366 as libc::c_int,
|
||||
crate::stdlib::dlerror(),
|
||||
);
|
||||
}
|
||||
return 0 as libc::c_int != 0;
|
||||
}
|
||||
(*m).mad_stream_init = ::std::mem::transmute::<
|
||||
*mut libc::c_void,
|
||||
Option<unsafe extern "C" fn(_: *mut crate::stdlib::mad_stream) -> ()>,
|
||||
>(crate::stdlib::dlsym(
|
||||
handle,
|
||||
b"mad_stream_init\x00" as *const u8 as *const libc::c_char,
|
||||
));
|
||||
(*m).mad_frame_init = ::std::mem::transmute::<
|
||||
*mut libc::c_void,
|
||||
Option<unsafe extern "C" fn(_: *mut crate::stdlib::mad_frame) -> ()>,
|
||||
>(crate::stdlib::dlsym(
|
||||
handle,
|
||||
b"mad_frame_init\x00" as *const u8 as *const libc::c_char,
|
||||
));
|
||||
(*m).mad_synth_init = ::std::mem::transmute::<
|
||||
*mut libc::c_void,
|
||||
Option<unsafe extern "C" fn(_: *mut crate::stdlib::mad_synth) -> ()>,
|
||||
>(crate::stdlib::dlsym(
|
||||
handle,
|
||||
b"mad_synth_init\x00" as *const u8 as *const libc::c_char,
|
||||
));
|
||||
(*m).mad_frame_finish = ::std::mem::transmute::<
|
||||
*mut libc::c_void,
|
||||
Option<unsafe extern "C" fn(_: *mut crate::stdlib::mad_frame) -> ()>,
|
||||
>(crate::stdlib::dlsym(
|
||||
handle,
|
||||
b"mad_frame_finish\x00" as *const u8 as *const libc::c_char,
|
||||
));
|
||||
(*m).mad_stream_finish = ::std::mem::transmute::<
|
||||
*mut libc::c_void,
|
||||
Option<unsafe extern "C" fn(_: *mut crate::stdlib::mad_stream) -> ()>,
|
||||
>(crate::stdlib::dlsym(
|
||||
handle,
|
||||
b"mad_stream_finish\x00" as *const u8 as *const libc::c_char,
|
||||
));
|
||||
(*m).mad_stream_buffer = ::std::mem::transmute::<
|
||||
*mut libc::c_void,
|
||||
Option<
|
||||
unsafe extern "C" fn(
|
||||
_: *mut crate::stdlib::mad_stream,
|
||||
_: *const libc::c_uchar,
|
||||
_: libc::c_ulong,
|
||||
) -> (),
|
||||
>,
|
||||
>(crate::stdlib::dlsym(
|
||||
handle,
|
||||
b"mad_stream_buffer\x00" as *const u8 as *const libc::c_char,
|
||||
));
|
||||
(*m).mad_frame_decode = ::std::mem::transmute::<
|
||||
*mut libc::c_void,
|
||||
Option<
|
||||
unsafe extern "C" fn(
|
||||
_: *mut crate::stdlib::mad_frame,
|
||||
_: *mut crate::stdlib::mad_stream,
|
||||
) -> libc::c_int,
|
||||
>,
|
||||
>(crate::stdlib::dlsym(
|
||||
handle,
|
||||
b"mad_frame_decode\x00" as *const u8 as *const libc::c_char,
|
||||
));
|
||||
(*m).mad_synth_frame = ::std::mem::transmute::<
|
||||
*mut libc::c_void,
|
||||
Option<
|
||||
unsafe extern "C" fn(
|
||||
_: *mut crate::stdlib::mad_synth,
|
||||
_: *const crate::stdlib::mad_frame,
|
||||
) -> (),
|
||||
>,
|
||||
>(crate::stdlib::dlsym(
|
||||
handle,
|
||||
b"mad_synth_frame\x00" as *const u8 as *const libc::c_char,
|
||||
));
|
||||
(*m).mad_stream_errorstr = ::std::mem::transmute::<
|
||||
*mut libc::c_void,
|
||||
Option<unsafe extern "C" fn(_: *const crate::stdlib::mad_stream) -> *const libc::c_char>,
|
||||
>(crate::stdlib::dlsym(
|
||||
handle,
|
||||
b"mad_stream_errorstr\x00" as *const u8 as *const libc::c_char,
|
||||
));
|
||||
err = crate::stdlib::dlerror();
|
||||
if !err.is_null() {
|
||||
if loglevel as libc::c_uint >= crate::squeezelite_h::lINFO as libc::c_int as libc::c_uint {
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d dlerror: %s\n\x00" as *const u8 as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 9], &[libc::c_char; 9]>(b"load_mad\x00")).as_ptr(),
|
||||
381 as libc::c_int,
|
||||
err,
|
||||
);
|
||||
}
|
||||
return 0 as libc::c_int != 0;
|
||||
}
|
||||
if loglevel as libc::c_uint >= crate::squeezelite_h::lINFO as libc::c_int as libc::c_uint {
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d loaded libmad.so.0\n\x00" as *const u8 as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 9], &[libc::c_char; 9]>(b"load_mad\x00")).as_ptr(),
|
||||
385 as libc::c_int,
|
||||
);
|
||||
}
|
||||
return 1 as libc::c_int != 0;
|
||||
}
|
||||
/*
|
||||
* Squeezelite - lightweight headless squeezebox emulator
|
||||
*
|
||||
* (c) Adrian Smith 2012-2015, triode1@btinternet.com
|
||||
* Ralph Irving 2015-2017, ralph_irving@hotmail.com
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Additions (c) Paul Hermann, 2015-2017 under the same license terms
|
||||
* -Control of Raspberry pi GPIO for amplifier power
|
||||
* -Launch script on power status change from LMS
|
||||
*/
|
||||
// make may define: PORTAUDIO, SELFPIPE, RESAMPLE, RESAMPLE_MP, VISEXPORT, GPIO, IR, DSD, LINKALL to influence build
|
||||
// build detection
|
||||
// dynamically loaded libraries at run time
|
||||
// !LINKALL
|
||||
// config options
|
||||
// do not reduce as icy-meta max is 4080
|
||||
/* SUN */
|
||||
/* SUN */
|
||||
// printf/scanf formats for u64_t
|
||||
// logging
|
||||
// utils.c (non logging)
|
||||
// buffer.c
|
||||
// _* called with mutex locked
|
||||
// slimproto.c
|
||||
// stream.c
|
||||
// decode.c
|
||||
// output.c output_alsa.c output_pa.c output_pack.c
|
||||
// frames played at the point delay is measured
|
||||
// ordered largest first so [0] is max_rate
|
||||
// set in decode thread
|
||||
// set in decode thread
|
||||
// set by slimproto
|
||||
// set by slimproto
|
||||
// set by slimproto
|
||||
// set by slimproto
|
||||
// set by slimproto
|
||||
// set by slimproto
|
||||
// set by slimproto
|
||||
// _* called with mutex locked
|
||||
// output_alsa.c
|
||||
// output_pa.c
|
||||
// output_pulse.c
|
||||
// output_stdout.c
|
||||
// output_pack.c
|
||||
// output_vis.c
|
||||
// dop.c
|
||||
// codecs
|
||||
#[no_mangle]
|
||||
|
||||
pub unsafe extern "C" fn register_mad() -> *mut crate::squeezelite_h::codec {
|
||||
static mut ret: crate::squeezelite_h::codec = unsafe {
|
||||
{
|
||||
let mut init = crate::squeezelite_h::codec {
|
||||
id: 'm' as i32 as libc::c_char,
|
||||
types: b"mp3\x00" as *const u8 as *const libc::c_char as *mut libc::c_char,
|
||||
min_read_bytes: 2048 as libc::c_int as libc::c_uint,
|
||||
min_space: 206800 as libc::c_int as libc::c_uint,
|
||||
open: Some(
|
||||
mad_open
|
||||
as unsafe extern "C" fn(
|
||||
_: crate::squeezelite_h::u8_t,
|
||||
_: crate::squeezelite_h::u8_t,
|
||||
_: crate::squeezelite_h::u8_t,
|
||||
_: crate::squeezelite_h::u8_t,
|
||||
) -> (),
|
||||
),
|
||||
close: Some(mad_close as unsafe extern "C" fn() -> ()),
|
||||
decode: Some(
|
||||
mad_decode as unsafe extern "C" fn() -> crate::squeezelite_h::decode_state,
|
||||
),
|
||||
};
|
||||
init
|
||||
}
|
||||
};
|
||||
m = crate::stdlib::malloc(::std::mem::size_of::<mad>() as libc::c_ulong) as *mut mad;
|
||||
if m.is_null() {
|
||||
return 0 as *mut crate::squeezelite_h::codec;
|
||||
}
|
||||
(*m).readbuf = 0 as *mut crate::squeezelite_h::u8_t;
|
||||
(*m).readbuf_len = 0 as libc::c_int as libc::c_uint;
|
||||
if !load_mad() {
|
||||
return 0 as *mut crate::squeezelite_h::codec;
|
||||
}
|
||||
if loglevel as libc::c_uint >= crate::squeezelite_h::lINFO as libc::c_int as libc::c_uint {
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d using mad to decode mp3\n\x00" as *const u8 as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 13], &[libc::c_char; 13]>(b"register_mad\x00"))
|
||||
.as_ptr(),
|
||||
414 as libc::c_int,
|
||||
);
|
||||
}
|
||||
return &mut ret;
|
||||
}
|
1014
src/main.rs
Normal file
1014
src/main.rs
Normal file
File diff suppressed because it is too large
Load Diff
742
src/mpg.rs
Normal file
742
src/mpg.rs
Normal file
@ -0,0 +1,742 @@
|
||||
use ::libc;
|
||||
|
||||
pub use crate::stddef_h::size_t;
|
||||
|
||||
pub use crate::stdlib::__int16_t;
|
||||
pub use crate::stdlib::__int32_t;
|
||||
pub use crate::stdlib::__pthread_internal_list;
|
||||
pub use crate::stdlib::__pthread_list_t;
|
||||
pub use crate::stdlib::__pthread_mutex_s;
|
||||
pub use crate::stdlib::__uint32_t;
|
||||
pub use crate::stdlib::__uint64_t;
|
||||
pub use crate::stdlib::__uint8_t;
|
||||
pub use crate::stdlib::int16_t;
|
||||
pub use crate::stdlib::int32_t;
|
||||
pub use crate::stdlib::pthread_mutex_t;
|
||||
pub use crate::stdlib::u_int32_t;
|
||||
pub use crate::stdlib::u_int64_t;
|
||||
pub use crate::stdlib::u_int8_t;
|
||||
|
||||
pub use crate::squeezelite_h::buffer;
|
||||
pub use crate::squeezelite_h::codec;
|
||||
pub use crate::squeezelite_h::decode_state;
|
||||
pub use crate::squeezelite_h::decodestate;
|
||||
pub use crate::squeezelite_h::disconnect_code;
|
||||
pub use crate::squeezelite_h::fade_dir;
|
||||
pub use crate::squeezelite_h::fade_mode;
|
||||
pub use crate::squeezelite_h::fade_state;
|
||||
pub use crate::squeezelite_h::frames_t;
|
||||
pub use crate::squeezelite_h::lDEBUG;
|
||||
pub use crate::squeezelite_h::lERROR;
|
||||
pub use crate::squeezelite_h::lINFO;
|
||||
pub use crate::squeezelite_h::lSDEBUG;
|
||||
pub use crate::squeezelite_h::lWARN;
|
||||
pub use crate::squeezelite_h::log_level;
|
||||
pub use crate::squeezelite_h::output_format;
|
||||
pub use crate::squeezelite_h::output_state;
|
||||
pub use crate::squeezelite_h::outputstate;
|
||||
pub use crate::squeezelite_h::s16_t;
|
||||
pub use crate::squeezelite_h::s32_t;
|
||||
pub use crate::squeezelite_h::stream_state;
|
||||
pub use crate::squeezelite_h::streamstate;
|
||||
pub use crate::squeezelite_h::u32_t;
|
||||
pub use crate::squeezelite_h::u64_t;
|
||||
pub use crate::squeezelite_h::u8_t;
|
||||
pub use crate::squeezelite_h::C2RustUnnamed_1;
|
||||
pub use crate::squeezelite_h::_buf_used;
|
||||
pub use crate::squeezelite_h::DECODE_COMPLETE;
|
||||
pub use crate::squeezelite_h::DECODE_ERROR;
|
||||
pub use crate::squeezelite_h::DECODE_READY;
|
||||
pub use crate::squeezelite_h::DECODE_RUNNING;
|
||||
pub use crate::squeezelite_h::DECODE_STOPPED;
|
||||
pub use crate::squeezelite_h::DISCONNECT;
|
||||
pub use crate::squeezelite_h::DISCONNECT_OK;
|
||||
pub use crate::squeezelite_h::FADE_ACTIVE;
|
||||
pub use crate::squeezelite_h::FADE_CROSS;
|
||||
pub use crate::squeezelite_h::FADE_CROSSFADE;
|
||||
pub use crate::squeezelite_h::FADE_DOWN;
|
||||
pub use crate::squeezelite_h::FADE_DUE;
|
||||
pub use crate::squeezelite_h::FADE_IN;
|
||||
pub use crate::squeezelite_h::FADE_INACTIVE;
|
||||
pub use crate::squeezelite_h::FADE_INOUT;
|
||||
pub use crate::squeezelite_h::FADE_NONE;
|
||||
pub use crate::squeezelite_h::FADE_OUT;
|
||||
pub use crate::squeezelite_h::FADE_UP;
|
||||
pub use crate::squeezelite_h::LOCAL_DISCONNECT;
|
||||
pub use crate::squeezelite_h::OUTPUT_BUFFER;
|
||||
pub use crate::squeezelite_h::OUTPUT_OFF;
|
||||
pub use crate::squeezelite_h::OUTPUT_PAUSE_FRAMES;
|
||||
pub use crate::squeezelite_h::OUTPUT_RUNNING;
|
||||
pub use crate::squeezelite_h::OUTPUT_SKIP_FRAMES;
|
||||
pub use crate::squeezelite_h::OUTPUT_START_AT;
|
||||
pub use crate::squeezelite_h::OUTPUT_STOPPED;
|
||||
pub use crate::squeezelite_h::RECV_HEADERS;
|
||||
pub use crate::squeezelite_h::REMOTE_DISCONNECT;
|
||||
pub use crate::squeezelite_h::S16_LE;
|
||||
pub use crate::squeezelite_h::S24_3LE;
|
||||
pub use crate::squeezelite_h::S24_LE;
|
||||
pub use crate::squeezelite_h::S32_LE;
|
||||
pub use crate::squeezelite_h::SEND_HEADERS;
|
||||
pub use crate::squeezelite_h::STOPPED;
|
||||
pub use crate::squeezelite_h::STREAMING_BUFFERING;
|
||||
pub use crate::squeezelite_h::STREAMING_FILE;
|
||||
pub use crate::squeezelite_h::STREAMING_HTTP;
|
||||
pub use crate::squeezelite_h::STREAMING_WAIT;
|
||||
pub use crate::squeezelite_h::TIMEOUT;
|
||||
pub use crate::squeezelite_h::UNREACHABLE;
|
||||
pub use crate::src::buffer::_buf_cont_read;
|
||||
pub use crate::src::buffer::_buf_cont_write;
|
||||
pub use crate::src::buffer::_buf_inc_readp;
|
||||
pub use crate::src::buffer::_buf_inc_writep;
|
||||
pub use crate::src::buffer::_buf_space;
|
||||
pub use crate::src::decode::decode_newstream;
|
||||
pub use crate::src::output::_checkfade;
|
||||
pub use crate::src::utils::logprint;
|
||||
pub use crate::src::utils::logtime;
|
||||
use crate::stdlib::malloc;
|
||||
pub use crate::stdlib::mpg123_enc_enum;
|
||||
pub use crate::stdlib::mpg123_errors;
|
||||
pub use crate::stdlib::mpg123_feature_set;
|
||||
pub use crate::stdlib::mpg123_handle;
|
||||
pub use crate::stdlib::mpg123_handle_struct;
|
||||
pub use crate::stdlib::MPG123_BAD_ALIGN;
|
||||
pub use crate::stdlib::MPG123_BAD_BAND;
|
||||
pub use crate::stdlib::MPG123_BAD_BUFFER;
|
||||
pub use crate::stdlib::MPG123_BAD_CHANNEL;
|
||||
pub use crate::stdlib::MPG123_BAD_CUSTOM_IO;
|
||||
pub use crate::stdlib::MPG123_BAD_DECODER;
|
||||
pub use crate::stdlib::MPG123_BAD_DECODER_SETUP;
|
||||
pub use crate::stdlib::MPG123_BAD_FILE;
|
||||
pub use crate::stdlib::MPG123_BAD_HANDLE;
|
||||
pub use crate::stdlib::MPG123_BAD_INDEX_PAR;
|
||||
pub use crate::stdlib::MPG123_BAD_KEY;
|
||||
pub use crate::stdlib::MPG123_BAD_OUTFORMAT;
|
||||
pub use crate::stdlib::MPG123_BAD_PARAM;
|
||||
pub use crate::stdlib::MPG123_BAD_PARS;
|
||||
pub use crate::stdlib::MPG123_BAD_RATE;
|
||||
pub use crate::stdlib::MPG123_BAD_RVA;
|
||||
pub use crate::stdlib::MPG123_BAD_TYPES;
|
||||
pub use crate::stdlib::MPG123_BAD_VALUE;
|
||||
pub use crate::stdlib::MPG123_BAD_WHENCE;
|
||||
pub use crate::stdlib::MPG123_DONE;
|
||||
pub use crate::stdlib::MPG123_ENC_16;
|
||||
pub use crate::stdlib::MPG123_ENC_24;
|
||||
pub use crate::stdlib::MPG123_ENC_32;
|
||||
pub use crate::stdlib::MPG123_ENC_8;
|
||||
pub use crate::stdlib::MPG123_ENC_ALAW_8;
|
||||
pub use crate::stdlib::MPG123_ENC_ANY;
|
||||
pub use crate::stdlib::MPG123_ENC_FLOAT;
|
||||
pub use crate::stdlib::MPG123_ENC_FLOAT_32;
|
||||
pub use crate::stdlib::MPG123_ENC_FLOAT_64;
|
||||
pub use crate::stdlib::MPG123_ENC_SIGNED;
|
||||
pub use crate::stdlib::MPG123_ENC_SIGNED_16;
|
||||
pub use crate::stdlib::MPG123_ENC_SIGNED_24;
|
||||
pub use crate::stdlib::MPG123_ENC_SIGNED_32;
|
||||
pub use crate::stdlib::MPG123_ENC_SIGNED_8;
|
||||
pub use crate::stdlib::MPG123_ENC_ULAW_8;
|
||||
pub use crate::stdlib::MPG123_ENC_UNSIGNED_16;
|
||||
pub use crate::stdlib::MPG123_ENC_UNSIGNED_24;
|
||||
pub use crate::stdlib::MPG123_ENC_UNSIGNED_32;
|
||||
pub use crate::stdlib::MPG123_ENC_UNSIGNED_8;
|
||||
pub use crate::stdlib::MPG123_ERR;
|
||||
pub use crate::stdlib::MPG123_ERR_16TO8TABLE;
|
||||
pub use crate::stdlib::MPG123_ERR_NULL;
|
||||
pub use crate::stdlib::MPG123_ERR_READER;
|
||||
pub use crate::stdlib::MPG123_FEATURE_ABI_UTF8OPEN;
|
||||
pub use crate::stdlib::MPG123_FEATURE_DECODE_ACCURATE;
|
||||
pub use crate::stdlib::MPG123_FEATURE_DECODE_DOWNSAMPLE;
|
||||
pub use crate::stdlib::MPG123_FEATURE_DECODE_LAYER1;
|
||||
pub use crate::stdlib::MPG123_FEATURE_DECODE_LAYER2;
|
||||
pub use crate::stdlib::MPG123_FEATURE_DECODE_LAYER3;
|
||||
pub use crate::stdlib::MPG123_FEATURE_DECODE_NTOM;
|
||||
pub use crate::stdlib::MPG123_FEATURE_EQUALIZER;
|
||||
pub use crate::stdlib::MPG123_FEATURE_INDEX;
|
||||
pub use crate::stdlib::MPG123_FEATURE_OUTPUT_16BIT;
|
||||
pub use crate::stdlib::MPG123_FEATURE_OUTPUT_32BIT;
|
||||
pub use crate::stdlib::MPG123_FEATURE_OUTPUT_8BIT;
|
||||
pub use crate::stdlib::MPG123_FEATURE_PARSE_ICY;
|
||||
pub use crate::stdlib::MPG123_FEATURE_PARSE_ID3V2;
|
||||
pub use crate::stdlib::MPG123_FEATURE_TIMEOUT_READ;
|
||||
pub use crate::stdlib::MPG123_INDEX_FAIL;
|
||||
pub use crate::stdlib::MPG123_INT_OVERFLOW;
|
||||
pub use crate::stdlib::MPG123_LFS_OVERFLOW;
|
||||
pub use crate::stdlib::MPG123_LSEEK_FAILED;
|
||||
pub use crate::stdlib::MPG123_MISSING_FEATURE;
|
||||
pub use crate::stdlib::MPG123_NEED_MORE;
|
||||
pub use crate::stdlib::MPG123_NEW_FORMAT;
|
||||
pub use crate::stdlib::MPG123_NOT_INITIALIZED;
|
||||
pub use crate::stdlib::MPG123_NO_8BIT;
|
||||
pub use crate::stdlib::MPG123_NO_BUFFERS;
|
||||
pub use crate::stdlib::MPG123_NO_GAPLESS;
|
||||
pub use crate::stdlib::MPG123_NO_INDEX;
|
||||
pub use crate::stdlib::MPG123_NO_READER;
|
||||
pub use crate::stdlib::MPG123_NO_RELSEEK;
|
||||
pub use crate::stdlib::MPG123_NO_SEEK;
|
||||
pub use crate::stdlib::MPG123_NO_SEEK_FROM_END;
|
||||
pub use crate::stdlib::MPG123_NO_SPACE;
|
||||
pub use crate::stdlib::MPG123_NO_TIMEOUT;
|
||||
pub use crate::stdlib::MPG123_NULL_BUFFER;
|
||||
pub use crate::stdlib::MPG123_NULL_POINTER;
|
||||
pub use crate::stdlib::MPG123_OK;
|
||||
pub use crate::stdlib::MPG123_OUT_OF_MEM;
|
||||
pub use crate::stdlib::MPG123_OUT_OF_SYNC;
|
||||
pub use crate::stdlib::MPG123_RESYNC_FAIL;
|
||||
|
||||
use crate::stdlib::dlerror;
|
||||
use crate::stdlib::dlopen;
|
||||
use crate::stdlib::dlsym;
|
||||
use crate::stdlib::pthread_mutex_lock;
|
||||
use crate::stdlib::pthread_mutex_unlock;
|
||||
extern "C" {
|
||||
#[no_mangle]
|
||||
pub static mut loglevel: crate::squeezelite_h::log_level;
|
||||
#[no_mangle]
|
||||
pub static mut streambuf: *mut crate::squeezelite_h::buffer;
|
||||
#[no_mangle]
|
||||
pub static mut outputbuf: *mut crate::squeezelite_h::buffer;
|
||||
#[no_mangle]
|
||||
pub static mut stream: crate::squeezelite_h::streamstate;
|
||||
#[no_mangle]
|
||||
pub static mut output: crate::squeezelite_h::outputstate;
|
||||
#[no_mangle]
|
||||
pub static mut decode: crate::squeezelite_h::decodestate;
|
||||
}
|
||||
|
||||
#[repr(C)]
|
||||
#[derive(Copy, Clone)]
|
||||
pub struct mpg {
|
||||
pub h: *mut crate::stdlib::mpg123_handle,
|
||||
pub use16bit: bool,
|
||||
pub mpg123_init: Option<unsafe extern "C" fn() -> libc::c_int>,
|
||||
pub mpg123_feature:
|
||||
Option<unsafe extern "C" fn(_: crate::stdlib::mpg123_feature_set) -> libc::c_int>,
|
||||
pub mpg123_rates: Option<
|
||||
unsafe extern "C" fn(_: *mut *const libc::c_long, _: *mut crate::stddef_h::size_t) -> (),
|
||||
>,
|
||||
pub mpg123_format_none:
|
||||
Option<unsafe extern "C" fn(_: *mut crate::stdlib::mpg123_handle) -> libc::c_int>,
|
||||
pub mpg123_format: Option<
|
||||
unsafe extern "C" fn(
|
||||
_: *mut crate::stdlib::mpg123_handle,
|
||||
_: libc::c_long,
|
||||
_: libc::c_int,
|
||||
_: libc::c_int,
|
||||
) -> libc::c_int,
|
||||
>,
|
||||
pub mpg123_new: Option<
|
||||
unsafe extern "C" fn(
|
||||
_: *const libc::c_char,
|
||||
_: *mut libc::c_int,
|
||||
) -> *mut crate::stdlib::mpg123_handle,
|
||||
>,
|
||||
pub mpg123_delete: Option<unsafe extern "C" fn(_: *mut crate::stdlib::mpg123_handle) -> ()>,
|
||||
pub mpg123_open_feed:
|
||||
Option<unsafe extern "C" fn(_: *mut crate::stdlib::mpg123_handle) -> libc::c_int>,
|
||||
pub mpg123_decode: Option<
|
||||
unsafe extern "C" fn(
|
||||
_: *mut crate::stdlib::mpg123_handle,
|
||||
_: *const libc::c_uchar,
|
||||
_: crate::stddef_h::size_t,
|
||||
_: *mut libc::c_uchar,
|
||||
_: crate::stddef_h::size_t,
|
||||
_: *mut crate::stddef_h::size_t,
|
||||
) -> libc::c_int,
|
||||
>,
|
||||
pub mpg123_getformat: Option<
|
||||
unsafe extern "C" fn(
|
||||
_: *mut crate::stdlib::mpg123_handle,
|
||||
_: *mut libc::c_long,
|
||||
_: *mut libc::c_int,
|
||||
_: *mut libc::c_int,
|
||||
) -> libc::c_int,
|
||||
>,
|
||||
pub mpg123_plain_strerror: Option<unsafe extern "C" fn(_: libc::c_int) -> *const libc::c_char>,
|
||||
}
|
||||
|
||||
static mut m: *mut mpg = 0 as *const mpg as *mut mpg;
|
||||
|
||||
unsafe extern "C" fn mpg_decode() -> crate::squeezelite_h::decode_state {
|
||||
let mut bytes: crate::stddef_h::size_t = 0;
|
||||
let mut space: crate::stddef_h::size_t = 0;
|
||||
let mut size: crate::stddef_h::size_t = 0;
|
||||
let mut ret: libc::c_int = 0;
|
||||
let mut write_buf = 0 as *mut crate::squeezelite_h::u8_t;
|
||||
crate::stdlib::pthread_mutex_lock(&mut (*streambuf).mutex);
|
||||
crate::stdlib::pthread_mutex_lock(&mut (*outputbuf).mutex);
|
||||
bytes = if crate::squeezelite_h::_buf_used(streambuf)
|
||||
< crate::src::buffer::_buf_cont_read(streambuf)
|
||||
{
|
||||
crate::squeezelite_h::_buf_used(streambuf)
|
||||
} else {
|
||||
crate::src::buffer::_buf_cont_read(streambuf)
|
||||
} as crate::stddef_h::size_t;
|
||||
space = if crate::src::buffer::_buf_space(outputbuf)
|
||||
< crate::src::buffer::_buf_cont_write(outputbuf)
|
||||
{
|
||||
crate::src::buffer::_buf_space(outputbuf)
|
||||
} else {
|
||||
crate::src::buffer::_buf_cont_write(outputbuf)
|
||||
} as crate::stddef_h::size_t;
|
||||
write_buf = (*outputbuf).writep;
|
||||
bytes = if bytes < 512 as libc::c_int as libc::c_ulong {
|
||||
bytes
|
||||
} else {
|
||||
512 as libc::c_int as libc::c_ulong
|
||||
};
|
||||
space = if space < (32 as libc::c_int * 1024 as libc::c_int) as libc::c_ulong {
|
||||
space
|
||||
} else {
|
||||
(32 as libc::c_int * 1024 as libc::c_int) as libc::c_ulong
|
||||
};
|
||||
if (*m).use16bit {
|
||||
space = space
|
||||
.wrapping_div(8 as libc::c_int as libc::c_ulong)
|
||||
.wrapping_mul(4 as libc::c_int as libc::c_ulong)
|
||||
}
|
||||
// only get the new stream information on first call so we can reset decode.direct appropriately
|
||||
if decode.new_stream {
|
||||
space = 0 as libc::c_int as crate::stddef_h::size_t
|
||||
}
|
||||
ret = (*m).mpg123_decode.expect("non-null function pointer")(
|
||||
(*m).h,
|
||||
(*streambuf).readp,
|
||||
bytes,
|
||||
write_buf,
|
||||
space,
|
||||
&mut size,
|
||||
);
|
||||
if ret == crate::stdlib::MPG123_NEW_FORMAT as libc::c_int {
|
||||
if decode.new_stream {
|
||||
let mut rate: libc::c_long = 0;
|
||||
let mut channels: libc::c_int = 0;
|
||||
let mut enc: libc::c_int = 0;
|
||||
(*m).mpg123_getformat.expect("non-null function pointer")(
|
||||
(*m).h,
|
||||
&mut rate,
|
||||
&mut channels,
|
||||
&mut enc,
|
||||
);
|
||||
if loglevel as libc::c_uint
|
||||
>= crate::squeezelite_h::lINFO as libc::c_int as libc::c_uint
|
||||
{
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d setting track_start\n\x00" as *const u8 as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 11], &[libc::c_char; 11]>(b"mpg_decode\x00"))
|
||||
.as_ptr(),
|
||||
125 as libc::c_int,
|
||||
);
|
||||
}
|
||||
output.next_sample_rate = crate::src::decode::decode_newstream(
|
||||
rate as libc::c_uint,
|
||||
output.supported_rates.as_mut_ptr(),
|
||||
);
|
||||
output.track_start = (*outputbuf).writep;
|
||||
if output.fade_mode as u64 != 0 {
|
||||
crate::src::output::_checkfade(1 as libc::c_int != 0);
|
||||
}
|
||||
decode.new_stream = 0 as libc::c_int != 0
|
||||
} else if loglevel as libc::c_uint
|
||||
>= crate::squeezelite_h::lWARN as libc::c_int as libc::c_uint
|
||||
{
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d format change mid stream - not supported\n\x00" as *const u8
|
||||
as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 11], &[libc::c_char; 11]>(b"mpg_decode\x00"))
|
||||
.as_ptr(),
|
||||
135 as libc::c_int,
|
||||
);
|
||||
}
|
||||
}
|
||||
// expand 16bit output to 32bit samples
|
||||
if (*m).use16bit {
|
||||
let mut iptr = 0 as *mut crate::squeezelite_h::s16_t;
|
||||
let mut optr = 0 as *mut crate::squeezelite_h::s32_t;
|
||||
let mut count = size.wrapping_div(2 as libc::c_int as libc::c_ulong);
|
||||
size = count.wrapping_mul(4 as libc::c_int as libc::c_ulong);
|
||||
iptr = (write_buf as *mut crate::squeezelite_h::s16_t).offset(count as isize);
|
||||
optr = (write_buf as *mut crate::squeezelite_h::s32_t).offset(count as isize);
|
||||
loop {
|
||||
let fresh0 = count;
|
||||
count = count.wrapping_sub(1);
|
||||
if !(fresh0 != 0) {
|
||||
break;
|
||||
}
|
||||
iptr = iptr.offset(-1);
|
||||
optr = optr.offset(-1);
|
||||
*optr = (*iptr as libc::c_int) << 16 as libc::c_int
|
||||
}
|
||||
}
|
||||
crate::src::buffer::_buf_inc_readp(streambuf, bytes as libc::c_uint);
|
||||
crate::src::buffer::_buf_inc_writep(outputbuf, size as libc::c_uint);
|
||||
crate::stdlib::pthread_mutex_unlock(&mut (*outputbuf).mutex);
|
||||
if loglevel as libc::c_uint >= crate::squeezelite_h::lSDEBUG as libc::c_int as libc::c_uint {
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d write %u frames\n\x00" as *const u8 as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 11], &[libc::c_char; 11]>(b"mpg_decode\x00")).as_ptr(),
|
||||
163 as libc::c_int,
|
||||
size.wrapping_div(8 as libc::c_int as libc::c_ulong),
|
||||
);
|
||||
}
|
||||
if ret == crate::stdlib::MPG123_DONE as libc::c_int
|
||||
|| bytes == 0 as libc::c_int as libc::c_ulong
|
||||
&& size == 0 as libc::c_int as libc::c_ulong
|
||||
&& stream.state as libc::c_uint
|
||||
<= crate::squeezelite_h::DISCONNECT as libc::c_int as libc::c_uint
|
||||
{
|
||||
crate::stdlib::pthread_mutex_unlock(&mut (*streambuf).mutex);
|
||||
if loglevel as libc::c_uint >= crate::squeezelite_h::lINFO as libc::c_int as libc::c_uint {
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d stream complete\n\x00" as *const u8 as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 11], &[libc::c_char; 11]>(b"mpg_decode\x00"))
|
||||
.as_ptr(),
|
||||
167 as libc::c_int,
|
||||
);
|
||||
}
|
||||
return crate::squeezelite_h::DECODE_COMPLETE;
|
||||
}
|
||||
crate::stdlib::pthread_mutex_unlock(&mut (*streambuf).mutex);
|
||||
if ret == crate::stdlib::MPG123_ERR as libc::c_int {
|
||||
if loglevel as libc::c_uint >= crate::squeezelite_h::lWARN as libc::c_int as libc::c_uint {
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d Error\n\x00" as *const u8 as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 11], &[libc::c_char; 11]>(b"mpg_decode\x00"))
|
||||
.as_ptr(),
|
||||
174 as libc::c_int,
|
||||
);
|
||||
}
|
||||
return crate::squeezelite_h::DECODE_COMPLETE;
|
||||
}
|
||||
// OK and NEED_MORE keep running
|
||||
return crate::squeezelite_h::DECODE_RUNNING;
|
||||
}
|
||||
|
||||
unsafe extern "C" fn mpg_open(
|
||||
mut size: crate::squeezelite_h::u8_t,
|
||||
mut rate: crate::squeezelite_h::u8_t,
|
||||
mut chan: crate::squeezelite_h::u8_t,
|
||||
mut endianness: crate::squeezelite_h::u8_t,
|
||||
) {
|
||||
let mut err: libc::c_int = 0;
|
||||
let mut list = 0 as *const libc::c_long;
|
||||
let mut count: crate::stddef_h::size_t = 0;
|
||||
let mut i: crate::stddef_h::size_t = 0;
|
||||
if !(*m).h.is_null() {
|
||||
(*m).mpg123_delete.expect("non-null function pointer")((*m).h);
|
||||
}
|
||||
(*m).h =
|
||||
(*m).mpg123_new.expect("non-null function pointer")(0 as *const libc::c_char, &mut err);
|
||||
if (*m).h.is_null() {
|
||||
if loglevel as libc::c_uint >= crate::squeezelite_h::lWARN as libc::c_int as libc::c_uint {
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d new error: %s\n\x00" as *const u8 as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 9], &[libc::c_char; 9]>(b"mpg_open\x00")).as_ptr(),
|
||||
194 as libc::c_int,
|
||||
(*m).mpg123_plain_strerror
|
||||
.expect("non-null function pointer")(err),
|
||||
);
|
||||
}
|
||||
}
|
||||
// restrict output to 32bit or 16bit signed 2 channel based on library capability
|
||||
(*m).mpg123_rates.expect("non-null function pointer")(&mut list, &mut count);
|
||||
(*m).mpg123_format_none.expect("non-null function pointer")((*m).h);
|
||||
i = 0 as libc::c_int as crate::stddef_h::size_t;
|
||||
while i < count {
|
||||
(*m).mpg123_format.expect("non-null function pointer")(
|
||||
(*m).h,
|
||||
*list.offset(i as isize),
|
||||
2 as libc::c_int,
|
||||
if (*m).use16bit as libc::c_int != 0 {
|
||||
crate::stdlib::MPG123_ENC_SIGNED_16 as libc::c_int
|
||||
} else {
|
||||
crate::stdlib::MPG123_ENC_SIGNED_32 as libc::c_int
|
||||
},
|
||||
);
|
||||
i = i.wrapping_add(1)
|
||||
}
|
||||
err = (*m).mpg123_open_feed.expect("non-null function pointer")((*m).h);
|
||||
if err != 0 {
|
||||
if loglevel as libc::c_uint >= crate::squeezelite_h::lWARN as libc::c_int as libc::c_uint {
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d open feed error: %s\n\x00" as *const u8 as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 9], &[libc::c_char; 9]>(b"mpg_open\x00")).as_ptr(),
|
||||
207 as libc::c_int,
|
||||
(*m).mpg123_plain_strerror
|
||||
.expect("non-null function pointer")(err),
|
||||
);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
unsafe extern "C" fn mpg_close() {
|
||||
(*m).mpg123_delete.expect("non-null function pointer")((*m).h);
|
||||
(*m).h = 0 as *mut crate::stdlib::mpg123_handle;
|
||||
}
|
||||
|
||||
unsafe extern "C" fn load_mpg() -> bool {
|
||||
let mut handle = crate::stdlib::dlopen(
|
||||
b"libmpg123.so.0\x00" as *const u8 as *const libc::c_char,
|
||||
0x2 as libc::c_int,
|
||||
);
|
||||
let mut err = 0 as *mut libc::c_char;
|
||||
if handle.is_null() {
|
||||
if loglevel as libc::c_uint >= crate::squeezelite_h::lINFO as libc::c_int as libc::c_uint {
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d dlerror: %s\n\x00" as *const u8 as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 9], &[libc::c_char; 9]>(b"load_mpg\x00")).as_ptr(),
|
||||
222 as libc::c_int,
|
||||
crate::stdlib::dlerror(),
|
||||
);
|
||||
}
|
||||
return 0 as libc::c_int != 0;
|
||||
}
|
||||
(*m).mpg123_init = ::std::mem::transmute::<
|
||||
*mut libc::c_void,
|
||||
Option<unsafe extern "C" fn() -> libc::c_int>,
|
||||
>(crate::stdlib::dlsym(
|
||||
handle,
|
||||
b"mpg123_init\x00" as *const u8 as *const libc::c_char,
|
||||
));
|
||||
(*m).mpg123_feature = ::std::mem::transmute::<
|
||||
*mut libc::c_void,
|
||||
Option<unsafe extern "C" fn(_: crate::stdlib::mpg123_feature_set) -> libc::c_int>,
|
||||
>(crate::stdlib::dlsym(
|
||||
handle,
|
||||
b"mpg123_feature\x00" as *const u8 as *const libc::c_char,
|
||||
));
|
||||
(*m).mpg123_rates = ::std::mem::transmute::<
|
||||
*mut libc::c_void,
|
||||
Option<
|
||||
unsafe extern "C" fn(
|
||||
_: *mut *const libc::c_long,
|
||||
_: *mut crate::stddef_h::size_t,
|
||||
) -> (),
|
||||
>,
|
||||
>(crate::stdlib::dlsym(
|
||||
handle,
|
||||
b"mpg123_rates\x00" as *const u8 as *const libc::c_char,
|
||||
));
|
||||
(*m).mpg123_format_none = ::std::mem::transmute::<
|
||||
*mut libc::c_void,
|
||||
Option<unsafe extern "C" fn(_: *mut crate::stdlib::mpg123_handle) -> libc::c_int>,
|
||||
>(crate::stdlib::dlsym(
|
||||
handle,
|
||||
b"mpg123_format_none\x00" as *const u8 as *const libc::c_char,
|
||||
));
|
||||
(*m).mpg123_format = ::std::mem::transmute::<
|
||||
*mut libc::c_void,
|
||||
Option<
|
||||
unsafe extern "C" fn(
|
||||
_: *mut crate::stdlib::mpg123_handle,
|
||||
_: libc::c_long,
|
||||
_: libc::c_int,
|
||||
_: libc::c_int,
|
||||
) -> libc::c_int,
|
||||
>,
|
||||
>(crate::stdlib::dlsym(
|
||||
handle,
|
||||
b"mpg123_format\x00" as *const u8 as *const libc::c_char,
|
||||
));
|
||||
(*m).mpg123_new = ::std::mem::transmute::<
|
||||
*mut libc::c_void,
|
||||
Option<
|
||||
unsafe extern "C" fn(
|
||||
_: *const libc::c_char,
|
||||
_: *mut libc::c_int,
|
||||
) -> *mut crate::stdlib::mpg123_handle,
|
||||
>,
|
||||
>(crate::stdlib::dlsym(
|
||||
handle,
|
||||
b"mpg123_new\x00" as *const u8 as *const libc::c_char,
|
||||
));
|
||||
(*m).mpg123_delete = ::std::mem::transmute::<
|
||||
*mut libc::c_void,
|
||||
Option<unsafe extern "C" fn(_: *mut crate::stdlib::mpg123_handle) -> ()>,
|
||||
>(crate::stdlib::dlsym(
|
||||
handle,
|
||||
b"mpg123_delete\x00" as *const u8 as *const libc::c_char,
|
||||
));
|
||||
(*m).mpg123_open_feed = ::std::mem::transmute::<
|
||||
*mut libc::c_void,
|
||||
Option<unsafe extern "C" fn(_: *mut crate::stdlib::mpg123_handle) -> libc::c_int>,
|
||||
>(crate::stdlib::dlsym(
|
||||
handle,
|
||||
b"mpg123_open_feed\x00" as *const u8 as *const libc::c_char,
|
||||
));
|
||||
(*m).mpg123_decode = ::std::mem::transmute::<
|
||||
*mut libc::c_void,
|
||||
Option<
|
||||
unsafe extern "C" fn(
|
||||
_: *mut crate::stdlib::mpg123_handle,
|
||||
_: *const libc::c_uchar,
|
||||
_: crate::stddef_h::size_t,
|
||||
_: *mut libc::c_uchar,
|
||||
_: crate::stddef_h::size_t,
|
||||
_: *mut crate::stddef_h::size_t,
|
||||
) -> libc::c_int,
|
||||
>,
|
||||
>(crate::stdlib::dlsym(
|
||||
handle,
|
||||
b"mpg123_decode\x00" as *const u8 as *const libc::c_char,
|
||||
));
|
||||
(*m).mpg123_getformat = ::std::mem::transmute::<
|
||||
*mut libc::c_void,
|
||||
Option<
|
||||
unsafe extern "C" fn(
|
||||
_: *mut crate::stdlib::mpg123_handle,
|
||||
_: *mut libc::c_long,
|
||||
_: *mut libc::c_int,
|
||||
_: *mut libc::c_int,
|
||||
) -> libc::c_int,
|
||||
>,
|
||||
>(crate::stdlib::dlsym(
|
||||
handle,
|
||||
b"mpg123_getformat\x00" as *const u8 as *const libc::c_char,
|
||||
));
|
||||
(*m).mpg123_plain_strerror = ::std::mem::transmute::<
|
||||
*mut libc::c_void,
|
||||
Option<unsafe extern "C" fn(_: libc::c_int) -> *const libc::c_char>,
|
||||
>(crate::stdlib::dlsym(
|
||||
handle,
|
||||
b"mpg123_plain_strerror\x00" as *const u8 as *const libc::c_char,
|
||||
));
|
||||
err = crate::stdlib::dlerror();
|
||||
if !err.is_null() {
|
||||
if loglevel as libc::c_uint >= crate::squeezelite_h::lINFO as libc::c_int as libc::c_uint {
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d dlerror: %s\n\x00" as *const u8 as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 9], &[libc::c_char; 9]>(b"load_mpg\x00")).as_ptr(),
|
||||
239 as libc::c_int,
|
||||
err,
|
||||
);
|
||||
}
|
||||
return 0 as libc::c_int != 0;
|
||||
}
|
||||
if loglevel as libc::c_uint >= crate::squeezelite_h::lINFO as libc::c_int as libc::c_uint {
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d loaded libmpg123.so.0\n\x00" as *const u8 as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 9], &[libc::c_char; 9]>(b"load_mpg\x00")).as_ptr(),
|
||||
243 as libc::c_int,
|
||||
);
|
||||
}
|
||||
return 1 as libc::c_int != 0;
|
||||
}
|
||||
/*
|
||||
* Squeezelite - lightweight headless squeezebox emulator
|
||||
*
|
||||
* (c) Adrian Smith 2012-2015, triode1@btinternet.com
|
||||
* Ralph Irving 2015-2017, ralph_irving@hotmail.com
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Additions (c) Paul Hermann, 2015-2017 under the same license terms
|
||||
* -Control of Raspberry pi GPIO for amplifier power
|
||||
* -Launch script on power status change from LMS
|
||||
*/
|
||||
// make may define: PORTAUDIO, SELFPIPE, RESAMPLE, RESAMPLE_MP, VISEXPORT, GPIO, IR, DSD, LINKALL to influence build
|
||||
// build detection
|
||||
// dynamically loaded libraries at run time
|
||||
// !LINKALL
|
||||
// config options
|
||||
// do not reduce as icy-meta max is 4080
|
||||
/* SUN */
|
||||
/* SUN */
|
||||
// printf/scanf formats for u64_t
|
||||
// logging
|
||||
// utils.c (non logging)
|
||||
// buffer.c
|
||||
// _* called with mutex locked
|
||||
// slimproto.c
|
||||
// stream.c
|
||||
// decode.c
|
||||
// output.c output_alsa.c output_pa.c output_pack.c
|
||||
// frames played at the point delay is measured
|
||||
// ordered largest first so [0] is max_rate
|
||||
// set in decode thread
|
||||
// set in decode thread
|
||||
// set by slimproto
|
||||
// set by slimproto
|
||||
// set by slimproto
|
||||
// set by slimproto
|
||||
// set by slimproto
|
||||
// set by slimproto
|
||||
// set by slimproto
|
||||
// _* called with mutex locked
|
||||
// output_alsa.c
|
||||
// output_pa.c
|
||||
// output_pulse.c
|
||||
// output_stdout.c
|
||||
// output_pack.c
|
||||
// output_vis.c
|
||||
// dop.c
|
||||
// codecs
|
||||
#[no_mangle]
|
||||
|
||||
pub unsafe extern "C" fn register_mpg() -> *mut crate::squeezelite_h::codec {
|
||||
static mut ret: crate::squeezelite_h::codec = unsafe {
|
||||
{
|
||||
let mut init = crate::squeezelite_h::codec {
|
||||
id: 'm' as i32 as libc::c_char,
|
||||
types: b"mp3\x00" as *const u8 as *const libc::c_char as *mut libc::c_char,
|
||||
min_read_bytes: 512 as libc::c_int as libc::c_uint,
|
||||
min_space: (32 as libc::c_int * 1024 as libc::c_int) as libc::c_uint,
|
||||
open: Some(
|
||||
mpg_open
|
||||
as unsafe extern "C" fn(
|
||||
_: crate::squeezelite_h::u8_t,
|
||||
_: crate::squeezelite_h::u8_t,
|
||||
_: crate::squeezelite_h::u8_t,
|
||||
_: crate::squeezelite_h::u8_t,
|
||||
) -> (),
|
||||
),
|
||||
close: Some(mpg_close as unsafe extern "C" fn() -> ()),
|
||||
decode: Some(
|
||||
mpg_decode as unsafe extern "C" fn() -> crate::squeezelite_h::decode_state,
|
||||
),
|
||||
};
|
||||
init
|
||||
}
|
||||
};
|
||||
m = crate::stdlib::malloc(::std::mem::size_of::<mpg>() as libc::c_ulong) as *mut mpg;
|
||||
if m.is_null() {
|
||||
return 0 as *mut crate::squeezelite_h::codec;
|
||||
}
|
||||
(*m).h = 0 as *mut crate::stdlib::mpg123_handle;
|
||||
if !load_mpg() {
|
||||
return 0 as *mut crate::squeezelite_h::codec;
|
||||
}
|
||||
(*m).mpg123_init.expect("non-null function pointer")();
|
||||
(*m).use16bit = (*m).mpg123_feature.expect("non-null function pointer")(
|
||||
crate::stdlib::MPG123_FEATURE_OUTPUT_32BIT,
|
||||
) != 0;
|
||||
if loglevel as libc::c_uint >= crate::squeezelite_h::lINFO as libc::c_int as libc::c_uint {
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d using mpg to decode mp3\n\x00" as *const u8 as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 13], &[libc::c_char; 13]>(b"register_mpg\x00"))
|
||||
.as_ptr(),
|
||||
275 as libc::c_int,
|
||||
);
|
||||
}
|
||||
return &mut ret;
|
||||
}
|
1152
src/output.rs
Normal file
1152
src/output.rs
Normal file
File diff suppressed because it is too large
Load Diff
2390
src/output_alsa.rs
Normal file
2390
src/output_alsa.rs
Normal file
File diff suppressed because it is too large
Load Diff
23
src/output_pa.rs
Normal file
23
src/output_pa.rs
Normal file
@ -0,0 +1,23 @@
|
||||
use ::libc;
|
||||
// PORTAUDIO
|
||||
// Portaudio output
|
||||
/*
|
||||
* Squeezelite - lightweight headless squeezebox emulator
|
||||
*
|
||||
* (c) Adrian Smith 2012-2015, triode1@btinternet.com
|
||||
* Ralph Irving 2015-2017, ralph_irving@hotmail.com
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
324
src/output_pack.rs
Normal file
324
src/output_pack.rs
Normal file
@ -0,0 +1,324 @@
|
||||
use ::libc;
|
||||
|
||||
pub use crate::squeezelite_h::frames_t;
|
||||
pub use crate::squeezelite_h::output_format;
|
||||
pub use crate::squeezelite_h::s32_t;
|
||||
pub use crate::squeezelite_h::s64_t;
|
||||
pub use crate::squeezelite_h::u32_t;
|
||||
pub use crate::squeezelite_h::u8_t;
|
||||
pub use crate::squeezelite_h::S16_LE;
|
||||
pub use crate::squeezelite_h::S24_3LE;
|
||||
pub use crate::squeezelite_h::S24_LE;
|
||||
pub use crate::squeezelite_h::S32_LE;
|
||||
pub use crate::stdlib::__int32_t;
|
||||
pub use crate::stdlib::__int64_t;
|
||||
pub use crate::stdlib::__uint32_t;
|
||||
pub use crate::stdlib::__uint8_t;
|
||||
pub use crate::stdlib::int32_t;
|
||||
pub use crate::stdlib::int64_t;
|
||||
use crate::stdlib::memcpy;
|
||||
pub use crate::stdlib::u_int32_t;
|
||||
pub use crate::stdlib::u_int8_t;
|
||||
pub use crate::stdlib::uintptr_t;
|
||||
// inlining these on windows prevents them being linkable...
|
||||
#[inline]
|
||||
|
||||
unsafe extern "C" fn gain(
|
||||
mut gain_0: crate::squeezelite_h::s32_t,
|
||||
mut sample: crate::squeezelite_h::s32_t,
|
||||
) -> crate::squeezelite_h::s32_t {
|
||||
let mut res = gain_0 as crate::squeezelite_h::s64_t * sample as crate::squeezelite_h::s64_t;
|
||||
if res as libc::c_longlong > 0x7fffffffffff as libc::c_longlong {
|
||||
res = 0x7fffffffffff as libc::c_longlong as crate::squeezelite_h::s64_t
|
||||
}
|
||||
if (res as libc::c_longlong) < -(0x7fffffffffff as libc::c_longlong) {
|
||||
res = -(0x7fffffffffff as libc::c_longlong) as crate::squeezelite_h::s64_t
|
||||
}
|
||||
return (res >> 16 as libc::c_int) as crate::squeezelite_h::s32_t;
|
||||
}
|
||||
#[no_mangle]
|
||||
|
||||
pub unsafe extern "C" fn _scale_and_pack_frames(
|
||||
mut outputptr: *mut libc::c_void,
|
||||
mut inputptr: *mut crate::squeezelite_h::s32_t,
|
||||
mut cnt: crate::squeezelite_h::frames_t,
|
||||
mut gainL: crate::squeezelite_h::s32_t,
|
||||
mut gainR: crate::squeezelite_h::s32_t,
|
||||
mut format: crate::squeezelite_h::output_format,
|
||||
) {
|
||||
match format as libc::c_uint {
|
||||
3 => {
|
||||
let mut optr = outputptr as *mut crate::squeezelite_h::u32_t;
|
||||
if gainL == 0x10000 as libc::c_int && gainR == 0x10000 as libc::c_int {
|
||||
loop {
|
||||
let fresh0 = cnt;
|
||||
cnt = cnt.wrapping_sub(1);
|
||||
if !(fresh0 != 0) {
|
||||
break;
|
||||
}
|
||||
let fresh1 = optr;
|
||||
optr = optr.offset(1);
|
||||
*fresh1 = (*inputptr >> 16 as libc::c_int & 0xffff as libc::c_int)
|
||||
as libc::c_uint
|
||||
| *inputptr.offset(1 as libc::c_int as isize) as libc::c_uint
|
||||
& 0xffff0000 as libc::c_uint;
|
||||
inputptr = inputptr.offset(2 as libc::c_int as isize)
|
||||
}
|
||||
} else {
|
||||
loop {
|
||||
let fresh2 = cnt;
|
||||
cnt = cnt.wrapping_sub(1);
|
||||
if !(fresh2 != 0) {
|
||||
break;
|
||||
}
|
||||
let fresh3 = optr;
|
||||
optr = optr.offset(1);
|
||||
*fresh3 = (gain(gainL, *inputptr) >> 16 as libc::c_int & 0xffff as libc::c_int)
|
||||
as libc::c_uint
|
||||
| gain(gainR, *inputptr.offset(1 as libc::c_int as isize)) as libc::c_uint
|
||||
& 0xffff0000 as libc::c_uint;
|
||||
inputptr = inputptr.offset(2 as libc::c_int as isize)
|
||||
}
|
||||
}
|
||||
}
|
||||
1 => {
|
||||
let mut optr_0 = outputptr as *mut crate::squeezelite_h::u32_t;
|
||||
if gainL == 0x10000 as libc::c_int && gainR == 0x10000 as libc::c_int {
|
||||
loop {
|
||||
let fresh4 = cnt;
|
||||
cnt = cnt.wrapping_sub(1);
|
||||
if !(fresh4 != 0) {
|
||||
break;
|
||||
}
|
||||
let fresh5 = inputptr;
|
||||
inputptr = inputptr.offset(1);
|
||||
let fresh6 = optr_0;
|
||||
optr_0 = optr_0.offset(1);
|
||||
*fresh6 = (*fresh5 >> 8 as libc::c_int) as crate::squeezelite_h::u32_t;
|
||||
let fresh7 = inputptr;
|
||||
inputptr = inputptr.offset(1);
|
||||
let fresh8 = optr_0;
|
||||
optr_0 = optr_0.offset(1);
|
||||
*fresh8 = (*fresh7 >> 8 as libc::c_int) as crate::squeezelite_h::u32_t
|
||||
}
|
||||
} else {
|
||||
loop {
|
||||
let fresh9 = cnt;
|
||||
cnt = cnt.wrapping_sub(1);
|
||||
if !(fresh9 != 0) {
|
||||
break;
|
||||
}
|
||||
let fresh10 = inputptr;
|
||||
inputptr = inputptr.offset(1);
|
||||
let fresh11 = optr_0;
|
||||
optr_0 = optr_0.offset(1);
|
||||
*fresh11 =
|
||||
(gain(gainL, *fresh10) >> 8 as libc::c_int) as crate::squeezelite_h::u32_t;
|
||||
let fresh12 = inputptr;
|
||||
inputptr = inputptr.offset(1);
|
||||
let fresh13 = optr_0;
|
||||
optr_0 = optr_0.offset(1);
|
||||
*fresh13 =
|
||||
(gain(gainR, *fresh12) >> 8 as libc::c_int) as crate::squeezelite_h::u32_t
|
||||
}
|
||||
}
|
||||
}
|
||||
2 => {
|
||||
let mut optr_1 = outputptr as *mut crate::squeezelite_h::u8_t;
|
||||
if gainL == 0x10000 as libc::c_int && gainR == 0x10000 as libc::c_int {
|
||||
while cnt != 0 {
|
||||
// attempt to do 32 bit memory accesses - move 2 frames at once: 16 bytes -> 12 bytes
|
||||
// falls through to exception case when not aligned or if less than 2 frames to move
|
||||
if optr_1 as crate::stdlib::uintptr_t & 0x3 as libc::c_int as libc::c_ulong
|
||||
== 0 as libc::c_int as libc::c_ulong
|
||||
&& cnt >= 2 as libc::c_int as libc::c_uint
|
||||
{
|
||||
let mut o_ptr =
|
||||
optr_1 as *mut libc::c_void as *mut crate::squeezelite_h::u32_t;
|
||||
while cnt >= 2 as libc::c_int as libc::c_uint {
|
||||
let fresh14 = inputptr;
|
||||
inputptr = inputptr.offset(1);
|
||||
let mut l1 = *fresh14;
|
||||
let fresh15 = inputptr;
|
||||
inputptr = inputptr.offset(1);
|
||||
let mut r1 = *fresh15;
|
||||
let fresh16 = inputptr;
|
||||
inputptr = inputptr.offset(1);
|
||||
let mut l2 = *fresh16;
|
||||
let fresh17 = inputptr;
|
||||
inputptr = inputptr.offset(1);
|
||||
let mut r2 = *fresh17;
|
||||
let fresh18 = o_ptr;
|
||||
o_ptr = o_ptr.offset(1);
|
||||
*fresh18 = (l1 as libc::c_uint & 0xffffff00 as libc::c_uint)
|
||||
>> 8 as libc::c_int
|
||||
| ((r1 & 0xff00 as libc::c_int) << 16 as libc::c_int)
|
||||
as libc::c_uint;
|
||||
let fresh19 = o_ptr;
|
||||
o_ptr = o_ptr.offset(1);
|
||||
*fresh19 = (r1 as libc::c_uint & 0xffff0000 as libc::c_uint)
|
||||
>> 16 as libc::c_int
|
||||
| ((l2 & 0xffff00 as libc::c_int) << 8 as libc::c_int)
|
||||
as libc::c_uint;
|
||||
let fresh20 = o_ptr;
|
||||
o_ptr = o_ptr.offset(1);
|
||||
*fresh20 = (l2 as libc::c_uint & 0xff000000 as libc::c_uint)
|
||||
>> 24 as libc::c_int
|
||||
| r2 as libc::c_uint & 0xffffff00 as libc::c_uint;
|
||||
optr_1 = optr_1.offset(12 as libc::c_int as isize);
|
||||
cnt = (cnt as libc::c_uint)
|
||||
.wrapping_sub(2 as libc::c_int as libc::c_uint)
|
||||
as crate::squeezelite_h::frames_t
|
||||
as crate::squeezelite_h::frames_t
|
||||
}
|
||||
} else {
|
||||
let fresh21 = inputptr;
|
||||
inputptr = inputptr.offset(1);
|
||||
let mut lsample = *fresh21;
|
||||
let fresh22 = inputptr;
|
||||
inputptr = inputptr.offset(1);
|
||||
let mut rsample = *fresh22;
|
||||
let fresh23 = optr_1;
|
||||
optr_1 = optr_1.offset(1);
|
||||
*fresh23 = ((lsample & 0xff00 as libc::c_int) >> 8 as libc::c_int)
|
||||
as crate::squeezelite_h::u8_t;
|
||||
let fresh24 = optr_1;
|
||||
optr_1 = optr_1.offset(1);
|
||||
*fresh24 = ((lsample & 0xff0000 as libc::c_int) >> 16 as libc::c_int)
|
||||
as crate::squeezelite_h::u8_t;
|
||||
let fresh25 = optr_1;
|
||||
optr_1 = optr_1.offset(1);
|
||||
*fresh25 = ((lsample as libc::c_uint & 0xff000000 as libc::c_uint)
|
||||
>> 24 as libc::c_int)
|
||||
as crate::squeezelite_h::u8_t;
|
||||
let fresh26 = optr_1;
|
||||
optr_1 = optr_1.offset(1);
|
||||
*fresh26 = ((rsample & 0xff00 as libc::c_int) >> 8 as libc::c_int)
|
||||
as crate::squeezelite_h::u8_t;
|
||||
let fresh27 = optr_1;
|
||||
optr_1 = optr_1.offset(1);
|
||||
*fresh27 = ((rsample & 0xff0000 as libc::c_int) >> 16 as libc::c_int)
|
||||
as crate::squeezelite_h::u8_t;
|
||||
let fresh28 = optr_1;
|
||||
optr_1 = optr_1.offset(1);
|
||||
*fresh28 = ((rsample as libc::c_uint & 0xff000000 as libc::c_uint)
|
||||
>> 24 as libc::c_int)
|
||||
as crate::squeezelite_h::u8_t;
|
||||
cnt = cnt.wrapping_sub(1)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
while cnt != 0 {
|
||||
// attempt to do 32 bit memory accesses - move 2 frames at once: 16 bytes -> 12 bytes
|
||||
// falls through to exception case when not aligned or if less than 2 frames to move
|
||||
if optr_1 as crate::stdlib::uintptr_t & 0x3 as libc::c_int as libc::c_ulong
|
||||
== 0 as libc::c_int as libc::c_ulong
|
||||
&& cnt >= 2 as libc::c_int as libc::c_uint
|
||||
{
|
||||
let mut o_ptr_0 =
|
||||
optr_1 as *mut libc::c_void as *mut crate::squeezelite_h::u32_t;
|
||||
while cnt >= 2 as libc::c_int as libc::c_uint {
|
||||
let fresh29 = inputptr;
|
||||
inputptr = inputptr.offset(1);
|
||||
let mut l1_0 = gain(gainL, *fresh29);
|
||||
let fresh30 = inputptr;
|
||||
inputptr = inputptr.offset(1);
|
||||
let mut r1_0 = gain(gainR, *fresh30);
|
||||
let fresh31 = inputptr;
|
||||
inputptr = inputptr.offset(1);
|
||||
let mut l2_0 = gain(gainL, *fresh31);
|
||||
let fresh32 = inputptr;
|
||||
inputptr = inputptr.offset(1);
|
||||
let mut r2_0 = gain(gainR, *fresh32);
|
||||
let fresh33 = o_ptr_0;
|
||||
o_ptr_0 = o_ptr_0.offset(1);
|
||||
*fresh33 = (l1_0 as libc::c_uint & 0xffffff00 as libc::c_uint)
|
||||
>> 8 as libc::c_int
|
||||
| ((r1_0 & 0xff00 as libc::c_int) << 16 as libc::c_int)
|
||||
as libc::c_uint;
|
||||
let fresh34 = o_ptr_0;
|
||||
o_ptr_0 = o_ptr_0.offset(1);
|
||||
*fresh34 = (r1_0 as libc::c_uint & 0xffff0000 as libc::c_uint)
|
||||
>> 16 as libc::c_int
|
||||
| ((l2_0 & 0xffff00 as libc::c_int) << 8 as libc::c_int)
|
||||
as libc::c_uint;
|
||||
let fresh35 = o_ptr_0;
|
||||
o_ptr_0 = o_ptr_0.offset(1);
|
||||
*fresh35 = (l2_0 as libc::c_uint & 0xff000000 as libc::c_uint)
|
||||
>> 24 as libc::c_int
|
||||
| r2_0 as libc::c_uint & 0xffffff00 as libc::c_uint;
|
||||
optr_1 = optr_1.offset(12 as libc::c_int as isize);
|
||||
cnt = (cnt as libc::c_uint)
|
||||
.wrapping_sub(2 as libc::c_int as libc::c_uint)
|
||||
as crate::squeezelite_h::frames_t
|
||||
as crate::squeezelite_h::frames_t
|
||||
}
|
||||
} else {
|
||||
let fresh36 = inputptr;
|
||||
inputptr = inputptr.offset(1);
|
||||
let mut lsample_0 = gain(gainL, *fresh36);
|
||||
let fresh37 = inputptr;
|
||||
inputptr = inputptr.offset(1);
|
||||
let mut rsample_0 = gain(gainR, *fresh37);
|
||||
let fresh38 = optr_1;
|
||||
optr_1 = optr_1.offset(1);
|
||||
*fresh38 = ((lsample_0 & 0xff00 as libc::c_int) >> 8 as libc::c_int)
|
||||
as crate::squeezelite_h::u8_t;
|
||||
let fresh39 = optr_1;
|
||||
optr_1 = optr_1.offset(1);
|
||||
*fresh39 = ((lsample_0 & 0xff0000 as libc::c_int) >> 16 as libc::c_int)
|
||||
as crate::squeezelite_h::u8_t;
|
||||
let fresh40 = optr_1;
|
||||
optr_1 = optr_1.offset(1);
|
||||
*fresh40 = ((lsample_0 as libc::c_uint & 0xff000000 as libc::c_uint)
|
||||
>> 24 as libc::c_int)
|
||||
as crate::squeezelite_h::u8_t;
|
||||
let fresh41 = optr_1;
|
||||
optr_1 = optr_1.offset(1);
|
||||
*fresh41 = ((rsample_0 & 0xff00 as libc::c_int) >> 8 as libc::c_int)
|
||||
as crate::squeezelite_h::u8_t;
|
||||
let fresh42 = optr_1;
|
||||
optr_1 = optr_1.offset(1);
|
||||
*fresh42 = ((rsample_0 & 0xff0000 as libc::c_int) >> 16 as libc::c_int)
|
||||
as crate::squeezelite_h::u8_t;
|
||||
let fresh43 = optr_1;
|
||||
optr_1 = optr_1.offset(1);
|
||||
*fresh43 = ((rsample_0 as libc::c_uint & 0xff000000 as libc::c_uint)
|
||||
>> 24 as libc::c_int)
|
||||
as crate::squeezelite_h::u8_t;
|
||||
cnt = cnt.wrapping_sub(1)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
0 => {
|
||||
let mut optr_2 = outputptr as *mut crate::squeezelite_h::u32_t;
|
||||
if gainL == 0x10000 as libc::c_int && gainR == 0x10000 as libc::c_int {
|
||||
crate::stdlib::memcpy(
|
||||
outputptr,
|
||||
inputptr as *const libc::c_void,
|
||||
cnt.wrapping_mul(8 as libc::c_int as libc::c_uint) as libc::c_ulong,
|
||||
);
|
||||
} else {
|
||||
loop {
|
||||
let fresh44 = cnt;
|
||||
cnt = cnt.wrapping_sub(1);
|
||||
if !(fresh44 != 0) {
|
||||
break;
|
||||
}
|
||||
let fresh45 = inputptr;
|
||||
inputptr = inputptr.offset(1);
|
||||
let fresh46 = optr_2;
|
||||
optr_2 = optr_2.offset(1);
|
||||
*fresh46 = gain(gainL, *fresh45) as crate::squeezelite_h::u32_t;
|
||||
let fresh47 = inputptr;
|
||||
inputptr = inputptr.offset(1);
|
||||
let fresh48 = optr_2;
|
||||
optr_2 = optr_2.offset(1);
|
||||
*fresh48 = gain(gainR, *fresh47) as crate::squeezelite_h::u32_t
|
||||
}
|
||||
}
|
||||
}
|
||||
_ => {}
|
||||
};
|
||||
}
|
25
src/output_pulse.rs
Normal file
25
src/output_pulse.rs
Normal file
@ -0,0 +1,25 @@
|
||||
use ::libc;
|
||||
// Output using PulseAudio
|
||||
/*
|
||||
* Squeezelite - lightweight headless squeezebox emulator
|
||||
*
|
||||
* (c) Adrian Smith 2012-2015, triode1@btinternet.com
|
||||
* Ralph Irving 2015-2020, ralph_irving@hotmail.com
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Additions (c) Paul Hermann, 2015-2017 under the same license terms
|
||||
* -Control of Raspberry pi GPIO for amplifier power
|
||||
* -Launch script on power status change from LMS
|
||||
*/
|
346
src/output_stdout.rs
Normal file
346
src/output_stdout.rs
Normal file
@ -0,0 +1,346 @@
|
||||
use ::libc;
|
||||
|
||||
pub use crate::stddef_h::size_t;
|
||||
|
||||
pub use crate::stdlib::_IO_codecvt;
|
||||
pub use crate::stdlib::_IO_lock_t;
|
||||
pub use crate::stdlib::_IO_marker;
|
||||
pub use crate::stdlib::_IO_wide_data;
|
||||
pub use crate::stdlib::__int32_t;
|
||||
pub use crate::stdlib::__off64_t;
|
||||
pub use crate::stdlib::__off_t;
|
||||
pub use crate::stdlib::__uint32_t;
|
||||
pub use crate::stdlib::__uint8_t;
|
||||
pub use crate::stdlib::int32_t;
|
||||
pub use crate::stdlib::FILE;
|
||||
pub use crate::stdlib::_IO_FILE;
|
||||
|
||||
pub use crate::squeezelite_h::_apply_cross;
|
||||
pub use crate::squeezelite_h::buffer;
|
||||
pub use crate::squeezelite_h::fade_dir;
|
||||
pub use crate::squeezelite_h::fade_mode;
|
||||
pub use crate::squeezelite_h::fade_state;
|
||||
pub use crate::squeezelite_h::frames_t;
|
||||
pub use crate::squeezelite_h::lDEBUG;
|
||||
pub use crate::squeezelite_h::lERROR;
|
||||
pub use crate::squeezelite_h::lINFO;
|
||||
pub use crate::squeezelite_h::lSDEBUG;
|
||||
pub use crate::squeezelite_h::lWARN;
|
||||
pub use crate::squeezelite_h::log_level;
|
||||
pub use crate::squeezelite_h::output_format;
|
||||
pub use crate::squeezelite_h::output_state;
|
||||
pub use crate::squeezelite_h::outputstate;
|
||||
pub use crate::squeezelite_h::s32_t;
|
||||
pub use crate::squeezelite_h::u32_t;
|
||||
pub use crate::squeezelite_h::u8_t;
|
||||
pub use crate::squeezelite_h::C2RustUnnamed_1;
|
||||
pub use crate::squeezelite_h::FADE_ACTIVE;
|
||||
pub use crate::squeezelite_h::FADE_CROSS;
|
||||
pub use crate::squeezelite_h::FADE_CROSSFADE;
|
||||
pub use crate::squeezelite_h::FADE_DOWN;
|
||||
pub use crate::squeezelite_h::FADE_DUE;
|
||||
pub use crate::squeezelite_h::FADE_IN;
|
||||
pub use crate::squeezelite_h::FADE_INACTIVE;
|
||||
pub use crate::squeezelite_h::FADE_INOUT;
|
||||
pub use crate::squeezelite_h::FADE_NONE;
|
||||
pub use crate::squeezelite_h::FADE_OUT;
|
||||
pub use crate::squeezelite_h::FADE_UP;
|
||||
pub use crate::squeezelite_h::OUTPUT_BUFFER;
|
||||
pub use crate::squeezelite_h::OUTPUT_OFF;
|
||||
pub use crate::squeezelite_h::OUTPUT_PAUSE_FRAMES;
|
||||
pub use crate::squeezelite_h::OUTPUT_RUNNING;
|
||||
pub use crate::squeezelite_h::OUTPUT_SKIP_FRAMES;
|
||||
pub use crate::squeezelite_h::OUTPUT_START_AT;
|
||||
pub use crate::squeezelite_h::OUTPUT_STOPPED;
|
||||
pub use crate::squeezelite_h::S16_LE;
|
||||
pub use crate::squeezelite_h::S24_3LE;
|
||||
pub use crate::squeezelite_h::S24_LE;
|
||||
pub use crate::squeezelite_h::S32_LE;
|
||||
pub use crate::src::output::_output_frames;
|
||||
pub use crate::src::output::output_close_common;
|
||||
pub use crate::src::output::output_init_common;
|
||||
pub use crate::src::output_pack::_scale_and_pack_frames;
|
||||
pub use crate::src::utils::gettime_ms;
|
||||
pub use crate::src::utils::logprint;
|
||||
pub use crate::src::utils::logtime;
|
||||
pub use crate::stdlib::__pthread_internal_list;
|
||||
pub use crate::stdlib::__pthread_list_t;
|
||||
pub use crate::stdlib::__pthread_mutex_s;
|
||||
use crate::stdlib::free;
|
||||
use crate::stdlib::fwrite;
|
||||
use crate::stdlib::malloc;
|
||||
use crate::stdlib::memset;
|
||||
use crate::stdlib::pthread_attr_destroy;
|
||||
use crate::stdlib::pthread_attr_init;
|
||||
use crate::stdlib::pthread_attr_setstacksize;
|
||||
pub use crate::stdlib::pthread_attr_t;
|
||||
use crate::stdlib::pthread_create;
|
||||
use crate::stdlib::pthread_mutex_lock;
|
||||
pub use crate::stdlib::pthread_mutex_t;
|
||||
use crate::stdlib::pthread_mutex_unlock;
|
||||
pub use crate::stdlib::pthread_t;
|
||||
use crate::stdlib::stdout;
|
||||
use crate::stdlib::strcmp;
|
||||
pub use crate::stdlib::u_int32_t;
|
||||
pub use crate::stdlib::u_int8_t;
|
||||
extern "C" {
|
||||
#[no_mangle]
|
||||
pub static mut output: crate::squeezelite_h::outputstate;
|
||||
#[no_mangle]
|
||||
pub static mut outputbuf: *mut crate::squeezelite_h::buffer;
|
||||
#[no_mangle]
|
||||
pub static mut silencebuf: *mut crate::squeezelite_h::u8_t;
|
||||
}
|
||||
|
||||
static mut loglevel: crate::squeezelite_h::log_level = crate::squeezelite_h::lERROR;
|
||||
|
||||
static mut running: bool = 1 as libc::c_int != 0;
|
||||
// buffer to hold output data so we can block on writing outside of output lock, allocated on init
|
||||
|
||||
static mut buf: *mut crate::squeezelite_h::u8_t =
|
||||
0 as *const crate::squeezelite_h::u8_t as *mut crate::squeezelite_h::u8_t;
|
||||
|
||||
static mut buffill: libc::c_uint = 0;
|
||||
|
||||
static mut bytes_per_frame: libc::c_int = 0;
|
||||
|
||||
unsafe extern "C" fn _stdout_write_frames(
|
||||
mut out_frames: crate::squeezelite_h::frames_t,
|
||||
mut silence: bool,
|
||||
mut gainL: crate::squeezelite_h::s32_t,
|
||||
mut gainR: crate::squeezelite_h::s32_t,
|
||||
mut cross_gain_in: crate::squeezelite_h::s32_t,
|
||||
mut cross_gain_out: crate::squeezelite_h::s32_t,
|
||||
mut cross_ptr: *mut *mut crate::squeezelite_h::s32_t,
|
||||
) -> libc::c_int {
|
||||
let mut obuf = 0 as *mut crate::squeezelite_h::u8_t;
|
||||
if !silence {
|
||||
if output.fade as libc::c_uint
|
||||
== crate::squeezelite_h::FADE_ACTIVE as libc::c_int as libc::c_uint
|
||||
&& output.fade_dir as libc::c_uint
|
||||
== crate::squeezelite_h::FADE_CROSS as libc::c_int as libc::c_uint
|
||||
&& !(*cross_ptr).is_null()
|
||||
{
|
||||
crate::squeezelite_h::_apply_cross(
|
||||
outputbuf,
|
||||
out_frames,
|
||||
cross_gain_in,
|
||||
cross_gain_out,
|
||||
cross_ptr,
|
||||
);
|
||||
}
|
||||
obuf = (*outputbuf).readp
|
||||
} else {
|
||||
obuf = silencebuf
|
||||
}
|
||||
crate::src::output_pack::_scale_and_pack_frames(
|
||||
buf.offset(buffill.wrapping_mul(bytes_per_frame as libc::c_uint) as isize)
|
||||
as *mut libc::c_void,
|
||||
obuf as *mut libc::c_void as *mut crate::squeezelite_h::s32_t,
|
||||
out_frames,
|
||||
gainL,
|
||||
gainR,
|
||||
output.format,
|
||||
);
|
||||
buffill = buffill.wrapping_add(out_frames);
|
||||
return out_frames as libc::c_int;
|
||||
}
|
||||
|
||||
unsafe extern "C" fn output_thread() -> *mut libc::c_void {
|
||||
crate::stdlib::pthread_mutex_lock(&mut (*outputbuf).mutex);
|
||||
match output.format as libc::c_uint {
|
||||
0 => bytes_per_frame = 4 as libc::c_int * 2 as libc::c_int,
|
||||
2 => bytes_per_frame = 3 as libc::c_int * 2 as libc::c_int,
|
||||
3 => bytes_per_frame = 2 as libc::c_int * 2 as libc::c_int,
|
||||
_ => bytes_per_frame = 4 as libc::c_int * 2 as libc::c_int,
|
||||
}
|
||||
crate::stdlib::pthread_mutex_unlock(&mut (*outputbuf).mutex);
|
||||
while running {
|
||||
crate::stdlib::pthread_mutex_lock(&mut (*outputbuf).mutex);
|
||||
output.device_frames = 0 as libc::c_int as libc::c_uint;
|
||||
output.updated = crate::src::utils::gettime_ms();
|
||||
output.frames_played_dmp = output.frames_played;
|
||||
crate::src::output::_output_frames(2048 as libc::c_int as crate::squeezelite_h::frames_t);
|
||||
crate::stdlib::pthread_mutex_unlock(&mut (*outputbuf).mutex);
|
||||
if buffill != 0 {
|
||||
crate::stdlib::fwrite(
|
||||
buf as *const libc::c_void,
|
||||
bytes_per_frame as libc::c_ulong,
|
||||
buffill as libc::c_ulong,
|
||||
crate::stdlib::stdout,
|
||||
);
|
||||
buffill = 0 as libc::c_int as libc::c_uint
|
||||
}
|
||||
}
|
||||
return 0 as *mut libc::c_void;
|
||||
}
|
||||
|
||||
static mut thread: crate::stdlib::pthread_t = 0;
|
||||
#[no_mangle]
|
||||
|
||||
pub unsafe extern "C" fn output_init_stdout(
|
||||
mut level: crate::squeezelite_h::log_level,
|
||||
mut output_buf_size: libc::c_uint,
|
||||
mut params: *mut libc::c_char,
|
||||
mut rates: *mut libc::c_uint,
|
||||
mut rate_delay: libc::c_uint,
|
||||
) {
|
||||
loglevel = level;
|
||||
if loglevel as libc::c_uint >= crate::squeezelite_h::lINFO as libc::c_int as libc::c_uint {
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d init output stdout\n\x00" as *const u8 as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 19], &[libc::c_char; 19]>(b"output_init_stdout\x00"))
|
||||
.as_ptr(),
|
||||
130 as libc::c_int,
|
||||
);
|
||||
}
|
||||
buf = crate::stdlib::malloc((2048 as libc::c_int * 8 as libc::c_int) as libc::c_ulong)
|
||||
as *mut crate::squeezelite_h::u8_t;
|
||||
if buf.is_null() {
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d unable to malloc buf\n\x00" as *const u8 as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 19], &[libc::c_char; 19]>(b"output_init_stdout\x00"))
|
||||
.as_ptr(),
|
||||
134 as libc::c_int,
|
||||
);
|
||||
return;
|
||||
}
|
||||
buffill = 0 as libc::c_int as libc::c_uint;
|
||||
crate::stdlib::memset(
|
||||
&mut output as *mut crate::squeezelite_h::outputstate as *mut libc::c_void,
|
||||
0 as libc::c_int,
|
||||
::std::mem::size_of::<crate::squeezelite_h::outputstate>() as libc::c_ulong,
|
||||
);
|
||||
output.format = crate::squeezelite_h::S32_LE;
|
||||
output.start_frames = (2048 as libc::c_int * 2 as libc::c_int) as libc::c_uint;
|
||||
output.write_cb = Some(
|
||||
_stdout_write_frames
|
||||
as unsafe extern "C" fn(
|
||||
_: crate::squeezelite_h::frames_t,
|
||||
_: bool,
|
||||
_: crate::squeezelite_h::s32_t,
|
||||
_: crate::squeezelite_h::s32_t,
|
||||
_: crate::squeezelite_h::s32_t,
|
||||
_: crate::squeezelite_h::s32_t,
|
||||
_: *mut *mut crate::squeezelite_h::s32_t,
|
||||
) -> libc::c_int,
|
||||
);
|
||||
output.rate_delay = rate_delay;
|
||||
if !params.is_null() {
|
||||
if crate::stdlib::strcmp(params, b"32\x00" as *const u8 as *const libc::c_char) == 0 {
|
||||
output.format = crate::squeezelite_h::S32_LE
|
||||
}
|
||||
if crate::stdlib::strcmp(params, b"24\x00" as *const u8 as *const libc::c_char) == 0 {
|
||||
output.format = crate::squeezelite_h::S24_3LE
|
||||
}
|
||||
if crate::stdlib::strcmp(params, b"16\x00" as *const u8 as *const libc::c_char) == 0 {
|
||||
output.format = crate::squeezelite_h::S16_LE
|
||||
}
|
||||
}
|
||||
// ensure output rate is specified to avoid test open
|
||||
if *rates.offset(0 as libc::c_int as isize) == 0 {
|
||||
*rates.offset(0 as libc::c_int as isize) = 44100 as libc::c_int as libc::c_uint
|
||||
}
|
||||
crate::src::output::output_init_common(
|
||||
level,
|
||||
b"-\x00" as *const u8 as *const libc::c_char,
|
||||
output_buf_size,
|
||||
rates,
|
||||
0 as libc::c_int as libc::c_uint,
|
||||
);
|
||||
let mut attr = crate::stdlib::pthread_attr_t { __size: [0; 56] };
|
||||
crate::stdlib::pthread_attr_init(&mut attr);
|
||||
crate::stdlib::pthread_attr_setstacksize(
|
||||
&mut attr,
|
||||
(16384 as libc::c_int + 64 as libc::c_int * 1024 as libc::c_int) as crate::stddef_h::size_t,
|
||||
);
|
||||
crate::stdlib::pthread_create(
|
||||
&mut thread,
|
||||
&mut attr,
|
||||
::std::mem::transmute::<
|
||||
Option<unsafe extern "C" fn() -> *mut libc::c_void>,
|
||||
Option<unsafe extern "C" fn(_: *mut libc::c_void) -> *mut libc::c_void>,
|
||||
>(Some(::std::mem::transmute::<
|
||||
unsafe extern "C" fn() -> *mut libc::c_void,
|
||||
unsafe extern "C" fn() -> *mut libc::c_void,
|
||||
>(output_thread))),
|
||||
0 as *mut libc::c_void,
|
||||
);
|
||||
crate::stdlib::pthread_attr_destroy(&mut attr);
|
||||
}
|
||||
/*
|
||||
* Squeezelite - lightweight headless squeezebox emulator
|
||||
*
|
||||
* (c) Adrian Smith 2012-2015, triode1@btinternet.com
|
||||
* Ralph Irving 2015-2017, ralph_irving@hotmail.com
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Additions (c) Paul Hermann, 2015-2017 under the same license terms
|
||||
* -Control of Raspberry pi GPIO for amplifier power
|
||||
* -Launch script on power status change from LMS
|
||||
*/
|
||||
// make may define: PORTAUDIO, SELFPIPE, RESAMPLE, RESAMPLE_MP, VISEXPORT, GPIO, IR, DSD, LINKALL to influence build
|
||||
// build detection
|
||||
// dynamically loaded libraries at run time
|
||||
// !LINKALL
|
||||
// config options
|
||||
// do not reduce as icy-meta max is 4080
|
||||
/* SUN */
|
||||
/* SUN */
|
||||
// printf/scanf formats for u64_t
|
||||
// logging
|
||||
// utils.c (non logging)
|
||||
// buffer.c
|
||||
// _* called with mutex locked
|
||||
// slimproto.c
|
||||
// stream.c
|
||||
// decode.c
|
||||
// output.c output_alsa.c output_pa.c output_pack.c
|
||||
// frames played at the point delay is measured
|
||||
// ordered largest first so [0] is max_rate
|
||||
// set in decode thread
|
||||
// set in decode thread
|
||||
// set by slimproto
|
||||
// set by slimproto
|
||||
// set by slimproto
|
||||
// set by slimproto
|
||||
// set by slimproto
|
||||
// set by slimproto
|
||||
// set by slimproto
|
||||
// _* called with mutex locked
|
||||
// output_alsa.c
|
||||
// output_pa.c
|
||||
// output_pulse.c
|
||||
// output_stdout.c
|
||||
#[no_mangle]
|
||||
|
||||
pub unsafe extern "C" fn output_close_stdout() {
|
||||
if loglevel as libc::c_uint >= crate::squeezelite_h::lINFO as libc::c_int as libc::c_uint {
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d close output\n\x00" as *const u8 as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 20], &[libc::c_char; 20]>(b"output_close_stdout\x00"))
|
||||
.as_ptr(),
|
||||
174 as libc::c_int,
|
||||
);
|
||||
}
|
||||
crate::stdlib::pthread_mutex_lock(&mut (*outputbuf).mutex);
|
||||
running = 0 as libc::c_int != 0;
|
||||
crate::stdlib::pthread_mutex_unlock(&mut (*outputbuf).mutex);
|
||||
crate::stdlib::free(buf as *mut libc::c_void);
|
||||
crate::src::output::output_close_common();
|
||||
}
|
1015
src/pcm.rs
Normal file
1015
src/pcm.rs
Normal file
File diff suppressed because it is too large
Load Diff
2542
src/slimproto.rs
Normal file
2542
src/slimproto.rs
Normal file
File diff suppressed because it is too large
Load Diff
207
src/squeezelite_h.rs
Normal file
207
src/squeezelite_h.rs
Normal file
@ -0,0 +1,207 @@
|
||||
extern "C" {
|
||||
#[no_mangle]
|
||||
pub fn _buf_used(buf: *mut crate::squeezelite_h::buffer) -> libc::c_uint;
|
||||
|
||||
#[no_mangle]
|
||||
pub fn to_gain(f: libc::c_float) -> crate::squeezelite_h::s32_t;
|
||||
|
||||
#[no_mangle]
|
||||
pub fn gain(
|
||||
gain_0: crate::squeezelite_h::s32_t,
|
||||
sample: crate::squeezelite_h::s32_t,
|
||||
) -> crate::squeezelite_h::s32_t;
|
||||
|
||||
#[no_mangle]
|
||||
pub fn _apply_cross(
|
||||
outputbuf_0: *mut crate::squeezelite_h::buffer,
|
||||
out_frames: crate::squeezelite_h::frames_t,
|
||||
cross_gain_in: crate::squeezelite_h::s32_t,
|
||||
cross_gain_out: crate::squeezelite_h::s32_t,
|
||||
cross_ptr: *mut *mut crate::squeezelite_h::s32_t,
|
||||
);
|
||||
|
||||
#[no_mangle]
|
||||
pub fn _apply_gain(
|
||||
outputbuf_0: *mut crate::squeezelite_h::buffer,
|
||||
count: crate::squeezelite_h::frames_t,
|
||||
gainL: crate::squeezelite_h::s32_t,
|
||||
gainR: crate::squeezelite_h::s32_t,
|
||||
);
|
||||
}
|
||||
// =============== BEGIN squeezelite_h ================
|
||||
pub type s16_t = crate::stdlib::int16_t;
|
||||
#[repr(C)]
|
||||
#[derive(Copy, Clone)]
|
||||
pub union C2RustUnnamed_1 {
|
||||
pub pause_frames: crate::squeezelite_h::u32_t,
|
||||
pub skip_frames: crate::squeezelite_h::u32_t,
|
||||
pub start_at: crate::squeezelite_h::u32_t,
|
||||
}
|
||||
pub type u32_t = crate::stdlib::u_int32_t;
|
||||
pub type u64_t = crate::stdlib::u_int64_t;
|
||||
pub type s32_t = crate::stdlib::int32_t;
|
||||
pub type frames_t = crate::squeezelite_h::u32_t;
|
||||
pub type log_level = libc::c_uint;
|
||||
pub type stream_state = libc::c_uint;
|
||||
pub type disconnect_code = libc::c_uint;
|
||||
#[repr(C)]
|
||||
#[derive(Copy, Clone)]
|
||||
pub struct streamstate {
|
||||
pub state: crate::squeezelite_h::stream_state,
|
||||
pub disconnect: crate::squeezelite_h::disconnect_code,
|
||||
pub header: *mut libc::c_char,
|
||||
pub header_len: crate::stddef_h::size_t,
|
||||
pub sent_headers: bool,
|
||||
pub cont_wait: bool,
|
||||
pub bytes: crate::squeezelite_h::u64_t,
|
||||
pub threshold: libc::c_uint,
|
||||
pub meta_interval: crate::squeezelite_h::u32_t,
|
||||
pub meta_next: crate::squeezelite_h::u32_t,
|
||||
pub meta_left: crate::squeezelite_h::u32_t,
|
||||
pub meta_send: bool,
|
||||
}
|
||||
pub type decode_state = libc::c_uint;
|
||||
#[repr(C)]
|
||||
#[derive(Copy, Clone)]
|
||||
pub struct decodestate {
|
||||
pub state: crate::squeezelite_h::decode_state,
|
||||
pub new_stream: bool,
|
||||
pub mutex: crate::stdlib::pthread_mutex_t,
|
||||
}
|
||||
#[repr(C)]
|
||||
#[derive(Copy, Clone)]
|
||||
pub struct codec {
|
||||
pub id: libc::c_char,
|
||||
pub types: *mut libc::c_char,
|
||||
pub min_read_bytes: libc::c_uint,
|
||||
pub min_space: libc::c_uint,
|
||||
pub open: Option<
|
||||
unsafe extern "C" fn(
|
||||
_: crate::squeezelite_h::u8_t,
|
||||
_: crate::squeezelite_h::u8_t,
|
||||
_: crate::squeezelite_h::u8_t,
|
||||
_: crate::squeezelite_h::u8_t,
|
||||
) -> (),
|
||||
>,
|
||||
pub close: Option<unsafe extern "C" fn() -> ()>,
|
||||
pub decode: Option<unsafe extern "C" fn() -> crate::squeezelite_h::decode_state>,
|
||||
}
|
||||
pub type fade_mode = libc::c_uint;
|
||||
#[repr(C)]
|
||||
#[derive(Copy, Clone)]
|
||||
pub struct outputstate {
|
||||
pub state: crate::squeezelite_h::output_state,
|
||||
pub format: crate::squeezelite_h::output_format,
|
||||
pub device: *const libc::c_char,
|
||||
pub buffer: libc::c_uint,
|
||||
pub period: libc::c_uint,
|
||||
pub track_started: bool,
|
||||
pub write_cb: Option<
|
||||
unsafe extern "C" fn(
|
||||
_: crate::squeezelite_h::frames_t,
|
||||
_: bool,
|
||||
_: crate::squeezelite_h::s32_t,
|
||||
_: crate::squeezelite_h::s32_t,
|
||||
_: crate::squeezelite_h::s32_t,
|
||||
_: crate::squeezelite_h::s32_t,
|
||||
_: *mut *mut crate::squeezelite_h::s32_t,
|
||||
) -> libc::c_int,
|
||||
>,
|
||||
pub start_frames: libc::c_uint,
|
||||
pub frames_played: libc::c_uint,
|
||||
pub frames_played_dmp: libc::c_uint,
|
||||
pub current_sample_rate: libc::c_uint,
|
||||
pub supported_rates: [libc::c_uint; 18],
|
||||
pub default_sample_rate: libc::c_uint,
|
||||
pub error_opening: bool,
|
||||
pub device_frames: libc::c_uint,
|
||||
pub updated: crate::squeezelite_h::u32_t,
|
||||
pub track_start_time: crate::squeezelite_h::u32_t,
|
||||
pub current_replay_gain: crate::squeezelite_h::u32_t,
|
||||
pub c2rust_unnamed: crate::squeezelite_h::C2RustUnnamed_1,
|
||||
pub next_sample_rate: libc::c_uint,
|
||||
pub track_start: *mut crate::squeezelite_h::u8_t,
|
||||
pub gainL: crate::squeezelite_h::u32_t,
|
||||
pub gainR: crate::squeezelite_h::u32_t,
|
||||
pub invert: bool,
|
||||
pub next_replay_gain: crate::squeezelite_h::u32_t,
|
||||
pub threshold: libc::c_uint,
|
||||
pub fade: crate::squeezelite_h::fade_state,
|
||||
pub fade_start: *mut crate::squeezelite_h::u8_t,
|
||||
pub fade_end: *mut crate::squeezelite_h::u8_t,
|
||||
pub fade_dir: crate::squeezelite_h::fade_dir,
|
||||
pub fade_mode: crate::squeezelite_h::fade_mode,
|
||||
pub fade_secs: libc::c_uint,
|
||||
pub rate_delay: libc::c_uint,
|
||||
pub delay_active: bool,
|
||||
pub stop_time: crate::squeezelite_h::u32_t,
|
||||
pub idle_to: crate::squeezelite_h::u32_t,
|
||||
}
|
||||
pub type fade_dir = libc::c_uint;
|
||||
pub type fade_state = libc::c_uint;
|
||||
pub type output_format = libc::c_uint;
|
||||
pub type output_state = libc::c_int;
|
||||
pub type s64_t = crate::stdlib::int64_t;
|
||||
pub const lSDEBUG: crate::squeezelite_h::log_level = 4;
|
||||
pub const lDEBUG: crate::squeezelite_h::log_level = 3;
|
||||
pub const lINFO: crate::squeezelite_h::log_level = 2;
|
||||
pub const lWARN: crate::squeezelite_h::log_level = 1;
|
||||
pub const lERROR: crate::squeezelite_h::log_level = 0;
|
||||
pub const RECV_HEADERS: crate::squeezelite_h::stream_state = 7;
|
||||
pub const SEND_HEADERS: crate::squeezelite_h::stream_state = 6;
|
||||
pub const STREAMING_HTTP: crate::squeezelite_h::stream_state = 5;
|
||||
pub const STREAMING_FILE: crate::squeezelite_h::stream_state = 4;
|
||||
pub const STREAMING_BUFFERING: crate::squeezelite_h::stream_state = 3;
|
||||
pub const STREAMING_WAIT: crate::squeezelite_h::stream_state = 2;
|
||||
pub const DISCONNECT: crate::squeezelite_h::stream_state = 1;
|
||||
pub const STOPPED: crate::squeezelite_h::stream_state = 0;
|
||||
pub const TIMEOUT: crate::squeezelite_h::disconnect_code = 4;
|
||||
pub const UNREACHABLE: crate::squeezelite_h::disconnect_code = 3;
|
||||
pub const REMOTE_DISCONNECT: crate::squeezelite_h::disconnect_code = 2;
|
||||
pub const LOCAL_DISCONNECT: crate::squeezelite_h::disconnect_code = 1;
|
||||
pub const DISCONNECT_OK: crate::squeezelite_h::disconnect_code = 0;
|
||||
pub const DECODE_ERROR: crate::squeezelite_h::decode_state = 4;
|
||||
pub const DECODE_COMPLETE: crate::squeezelite_h::decode_state = 3;
|
||||
pub const DECODE_RUNNING: crate::squeezelite_h::decode_state = 2;
|
||||
pub const DECODE_READY: crate::squeezelite_h::decode_state = 1;
|
||||
pub const DECODE_STOPPED: crate::squeezelite_h::decode_state = 0;
|
||||
pub const FADE_INOUT: crate::squeezelite_h::fade_mode = 4;
|
||||
pub const FADE_OUT: crate::squeezelite_h::fade_mode = 3;
|
||||
pub const FADE_IN: crate::squeezelite_h::fade_mode = 2;
|
||||
pub const FADE_CROSSFADE: crate::squeezelite_h::fade_mode = 1;
|
||||
pub const FADE_NONE: crate::squeezelite_h::fade_mode = 0;
|
||||
pub const FADE_CROSS: crate::squeezelite_h::fade_dir = 3;
|
||||
pub const FADE_DOWN: crate::squeezelite_h::fade_dir = 2;
|
||||
pub const FADE_UP: crate::squeezelite_h::fade_dir = 1;
|
||||
pub const FADE_ACTIVE: crate::squeezelite_h::fade_state = 2;
|
||||
pub const FADE_DUE: crate::squeezelite_h::fade_state = 1;
|
||||
pub const FADE_INACTIVE: crate::squeezelite_h::fade_state = 0;
|
||||
pub const S16_LE: crate::squeezelite_h::output_format = 3;
|
||||
pub const S24_3LE: crate::squeezelite_h::output_format = 2;
|
||||
pub const S24_LE: crate::squeezelite_h::output_format = 1;
|
||||
pub const S32_LE: crate::squeezelite_h::output_format = 0;
|
||||
pub const OUTPUT_START_AT: crate::squeezelite_h::output_state = 5;
|
||||
pub const OUTPUT_SKIP_FRAMES: crate::squeezelite_h::output_state = 4;
|
||||
pub const OUTPUT_PAUSE_FRAMES: crate::squeezelite_h::output_state = 3;
|
||||
pub const OUTPUT_RUNNING: crate::squeezelite_h::output_state = 2;
|
||||
pub const OUTPUT_BUFFER: crate::squeezelite_h::output_state = 1;
|
||||
pub const OUTPUT_STOPPED: crate::squeezelite_h::output_state = 0;
|
||||
pub const OUTPUT_OFF: crate::squeezelite_h::output_state = -1;
|
||||
pub type u16_t = crate::stdlib::u_int16_t;
|
||||
pub type sockfd = libc::c_int;
|
||||
pub type event_type = libc::c_uint;
|
||||
pub const EVENT_WAKE: crate::squeezelite_h::event_type = 2;
|
||||
pub const EVENT_READ: crate::squeezelite_h::event_type = 1;
|
||||
pub const EVENT_TIMEOUT: crate::squeezelite_h::event_type = 0;
|
||||
pub type u8_t = crate::stdlib::u_int8_t;
|
||||
#[repr(C)]
|
||||
#[derive(Copy, Clone)]
|
||||
pub struct buffer {
|
||||
pub buf: *mut crate::squeezelite_h::u8_t,
|
||||
pub readp: *mut crate::squeezelite_h::u8_t,
|
||||
pub writep: *mut crate::squeezelite_h::u8_t,
|
||||
pub wrap: *mut crate::squeezelite_h::u8_t,
|
||||
pub size: crate::stddef_h::size_t,
|
||||
pub base_size: crate::stddef_h::size_t,
|
||||
pub mutex: crate::stdlib::pthread_mutex_t,
|
||||
}
|
1
src/stdarg_h.rs
Normal file
1
src/stdarg_h.rs
Normal file
@ -0,0 +1 @@
|
||||
pub type va_list = crate::internal::__builtin_va_list;
|
1
src/stddef_h.rs
Normal file
1
src/stddef_h.rs
Normal file
@ -0,0 +1 @@
|
||||
pub type size_t = libc::c_ulong;
|
2259
src/stdlib.rs
Normal file
2259
src/stdlib.rs
Normal file
File diff suppressed because it is too large
Load Diff
1128
src/stream.rs
Normal file
1128
src/stream.rs
Normal file
File diff suppressed because it is too large
Load Diff
817
src/utils.rs
Normal file
817
src/utils.rs
Normal file
@ -0,0 +1,817 @@
|
||||
use ::c2rust_asm_casts;
|
||||
use ::libc;
|
||||
|
||||
pub use crate::internal::__builtin_va_list;
|
||||
pub use crate::internal::__va_list_tag;
|
||||
pub use crate::stdarg_h::va_list;
|
||||
pub use crate::stddef_h::size_t;
|
||||
use c2rust_asm_casts::AsmCastTrait;
|
||||
|
||||
pub use crate::stdlib::_IO_codecvt;
|
||||
pub use crate::stdlib::_IO_lock_t;
|
||||
pub use crate::stdlib::_IO_marker;
|
||||
pub use crate::stdlib::_IO_wide_data;
|
||||
pub use crate::stdlib::__caddr_t;
|
||||
pub use crate::stdlib::__clockid_t;
|
||||
pub use crate::stdlib::__off64_t;
|
||||
pub use crate::stdlib::__off_t;
|
||||
pub use crate::stdlib::__socklen_t;
|
||||
pub use crate::stdlib::__suseconds_t;
|
||||
pub use crate::stdlib::__syscall_slong_t;
|
||||
pub use crate::stdlib::__time_t;
|
||||
pub use crate::stdlib::__uint16_t;
|
||||
pub use crate::stdlib::__uint32_t;
|
||||
pub use crate::stdlib::__uint64_t;
|
||||
pub use crate::stdlib::__uint8_t;
|
||||
pub use crate::stdlib::clockid_t;
|
||||
pub use crate::stdlib::time_t;
|
||||
pub use crate::stdlib::timespec;
|
||||
pub use crate::stdlib::timeval;
|
||||
pub use crate::stdlib::u_int16_t;
|
||||
pub use crate::stdlib::u_int32_t;
|
||||
pub use crate::stdlib::u_int8_t;
|
||||
pub use crate::stdlib::FILE;
|
||||
pub use crate::stdlib::_IO_FILE;
|
||||
|
||||
pub use crate::stdlib::__fd_mask;
|
||||
pub use crate::stdlib::__socket_type;
|
||||
pub use crate::stdlib::close;
|
||||
pub use crate::stdlib::fd_set;
|
||||
pub use crate::stdlib::sa_family_t;
|
||||
pub use crate::stdlib::select;
|
||||
pub use crate::stdlib::sockaddr;
|
||||
pub use crate::stdlib::socklen_t;
|
||||
pub use crate::stdlib::sysconf;
|
||||
pub use crate::stdlib::uint16_t;
|
||||
pub use crate::stdlib::uint32_t;
|
||||
pub use crate::stdlib::uint64_t;
|
||||
pub use crate::stdlib::C2RustUnnamed_0;
|
||||
pub use crate::stdlib::SOCK_CLOEXEC;
|
||||
pub use crate::stdlib::SOCK_DCCP;
|
||||
pub use crate::stdlib::SOCK_DGRAM;
|
||||
pub use crate::stdlib::SOCK_NONBLOCK;
|
||||
pub use crate::stdlib::SOCK_PACKET;
|
||||
pub use crate::stdlib::SOCK_RAW;
|
||||
pub use crate::stdlib::SOCK_RDM;
|
||||
pub use crate::stdlib::SOCK_SEQPACKET;
|
||||
pub use crate::stdlib::SOCK_STREAM;
|
||||
pub use crate::stdlib::_SC_2_CHAR_TERM;
|
||||
pub use crate::stdlib::_SC_2_C_BIND;
|
||||
pub use crate::stdlib::_SC_2_C_DEV;
|
||||
pub use crate::stdlib::_SC_2_C_VERSION;
|
||||
pub use crate::stdlib::_SC_2_FORT_DEV;
|
||||
pub use crate::stdlib::_SC_2_FORT_RUN;
|
||||
pub use crate::stdlib::_SC_2_LOCALEDEF;
|
||||
pub use crate::stdlib::_SC_2_PBS;
|
||||
pub use crate::stdlib::_SC_2_PBS_ACCOUNTING;
|
||||
pub use crate::stdlib::_SC_2_PBS_CHECKPOINT;
|
||||
pub use crate::stdlib::_SC_2_PBS_LOCATE;
|
||||
pub use crate::stdlib::_SC_2_PBS_MESSAGE;
|
||||
pub use crate::stdlib::_SC_2_PBS_TRACK;
|
||||
pub use crate::stdlib::_SC_2_SW_DEV;
|
||||
pub use crate::stdlib::_SC_2_UPE;
|
||||
pub use crate::stdlib::_SC_2_VERSION;
|
||||
pub use crate::stdlib::_SC_ADVISORY_INFO;
|
||||
pub use crate::stdlib::_SC_AIO_LISTIO_MAX;
|
||||
pub use crate::stdlib::_SC_AIO_MAX;
|
||||
pub use crate::stdlib::_SC_AIO_PRIO_DELTA_MAX;
|
||||
pub use crate::stdlib::_SC_ARG_MAX;
|
||||
pub use crate::stdlib::_SC_ASYNCHRONOUS_IO;
|
||||
pub use crate::stdlib::_SC_ATEXIT_MAX;
|
||||
pub use crate::stdlib::_SC_AVPHYS_PAGES;
|
||||
pub use crate::stdlib::_SC_BARRIERS;
|
||||
pub use crate::stdlib::_SC_BASE;
|
||||
pub use crate::stdlib::_SC_BC_BASE_MAX;
|
||||
pub use crate::stdlib::_SC_BC_DIM_MAX;
|
||||
pub use crate::stdlib::_SC_BC_SCALE_MAX;
|
||||
pub use crate::stdlib::_SC_BC_STRING_MAX;
|
||||
pub use crate::stdlib::_SC_CHARCLASS_NAME_MAX;
|
||||
pub use crate::stdlib::_SC_CHAR_BIT;
|
||||
pub use crate::stdlib::_SC_CHAR_MAX;
|
||||
pub use crate::stdlib::_SC_CHAR_MIN;
|
||||
pub use crate::stdlib::_SC_CHILD_MAX;
|
||||
pub use crate::stdlib::_SC_CLK_TCK;
|
||||
pub use crate::stdlib::_SC_CLOCK_SELECTION;
|
||||
pub use crate::stdlib::_SC_COLL_WEIGHTS_MAX;
|
||||
pub use crate::stdlib::_SC_CPUTIME;
|
||||
pub use crate::stdlib::_SC_C_LANG_SUPPORT;
|
||||
pub use crate::stdlib::_SC_C_LANG_SUPPORT_R;
|
||||
pub use crate::stdlib::_SC_DELAYTIMER_MAX;
|
||||
pub use crate::stdlib::_SC_DEVICE_IO;
|
||||
pub use crate::stdlib::_SC_DEVICE_SPECIFIC;
|
||||
pub use crate::stdlib::_SC_DEVICE_SPECIFIC_R;
|
||||
pub use crate::stdlib::_SC_EQUIV_CLASS_MAX;
|
||||
pub use crate::stdlib::_SC_EXPR_NEST_MAX;
|
||||
pub use crate::stdlib::_SC_FD_MGMT;
|
||||
pub use crate::stdlib::_SC_FIFO;
|
||||
pub use crate::stdlib::_SC_FILE_ATTRIBUTES;
|
||||
pub use crate::stdlib::_SC_FILE_LOCKING;
|
||||
pub use crate::stdlib::_SC_FILE_SYSTEM;
|
||||
pub use crate::stdlib::_SC_FSYNC;
|
||||
pub use crate::stdlib::_SC_GETGR_R_SIZE_MAX;
|
||||
pub use crate::stdlib::_SC_GETPW_R_SIZE_MAX;
|
||||
pub use crate::stdlib::_SC_HOST_NAME_MAX;
|
||||
pub use crate::stdlib::_SC_INT_MAX;
|
||||
pub use crate::stdlib::_SC_INT_MIN;
|
||||
pub use crate::stdlib::_SC_IOV_MAX;
|
||||
pub use crate::stdlib::_SC_IPV6;
|
||||
pub use crate::stdlib::_SC_JOB_CONTROL;
|
||||
pub use crate::stdlib::_SC_LEVEL1_DCACHE_ASSOC;
|
||||
pub use crate::stdlib::_SC_LEVEL1_DCACHE_LINESIZE;
|
||||
pub use crate::stdlib::_SC_LEVEL1_DCACHE_SIZE;
|
||||
pub use crate::stdlib::_SC_LEVEL1_ICACHE_ASSOC;
|
||||
pub use crate::stdlib::_SC_LEVEL1_ICACHE_LINESIZE;
|
||||
pub use crate::stdlib::_SC_LEVEL1_ICACHE_SIZE;
|
||||
pub use crate::stdlib::_SC_LEVEL2_CACHE_ASSOC;
|
||||
pub use crate::stdlib::_SC_LEVEL2_CACHE_LINESIZE;
|
||||
pub use crate::stdlib::_SC_LEVEL2_CACHE_SIZE;
|
||||
pub use crate::stdlib::_SC_LEVEL3_CACHE_ASSOC;
|
||||
pub use crate::stdlib::_SC_LEVEL3_CACHE_LINESIZE;
|
||||
pub use crate::stdlib::_SC_LEVEL3_CACHE_SIZE;
|
||||
pub use crate::stdlib::_SC_LEVEL4_CACHE_ASSOC;
|
||||
pub use crate::stdlib::_SC_LEVEL4_CACHE_LINESIZE;
|
||||
pub use crate::stdlib::_SC_LEVEL4_CACHE_SIZE;
|
||||
pub use crate::stdlib::_SC_LINE_MAX;
|
||||
pub use crate::stdlib::_SC_LOGIN_NAME_MAX;
|
||||
pub use crate::stdlib::_SC_LONG_BIT;
|
||||
pub use crate::stdlib::_SC_MAPPED_FILES;
|
||||
pub use crate::stdlib::_SC_MB_LEN_MAX;
|
||||
pub use crate::stdlib::_SC_MEMLOCK;
|
||||
pub use crate::stdlib::_SC_MEMLOCK_RANGE;
|
||||
pub use crate::stdlib::_SC_MEMORY_PROTECTION;
|
||||
pub use crate::stdlib::_SC_MESSAGE_PASSING;
|
||||
pub use crate::stdlib::_SC_MONOTONIC_CLOCK;
|
||||
pub use crate::stdlib::_SC_MQ_OPEN_MAX;
|
||||
pub use crate::stdlib::_SC_MQ_PRIO_MAX;
|
||||
pub use crate::stdlib::_SC_MULTI_PROCESS;
|
||||
pub use crate::stdlib::_SC_NETWORKING;
|
||||
pub use crate::stdlib::_SC_NGROUPS_MAX;
|
||||
pub use crate::stdlib::_SC_NL_ARGMAX;
|
||||
pub use crate::stdlib::_SC_NL_LANGMAX;
|
||||
pub use crate::stdlib::_SC_NL_MSGMAX;
|
||||
pub use crate::stdlib::_SC_NL_NMAX;
|
||||
pub use crate::stdlib::_SC_NL_SETMAX;
|
||||
pub use crate::stdlib::_SC_NL_TEXTMAX;
|
||||
pub use crate::stdlib::_SC_NPROCESSORS_CONF;
|
||||
pub use crate::stdlib::_SC_NPROCESSORS_ONLN;
|
||||
pub use crate::stdlib::_SC_NZERO;
|
||||
pub use crate::stdlib::_SC_OPEN_MAX;
|
||||
pub use crate::stdlib::_SC_PAGESIZE;
|
||||
pub use crate::stdlib::_SC_PASS_MAX;
|
||||
pub use crate::stdlib::_SC_PHYS_PAGES;
|
||||
pub use crate::stdlib::_SC_PII;
|
||||
pub use crate::stdlib::_SC_PII_INTERNET;
|
||||
pub use crate::stdlib::_SC_PII_INTERNET_DGRAM;
|
||||
pub use crate::stdlib::_SC_PII_INTERNET_STREAM;
|
||||
pub use crate::stdlib::_SC_PII_OSI;
|
||||
pub use crate::stdlib::_SC_PII_OSI_CLTS;
|
||||
pub use crate::stdlib::_SC_PII_OSI_COTS;
|
||||
pub use crate::stdlib::_SC_PII_OSI_M;
|
||||
pub use crate::stdlib::_SC_PII_SOCKET;
|
||||
pub use crate::stdlib::_SC_PII_XTI;
|
||||
pub use crate::stdlib::_SC_PIPE;
|
||||
pub use crate::stdlib::_SC_POLL;
|
||||
pub use crate::stdlib::_SC_PRIORITIZED_IO;
|
||||
pub use crate::stdlib::_SC_PRIORITY_SCHEDULING;
|
||||
pub use crate::stdlib::_SC_RAW_SOCKETS;
|
||||
pub use crate::stdlib::_SC_READER_WRITER_LOCKS;
|
||||
pub use crate::stdlib::_SC_REALTIME_SIGNALS;
|
||||
pub use crate::stdlib::_SC_REGEXP;
|
||||
pub use crate::stdlib::_SC_REGEX_VERSION;
|
||||
pub use crate::stdlib::_SC_RE_DUP_MAX;
|
||||
pub use crate::stdlib::_SC_RTSIG_MAX;
|
||||
pub use crate::stdlib::_SC_SAVED_IDS;
|
||||
pub use crate::stdlib::_SC_SCHAR_MAX;
|
||||
pub use crate::stdlib::_SC_SCHAR_MIN;
|
||||
pub use crate::stdlib::_SC_SELECT;
|
||||
pub use crate::stdlib::_SC_SEMAPHORES;
|
||||
pub use crate::stdlib::_SC_SEM_NSEMS_MAX;
|
||||
pub use crate::stdlib::_SC_SEM_VALUE_MAX;
|
||||
pub use crate::stdlib::_SC_SHARED_MEMORY_OBJECTS;
|
||||
pub use crate::stdlib::_SC_SHELL;
|
||||
pub use crate::stdlib::_SC_SHRT_MAX;
|
||||
pub use crate::stdlib::_SC_SHRT_MIN;
|
||||
pub use crate::stdlib::_SC_SIGNALS;
|
||||
pub use crate::stdlib::_SC_SIGQUEUE_MAX;
|
||||
pub use crate::stdlib::_SC_SINGLE_PROCESS;
|
||||
pub use crate::stdlib::_SC_SPAWN;
|
||||
pub use crate::stdlib::_SC_SPIN_LOCKS;
|
||||
pub use crate::stdlib::_SC_SPORADIC_SERVER;
|
||||
pub use crate::stdlib::_SC_SSIZE_MAX;
|
||||
pub use crate::stdlib::_SC_SS_REPL_MAX;
|
||||
pub use crate::stdlib::_SC_STREAMS;
|
||||
pub use crate::stdlib::_SC_STREAM_MAX;
|
||||
pub use crate::stdlib::_SC_SYMLOOP_MAX;
|
||||
pub use crate::stdlib::_SC_SYNCHRONIZED_IO;
|
||||
pub use crate::stdlib::_SC_SYSTEM_DATABASE;
|
||||
pub use crate::stdlib::_SC_SYSTEM_DATABASE_R;
|
||||
pub use crate::stdlib::_SC_THREADS;
|
||||
pub use crate::stdlib::_SC_THREAD_ATTR_STACKADDR;
|
||||
pub use crate::stdlib::_SC_THREAD_ATTR_STACKSIZE;
|
||||
pub use crate::stdlib::_SC_THREAD_CPUTIME;
|
||||
pub use crate::stdlib::_SC_THREAD_DESTRUCTOR_ITERATIONS;
|
||||
pub use crate::stdlib::_SC_THREAD_KEYS_MAX;
|
||||
pub use crate::stdlib::_SC_THREAD_PRIORITY_SCHEDULING;
|
||||
pub use crate::stdlib::_SC_THREAD_PRIO_INHERIT;
|
||||
pub use crate::stdlib::_SC_THREAD_PRIO_PROTECT;
|
||||
pub use crate::stdlib::_SC_THREAD_PROCESS_SHARED;
|
||||
pub use crate::stdlib::_SC_THREAD_ROBUST_PRIO_INHERIT;
|
||||
pub use crate::stdlib::_SC_THREAD_ROBUST_PRIO_PROTECT;
|
||||
pub use crate::stdlib::_SC_THREAD_SAFE_FUNCTIONS;
|
||||
pub use crate::stdlib::_SC_THREAD_SPORADIC_SERVER;
|
||||
pub use crate::stdlib::_SC_THREAD_STACK_MIN;
|
||||
pub use crate::stdlib::_SC_THREAD_THREADS_MAX;
|
||||
pub use crate::stdlib::_SC_TIMEOUTS;
|
||||
pub use crate::stdlib::_SC_TIMERS;
|
||||
pub use crate::stdlib::_SC_TIMER_MAX;
|
||||
pub use crate::stdlib::_SC_TRACE;
|
||||
pub use crate::stdlib::_SC_TRACE_EVENT_FILTER;
|
||||
pub use crate::stdlib::_SC_TRACE_EVENT_NAME_MAX;
|
||||
pub use crate::stdlib::_SC_TRACE_INHERIT;
|
||||
pub use crate::stdlib::_SC_TRACE_LOG;
|
||||
pub use crate::stdlib::_SC_TRACE_NAME_MAX;
|
||||
pub use crate::stdlib::_SC_TRACE_SYS_MAX;
|
||||
pub use crate::stdlib::_SC_TRACE_USER_EVENT_MAX;
|
||||
pub use crate::stdlib::_SC_TTY_NAME_MAX;
|
||||
pub use crate::stdlib::_SC_TYPED_MEMORY_OBJECTS;
|
||||
pub use crate::stdlib::_SC_TZNAME_MAX;
|
||||
pub use crate::stdlib::_SC_T_IOV_MAX;
|
||||
pub use crate::stdlib::_SC_UCHAR_MAX;
|
||||
pub use crate::stdlib::_SC_UINT_MAX;
|
||||
pub use crate::stdlib::_SC_UIO_MAXIOV;
|
||||
pub use crate::stdlib::_SC_ULONG_MAX;
|
||||
pub use crate::stdlib::_SC_USER_GROUPS;
|
||||
pub use crate::stdlib::_SC_USER_GROUPS_R;
|
||||
pub use crate::stdlib::_SC_USHRT_MAX;
|
||||
pub use crate::stdlib::_SC_V6_ILP32_OFF32;
|
||||
pub use crate::stdlib::_SC_V6_ILP32_OFFBIG;
|
||||
pub use crate::stdlib::_SC_V6_LP64_OFF64;
|
||||
pub use crate::stdlib::_SC_V6_LPBIG_OFFBIG;
|
||||
pub use crate::stdlib::_SC_V7_ILP32_OFF32;
|
||||
pub use crate::stdlib::_SC_V7_ILP32_OFFBIG;
|
||||
pub use crate::stdlib::_SC_V7_LP64_OFF64;
|
||||
pub use crate::stdlib::_SC_V7_LPBIG_OFFBIG;
|
||||
pub use crate::stdlib::_SC_VERSION;
|
||||
pub use crate::stdlib::_SC_WORD_BIT;
|
||||
pub use crate::stdlib::_SC_XBS5_ILP32_OFF32;
|
||||
pub use crate::stdlib::_SC_XBS5_ILP32_OFFBIG;
|
||||
pub use crate::stdlib::_SC_XBS5_LP64_OFF64;
|
||||
pub use crate::stdlib::_SC_XBS5_LPBIG_OFFBIG;
|
||||
pub use crate::stdlib::_SC_XOPEN_CRYPT;
|
||||
pub use crate::stdlib::_SC_XOPEN_ENH_I18N;
|
||||
pub use crate::stdlib::_SC_XOPEN_LEGACY;
|
||||
pub use crate::stdlib::_SC_XOPEN_REALTIME;
|
||||
pub use crate::stdlib::_SC_XOPEN_REALTIME_THREADS;
|
||||
pub use crate::stdlib::_SC_XOPEN_SHM;
|
||||
pub use crate::stdlib::_SC_XOPEN_STREAMS;
|
||||
pub use crate::stdlib::_SC_XOPEN_UNIX;
|
||||
pub use crate::stdlib::_SC_XOPEN_VERSION;
|
||||
pub use crate::stdlib::_SC_XOPEN_XCU_VERSION;
|
||||
pub use crate::stdlib::_SC_XOPEN_XPG2;
|
||||
pub use crate::stdlib::_SC_XOPEN_XPG3;
|
||||
pub use crate::stdlib::_SC_XOPEN_XPG4;
|
||||
|
||||
pub use crate::stdlib::__timezone_ptr_t;
|
||||
pub use crate::stdlib::gettimeofday;
|
||||
pub use crate::stdlib::in_addr;
|
||||
pub use crate::stdlib::in_addr_t;
|
||||
pub use crate::stdlib::in_port_t;
|
||||
pub use crate::stdlib::nfds_t;
|
||||
pub use crate::stdlib::poll;
|
||||
pub use crate::stdlib::pollfd;
|
||||
pub use crate::stdlib::sockaddr_in;
|
||||
pub use crate::stdlib::timezone;
|
||||
pub use crate::stdlib::tm;
|
||||
|
||||
pub use crate::squeezelite_h::event_type;
|
||||
pub use crate::squeezelite_h::sockfd;
|
||||
pub use crate::squeezelite_h::u16_t;
|
||||
pub use crate::squeezelite_h::u32_t;
|
||||
pub use crate::squeezelite_h::u8_t;
|
||||
pub use crate::squeezelite_h::EVENT_READ;
|
||||
pub use crate::squeezelite_h::EVENT_TIMEOUT;
|
||||
pub use crate::squeezelite_h::EVENT_WAKE;
|
||||
use crate::stdlib::__errno_location;
|
||||
pub use crate::stdlib::addrinfo;
|
||||
use crate::stdlib::atoi;
|
||||
pub use crate::stdlib::eventfd_read;
|
||||
pub use crate::stdlib::eventfd_t;
|
||||
use crate::stdlib::fflush;
|
||||
pub use crate::stdlib::freeaddrinfo;
|
||||
pub use crate::stdlib::getaddrinfo;
|
||||
use crate::stdlib::getenv;
|
||||
pub use crate::stdlib::ifconf;
|
||||
pub use crate::stdlib::ifmap;
|
||||
pub use crate::stdlib::ifreq;
|
||||
use crate::stdlib::memcpy;
|
||||
use crate::stdlib::memset;
|
||||
use crate::stdlib::sprintf;
|
||||
use crate::stdlib::sscanf;
|
||||
use crate::stdlib::stderr;
|
||||
use crate::stdlib::strchr;
|
||||
use crate::stdlib::strlen;
|
||||
use crate::stdlib::strncpy;
|
||||
use crate::stdlib::strtok;
|
||||
use crate::stdlib::vfprintf;
|
||||
pub use crate::stdlib::C2RustUnnamed_20;
|
||||
pub use crate::stdlib::C2RustUnnamed_21;
|
||||
pub use crate::stdlib::C2RustUnnamed_22;
|
||||
|
||||
use crate::stdlib::clock_gettime;
|
||||
use crate::stdlib::connect;
|
||||
use crate::stdlib::fcntl;
|
||||
use crate::stdlib::getsockopt;
|
||||
use crate::stdlib::ioctl;
|
||||
use crate::stdlib::localtime;
|
||||
use crate::stdlib::socket;
|
||||
use crate::stdlib::strftime;
|
||||
/*
|
||||
* Squeezelite - lightweight headless squeezebox emulator
|
||||
*
|
||||
* (c) Adrian Smith 2012-2015, triode1@btinternet.com
|
||||
* Ralph Irving 2015-2017, ralph_irving@hotmail.com
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
// logging functions
|
||||
#[no_mangle]
|
||||
|
||||
pub unsafe extern "C" fn logtime() -> *const libc::c_char {
|
||||
static mut buf: [libc::c_char; 100] = [0; 100];
|
||||
let mut tv = crate::stdlib::timeval {
|
||||
tv_sec: 0,
|
||||
tv_usec: 0,
|
||||
};
|
||||
crate::stdlib::gettimeofday(&mut tv, 0 as *mut crate::stdlib::timezone);
|
||||
crate::stdlib::strftime(
|
||||
buf.as_mut_ptr(),
|
||||
::std::mem::size_of::<[libc::c_char; 100]>() as libc::c_ulong,
|
||||
b"[%T.\x00" as *const u8 as *const libc::c_char,
|
||||
crate::stdlib::localtime(&mut tv.tv_sec),
|
||||
);
|
||||
crate::stdlib::sprintf(
|
||||
buf.as_mut_ptr()
|
||||
.offset(crate::stdlib::strlen(buf.as_mut_ptr()) as isize),
|
||||
b"%06ld]\x00" as *const u8 as *const libc::c_char,
|
||||
tv.tv_usec,
|
||||
);
|
||||
return buf.as_mut_ptr();
|
||||
}
|
||||
#[no_mangle]
|
||||
|
||||
pub unsafe extern "C" fn logprint(mut fmt: *const libc::c_char, mut args: ...) {
|
||||
let mut args_0: ::std::ffi::VaListImpl;
|
||||
args_0 = args.clone();
|
||||
crate::stdlib::vfprintf(crate::stdlib::stderr, fmt, args_0.as_va_list());
|
||||
crate::stdlib::fflush(crate::stdlib::stderr);
|
||||
}
|
||||
// cmdline parsing
|
||||
#[no_mangle]
|
||||
|
||||
pub unsafe extern "C" fn next_param(
|
||||
mut src: *mut libc::c_char,
|
||||
mut c: libc::c_char,
|
||||
) -> *mut libc::c_char {
|
||||
static mut str: *mut libc::c_char = 0 as *const libc::c_char as *mut libc::c_char;
|
||||
let mut ptr = 0 as *mut libc::c_char;
|
||||
let mut ret = 0 as *mut libc::c_char;
|
||||
if !src.is_null() {
|
||||
str = src
|
||||
}
|
||||
if !str.is_null() && {
|
||||
ptr = crate::stdlib::strchr(str, c as libc::c_int);
|
||||
!ptr.is_null()
|
||||
} {
|
||||
ret = str;
|
||||
*ptr = '\u{0}' as i32 as libc::c_char;
|
||||
str = ptr.offset(1 as libc::c_int as isize)
|
||||
} else {
|
||||
ret = str;
|
||||
str = 0 as *mut libc::c_char
|
||||
}
|
||||
return if !ret.is_null() && *ret.offset(0 as libc::c_int as isize) as libc::c_int != 0 {
|
||||
ret
|
||||
} else {
|
||||
0 as *mut libc::c_char
|
||||
};
|
||||
}
|
||||
// clock
|
||||
#[no_mangle]
|
||||
|
||||
pub unsafe extern "C" fn gettime_ms() -> crate::squeezelite_h::u32_t {
|
||||
let mut ts = crate::stdlib::timespec {
|
||||
tv_sec: 0,
|
||||
tv_nsec: 0,
|
||||
};
|
||||
if crate::stdlib::clock_gettime(1 as libc::c_int, &mut ts) == 0 {
|
||||
return (ts.tv_sec * 1000 as libc::c_int as libc::c_long
|
||||
+ ts.tv_nsec / 1000000 as libc::c_int as libc::c_long)
|
||||
as crate::squeezelite_h::u32_t;
|
||||
}
|
||||
let mut tv = crate::stdlib::timeval {
|
||||
tv_sec: 0,
|
||||
tv_usec: 0,
|
||||
};
|
||||
crate::stdlib::gettimeofday(&mut tv, 0 as *mut crate::stdlib::timezone);
|
||||
return (tv.tv_sec * 1000 as libc::c_int as libc::c_long
|
||||
+ tv.tv_usec / 1000 as libc::c_int as libc::c_long)
|
||||
as crate::squeezelite_h::u32_t;
|
||||
}
|
||||
// mac address
|
||||
// search first 4 interfaces returned by IFCONF
|
||||
#[no_mangle]
|
||||
|
||||
pub unsafe extern "C" fn get_mac(mut mac: *mut crate::squeezelite_h::u8_t) {
|
||||
let mut utmac = 0 as *mut libc::c_char;
|
||||
let mut ifc = crate::stdlib::ifconf {
|
||||
ifc_len: 0,
|
||||
ifc_ifcu: crate::stdlib::C2RustUnnamed_22 {
|
||||
ifcu_buf: 0 as *mut libc::c_char,
|
||||
},
|
||||
};
|
||||
let mut ifr = 0 as *mut crate::stdlib::ifreq;
|
||||
let mut ifend = 0 as *mut crate::stdlib::ifreq;
|
||||
let mut ifreq = crate::stdlib::ifreq {
|
||||
ifr_ifrn: crate::stdlib::C2RustUnnamed_21 { ifrn_name: [0; 16] },
|
||||
ifr_ifru: crate::stdlib::C2RustUnnamed_20 {
|
||||
ifru_addr: crate::stdlib::sockaddr {
|
||||
sa_family: 0,
|
||||
sa_data: [0; 14],
|
||||
},
|
||||
},
|
||||
};
|
||||
let mut ifs: [crate::stdlib::ifreq; 4] = [crate::stdlib::ifreq {
|
||||
ifr_ifrn: crate::stdlib::C2RustUnnamed_21 { ifrn_name: [0; 16] },
|
||||
ifr_ifru: crate::stdlib::C2RustUnnamed_20 {
|
||||
ifru_addr: crate::stdlib::sockaddr {
|
||||
sa_family: 0,
|
||||
sa_data: [0; 14],
|
||||
},
|
||||
},
|
||||
}; 4];
|
||||
utmac = crate::stdlib::getenv(b"UTMAC\x00" as *const u8 as *const libc::c_char);
|
||||
if !utmac.is_null() {
|
||||
if crate::stdlib::strlen(utmac) == 17 as libc::c_int as libc::c_ulong {
|
||||
if crate::stdlib::sscanf(
|
||||
utmac,
|
||||
b"%2hhx:%2hhx:%2hhx:%2hhx:%2hhx:%2hhx\x00" as *const u8 as *const libc::c_char,
|
||||
&mut *mac.offset(0 as libc::c_int as isize) as *mut crate::squeezelite_h::u8_t,
|
||||
&mut *mac.offset(1 as libc::c_int as isize) as *mut crate::squeezelite_h::u8_t,
|
||||
&mut *mac.offset(2 as libc::c_int as isize) as *mut crate::squeezelite_h::u8_t,
|
||||
&mut *mac.offset(3 as libc::c_int as isize) as *mut crate::squeezelite_h::u8_t,
|
||||
&mut *mac.offset(4 as libc::c_int as isize) as *mut crate::squeezelite_h::u8_t,
|
||||
&mut *mac.offset(5 as libc::c_int as isize) as *mut crate::squeezelite_h::u8_t,
|
||||
) == 6 as libc::c_int
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
let ref mut fresh0 = *mac.offset(5 as libc::c_int as isize);
|
||||
*fresh0 = 0 as libc::c_int as crate::squeezelite_h::u8_t;
|
||||
let ref mut fresh1 = *mac.offset(4 as libc::c_int as isize);
|
||||
*fresh1 = *fresh0;
|
||||
let ref mut fresh2 = *mac.offset(3 as libc::c_int as isize);
|
||||
*fresh2 = *fresh1;
|
||||
let ref mut fresh3 = *mac.offset(2 as libc::c_int as isize);
|
||||
*fresh3 = *fresh2;
|
||||
let ref mut fresh4 = *mac.offset(1 as libc::c_int as isize);
|
||||
*fresh4 = *fresh3;
|
||||
*mac.offset(0 as libc::c_int as isize) = *fresh4;
|
||||
let mut s = crate::stdlib::socket(
|
||||
2 as libc::c_int,
|
||||
crate::stdlib::SOCK_DGRAM as libc::c_int,
|
||||
0 as libc::c_int,
|
||||
);
|
||||
ifc.ifc_len =
|
||||
::std::mem::size_of::<[crate::stdlib::ifreq; 4]>() as libc::c_ulong as libc::c_int;
|
||||
ifc.ifc_ifcu.ifcu_req = ifs.as_mut_ptr();
|
||||
if crate::stdlib::ioctl(
|
||||
s,
|
||||
0x8912 as libc::c_int as libc::c_ulong,
|
||||
&mut ifc as *mut crate::stdlib::ifconf,
|
||||
) == 0 as libc::c_int
|
||||
{
|
||||
ifend = ifs.as_mut_ptr().offset(
|
||||
(ifc.ifc_len as libc::c_ulong)
|
||||
.wrapping_div(::std::mem::size_of::<crate::stdlib::ifreq>() as libc::c_ulong)
|
||||
as isize,
|
||||
);
|
||||
ifr = ifc.ifc_ifcu.ifcu_req;
|
||||
while ifr < ifend {
|
||||
if (*ifr).ifr_ifru.ifru_addr.sa_family as libc::c_int == 2 as libc::c_int {
|
||||
crate::stdlib::strncpy(
|
||||
ifreq.ifr_ifrn.ifrn_name.as_mut_ptr(),
|
||||
(*ifr).ifr_ifrn.ifrn_name.as_mut_ptr(),
|
||||
(::std::mem::size_of::<[libc::c_char; 16]>() as libc::c_ulong)
|
||||
.wrapping_sub(1 as libc::c_int as libc::c_ulong),
|
||||
);
|
||||
if crate::stdlib::ioctl(
|
||||
s,
|
||||
0x8927 as libc::c_int as libc::c_ulong,
|
||||
&mut ifreq as *mut crate::stdlib::ifreq,
|
||||
) == 0 as libc::c_int
|
||||
{
|
||||
crate::stdlib::memcpy(
|
||||
mac as *mut libc::c_void,
|
||||
ifreq.ifr_ifru.ifru_hwaddr.sa_data.as_mut_ptr() as *const libc::c_void,
|
||||
6 as libc::c_int as libc::c_ulong,
|
||||
);
|
||||
if *mac.offset(0 as libc::c_int as isize) as libc::c_int
|
||||
+ *mac.offset(1 as libc::c_int as isize) as libc::c_int
|
||||
+ *mac.offset(2 as libc::c_int as isize) as libc::c_int
|
||||
!= 0 as libc::c_int
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
ifr = ifr.offset(1)
|
||||
}
|
||||
}
|
||||
crate::stdlib::close(s);
|
||||
}
|
||||
#[no_mangle]
|
||||
|
||||
pub unsafe extern "C" fn set_nonblock(mut s: crate::squeezelite_h::sockfd) {
|
||||
let mut flags = crate::stdlib::fcntl(s, 3 as libc::c_int, 0 as libc::c_int);
|
||||
crate::stdlib::fcntl(s, 4 as libc::c_int, flags | 0o4000 as libc::c_int);
|
||||
}
|
||||
// connect for socket already set to non blocking with timeout in seconds
|
||||
#[no_mangle]
|
||||
|
||||
pub unsafe extern "C" fn connect_timeout(
|
||||
mut sock: crate::squeezelite_h::sockfd,
|
||||
mut addr: *const crate::stdlib::sockaddr,
|
||||
mut addrlen: crate::stdlib::socklen_t,
|
||||
mut timeout: libc::c_int,
|
||||
) -> libc::c_int {
|
||||
let mut w = crate::stdlib::fd_set {
|
||||
__fds_bits: [0; 16],
|
||||
};
|
||||
let mut e = crate::stdlib::fd_set {
|
||||
__fds_bits: [0; 16],
|
||||
};
|
||||
let mut tval = crate::stdlib::timeval {
|
||||
tv_sec: 0,
|
||||
tv_usec: 0,
|
||||
};
|
||||
if crate::stdlib::connect(sock, addr, addrlen) < 0 as libc::c_int {
|
||||
if *crate::stdlib::__errno_location() != 115 as libc::c_int {
|
||||
return -(1 as libc::c_int);
|
||||
}
|
||||
}
|
||||
let mut __d0: libc::c_int = 0;
|
||||
let mut __d1: libc::c_int = 0;
|
||||
let fresh5 = &mut __d0;
|
||||
let fresh6;
|
||||
let fresh7 = &mut __d1;
|
||||
let fresh8;
|
||||
let fresh9 = (::std::mem::size_of::<crate::stdlib::fd_set>() as libc::c_ulong)
|
||||
.wrapping_div(::std::mem::size_of::<crate::stdlib::__fd_mask>() as libc::c_ulong);
|
||||
let fresh10 = &mut *w.__fds_bits.as_mut_ptr().offset(0 as libc::c_int as isize)
|
||||
as *mut crate::stdlib::__fd_mask;
|
||||
asm!("cld; rep; stosq" : "={cx}" (fresh6), "={di}" (fresh8) : "{ax}"
|
||||
(0 as libc::c_int), "0"
|
||||
(c2rust_asm_casts::AsmCast::cast_in(fresh5, fresh9)), "1"
|
||||
(c2rust_asm_casts::AsmCast::cast_in(fresh7, fresh10)) : "memory" :
|
||||
"volatile");
|
||||
c2rust_asm_casts::AsmCast::cast_out(fresh5, fresh9, fresh6);
|
||||
c2rust_asm_casts::AsmCast::cast_out(fresh7, fresh10, fresh8);
|
||||
w.__fds_bits[(sock
|
||||
/ (8 as libc::c_int
|
||||
* ::std::mem::size_of::<crate::stdlib::__fd_mask>() as libc::c_ulong as libc::c_int))
|
||||
as usize] |= ((1 as libc::c_ulong)
|
||||
<< sock
|
||||
% (8 as libc::c_int
|
||||
* ::std::mem::size_of::<crate::stdlib::__fd_mask>() as libc::c_ulong
|
||||
as libc::c_int)) as crate::stdlib::__fd_mask;
|
||||
e = w;
|
||||
tval.tv_sec = timeout as crate::stdlib::__time_t;
|
||||
tval.tv_usec = 0 as libc::c_int as crate::stdlib::__suseconds_t;
|
||||
// only return 0 if w set and sock error is zero, otherwise return error code
|
||||
if crate::stdlib::select(
|
||||
sock + 1 as libc::c_int,
|
||||
0 as *mut crate::stdlib::fd_set,
|
||||
&mut w,
|
||||
&mut e,
|
||||
(if timeout != 0 {
|
||||
&mut tval
|
||||
} else {
|
||||
0 as *mut crate::stdlib::timeval
|
||||
}),
|
||||
) == 1 as libc::c_int
|
||||
&& w.__fds_bits[(sock
|
||||
/ (8 as libc::c_int
|
||||
* ::std::mem::size_of::<crate::stdlib::__fd_mask>() as libc::c_ulong
|
||||
as libc::c_int)) as usize]
|
||||
& ((1 as libc::c_ulong)
|
||||
<< sock
|
||||
% (8 as libc::c_int
|
||||
* ::std::mem::size_of::<crate::stdlib::__fd_mask>() as libc::c_ulong
|
||||
as libc::c_int)) as crate::stdlib::__fd_mask
|
||||
!= 0 as libc::c_int as libc::c_long
|
||||
{
|
||||
let mut error = 0 as libc::c_int;
|
||||
let mut len =
|
||||
::std::mem::size_of::<libc::c_int>() as libc::c_ulong as crate::stdlib::socklen_t;
|
||||
crate::stdlib::getsockopt(
|
||||
sock,
|
||||
1 as libc::c_int,
|
||||
4 as libc::c_int,
|
||||
&mut error as *mut libc::c_int as *mut libc::c_void,
|
||||
&mut len,
|
||||
);
|
||||
return error;
|
||||
}
|
||||
return -(1 as libc::c_int);
|
||||
}
|
||||
#[no_mangle]
|
||||
|
||||
pub unsafe extern "C" fn server_addr(
|
||||
mut server: *mut libc::c_char,
|
||||
mut ip_ptr: *mut crate::stdlib::in_addr_t,
|
||||
mut port_ptr: *mut libc::c_uint,
|
||||
) {
|
||||
let mut res = 0 as *mut crate::stdlib::addrinfo;
|
||||
let mut hints = crate::stdlib::addrinfo {
|
||||
ai_flags: 0,
|
||||
ai_family: 0,
|
||||
ai_socktype: 0,
|
||||
ai_protocol: 0,
|
||||
ai_addrlen: 0,
|
||||
ai_addr: 0 as *mut crate::stdlib::sockaddr,
|
||||
ai_canonname: 0 as *mut libc::c_char,
|
||||
ai_next: 0 as *mut crate::stdlib::addrinfo,
|
||||
};
|
||||
let mut port = 0 as *const libc::c_char;
|
||||
if !crate::stdlib::strtok(server, b":\x00" as *const u8 as *const libc::c_char).is_null() {
|
||||
port = crate::stdlib::strtok(
|
||||
0 as *mut libc::c_char,
|
||||
b":\x00" as *const u8 as *const libc::c_char,
|
||||
);
|
||||
if !port.is_null() {
|
||||
*port_ptr = crate::stdlib::atoi(port) as libc::c_uint
|
||||
}
|
||||
}
|
||||
crate::stdlib::memset(
|
||||
&mut hints as *mut crate::stdlib::addrinfo as *mut libc::c_void,
|
||||
0 as libc::c_int,
|
||||
::std::mem::size_of::<crate::stdlib::addrinfo>() as libc::c_ulong,
|
||||
);
|
||||
hints.ai_family = 2 as libc::c_int;
|
||||
crate::stdlib::getaddrinfo(server, 0 as *const libc::c_char, &mut hints, &mut res);
|
||||
if !res.is_null() && !(*res).ai_addr.is_null() {
|
||||
*ip_ptr = (*((*res).ai_addr as *mut crate::stdlib::sockaddr_in))
|
||||
.sin_addr
|
||||
.s_addr
|
||||
}
|
||||
if !res.is_null() {
|
||||
crate::stdlib::freeaddrinfo(res);
|
||||
};
|
||||
}
|
||||
#[no_mangle]
|
||||
|
||||
pub unsafe extern "C" fn set_readwake_handles(
|
||||
mut handles: *mut crate::stdlib::pollfd,
|
||||
mut s: crate::squeezelite_h::sockfd,
|
||||
mut e: libc::c_int,
|
||||
) {
|
||||
(*handles.offset(0 as libc::c_int as isize)).fd = s;
|
||||
(*handles.offset(1 as libc::c_int as isize)).fd = e;
|
||||
(*handles.offset(0 as libc::c_int as isize)).events = 0x1 as libc::c_int as libc::c_short;
|
||||
(*handles.offset(1 as libc::c_int as isize)).events = 0x1 as libc::c_int as libc::c_short;
|
||||
}
|
||||
#[no_mangle]
|
||||
|
||||
pub unsafe extern "C" fn wait_readwake(
|
||||
mut handles: *mut crate::stdlib::pollfd,
|
||||
mut timeout: libc::c_int,
|
||||
) -> crate::squeezelite_h::event_type {
|
||||
if crate::stdlib::poll(handles, 2 as libc::c_int as crate::stdlib::nfds_t, timeout)
|
||||
> 0 as libc::c_int
|
||||
{
|
||||
if (*handles.offset(0 as libc::c_int as isize)).revents != 0 {
|
||||
return crate::squeezelite_h::EVENT_READ;
|
||||
}
|
||||
if (*handles.offset(1 as libc::c_int as isize)).revents != 0 {
|
||||
let mut val: crate::stdlib::eventfd_t = 0;
|
||||
crate::stdlib::eventfd_read((*handles.offset(1 as libc::c_int as isize)).fd, &mut val);
|
||||
return crate::squeezelite_h::EVENT_WAKE;
|
||||
}
|
||||
}
|
||||
return crate::squeezelite_h::EVENT_TIMEOUT;
|
||||
}
|
||||
// pack/unpack to network byte order
|
||||
#[no_mangle]
|
||||
|
||||
pub unsafe extern "C" fn packN(
|
||||
mut dest: *mut crate::squeezelite_h::u32_t,
|
||||
mut val: crate::squeezelite_h::u32_t,
|
||||
) {
|
||||
let mut ptr = dest as *mut crate::squeezelite_h::u8_t;
|
||||
*ptr = (val >> 24 as libc::c_int & 0xff as libc::c_int as libc::c_uint)
|
||||
as crate::squeezelite_h::u8_t;
|
||||
*ptr.offset(1 as libc::c_int as isize) = (val >> 16 as libc::c_int
|
||||
& 0xff as libc::c_int as libc::c_uint)
|
||||
as crate::squeezelite_h::u8_t;
|
||||
*ptr.offset(2 as libc::c_int as isize) = (val >> 8 as libc::c_int
|
||||
& 0xff as libc::c_int as libc::c_uint)
|
||||
as crate::squeezelite_h::u8_t;
|
||||
*ptr.offset(3 as libc::c_int as isize) =
|
||||
(val & 0xff as libc::c_int as libc::c_uint) as crate::squeezelite_h::u8_t;
|
||||
}
|
||||
#[no_mangle]
|
||||
|
||||
pub unsafe extern "C" fn packn(
|
||||
mut dest: *mut crate::squeezelite_h::u16_t,
|
||||
mut val: crate::squeezelite_h::u16_t,
|
||||
) {
|
||||
let mut ptr = dest as *mut crate::squeezelite_h::u8_t;
|
||||
*ptr = (val as libc::c_int >> 8 as libc::c_int & 0xff as libc::c_int)
|
||||
as crate::squeezelite_h::u8_t;
|
||||
*ptr.offset(1 as libc::c_int as isize) =
|
||||
(val as libc::c_int & 0xff as libc::c_int) as crate::squeezelite_h::u8_t;
|
||||
}
|
||||
#[no_mangle]
|
||||
|
||||
pub unsafe extern "C" fn unpackN(
|
||||
mut src: *mut crate::squeezelite_h::u32_t,
|
||||
) -> crate::squeezelite_h::u32_t {
|
||||
let mut ptr = src as *mut crate::squeezelite_h::u8_t;
|
||||
return ((*ptr as libc::c_int) << 24 as libc::c_int
|
||||
| (*ptr.offset(1 as libc::c_int as isize) as libc::c_int) << 16 as libc::c_int
|
||||
| (*ptr.offset(2 as libc::c_int as isize) as libc::c_int) << 8 as libc::c_int
|
||||
| *ptr.offset(3 as libc::c_int as isize) as libc::c_int)
|
||||
as crate::squeezelite_h::u32_t;
|
||||
}
|
||||
#[no_mangle]
|
||||
|
||||
pub unsafe extern "C" fn unpackn(
|
||||
mut src: *mut crate::squeezelite_h::u16_t,
|
||||
) -> crate::squeezelite_h::u16_t {
|
||||
let mut ptr = src as *mut crate::squeezelite_h::u8_t;
|
||||
return ((*ptr as libc::c_int) << 8 as libc::c_int
|
||||
| *ptr.offset(1 as libc::c_int as isize) as libc::c_int)
|
||||
as crate::squeezelite_h::u16_t;
|
||||
}
|
||||
/*
|
||||
* Squeezelite - lightweight headless squeezebox emulator
|
||||
*
|
||||
* (c) Adrian Smith 2012-2015, triode1@btinternet.com
|
||||
* Ralph Irving 2015-2017, ralph_irving@hotmail.com
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Additions (c) Paul Hermann, 2015-2017 under the same license terms
|
||||
* -Control of Raspberry pi GPIO for amplifier power
|
||||
* -Launch script on power status change from LMS
|
||||
*/
|
||||
// make may define: PORTAUDIO, SELFPIPE, RESAMPLE, RESAMPLE_MP, VISEXPORT, GPIO, IR, DSD, LINKALL to influence build
|
||||
// build detection
|
||||
// dynamically loaded libraries at run time
|
||||
// !LINKALL
|
||||
// config options
|
||||
// do not reduce as icy-meta max is 4080
|
||||
/* SUN */
|
||||
/* SUN */
|
||||
// printf/scanf formats for u64_t
|
||||
// logging
|
||||
// utils.c (non logging)
|
||||
#[no_mangle]
|
||||
|
||||
pub unsafe extern "C" fn touch_memory(
|
||||
mut buf: *mut crate::squeezelite_h::u8_t,
|
||||
mut size: crate::stddef_h::size_t,
|
||||
) {
|
||||
let mut ptr = 0 as *mut crate::squeezelite_h::u8_t;
|
||||
ptr = buf;
|
||||
while ptr < buf.offset(size as isize) {
|
||||
*ptr = 0 as libc::c_int as crate::squeezelite_h::u8_t;
|
||||
ptr =
|
||||
ptr.offset(crate::stdlib::sysconf(crate::stdlib::_SC_PAGESIZE as libc::c_int) as isize)
|
||||
}
|
||||
}
|
763
src/vorbis.rs
Normal file
763
src/vorbis.rs
Normal file
@ -0,0 +1,763 @@
|
||||
use ::libc;
|
||||
|
||||
pub use crate::stddef_h::size_t;
|
||||
|
||||
pub use crate::stdlib::__int16_t;
|
||||
pub use crate::stdlib::__int32_t;
|
||||
pub use crate::stdlib::__int64_t;
|
||||
pub use crate::stdlib::__pthread_internal_list;
|
||||
pub use crate::stdlib::__pthread_list_t;
|
||||
pub use crate::stdlib::__pthread_mutex_s;
|
||||
pub use crate::stdlib::__uint32_t;
|
||||
pub use crate::stdlib::__uint64_t;
|
||||
pub use crate::stdlib::__uint8_t;
|
||||
pub use crate::stdlib::int16_t;
|
||||
pub use crate::stdlib::int32_t;
|
||||
pub use crate::stdlib::int64_t;
|
||||
pub use crate::stdlib::pthread_mutex_t;
|
||||
pub use crate::stdlib::u_int32_t;
|
||||
pub use crate::stdlib::u_int64_t;
|
||||
pub use crate::stdlib::u_int8_t;
|
||||
|
||||
pub use crate::squeezelite_h::buffer;
|
||||
pub use crate::squeezelite_h::codec;
|
||||
pub use crate::squeezelite_h::decode_state;
|
||||
pub use crate::squeezelite_h::decodestate;
|
||||
pub use crate::squeezelite_h::disconnect_code;
|
||||
pub use crate::squeezelite_h::fade_dir;
|
||||
pub use crate::squeezelite_h::fade_mode;
|
||||
pub use crate::squeezelite_h::fade_state;
|
||||
pub use crate::squeezelite_h::frames_t;
|
||||
pub use crate::squeezelite_h::lDEBUG;
|
||||
pub use crate::squeezelite_h::lERROR;
|
||||
pub use crate::squeezelite_h::lINFO;
|
||||
pub use crate::squeezelite_h::lSDEBUG;
|
||||
pub use crate::squeezelite_h::lWARN;
|
||||
pub use crate::squeezelite_h::log_level;
|
||||
pub use crate::squeezelite_h::output_format;
|
||||
pub use crate::squeezelite_h::output_state;
|
||||
pub use crate::squeezelite_h::outputstate;
|
||||
pub use crate::squeezelite_h::s16_t;
|
||||
pub use crate::squeezelite_h::s32_t;
|
||||
pub use crate::squeezelite_h::stream_state;
|
||||
pub use crate::squeezelite_h::streamstate;
|
||||
pub use crate::squeezelite_h::u32_t;
|
||||
pub use crate::squeezelite_h::u64_t;
|
||||
pub use crate::squeezelite_h::u8_t;
|
||||
pub use crate::squeezelite_h::C2RustUnnamed_1;
|
||||
pub use crate::squeezelite_h::_buf_used;
|
||||
pub use crate::squeezelite_h::DECODE_COMPLETE;
|
||||
pub use crate::squeezelite_h::DECODE_ERROR;
|
||||
pub use crate::squeezelite_h::DECODE_READY;
|
||||
pub use crate::squeezelite_h::DECODE_RUNNING;
|
||||
pub use crate::squeezelite_h::DECODE_STOPPED;
|
||||
pub use crate::squeezelite_h::DISCONNECT;
|
||||
pub use crate::squeezelite_h::DISCONNECT_OK;
|
||||
pub use crate::squeezelite_h::FADE_ACTIVE;
|
||||
pub use crate::squeezelite_h::FADE_CROSS;
|
||||
pub use crate::squeezelite_h::FADE_CROSSFADE;
|
||||
pub use crate::squeezelite_h::FADE_DOWN;
|
||||
pub use crate::squeezelite_h::FADE_DUE;
|
||||
pub use crate::squeezelite_h::FADE_IN;
|
||||
pub use crate::squeezelite_h::FADE_INACTIVE;
|
||||
pub use crate::squeezelite_h::FADE_INOUT;
|
||||
pub use crate::squeezelite_h::FADE_NONE;
|
||||
pub use crate::squeezelite_h::FADE_OUT;
|
||||
pub use crate::squeezelite_h::FADE_UP;
|
||||
pub use crate::squeezelite_h::LOCAL_DISCONNECT;
|
||||
pub use crate::squeezelite_h::OUTPUT_BUFFER;
|
||||
pub use crate::squeezelite_h::OUTPUT_OFF;
|
||||
pub use crate::squeezelite_h::OUTPUT_PAUSE_FRAMES;
|
||||
pub use crate::squeezelite_h::OUTPUT_RUNNING;
|
||||
pub use crate::squeezelite_h::OUTPUT_SKIP_FRAMES;
|
||||
pub use crate::squeezelite_h::OUTPUT_START_AT;
|
||||
pub use crate::squeezelite_h::OUTPUT_STOPPED;
|
||||
pub use crate::squeezelite_h::RECV_HEADERS;
|
||||
pub use crate::squeezelite_h::REMOTE_DISCONNECT;
|
||||
pub use crate::squeezelite_h::S16_LE;
|
||||
pub use crate::squeezelite_h::S24_3LE;
|
||||
pub use crate::squeezelite_h::S24_LE;
|
||||
pub use crate::squeezelite_h::S32_LE;
|
||||
pub use crate::squeezelite_h::SEND_HEADERS;
|
||||
pub use crate::squeezelite_h::STOPPED;
|
||||
pub use crate::squeezelite_h::STREAMING_BUFFERING;
|
||||
pub use crate::squeezelite_h::STREAMING_FILE;
|
||||
pub use crate::squeezelite_h::STREAMING_HTTP;
|
||||
pub use crate::squeezelite_h::STREAMING_WAIT;
|
||||
pub use crate::squeezelite_h::TIMEOUT;
|
||||
pub use crate::squeezelite_h::UNREACHABLE;
|
||||
pub use crate::src::buffer::_buf_cont_read;
|
||||
pub use crate::src::buffer::_buf_cont_write;
|
||||
pub use crate::src::buffer::_buf_inc_readp;
|
||||
pub use crate::src::buffer::_buf_inc_writep;
|
||||
pub use crate::src::buffer::_buf_space;
|
||||
pub use crate::src::decode::decode_newstream;
|
||||
pub use crate::src::output::_checkfade;
|
||||
pub use crate::src::utils::logprint;
|
||||
pub use crate::src::utils::logtime;
|
||||
pub use crate::stdlib::ogg_int64_t;
|
||||
pub use crate::stdlib::ov_callbacks;
|
||||
pub use crate::stdlib::OggVorbis_File;
|
||||
|
||||
pub use crate::stdlib::alloc_chain;
|
||||
use crate::stdlib::dlerror;
|
||||
use crate::stdlib::dlopen;
|
||||
use crate::stdlib::dlsym;
|
||||
use crate::stdlib::free;
|
||||
use crate::stdlib::malloc;
|
||||
use crate::stdlib::memcpy;
|
||||
use crate::stdlib::memset;
|
||||
pub use crate::stdlib::ogg_stream_state;
|
||||
pub use crate::stdlib::ogg_sync_state;
|
||||
pub use crate::stdlib::oggpack_buffer;
|
||||
use crate::stdlib::pthread_mutex_lock;
|
||||
use crate::stdlib::pthread_mutex_unlock;
|
||||
pub use crate::stdlib::vorbis_block;
|
||||
pub use crate::stdlib::vorbis_comment;
|
||||
pub use crate::stdlib::vorbis_dsp_state;
|
||||
pub use crate::stdlib::vorbis_info;
|
||||
extern "C" {
|
||||
#[no_mangle]
|
||||
pub static mut loglevel: crate::squeezelite_h::log_level;
|
||||
#[no_mangle]
|
||||
pub static mut streambuf: *mut crate::squeezelite_h::buffer;
|
||||
#[no_mangle]
|
||||
pub static mut outputbuf: *mut crate::squeezelite_h::buffer;
|
||||
#[no_mangle]
|
||||
pub static mut stream: crate::squeezelite_h::streamstate;
|
||||
#[no_mangle]
|
||||
pub static mut output: crate::squeezelite_h::outputstate;
|
||||
#[no_mangle]
|
||||
pub static mut decode: crate::squeezelite_h::decodestate;
|
||||
}
|
||||
// automatically select between floating point (preferred) and fixed point libraries:
|
||||
// NOTE: works with Tremor version here: http://svn.xiph.org/trunk/Tremor, not vorbisidec.1.0.2 currently in ubuntu
|
||||
// we take common definations from <vorbis/vorbisfile.h> even though we can use tremor at run time
|
||||
// tremor's OggVorbis_File struct is normally smaller so this is ok, but padding added to malloc in case it is bigger
|
||||
|
||||
#[repr(C)]
|
||||
#[derive(Copy, Clone)]
|
||||
pub struct vorbis {
|
||||
pub vf: *mut crate::stdlib::OggVorbis_File,
|
||||
pub opened: bool,
|
||||
pub write_buf: *mut crate::squeezelite_h::u8_t,
|
||||
pub ov_info: Option<
|
||||
unsafe extern "C" fn(
|
||||
_: *mut crate::stdlib::OggVorbis_File,
|
||||
_: libc::c_int,
|
||||
) -> *mut crate::stdlib::vorbis_info,
|
||||
>,
|
||||
pub ov_clear:
|
||||
Option<unsafe extern "C" fn(_: *mut crate::stdlib::OggVorbis_File) -> libc::c_int>,
|
||||
pub ov_read: Option<
|
||||
unsafe extern "C" fn(
|
||||
_: *mut crate::stdlib::OggVorbis_File,
|
||||
_: *mut libc::c_char,
|
||||
_: libc::c_int,
|
||||
_: libc::c_int,
|
||||
_: libc::c_int,
|
||||
_: libc::c_int,
|
||||
_: *mut libc::c_int,
|
||||
) -> libc::c_long,
|
||||
>,
|
||||
pub ov_read_tremor: Option<
|
||||
unsafe extern "C" fn(
|
||||
_: *mut crate::stdlib::OggVorbis_File,
|
||||
_: *mut libc::c_char,
|
||||
_: libc::c_int,
|
||||
_: *mut libc::c_int,
|
||||
) -> libc::c_long,
|
||||
>,
|
||||
pub ov_open_callbacks: Option<
|
||||
unsafe extern "C" fn(
|
||||
_: *mut libc::c_void,
|
||||
_: *mut crate::stdlib::OggVorbis_File,
|
||||
_: *const libc::c_char,
|
||||
_: libc::c_long,
|
||||
_: crate::stdlib::ov_callbacks,
|
||||
) -> libc::c_int,
|
||||
>,
|
||||
}
|
||||
|
||||
static mut v: *mut vorbis = 0 as *const vorbis as *mut vorbis;
|
||||
// called with mutex locked within vorbis_decode to avoid locking O before S
|
||||
|
||||
unsafe extern "C" fn _read_cb(
|
||||
mut ptr: *mut libc::c_void,
|
||||
mut size: crate::stddef_h::size_t,
|
||||
mut nmemb: crate::stddef_h::size_t,
|
||||
mut datasource: *mut libc::c_void,
|
||||
) -> crate::stddef_h::size_t {
|
||||
let mut bytes: crate::stddef_h::size_t = 0;
|
||||
crate::stdlib::pthread_mutex_lock(&mut (*streambuf).mutex);
|
||||
bytes = if crate::squeezelite_h::_buf_used(streambuf)
|
||||
< crate::src::buffer::_buf_cont_read(streambuf)
|
||||
{
|
||||
crate::squeezelite_h::_buf_used(streambuf)
|
||||
} else {
|
||||
crate::src::buffer::_buf_cont_read(streambuf)
|
||||
} as crate::stddef_h::size_t;
|
||||
bytes = if bytes < size.wrapping_mul(nmemb) {
|
||||
bytes
|
||||
} else {
|
||||
size.wrapping_mul(nmemb)
|
||||
};
|
||||
crate::stdlib::memcpy(ptr, (*streambuf).readp as *const libc::c_void, bytes);
|
||||
crate::src::buffer::_buf_inc_readp(streambuf, bytes as libc::c_uint);
|
||||
crate::stdlib::pthread_mutex_unlock(&mut (*streambuf).mutex);
|
||||
return bytes.wrapping_div(size);
|
||||
}
|
||||
// these are needed for older versions of tremor, later versions and libvorbis allow NULL to be used
|
||||
|
||||
unsafe extern "C" fn _seek_cb(
|
||||
mut datasource: *mut libc::c_void,
|
||||
mut offset: crate::stdlib::ogg_int64_t,
|
||||
mut whence: libc::c_int,
|
||||
) -> libc::c_int {
|
||||
return -(1 as libc::c_int); // samples returned are 16 bits
|
||||
}
|
||||
|
||||
unsafe extern "C" fn _close_cb(mut datasource: *mut libc::c_void) -> libc::c_int {
|
||||
return 0 as libc::c_int;
|
||||
}
|
||||
|
||||
unsafe extern "C" fn _tell_cb(mut datasource: *mut libc::c_void) -> libc::c_long {
|
||||
return 0 as libc::c_int as libc::c_long;
|
||||
}
|
||||
|
||||
unsafe extern "C" fn vorbis_decode() -> crate::squeezelite_h::decode_state {
|
||||
static mut channels: libc::c_int = 0;
|
||||
let mut frames: crate::squeezelite_h::frames_t = 0;
|
||||
let mut bytes: libc::c_int = 0;
|
||||
let mut s: libc::c_int = 0;
|
||||
let mut n: libc::c_int = 0;
|
||||
let mut write_buf = 0 as *mut crate::squeezelite_h::u8_t;
|
||||
crate::stdlib::pthread_mutex_lock(&mut (*streambuf).mutex);
|
||||
if stream.state as libc::c_uint
|
||||
<= crate::squeezelite_h::DISCONNECT as libc::c_int as libc::c_uint
|
||||
&& crate::squeezelite_h::_buf_used(streambuf) == 0
|
||||
{
|
||||
crate::stdlib::pthread_mutex_unlock(&mut (*streambuf).mutex);
|
||||
return crate::squeezelite_h::DECODE_COMPLETE;
|
||||
}
|
||||
crate::stdlib::pthread_mutex_unlock(&mut (*streambuf).mutex);
|
||||
if decode.new_stream {
|
||||
let mut cbs = crate::stdlib::ov_callbacks {
|
||||
read_func: None,
|
||||
seek_func: None,
|
||||
close_func: None,
|
||||
tell_func: None,
|
||||
};
|
||||
let mut err: libc::c_int = 0;
|
||||
let mut info = 0 as *mut crate::stdlib::vorbis_info;
|
||||
cbs.read_func = Some(
|
||||
_read_cb
|
||||
as unsafe extern "C" fn(
|
||||
_: *mut libc::c_void,
|
||||
_: crate::stddef_h::size_t,
|
||||
_: crate::stddef_h::size_t,
|
||||
_: *mut libc::c_void,
|
||||
) -> crate::stddef_h::size_t,
|
||||
);
|
||||
if (*v).ov_read_tremor.is_some() {
|
||||
cbs.seek_func = Some(
|
||||
_seek_cb
|
||||
as unsafe extern "C" fn(
|
||||
_: *mut libc::c_void,
|
||||
_: crate::stdlib::ogg_int64_t,
|
||||
_: libc::c_int,
|
||||
) -> libc::c_int,
|
||||
);
|
||||
cbs.close_func =
|
||||
Some(_close_cb as unsafe extern "C" fn(_: *mut libc::c_void) -> libc::c_int);
|
||||
cbs.tell_func =
|
||||
Some(_tell_cb as unsafe extern "C" fn(_: *mut libc::c_void) -> libc::c_long)
|
||||
} else {
|
||||
cbs.seek_func = None;
|
||||
cbs.close_func = None;
|
||||
cbs.tell_func = None
|
||||
}
|
||||
err = (*v).ov_open_callbacks.expect("non-null function pointer")(
|
||||
streambuf as *mut libc::c_void,
|
||||
(*v).vf,
|
||||
0 as *const libc::c_char,
|
||||
0 as libc::c_int as libc::c_long,
|
||||
cbs,
|
||||
);
|
||||
if err < 0 as libc::c_int {
|
||||
if loglevel as libc::c_uint
|
||||
>= crate::squeezelite_h::lWARN as libc::c_int as libc::c_uint
|
||||
{
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d open_callbacks error: %d\n\x00" as *const u8 as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 14], &[libc::c_char; 14]>(
|
||||
b"vorbis_decode\x00",
|
||||
))
|
||||
.as_ptr(),
|
||||
162 as libc::c_int,
|
||||
err,
|
||||
);
|
||||
}
|
||||
return crate::squeezelite_h::DECODE_COMPLETE;
|
||||
}
|
||||
(*v).opened = 1 as libc::c_int != 0;
|
||||
info = (*v).ov_info.expect("non-null function pointer")((*v).vf, -(1 as libc::c_int));
|
||||
if loglevel as libc::c_uint >= crate::squeezelite_h::lINFO as libc::c_int as libc::c_uint {
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d setting track_start\n\x00" as *const u8 as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 14], &[libc::c_char; 14]>(b"vorbis_decode\x00"))
|
||||
.as_ptr(),
|
||||
169 as libc::c_int,
|
||||
);
|
||||
}
|
||||
crate::stdlib::pthread_mutex_lock(&mut (*outputbuf).mutex);
|
||||
output.next_sample_rate = crate::src::decode::decode_newstream(
|
||||
(*info).rate as libc::c_uint,
|
||||
output.supported_rates.as_mut_ptr(),
|
||||
);
|
||||
output.track_start = (*outputbuf).writep;
|
||||
if output.fade_mode as u64 != 0 {
|
||||
crate::src::output::_checkfade(1 as libc::c_int != 0);
|
||||
}
|
||||
decode.new_stream = 0 as libc::c_int != 0;
|
||||
crate::stdlib::pthread_mutex_unlock(&mut (*outputbuf).mutex);
|
||||
channels = (*info).channels;
|
||||
if channels > 2 as libc::c_int {
|
||||
if loglevel as libc::c_uint
|
||||
>= crate::squeezelite_h::lWARN as libc::c_int as libc::c_uint
|
||||
{
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d too many channels: %d\n\x00" as *const u8 as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 14], &[libc::c_char; 14]>(
|
||||
b"vorbis_decode\x00",
|
||||
))
|
||||
.as_ptr(),
|
||||
181 as libc::c_int,
|
||||
channels,
|
||||
);
|
||||
}
|
||||
return crate::squeezelite_h::DECODE_ERROR;
|
||||
}
|
||||
}
|
||||
frames = (if crate::src::buffer::_buf_space(outputbuf)
|
||||
< crate::src::buffer::_buf_cont_write(outputbuf)
|
||||
{
|
||||
crate::src::buffer::_buf_space(outputbuf)
|
||||
} else {
|
||||
crate::src::buffer::_buf_cont_write(outputbuf)
|
||||
})
|
||||
.wrapping_div(8 as libc::c_int as libc::c_uint);
|
||||
write_buf = (*v).write_buf;
|
||||
frames = if frames < 2048 as libc::c_int as libc::c_uint {
|
||||
frames
|
||||
} else {
|
||||
2048 as libc::c_int as libc::c_uint
|
||||
};
|
||||
bytes = frames
|
||||
.wrapping_mul(2 as libc::c_int as libc::c_uint)
|
||||
.wrapping_mul(channels as libc::c_uint) as libc::c_int;
|
||||
// write the decoded frames into outputbuf even though they are 16 bits per sample, then unpack them
|
||||
if (*v).ov_read_tremor.is_none() {
|
||||
n = (*v).ov_read.expect("non-null function pointer")(
|
||||
(*v).vf,
|
||||
write_buf as *mut libc::c_char,
|
||||
bytes,
|
||||
0 as libc::c_int,
|
||||
2 as libc::c_int,
|
||||
1 as libc::c_int,
|
||||
&mut s,
|
||||
) as libc::c_int
|
||||
} else {
|
||||
n = (*v).ov_read_tremor.expect("non-null function pointer")(
|
||||
(*v).vf,
|
||||
write_buf as *mut libc::c_char,
|
||||
bytes,
|
||||
&mut s,
|
||||
) as libc::c_int
|
||||
}
|
||||
crate::stdlib::pthread_mutex_lock(&mut (*outputbuf).mutex);
|
||||
if n > 0 as libc::c_int {
|
||||
let mut count: crate::squeezelite_h::frames_t = 0;
|
||||
let mut iptr = 0 as *mut crate::squeezelite_h::s16_t;
|
||||
let mut optr = 0 as *mut crate::squeezelite_h::s32_t;
|
||||
frames = (n / 2 as libc::c_int / channels) as crate::squeezelite_h::frames_t;
|
||||
count = frames.wrapping_mul(channels as libc::c_uint);
|
||||
iptr = (write_buf as *mut crate::squeezelite_h::s16_t).offset(count as isize);
|
||||
optr = ((*outputbuf).writep as *mut crate::squeezelite_h::s32_t)
|
||||
.offset(frames.wrapping_mul(2 as libc::c_int as libc::c_uint) as isize);
|
||||
if channels == 2 as libc::c_int {
|
||||
loop {
|
||||
let fresh0 = count;
|
||||
count = count.wrapping_sub(1);
|
||||
if !(fresh0 != 0) {
|
||||
break;
|
||||
}
|
||||
iptr = iptr.offset(-1);
|
||||
optr = optr.offset(-1);
|
||||
*optr = (*iptr as libc::c_int) << 16 as libc::c_int
|
||||
}
|
||||
} else if channels == 1 as libc::c_int {
|
||||
loop {
|
||||
let fresh1 = count;
|
||||
count = count.wrapping_sub(1);
|
||||
if !(fresh1 != 0) {
|
||||
break;
|
||||
}
|
||||
iptr = iptr.offset(-1);
|
||||
optr = optr.offset(-1);
|
||||
*optr = (*iptr as libc::c_int) << 16 as libc::c_int;
|
||||
optr = optr.offset(-1);
|
||||
*optr = (*iptr as libc::c_int) << 16 as libc::c_int
|
||||
}
|
||||
}
|
||||
crate::src::buffer::_buf_inc_writep(
|
||||
outputbuf,
|
||||
frames.wrapping_mul(8 as libc::c_int as libc::c_uint),
|
||||
);
|
||||
if loglevel as libc::c_uint >= crate::squeezelite_h::lSDEBUG as libc::c_int as libc::c_uint
|
||||
{
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d wrote %u frames\n\x00" as *const u8 as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 14], &[libc::c_char; 14]>(b"vorbis_decode\x00"))
|
||||
.as_ptr(),
|
||||
265 as libc::c_int,
|
||||
frames,
|
||||
);
|
||||
}
|
||||
} else if n == 0 as libc::c_int {
|
||||
if stream.state as libc::c_uint
|
||||
<= crate::squeezelite_h::DISCONNECT as libc::c_int as libc::c_uint
|
||||
{
|
||||
if loglevel as libc::c_uint
|
||||
>= crate::squeezelite_h::lINFO as libc::c_int as libc::c_uint
|
||||
{
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d partial decode\n\x00" as *const u8 as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 14], &[libc::c_char; 14]>(
|
||||
b"vorbis_decode\x00",
|
||||
))
|
||||
.as_ptr(),
|
||||
270 as libc::c_int,
|
||||
);
|
||||
}
|
||||
crate::stdlib::pthread_mutex_unlock(&mut (*outputbuf).mutex);
|
||||
return crate::squeezelite_h::DECODE_COMPLETE;
|
||||
} else {
|
||||
if loglevel as libc::c_uint
|
||||
>= crate::squeezelite_h::lINFO as libc::c_int as libc::c_uint
|
||||
{
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d no frame decoded\n\x00" as *const u8 as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 14], &[libc::c_char; 14]>(
|
||||
b"vorbis_decode\x00",
|
||||
))
|
||||
.as_ptr(),
|
||||
274 as libc::c_int,
|
||||
);
|
||||
}
|
||||
}
|
||||
} else if n == -(3 as libc::c_int) {
|
||||
// recoverable hole in stream, seen when skipping
|
||||
if loglevel as libc::c_uint >= crate::squeezelite_h::lDEBUG as libc::c_int as libc::c_uint {
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d hole in stream\n\x00" as *const u8 as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 14], &[libc::c_char; 14]>(b"vorbis_decode\x00"))
|
||||
.as_ptr(),
|
||||
280 as libc::c_int,
|
||||
); // add some padding as struct size may be larger
|
||||
}
|
||||
} else {
|
||||
if loglevel as libc::c_uint >= crate::squeezelite_h::lINFO as libc::c_int as libc::c_uint {
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d ov_read error: %d\n\x00" as *const u8 as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 14], &[libc::c_char; 14]>(b"vorbis_decode\x00"))
|
||||
.as_ptr(),
|
||||
284 as libc::c_int,
|
||||
n,
|
||||
);
|
||||
}
|
||||
crate::stdlib::pthread_mutex_unlock(&mut (*outputbuf).mutex);
|
||||
return crate::squeezelite_h::DECODE_COMPLETE;
|
||||
}
|
||||
crate::stdlib::pthread_mutex_unlock(&mut (*outputbuf).mutex);
|
||||
return crate::squeezelite_h::DECODE_RUNNING;
|
||||
}
|
||||
|
||||
unsafe extern "C" fn vorbis_open(
|
||||
mut size: crate::squeezelite_h::u8_t,
|
||||
mut rate: crate::squeezelite_h::u8_t,
|
||||
mut chan: crate::squeezelite_h::u8_t,
|
||||
mut endianness: crate::squeezelite_h::u8_t,
|
||||
) {
|
||||
if (*v).vf.is_null() {
|
||||
(*v).vf = crate::stdlib::malloc(
|
||||
(::std::mem::size_of::<crate::stdlib::OggVorbis_File>() as libc::c_ulong)
|
||||
.wrapping_add(128 as libc::c_int as libc::c_ulong),
|
||||
) as *mut crate::stdlib::OggVorbis_File;
|
||||
crate::stdlib::memset(
|
||||
(*v).vf as *mut libc::c_void,
|
||||
0 as libc::c_int,
|
||||
(::std::mem::size_of::<crate::stdlib::OggVorbis_File>() as libc::c_ulong)
|
||||
.wrapping_add(128 as libc::c_int as libc::c_ulong),
|
||||
);
|
||||
(*v).write_buf =
|
||||
crate::stdlib::malloc((2048 as libc::c_int * 8 as libc::c_int) as libc::c_ulong)
|
||||
as *mut crate::squeezelite_h::u8_t
|
||||
} else if (*v).opened {
|
||||
(*v).ov_clear.expect("non-null function pointer")((*v).vf);
|
||||
(*v).opened = 0 as libc::c_int != 0
|
||||
};
|
||||
}
|
||||
|
||||
unsafe extern "C" fn vorbis_close() {
|
||||
if (*v).opened {
|
||||
(*v).ov_clear.expect("non-null function pointer")((*v).vf);
|
||||
(*v).opened = 0 as libc::c_int != 0
|
||||
}
|
||||
crate::stdlib::free((*v).vf as *mut libc::c_void);
|
||||
crate::stdlib::free((*v).write_buf as *mut libc::c_void);
|
||||
(*v).write_buf = 0 as *mut crate::squeezelite_h::u8_t;
|
||||
(*v).vf = 0 as *mut crate::stdlib::OggVorbis_File;
|
||||
}
|
||||
|
||||
unsafe extern "C" fn load_vorbis() -> bool {
|
||||
let mut handle = crate::stdlib::dlopen(
|
||||
b"libvorbisfile.so.3\x00" as *const u8 as *const libc::c_char,
|
||||
0x2 as libc::c_int,
|
||||
);
|
||||
let mut err = 0 as *mut libc::c_char;
|
||||
let mut tremor = 0 as libc::c_int != 0;
|
||||
if handle.is_null() {
|
||||
handle = crate::stdlib::dlopen(
|
||||
b"libvorbisidec.so.1\x00" as *const u8 as *const libc::c_char,
|
||||
0x2 as libc::c_int,
|
||||
);
|
||||
if !handle.is_null() {
|
||||
tremor = 1 as libc::c_int != 0
|
||||
} else {
|
||||
if loglevel as libc::c_uint
|
||||
>= crate::squeezelite_h::lINFO as libc::c_int as libc::c_uint
|
||||
{
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d dlerror: %s\n\x00" as *const u8 as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 12], &[libc::c_char; 12]>(b"load_vorbis\x00"))
|
||||
.as_ptr(),
|
||||
332 as libc::c_int,
|
||||
crate::stdlib::dlerror(),
|
||||
);
|
||||
}
|
||||
return 0 as libc::c_int != 0;
|
||||
}
|
||||
}
|
||||
(*v).ov_read = ::std::mem::transmute::<
|
||||
*mut libc::c_void,
|
||||
Option<
|
||||
unsafe extern "C" fn(
|
||||
_: *mut crate::stdlib::OggVorbis_File,
|
||||
_: *mut libc::c_char,
|
||||
_: libc::c_int,
|
||||
_: libc::c_int,
|
||||
_: libc::c_int,
|
||||
_: libc::c_int,
|
||||
_: *mut libc::c_int,
|
||||
) -> libc::c_long,
|
||||
>,
|
||||
>(if tremor as libc::c_int != 0 {
|
||||
0 as *mut libc::c_void
|
||||
} else {
|
||||
crate::stdlib::dlsym(handle, b"ov_read\x00" as *const u8 as *const libc::c_char)
|
||||
});
|
||||
(*v).ov_read_tremor = ::std::mem::transmute::<
|
||||
*mut libc::c_void,
|
||||
Option<
|
||||
unsafe extern "C" fn(
|
||||
_: *mut crate::stdlib::OggVorbis_File,
|
||||
_: *mut libc::c_char,
|
||||
_: libc::c_int,
|
||||
_: *mut libc::c_int,
|
||||
) -> libc::c_long,
|
||||
>,
|
||||
>(if tremor as libc::c_int != 0 {
|
||||
crate::stdlib::dlsym(handle, b"ov_read\x00" as *const u8 as *const libc::c_char)
|
||||
} else {
|
||||
0 as *mut libc::c_void
|
||||
});
|
||||
(*v).ov_info = ::std::mem::transmute::<
|
||||
*mut libc::c_void,
|
||||
Option<
|
||||
unsafe extern "C" fn(
|
||||
_: *mut crate::stdlib::OggVorbis_File,
|
||||
_: libc::c_int,
|
||||
) -> *mut crate::stdlib::vorbis_info,
|
||||
>,
|
||||
>(crate::stdlib::dlsym(
|
||||
handle,
|
||||
b"ov_info\x00" as *const u8 as *const libc::c_char,
|
||||
));
|
||||
(*v).ov_clear = ::std::mem::transmute::<
|
||||
*mut libc::c_void,
|
||||
Option<unsafe extern "C" fn(_: *mut crate::stdlib::OggVorbis_File) -> libc::c_int>,
|
||||
>(crate::stdlib::dlsym(
|
||||
handle,
|
||||
b"ov_clear\x00" as *const u8 as *const libc::c_char,
|
||||
));
|
||||
(*v).ov_open_callbacks = ::std::mem::transmute::<
|
||||
*mut libc::c_void,
|
||||
Option<
|
||||
unsafe extern "C" fn(
|
||||
_: *mut libc::c_void,
|
||||
_: *mut crate::stdlib::OggVorbis_File,
|
||||
_: *const libc::c_char,
|
||||
_: libc::c_long,
|
||||
_: crate::stdlib::ov_callbacks,
|
||||
) -> libc::c_int,
|
||||
>,
|
||||
>(crate::stdlib::dlsym(
|
||||
handle,
|
||||
b"ov_open_callbacks\x00" as *const u8 as *const libc::c_char,
|
||||
));
|
||||
err = crate::stdlib::dlerror();
|
||||
if !err.is_null() {
|
||||
if loglevel as libc::c_uint >= crate::squeezelite_h::lINFO as libc::c_int as libc::c_uint {
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d dlerror: %s\n\x00" as *const u8 as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 12], &[libc::c_char; 12]>(b"load_vorbis\x00"))
|
||||
.as_ptr(),
|
||||
344 as libc::c_int,
|
||||
err,
|
||||
);
|
||||
}
|
||||
return 0 as libc::c_int != 0;
|
||||
}
|
||||
if loglevel as libc::c_uint >= crate::squeezelite_h::lINFO as libc::c_int as libc::c_uint {
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d loaded %s\n\x00" as *const u8 as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 12], &[libc::c_char; 12]>(b"load_vorbis\x00")).as_ptr(),
|
||||
348 as libc::c_int,
|
||||
if tremor as libc::c_int != 0 {
|
||||
b"libvorbisidec.so.1\x00" as *const u8 as *const libc::c_char
|
||||
} else {
|
||||
b"libvorbisfile.so.3\x00" as *const u8 as *const libc::c_char
|
||||
},
|
||||
);
|
||||
}
|
||||
return 1 as libc::c_int != 0;
|
||||
}
|
||||
/*
|
||||
* Squeezelite - lightweight headless squeezebox emulator
|
||||
*
|
||||
* (c) Adrian Smith 2012-2015, triode1@btinternet.com
|
||||
* Ralph Irving 2015-2017, ralph_irving@hotmail.com
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Additions (c) Paul Hermann, 2015-2017 under the same license terms
|
||||
* -Control of Raspberry pi GPIO for amplifier power
|
||||
* -Launch script on power status change from LMS
|
||||
*/
|
||||
// make may define: PORTAUDIO, SELFPIPE, RESAMPLE, RESAMPLE_MP, VISEXPORT, GPIO, IR, DSD, LINKALL to influence build
|
||||
// build detection
|
||||
// dynamically loaded libraries at run time
|
||||
// !LINKALL
|
||||
// config options
|
||||
// do not reduce as icy-meta max is 4080
|
||||
/* SUN */
|
||||
/* SUN */
|
||||
// printf/scanf formats for u64_t
|
||||
// logging
|
||||
// utils.c (non logging)
|
||||
// buffer.c
|
||||
// _* called with mutex locked
|
||||
// slimproto.c
|
||||
// stream.c
|
||||
// decode.c
|
||||
// output.c output_alsa.c output_pa.c output_pack.c
|
||||
// frames played at the point delay is measured
|
||||
// ordered largest first so [0] is max_rate
|
||||
// set in decode thread
|
||||
// set in decode thread
|
||||
// set by slimproto
|
||||
// set by slimproto
|
||||
// set by slimproto
|
||||
// set by slimproto
|
||||
// set by slimproto
|
||||
// set by slimproto
|
||||
// set by slimproto
|
||||
// _* called with mutex locked
|
||||
// output_alsa.c
|
||||
// output_pa.c
|
||||
// output_pulse.c
|
||||
// output_stdout.c
|
||||
// output_pack.c
|
||||
// output_vis.c
|
||||
// dop.c
|
||||
// codecs
|
||||
#[no_mangle]
|
||||
|
||||
pub unsafe extern "C" fn register_vorbis() -> *mut crate::squeezelite_h::codec {
|
||||
static mut ret: crate::squeezelite_h::codec = unsafe {
|
||||
{
|
||||
let mut init = crate::squeezelite_h::codec {
|
||||
id: 'o' as i32 as libc::c_char,
|
||||
types: b"ogg\x00" as *const u8 as *const libc::c_char as *mut libc::c_char,
|
||||
min_read_bytes: 4096 as libc::c_int as libc::c_uint,
|
||||
min_space: 20480 as libc::c_int as libc::c_uint,
|
||||
open: Some(
|
||||
vorbis_open
|
||||
as unsafe extern "C" fn(
|
||||
_: crate::squeezelite_h::u8_t,
|
||||
_: crate::squeezelite_h::u8_t,
|
||||
_: crate::squeezelite_h::u8_t,
|
||||
_: crate::squeezelite_h::u8_t,
|
||||
) -> (),
|
||||
),
|
||||
close: Some(vorbis_close as unsafe extern "C" fn() -> ()),
|
||||
decode: Some(
|
||||
vorbis_decode as unsafe extern "C" fn() -> crate::squeezelite_h::decode_state,
|
||||
),
|
||||
};
|
||||
init
|
||||
}
|
||||
};
|
||||
v = crate::stdlib::malloc(::std::mem::size_of::<vorbis>() as libc::c_ulong) as *mut vorbis;
|
||||
if v.is_null() {
|
||||
return 0 as *mut crate::squeezelite_h::codec;
|
||||
}
|
||||
(*v).vf = 0 as *mut crate::stdlib::OggVorbis_File;
|
||||
(*v).opened = 0 as libc::c_int != 0;
|
||||
if !load_vorbis() {
|
||||
return 0 as *mut crate::squeezelite_h::codec;
|
||||
}
|
||||
if loglevel as libc::c_uint >= crate::squeezelite_h::lINFO as libc::c_int as libc::c_uint {
|
||||
crate::src::utils::logprint(
|
||||
b"%s %s:%d using vorbis to decode ogg\n\x00" as *const u8 as *const libc::c_char,
|
||||
crate::src::utils::logtime(),
|
||||
(*::std::mem::transmute::<&[u8; 16], &[libc::c_char; 16]>(b"register_vorbis\x00"))
|
||||
.as_ptr(),
|
||||
377 as libc::c_int,
|
||||
);
|
||||
}
|
||||
return &mut ret;
|
||||
}
|
Loading…
Reference in New Issue
Block a user