Boa tarde,
hoje tentei
instalar a a libsox-sys para o Rust em Linux Ubuntu 20.04 e estava a dar-me uns erros de compilação, como outros podem tentar fazer o mesmo, deixo aqui
uma pequena solução para conseguirem compilar o exemplo que está na diretoria
https://github.com/vtavernier/libsox-sys/tree/master/examples Primeiro vão para uma diretoria onde queiram colocar o vosso projeto e depois criem um projeto vosso para testar a libsox eu chamei a esse projecto libsox_test:
>
cargo new libsox_test>
cd libsox_testAdicionem ao ficheiro
.toml as seguintes dependências:
[dependencies]
libc = "0.2.106"
libsox-sys = "0.1.1"Depois
copiem o conteúdo ficheiro:
https://github.com/vtavernier/libsox-sys/tree/master/examples/example1.rs para o
/src/main.rsdepois tem de
instalar os packages de dependências no Ubuntu/Debian:
#
1ºInstalar o sox.>
sudo apt-get update>
sudo apt-get install sox#
2ºInstalar a libsox-dev.>
sudo apt-get install libsox-dev# 3º
Se não tem o
clang instalado, o compilador de Rust não consegue compilar a lib.rs . Para corrigir esse erro, instalem o clang via o
pacote libclang.
Debian/Ubuntu:
>
sudo apt-get install libclang-devNote: Para encontrar a solução para este segundo problema eu segui o
tutorial:
Fixing Rust compilation issues caused by missing packages, part 2
https://www.unadulterated-faff.com/articles/2020/02/04/fixing-rust-compilation-issues-caused-by-missing-packages-part-2.htmlDepois
já podem compilar fazendo:
>
cargo build ou
cargo build --releasePara executar arranjem um
WAV por exemplo
1.wav e façam:
>
cargo run 1.wav out.wavEle vai gerar o ficheiro de output mas não vai notar-se diferença nenhuma, por isso
alterem a linha 103 do main.rsde:let vol = [b"
3dB\0".as_ptr() as *mut i8];
para:let vol = [b"
-6dB\0".as_ptr() as *mut i8];
Executem outra vez:
>
cargo run 1.wav out.wavE agora já
vão ouvir o segundo WAV com uma amplitude de áudio mais baixa do que o primeiro.
------------------------
Gostava só de deixar a
seguinte nota:
O código Rust que tem de ser usado para utilizar esta libSOX de C é Rust Unsafe e podem comparar dos exemplos que eu listei no post anterior, o
exemplo1.c e o
exemplo1.rs .
Se os virem com atenção vão ver algumas coisas de diferente em C e em Rust para chamar a mesma lib, deixo aqui
um exemplo de 3 coisas:
Em C onde está:
/* input and output files */
static sox_format_t * in, * out;
Em Rust unsafe fica:
static mut IN_FILE: *mut sox_format_t = ptr::null_mut();
static mut OUT_FILE: *mut sox_format_t = ptr::null_mut();
Em C onde está:
char * vol[] = {"3dB"};
Em Rust unsafe fica:
let vol = [b"3dB\0".as_ptr() as *mut i8];
Em C onde está:
assert(sox_add_effect(chain, e, &in->signal, &in->signal) == SOX_SUCCESS);
Em Rust unsafe fica:
assert!(sox_add_effect(chain, e, &mut (*IN_FILE).signal, &(*IN_FILE).signal) == sox_error_t_SOX_SUCCESS);
Volto a dizer isto é código Rust Unsafe, não é código em Rust normal, e é código para poder interligar diretamente com bindings feitos em C.
Código Rust normal é muito mais limpo.
Só necessitam de código Rust Unsafe para fazer as chamadas, podem criar uma camada de abstração mais elevada que já seja Rust normal, sem ser unsafe.
Cumprimentos,
João