forked from mirrors/gstreamer-rs
gstreamer: Add some API to calculate the next state convert state changes into their component states and back
This commit is contained in:
parent
77af65634f
commit
caae679d6f
1 changed files with 54 additions and 0 deletions
|
@ -11,6 +11,8 @@ use thiserror::Error;
|
||||||
use ClockReturn;
|
use ClockReturn;
|
||||||
use FlowReturn;
|
use FlowReturn;
|
||||||
use PadLinkReturn;
|
use PadLinkReturn;
|
||||||
|
use State;
|
||||||
|
use StateChange;
|
||||||
use StateChangeReturn;
|
use StateChangeReturn;
|
||||||
|
|
||||||
use glib::translate::*;
|
use glib::translate::*;
|
||||||
|
@ -631,3 +633,55 @@ impl SetValue for MessageType {
|
||||||
gobject_sys::g_value_set_flags(value.to_glib_none_mut().0, this.to_glib())
|
gobject_sys::g_value_set_flags(value.to_glib_none_mut().0, this.to_glib())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl State {
|
||||||
|
pub fn next(self, pending: Self) -> Self {
|
||||||
|
let current = self.to_glib();
|
||||||
|
let pending = pending.to_glib();
|
||||||
|
|
||||||
|
let sign = (pending - current).signum();
|
||||||
|
|
||||||
|
from_glib(current + sign)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl StateChange {
|
||||||
|
pub fn new(current: State, next: State) -> Self {
|
||||||
|
skip_assert_initialized!();
|
||||||
|
let current = current.to_glib();
|
||||||
|
let next = next.to_glib();
|
||||||
|
from_glib((current << 3) | next)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn current(self) -> State {
|
||||||
|
match self {
|
||||||
|
StateChange::NullToReady => State::Null,
|
||||||
|
StateChange::ReadyToPaused => State::Ready,
|
||||||
|
StateChange::PausedToPlaying => State::Paused,
|
||||||
|
StateChange::PlayingToPaused => State::Playing,
|
||||||
|
StateChange::PausedToReady => State::Paused,
|
||||||
|
StateChange::ReadyToNull => State::Ready,
|
||||||
|
StateChange::NullToNull => State::Null,
|
||||||
|
StateChange::ReadyToReady => State::Ready,
|
||||||
|
StateChange::PausedToPaused => State::Paused,
|
||||||
|
StateChange::PlayingToPlaying => State::Playing,
|
||||||
|
StateChange::__Unknown(value) => State::__Unknown(value >> 3),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn next(self) -> State {
|
||||||
|
match self {
|
||||||
|
StateChange::NullToReady => State::Ready,
|
||||||
|
StateChange::ReadyToPaused => State::Paused,
|
||||||
|
StateChange::PausedToPlaying => State::Playing,
|
||||||
|
StateChange::PlayingToPaused => State::Paused,
|
||||||
|
StateChange::PausedToReady => State::Ready,
|
||||||
|
StateChange::ReadyToNull => State::Null,
|
||||||
|
StateChange::NullToNull => State::Null,
|
||||||
|
StateChange::ReadyToReady => State::Ready,
|
||||||
|
StateChange::PausedToPaused => State::Paused,
|
||||||
|
StateChange::PlayingToPlaying => State::Playing,
|
||||||
|
StateChange::__Unknown(value) => State::__Unknown(value & 0x7),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue