summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFletcher Woodruff <fletcherw@chromium.org>2019-10-01 16:12:44 -0600
committerCommit Bot <commit-bot@chromium.org>2019-10-03 17:03:52 +0000
commit711fa6cc000b702e0c71f9844de410eb72c0b09b (patch)
treebb1bb1debb8c56499ef45f33c79cf924c4c74fbf
parenteaffeea7217c728706251b2e61dff6e80b69eb8f (diff)
downloadadhd-711fa6cc000b702e0c71f9844de410eb72c0b09b.tar.gz
CRAS: libcras: restructure CrasClient::new()
CrasClient's client_id field was an Option<u32>, but it was only None during CrasClient::new() while waiting for a response from CRAS. Change client_id type to u32, and wait to construct CrasClient until after we've connected to the server and gotten our client_id. Also remove some unneeded code that was used to handle the now unnecessary None case. BUG=None TEST="cras_tests playback -f /dev/urandom" on-device Change-Id: I919bd0814b370305a0bd5ba55544a4d4dc82f2ed Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/adhd/+/1836473 Tested-by: Fletcher Woodruff <fletcherw@chromium.org> Reviewed-by: Dylan Reid <dgreid@chromium.org> Commit-Queue: Fletcher Woodruff <fletcherw@chromium.org>
-rw-r--r--cras/client/libcras/src/libcras.rs44
1 files changed, 21 insertions, 23 deletions
diff --git a/cras/client/libcras/src/libcras.rs b/cras/client/libcras/src/libcras.rs
index 33a2471d..c81e540d 100644
--- a/cras/client/libcras/src/libcras.rs
+++ b/cras/client/libcras/src/libcras.rs
@@ -146,7 +146,6 @@ pub enum ErrorType {
CrasStreamError(cras_stream::Error),
IoError(io::Error),
SysUtilError(sys_util::Error),
- NoClientId,
MessageTypeError,
UnexpectedExit,
}
@@ -171,7 +170,6 @@ impl fmt::Display for Error {
ErrorType::CrasStreamError(ref err) => err.fmt(f),
ErrorType::IoError(ref err) => err.fmt(f),
ErrorType::SysUtilError(ref err) => err.fmt(f),
- ErrorType::NoClientId => write!(f, "client_id dose not exists"),
ErrorType::MessageTypeError => write!(f, "Message type error"),
ErrorType::UnexpectedExit => write!(f, "Unexpected exit"),
}
@@ -208,7 +206,7 @@ impl From<cras_client_message::Error> for Error {
/// to CRAS server.
pub struct CrasClient {
server_socket: CrasServerSocket,
- client_id: Option<u32>,
+ client_id: u32,
next_stream_id: u32,
cras_capture: bool,
client_type: CRAS_CLIENT_TYPE,
@@ -226,26 +224,26 @@ impl CrasClient {
/// Returns error if error occurs while handling server message or message
/// type is incorrect
pub fn new() -> Result<Self> {
- // Initializes a client
- let server_socket = CrasServerSocket::new()?;
- let mut cras_client = Self {
- server_socket,
- client_id: None,
- next_stream_id: 0,
- cras_capture: false,
- client_type: CRAS_CLIENT_TYPE::CRAS_CLIENT_TYPE_UNKNOWN,
- };
+ // Create a connection to the server.
+ let mut server_socket = CrasServerSocket::new()?;
// Gets client ID from server
- cras_client.client_id = Some({
- match cras_client.handle_server_message()? {
+ let client_id = {
+ match CrasClient::wait_for_message(&mut server_socket)? {
ServerResult::Connected(res, _server_state_fd) => res as u32,
_ => {
return Err(Error::new(ErrorType::MessageTypeError));
}
}
- });
- Ok(cras_client)
+ };
+
+ Ok(Self {
+ server_socket,
+ client_id,
+ next_stream_id: 0,
+ cras_capture: false,
+ client_type: CRAS_CLIENT_TYPE::CRAS_CLIENT_TYPE_UNKNOWN,
+ })
}
/// Enables capturing audio through CRAS server.
@@ -267,7 +265,7 @@ impl CrasClient {
// Gets server_stream_id from given stream_id
fn server_stream_id(&self, stream_id: &u32) -> Result<u32> {
- Ok((self.client_id.ok_or(Error::new(ErrorType::NoClientId))? << 16) | stream_id)
+ Ok((self.client_id << 16) | stream_id)
}
// Creates general stream with given parameters
@@ -324,7 +322,7 @@ impl CrasClient {
);
loop {
- let result = self.handle_server_message()?;
+ let result = CrasClient::wait_for_message(&mut self.server_socket)?;
if let ServerResult::StreamConnected(_stream_id, header_fd, samples_fd) = result {
stream.init_shm(header_fd, samples_fd)?;
break;
@@ -334,14 +332,14 @@ impl CrasClient {
Ok(stream)
}
- // Blocks handling the first server message received from server socket.
- fn handle_server_message(&self) -> Result<ServerResult> {
+ // Blocks handling the first server message received from `socket`.
+ fn wait_for_message(socket: &mut CrasServerSocket) -> Result<ServerResult> {
#[derive(PollToken)]
enum Token {
ServerMsg,
}
- let poll_ctx: PollContext<Token> = PollContext::new()
- .and_then(|pc| pc.add(&self.server_socket, Token::ServerMsg).and(Ok(pc)))?;
+ let poll_ctx: PollContext<Token> =
+ PollContext::new().and_then(|pc| pc.add(socket, Token::ServerMsg).and(Ok(pc)))?;
let events = poll_ctx.wait()?;
// Check the first readable message
@@ -351,7 +349,7 @@ impl CrasClient {
.ok_or_else(|| Error::new(ErrorType::UnexpectedExit))
.and_then(|ref token| {
match token {
- Token::ServerMsg => ServerResult::handle_server_message(&self.server_socket),
+ Token::ServerMsg => ServerResult::handle_server_message(socket),
}
.map_err(Into::into)
})