if self.end + src.len() > self.queue.len() {
self.queue.resize(self.end + src.len(), 0);
}
- self.queue[self.end..][..src.len()].copy_from_slice(&src);
+ self.queue[self.end..][..src.len()].copy_from_slice(src);
self.end += src.len();
self.spos = samplepos;
self.set_time();
type AudioPlaybackType = Option<AudioDevice<AudioOutput>>;
-fn start_audio_decoding(asystem: &AudioSubsystem, ainfo: NAAudioInfo, mut audio_dec: DecoderStuff, aprecv: Receiver<PktSendEvent>) -> (AudioPlaybackType, JoinHandle<()>) {
+fn start_audio_decoding(asystem: &AudioSubsystem, ainfo: NAAudioInfo, sbr_hack: bool, mut audio_dec: DecoderStuff, aprecv: Receiver<PktSendEvent>) -> (AudioPlaybackType, JoinHandle<()>) {
let ch = ainfo.channels.max(2);
+ let sample_rate = if !sbr_hack { ainfo.sample_rate } else { ainfo.sample_rate * 2 };
let desired_spec = AudioSpecDesired {
- freq: Some(ainfo.sample_rate as i32),
+ freq: Some(sample_rate as i32),
channels: Some(ch),
samples: None
};
let dst_info = NAAudioInfo {
- sample_rate: ainfo.sample_rate,
+ sample_rate,
channels: ch,
format: SND_S16_FORMAT,
block_len: 0,
};
- let queue = Arc::new(Mutex::new(AudioQueue::new(ainfo.sample_rate as usize, ch as usize)));
+ let queue = Arc::new(Mutex::new(AudioQueue::new(sample_rate as usize, ch as usize)));
let qclone = queue.clone();
let ret = asystem.open_playback(None, &desired_spec, |_spec| {
AudioOutput {
let buf = frm.get_buffer();
if let Some(pts) = frm.get_pts() {
samplepos = NATimeInfo::ts_to_time(pts, u64::from(dst_info.sample_rate), frm.ts.tb_num, frm.ts.tb_den) as usize;
+ if sbr_hack {
+ samplepos >>= 2;
+ }
}
samplepos += buf.get_audio_length();
if let Ok(out_buf) = convert_audio_frame(&buf, &dst_info, &dst_chmap) {
}
impl AudioControl {
- pub fn new(audio_dec: Option<DecoderStuff>, ainfo: Option<NAAudioInfo>, asystem: &AudioSubsystem) -> Self {
+ pub fn new(audio_dec: Option<DecoderStuff>, ainfo: Option<NAAudioInfo>, sbr_hack: bool, asystem: &AudioSubsystem) -> Self {
let (apsend, aprecv) = std::sync::mpsc::sync_channel::<PktSendEvent>(20);
let (adevice, athread) = if let Some(audio_dec) = audio_dec {
- start_audio_decoding(asystem, ainfo.expect("audio info should be present"), audio_dec, aprecv)
+ start_audio_decoding(asystem, ainfo.expect("audio info should be present"), sbr_hack, audio_dec, aprecv)
} else {
(None, dummy_audio_thread(aprecv))
};
pub fn get_queue_size(&self) -> usize { self.aqueue.len() }
pub fn try_send_audio(&mut self, evt: PktSendEvent) -> bool {
- if self.aqueue.len() > 0 {
+ if !self.aqueue.is_empty() {
self.aqueue.push(evt);
false
} else {