Skip to content

Commit 2118816

Browse files
committed
refactor: use ffmpeg 7.x static build, fix compile, update deps
1 parent 3bdd832 commit 2118816

File tree

7 files changed

+55
-62
lines changed

7 files changed

+55
-62
lines changed

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
[package]
22
name = "rustplayer"
3-
version = "1.1.3"
3+
version = "1.1.4"
44
edition = "2021"
55
description = "Music/Radio Player built by Rust"
6-
authors = ["KetaNetwork"]
6+
authors = ["Kingtous"]
77

88
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
99

@@ -44,8 +44,8 @@ short_description = "Music/Radio Player built by Rust."
4444
long_description = """
4545
Music/Radio Player built by Rust.
4646
"""
47-
deb_depends = ["libasound2", "libavcodec57 | libavcodec58", "libavformat57 | libavformat58", "libswresample2 | libswresample3"]
48-
osx_minimum_system_version = "10.15"
47+
deb_depends = ["libasound2"]
48+
osx_minimum_system_version = "12.0"
4949

5050
[profile]
5151
release = { strip = "symbols", lto = "thin", opt-level = "z" }

build.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#[cfg(target_os = "macos")]
22
fn emit_minimum_version() {
3-
println!("set minimum version to 10.15");
4-
println!("cargo:rustc-env=MACOSX_DEPLOYMENT_TARGET=10.15");
3+
println!("set minimum version to 12.0");
4+
println!("cargo:rustc-env=MACOSX_DEPLOYMENT_TARGET=12.0");
55
}
66

77
fn configure() {

snap/snapcraft.yaml

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
name: rustplayer
2-
version: '1.1.0-2'
2+
version: '1.1.4-1'
33
summary: A local music player && network radio player
44
description: |
55
RustPlayer is a local music player && network radio player:
66
7-
base: core18
7+
base: core20
88
confinement: strict
99

1010
architectures:
@@ -22,21 +22,12 @@ parts:
2222
snapcraftctl pull
2323
git apply dynamic-lib.patch
2424
build-packages:
25-
- libasound2-dev
26-
- libavcodec-dev
27-
- libavformat-dev
28-
- libswresample-dev
29-
- libavutil-dev
3025
- pkg-config
3126
- libssl-dev
3227
- clang
3328
- git
3429
stage-packages:
3530
- libasound2
36-
- libavcodec57
37-
- libavformat57
38-
- libswresample2
39-
- libavutil55
4031

4132
layout:
4233
/usr/share/alsa:

src/media/player.rs

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ use std::{
3131
use m3u8_rs::{MediaPlaylist, Playlist};
3232

3333
use rodio::cpal;
34-
use rodio::{Decoder, OutputStream, OutputStreamHandle, Sink, Source};
34+
use rodio::{Decoder, OutputStream, OutputStreamBuilder, Sink, Source};
3535
use tui::widgets::ListState;
3636

3737
use crate::util::lyrics::Lyrics;
@@ -114,7 +114,6 @@ pub struct MusicPlayer {
114114
// media: Media,
115115
// stream
116116
stream: OutputStream,
117-
stream_handle: OutputStreamHandle,
118117
sink: Sink,
119118
current_lyric: Option<String>,
120119
initialized: bool,
@@ -125,15 +124,15 @@ impl Player for MusicPlayer {
125124
for dev in cpal::available_hosts() {
126125
println!("{:?}", dev);
127126
}
128-
let (stream, stream_handle) = OutputStream::try_default().unwrap();
129-
let sink = Sink::try_new(&stream_handle).unwrap();
127+
let builder = OutputStreamBuilder::from_default_device().unwrap();
128+
let stream = builder.open_stream_or_fallback().unwrap();
129+
let sink = Sink::connect_new(stream.mixer());
130130
Self {
131131
current_time: Duration::from_secs(0),
132132
total_time: Duration::from_secs(0),
133133
play_list: PlayList { lists: vec![] },
134134
// media: f,
135135
stream,
136-
stream_handle,
137136
sink,
138137
current_lyric: None,
139138
initialized: false,
@@ -181,14 +180,12 @@ impl Player for MusicPlayer {
181180
let top_music = self.play_list.lists.first().unwrap();
182181
let f = File::open(top_music.path.as_str()).unwrap();
183182
let buf_reader = BufReader::new(f);
184-
let (stream, stream_handle) = OutputStream::try_default().unwrap();
185-
self.stream = stream;
186-
self.stream_handle = stream_handle;
187-
let volume = self.volume();
188-
self.sink = Sink::try_new(&self.stream_handle).unwrap();
189-
self.set_volume(volume);
190-
self.sink.append(Decoder::new(buf_reader).unwrap());
191-
self.play();
183+
if let Ok(data_decoder) = Decoder::new(buf_reader) {
184+
self.sink.append(data_decoder);
185+
self.play();
186+
} else {
187+
return false;
188+
}
192189
}
193190
// for
194191
} else {
@@ -355,8 +352,11 @@ impl MusicPlayer {
355352
// rebuild
356353
self.stop();
357354
let buf_reader = BufReader::new(f);
358-
let sink = self.stream_handle.play_once(buf_reader).unwrap();
359-
self.sink = sink;
355+
if let Ok(data_decoder) = Decoder::new(buf_reader) {
356+
self.sink.append(data_decoder);
357+
} else {
358+
return false;
359+
}
360360
self.play_list.lists.clear();
361361
}
362362
let mut state = ListState::default();
@@ -398,7 +398,6 @@ pub struct RadioPlayer {
398398
pub item: Option<RadioItem>,
399399
pub list: Vec<PlayListItem>,
400400
stream: OutputStream,
401-
stream_handle: OutputStreamHandle,
402401
sink: Sink,
403402
is_playing: bool,
404403
last_playing_id: i32,
@@ -410,15 +409,15 @@ pub struct RadioPlayer {
410409

411410
impl Player for RadioPlayer {
412411
fn new() -> Self {
413-
let (stream, handle) = OutputStream::try_default().unwrap();
414-
let sink = Sink::try_new(&handle).unwrap();
412+
let builder = OutputStreamBuilder::from_default_device().unwrap();
413+
let stream = builder.open_stream_or_fallback().unwrap();
414+
let sink = Sink::connect_new(stream.mixer());
415415
let (tx, rx) = channel();
416416
empty_cache();
417417
RadioPlayer {
418418
item: None,
419419
list: vec![],
420420
stream,
421-
stream_handle: handle,
422421
sink,
423422
is_playing: false,
424423
last_playing_id: -1,

thirdparty/ffmpeg-decoder-rs/src/decoder.rs

Lines changed: 27 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@ use crate::error::Error;
22

33
use ffmpeg_sys_next::{
44
self, av_frame_alloc, av_frame_free, av_frame_unref, av_freep, av_get_alt_sample_fmt,
5-
av_get_bytes_per_sample, av_get_channel_layout_nb_channels, av_get_sample_fmt_name,
5+
av_get_bytes_per_sample, av_get_sample_fmt_name,
66
av_init_packet, av_packet_unref, av_read_frame, av_sample_fmt_is_planar,
77
av_samples_alloc, av_samples_get_buffer_size, avcodec_alloc_context3, avcodec_close,
88
avcodec_find_decoder, avcodec_free_context, avcodec_open2, avcodec_parameters_to_context,
99
avcodec_receive_frame, avcodec_send_packet, avformat_close_input, avformat_find_stream_info,
10-
avformat_open_input, swr_alloc_set_opts, swr_convert, swr_get_out_samples, swr_init, AVCodec,
11-
AVCodecContext, AVFormatContext, AVFrame, AVMediaType, AVPacket, AVSampleFormat, AVStream,
10+
avformat_open_input, swr_alloc_set_opts2, swr_convert, swr_get_out_samples, swr_init, AVCodec,
11+
AVCodecContext, AVFormatContext, AVFrame, AVMediaType, AVPacket, AVSampleFormat, AVStream, AVChannelLayout
1212
};
1313
use std::ffi::{CStr, CString};
1414
use std::path::Path;
@@ -117,7 +117,7 @@ impl Decoder {
117117
fn convert_and_store_frame(&mut self) {
118118
let num_samples = self.frame.num_samples();
119119
let channel_layout = self.frame.channel_layout();
120-
let num_channels = unsafe { av_get_channel_layout_nb_channels(channel_layout) };
120+
let num_channels = channel_layout.nb_channels;
121121

122122
let extended_data = self.frame.extended_data();
123123

@@ -190,10 +190,10 @@ impl Decoder {
190190
unsafe { av_packet_unref(self.packet.inner.as_mut_ptr()) };
191191
}
192192

193-
fn next_sample(&mut self) -> i16 {
193+
fn next_sample(&mut self) -> f32 {
194194
let sample_u8: [u8; 2] = [self.current_frame.remove(0), self.current_frame.remove(0)];
195195

196-
((sample_u8[1] as i16) << 8) | sample_u8[0] as i16
196+
(((sample_u8[1] as i16) << 8) | sample_u8[0] as i16) as _
197197
}
198198

199199
fn process_next_frame(&mut self) -> Option<Result<(), Error>> {
@@ -277,7 +277,7 @@ impl Decoder {
277277
unsafe impl Send for Decoder {}
278278

279279
impl Iterator for Decoder {
280-
type Item = i16;
280+
type Item = f32;
281281

282282
#[inline]
283283
fn next(&mut self) -> Option<Self::Item> {
@@ -371,26 +371,29 @@ struct SwrContext {
371371

372372
impl SwrContext {
373373
fn new(codec_ctx: &CodecContext) -> Result<SwrContext, Error> {
374-
let swr_ctx: *mut ffmpeg_sys_next::SwrContext = unsafe {
375-
swr_alloc_set_opts(
376-
ptr::null_mut(),
377-
codec_ctx.channel_layout() as i64,
374+
unsafe {
375+
let mut swr_ctx: *mut ffmpeg_sys_next::SwrContext = std::ptr::null_mut();
376+
377+
let channel_layout = codec_ctx.channel_layout();
378+
379+
let ret = swr_alloc_set_opts2(
380+
&mut swr_ctx,
381+
&channel_layout as *const AVChannelLayout,
378382
DEFAULT_CONVERSION_FORMAT,
379383
codec_ctx.sample_rate(),
380-
codec_ctx.channel_layout() as i64,
384+
&channel_layout as *const AVChannelLayout,
381385
codec_ctx.sample_format(),
382386
codec_ctx.sample_rate(),
383387
0,
384388
ptr::null_mut(),
385-
)
386-
};
389+
);
390+
391+
if ret != 0 || swr_ctx.is_null() {
392+
return Err(Error::InitializeSwr);
393+
}
387394

388-
let status = unsafe { swr_init(swr_ctx) };
389-
if status != 0 {
390-
return Err(Error::InitializeSwr);
395+
Ok(SwrContext { inner: swr_ctx })
391396
}
392-
393-
Ok(SwrContext { inner: swr_ctx })
394397
}
395398
}
396399

@@ -427,8 +430,8 @@ impl Frame {
427430
unsafe { self.inner.as_ref().unwrap().nb_samples }
428431
}
429432

430-
fn channel_layout(&self) -> u64 {
431-
unsafe { self.inner.as_ref().unwrap().channel_layout }
433+
fn channel_layout(&self) -> AVChannelLayout {
434+
unsafe { self.inner.as_ref().unwrap().ch_layout }
432435
}
433436

434437
fn extended_data(&self) -> *mut *const u8 {
@@ -531,11 +534,11 @@ impl CodecContext {
531534
}
532535

533536
fn channels(&self) -> i32 {
534-
unsafe { self.inner.as_ref().unwrap().channels }
537+
unsafe { self.inner.as_ref().unwrap().ch_layout.nb_channels }
535538
}
536539

537-
fn channel_layout(&self) -> u64 {
538-
unsafe { self.inner.as_ref().unwrap().channel_layout }
540+
fn channel_layout(&self) -> AVChannelLayout {
541+
unsafe { self.inner.as_ref().unwrap().ch_layout }
539542
}
540543

541544
fn is_planar(&self) -> i32 {

thirdparty/ffmpeg-decoder-rs/src/rodio.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use std::time::Duration;
66

77
impl Source for Decoder {
88
#[inline]
9-
fn current_frame_len(&self) -> Option<usize> {
9+
fn current_span_len(&self) -> Option<usize> {
1010
self._current_frame_len()
1111
}
1212

0 commit comments

Comments
 (0)