diff --git a/Android.bp b/Android.bp
deleted file mode 100644
index 4cb9810..0000000
--- a/Android.bp
+++ /dev/null
@@ -1,52 +0,0 @@
-//
-// Copyright (C) 2021 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package {
-    default_applicable_licenses: ["external_adhd_license"],
-}
-
-// Added automatically by a large-scale-change that took the approach of
-// 'apply every license found to every target'. While this makes sure we respect
-// every license restriction, it may not be entirely correct.
-//
-// e.g. GPL in an MIT project might only apply to the contrib/ directory.
-//
-// Please consider splitting the single license below into multiple licenses,
-// taking care not to lose any license_kind information, and overriding the
-// default license using the 'licenses: [...]' property on targets as needed.
-//
-// For unused files, consider creating a 'fileGroup' with "//visibility:private"
-// to attach the license to, and including a comment whether the files may be
-// used in the current project.
-//
-// large-scale-change included anything that looked like it might be a license
-// text as a license_text. e.g. LICENSE, NOTICE, COPYING etc.
-//
-// Please consider removing redundant or irrelevant files from 'license_text:'.
-// See: http://go/android-license-faq
-license {
-    name: "external_adhd_license",
-    visibility: [":__subpackages__"],
-    license_kinds: [
-        "SPDX-license-identifier-BSD",
-        "SPDX-license-identifier-LGPL",
-    ],
-    license_text: [
-        "LICENSE.SUPERFASTHASH",
-        "LICENSE.UTLIST",
-        "LICENSE.WEBKIT",
-        "NOTICE",
-    ],
-}
diff --git a/LICENSE.SUPERFASTHASH b/LICENSE.SUPERFASTHASH
deleted file mode 100644
index 3c40a3e..0000000
--- a/LICENSE.SUPERFASTHASH
+++ /dev/null
@@ -1,27 +0,0 @@
-Paul Hsieh OLD BSD license
-
-Copyright (c) 2010, Paul Hsieh
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification,
-are permitted provided that the following conditions are met:
-
-* Redistributions of source code must retain the above copyright notice, this
-  list of conditions and the following disclaimer.
-* Redistributions in binary form must reproduce the above copyright notice, this
-  list of conditions and the following disclaimer in the documentation and/or
-  other materials provided with the distribution.
-* Neither my name, Paul Hsieh, nor the names of any other contributors to the
-  code use may not be used to endorse or promote products derived from this
-  software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/LICENSE.UTLIST b/LICENSE.UTLIST
deleted file mode 100644
index fbc90b1..0000000
--- a/LICENSE.UTLIST
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
-Copyright (c) 2007-2011, Troy D. Hanson   http://uthash.sourceforge.net
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
-IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
-OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
diff --git a/LICENSE.WEBKIT b/LICENSE.WEBKIT
deleted file mode 100644
index 2f69d9f..0000000
--- a/LICENSE.WEBKIT
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2010 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
diff --git a/METADATA b/METADATA
deleted file mode 100644
index 6d8601b..0000000
--- a/METADATA
+++ /dev/null
@@ -1,3 +0,0 @@
-third_party {
-  license_type: RESTRICTED
-}
diff --git a/MODULE_LICENSE_BSD b/MODULE_LICENSE_BSD
deleted file mode 100644
index e69de29..0000000
--- a/MODULE_LICENSE_BSD
+++ /dev/null
diff --git a/Makefile b/Makefile
deleted file mode 100644
index 9693cab..0000000
--- a/Makefile
+++ /dev/null
@@ -1,94 +0,0 @@
-# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-export ADHD_DIR = $(shell pwd)
-include $(ADHD_DIR)/defs/definitions.mk
-
-all:	cras
-
-cras:
-	@$(call remake,Building,$@,cras.mk,$@)
-
-cras_install:
-	@$(call remake,Building,cras,cras.mk,$@)
-
-cras-scripts:
-	$(ECHO) "Installing cras scripts"
-	$(INSTALL) --mode 755 -d $(DESTDIR)/usr/bin/
-	$(INSTALL) --mode 755 -D $(ADHD_DIR)/scripts/audio_diagnostics \
-		$(DESTDIR)/usr/bin/
-	$(INSTALL) --mode 755 -D $(ADHD_DIR)/scripts/asoc_dapm_graph \
-		$(DESTDIR)/usr/bin/
-
-cras_init_upstart:	$(ADHD_DIR)/init/cras.conf
-	$(ECHO) "Installing upstart file"
-	$(INSTALL) --mode 644 -D $< $(DESTDIR)/etc/init/cras.conf
-
-cras_init_scripts:	$(ADHD_DIR)/init/cras.sh
-	$(INSTALL) --mode 644 -D $< $(DESTDIR)/usr/share/cros/init/cras.sh
-
-SYSTEMD_UNIT_DIR := /usr/lib/systemd/system/
-SYSTEMD_TMPFILESD_DIR := /usr/lib/tmpfiles.d/
-
-cras_init_systemd:	$(ADHD_DIR)/init/cras.service \
-	$(ADHD_DIR)/init/cras-directories.conf
-	$(ECHO) "Installing systemd files"
-	$(INSTALL) --mode 644 -D $(ADHD_DIR)/init/cras.service \
-		$(DESTDIR)/$(SYSTEMD_UNIT_DIR)/cras.service
-	$(INSTALL) --mode 755 -d $(DESTDIR)/$(SYSTEMD_UNIT_DIR)/system-services.target.wants
-	$(LINK) -s ../cras.service \
-		$(DESTDIR)/$(SYSTEMD_UNIT_DIR)/system-services.target.wants/cras.service
-	$(INSTALL) --mode 644 -D $(ADHD_DIR)/init/cras-directories.conf \
-		$(DESTDIR)/$(SYSTEMD_TMPFILESD_DIR)/cras-directories.conf
-
-ifeq ($(strip $(SYSTEMD)), yes)
-
-cras_init: cras_init_systemd cras_init_scripts
-
-else
-
-cras_init: cras_init_upstart cras_init_scripts
-
-endif
-
-$(DESTDIR)/etc/cras/device_blocklist:	$(ADHD_DIR)/cras-config/device_blocklist
-	$(ECHO) "Installing '$<' to '$@'"
-	$(INSTALL) --mode 644 -D $< $@
-
-# Note: $(BOARD) usage is deprecated.  Configs should be added in board overlays
-# or via cros_config data for newer unibuild systems.
-
-optional_alsa_conf := $(wildcard $(ADHD_DIR)/alsa-module-config/alsa-$(BOARD).conf)
-
-ifneq ($(strip $(optional_alsa_conf)),)
-
-$(DESTDIR)/etc/modprobe.d/alsa-$(BOARD).conf:	$(optional_alsa_conf)
-	$(ECHO) "Installing '$<' to '$@'"
-	$(INSTALL) --mode 644 -D $< $@
-
-install:	$(DESTDIR)/etc/modprobe.d/alsa-$(BOARD).conf
-
-endif
-
-optional_alsa_patch := $(wildcard $(ADHD_DIR)/alsa-module-config/$(BOARD)_alsa.fw)
-
-ifneq ($(strip $(optional_alsa_patch)),)
-
-$(DESTDIR)/lib/firmware/$(BOARD)_alsa.fw:	$(optional_alsa_patch)
-	$(ECHO) "Installing '$<' to '$@'"
-	$(INSTALL) --mode 644 -D $< $@
-
-install:	$(DESTDIR)/lib/firmware/$(BOARD)_alsa.fw
-
-endif
-
-install:	$(DESTDIR)/etc/cras/device_blocklist \
-		cras-scripts \
-		cras_install \
-		cras_init
-
-clean:
-	@rm -rf $(ADHD_BUILD_DIR)
-
-.PHONY:	clean cras cras_install cras-script
diff --git a/NOTICE b/NOTICE
deleted file mode 100644
index a7f0a02..0000000
--- a/NOTICE
+++ /dev/null
@@ -1,76 +0,0 @@
-Paul Hsieh OLD BSD license
-
-Copyright (c) 2010, Paul Hsieh
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification,
-are permitted provided that the following conditions are met:
-
-* Redistributions of source code must retain the above copyright notice, this
-  list of conditions and the following disclaimer.
-* Redistributions in binary form must reproduce the above copyright notice, this
-  list of conditions and the following disclaimer in the documentation and/or
-  other materials provided with the distribution.
-* Neither my name, Paul Hsieh, nor the names of any other contributors to the
-  code use may not be used to endorse or promote products derived from this
-  software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-/*
-Copyright (c) 2007-2011, Troy D. Hanson   http://uthash.sourceforge.net
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
-IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
-OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-/*
- * Copyright (C) 2010 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
diff --git a/OWNERS.fuzz b/OWNERS.fuzz
deleted file mode 100644
index 8c7567f..0000000
--- a/OWNERS.fuzz
+++ /dev/null
@@ -1,5 +0,0 @@
-cychiang@chromium.org
-dgreid@chromium.org
-enshuo@chromium.org
-paulhsia@chromium.org
-chromeos-audio-bugs@google.com
diff --git a/PRESUBMIT.cfg b/PRESUBMIT.cfg
deleted file mode 100644
index e85e5dc..0000000
--- a/PRESUBMIT.cfg
+++ /dev/null
@@ -1,19 +0,0 @@
-[Hook Overrides]
-tab_check: false
-clang_format_check: true
-cargo_clippy_check: true
-
-# On by default, but required for options below.
-cros_license_check: true
-
-[Hook Overrides Options]
-# Ignore HiFi file
-cros_license_check: --exclude_regex=HiFi\.conf$
-clang_format_check:
-  cras/
-cargo_clippy_check:
-  --project=audio_streams
-  --project=cras/client/cras-sys
-  --project=cras/client/cras_tests
-  --project=cras/client/libcras
-  --project=cras/src/server/rust
diff --git a/audio_streams/.gitignore b/audio_streams/.gitignore
deleted file mode 100644
index fa8d85a..0000000
--- a/audio_streams/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Cargo.lock
-target
diff --git a/audio_streams/Android.bp b/audio_streams/Android.bp
deleted file mode 100644
index 2909b54..0000000
--- a/audio_streams/Android.bp
+++ /dev/null
@@ -1,61 +0,0 @@
-// This file is generated by cargo2android.py --run --device --test --global_defaults=crosvm_defaults --dependencies.
-
-package {
-    // See: http://go/android-license-faq
-    // A large-scale-change added 'default_applicable_licenses' to import
-    // all of the 'license_kinds' from "external_adhd_license"
-    // to get the below license kinds:
-    //   SPDX-license-identifier-BSD
-    default_applicable_licenses: ["external_adhd_license"],
-}
-
-rust_defaults {
-    name: "audio_streams_defaults",
-    defaults: ["crosvm_defaults"],
-    crate_name: "audio_streams",
-    srcs: ["src/audio_streams.rs"],
-    test_suites: ["general-tests"],
-    auto_gen_config: true,
-    edition: "2018",
-    rustlibs: [
-        "libsync_rust",
-        "libsys_util",
-    ],
-}
-
-rust_test_host {
-    name: "audio_streams_host_test_src_audio_streams",
-    defaults: ["audio_streams_defaults"],
-}
-
-rust_test {
-    name: "audio_streams_device_test_src_audio_streams",
-    defaults: ["audio_streams_defaults"],
-}
-
-rust_library {
-    name: "libaudio_streams",
-    defaults: ["crosvm_defaults"],
-    host_supported: true,
-    crate_name: "audio_streams",
-    srcs: ["src/audio_streams.rs"],
-    edition: "2018",
-    rustlibs: [
-        "libsync_rust",
-        "libsys_util",
-    ],
-}
-
-// dependent_library ["feature_list"]
-//   ../../crosvm/assertions/src/lib.rs
-//   ../../crosvm/data_model/src/lib.rs
-//   ../../crosvm/sync/src/lib.rs
-//   ../../crosvm/sys_util/poll_token_derive/poll_token_derive.rs
-//   ../../crosvm/sys_util/src/lib.rs
-//   ../../crosvm/syscall_defines/src/lib.rs
-//   ../../crosvm/tempfile/src/lib.rs
-//   libc-0.2.76 "default,std"
-//   proc-macro2-1.0.19 "default,proc-macro"
-//   quote-1.0.7 "default,proc-macro"
-//   syn-1.0.39 "clone-impls,default,derive,parsing,printing,proc-macro,quote"
-//   unicode-xid-0.2.1 "default"
diff --git a/audio_streams/Cargo.toml b/audio_streams/Cargo.toml
deleted file mode 100644
index dd169c7..0000000
--- a/audio_streams/Cargo.toml
+++ /dev/null
@@ -1,12 +0,0 @@
-[package]
-name = "audio_streams"
-version = "0.1.0"
-authors = ["The Chromium OS Authors"]
-edition = "2018"
-
-[lib]
-path = "src/audio_streams.rs"
-
-[dependencies]
-sync = { path = "../../crosvm/sync" } # provided by ebuild
-sys_util = { path = "../../crosvm/sys_util" } # provided by ebuild
diff --git a/audio_streams/README.md b/audio_streams/README.md
deleted file mode 100644
index d3a02e8..0000000
--- a/audio_streams/README.md
+++ /dev/null
@@ -1,6 +0,0 @@
-# Audio Server and Stream interfaces
-
-The `audio_streams` crate provides a basic interface for playing audio.
-This will be used to enable playback to various audio subsystems such as
-Alsa and cras. To start, an empty playback example `NoopStreamSource`
-is provided.
diff --git a/audio_streams/src/audio_streams.rs b/audio_streams/src/audio_streams.rs
deleted file mode 100644
index e5fc83c..0000000
--- a/audio_streams/src/audio_streams.rs
+++ /dev/null
@@ -1,471 +0,0 @@
-// Copyright 2019 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-//! Provides an interface for playing and recording audio.
-//!
-//! When implementing an audio playback system, the `StreamSource` trait is implemented.
-//! Implementors of this trait allow creation of `PlaybackBufferStream` objects. The
-//! `PlaybackBufferStream` provides the actual audio buffers to be filled with audio samples. These
-//! buffers are obtained by calling `next_playback_buffer`.
-//!
-//! Users playing audio fill the provided buffers with audio. When a `PlaybackBuffer` is dropped,
-//! the samples written to it are committed to the `PlaybackBufferStream` it came from.
-//!
-//! ```
-//! use audio_streams::{BoxError, SampleFormat, StreamSource, NoopStreamSource};
-//! use std::io::Write;
-//!
-//! const buffer_size: usize = 120;
-//! const num_channels: usize = 2;
-//!
-//! # fn main() -> std::result::Result<(), BoxError> {
-//! let mut stream_source = NoopStreamSource::new();
-//! let sample_format = SampleFormat::S16LE;
-//! let frame_size = num_channels * sample_format.sample_bytes();
-//!
-//! let (_, mut stream) = stream_source
-//!     .new_playback_stream(num_channels, sample_format, 48000, buffer_size)?;
-//! // Play 10 buffers of DC.
-//! let mut buf = Vec::new();
-//! buf.resize(buffer_size * frame_size, 0xa5u8);
-//! for _ in 0..10 {
-//!     let mut stream_buffer = stream.next_playback_buffer()?;
-//!     assert_eq!(stream_buffer.write(&buf)?, buffer_size * frame_size);
-//! }
-//! # Ok (())
-//! # }
-//! ```
-
-use std::cmp::min;
-use std::error;
-use std::fmt::{self, Display};
-use std::io::{self, Write};
-use std::os::unix::io::RawFd;
-use std::result::Result;
-use std::str::FromStr;
-use std::time::{Duration, Instant};
-
-#[derive(Copy, Clone, Debug, PartialEq)]
-pub enum SampleFormat {
-    U8,
-    S16LE,
-    S24LE,
-    S32LE,
-}
-
-impl SampleFormat {
-    pub fn sample_bytes(self) -> usize {
-        use SampleFormat::*;
-        match self {
-            U8 => 1,
-            S16LE => 2,
-            S24LE => 4, // Not a typo, S24_LE samples are stored in 4 byte chunks.
-            S32LE => 4,
-        }
-    }
-}
-
-impl Display for SampleFormat {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        use SampleFormat::*;
-        match self {
-            U8 => write!(f, "Unsigned 8 bit"),
-            S16LE => write!(f, "Signed 16 bit Little Endian"),
-            S24LE => write!(f, "Signed 24 bit Little Endian"),
-            S32LE => write!(f, "Signed 32 bit Little Endian"),
-        }
-    }
-}
-
-/// Valid directions of an audio stream.
-#[derive(Copy, Clone, Debug, PartialEq)]
-pub enum StreamDirection {
-    Playback,
-    Capture,
-}
-
-/// Valid effects for an audio stream.
-#[derive(Copy, Clone, Debug, PartialEq)]
-pub enum StreamEffect {
-    NoEffect,
-    EchoCancellation,
-}
-
-pub mod capture;
-pub mod shm_streams;
-
-impl Default for StreamEffect {
-    fn default() -> Self {
-        StreamEffect::NoEffect
-    }
-}
-
-/// Errors that can pass across threads.
-pub type BoxError = Box<dyn error::Error + Send + Sync>;
-
-/// Errors that are possible from a `StreamEffect`.
-#[derive(Debug)]
-pub enum StreamEffectError {
-    InvalidEffect,
-}
-
-impl error::Error for StreamEffectError {}
-
-impl Display for StreamEffectError {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        match self {
-            StreamEffectError::InvalidEffect => write!(f, "Must be in [EchoCancellation, aec]"),
-        }
-    }
-}
-
-impl FromStr for StreamEffect {
-    type Err = StreamEffectError;
-    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
-        match s {
-            "EchoCancellation" | "aec" => Ok(StreamEffect::EchoCancellation),
-            _ => Err(StreamEffectError::InvalidEffect),
-        }
-    }
-}
-
-/// `StreamSource` creates streams for playback or capture of audio.
-pub trait StreamSource: Send {
-    /// Returns a stream control and buffer generator object. These are separate as the buffer
-    /// generator might want to be passed to the audio stream.
-    #[allow(clippy::type_complexity)]
-    fn new_playback_stream(
-        &mut self,
-        num_channels: usize,
-        format: SampleFormat,
-        frame_rate: u32,
-        buffer_size: usize,
-    ) -> Result<(Box<dyn StreamControl>, Box<dyn PlaybackBufferStream>), BoxError>;
-
-    /// Returns a stream control and buffer generator object. These are separate as the buffer
-    /// generator might want to be passed to the audio stream.
-    /// Default implementation returns `NoopStreamControl` and `NoopCaptureStream`.
-    #[allow(clippy::type_complexity)]
-    fn new_capture_stream(
-        &mut self,
-        num_channels: usize,
-        format: SampleFormat,
-        frame_rate: u32,
-        buffer_size: usize,
-    ) -> Result<
-        (
-            Box<dyn StreamControl>,
-            Box<dyn capture::CaptureBufferStream>,
-        ),
-        BoxError,
-    > {
-        Ok((
-            Box::new(NoopStreamControl::new()),
-            Box::new(capture::NoopCaptureStream::new(
-                num_channels,
-                format,
-                frame_rate,
-                buffer_size,
-            )),
-        ))
-    }
-
-    /// Returns any open file descriptors needed by the implementor. The FD list helps users of the
-    /// StreamSource enter Linux jails making sure not to close needed FDs.
-    fn keep_fds(&self) -> Option<Vec<RawFd>> {
-        None
-    }
-}
-
-/// `PlaybackBufferStream` provides `PlaybackBuffer`s to fill with audio samples for playback.
-pub trait PlaybackBufferStream: Send {
-    fn next_playback_buffer(&mut self) -> Result<PlaybackBuffer, BoxError>;
-}
-
-/// `StreamControl` provides a way to set the volume and mute states of a stream. `StreamControl`
-/// is separate from the stream so it can be owned by a different thread if needed.
-pub trait StreamControl: Send + Sync {
-    fn set_volume(&mut self, _scaler: f64) {}
-    fn set_mute(&mut self, _mute: bool) {}
-}
-
-/// `BufferDrop` is used as a callback mechanism for `PlaybackBuffer` objects. It is meant to be
-/// implemented by the audio stream, allowing arbitrary code to be run after a buffer is filled or
-/// read by the user.
-pub trait BufferDrop {
-    /// Called when an audio buffer is dropped. `nframes` indicates the number of audio frames that
-    /// were read or written to the device.
-    fn trigger(&mut self, nframes: usize);
-}
-
-/// Errors that are possible from a `PlaybackBuffer`.
-#[derive(Debug)]
-pub enum PlaybackBufferError {
-    InvalidLength,
-}
-
-impl error::Error for PlaybackBufferError {}
-
-impl Display for PlaybackBufferError {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        match self {
-            PlaybackBufferError::InvalidLength => write!(f, "Invalid buffer length"),
-        }
-    }
-}
-
-/// `AudioBuffer` is one buffer that holds buffer_size audio frames and its drop function.
-/// It is the inner data of `PlaybackBuffer` and `CaptureBuffer`.
-struct AudioBuffer<'a> {
-    buffer: &'a mut [u8],
-    offset: usize,     // Read or Write offset in frames.
-    frame_size: usize, // Size of a frame in bytes.
-    drop: &'a mut dyn BufferDrop,
-}
-
-/// `PlaybackBuffer` is one buffer that holds buffer_size audio frames. It is used to temporarily
-/// allow access to an audio buffer and notifes the owning stream of write completion when dropped.
-pub struct PlaybackBuffer<'a> {
-    buffer: AudioBuffer<'a>,
-}
-
-impl<'a> PlaybackBuffer<'a> {
-    /// Creates a new `PlaybackBuffer` that holds a reference to the backing memory specified in
-    /// `buffer`.
-    pub fn new<F>(
-        frame_size: usize,
-        buffer: &'a mut [u8],
-        drop: &'a mut F,
-    ) -> Result<Self, PlaybackBufferError>
-    where
-        F: BufferDrop,
-    {
-        if buffer.len() % frame_size != 0 {
-            return Err(PlaybackBufferError::InvalidLength);
-        }
-
-        Ok(PlaybackBuffer {
-            buffer: AudioBuffer {
-                buffer,
-                offset: 0,
-                frame_size,
-                drop,
-            },
-        })
-    }
-
-    /// Returns the number of audio frames that fit in the buffer.
-    pub fn frame_capacity(&self) -> usize {
-        self.buffer.buffer.len() / self.buffer.frame_size
-    }
-
-    /// Writes up to `size` bytes directly to this buffer inside of the given callback function.
-    pub fn copy_cb<F: FnOnce(&mut [u8])>(&mut self, size: usize, cb: F) {
-        // only write complete frames.
-        let len = min(
-            size / self.buffer.frame_size * self.buffer.frame_size,
-            self.buffer.buffer.len() - self.buffer.offset,
-        );
-        cb(&mut self.buffer.buffer[self.buffer.offset..(self.buffer.offset + len)]);
-        self.buffer.offset += len;
-    }
-}
-
-impl<'a> Write for PlaybackBuffer<'a> {
-    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
-        // only write complete frames.
-        let len = buf.len() / self.buffer.frame_size * self.buffer.frame_size;
-        let written = (&mut self.buffer.buffer[self.buffer.offset..]).write(&buf[..len])?;
-        self.buffer.offset += written;
-        Ok(written)
-    }
-
-    fn flush(&mut self) -> io::Result<()> {
-        Ok(())
-    }
-}
-
-impl<'a> Drop for PlaybackBuffer<'a> {
-    fn drop(&mut self) {
-        self.buffer
-            .drop
-            .trigger(self.buffer.offset / self.buffer.frame_size);
-    }
-}
-
-/// Stream that accepts playback samples but drops them.
-pub struct NoopStream {
-    buffer: Vec<u8>,
-    frame_size: usize,
-    interval: Duration,
-    next_frame: Duration,
-    start_time: Option<Instant>,
-    buffer_drop: NoopBufferDrop,
-}
-
-/// NoopStream data that is needed from the buffer complete callback.
-struct NoopBufferDrop {
-    which_buffer: bool,
-}
-
-impl BufferDrop for NoopBufferDrop {
-    fn trigger(&mut self, _nwritten: usize) {
-        // When a buffer completes, switch to the other one.
-        self.which_buffer ^= true;
-    }
-}
-
-impl NoopStream {
-    pub fn new(
-        num_channels: usize,
-        format: SampleFormat,
-        frame_rate: u32,
-        buffer_size: usize,
-    ) -> Self {
-        let frame_size = format.sample_bytes() * num_channels;
-        let interval = Duration::from_millis(buffer_size as u64 * 1000 / frame_rate as u64);
-        NoopStream {
-            buffer: vec![0; buffer_size * frame_size],
-            frame_size,
-            interval,
-            next_frame: interval,
-            start_time: None,
-            buffer_drop: NoopBufferDrop {
-                which_buffer: false,
-            },
-        }
-    }
-}
-
-impl PlaybackBufferStream for NoopStream {
-    fn next_playback_buffer(&mut self) -> Result<PlaybackBuffer, BoxError> {
-        if let Some(start_time) = self.start_time {
-            let elapsed = start_time.elapsed();
-            if elapsed < self.next_frame {
-                std::thread::sleep(self.next_frame - elapsed);
-            }
-            self.next_frame += self.interval;
-        } else {
-            self.start_time = Some(Instant::now());
-            self.next_frame = self.interval;
-        }
-        Ok(PlaybackBuffer::new(
-            self.frame_size,
-            &mut self.buffer,
-            &mut self.buffer_drop,
-        )?)
-    }
-}
-
-/// No-op control for `NoopStream`s.
-#[derive(Default)]
-pub struct NoopStreamControl;
-
-impl NoopStreamControl {
-    pub fn new() -> Self {
-        NoopStreamControl {}
-    }
-}
-
-impl StreamControl for NoopStreamControl {}
-
-/// Source of `NoopStream` and `NoopStreamControl` objects.
-#[derive(Default)]
-pub struct NoopStreamSource;
-
-impl NoopStreamSource {
-    pub fn new() -> Self {
-        NoopStreamSource {}
-    }
-}
-
-impl StreamSource for NoopStreamSource {
-    #[allow(clippy::type_complexity)]
-    fn new_playback_stream(
-        &mut self,
-        num_channels: usize,
-        format: SampleFormat,
-        frame_rate: u32,
-        buffer_size: usize,
-    ) -> Result<(Box<dyn StreamControl>, Box<dyn PlaybackBufferStream>), BoxError> {
-        Ok((
-            Box::new(NoopStreamControl::new()),
-            Box::new(NoopStream::new(
-                num_channels,
-                format,
-                frame_rate,
-                buffer_size,
-            )),
-        ))
-    }
-}
-
-#[cfg(test)]
-mod tests {
-    use super::*;
-
-    #[test]
-    fn invalid_buffer_length() {
-        // Playback buffers can't be created with a size that isn't divisible by the frame size.
-        let mut pb_buf = [0xa5u8; 480 * 2 * 2 + 1];
-        let mut buffer_drop = NoopBufferDrop {
-            which_buffer: false,
-        };
-        assert!(PlaybackBuffer::new(2, &mut pb_buf, &mut buffer_drop).is_err());
-    }
-
-    #[test]
-    fn trigger() {
-        struct TestDrop {
-            frame_count: usize,
-        };
-        impl BufferDrop for TestDrop {
-            fn trigger(&mut self, nwritten: usize) {
-                self.frame_count += nwritten;
-            }
-        }
-        let mut test_drop = TestDrop { frame_count: 0 };
-        {
-            const FRAME_SIZE: usize = 4;
-            let mut buf = [0u8; 480 * FRAME_SIZE];
-            let mut pb_buf = PlaybackBuffer::new(FRAME_SIZE, &mut buf, &mut test_drop).unwrap();
-            pb_buf.write_all(&[0xa5u8; 480 * FRAME_SIZE]).unwrap();
-        }
-        assert_eq!(test_drop.frame_count, 480);
-    }
-
-    #[test]
-    fn sixteen_bit_stereo() {
-        let mut server = NoopStreamSource::new();
-        let (_, mut stream) = server
-            .new_playback_stream(2, SampleFormat::S16LE, 48000, 480)
-            .unwrap();
-        let mut stream_buffer = stream.next_playback_buffer().unwrap();
-        assert_eq!(stream_buffer.frame_capacity(), 480);
-        let pb_buf = [0xa5u8; 480 * 2 * 2];
-        assert_eq!(stream_buffer.write(&pb_buf).unwrap(), 480 * 2 * 2);
-    }
-
-    #[test]
-    fn consumption_rate() {
-        let mut server = NoopStreamSource::new();
-        let (_, mut stream) = server
-            .new_playback_stream(2, SampleFormat::S16LE, 48000, 480)
-            .unwrap();
-        let start = Instant::now();
-        {
-            let mut stream_buffer = stream.next_playback_buffer().unwrap();
-            let pb_buf = [0xa5u8; 480 * 2 * 2];
-            assert_eq!(stream_buffer.write(&pb_buf).unwrap(), 480 * 2 * 2);
-        }
-        // The second call should block until the first buffer is consumed.
-        let _stream_buffer = stream.next_playback_buffer().unwrap();
-        let elapsed = start.elapsed();
-        assert!(
-            elapsed > Duration::from_millis(10),
-            "next_playback_buffer didn't block long enough {}",
-            elapsed.subsec_millis()
-        );
-    }
-}
diff --git a/audio_streams/src/capture.rs b/audio_streams/src/capture.rs
deleted file mode 100644
index 6a32cf1..0000000
--- a/audio_streams/src/capture.rs
+++ /dev/null
@@ -1,250 +0,0 @@
-// Copyright 2019 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//! ```
-//! use audio_streams::{BoxError, SampleFormat, StreamSource, NoopStreamSource};
-//! use std::io::Read;
-//!
-//! const buffer_size: usize = 120;
-//! const num_channels: usize = 2;
-//!
-//! # fn main() -> std::result::Result<(),BoxError> {
-//! let mut stream_source = NoopStreamSource::new();
-//! let sample_format = SampleFormat::S16LE;
-//! let frame_size = num_channels * sample_format.sample_bytes();
-//!
-//! let (_, mut stream) = stream_source
-//!     .new_capture_stream(num_channels, sample_format, 48000, buffer_size)?;
-//! // Capture 10 buffers of zeros.
-//! let mut buf = Vec::new();
-//! buf.resize(buffer_size * frame_size, 0xa5u8);
-//! for _ in 0..10 {
-//!     let mut stream_buffer = stream.next_capture_buffer()?;
-//!     assert_eq!(stream_buffer.read(&mut buf)?, buffer_size * frame_size);
-//! }
-//! # Ok (())
-//! # }
-//! ```
-
-use std::{
-    cmp::min,
-    error,
-    fmt::{self, Display},
-    io::{self, Read, Write},
-    time::{Duration, Instant},
-};
-
-use super::{AudioBuffer, BoxError, BufferDrop, NoopBufferDrop, SampleFormat};
-
-/// `CaptureBufferStream` provides `CaptureBuffer`s to read with audio samples from capture.
-pub trait CaptureBufferStream: Send {
-    fn next_capture_buffer(&mut self) -> Result<CaptureBuffer, BoxError>;
-}
-
-/// `CaptureBuffer` contains a block of audio samples got from capture stream. It provides
-/// temporary view to those samples and will notifies capture stream when dropped.
-/// Note that it'll always send `buffer.len() / frame_size` to drop function when it got destroyed
-/// since `CaptureBufferStream` assumes that users get all the samples from the buffer.
-pub struct CaptureBuffer<'a> {
-    buffer: AudioBuffer<'a>,
-}
-
-/// Errors that are possible from a `CaptureBuffer`.
-#[derive(Debug)]
-pub enum CaptureBufferError {
-    InvalidLength,
-}
-
-impl error::Error for CaptureBufferError {}
-
-impl Display for CaptureBufferError {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        match self {
-            CaptureBufferError::InvalidLength => write!(f, "Invalid buffer length"),
-        }
-    }
-}
-
-impl<'a> CaptureBuffer<'a> {
-    /// Creates a new `CaptureBuffer` that holds a reference to the backing memory specified in
-    /// `buffer`.
-    pub fn new<F>(
-        frame_size: usize,
-        buffer: &'a mut [u8],
-        drop: &'a mut F,
-    ) -> Result<Self, CaptureBufferError>
-    where
-        F: BufferDrop,
-    {
-        if buffer.len() % frame_size != 0 {
-            return Err(CaptureBufferError::InvalidLength);
-        }
-
-        Ok(CaptureBuffer {
-            buffer: AudioBuffer {
-                buffer,
-                frame_size,
-                offset: 0,
-                drop,
-            },
-        })
-    }
-
-    /// Returns the number of audio frames that fit in the buffer.
-    pub fn frame_capacity(&self) -> usize {
-        self.buffer.buffer.len() / self.buffer.frame_size
-    }
-
-    /// Reads up to `size` bytes directly from this buffer inside of the given callback function.
-    pub fn copy_cb<F: FnOnce(&[u8])>(&mut self, size: usize, cb: F) {
-        let len = min(
-            size / self.buffer.frame_size * self.buffer.frame_size,
-            self.buffer.buffer.len() - self.buffer.offset,
-        );
-        cb(&self.buffer.buffer[self.buffer.offset..(self.buffer.offset + len)]);
-        self.buffer.offset += len;
-    }
-}
-
-impl<'a> Read for CaptureBuffer<'a> {
-    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
-        let len = buf.len() / self.buffer.frame_size * self.buffer.frame_size;
-        let written = (&mut buf[..len]).write(&self.buffer.buffer[self.buffer.offset..])?;
-        self.buffer.offset += written;
-        Ok(written)
-    }
-}
-
-/// Always sends `frame_capacity` when it drops.
-impl<'a> Drop for CaptureBuffer<'a> {
-    fn drop(&mut self) {
-        self.buffer.drop.trigger(self.frame_capacity());
-    }
-}
-
-/// Stream that provides null capture samples.
-pub struct NoopCaptureStream {
-    buffer: Vec<u8>,
-    frame_size: usize,
-    interval: Duration,
-    next_frame: Duration,
-    start_time: Option<Instant>,
-    buffer_drop: NoopBufferDrop,
-}
-
-impl NoopCaptureStream {
-    pub fn new(
-        num_channels: usize,
-        format: SampleFormat,
-        frame_rate: u32,
-        buffer_size: usize,
-    ) -> Self {
-        let frame_size = format.sample_bytes() * num_channels;
-        let interval = Duration::from_millis(buffer_size as u64 * 1000 / frame_rate as u64);
-        NoopCaptureStream {
-            buffer: vec![0; buffer_size * frame_size],
-            frame_size,
-            interval,
-            next_frame: interval,
-            start_time: None,
-            buffer_drop: NoopBufferDrop {
-                which_buffer: false,
-            },
-        }
-    }
-}
-
-impl CaptureBufferStream for NoopCaptureStream {
-    fn next_capture_buffer(&mut self) -> Result<CaptureBuffer, BoxError> {
-        if let Some(start_time) = self.start_time {
-            let elapsed = start_time.elapsed();
-            if elapsed < self.next_frame {
-                std::thread::sleep(self.next_frame - elapsed);
-            }
-            self.next_frame += self.interval;
-        } else {
-            self.start_time = Some(Instant::now());
-            self.next_frame = self.interval;
-        }
-        Ok(CaptureBuffer::new(
-            self.frame_size,
-            &mut self.buffer,
-            &mut self.buffer_drop,
-        )?)
-    }
-}
-
-#[cfg(test)]
-mod tests {
-    use super::super::*;
-    use super::*;
-
-    #[test]
-    fn invalid_buffer_length() {
-        // Capture buffers can't be created with a size that isn't divisible by the frame size.
-        let mut cp_buf = [0xa5u8; 480 * 2 * 2 + 1];
-        let mut buffer_drop = NoopBufferDrop {
-            which_buffer: false,
-        };
-        assert!(CaptureBuffer::new(2, &mut cp_buf, &mut buffer_drop).is_err());
-    }
-
-    #[test]
-    fn trigger() {
-        struct TestDrop {
-            frame_count: usize,
-        };
-        impl BufferDrop for TestDrop {
-            fn trigger(&mut self, nwritten: usize) {
-                self.frame_count += nwritten;
-            }
-        }
-        let mut test_drop = TestDrop { frame_count: 0 };
-        {
-            const FRAME_SIZE: usize = 4;
-            let mut buf = [0u8; 480 * FRAME_SIZE];
-            let mut cp_buf = CaptureBuffer::new(FRAME_SIZE, &mut buf, &mut test_drop).unwrap();
-            let mut local_buf = [0u8; 240 * FRAME_SIZE];
-            assert_eq!(cp_buf.read(&mut local_buf).unwrap(), 240 * FRAME_SIZE);
-        }
-        // This should be 480 no matter how many samples are read.
-        assert_eq!(test_drop.frame_count, 480);
-    }
-
-    #[test]
-    fn sixteen_bit_stereo() {
-        let mut server = NoopStreamSource::new();
-        let (_, mut stream) = server
-            .new_capture_stream(2, SampleFormat::S16LE, 48000, 480)
-            .unwrap();
-        let mut stream_buffer = stream.next_capture_buffer().unwrap();
-        assert_eq!(stream_buffer.frame_capacity(), 480);
-        let mut pb_buf = [0xa5u8; 480 * 2 * 2];
-        assert_eq!(stream_buffer.read(&mut pb_buf).unwrap(), 480 * 2 * 2);
-    }
-
-    #[test]
-    fn consumption_rate() {
-        let mut server = NoopStreamSource::new();
-        let (_, mut stream) = server
-            .new_capture_stream(2, SampleFormat::S16LE, 48000, 480)
-            .unwrap();
-        let start = Instant::now();
-        {
-            let mut stream_buffer = stream.next_capture_buffer().unwrap();
-            let mut cp_buf = [0xa5u8; 480 * 2 * 2];
-            assert_eq!(stream_buffer.read(&mut cp_buf).unwrap(), 480 * 2 * 2);
-            for buf in cp_buf.iter() {
-                assert_eq!(*buf, 0, "Read samples should all be zeros.");
-            }
-        }
-        // The second call should block until the first buffer is consumed.
-        let _stream_buffer = stream.next_capture_buffer().unwrap();
-        let elapsed = start.elapsed();
-        assert!(
-            elapsed > Duration::from_millis(10),
-            "next_capture_buffer didn't block long enough {}",
-            elapsed.subsec_millis()
-        );
-    }
-}
diff --git a/audio_streams/src/shm_streams.rs b/audio_streams/src/shm_streams.rs
deleted file mode 100644
index b11626f..0000000
--- a/audio_streams/src/shm_streams.rs
+++ /dev/null
@@ -1,568 +0,0 @@
-// Copyright 2019 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-use std::error;
-use std::fmt;
-use std::os::unix::io::RawFd;
-use std::sync::Arc;
-use std::time::{Duration, Instant};
-
-use sync::{Condvar, Mutex};
-use sys_util::SharedMemory;
-
-use crate::{BoxError, SampleFormat, StreamDirection, StreamEffect};
-
-type GenericResult<T> = std::result::Result<T, BoxError>;
-
-/// `BufferSet` is used as a callback mechanism for `ServerRequest` objects.
-/// It is meant to be implemented by the audio stream, allowing arbitrary code
-/// to be run after a buffer offset and length is set.
-pub trait BufferSet {
-    /// Called when the client sets a buffer offset and length.
-    ///
-    /// `offset` is the offset within shared memory of the buffer and `frames`
-    /// indicates the number of audio frames that can be read from or written to
-    /// the buffer.
-    fn callback(&mut self, offset: usize, frames: usize) -> GenericResult<()>;
-
-    /// Called when the client ignores a request from the server.
-    fn ignore(&mut self) -> GenericResult<()>;
-}
-
-#[derive(Debug)]
-pub enum Error {
-    TooManyFrames(usize, usize),
-}
-
-impl error::Error for Error {}
-
-impl fmt::Display for Error {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        match self {
-            Error::TooManyFrames(provided, requested) => write!(
-                f,
-                "Provided number of frames {} exceeds requested number of frames {}",
-                provided, requested
-            ),
-        }
-    }
-}
-
-/// `ServerRequest` represents an active request from the server for the client
-/// to provide a buffer in shared memory to playback from or capture to.
-pub struct ServerRequest<'a> {
-    requested_frames: usize,
-    buffer_set: &'a mut dyn BufferSet,
-}
-
-impl<'a> ServerRequest<'a> {
-    /// Create a new ServerRequest object
-    ///
-    /// Create a ServerRequest object representing a request from the server
-    /// for a buffer `requested_frames` in size.
-    ///
-    /// When the client responds to this request by calling
-    /// [`set_buffer_offset_and_frames`](ServerRequest::set_buffer_offset_and_frames),
-    /// BufferSet::callback will be called on `buffer_set`.
-    ///
-    /// # Arguments
-    /// * `requested_frames` - The requested buffer size in frames.
-    /// * `buffer_set` - The object implementing the callback for when a buffer is provided.
-    pub fn new<D: BufferSet>(requested_frames: usize, buffer_set: &'a mut D) -> Self {
-        Self {
-            requested_frames,
-            buffer_set,
-        }
-    }
-
-    /// Get the number of frames of audio data requested by the server.
-    ///
-    /// The returned value should never be greater than the `buffer_size`
-    /// given in [`new_stream`](ShmStreamSource::new_stream).
-    pub fn requested_frames(&self) -> usize {
-        self.requested_frames
-    }
-
-    /// Sets the buffer offset and length for the requested buffer.
-    ///
-    /// Sets the buffer offset and length of the buffer that fulfills this
-    /// server request to `offset` and `length`, respectively. This means that
-    /// `length` bytes of audio samples may be read from/written to that
-    /// location in `client_shm` for a playback/capture stream, respectively.
-    /// This function may only be called once for a `ServerRequest`, at which
-    /// point the ServerRequest is dropped and no further calls are possible.
-    ///
-    /// # Arguments
-    ///
-    /// * `offset` - The value to use as the new buffer offset for the next buffer.
-    /// * `frames` - The length of the next buffer in frames.
-    ///
-    /// # Errors
-    ///
-    /// * If `frames` is greater than `requested_frames`.
-    pub fn set_buffer_offset_and_frames(self, offset: usize, frames: usize) -> GenericResult<()> {
-        if frames > self.requested_frames {
-            return Err(Box::new(Error::TooManyFrames(
-                frames,
-                self.requested_frames,
-            )));
-        }
-
-        self.buffer_set.callback(offset, frames)
-    }
-
-    /// Ignore this request
-    ///
-    /// If the client does not intend to respond to this ServerRequest with a
-    /// buffer, they should call this function. The stream will be notified that
-    /// the request has been ignored and will handle it properly.
-    pub fn ignore_request(self) -> GenericResult<()> {
-        self.buffer_set.ignore()
-    }
-}
-
-/// `ShmStream` allows a client to interact with an active CRAS stream.
-pub trait ShmStream: Send {
-    /// Get the size of a frame of audio data for this stream.
-    fn frame_size(&self) -> usize;
-
-    /// Get the number of channels of audio data for this stream.
-    fn num_channels(&self) -> usize;
-
-    /// Get the frame rate of audio data for this stream.
-    fn frame_rate(&self) -> u32;
-
-    /// Waits until the next server message indicating action is required.
-    ///
-    /// For playback streams, this will be `AUDIO_MESSAGE_REQUEST_DATA`, meaning
-    /// that we must set the buffer offset to the next location where playback
-    /// data can be found.
-    /// For capture streams, this will be `AUDIO_MESSAGE_DATA_READY`, meaning
-    /// that we must set the buffer offset to the next location where captured
-    /// data can be written to.
-    /// Will return early if `timeout` elapses before a message is received.
-    ///
-    /// # Arguments
-    ///
-    /// * `timeout` - The amount of time to wait until a message is received.
-    ///
-    /// # Return value
-    ///
-    /// Returns `Some(request)` where `request` is an object that implements the
-    /// [`ServerRequest`](ServerRequest) trait and which can be used to get the
-    /// number of bytes requested for playback streams or that have already been
-    /// written to shm for capture streams.
-    ///
-    /// If the timeout occurs before a message is received, returns `None`.
-    ///
-    /// # Errors
-    ///
-    /// * If an invalid message type is received for the stream.
-    fn wait_for_next_action_with_timeout(
-        &mut self,
-        timeout: Duration,
-    ) -> GenericResult<Option<ServerRequest>>;
-}
-
-/// `ShmStreamSource` creates streams for playback or capture of audio.
-pub trait ShmStreamSource: Send {
-    /// Creates a new [`ShmStream`](ShmStream)
-    ///
-    /// Creates a new `ShmStream` object, which allows:
-    /// * Waiting until the server has communicated that data is ready or
-    ///   requested that we make more data available.
-    /// * Setting the location and length of buffers for reading/writing audio data.
-    ///
-    /// # Arguments
-    ///
-    /// * `direction` - The direction of the stream, either `Playback` or `Capture`.
-    /// * `num_channels` - The number of audio channels for the stream.
-    /// * `format` - The audio format to use for audio samples.
-    /// * `frame_rate` - The stream's frame rate in Hz.
-    /// * `buffer_size` - The maximum size of an audio buffer. This will be the
-    ///                   size used for transfers of audio data between client
-    ///                   and server.
-    /// * `effects` - Audio effects to use for the stream, such as echo-cancellation.
-    /// * `client_shm` - The shared memory area that will contain samples.
-    /// * `buffer_offsets` - The two initial values to use as buffer offsets
-    ///                      for streams. This way, the server will not write
-    ///                      audio data to an arbitrary offset in `client_shm`
-    ///                      if the client fails to update offsets in time.
-    ///
-    /// # Errors
-    ///
-    /// * If sending the connect stream message to the server fails.
-    #[allow(clippy::too_many_arguments)]
-    fn new_stream(
-        &mut self,
-        direction: StreamDirection,
-        num_channels: usize,
-        format: SampleFormat,
-        frame_rate: u32,
-        buffer_size: usize,
-        effects: &[StreamEffect],
-        client_shm: &SharedMemory,
-        buffer_offsets: [u64; 2],
-    ) -> GenericResult<Box<dyn ShmStream>>;
-
-    /// Get a list of file descriptors used by the implementation.
-    ///
-    /// Returns any open file descriptors needed by the implementation.
-    /// This list helps users of the ShmStreamSource enter Linux jails without
-    /// closing needed file descriptors.
-    fn keep_fds(&self) -> Vec<RawFd> {
-        Vec::new()
-    }
-}
-
-/// Class that implements ShmStream trait but does nothing with the samples
-pub struct NullShmStream {
-    num_channels: usize,
-    frame_rate: u32,
-    buffer_size: usize,
-    frame_size: usize,
-    interval: Duration,
-    next_frame: Duration,
-    start_time: Instant,
-}
-
-impl NullShmStream {
-    /// Attempt to create a new NullShmStream with the given number of channels,
-    /// format, frame_rate, and buffer_size.
-    pub fn new(
-        buffer_size: usize,
-        num_channels: usize,
-        format: SampleFormat,
-        frame_rate: u32,
-    ) -> Self {
-        let interval = Duration::from_millis(buffer_size as u64 * 1000 / frame_rate as u64);
-        Self {
-            num_channels,
-            frame_rate,
-            buffer_size,
-            frame_size: format.sample_bytes() * num_channels,
-            interval,
-            next_frame: interval,
-            start_time: Instant::now(),
-        }
-    }
-}
-
-impl BufferSet for NullShmStream {
-    fn callback(&mut self, _offset: usize, _frames: usize) -> GenericResult<()> {
-        Ok(())
-    }
-
-    fn ignore(&mut self) -> GenericResult<()> {
-        Ok(())
-    }
-}
-
-impl ShmStream for NullShmStream {
-    fn frame_size(&self) -> usize {
-        self.frame_size
-    }
-
-    fn num_channels(&self) -> usize {
-        self.num_channels
-    }
-
-    fn frame_rate(&self) -> u32 {
-        self.frame_rate
-    }
-
-    fn wait_for_next_action_with_timeout(
-        &mut self,
-        timeout: Duration,
-    ) -> GenericResult<Option<ServerRequest>> {
-        let elapsed = self.start_time.elapsed();
-        if elapsed < self.next_frame {
-            if timeout < self.next_frame - elapsed {
-                std::thread::sleep(timeout);
-                return Ok(None);
-            } else {
-                std::thread::sleep(self.next_frame - elapsed);
-            }
-        }
-        self.next_frame += self.interval;
-        Ok(Some(ServerRequest::new(self.buffer_size, self)))
-    }
-}
-
-/// Source of `NullShmStream` objects.
-#[derive(Default)]
-pub struct NullShmStreamSource;
-
-impl NullShmStreamSource {
-    pub fn new() -> Self {
-        Self::default()
-    }
-}
-
-impl ShmStreamSource for NullShmStreamSource {
-    fn new_stream(
-        &mut self,
-        _direction: StreamDirection,
-        num_channels: usize,
-        format: SampleFormat,
-        frame_rate: u32,
-        buffer_size: usize,
-        _effects: &[StreamEffect],
-        _client_shm: &SharedMemory,
-        _buffer_offsets: [u64; 2],
-    ) -> GenericResult<Box<dyn ShmStream>> {
-        let new_stream = NullShmStream::new(buffer_size, num_channels, format, frame_rate);
-        Ok(Box::new(new_stream))
-    }
-}
-
-#[derive(Clone)]
-pub struct MockShmStream {
-    num_channels: usize,
-    frame_rate: u32,
-    request_size: usize,
-    frame_size: usize,
-    request_notifier: Arc<(Mutex<bool>, Condvar)>,
-}
-
-impl MockShmStream {
-    /// Attempt to create a new MockShmStream with the given number of
-    /// channels, frame_rate, format, and buffer_size.
-    pub fn new(
-        num_channels: usize,
-        frame_rate: u32,
-        format: SampleFormat,
-        buffer_size: usize,
-    ) -> Self {
-        Self {
-            num_channels,
-            frame_rate,
-            request_size: buffer_size,
-            frame_size: format.sample_bytes() * num_channels,
-            request_notifier: Arc::new((Mutex::new(false), Condvar::new())),
-        }
-    }
-
-    /// Call to request data from the stream, causing it to return from
-    /// `wait_for_next_action_with_timeout`. Will block until
-    /// `set_buffer_offset_and_frames` is called on the ServerRequest returned
-    /// from `wait_for_next_action_with_timeout`, or until `timeout` elapses.
-    /// Returns true if a response was successfully received.
-    pub fn trigger_callback_with_timeout(&mut self, timeout: Duration) -> bool {
-        let &(ref lock, ref cvar) = &*self.request_notifier;
-        let mut requested = lock.lock();
-        *requested = true;
-        cvar.notify_one();
-        let start_time = Instant::now();
-        while *requested {
-            requested = cvar.wait_timeout(requested, timeout).0;
-            if start_time.elapsed() > timeout {
-                // We failed to get a callback in time, mark this as false.
-                *requested = false;
-                return false;
-            }
-        }
-
-        true
-    }
-
-    fn notify_request(&mut self) {
-        let &(ref lock, ref cvar) = &*self.request_notifier;
-        let mut requested = lock.lock();
-        *requested = false;
-        cvar.notify_one();
-    }
-}
-
-impl BufferSet for MockShmStream {
-    fn callback(&mut self, _offset: usize, _frames: usize) -> GenericResult<()> {
-        self.notify_request();
-        Ok(())
-    }
-
-    fn ignore(&mut self) -> GenericResult<()> {
-        self.notify_request();
-        Ok(())
-    }
-}
-
-impl ShmStream for MockShmStream {
-    fn frame_size(&self) -> usize {
-        self.frame_size
-    }
-
-    fn num_channels(&self) -> usize {
-        self.num_channels
-    }
-
-    fn frame_rate(&self) -> u32 {
-        self.frame_rate
-    }
-
-    fn wait_for_next_action_with_timeout(
-        &mut self,
-        timeout: Duration,
-    ) -> GenericResult<Option<ServerRequest>> {
-        {
-            let start_time = Instant::now();
-            let &(ref lock, ref cvar) = &*self.request_notifier;
-            let mut requested = lock.lock();
-            while !*requested {
-                requested = cvar.wait_timeout(requested, timeout).0;
-                if start_time.elapsed() > timeout {
-                    return Ok(None);
-                }
-            }
-        }
-
-        Ok(Some(ServerRequest::new(self.request_size, self)))
-    }
-}
-
-/// Source of `MockShmStream` objects.
-#[derive(Clone, Default)]
-pub struct MockShmStreamSource {
-    last_stream: Arc<(Mutex<Option<MockShmStream>>, Condvar)>,
-}
-
-impl MockShmStreamSource {
-    pub fn new() -> Self {
-        Default::default()
-    }
-
-    /// Get the last stream that has been created from this source. If no stream
-    /// has been created, block until one has.
-    pub fn get_last_stream(&self) -> MockShmStream {
-        let &(ref last_stream, ref cvar) = &*self.last_stream;
-        let mut stream = last_stream.lock();
-        loop {
-            match &*stream {
-                None => stream = cvar.wait(stream),
-                Some(ref s) => return s.clone(),
-            };
-        }
-    }
-}
-
-impl ShmStreamSource for MockShmStreamSource {
-    fn new_stream(
-        &mut self,
-        _direction: StreamDirection,
-        num_channels: usize,
-        format: SampleFormat,
-        frame_rate: u32,
-        buffer_size: usize,
-        _effects: &[StreamEffect],
-        _client_shm: &SharedMemory,
-        _buffer_offsets: [u64; 2],
-    ) -> GenericResult<Box<dyn ShmStream>> {
-        let &(ref last_stream, ref cvar) = &*self.last_stream;
-        let mut stream = last_stream.lock();
-
-        let new_stream = MockShmStream::new(num_channels, frame_rate, format, buffer_size);
-        *stream = Some(new_stream.clone());
-        cvar.notify_one();
-        Ok(Box::new(new_stream))
-    }
-}
-
-#[cfg(test)]
-pub mod tests {
-    use super::*;
-
-    #[test]
-    fn mock_trigger_callback() {
-        let stream_source = MockShmStreamSource::new();
-        let mut thread_stream_source = stream_source.clone();
-
-        let buffer_size = 480;
-        let num_channels = 2;
-        let format = SampleFormat::S24LE;
-        let shm = SharedMemory::anon().expect("Failed to create shm");
-
-        let handle = std::thread::spawn(move || {
-            let mut stream = thread_stream_source
-                .new_stream(
-                    StreamDirection::Playback,
-                    num_channels,
-                    format,
-                    44100,
-                    buffer_size,
-                    &[],
-                    &shm,
-                    [400, 8000],
-                )
-                .expect("Failed to create stream");
-
-            let request = stream
-                .wait_for_next_action_with_timeout(Duration::from_secs(5))
-                .expect("Failed to wait for next action");
-            match request {
-                Some(r) => {
-                    let requested = r.requested_frames();
-                    r.set_buffer_offset_and_frames(872, requested)
-                        .expect("Failed to set buffer offset and frames");
-                    requested
-                }
-                None => 0,
-            }
-        });
-
-        let mut stream = stream_source.get_last_stream();
-        assert!(stream.trigger_callback_with_timeout(Duration::from_secs(1)));
-
-        let requested_frames = handle.join().expect("Failed to join thread");
-        assert_eq!(requested_frames, buffer_size);
-    }
-
-    #[test]
-    fn null_consumption_rate() {
-        let frame_rate = 44100;
-        let buffer_size = 480;
-        let interval = Duration::from_millis(buffer_size as u64 * 1000 / frame_rate as u64);
-
-        let shm = SharedMemory::anon().expect("Failed to create shm");
-
-        let start = Instant::now();
-
-        let mut stream_source = NullShmStreamSource::new();
-        let mut stream = stream_source
-            .new_stream(
-                StreamDirection::Playback,
-                2,
-                SampleFormat::S24LE,
-                frame_rate,
-                buffer_size,
-                &[],
-                &shm,
-                [400, 8000],
-            )
-            .expect("Failed to create stream");
-
-        let timeout = Duration::from_secs(5);
-        let request = stream
-            .wait_for_next_action_with_timeout(timeout)
-            .expect("Failed to wait for first request")
-            .expect("First request should not have timed out");
-        request
-            .set_buffer_offset_and_frames(276, 480)
-            .expect("Failed to set buffer offset and length");
-
-        // The second call should block until the first buffer is consumed.
-        let _request = stream
-            .wait_for_next_action_with_timeout(timeout)
-            .expect("Failed to wait for second request");
-        let elapsed = start.elapsed();
-        assert!(
-            elapsed > interval,
-            "wait_for_next_action_with_timeout didn't block long enough: {:?}",
-            elapsed
-        );
-
-        assert!(
-            elapsed < timeout,
-            "wait_for_next_action_with_timeout blocked for too long: {:?}",
-            elapsed
-        );
-    }
-}
diff --git a/cras-config/device_blocklist b/cras-config/device_blocklist
deleted file mode 100644
index 19a9b03..0000000
--- a/cras-config/device_blocklist
+++ /dev/null
@@ -1,2 +0,0 @@
-[USB_Outputs]
-  0d8c_0008_3cd197dd_0 = 1 ; CAD-u1 mic crosbug.com/32278
diff --git a/cras-config/dsp.ini.sample b/cras-config/dsp.ini.sample
deleted file mode 100644
index c3ca127..0000000
--- a/cras-config/dsp.ini.sample
+++ /dev/null
@@ -1,104 +0,0 @@
-[output_source]
-library=builtin
-label=source
-purpose=playback
-disable=(equal? output_jack "HDMI")
-output_0={src:0}
-output_1={src:1}
-
-[output_sink]
-library=builtin
-label=sink
-purpose=playback
-disable=(equal? output_jack "HDMI")
-input_0={dst:0}
-input_1={dst:1}
-
-[drc]
-library=builtin
-label=drc
-input_0={src:0}
-input_1={src:1}
-output_2={intermediate:0}
-output_3={intermediate:1}
-input_4=0       ; emphasis_disabled
-input_5=0       ; f
-input_6=0       ; enable
-input_7=-29     ; threshold
-input_8=3       ; knee
-input_9=6.677   ; ratio
-input_10=0.02    ; attack
-input_11=0.2     ; release
-input_12=-7      ; boost
-input_13=200     ; f
-input_14=1       ; enable
-input_15=-32     ; threshold
-input_16=23      ; knee
-input_17=12      ; ratio
-input_18=0.02    ; attack
-input_19=0.2     ; release
-input_20=0.7     ; boost
-input_21=1200    ; f
-input_22=1       ; enable
-input_23=-24     ; threshold
-input_24=30      ; knee
-input_25=1       ; ratio
-input_26=0.001   ; attack
-input_27=1       ; release
-input_28=0       ; boost
-
-[eq2]
-library=builtin
-label=eq2
-input_0={intermediate:0}
-input_1={intermediate:1}
-output_2={dst:0}
-output_3={dst:1}
-input_4=6       ; peaking
-input_5=380     ; freq
-input_6=3       ; Q
-input_7=-10     ; gain
-input_8=6       ; peaking
-input_9=450     ; freq
-input_10=3       ; Q
-input_11=-12     ; gain
-input_12=6       ; peaking
-input_13=720     ; freq
-input_14=3       ; Q
-input_15=-12     ; gain
-input_16=6       ; peaking
-input_17=721     ; freq
-input_18=3       ; Q
-input_19=-12     ; gain
-input_20=6       ; peaking
-input_21=1705    ; freq
-input_22=3       ; Q
-input_23=-8      ; gain
-input_24=6       ; peaking
-input_25=1800    ; freq
-input_26=8       ; Q
-input_27=-10.2   ; gain
-input_28=2       ; highpass
-input_29=218     ; freq
-input_30=0.7     ; Q
-input_31=-10.2   ; gain
-input_32=6       ; peaking
-input_33=580     ; freq
-input_34=6       ; Q
-input_35=-8      ; gain
-input_36=6       ; peaking
-input_37=580     ; freq
-input_38=6       ; Q
-input_39=-8      ; gain
-input_40=2       ; highpass
-input_41=250     ; freq
-input_42=0.6578  ; Q
-input_43=0       ; gain
-input_44=5       ; highshelf
-input_45=8000    ; freq
-input_46=3       ; Q
-input_47=2       ; gain
-input_48=5       ; highshelf
-input_49=8000    ; freq
-input_50=0       ; Q
-input_51=2       ; gain
diff --git a/cras-config/for_all_boards/Chat 150 C b/cras-config/for_all_boards/Chat 150 C
deleted file mode 100644
index 047ab29..0000000
--- a/cras-config/for_all_boards/Chat 150 C
+++ /dev/null
@@ -1,4 +0,0 @@
-[Default]
-  volume_curve = simple_step
-  volume_step = 25
-  max_volume = 0
diff --git a/cras-config/for_all_boards/Jabra SPEAK 810 b/cras-config/for_all_boards/Jabra SPEAK 810
deleted file mode 100644
index 5117dd2..0000000
--- a/cras-config/for_all_boards/Jabra SPEAK 810
+++ /dev/null
@@ -1,4 +0,0 @@
-[Default]
-  volume_curve = simple_step
-  volume_step = 30
-  max_volume = 0
diff --git a/cras-config/for_all_boards/Logitech MeetUp Speakerphone b/cras-config/for_all_boards/Logitech MeetUp Speakerphone
deleted file mode 100644
index 429835f..0000000
--- a/cras-config/for_all_boards/Logitech MeetUp Speakerphone
+++ /dev/null
@@ -1,103 +0,0 @@
-[Default]
-  volume_curve = explicit
-  db_at_100 = 0
-  db_at_99 = -30
-  db_at_98 = -60
-  db_at_97 = -90
-  db_at_96 = -120
-  db_at_95 = -150
-  db_at_94 = -180
-  db_at_93 = -210
-  db_at_92 = -240
-  db_at_91 = -270
-  db_at_90 = -300
-  db_at_89 = -330
-  db_at_88 = -360
-  db_at_87 = -390
-  db_at_86 = -420
-  db_at_85 = -450
-  db_at_84 = -480
-  db_at_83 = -510
-  db_at_82 = -540
-  db_at_81 = -570
-  db_at_80 = -600
-  db_at_79 = -630
-  db_at_78 = -660
-  db_at_77 = -690
-  db_at_76 = -720
-  db_at_75 = -750
-  db_at_74 = -780
-  db_at_73 = -810
-  db_at_72 = -840
-  db_at_71 = -870
-  db_at_70 = -900
-  db_at_69 = -930
-  db_at_68 = -960
-  db_at_67 = -990
-  db_at_66 = -1020
-  db_at_65 = -1050
-  db_at_64 = -1080
-  db_at_63 = -1110
-  db_at_62 = -1140
-  db_at_61 = -1170
-  db_at_60 = -1200
-  db_at_59 = -1230
-  db_at_58 = -1260
-  db_at_57 = -1290
-  db_at_56 = -1320
-  db_at_55 = -1350
-  db_at_54 = -1380
-  db_at_53 = -1410
-  db_at_52 = -1440
-  db_at_51 = -1470
-  db_at_50 = -1500
-  db_at_49 = -1560
-  db_at_48 = -1620
-  db_at_47 = -1680
-  db_at_46 = -1740
-  db_at_45 = -1800
-  db_at_44 = -1860
-  db_at_43 = -1920
-  db_at_42 = -1980
-  db_at_41 = -2040
-  db_at_40 = -2100
-  db_at_39 = -2160
-  db_at_38 = -2220
-  db_at_37 = -2280
-  db_at_36 = -2340
-  db_at_35 = -2400
-  db_at_34 = -2460
-  db_at_33 = -2520
-  db_at_32 = -2580
-  db_at_31 = -2640
-  db_at_30 = -2700
-  db_at_29 = -2760
-  db_at_28 = -2820
-  db_at_27 = -2880
-  db_at_26 = -2940
-  db_at_25 = -3000
-  db_at_24 = -3060
-  db_at_23 = -3120
-  db_at_22 = -3180
-  db_at_21 = -3240
-  db_at_20 = -3300
-  db_at_19 = -3360
-  db_at_18 = -3420
-  db_at_17 = -3480
-  db_at_16 = -3540
-  db_at_15 = -3600
-  db_at_14 = -3660
-  db_at_13 = -3720
-  db_at_12 = -3780
-  db_at_11 = -3840
-  db_at_10 = -3900
-  db_at_9 = -3960
-  db_at_8 = -4020
-  db_at_7 = -4080
-  db_at_6 = -4140
-  db_at_5 = -4200
-  db_at_4 = -4260
-  db_at_3 = -4320
-  db_at_2 = -4380
-  db_at_1 = -4440
-  db_at_0 = -4500
diff --git a/cras/.gitignore b/cras/.gitignore
deleted file mode 100644
index dcbb180..0000000
--- a/cras/.gitignore
+++ /dev/null
@@ -1,45 +0,0 @@
-*.o
-*.la
-*.lo
-*.a
-*.so*
-*.log
-*.d
-*.swp
-*.trs
-.deps
-.dirstamp
-.libs
-
-/.__autoconf_trace_data
-/.elibtoolized
-/aclocal.m4
-/ar-lib
-/autom4te.cache/
-/compile
-/config.cache
-/config.guess
-/config.log
-/config.status
-/config.sub
-/configure
-/depcomp
-/install-sh
-/libtool
-/ltmain.sh
-/missing
-/test-driver
-Makefile.in
-
-tags
-/Makefile
-/libcras.pc
-/src/Makefile
-/src/*_unittest
-/src/*_test
-/src/cmpraw
-/src/cras
-/src/cras_monitor
-/src/cras_router
-/src/cras_test_client
-/src/common/cras_version.h
diff --git a/cras/Makefile.am b/cras/Makefile.am
deleted file mode 100644
index 6c89bdc..0000000
--- a/cras/Makefile.am
+++ /dev/null
@@ -1,14 +0,0 @@
-# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-AUTOMAKE_OPTIONS = foreign
-SUBDIRS = src
-pkgconfigdir = $(libdir)/pkgconfig
-pkgconfig_DATA = libcras.pc
-
-compile_commands.json:
-	which bear || (echo "Please install 'bear' first." && exit 1)
-	bear make check -j$(nproc)
-
-clean-local:
-	rm -f compile_commands.json
diff --git a/cras/README.dbus-api b/cras/README.dbus-api
deleted file mode 100644
index f347358..0000000
--- a/cras/README.dbus-api
+++ /dev/null
@@ -1,238 +0,0 @@
-CRAS dbus methods and signals.
-==============================
-
-Service		org.chromium.cras
-Interface	org.chromium.cras.Control
-Object Path	/org/chromium/cras
-
-Methods		void SetOutputVolume(int32 volume)
-
-			Sets the volume of the system.  Volume ranges from
-			0 to 100, and will be translated to dB based on the
-			output-specific volume curve.
-
-		void SetOutputNodeVolume(uint64 node_id, int32 volume)
-
-			Sets the volume of the given node.  Volume ranges from
-			0 to 100, and will be translated to dB based on the
-			output-specific volume curve.
-
-		void SwapLeftRight(uint64 node_id, boolean swap)
-
-			Swap the left and right channel of the given node.
-			Message will be dropped if this feature is not supported.
-
-		void SetOutputMute(boolean mute_on)
-
-			Sets the system output mute.
-
-		void SetOutputUserMute(boolean mute_on)
-
-			Sets the system output mute from user action.
-
-		void SetInputNodeGain(uint64 node_id, int32 gain)
-
-			Sets the capture gain of the node. gain is a 0-100
-			integer which linearly maps [0, 50] to range [-40dB, 0dB]
-			and [50, 100] to [0dB, 20dB],
-			Default gain value is 50, which is 0dB.
-
-		void SetInputMute(boolean mute_on)
-
-			Sets the capture mute state of the system.  Recordings
-			will be muted when this is set.
-
-		void GetVolumeState()
-
-			Returns the volume and capture gain as follows:
-				int32 output_volume (0-100)
-				boolean output_mute
-				int32 input_gain (in dBFS * 100)
-				boolean input_mute
-				boolean output_user_mute
-
-		void GetDefaultOutputBufferSize()
-
-			Returns the default output buffer size in frames.
-
-		{dict},{dict},... GetNodes()
-
-			Returns information about nodes. A node can be either
-			output or input but not both. An output node is
-			something like a speaker or a headphone, and an input
-			node is like a microphone.  The return value is a
-			sequence of dicts mapping from strings to variants
-			(e.g. signature "a{sv}a{sv}" for two nodes).  Each dict
-			contains information about a node.
-
-			Each dict contains the following properties:
-				boolean IsInput
-					false for output nodes, true for input
-					nodes.
-				uint64 Id
-					The id of this node. It is unique among
-					all nodes including both output and
-					input nodes.
-				string Type
-				        The type of this node. It can be one of
-				        following values:
-					/* for output nodes. */
-					"INTERNAL_SPEAKER","HEADPHONE", "HDMI",
-					/* for input nodes. */
-					"INTERNAL_MIC", "MIC",
-					/* for both output and input nodes. */
-					"USB", "BLUETOOTH", "UNKNOWN",
-				string Name
-					The name of this node. For example,
-					"Speaker" or "Internal Mic".
-				string DeviceName
-					The name of the device that this node
-					belongs to. For example,
-					"HDA Intel PCH: CA0132 Analog:0,0" or
-					"Creative SB Arena Headset".
-				uint64 StableDeviceId
-					The stable ID does not change due to
-					device plug/unplug or reboot.
-				uint64 StableDeviceIdNew
-					The new stable ID. Keeping both stable
-					ID and stable ID new is for backward
-					compatibility.
-				boolean Active
-					Whether this node is currently used
-					for output/input. There is one active
-					node for output and one active node for
-					input.
-				uint64 PluggedTime
-					The time that this device was plugged
-					in. This value is in microseconds.
-				unit64 NodeVolume
-					The node volume indexed from 0 to 100.
-				unit64 NodeCaptureGain
-					The capture gain of node in dBFS * 100.
-				string HotwordModels
-					A string of comma-separated hotword
-					language model locales supported by this
-					node. e.g. "en_au,en_gb,en_us"
-					The string is empty if the node type is
-					not HOTWORD.
-
-		void GetSystemAecSupported();
-
-			Returns 1 if system echo cancellation is supported,
-			otherwise return 0.
-
-		void SetActiveOutputNode(uint64 node_id);
-
-			Requests the specified node to be used for
-			output. If node_id is 0 (which is not a valid
-			node id), cras will choose the active node
-			automatically.
-
-		void SetActiveInputNode(uint64 node_id);
-
-			Requests the specified node to be used for
-			input. If node_id is 0 (which is not a valid
-			node id), cras will choose the active node
-			automatically.
-
-		int32 GetNumberOfActiveStreams()
-
-			Returns the number of streams currently being
-			played or recorded.
-
-		int32 GetNumberOfActiveInputStreams()
-
-			Returns the number of streams currently using input hardware.
-
-		int32 GetNumberOfActiveOutputStreams()
-
-			Returns the number of streams currently using output hardware.
-
-		int32 IsAudioOutputActive()
-
-			Returns 1 if there are currently any active output streams,
-			excluding 'fake' streams that are not actually outputting any
-			audio. Returns 0 if there are no active streams, or all active
-			streams are 'fake' streams.
-
-		void SetGlobalOutputChannelRemix(int32 num_channels,
-						 array:double coefficient)
-
-			Sets the conversion matrix for global output channel
-			remixing. The coefficient array represents an N * N
-			conversion matrix M, where N is num_channels, with
-			M[i][j] = coefficient[i * N + j].
-			The remix is done by multiplying the conversion matrix
-			to each N-channel PCM data, i.e M * [L, R] = [L', R']
-			For example, coefficient [0.1, 0.9, 0.4, 0.6] will
-			result in:
-			L' = 0.1 * L + 0.9 * R
-			R' = 0.4 * L + 0.6 * R
-
-		int32 SetHotwordModel(uint64_t node_id, string model_name)
-
-			Set the hotword language model on the specified node.
-			The node must have type HOTWORD and the model_name must
-			be one of the supported locales returned by
-			GetNodes() HotwordModels string.
-			Returns 0 on success, or a negative errno on failure.
-
-Signals		OutputVolumeChanged(int32 volume)
-
-			Indicates that the output volume level has changed.
-
-		OutputMuteChanged(boolean muted, boolean user_muted)
-
-			Indicates that the output mute state has changed.  muted
-			is true if the system is muted by a system process, such
-			as suspend or device switch.  user_muted is set if the
-			system has been muted by user action such as the mute
-			key.
-
-		InputGainChanged(int32 gain)
-
-			Indicates what the system capture gain is now. gain
-			expressed in dBFS*100.
-
-		InputMuteChanged(boolean muted)
-
-			Indicates that the input mute state has changed.
-
-		NodesChanged()
-
-			Indicates that nodes are added/removed.
-
-		ActiveOutputNodeChanged(uint64 node_id)
-
-			Indicates that the active output node has changed.
-
-		ActiveInputNodeChanged(uint64 node_id)
-
-			Indicates that the active input node has changed.
-
-		OutputNodeVolumeChanged(uint64 node_id, int32 volume)
-
-			Indicates the volume of the given node.
-
-		NodeLeftRightSwappedChanged(uint64 node_id, boolean swapped)
-
-			Indicates the left and right channel swapping state of the
-			given node.
-
-		InputNodeGainChanged(uint64 node_id, int32 gain)
-
-			Indicates that the capture gain for the node is now gain
-			expressed in dBFS*100.
-
-		NumberOfActiveStreamsChanged(int32 num_active_streams)
-
-			Indicates the number of active streams has changed.
-
-		AudioOutputActiveStateChanged(boolean active)
-
-			Indicates active output state has changed.
-			See IsAudioOutputActive for details.
-
-		HotwordTriggered(int64 tv_sec, int64 tv_nsec)
-
-			Indicates that hotword was triggered at the given timestamp.
diff --git a/cras/README.md b/cras/README.md
deleted file mode 100644
index e0ef0ec..0000000
--- a/cras/README.md
+++ /dev/null
@@ -1,222 +0,0 @@
-CRAS = ChromeOS Audio Server
-===
-
-# Directories
-- [src/server](src/server) - the source for the sound server
-- [src/libcras](src/libcras) - client library for interacting with cras
-- [src/common](src/common) - files common to both the server and library
-- [src/tests](src/tests) - tests for cras and libcras
-- [src/fuzz](src/fuzz) - source code and build scripts for coverage-guided
-  fuzzers for CRAS
-
-# Building from source:
-```
-# Generate install-sh
-./git_prepare.sh
-
-# Configure
-CC=clang \
-CXX=clang++ \
-CXXFLAGS="-g -O2 -std=gnu++11 -Wall" \
-CFLAGS="-g -O2 -Wall" \
-./configure --disable-alsa-plugin
-
-# Compile
-make -j$(nproc)
-
-# Compile with unit tests
-make -j$(nproc) check
-
-# Install binaries to /usr/bin
-sudo make install
-```
-
-## Code complete for for editors
-You need to install [bear] first and generate [compile commands] for
-[language server plugins in editors] by
-```
-make clean && make compile_commands.json
-```
-Then you'll get `compile_commands.json` for editor.
-Import the JSON file to your editor and you'll get useful code complete
-features for CRAS and its unit tests.
-
-# Configuration:
-
-## Device Blocklisting:
-
-Blocklist of certain USB output device(s) is possible by modifying the config
-file `/etc/cras/device_blocklist`.
-
-The format of this file is as follows:
-```
-[USB_Outputs]
-  <vendor_id>_<product_id>_<checksum>_<device_index> = 1
-```
-Where vendor_id and product id are the USB identifiers for the card to
-blocklist. The checksum is the output of "cksum" command applied to the
-sysfs "descriptors" file of the device. The device index specifies the
-index of the output device in the card to blocklist.  This is a bool
-parameter, so '= 1' enables the option.
-
-Example, blocklisting the non-functional output device reported by the C-Media
-based CAD-u1 mic:
-```
-[USB_Outputs]
-  0d8c_0008_00000000_0 = 1
-```
-
-## Card Configuration:
-
-There can be a config file for each sound alsa card on the system.  This file
-lives in `/etc/cras/`.  The file should be named with the card name returned by
-ALSA, the string in the second set of '[]' in the aplay -l output.  The ini file
-has the following format.
-
-```
-[<output-node-name>] ; Name of the mixer control for this output.
-  <config-option> = <config-value>
-```
-output-node-name can be speficied in a few ways to link with the real node:
-- UCM device name - The name string following the SectionDevice label in UCM
-    config, i.e. HiFi.conf
-- Jack name - Name of the mixer control for mixer jack, or the gpio jack name
-    listed by 'evtest' command.
-- Mixer control name - e.g. "Headphone" or "Speaker", listed by
-    'amixer scontrols' command.
-
-Note that an output node matches to the output-node-name label in card config by
-priorty ordered above. For example if a node has UCM device, it will first
-search the config file for the UCM device name. When not found, jack name will
-be used for searching, and lastly the mixer output control name.
-
-config-option can be the following:
-- volume_curve - The type of volume curve, "simple_step" or "explicit".
-- Options valid and mandatory when volume_curve = simple_step:
-  - max_volume - The maximum volume for this output specified in dBFS * 100.
-  - volume_step - Number of dB per volume 'tick' specified in  dBFS * 100.
-- Options valid and mandatory when volume_curve = explicit:
-  - dB_at_N - The value in dB*100 that should be used for the volume at step
-      "N".  There must be one of these for each setting from N=0 to 100
-      inclusive.
-
-
-Example:
-This example configures the Headphones to have a max volume of -3dBFS with a
-step size of 0.75dBFS and the Speaker to have the curve specified by the steps
-given, which is a 1dBFS per step curve from max = +0.5dBFS to min = -99.5dBFS
-(volume step 10 is -89.5dBFS).
-
-```
-[Headphone]
-  volume_curve = simple_step
-  volume_step = 75
-  max_volume = -300
-[Speaker]
-  volume_curve = explicit
-  dB_at_0 = -9950
-  dB_at_1 = -9850
-  dB_at_2 = -9750
-  dB_at_3 = -9650
-  dB_at_4 = -9550
-  dB_at_5 = -9450
-  dB_at_6 = -9350
-  dB_at_7 = -9250
-  dB_at_8 = -9150
-  dB_at_9 = -9050
-  dB_at_10 = -8950
-  dB_at_11 = -8850
-  dB_at_12 = -8750
-  dB_at_13 = -8650
-  dB_at_14 = -8550
-  dB_at_15 = -8450
-  dB_at_16 = -8350
-  dB_at_17 = -8250
-  dB_at_18 = -8150
-  dB_at_19 = -8050
-  dB_at_20 = -7950
-  dB_at_21 = -7850
-  dB_at_22 = -7750
-  dB_at_23 = -7650
-  dB_at_24 = -7550
-  dB_at_25 = -7450
-  dB_at_26 = -7350
-  dB_at_27 = -7250
-  dB_at_28 = -7150
-  dB_at_29 = -7050
-  dB_at_30 = -6950
-  dB_at_31 = -6850
-  dB_at_32 = -6750
-  dB_at_33 = -6650
-  dB_at_34 = -6550
-  dB_at_35 = -6450
-  dB_at_36 = -6350
-  dB_at_37 = -6250
-  dB_at_38 = -6150
-  dB_at_39 = -6050
-  dB_at_40 = -5950
-  dB_at_41 = -5850
-  dB_at_42 = -5750
-  dB_at_43 = -5650
-  dB_at_44 = -5550
-  dB_at_45 = -5450
-  dB_at_46 = -5350
-  dB_at_47 = -5250
-  dB_at_48 = -5150
-  dB_at_49 = -5050
-  dB_at_50 = -4950
-  dB_at_51 = -4850
-  dB_at_52 = -4750
-  dB_at_53 = -4650
-  dB_at_54 = -4550
-  dB_at_55 = -4450
-  dB_at_56 = -4350
-  dB_at_57 = -4250
-  dB_at_58 = -4150
-  dB_at_59 = -4050
-  dB_at_60 = -3950
-  dB_at_61 = -3850
-  dB_at_62 = -3750
-  dB_at_63 = -3650
-  dB_at_64 = -3550
-  dB_at_65 = -3450
-  dB_at_66 = -3350
-  dB_at_67 = -3250
-  dB_at_68 = -3150
-  dB_at_69 = -3050
-  dB_at_70 = -2950
-  dB_at_71 = -2850
-  dB_at_72 = -2750
-  dB_at_73 = -2650
-  dB_at_74 = -2550
-  dB_at_75 = -2450
-  dB_at_76 = -2350
-  dB_at_77 = -2250
-  dB_at_78 = -2150
-  dB_at_79 = -2050
-  dB_at_80 = -1950
-  dB_at_81 = -1850
-  dB_at_82 = -1750
-  dB_at_83 = -1650
-  dB_at_84 = -1550
-  dB_at_85 = -1450
-  dB_at_86 = -1350
-  dB_at_87 = -1250
-  dB_at_88 = -1150
-  dB_at_89 = -1050
-  dB_at_90 = -950
-  dB_at_91 = -850
-  dB_at_92 = -750
-  dB_at_93 = -650
-  dB_at_94 = -550
-  dB_at_95 = -450
-  dB_at_96 = -350
-  dB_at_97 = -250
-  dB_at_98 = -150
-  dB_at_99 = -50
-  dB_at_100 = 50
-```
-
-[bear]: https://github.com/rizsotto/Bear
-[compile commands]: https://clang.llvm.org/extra/clangd/Installation.html#compile-commands-json
-[language server plugins in editors]: https://clang.llvm.org/extra/clangd/Installation.html#editor-plugins
diff --git a/cras/client/cras-sys/.gitignore b/cras/client/cras-sys/.gitignore
deleted file mode 100644
index fa8d85a..0000000
--- a/cras/client/cras-sys/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Cargo.lock
-target
diff --git a/cras/client/cras-sys/.rustfmt.toml b/cras/client/cras-sys/.rustfmt.toml
deleted file mode 100644
index a2db301..0000000
--- a/cras/client/cras-sys/.rustfmt.toml
+++ /dev/null
@@ -1,2 +0,0 @@
-use_field_init_shorthand = true
-use_try_shorthand = true
diff --git a/cras/client/cras-sys/Android.bp b/cras/client/cras-sys/Android.bp
deleted file mode 100644
index d6482b2..0000000
--- a/cras/client/cras-sys/Android.bp
+++ /dev/null
@@ -1,62 +0,0 @@
-// This file is generated by cargo2android.py --run --device --test --global_defaults=crosvm_defaults --dependencies.
-
-package {
-    // See: http://go/android-license-faq
-    // A large-scale-change added 'default_applicable_licenses' to import
-    // all of the 'license_kinds' from "external_adhd_license"
-    // to get the below license kinds:
-    //   SPDX-license-identifier-BSD
-    default_applicable_licenses: ["external_adhd_license"],
-}
-
-rust_defaults {
-    name: "cras-sys_defaults",
-    defaults: ["crosvm_defaults"],
-    crate_name: "cras_sys",
-    srcs: ["src/lib.rs"],
-    test_suites: ["general-tests"],
-    auto_gen_config: true,
-    edition: "2015",
-    rustlibs: [
-        "libaudio_streams",
-        "libdata_model",
-    ],
-}
-
-rust_test_host {
-    name: "cras-sys_host_test_src_lib",
-    defaults: ["cras-sys_defaults"],
-}
-
-rust_test {
-    name: "cras-sys_device_test_src_lib",
-    defaults: ["cras-sys_defaults"],
-}
-
-rust_library {
-    name: "libcras_sys",
-    defaults: ["crosvm_defaults"],
-    host_supported: true,
-    crate_name: "cras_sys",
-    srcs: ["src/lib.rs"],
-    edition: "2015",
-    rustlibs: [
-        "libaudio_streams",
-        "libdata_model",
-    ],
-}
-
-// dependent_library ["feature_list"]
-//   ../../../../crosvm/assertions/src/lib.rs
-//   ../../../../crosvm/data_model/src/lib.rs
-//   ../../../../crosvm/sync/src/lib.rs
-//   ../../../../crosvm/sys_util/poll_token_derive/poll_token_derive.rs
-//   ../../../../crosvm/sys_util/src/lib.rs
-//   ../../../../crosvm/syscall_defines/src/lib.rs
-//   ../../../../crosvm/tempfile/src/lib.rs
-//   ../../../audio_streams/src/audio_streams.rs
-//   libc-0.2.76 "default,std"
-//   proc-macro2-1.0.19 "default,proc-macro"
-//   quote-1.0.7 "default,proc-macro"
-//   syn-1.0.39 "clone-impls,default,derive,parsing,printing,proc-macro,quote"
-//   unicode-xid-0.2.1 "default"
diff --git a/cras/client/cras-sys/Cargo.toml b/cras/client/cras-sys/Cargo.toml
deleted file mode 100644
index 1ac1857..0000000
--- a/cras/client/cras-sys/Cargo.toml
+++ /dev/null
@@ -1,8 +0,0 @@
-[package]
-name = "cras-sys"
-version = "0.1.0"
-authors = ["The Chromium OS Authors"]
-
-[dependencies]
-audio_streams = { path = "../../../audio_streams" } # provided by ebuild
-data_model = { path = "../../../../crosvm/data_model" } # provided by ebuild
diff --git a/cras/client/cras-sys/generator/.gitignore b/cras/client/cras-sys/generator/.gitignore
deleted file mode 100644
index 0e8b881..0000000
--- a/cras/client/cras-sys/generator/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.h
-Cargo.lock
diff --git a/cras/client/cras-sys/generator/Cargo.toml b/cras/client/cras-sys/generator/Cargo.toml
deleted file mode 100644
index 87c826e..0000000
--- a/cras/client/cras-sys/generator/Cargo.toml
+++ /dev/null
@@ -1,7 +0,0 @@
-[package]
-name = "generator"
-version = "0.1.0"
-authors = ["paulhsia <paulhsia@chromium.org>"]
-
-[dependencies]
-bindgen = "0.43.0"
diff --git a/cras/client/cras-sys/generator/README.md b/cras/client/cras-sys/generator/README.md
deleted file mode 100644
index 0ca9906..0000000
--- a/cras/client/cras-sys/generator/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-1. Use `cargo run` to generate rust bindings at `lib_gen.rs`
-
-2. Copy `lib_gen.rs` to `cras-sys/src/gen.rs
diff --git a/cras/client/cras-sys/generator/src/main.rs b/cras/client/cras-sys/generator/src/main.rs
deleted file mode 100644
index e562691..0000000
--- a/cras/client/cras-sys/generator/src/main.rs
+++ /dev/null
@@ -1,159 +0,0 @@
-// Copyright 2019 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-extern crate bindgen;
-
-use bindgen::builder;
-
-use std::fs::{self, File};
-use std::io::Write;
-use std::path::Path;
-use std::str;
-
-fn copy_headers(src_dir: &Path, dst_dir: &Path) -> Result<(), String> {
-    if dst_dir.is_file() {
-        fs::remove_file(&dst_dir).or_else(|e| {
-            Err(format!(
-                "failed to remove existing file at {:?}: {}",
-                dst_dir, e
-            ))
-        })?;
-    }
-
-    if !dst_dir.is_dir() {
-        fs::create_dir(&dst_dir).or_else(|e| {
-            Err(format!(
-                "failed to create destination directory: {:?}: {}",
-                dst_dir, e
-            ))
-        })?;
-    }
-
-    let header_files = vec![
-        "cras_audio_format.h",
-        "cras_iodev_info.h",
-        "cras_messages.h",
-        "cras_shm.h",
-        "cras_types.h",
-        "cras_util.h",
-        "packet_status_logger.h",
-    ];
-
-    for header in &header_files {
-        let src = src_dir.join(&header);
-        let dst = dst_dir.join(&header);
-        fs::copy(&src, &dst).or_else(|e| {
-            Err(format!(
-                "failed to copy header file {:?} to {:?}: {}",
-                src, dst, e
-            ))
-        })?;
-    }
-    Ok(())
-}
-
-/*
- * If we use both `packed` and `align(4)` for a struct, bindgen will generate
- * it as an opaque struct.
- *
- * `cras_server_state` is created from C with `packed` and `aligned(4)` and
- * shared through a shared memory area.
- *
- * Structs with `packed` and `align(4)` have the same memory layout as those
- * with `packed` except for some extra alignment bytes at the end.
- *
- * Therefore, using only `packed` for `cras_server_state` from Rust side is safe.
- *
- * This function modifies `cras_server_state` from
- * `__attribute__ ((packed, aligned(4)))` to `__attribute__ ((packed))`
- */
-fn modify_server_state_attributes(dir: &Path) -> Result<(), String> {
-    let cras_types_path = dir.join("cras_types.h");
-    let bytes = fs::read(&cras_types_path)
-        .or_else(|e| Err(format!("failed to read {:?}: {}", cras_types_path, e)))?;
-
-    let old = str::from_utf8(&bytes).or_else(|e| {
-        Err(format!(
-            "failed to parse {:?} as utf8: {}",
-            cras_types_path, e
-        ))
-    })?;
-
-    let new = old.replacen(
-        "struct __attribute__((packed, aligned(4))) cras_server_state {",
-        "struct __attribute__((packed)) cras_server_state {",
-        1,
-    );
-
-    if new.len() >= old.len() {
-        return Err("failed to remove 'aligned(4)' from cras_server_state".to_string());
-    }
-
-    fs::write(&cras_types_path, new).or_else(|e| {
-        Err(format!(
-            "failed to write updated contents to {:?}: {}",
-            cras_types_path, e
-        ))
-    })?;
-
-    Ok(())
-}
-
-fn gen() -> String {
-    let name = "cras_gen";
-    let bindings = builder()
-        .header("c_headers/cras_messages.h")
-        .header("c_headers/cras_types.h")
-        .header("c_headers/cras_audio_format.h")
-        .header("c_headers/cras_shm.h")
-        .whitelist_type("cras_.*")
-        .whitelist_var("cras_.*")
-        .whitelist_type("CRAS_.*")
-        .whitelist_var("CRAS_.*")
-        .whitelist_type("audio_message")
-        .whitelist_var("MAX_DEBUG_.*")
-        .rustified_enum("CRAS_.*")
-        .rustified_enum("_snd_pcm_.*")
-        .bitfield_enum("CRAS_STREAM_EFFECT")
-        .generate()
-        .expect(format!("Unable to generate {} code", name).as_str());
-
-    bindings.to_string()
-}
-
-fn write_output(output_path: &Path, output: String) -> std::io::Result<()> {
-    let header = b"// Copyright 2019 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-/*
- * generated from files in cras/src/common in adhd:
- * cras_audio_format.h
- * cras_iodev_info.h
- * cras_messages.h
- * cras_shm.h
- * cras_types.h
- * cras_util.h
- * packet_status_logger.h
- */
-
-#![allow(clippy::unreadable_literal)]
-#![allow(clippy::cognitive_complexity)]
-";
-
-    let mut output_file = File::create(output_path)?;
-    output_file.write_all(header)?;
-    output_file.write_all(output.as_bytes())?;
-    Ok(())
-}
-
-fn main() {
-    let src_header_dir = Path::new("../../../src/common");
-    let dst_header_dir = Path::new("./c_headers");
-
-    copy_headers(src_header_dir, dst_header_dir).expect("failed to copy C headers");
-    modify_server_state_attributes(dst_header_dir)
-        .expect("failed to modify cras_server_state's attributes");
-    let generated_code = gen();
-    write_output(Path::new("lib_gen.rs"), generated_code).expect("failed to write generated code");
-}
diff --git a/cras/client/cras-sys/src/gen.rs b/cras/client/cras-sys/src/gen.rs
deleted file mode 100644
index 6fb4cdf..0000000
--- a/cras/client/cras-sys/src/gen.rs
+++ /dev/null
@@ -1,5004 +0,0 @@
-// Copyright 2019 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-/*
- * generated from files in cras/src/common in adhd:
- * cras_audio_format.h
- * cras_iodev_info.h
- * cras_messages.h
- * cras_shm.h
- * cras_types.h
- * cras_util.h
- * packet_status_logger.h
- */
-
-#![allow(clippy::unreadable_literal)]
-#![allow(clippy::cognitive_complexity)]
-/* automatically generated by rust-bindgen */
-
-pub const CRAS_IODEV_NAME_BUFFER_SIZE: u32 = 64;
-pub const CRAS_NODE_TYPE_BUFFER_SIZE: u32 = 32;
-pub const CRAS_NODE_MIC_POS_BUFFER_SIZE: u32 = 128;
-pub const CRAS_NODE_NAME_BUFFER_SIZE: u32 = 64;
-pub const CRAS_NODE_HOTWORD_MODEL_BUFFER_SIZE: u32 = 16;
-pub const CRAS_MAX_IODEVS: u32 = 20;
-pub const CRAS_MAX_IONODES: u32 = 20;
-pub const CRAS_MAX_ATTACHED_CLIENTS: u32 = 20;
-pub const CRAS_MAX_AUDIO_THREAD_SNAPSHOTS: u32 = 10;
-pub const CRAS_MAX_HOTWORD_MODEL_NAME_SIZE: u32 = 12;
-pub const MAX_DEBUG_DEVS: u32 = 4;
-pub const MAX_DEBUG_STREAMS: u32 = 8;
-pub const CRAS_BT_EVENT_LOG_SIZE: u32 = 1024;
-pub const CRAS_SERVER_STATE_VERSION: u32 = 2;
-pub const CRAS_PROTO_VER: u32 = 7;
-pub const CRAS_SERV_MAX_MSG_SIZE: u32 = 256;
-pub const CRAS_CLIENT_MAX_MSG_SIZE: u32 = 256;
-pub const CRAS_MAX_HOTWORD_MODELS: u32 = 243;
-pub const CRAS_MAX_REMIX_CHANNELS: u32 = 8;
-pub const CRAS_MAX_TEST_DATA_LEN: u32 = 224;
-pub const CRAS_AEC_DUMP_FILE_NAME_LEN: u32 = 128;
-pub const CRAS_NUM_SHM_BUFFERS: u32 = 2;
-pub const CRAS_SHM_BUFFERS_MASK: u32 = 1;
-pub type __int8_t = ::std::os::raw::c_schar;
-pub type __uint8_t = ::std::os::raw::c_uchar;
-pub type __int32_t = ::std::os::raw::c_int;
-pub type __uint32_t = ::std::os::raw::c_uint;
-pub type __int64_t = ::std::os::raw::c_long;
-pub type __uint64_t = ::std::os::raw::c_ulong;
-pub type __time_t = ::std::os::raw::c_long;
-pub type __syscall_slong_t = ::std::os::raw::c_long;
-#[repr(C, packed)]
-#[derive(Copy, Clone)]
-pub struct cras_iodev_info {
-    pub idx: u32,
-    pub name: [::std::os::raw::c_char; 64usize],
-    pub stable_id: u32,
-    pub max_supported_channels: u32,
-}
-#[test]
-fn bindgen_test_layout_cras_iodev_info() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_iodev_info>(),
-        76usize,
-        concat!("Size of: ", stringify!(cras_iodev_info))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_iodev_info>(),
-        1usize,
-        concat!("Alignment of ", stringify!(cras_iodev_info))
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_iodev_info>())).idx as *const _ as usize },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_iodev_info),
-            "::",
-            stringify!(idx)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_iodev_info>())).name as *const _ as usize },
-        4usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_iodev_info),
-            "::",
-            stringify!(name)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_iodev_info>())).stable_id as *const _ as usize },
-        68usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_iodev_info),
-            "::",
-            stringify!(stable_id)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_iodev_info>())).max_supported_channels as *const _ as usize
-        },
-        72usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_iodev_info),
-            "::",
-            stringify!(max_supported_channels)
-        )
-    );
-}
-#[repr(C, packed)]
-#[derive(Copy, Clone)]
-pub struct cras_ionode_info {
-    pub iodev_idx: u32,
-    pub ionode_idx: u32,
-    pub plugged: i32,
-    pub active: i32,
-    pub plugged_time: cras_ionode_info__bindgen_ty_1,
-    pub volume: u32,
-    pub capture_gain: i32,
-    pub ui_gain_scaler: f32,
-    pub left_right_swapped: i32,
-    pub type_enum: u32,
-    pub stable_id: u32,
-    pub type_: [::std::os::raw::c_char; 32usize],
-    pub name: [::std::os::raw::c_char; 64usize],
-    pub active_hotword_model: [::std::os::raw::c_char; 16usize],
-}
-#[repr(C)]
-#[derive(Debug, Copy, Clone)]
-pub struct cras_ionode_info__bindgen_ty_1 {
-    pub tv_sec: i64,
-    pub tv_usec: i64,
-}
-#[test]
-fn bindgen_test_layout_cras_ionode_info__bindgen_ty_1() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_ionode_info__bindgen_ty_1>(),
-        16usize,
-        concat!("Size of: ", stringify!(cras_ionode_info__bindgen_ty_1))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_ionode_info__bindgen_ty_1>(),
-        8usize,
-        concat!("Alignment of ", stringify!(cras_ionode_info__bindgen_ty_1))
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_ionode_info__bindgen_ty_1>())).tv_sec as *const _ as usize
-        },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_ionode_info__bindgen_ty_1),
-            "::",
-            stringify!(tv_sec)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_ionode_info__bindgen_ty_1>())).tv_usec as *const _ as usize
-        },
-        8usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_ionode_info__bindgen_ty_1),
-            "::",
-            stringify!(tv_usec)
-        )
-    );
-}
-#[test]
-fn bindgen_test_layout_cras_ionode_info() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_ionode_info>(),
-        168usize,
-        concat!("Size of: ", stringify!(cras_ionode_info))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_ionode_info>(),
-        1usize,
-        concat!("Alignment of ", stringify!(cras_ionode_info))
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_ionode_info>())).iodev_idx as *const _ as usize },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_ionode_info),
-            "::",
-            stringify!(iodev_idx)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_ionode_info>())).ionode_idx as *const _ as usize },
-        4usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_ionode_info),
-            "::",
-            stringify!(ionode_idx)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_ionode_info>())).plugged as *const _ as usize },
-        8usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_ionode_info),
-            "::",
-            stringify!(plugged)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_ionode_info>())).active as *const _ as usize },
-        12usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_ionode_info),
-            "::",
-            stringify!(active)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_ionode_info>())).plugged_time as *const _ as usize },
-        16usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_ionode_info),
-            "::",
-            stringify!(plugged_time)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_ionode_info>())).volume as *const _ as usize },
-        32usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_ionode_info),
-            "::",
-            stringify!(volume)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_ionode_info>())).capture_gain as *const _ as usize },
-        36usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_ionode_info),
-            "::",
-            stringify!(capture_gain)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_ionode_info>())).ui_gain_scaler as *const _ as usize },
-        40usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_ionode_info),
-            "::",
-            stringify!(ui_gain_scaler)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_ionode_info>())).left_right_swapped as *const _ as usize
-        },
-        44usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_ionode_info),
-            "::",
-            stringify!(left_right_swapped)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_ionode_info>())).type_enum as *const _ as usize },
-        48usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_ionode_info),
-            "::",
-            stringify!(type_enum)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_ionode_info>())).stable_id as *const _ as usize },
-        52usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_ionode_info),
-            "::",
-            stringify!(stable_id)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_ionode_info>())).type_ as *const _ as usize },
-        56usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_ionode_info),
-            "::",
-            stringify!(type_)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_ionode_info>())).name as *const _ as usize },
-        88usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_ionode_info),
-            "::",
-            stringify!(name)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_ionode_info>())).active_hotword_model as *const _ as usize
-        },
-        152usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_ionode_info),
-            "::",
-            stringify!(active_hotword_model)
-        )
-    );
-}
-pub const ionode_attr_IONODE_ATTR_PLUGGED: ionode_attr = 0;
-pub const ionode_attr_IONODE_ATTR_VOLUME: ionode_attr = 1;
-pub const ionode_attr_IONODE_ATTR_CAPTURE_GAIN: ionode_attr = 2;
-pub const ionode_attr_IONODE_ATTR_SWAP_LEFT_RIGHT: ionode_attr = 3;
-pub type ionode_attr = u32;
-#[repr(C)]
-#[derive(Debug, Copy, Clone)]
-pub struct timespec {
-    pub tv_sec: __time_t,
-    pub tv_nsec: __syscall_slong_t,
-}
-#[test]
-fn bindgen_test_layout_timespec() {
-    assert_eq!(
-        ::std::mem::size_of::<timespec>(),
-        16usize,
-        concat!("Size of: ", stringify!(timespec))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<timespec>(),
-        8usize,
-        concat!("Alignment of ", stringify!(timespec))
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<timespec>())).tv_sec as *const _ as usize },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(timespec),
-            "::",
-            stringify!(tv_sec)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<timespec>())).tv_nsec as *const _ as usize },
-        8usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(timespec),
-            "::",
-            stringify!(tv_nsec)
-        )
-    );
-}
-impl _snd_pcm_format {
-    pub const SND_PCM_FORMAT_LAST: _snd_pcm_format = _snd_pcm_format::SND_PCM_FORMAT_DSD_U32_BE;
-}
-impl _snd_pcm_format {
-    pub const SND_PCM_FORMAT_S16: _snd_pcm_format = _snd_pcm_format::SND_PCM_FORMAT_S16_LE;
-}
-impl _snd_pcm_format {
-    pub const SND_PCM_FORMAT_U16: _snd_pcm_format = _snd_pcm_format::SND_PCM_FORMAT_U16_LE;
-}
-impl _snd_pcm_format {
-    pub const SND_PCM_FORMAT_S24: _snd_pcm_format = _snd_pcm_format::SND_PCM_FORMAT_S24_LE;
-}
-impl _snd_pcm_format {
-    pub const SND_PCM_FORMAT_U24: _snd_pcm_format = _snd_pcm_format::SND_PCM_FORMAT_U24_LE;
-}
-impl _snd_pcm_format {
-    pub const SND_PCM_FORMAT_S32: _snd_pcm_format = _snd_pcm_format::SND_PCM_FORMAT_S32_LE;
-}
-impl _snd_pcm_format {
-    pub const SND_PCM_FORMAT_U32: _snd_pcm_format = _snd_pcm_format::SND_PCM_FORMAT_U32_LE;
-}
-impl _snd_pcm_format {
-    pub const SND_PCM_FORMAT_FLOAT: _snd_pcm_format = _snd_pcm_format::SND_PCM_FORMAT_FLOAT_LE;
-}
-impl _snd_pcm_format {
-    pub const SND_PCM_FORMAT_FLOAT64: _snd_pcm_format = _snd_pcm_format::SND_PCM_FORMAT_FLOAT64_LE;
-}
-impl _snd_pcm_format {
-    pub const SND_PCM_FORMAT_IEC958_SUBFRAME: _snd_pcm_format =
-        _snd_pcm_format::SND_PCM_FORMAT_IEC958_SUBFRAME_LE;
-}
-impl _snd_pcm_format {
-    pub const SND_PCM_FORMAT_S20: _snd_pcm_format = _snd_pcm_format::SND_PCM_FORMAT_S20_LE;
-}
-impl _snd_pcm_format {
-    pub const SND_PCM_FORMAT_U20: _snd_pcm_format = _snd_pcm_format::SND_PCM_FORMAT_U20_LE;
-}
-#[repr(i32)]
-#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum _snd_pcm_format {
-    SND_PCM_FORMAT_UNKNOWN = -1,
-    SND_PCM_FORMAT_S8 = 0,
-    SND_PCM_FORMAT_U8 = 1,
-    SND_PCM_FORMAT_S16_LE = 2,
-    SND_PCM_FORMAT_S16_BE = 3,
-    SND_PCM_FORMAT_U16_LE = 4,
-    SND_PCM_FORMAT_U16_BE = 5,
-    SND_PCM_FORMAT_S24_LE = 6,
-    SND_PCM_FORMAT_S24_BE = 7,
-    SND_PCM_FORMAT_U24_LE = 8,
-    SND_PCM_FORMAT_U24_BE = 9,
-    SND_PCM_FORMAT_S32_LE = 10,
-    SND_PCM_FORMAT_S32_BE = 11,
-    SND_PCM_FORMAT_U32_LE = 12,
-    SND_PCM_FORMAT_U32_BE = 13,
-    SND_PCM_FORMAT_FLOAT_LE = 14,
-    SND_PCM_FORMAT_FLOAT_BE = 15,
-    SND_PCM_FORMAT_FLOAT64_LE = 16,
-    SND_PCM_FORMAT_FLOAT64_BE = 17,
-    SND_PCM_FORMAT_IEC958_SUBFRAME_LE = 18,
-    SND_PCM_FORMAT_IEC958_SUBFRAME_BE = 19,
-    SND_PCM_FORMAT_MU_LAW = 20,
-    SND_PCM_FORMAT_A_LAW = 21,
-    SND_PCM_FORMAT_IMA_ADPCM = 22,
-    SND_PCM_FORMAT_MPEG = 23,
-    SND_PCM_FORMAT_GSM = 24,
-    SND_PCM_FORMAT_S20_LE = 25,
-    SND_PCM_FORMAT_S20_BE = 26,
-    SND_PCM_FORMAT_U20_LE = 27,
-    SND_PCM_FORMAT_U20_BE = 28,
-    SND_PCM_FORMAT_SPECIAL = 31,
-    SND_PCM_FORMAT_S24_3LE = 32,
-    SND_PCM_FORMAT_S24_3BE = 33,
-    SND_PCM_FORMAT_U24_3LE = 34,
-    SND_PCM_FORMAT_U24_3BE = 35,
-    SND_PCM_FORMAT_S20_3LE = 36,
-    SND_PCM_FORMAT_S20_3BE = 37,
-    SND_PCM_FORMAT_U20_3LE = 38,
-    SND_PCM_FORMAT_U20_3BE = 39,
-    SND_PCM_FORMAT_S18_3LE = 40,
-    SND_PCM_FORMAT_S18_3BE = 41,
-    SND_PCM_FORMAT_U18_3LE = 42,
-    SND_PCM_FORMAT_U18_3BE = 43,
-    SND_PCM_FORMAT_G723_24 = 44,
-    SND_PCM_FORMAT_G723_24_1B = 45,
-    SND_PCM_FORMAT_G723_40 = 46,
-    SND_PCM_FORMAT_G723_40_1B = 47,
-    SND_PCM_FORMAT_DSD_U8 = 48,
-    SND_PCM_FORMAT_DSD_U16_LE = 49,
-    SND_PCM_FORMAT_DSD_U32_LE = 50,
-    SND_PCM_FORMAT_DSD_U16_BE = 51,
-    SND_PCM_FORMAT_DSD_U32_BE = 52,
-}
-pub use self::_snd_pcm_format as snd_pcm_format_t;
-#[repr(u32)]
-#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum CRAS_CHANNEL {
-    CRAS_CH_FL = 0,
-    CRAS_CH_FR = 1,
-    CRAS_CH_RL = 2,
-    CRAS_CH_RR = 3,
-    CRAS_CH_FC = 4,
-    CRAS_CH_LFE = 5,
-    CRAS_CH_SL = 6,
-    CRAS_CH_SR = 7,
-    CRAS_CH_RC = 8,
-    CRAS_CH_FLC = 9,
-    CRAS_CH_FRC = 10,
-    CRAS_CH_MAX = 11,
-}
-#[repr(C)]
-#[derive(Debug, Copy, Clone)]
-pub struct cras_audio_format {
-    pub format: snd_pcm_format_t,
-    pub frame_rate: usize,
-    pub num_channels: usize,
-    pub channel_layout: [i8; 11usize],
-}
-#[test]
-fn bindgen_test_layout_cras_audio_format() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_audio_format>(),
-        40usize,
-        concat!("Size of: ", stringify!(cras_audio_format))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_audio_format>(),
-        8usize,
-        concat!("Alignment of ", stringify!(cras_audio_format))
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_audio_format>())).format as *const _ as usize },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_audio_format),
-            "::",
-            stringify!(format)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_audio_format>())).frame_rate as *const _ as usize },
-        8usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_audio_format),
-            "::",
-            stringify!(frame_rate)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_audio_format>())).num_channels as *const _ as usize },
-        16usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_audio_format),
-            "::",
-            stringify!(num_channels)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_audio_format>())).channel_layout as *const _ as usize
-        },
-        24usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_audio_format),
-            "::",
-            stringify!(channel_layout)
-        )
-    );
-}
-#[repr(C, packed)]
-#[derive(Debug, Copy, Clone)]
-pub struct cras_audio_format_packed {
-    pub format: i32,
-    pub frame_rate: u32,
-    pub num_channels: u32,
-    pub channel_layout: [i8; 11usize],
-}
-#[test]
-fn bindgen_test_layout_cras_audio_format_packed() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_audio_format_packed>(),
-        23usize,
-        concat!("Size of: ", stringify!(cras_audio_format_packed))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_audio_format_packed>(),
-        1usize,
-        concat!("Alignment of ", stringify!(cras_audio_format_packed))
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_audio_format_packed>())).format as *const _ as usize },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_audio_format_packed),
-            "::",
-            stringify!(format)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_audio_format_packed>())).frame_rate as *const _ as usize
-        },
-        4usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_audio_format_packed),
-            "::",
-            stringify!(frame_rate)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_audio_format_packed>())).num_channels as *const _ as usize
-        },
-        8usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_audio_format_packed),
-            "::",
-            stringify!(num_channels)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_audio_format_packed>())).channel_layout as *const _ as usize
-        },
-        12usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_audio_format_packed),
-            "::",
-            stringify!(channel_layout)
-        )
-    );
-}
-#[repr(C)]
-#[derive(Copy, Clone)]
-pub struct packet_status_logger {
-    pub data: [u8; 64usize],
-    pub size: ::std::os::raw::c_int,
-    pub wp: ::std::os::raw::c_int,
-    pub num_wraps: ::std::os::raw::c_int,
-    pub ts: timespec,
-}
-#[test]
-fn bindgen_test_layout_packet_status_logger() {
-    assert_eq!(
-        ::std::mem::size_of::<packet_status_logger>(),
-        96usize,
-        concat!("Size of: ", stringify!(packet_status_logger))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<packet_status_logger>(),
-        8usize,
-        concat!("Alignment of ", stringify!(packet_status_logger))
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<packet_status_logger>())).data as *const _ as usize },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(packet_status_logger),
-            "::",
-            stringify!(data)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<packet_status_logger>())).size as *const _ as usize },
-        64usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(packet_status_logger),
-            "::",
-            stringify!(size)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<packet_status_logger>())).wp as *const _ as usize },
-        68usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(packet_status_logger),
-            "::",
-            stringify!(wp)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<packet_status_logger>())).num_wraps as *const _ as usize },
-        72usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(packet_status_logger),
-            "::",
-            stringify!(num_wraps)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<packet_status_logger>())).ts as *const _ as usize },
-        80usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(packet_status_logger),
-            "::",
-            stringify!(ts)
-        )
-    );
-}
-#[repr(C, packed)]
-#[derive(Debug, Copy, Clone)]
-pub struct cras_timespec {
-    pub tv_sec: i64,
-    pub tv_nsec: i64,
-}
-#[test]
-fn bindgen_test_layout_cras_timespec() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_timespec>(),
-        16usize,
-        concat!("Size of: ", stringify!(cras_timespec))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_timespec>(),
-        1usize,
-        concat!("Alignment of ", stringify!(cras_timespec))
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_timespec>())).tv_sec as *const _ as usize },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_timespec),
-            "::",
-            stringify!(tv_sec)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_timespec>())).tv_nsec as *const _ as usize },
-        8usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_timespec),
-            "::",
-            stringify!(tv_nsec)
-        )
-    );
-}
-#[repr(u32)]
-#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum CRAS_SPECIAL_DEVICE {
-    NO_DEVICE = 0,
-    SILENT_RECORD_DEVICE = 1,
-    SILENT_PLAYBACK_DEVICE = 2,
-    SILENT_HOTWORD_DEVICE = 3,
-    MAX_SPECIAL_DEVICE_IDX = 4,
-}
-pub const TEST_IODEV_TYPE_TEST_IODEV_HOTWORD: TEST_IODEV_TYPE = 0;
-pub type TEST_IODEV_TYPE = u32;
-#[repr(u32)]
-#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum CRAS_TEST_IODEV_CMD {
-    TEST_IODEV_CMD_HOTWORD_TRIGGER = 0,
-}
-#[repr(u32)]
-#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum CRAS_CONNECTION_TYPE {
-    CRAS_CONTROL = 0,
-    CRAS_PLAYBACK = 1,
-    CRAS_CAPTURE = 2,
-    CRAS_VMS_LEGACY = 3,
-    CRAS_VMS_UNIFIED = 4,
-    CRAS_PLUGIN_PLAYBACK = 5,
-    CRAS_PLUGIN_UNIFIED = 6,
-    CRAS_NUM_CONN_TYPE = 7,
-}
-#[repr(u32)]
-#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum CRAS_STREAM_DIRECTION {
-    CRAS_STREAM_OUTPUT = 0,
-    CRAS_STREAM_INPUT = 1,
-    CRAS_STREAM_UNDEFINED = 2,
-    CRAS_STREAM_POST_MIX_PRE_DSP = 3,
-    CRAS_NUM_DIRECTIONS = 4,
-}
-#[repr(u32)]
-#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum CRAS_INPUT_STREAM_FLAG {
-    BULK_AUDIO_OK = 1,
-    USE_DEV_TIMING = 2,
-    HOTWORD_STREAM = 3,
-    TRIGGER_ONLY = 4,
-    SERVER_ONLY = 8,
-}
-#[repr(u32)]
-#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum CRAS_LOOPBACK_TYPE {
-    LOOPBACK_POST_MIX_PRE_DSP = 0,
-    LOOPBACK_POST_DSP = 1,
-    LOOPBACK_NUM_TYPES = 2,
-}
-#[repr(u32)]
-#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum CRAS_STREAM_TYPE {
-    CRAS_STREAM_TYPE_DEFAULT = 0,
-    CRAS_STREAM_TYPE_MULTIMEDIA = 1,
-    CRAS_STREAM_TYPE_VOICE_COMMUNICATION = 2,
-    CRAS_STREAM_TYPE_SPEECH_RECOGNITION = 3,
-    CRAS_STREAM_TYPE_PRO_AUDIO = 4,
-    CRAS_STREAM_TYPE_ACCESSIBILITY = 5,
-    CRAS_STREAM_NUM_TYPES = 6,
-}
-#[repr(u32)]
-#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum CRAS_CLIENT_TYPE {
-    CRAS_CLIENT_TYPE_UNKNOWN = 0,
-    CRAS_CLIENT_TYPE_LEGACY = 1,
-    CRAS_CLIENT_TYPE_TEST = 2,
-    CRAS_CLIENT_TYPE_PCM = 3,
-    CRAS_CLIENT_TYPE_CHROME = 4,
-    CRAS_CLIENT_TYPE_ARC = 5,
-    CRAS_CLIENT_TYPE_CROSVM = 6,
-    CRAS_CLIENT_TYPE_SERVER_STREAM = 7,
-    CRAS_CLIENT_TYPE_LACROS = 8,
-    CRAS_CLIENT_TYPE_PLUGIN = 9,
-    CRAS_CLIENT_TYPE_ARCVM = 10,
-    CRAS_NUM_CLIENT_TYPE = 11,
-}
-impl CRAS_STREAM_EFFECT {
-    pub const APM_ECHO_CANCELLATION: CRAS_STREAM_EFFECT = CRAS_STREAM_EFFECT(1);
-}
-impl CRAS_STREAM_EFFECT {
-    pub const APM_NOISE_SUPRESSION: CRAS_STREAM_EFFECT = CRAS_STREAM_EFFECT(2);
-}
-impl CRAS_STREAM_EFFECT {
-    pub const APM_GAIN_CONTROL: CRAS_STREAM_EFFECT = CRAS_STREAM_EFFECT(4);
-}
-impl CRAS_STREAM_EFFECT {
-    pub const APM_VOICE_DETECTION: CRAS_STREAM_EFFECT = CRAS_STREAM_EFFECT(8);
-}
-impl ::std::ops::BitOr<CRAS_STREAM_EFFECT> for CRAS_STREAM_EFFECT {
-    type Output = Self;
-    #[inline]
-    fn bitor(self, other: Self) -> Self {
-        CRAS_STREAM_EFFECT(self.0 | other.0)
-    }
-}
-impl ::std::ops::BitOrAssign for CRAS_STREAM_EFFECT {
-    #[inline]
-    fn bitor_assign(&mut self, rhs: CRAS_STREAM_EFFECT) {
-        self.0 |= rhs.0;
-    }
-}
-impl ::std::ops::BitAnd<CRAS_STREAM_EFFECT> for CRAS_STREAM_EFFECT {
-    type Output = Self;
-    #[inline]
-    fn bitand(self, other: Self) -> Self {
-        CRAS_STREAM_EFFECT(self.0 & other.0)
-    }
-}
-impl ::std::ops::BitAndAssign for CRAS_STREAM_EFFECT {
-    #[inline]
-    fn bitand_assign(&mut self, rhs: CRAS_STREAM_EFFECT) {
-        self.0 &= rhs.0;
-    }
-}
-#[repr(C)]
-#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub struct CRAS_STREAM_EFFECT(pub u32);
-#[repr(C, packed)]
-#[derive(Debug, Copy, Clone)]
-pub struct cras_attached_client_info {
-    pub id: u32,
-    pub pid: i32,
-    pub uid: u32,
-    pub gid: u32,
-}
-#[test]
-fn bindgen_test_layout_cras_attached_client_info() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_attached_client_info>(),
-        16usize,
-        concat!("Size of: ", stringify!(cras_attached_client_info))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_attached_client_info>(),
-        1usize,
-        concat!("Alignment of ", stringify!(cras_attached_client_info))
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_attached_client_info>())).id as *const _ as usize },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_attached_client_info),
-            "::",
-            stringify!(id)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_attached_client_info>())).pid as *const _ as usize },
-        4usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_attached_client_info),
-            "::",
-            stringify!(pid)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_attached_client_info>())).uid as *const _ as usize },
-        8usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_attached_client_info),
-            "::",
-            stringify!(uid)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_attached_client_info>())).gid as *const _ as usize },
-        12usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_attached_client_info),
-            "::",
-            stringify!(gid)
-        )
-    );
-}
-pub type cras_node_id_t = u64;
-#[repr(u32)]
-#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum CRAS_BT_LOG_EVENTS {
-    BT_ADAPTER_ADDED = 0,
-    BT_ADAPTER_REMOVED = 1,
-    BT_AUDIO_GATEWAY_INIT = 2,
-    BT_AUDIO_GATEWAY_START = 3,
-    BT_AVAILABLE_CODECS = 4,
-    BT_A2DP_CONFIGURED = 5,
-    BT_A2DP_START = 6,
-    BT_A2DP_SUSPENDED = 7,
-    BT_CODEC_SELECTION = 8,
-    BT_DEV_CONNECTED = 9,
-    BT_DEV_DISCONNECTED = 10,
-    BT_DEV_CONN_WATCH_CB = 11,
-    BT_DEV_SUSPEND_CB = 12,
-    BT_HFP_NEW_CONNECTION = 13,
-    BT_HFP_REQUEST_DISCONNECT = 14,
-    BT_HFP_SUPPORTED_FEATURES = 15,
-    BT_HFP_HF_INDICATOR = 16,
-    BT_HFP_SET_SPEAKER_GAIN = 17,
-    BT_HFP_UPDATE_SPEAKER_GAIN = 18,
-    BT_HSP_NEW_CONNECTION = 19,
-    BT_HSP_REQUEST_DISCONNECT = 20,
-    BT_NEW_AUDIO_PROFILE_AFTER_CONNECT = 21,
-    BT_RESET = 22,
-    BT_SCO_CONNECT = 23,
-    BT_TRANSPORT_ACQUIRE = 24,
-    BT_TRANSPORT_RELEASE = 25,
-    BT_TRANSPORT_SET_VOLUME = 26,
-    BT_TRANSPORT_UPDATE_VOLUME = 27,
-}
-#[repr(C, packed)]
-#[derive(Debug, Copy, Clone)]
-pub struct audio_thread_event {
-    pub tag_sec: u32,
-    pub nsec: u32,
-    pub data1: u32,
-    pub data2: u32,
-    pub data3: u32,
-}
-#[test]
-fn bindgen_test_layout_audio_thread_event() {
-    assert_eq!(
-        ::std::mem::size_of::<audio_thread_event>(),
-        20usize,
-        concat!("Size of: ", stringify!(audio_thread_event))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<audio_thread_event>(),
-        1usize,
-        concat!("Alignment of ", stringify!(audio_thread_event))
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<audio_thread_event>())).tag_sec as *const _ as usize },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(audio_thread_event),
-            "::",
-            stringify!(tag_sec)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<audio_thread_event>())).nsec as *const _ as usize },
-        4usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(audio_thread_event),
-            "::",
-            stringify!(nsec)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<audio_thread_event>())).data1 as *const _ as usize },
-        8usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(audio_thread_event),
-            "::",
-            stringify!(data1)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<audio_thread_event>())).data2 as *const _ as usize },
-        12usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(audio_thread_event),
-            "::",
-            stringify!(data2)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<audio_thread_event>())).data3 as *const _ as usize },
-        16usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(audio_thread_event),
-            "::",
-            stringify!(data3)
-        )
-    );
-}
-#[repr(C, packed)]
-#[derive(Copy, Clone)]
-pub struct audio_thread_event_log {
-    pub write_pos: u64,
-    pub sync_write_pos: u64,
-    pub len: u32,
-    pub log: [audio_thread_event; 6144usize],
-}
-#[test]
-fn bindgen_test_layout_audio_thread_event_log() {
-    assert_eq!(
-        ::std::mem::size_of::<audio_thread_event_log>(),
-        122900usize,
-        concat!("Size of: ", stringify!(audio_thread_event_log))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<audio_thread_event_log>(),
-        1usize,
-        concat!("Alignment of ", stringify!(audio_thread_event_log))
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<audio_thread_event_log>())).write_pos as *const _ as usize
-        },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(audio_thread_event_log),
-            "::",
-            stringify!(write_pos)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<audio_thread_event_log>())).sync_write_pos as *const _ as usize
-        },
-        8usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(audio_thread_event_log),
-            "::",
-            stringify!(sync_write_pos)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<audio_thread_event_log>())).len as *const _ as usize },
-        16usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(audio_thread_event_log),
-            "::",
-            stringify!(len)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<audio_thread_event_log>())).log as *const _ as usize },
-        20usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(audio_thread_event_log),
-            "::",
-            stringify!(log)
-        )
-    );
-}
-#[repr(C, packed)]
-#[derive(Copy, Clone)]
-pub struct audio_dev_debug_info {
-    pub dev_name: [::std::os::raw::c_char; 64usize],
-    pub buffer_size: u32,
-    pub min_buffer_level: u32,
-    pub min_cb_level: u32,
-    pub max_cb_level: u32,
-    pub frame_rate: u32,
-    pub num_channels: u32,
-    pub est_rate_ratio: f64,
-    pub direction: u8,
-    pub num_underruns: u32,
-    pub num_severe_underruns: u32,
-    pub highest_hw_level: u32,
-    pub runtime_sec: u32,
-    pub runtime_nsec: u32,
-    pub longest_wake_sec: u32,
-    pub longest_wake_nsec: u32,
-    pub software_gain_scaler: f64,
-}
-#[test]
-fn bindgen_test_layout_audio_dev_debug_info() {
-    assert_eq!(
-        ::std::mem::size_of::<audio_dev_debug_info>(),
-        133usize,
-        concat!("Size of: ", stringify!(audio_dev_debug_info))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<audio_dev_debug_info>(),
-        1usize,
-        concat!("Alignment of ", stringify!(audio_dev_debug_info))
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<audio_dev_debug_info>())).dev_name as *const _ as usize },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(audio_dev_debug_info),
-            "::",
-            stringify!(dev_name)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<audio_dev_debug_info>())).buffer_size as *const _ as usize
-        },
-        64usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(audio_dev_debug_info),
-            "::",
-            stringify!(buffer_size)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<audio_dev_debug_info>())).min_buffer_level as *const _ as usize
-        },
-        68usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(audio_dev_debug_info),
-            "::",
-            stringify!(min_buffer_level)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<audio_dev_debug_info>())).min_cb_level as *const _ as usize
-        },
-        72usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(audio_dev_debug_info),
-            "::",
-            stringify!(min_cb_level)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<audio_dev_debug_info>())).max_cb_level as *const _ as usize
-        },
-        76usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(audio_dev_debug_info),
-            "::",
-            stringify!(max_cb_level)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<audio_dev_debug_info>())).frame_rate as *const _ as usize },
-        80usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(audio_dev_debug_info),
-            "::",
-            stringify!(frame_rate)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<audio_dev_debug_info>())).num_channels as *const _ as usize
-        },
-        84usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(audio_dev_debug_info),
-            "::",
-            stringify!(num_channels)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<audio_dev_debug_info>())).est_rate_ratio as *const _ as usize
-        },
-        88usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(audio_dev_debug_info),
-            "::",
-            stringify!(est_rate_ratio)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<audio_dev_debug_info>())).direction as *const _ as usize },
-        96usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(audio_dev_debug_info),
-            "::",
-            stringify!(direction)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<audio_dev_debug_info>())).num_underruns as *const _ as usize
-        },
-        97usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(audio_dev_debug_info),
-            "::",
-            stringify!(num_underruns)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<audio_dev_debug_info>())).num_severe_underruns as *const _
-                as usize
-        },
-        101usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(audio_dev_debug_info),
-            "::",
-            stringify!(num_severe_underruns)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<audio_dev_debug_info>())).highest_hw_level as *const _ as usize
-        },
-        105usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(audio_dev_debug_info),
-            "::",
-            stringify!(highest_hw_level)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<audio_dev_debug_info>())).runtime_sec as *const _ as usize
-        },
-        109usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(audio_dev_debug_info),
-            "::",
-            stringify!(runtime_sec)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<audio_dev_debug_info>())).runtime_nsec as *const _ as usize
-        },
-        113usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(audio_dev_debug_info),
-            "::",
-            stringify!(runtime_nsec)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<audio_dev_debug_info>())).longest_wake_sec as *const _ as usize
-        },
-        117usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(audio_dev_debug_info),
-            "::",
-            stringify!(longest_wake_sec)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<audio_dev_debug_info>())).longest_wake_nsec as *const _ as usize
-        },
-        121usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(audio_dev_debug_info),
-            "::",
-            stringify!(longest_wake_nsec)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<audio_dev_debug_info>())).software_gain_scaler as *const _
-                as usize
-        },
-        125usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(audio_dev_debug_info),
-            "::",
-            stringify!(software_gain_scaler)
-        )
-    );
-}
-#[repr(C, packed)]
-#[derive(Debug, Copy, Clone)]
-pub struct audio_stream_debug_info {
-    pub stream_id: u64,
-    pub dev_idx: u32,
-    pub direction: u32,
-    pub stream_type: u32,
-    pub client_type: u32,
-    pub buffer_frames: u32,
-    pub cb_threshold: u32,
-    pub effects: u64,
-    pub flags: u32,
-    pub frame_rate: u32,
-    pub num_channels: u32,
-    pub longest_fetch_sec: u32,
-    pub longest_fetch_nsec: u32,
-    pub num_missed_cb: u32,
-    pub num_overruns: u32,
-    pub is_pinned: u32,
-    pub pinned_dev_idx: u32,
-    pub runtime_sec: u32,
-    pub runtime_nsec: u32,
-    pub stream_volume: f64,
-    pub channel_layout: [i8; 11usize],
-}
-#[test]
-fn bindgen_test_layout_audio_stream_debug_info() {
-    assert_eq!(
-        ::std::mem::size_of::<audio_stream_debug_info>(),
-        103usize,
-        concat!("Size of: ", stringify!(audio_stream_debug_info))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<audio_stream_debug_info>(),
-        1usize,
-        concat!("Alignment of ", stringify!(audio_stream_debug_info))
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<audio_stream_debug_info>())).stream_id as *const _ as usize
-        },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(audio_stream_debug_info),
-            "::",
-            stringify!(stream_id)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<audio_stream_debug_info>())).dev_idx as *const _ as usize },
-        8usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(audio_stream_debug_info),
-            "::",
-            stringify!(dev_idx)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<audio_stream_debug_info>())).direction as *const _ as usize
-        },
-        12usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(audio_stream_debug_info),
-            "::",
-            stringify!(direction)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<audio_stream_debug_info>())).stream_type as *const _ as usize
-        },
-        16usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(audio_stream_debug_info),
-            "::",
-            stringify!(stream_type)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<audio_stream_debug_info>())).client_type as *const _ as usize
-        },
-        20usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(audio_stream_debug_info),
-            "::",
-            stringify!(client_type)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<audio_stream_debug_info>())).buffer_frames as *const _ as usize
-        },
-        24usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(audio_stream_debug_info),
-            "::",
-            stringify!(buffer_frames)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<audio_stream_debug_info>())).cb_threshold as *const _ as usize
-        },
-        28usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(audio_stream_debug_info),
-            "::",
-            stringify!(cb_threshold)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<audio_stream_debug_info>())).effects as *const _ as usize },
-        32usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(audio_stream_debug_info),
-            "::",
-            stringify!(effects)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<audio_stream_debug_info>())).flags as *const _ as usize },
-        40usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(audio_stream_debug_info),
-            "::",
-            stringify!(flags)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<audio_stream_debug_info>())).frame_rate as *const _ as usize
-        },
-        44usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(audio_stream_debug_info),
-            "::",
-            stringify!(frame_rate)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<audio_stream_debug_info>())).num_channels as *const _ as usize
-        },
-        48usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(audio_stream_debug_info),
-            "::",
-            stringify!(num_channels)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<audio_stream_debug_info>())).longest_fetch_sec as *const _
-                as usize
-        },
-        52usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(audio_stream_debug_info),
-            "::",
-            stringify!(longest_fetch_sec)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<audio_stream_debug_info>())).longest_fetch_nsec as *const _
-                as usize
-        },
-        56usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(audio_stream_debug_info),
-            "::",
-            stringify!(longest_fetch_nsec)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<audio_stream_debug_info>())).num_missed_cb as *const _ as usize
-        },
-        60usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(audio_stream_debug_info),
-            "::",
-            stringify!(num_missed_cb)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<audio_stream_debug_info>())).num_overruns as *const _ as usize
-        },
-        64usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(audio_stream_debug_info),
-            "::",
-            stringify!(num_overruns)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<audio_stream_debug_info>())).is_pinned as *const _ as usize
-        },
-        68usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(audio_stream_debug_info),
-            "::",
-            stringify!(is_pinned)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<audio_stream_debug_info>())).pinned_dev_idx as *const _ as usize
-        },
-        72usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(audio_stream_debug_info),
-            "::",
-            stringify!(pinned_dev_idx)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<audio_stream_debug_info>())).runtime_sec as *const _ as usize
-        },
-        76usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(audio_stream_debug_info),
-            "::",
-            stringify!(runtime_sec)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<audio_stream_debug_info>())).runtime_nsec as *const _ as usize
-        },
-        80usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(audio_stream_debug_info),
-            "::",
-            stringify!(runtime_nsec)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<audio_stream_debug_info>())).stream_volume as *const _ as usize
-        },
-        84usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(audio_stream_debug_info),
-            "::",
-            stringify!(stream_volume)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<audio_stream_debug_info>())).channel_layout as *const _ as usize
-        },
-        92usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(audio_stream_debug_info),
-            "::",
-            stringify!(channel_layout)
-        )
-    );
-}
-#[repr(C, packed)]
-#[derive(Copy, Clone)]
-pub struct audio_debug_info {
-    pub num_streams: u32,
-    pub num_devs: u32,
-    pub devs: [audio_dev_debug_info; 4usize],
-    pub streams: [audio_stream_debug_info; 8usize],
-    pub log: audio_thread_event_log,
-}
-#[test]
-fn bindgen_test_layout_audio_debug_info() {
-    assert_eq!(
-        ::std::mem::size_of::<audio_debug_info>(),
-        124264usize,
-        concat!("Size of: ", stringify!(audio_debug_info))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<audio_debug_info>(),
-        1usize,
-        concat!("Alignment of ", stringify!(audio_debug_info))
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<audio_debug_info>())).num_streams as *const _ as usize },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(audio_debug_info),
-            "::",
-            stringify!(num_streams)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<audio_debug_info>())).num_devs as *const _ as usize },
-        4usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(audio_debug_info),
-            "::",
-            stringify!(num_devs)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<audio_debug_info>())).devs as *const _ as usize },
-        8usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(audio_debug_info),
-            "::",
-            stringify!(devs)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<audio_debug_info>())).streams as *const _ as usize },
-        540usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(audio_debug_info),
-            "::",
-            stringify!(streams)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<audio_debug_info>())).log as *const _ as usize },
-        1364usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(audio_debug_info),
-            "::",
-            stringify!(log)
-        )
-    );
-}
-#[repr(C, packed)]
-#[derive(Debug, Copy, Clone)]
-pub struct main_thread_event {
-    pub tag_sec: u32,
-    pub nsec: u32,
-    pub data1: u32,
-    pub data2: u32,
-    pub data3: u32,
-}
-#[test]
-fn bindgen_test_layout_main_thread_event() {
-    assert_eq!(
-        ::std::mem::size_of::<main_thread_event>(),
-        20usize,
-        concat!("Size of: ", stringify!(main_thread_event))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<main_thread_event>(),
-        1usize,
-        concat!("Alignment of ", stringify!(main_thread_event))
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<main_thread_event>())).tag_sec as *const _ as usize },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(main_thread_event),
-            "::",
-            stringify!(tag_sec)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<main_thread_event>())).nsec as *const _ as usize },
-        4usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(main_thread_event),
-            "::",
-            stringify!(nsec)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<main_thread_event>())).data1 as *const _ as usize },
-        8usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(main_thread_event),
-            "::",
-            stringify!(data1)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<main_thread_event>())).data2 as *const _ as usize },
-        12usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(main_thread_event),
-            "::",
-            stringify!(data2)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<main_thread_event>())).data3 as *const _ as usize },
-        16usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(main_thread_event),
-            "::",
-            stringify!(data3)
-        )
-    );
-}
-#[repr(C, packed)]
-#[derive(Copy, Clone)]
-pub struct main_thread_event_log {
-    pub write_pos: u32,
-    pub len: u32,
-    pub log: [main_thread_event; 1024usize],
-}
-#[test]
-fn bindgen_test_layout_main_thread_event_log() {
-    assert_eq!(
-        ::std::mem::size_of::<main_thread_event_log>(),
-        20488usize,
-        concat!("Size of: ", stringify!(main_thread_event_log))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<main_thread_event_log>(),
-        1usize,
-        concat!("Alignment of ", stringify!(main_thread_event_log))
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<main_thread_event_log>())).write_pos as *const _ as usize },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(main_thread_event_log),
-            "::",
-            stringify!(write_pos)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<main_thread_event_log>())).len as *const _ as usize },
-        4usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(main_thread_event_log),
-            "::",
-            stringify!(len)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<main_thread_event_log>())).log as *const _ as usize },
-        8usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(main_thread_event_log),
-            "::",
-            stringify!(log)
-        )
-    );
-}
-#[repr(C, packed)]
-#[derive(Copy, Clone)]
-pub struct main_thread_debug_info {
-    pub main_log: main_thread_event_log,
-}
-#[test]
-fn bindgen_test_layout_main_thread_debug_info() {
-    assert_eq!(
-        ::std::mem::size_of::<main_thread_debug_info>(),
-        20488usize,
-        concat!("Size of: ", stringify!(main_thread_debug_info))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<main_thread_debug_info>(),
-        1usize,
-        concat!("Alignment of ", stringify!(main_thread_debug_info))
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<main_thread_debug_info>())).main_log as *const _ as usize },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(main_thread_debug_info),
-            "::",
-            stringify!(main_log)
-        )
-    );
-}
-#[repr(C, packed)]
-#[derive(Debug, Copy, Clone)]
-pub struct cras_bt_event {
-    pub tag_sec: u32,
-    pub nsec: u32,
-    pub data1: u32,
-    pub data2: u32,
-}
-#[test]
-fn bindgen_test_layout_cras_bt_event() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_bt_event>(),
-        16usize,
-        concat!("Size of: ", stringify!(cras_bt_event))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_bt_event>(),
-        1usize,
-        concat!("Alignment of ", stringify!(cras_bt_event))
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_bt_event>())).tag_sec as *const _ as usize },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_bt_event),
-            "::",
-            stringify!(tag_sec)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_bt_event>())).nsec as *const _ as usize },
-        4usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_bt_event),
-            "::",
-            stringify!(nsec)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_bt_event>())).data1 as *const _ as usize },
-        8usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_bt_event),
-            "::",
-            stringify!(data1)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_bt_event>())).data2 as *const _ as usize },
-        12usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_bt_event),
-            "::",
-            stringify!(data2)
-        )
-    );
-}
-#[repr(C, packed)]
-#[derive(Copy, Clone)]
-pub struct cras_bt_event_log {
-    pub write_pos: u32,
-    pub len: u32,
-    pub log: [cras_bt_event; 1024usize],
-}
-#[test]
-fn bindgen_test_layout_cras_bt_event_log() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_bt_event_log>(),
-        16392usize,
-        concat!("Size of: ", stringify!(cras_bt_event_log))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_bt_event_log>(),
-        1usize,
-        concat!("Alignment of ", stringify!(cras_bt_event_log))
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_bt_event_log>())).write_pos as *const _ as usize },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_bt_event_log),
-            "::",
-            stringify!(write_pos)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_bt_event_log>())).len as *const _ as usize },
-        4usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_bt_event_log),
-            "::",
-            stringify!(len)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_bt_event_log>())).log as *const _ as usize },
-        8usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_bt_event_log),
-            "::",
-            stringify!(log)
-        )
-    );
-}
-#[repr(C, packed)]
-#[derive(Copy, Clone)]
-pub struct cras_bt_debug_info {
-    pub bt_log: cras_bt_event_log,
-    pub wbs_logger: packet_status_logger,
-}
-#[test]
-fn bindgen_test_layout_cras_bt_debug_info() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_bt_debug_info>(),
-        16488usize,
-        concat!("Size of: ", stringify!(cras_bt_debug_info))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_bt_debug_info>(),
-        1usize,
-        concat!("Alignment of ", stringify!(cras_bt_debug_info))
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_bt_debug_info>())).bt_log as *const _ as usize },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_bt_debug_info),
-            "::",
-            stringify!(bt_log)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_bt_debug_info>())).wbs_logger as *const _ as usize },
-        16392usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_bt_debug_info),
-            "::",
-            stringify!(wbs_logger)
-        )
-    );
-}
-#[repr(u32)]
-#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum CRAS_AUDIO_THREAD_EVENT_TYPE {
-    AUDIO_THREAD_EVENT_A2DP_OVERRUN = 0,
-    AUDIO_THREAD_EVENT_A2DP_THROTTLE = 1,
-    AUDIO_THREAD_EVENT_BUSYLOOP = 2,
-    AUDIO_THREAD_EVENT_DEBUG = 3,
-    AUDIO_THREAD_EVENT_SEVERE_UNDERRUN = 4,
-    AUDIO_THREAD_EVENT_UNDERRUN = 5,
-    AUDIO_THREAD_EVENT_DROP_SAMPLES = 6,
-    AUDIO_THREAD_EVENT_DEV_OVERRUN = 7,
-    AUDIO_THREAD_EVENT_TYPE_COUNT = 8,
-}
-#[repr(C, packed)]
-#[derive(Copy, Clone)]
-pub struct cras_audio_thread_snapshot {
-    pub timestamp: timespec,
-    pub event_type: CRAS_AUDIO_THREAD_EVENT_TYPE,
-    pub audio_debug_info: audio_debug_info,
-}
-#[test]
-fn bindgen_test_layout_cras_audio_thread_snapshot() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_audio_thread_snapshot>(),
-        124284usize,
-        concat!("Size of: ", stringify!(cras_audio_thread_snapshot))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_audio_thread_snapshot>(),
-        1usize,
-        concat!("Alignment of ", stringify!(cras_audio_thread_snapshot))
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_audio_thread_snapshot>())).timestamp as *const _ as usize
-        },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_audio_thread_snapshot),
-            "::",
-            stringify!(timestamp)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_audio_thread_snapshot>())).event_type as *const _ as usize
-        },
-        16usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_audio_thread_snapshot),
-            "::",
-            stringify!(event_type)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_audio_thread_snapshot>())).audio_debug_info as *const _
-                as usize
-        },
-        20usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_audio_thread_snapshot),
-            "::",
-            stringify!(audio_debug_info)
-        )
-    );
-}
-#[repr(C, packed)]
-#[derive(Copy, Clone)]
-pub struct cras_audio_thread_snapshot_buffer {
-    pub snapshots: [cras_audio_thread_snapshot; 10usize],
-    pub pos: ::std::os::raw::c_int,
-}
-#[test]
-fn bindgen_test_layout_cras_audio_thread_snapshot_buffer() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_audio_thread_snapshot_buffer>(),
-        1242844usize,
-        concat!("Size of: ", stringify!(cras_audio_thread_snapshot_buffer))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_audio_thread_snapshot_buffer>(),
-        1usize,
-        concat!(
-            "Alignment of ",
-            stringify!(cras_audio_thread_snapshot_buffer)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_audio_thread_snapshot_buffer>())).snapshots as *const _
-                as usize
-        },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_audio_thread_snapshot_buffer),
-            "::",
-            stringify!(snapshots)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_audio_thread_snapshot_buffer>())).pos as *const _ as usize
-        },
-        1242840usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_audio_thread_snapshot_buffer),
-            "::",
-            stringify!(pos)
-        )
-    );
-}
-#[repr(C, packed)]
-#[derive(Copy, Clone)]
-pub struct cras_server_state {
-    pub state_version: u32,
-    pub volume: u32,
-    pub min_volume_dBFS: i32,
-    pub max_volume_dBFS: i32,
-    pub mute: i32,
-    pub user_mute: i32,
-    pub mute_locked: i32,
-    pub suspended: i32,
-    pub capture_gain: i32,
-    pub capture_mute: i32,
-    pub capture_mute_locked: i32,
-    pub num_streams_attached: u32,
-    pub num_output_devs: u32,
-    pub num_input_devs: u32,
-    pub output_devs: [cras_iodev_info; 20usize],
-    pub input_devs: [cras_iodev_info; 20usize],
-    pub num_output_nodes: u32,
-    pub num_input_nodes: u32,
-    pub output_nodes: [cras_ionode_info; 20usize],
-    pub input_nodes: [cras_ionode_info; 20usize],
-    pub num_attached_clients: u32,
-    pub client_info: [cras_attached_client_info; 20usize],
-    pub update_count: u32,
-    pub num_active_streams: [u32; 4usize],
-    pub last_active_stream_time: cras_timespec,
-    pub audio_debug_info: audio_debug_info,
-    pub default_output_buffer_size: i32,
-    pub non_empty_status: i32,
-    pub aec_supported: i32,
-    pub aec_group_id: i32,
-    pub snapshot_buffer: cras_audio_thread_snapshot_buffer,
-    pub bt_debug_info: cras_bt_debug_info,
-    pub bt_wbs_enabled: i32,
-    pub deprioritize_bt_wbs_mic: i32,
-    pub main_thread_debug_info: main_thread_debug_info,
-    pub num_input_streams_with_permission: [u32; 11usize],
-    pub noise_cancellation_enabled: i32,
-    pub hotword_pause_at_suspend: i32,
-}
-#[test]
-fn bindgen_test_layout_cras_server_state() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_server_state>(),
-        1414344usize,
-        concat!("Size of: ", stringify!(cras_server_state))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_server_state>(),
-        1usize,
-        concat!("Alignment of ", stringify!(cras_server_state))
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_server_state>())).state_version as *const _ as usize },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_server_state),
-            "::",
-            stringify!(state_version)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_server_state>())).volume as *const _ as usize },
-        4usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_server_state),
-            "::",
-            stringify!(volume)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_server_state>())).min_volume_dBFS as *const _ as usize
-        },
-        8usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_server_state),
-            "::",
-            stringify!(min_volume_dBFS)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_server_state>())).max_volume_dBFS as *const _ as usize
-        },
-        12usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_server_state),
-            "::",
-            stringify!(max_volume_dBFS)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_server_state>())).mute as *const _ as usize },
-        16usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_server_state),
-            "::",
-            stringify!(mute)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_server_state>())).user_mute as *const _ as usize },
-        20usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_server_state),
-            "::",
-            stringify!(user_mute)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_server_state>())).mute_locked as *const _ as usize },
-        24usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_server_state),
-            "::",
-            stringify!(mute_locked)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_server_state>())).suspended as *const _ as usize },
-        28usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_server_state),
-            "::",
-            stringify!(suspended)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_server_state>())).capture_gain as *const _ as usize },
-        32usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_server_state),
-            "::",
-            stringify!(capture_gain)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_server_state>())).capture_mute as *const _ as usize },
-        36usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_server_state),
-            "::",
-            stringify!(capture_mute)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_server_state>())).capture_mute_locked as *const _ as usize
-        },
-        40usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_server_state),
-            "::",
-            stringify!(capture_mute_locked)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_server_state>())).num_streams_attached as *const _ as usize
-        },
-        44usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_server_state),
-            "::",
-            stringify!(num_streams_attached)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_server_state>())).num_output_devs as *const _ as usize
-        },
-        48usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_server_state),
-            "::",
-            stringify!(num_output_devs)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_server_state>())).num_input_devs as *const _ as usize
-        },
-        52usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_server_state),
-            "::",
-            stringify!(num_input_devs)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_server_state>())).output_devs as *const _ as usize },
-        56usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_server_state),
-            "::",
-            stringify!(output_devs)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_server_state>())).input_devs as *const _ as usize },
-        1576usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_server_state),
-            "::",
-            stringify!(input_devs)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_server_state>())).num_output_nodes as *const _ as usize
-        },
-        3096usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_server_state),
-            "::",
-            stringify!(num_output_nodes)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_server_state>())).num_input_nodes as *const _ as usize
-        },
-        3100usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_server_state),
-            "::",
-            stringify!(num_input_nodes)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_server_state>())).output_nodes as *const _ as usize },
-        3104usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_server_state),
-            "::",
-            stringify!(output_nodes)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_server_state>())).input_nodes as *const _ as usize },
-        6464usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_server_state),
-            "::",
-            stringify!(input_nodes)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_server_state>())).num_attached_clients as *const _ as usize
-        },
-        9824usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_server_state),
-            "::",
-            stringify!(num_attached_clients)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_server_state>())).client_info as *const _ as usize },
-        9828usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_server_state),
-            "::",
-            stringify!(client_info)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_server_state>())).update_count as *const _ as usize },
-        10148usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_server_state),
-            "::",
-            stringify!(update_count)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_server_state>())).num_active_streams as *const _ as usize
-        },
-        10152usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_server_state),
-            "::",
-            stringify!(num_active_streams)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_server_state>())).last_active_stream_time as *const _
-                as usize
-        },
-        10168usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_server_state),
-            "::",
-            stringify!(last_active_stream_time)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_server_state>())).audio_debug_info as *const _ as usize
-        },
-        10184usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_server_state),
-            "::",
-            stringify!(audio_debug_info)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_server_state>())).default_output_buffer_size as *const _
-                as usize
-        },
-        134448usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_server_state),
-            "::",
-            stringify!(default_output_buffer_size)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_server_state>())).non_empty_status as *const _ as usize
-        },
-        134452usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_server_state),
-            "::",
-            stringify!(non_empty_status)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_server_state>())).aec_supported as *const _ as usize },
-        134456usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_server_state),
-            "::",
-            stringify!(aec_supported)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_server_state>())).aec_group_id as *const _ as usize },
-        134460usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_server_state),
-            "::",
-            stringify!(aec_group_id)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_server_state>())).snapshot_buffer as *const _ as usize
-        },
-        134464usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_server_state),
-            "::",
-            stringify!(snapshot_buffer)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_server_state>())).bt_debug_info as *const _ as usize },
-        1377308usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_server_state),
-            "::",
-            stringify!(bt_debug_info)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_server_state>())).bt_wbs_enabled as *const _ as usize
-        },
-        1393796usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_server_state),
-            "::",
-            stringify!(bt_wbs_enabled)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_server_state>())).deprioritize_bt_wbs_mic as *const _
-                as usize
-        },
-        1393800usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_server_state),
-            "::",
-            stringify!(deprioritize_bt_wbs_mic)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_server_state>())).main_thread_debug_info as *const _
-                as usize
-        },
-        1393804usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_server_state),
-            "::",
-            stringify!(main_thread_debug_info)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_server_state>())).num_input_streams_with_permission
-                as *const _ as usize
-        },
-        1414292usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_server_state),
-            "::",
-            stringify!(num_input_streams_with_permission)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_server_state>())).noise_cancellation_enabled as *const _
-                as usize
-        },
-        1414336usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_server_state),
-            "::",
-            stringify!(noise_cancellation_enabled)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_server_state>())).hotword_pause_at_suspend as *const _
-                as usize
-        },
-        1414340usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_server_state),
-            "::",
-            stringify!(hotword_pause_at_suspend)
-        )
-    );
-}
-pub const cras_notify_device_action_CRAS_DEVICE_ACTION_ADD: cras_notify_device_action = 0;
-pub const cras_notify_device_action_CRAS_DEVICE_ACTION_REMOVE: cras_notify_device_action = 1;
-pub const cras_notify_device_action_CRAS_DEVICE_ACTION_CHANGE: cras_notify_device_action = 2;
-pub type cras_notify_device_action = u32;
-#[repr(u32)]
-#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum CRAS_ALSA_CARD_TYPE {
-    ALSA_CARD_TYPE_INTERNAL = 0,
-    ALSA_CARD_TYPE_USB = 1,
-}
-#[repr(C, packed)]
-#[derive(Copy, Clone)]
-pub struct cras_alsa_card_info {
-    pub card_type: CRAS_ALSA_CARD_TYPE,
-    pub card_index: u32,
-    pub usb_vendor_id: u32,
-    pub usb_product_id: u32,
-    pub usb_serial_number: [::std::os::raw::c_char; 64usize],
-    pub usb_desc_checksum: u32,
-}
-#[test]
-fn bindgen_test_layout_cras_alsa_card_info() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_alsa_card_info>(),
-        84usize,
-        concat!("Size of: ", stringify!(cras_alsa_card_info))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_alsa_card_info>(),
-        1usize,
-        concat!("Alignment of ", stringify!(cras_alsa_card_info))
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_alsa_card_info>())).card_type as *const _ as usize },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_alsa_card_info),
-            "::",
-            stringify!(card_type)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_alsa_card_info>())).card_index as *const _ as usize },
-        4usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_alsa_card_info),
-            "::",
-            stringify!(card_index)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_alsa_card_info>())).usb_vendor_id as *const _ as usize
-        },
-        8usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_alsa_card_info),
-            "::",
-            stringify!(usb_vendor_id)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_alsa_card_info>())).usb_product_id as *const _ as usize
-        },
-        12usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_alsa_card_info),
-            "::",
-            stringify!(usb_product_id)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_alsa_card_info>())).usb_serial_number as *const _ as usize
-        },
-        16usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_alsa_card_info),
-            "::",
-            stringify!(usb_serial_number)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_alsa_card_info>())).usb_desc_checksum as *const _ as usize
-        },
-        80usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_alsa_card_info),
-            "::",
-            stringify!(usb_desc_checksum)
-        )
-    );
-}
-pub type cras_stream_id_t = u32;
-#[repr(u32)]
-#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum CRAS_NODE_TYPE {
-    CRAS_NODE_TYPE_INTERNAL_SPEAKER = 0,
-    CRAS_NODE_TYPE_HEADPHONE = 1,
-    CRAS_NODE_TYPE_HDMI = 2,
-    CRAS_NODE_TYPE_HAPTIC = 3,
-    CRAS_NODE_TYPE_LINEOUT = 4,
-    CRAS_NODE_TYPE_MIC = 5,
-    CRAS_NODE_TYPE_HOTWORD = 6,
-    CRAS_NODE_TYPE_POST_MIX_PRE_DSP = 7,
-    CRAS_NODE_TYPE_POST_DSP = 8,
-    CRAS_NODE_TYPE_BLUETOOTH_NB_MIC = 9,
-    CRAS_NODE_TYPE_USB = 10,
-    CRAS_NODE_TYPE_BLUETOOTH = 11,
-    CRAS_NODE_TYPE_FALLBACK_NORMAL = 12,
-    CRAS_NODE_TYPE_FALLBACK_ABNORMAL = 13,
-    CRAS_NODE_TYPE_UNKNOWN = 14,
-    CRAS_NODE_TYPE_ECHO_REFERENCE = 15,
-    CRAS_NODE_TYPE_ALSA_LOOPBACK = 16,
-}
-#[repr(u32)]
-#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum CRAS_NODE_POSITION {
-    NODE_POSITION_EXTERNAL = 0,
-    NODE_POSITION_INTERNAL = 1,
-    NODE_POSITION_FRONT = 2,
-    NODE_POSITION_REAR = 3,
-    NODE_POSITION_KEYBOARD = 4,
-}
-#[repr(u32)]
-#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum CRAS_SERVER_MESSAGE_ID {
-    CRAS_SERVER_CONNECT_STREAM = 0,
-    CRAS_SERVER_DISCONNECT_STREAM = 1,
-    CRAS_SERVER_SWITCH_STREAM_TYPE_IODEV = 2,
-    CRAS_SERVER_SET_SYSTEM_VOLUME = 3,
-    CRAS_SERVER_SET_SYSTEM_MUTE = 4,
-    CRAS_SERVER_SET_USER_MUTE = 5,
-    CRAS_SERVER_SET_SYSTEM_MUTE_LOCKED = 6,
-    CRAS_SERVER_SET_SYSTEM_CAPTURE_GAIN = 7,
-    CRAS_SERVER_SET_SYSTEM_CAPTURE_MUTE = 8,
-    CRAS_SERVER_SET_SYSTEM_CAPTURE_MUTE_LOCKED = 9,
-    CRAS_SERVER_SET_NODE_ATTR = 10,
-    CRAS_SERVER_SELECT_NODE = 11,
-    CRAS_SERVER_RELOAD_DSP = 12,
-    CRAS_SERVER_DUMP_DSP_INFO = 13,
-    CRAS_SERVER_DUMP_AUDIO_THREAD = 14,
-    CRAS_SERVER_DUMP_SNAPSHOTS = 15,
-    CRAS_SERVER_ADD_ACTIVE_NODE = 16,
-    CRAS_SERVER_RM_ACTIVE_NODE = 17,
-    CRAS_SERVER_ADD_TEST_DEV = 18,
-    CRAS_SERVER_TEST_DEV_COMMAND = 19,
-    CRAS_SERVER_SUSPEND = 20,
-    CRAS_SERVER_RESUME = 21,
-    CRAS_CONFIG_GLOBAL_REMIX = 22,
-    CRAS_SERVER_GET_HOTWORD_MODELS = 23,
-    CRAS_SERVER_SET_HOTWORD_MODEL = 24,
-    CRAS_SERVER_REGISTER_NOTIFICATION = 25,
-    CRAS_SERVER_SET_AEC_DUMP = 26,
-    CRAS_SERVER_RELOAD_AEC_CONFIG = 27,
-    CRAS_SERVER_DUMP_BT = 28,
-    CRAS_SERVER_SET_BT_WBS_ENABLED = 29,
-    CRAS_SERVER_GET_ATLOG_FD = 30,
-    CRAS_SERVER_DUMP_MAIN = 31,
-}
-#[repr(u32)]
-#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum CRAS_CLIENT_MESSAGE_ID {
-    CRAS_CLIENT_CONNECTED = 0,
-    CRAS_CLIENT_STREAM_CONNECTED = 1,
-    CRAS_CLIENT_AUDIO_DEBUG_INFO_READY = 2,
-    CRAS_CLIENT_GET_HOTWORD_MODELS_READY = 3,
-    CRAS_CLIENT_OUTPUT_VOLUME_CHANGED = 4,
-    CRAS_CLIENT_OUTPUT_MUTE_CHANGED = 5,
-    CRAS_CLIENT_CAPTURE_GAIN_CHANGED = 6,
-    CRAS_CLIENT_CAPTURE_MUTE_CHANGED = 7,
-    CRAS_CLIENT_NODES_CHANGED = 8,
-    CRAS_CLIENT_ACTIVE_NODE_CHANGED = 9,
-    CRAS_CLIENT_OUTPUT_NODE_VOLUME_CHANGED = 10,
-    CRAS_CLIENT_NODE_LEFT_RIGHT_SWAPPED_CHANGED = 11,
-    CRAS_CLIENT_INPUT_NODE_GAIN_CHANGED = 12,
-    CRAS_CLIENT_NUM_ACTIVE_STREAMS_CHANGED = 13,
-    CRAS_CLIENT_ATLOG_FD_READY = 14,
-}
-#[repr(C, packed)]
-#[derive(Debug, Copy, Clone)]
-pub struct cras_server_message {
-    pub length: u32,
-    pub id: CRAS_SERVER_MESSAGE_ID,
-}
-#[test]
-fn bindgen_test_layout_cras_server_message() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_server_message>(),
-        8usize,
-        concat!("Size of: ", stringify!(cras_server_message))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_server_message>(),
-        1usize,
-        concat!("Alignment of ", stringify!(cras_server_message))
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_server_message>())).length as *const _ as usize },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_server_message),
-            "::",
-            stringify!(length)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_server_message>())).id as *const _ as usize },
-        4usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_server_message),
-            "::",
-            stringify!(id)
-        )
-    );
-}
-#[repr(C, packed)]
-#[derive(Debug, Copy, Clone)]
-pub struct cras_client_message {
-    pub length: u32,
-    pub id: CRAS_CLIENT_MESSAGE_ID,
-}
-#[test]
-fn bindgen_test_layout_cras_client_message() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_client_message>(),
-        8usize,
-        concat!("Size of: ", stringify!(cras_client_message))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_client_message>(),
-        1usize,
-        concat!("Alignment of ", stringify!(cras_client_message))
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_client_message>())).length as *const _ as usize },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_client_message),
-            "::",
-            stringify!(length)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_client_message>())).id as *const _ as usize },
-        4usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_client_message),
-            "::",
-            stringify!(id)
-        )
-    );
-}
-#[repr(C, packed)]
-#[derive(Debug, Copy, Clone)]
-pub struct cras_connect_message {
-    pub header: cras_server_message,
-    pub proto_version: u32,
-    pub direction: CRAS_STREAM_DIRECTION,
-    pub stream_id: cras_stream_id_t,
-    pub stream_type: CRAS_STREAM_TYPE,
-    pub buffer_frames: u32,
-    pub cb_threshold: u32,
-    pub flags: u32,
-    pub format: cras_audio_format_packed,
-    pub dev_idx: u32,
-    pub effects: u64,
-    pub client_type: CRAS_CLIENT_TYPE,
-    pub client_shm_size: u64,
-    pub buffer_offsets: [u64; 2usize],
-}
-#[test]
-fn bindgen_test_layout_cras_connect_message() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_connect_message>(),
-        99usize,
-        concat!("Size of: ", stringify!(cras_connect_message))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_connect_message>(),
-        1usize,
-        concat!("Alignment of ", stringify!(cras_connect_message))
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_connect_message>())).header as *const _ as usize },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_connect_message),
-            "::",
-            stringify!(header)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_connect_message>())).proto_version as *const _ as usize
-        },
-        8usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_connect_message),
-            "::",
-            stringify!(proto_version)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_connect_message>())).direction as *const _ as usize },
-        12usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_connect_message),
-            "::",
-            stringify!(direction)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_connect_message>())).stream_id as *const _ as usize },
-        16usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_connect_message),
-            "::",
-            stringify!(stream_id)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_connect_message>())).stream_type as *const _ as usize
-        },
-        20usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_connect_message),
-            "::",
-            stringify!(stream_type)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_connect_message>())).buffer_frames as *const _ as usize
-        },
-        24usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_connect_message),
-            "::",
-            stringify!(buffer_frames)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_connect_message>())).cb_threshold as *const _ as usize
-        },
-        28usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_connect_message),
-            "::",
-            stringify!(cb_threshold)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_connect_message>())).flags as *const _ as usize },
-        32usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_connect_message),
-            "::",
-            stringify!(flags)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_connect_message>())).format as *const _ as usize },
-        36usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_connect_message),
-            "::",
-            stringify!(format)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_connect_message>())).dev_idx as *const _ as usize },
-        59usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_connect_message),
-            "::",
-            stringify!(dev_idx)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_connect_message>())).effects as *const _ as usize },
-        63usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_connect_message),
-            "::",
-            stringify!(effects)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_connect_message>())).client_type as *const _ as usize
-        },
-        71usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_connect_message),
-            "::",
-            stringify!(client_type)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_connect_message>())).client_shm_size as *const _ as usize
-        },
-        75usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_connect_message),
-            "::",
-            stringify!(client_shm_size)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_connect_message>())).buffer_offsets as *const _ as usize
-        },
-        83usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_connect_message),
-            "::",
-            stringify!(buffer_offsets)
-        )
-    );
-}
-#[repr(C, packed)]
-#[derive(Debug, Copy, Clone)]
-pub struct cras_disconnect_stream_message {
-    pub header: cras_server_message,
-    pub stream_id: cras_stream_id_t,
-}
-#[test]
-fn bindgen_test_layout_cras_disconnect_stream_message() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_disconnect_stream_message>(),
-        12usize,
-        concat!("Size of: ", stringify!(cras_disconnect_stream_message))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_disconnect_stream_message>(),
-        1usize,
-        concat!("Alignment of ", stringify!(cras_disconnect_stream_message))
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_disconnect_stream_message>())).header as *const _ as usize
-        },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_disconnect_stream_message),
-            "::",
-            stringify!(header)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_disconnect_stream_message>())).stream_id as *const _
-                as usize
-        },
-        8usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_disconnect_stream_message),
-            "::",
-            stringify!(stream_id)
-        )
-    );
-}
-#[repr(C, packed)]
-#[derive(Debug, Copy, Clone)]
-pub struct cras_switch_stream_type_iodev {
-    pub header: cras_server_message,
-    pub stream_type: CRAS_STREAM_TYPE,
-    pub iodev_idx: u32,
-}
-#[test]
-fn bindgen_test_layout_cras_switch_stream_type_iodev() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_switch_stream_type_iodev>(),
-        16usize,
-        concat!("Size of: ", stringify!(cras_switch_stream_type_iodev))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_switch_stream_type_iodev>(),
-        1usize,
-        concat!("Alignment of ", stringify!(cras_switch_stream_type_iodev))
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_switch_stream_type_iodev>())).header as *const _ as usize
-        },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_switch_stream_type_iodev),
-            "::",
-            stringify!(header)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_switch_stream_type_iodev>())).stream_type as *const _
-                as usize
-        },
-        8usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_switch_stream_type_iodev),
-            "::",
-            stringify!(stream_type)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_switch_stream_type_iodev>())).iodev_idx as *const _ as usize
-        },
-        12usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_switch_stream_type_iodev),
-            "::",
-            stringify!(iodev_idx)
-        )
-    );
-}
-#[repr(C, packed)]
-#[derive(Debug, Copy, Clone)]
-pub struct cras_set_system_volume {
-    pub header: cras_server_message,
-    pub volume: u32,
-}
-#[test]
-fn bindgen_test_layout_cras_set_system_volume() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_set_system_volume>(),
-        12usize,
-        concat!("Size of: ", stringify!(cras_set_system_volume))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_set_system_volume>(),
-        1usize,
-        concat!("Alignment of ", stringify!(cras_set_system_volume))
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_set_system_volume>())).header as *const _ as usize },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_set_system_volume),
-            "::",
-            stringify!(header)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_set_system_volume>())).volume as *const _ as usize },
-        8usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_set_system_volume),
-            "::",
-            stringify!(volume)
-        )
-    );
-}
-#[repr(C, packed)]
-#[derive(Debug, Copy, Clone)]
-pub struct cras_set_system_mute {
-    pub header: cras_server_message,
-    pub mute: i32,
-}
-#[test]
-fn bindgen_test_layout_cras_set_system_mute() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_set_system_mute>(),
-        12usize,
-        concat!("Size of: ", stringify!(cras_set_system_mute))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_set_system_mute>(),
-        1usize,
-        concat!("Alignment of ", stringify!(cras_set_system_mute))
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_set_system_mute>())).header as *const _ as usize },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_set_system_mute),
-            "::",
-            stringify!(header)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_set_system_mute>())).mute as *const _ as usize },
-        8usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_set_system_mute),
-            "::",
-            stringify!(mute)
-        )
-    );
-}
-#[repr(C, packed)]
-#[derive(Debug, Copy, Clone)]
-pub struct cras_set_node_attr {
-    pub header: cras_server_message,
-    pub node_id: cras_node_id_t,
-    pub attr: ionode_attr,
-    pub value: i32,
-}
-#[test]
-fn bindgen_test_layout_cras_set_node_attr() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_set_node_attr>(),
-        24usize,
-        concat!("Size of: ", stringify!(cras_set_node_attr))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_set_node_attr>(),
-        1usize,
-        concat!("Alignment of ", stringify!(cras_set_node_attr))
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_set_node_attr>())).header as *const _ as usize },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_set_node_attr),
-            "::",
-            stringify!(header)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_set_node_attr>())).node_id as *const _ as usize },
-        8usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_set_node_attr),
-            "::",
-            stringify!(node_id)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_set_node_attr>())).attr as *const _ as usize },
-        16usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_set_node_attr),
-            "::",
-            stringify!(attr)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_set_node_attr>())).value as *const _ as usize },
-        20usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_set_node_attr),
-            "::",
-            stringify!(value)
-        )
-    );
-}
-#[repr(C, packed)]
-#[derive(Debug, Copy, Clone)]
-pub struct cras_select_node {
-    pub header: cras_server_message,
-    pub direction: CRAS_STREAM_DIRECTION,
-    pub node_id: cras_node_id_t,
-}
-#[test]
-fn bindgen_test_layout_cras_select_node() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_select_node>(),
-        20usize,
-        concat!("Size of: ", stringify!(cras_select_node))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_select_node>(),
-        1usize,
-        concat!("Alignment of ", stringify!(cras_select_node))
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_select_node>())).header as *const _ as usize },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_select_node),
-            "::",
-            stringify!(header)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_select_node>())).direction as *const _ as usize },
-        8usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_select_node),
-            "::",
-            stringify!(direction)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_select_node>())).node_id as *const _ as usize },
-        12usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_select_node),
-            "::",
-            stringify!(node_id)
-        )
-    );
-}
-#[repr(C, packed)]
-#[derive(Debug, Copy, Clone)]
-pub struct cras_add_active_node {
-    pub header: cras_server_message,
-    pub direction: CRAS_STREAM_DIRECTION,
-    pub node_id: cras_node_id_t,
-}
-#[test]
-fn bindgen_test_layout_cras_add_active_node() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_add_active_node>(),
-        20usize,
-        concat!("Size of: ", stringify!(cras_add_active_node))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_add_active_node>(),
-        1usize,
-        concat!("Alignment of ", stringify!(cras_add_active_node))
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_add_active_node>())).header as *const _ as usize },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_add_active_node),
-            "::",
-            stringify!(header)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_add_active_node>())).direction as *const _ as usize },
-        8usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_add_active_node),
-            "::",
-            stringify!(direction)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_add_active_node>())).node_id as *const _ as usize },
-        12usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_add_active_node),
-            "::",
-            stringify!(node_id)
-        )
-    );
-}
-#[repr(C, packed)]
-#[derive(Debug, Copy, Clone)]
-pub struct cras_rm_active_node {
-    pub header: cras_server_message,
-    pub direction: CRAS_STREAM_DIRECTION,
-    pub node_id: cras_node_id_t,
-}
-#[test]
-fn bindgen_test_layout_cras_rm_active_node() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_rm_active_node>(),
-        20usize,
-        concat!("Size of: ", stringify!(cras_rm_active_node))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_rm_active_node>(),
-        1usize,
-        concat!("Alignment of ", stringify!(cras_rm_active_node))
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_rm_active_node>())).header as *const _ as usize },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_rm_active_node),
-            "::",
-            stringify!(header)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_rm_active_node>())).direction as *const _ as usize },
-        8usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_rm_active_node),
-            "::",
-            stringify!(direction)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_rm_active_node>())).node_id as *const _ as usize },
-        12usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_rm_active_node),
-            "::",
-            stringify!(node_id)
-        )
-    );
-}
-#[repr(C, packed)]
-#[derive(Debug, Copy, Clone)]
-pub struct cras_reload_dsp {
-    pub header: cras_server_message,
-}
-#[test]
-fn bindgen_test_layout_cras_reload_dsp() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_reload_dsp>(),
-        8usize,
-        concat!("Size of: ", stringify!(cras_reload_dsp))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_reload_dsp>(),
-        1usize,
-        concat!("Alignment of ", stringify!(cras_reload_dsp))
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_reload_dsp>())).header as *const _ as usize },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_reload_dsp),
-            "::",
-            stringify!(header)
-        )
-    );
-}
-#[repr(C, packed)]
-#[derive(Debug, Copy, Clone)]
-pub struct cras_dump_dsp_info {
-    pub header: cras_server_message,
-}
-#[test]
-fn bindgen_test_layout_cras_dump_dsp_info() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_dump_dsp_info>(),
-        8usize,
-        concat!("Size of: ", stringify!(cras_dump_dsp_info))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_dump_dsp_info>(),
-        1usize,
-        concat!("Alignment of ", stringify!(cras_dump_dsp_info))
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_dump_dsp_info>())).header as *const _ as usize },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_dump_dsp_info),
-            "::",
-            stringify!(header)
-        )
-    );
-}
-#[repr(C, packed)]
-#[derive(Debug, Copy, Clone)]
-pub struct cras_dump_audio_thread {
-    pub header: cras_server_message,
-}
-#[test]
-fn bindgen_test_layout_cras_dump_audio_thread() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_dump_audio_thread>(),
-        8usize,
-        concat!("Size of: ", stringify!(cras_dump_audio_thread))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_dump_audio_thread>(),
-        1usize,
-        concat!("Alignment of ", stringify!(cras_dump_audio_thread))
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_dump_audio_thread>())).header as *const _ as usize },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_dump_audio_thread),
-            "::",
-            stringify!(header)
-        )
-    );
-}
-#[repr(C, packed)]
-#[derive(Debug, Copy, Clone)]
-pub struct cras_get_atlog_fd {
-    pub header: cras_server_message,
-}
-#[test]
-fn bindgen_test_layout_cras_get_atlog_fd() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_get_atlog_fd>(),
-        8usize,
-        concat!("Size of: ", stringify!(cras_get_atlog_fd))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_get_atlog_fd>(),
-        1usize,
-        concat!("Alignment of ", stringify!(cras_get_atlog_fd))
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_get_atlog_fd>())).header as *const _ as usize },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_get_atlog_fd),
-            "::",
-            stringify!(header)
-        )
-    );
-}
-#[repr(C, packed)]
-#[derive(Debug, Copy, Clone)]
-pub struct cras_dump_main {
-    pub header: cras_server_message,
-}
-#[test]
-fn bindgen_test_layout_cras_dump_main() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_dump_main>(),
-        8usize,
-        concat!("Size of: ", stringify!(cras_dump_main))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_dump_main>(),
-        1usize,
-        concat!("Alignment of ", stringify!(cras_dump_main))
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_dump_main>())).header as *const _ as usize },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_dump_main),
-            "::",
-            stringify!(header)
-        )
-    );
-}
-#[repr(C, packed)]
-#[derive(Debug, Copy, Clone)]
-pub struct cras_dump_bt {
-    pub header: cras_server_message,
-}
-#[test]
-fn bindgen_test_layout_cras_dump_bt() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_dump_bt>(),
-        8usize,
-        concat!("Size of: ", stringify!(cras_dump_bt))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_dump_bt>(),
-        1usize,
-        concat!("Alignment of ", stringify!(cras_dump_bt))
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_dump_bt>())).header as *const _ as usize },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_dump_bt),
-            "::",
-            stringify!(header)
-        )
-    );
-}
-#[repr(C, packed)]
-#[derive(Debug, Copy, Clone)]
-pub struct cras_dump_snapshots {
-    pub header: cras_server_message,
-}
-#[test]
-fn bindgen_test_layout_cras_dump_snapshots() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_dump_snapshots>(),
-        8usize,
-        concat!("Size of: ", stringify!(cras_dump_snapshots))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_dump_snapshots>(),
-        1usize,
-        concat!("Alignment of ", stringify!(cras_dump_snapshots))
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_dump_snapshots>())).header as *const _ as usize },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_dump_snapshots),
-            "::",
-            stringify!(header)
-        )
-    );
-}
-#[repr(C, packed)]
-#[derive(Debug, Copy, Clone)]
-pub struct cras_add_test_dev {
-    pub header: cras_server_message,
-    pub type_: TEST_IODEV_TYPE,
-}
-#[test]
-fn bindgen_test_layout_cras_add_test_dev() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_add_test_dev>(),
-        12usize,
-        concat!("Size of: ", stringify!(cras_add_test_dev))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_add_test_dev>(),
-        1usize,
-        concat!("Alignment of ", stringify!(cras_add_test_dev))
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_add_test_dev>())).header as *const _ as usize },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_add_test_dev),
-            "::",
-            stringify!(header)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_add_test_dev>())).type_ as *const _ as usize },
-        8usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_add_test_dev),
-            "::",
-            stringify!(type_)
-        )
-    );
-}
-#[repr(C, packed)]
-#[derive(Copy, Clone)]
-pub struct cras_test_dev_command {
-    pub header: cras_server_message,
-    pub command: ::std::os::raw::c_uint,
-    pub iodev_idx: ::std::os::raw::c_uint,
-    pub data_len: ::std::os::raw::c_uint,
-    pub data: [u8; 224usize],
-}
-#[test]
-fn bindgen_test_layout_cras_test_dev_command() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_test_dev_command>(),
-        244usize,
-        concat!("Size of: ", stringify!(cras_test_dev_command))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_test_dev_command>(),
-        1usize,
-        concat!("Alignment of ", stringify!(cras_test_dev_command))
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_test_dev_command>())).header as *const _ as usize },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_test_dev_command),
-            "::",
-            stringify!(header)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_test_dev_command>())).command as *const _ as usize },
-        8usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_test_dev_command),
-            "::",
-            stringify!(command)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_test_dev_command>())).iodev_idx as *const _ as usize },
-        12usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_test_dev_command),
-            "::",
-            stringify!(iodev_idx)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_test_dev_command>())).data_len as *const _ as usize },
-        16usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_test_dev_command),
-            "::",
-            stringify!(data_len)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_test_dev_command>())).data as *const _ as usize },
-        20usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_test_dev_command),
-            "::",
-            stringify!(data)
-        )
-    );
-}
-#[repr(C, packed)]
-#[derive(Copy, Clone)]
-pub struct cras_config_global_remix {
-    pub header: cras_server_message,
-    pub num_channels: ::std::os::raw::c_uint,
-    pub coefficient: [f32; 64usize],
-}
-#[test]
-fn bindgen_test_layout_cras_config_global_remix() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_config_global_remix>(),
-        268usize,
-        concat!("Size of: ", stringify!(cras_config_global_remix))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_config_global_remix>(),
-        1usize,
-        concat!("Alignment of ", stringify!(cras_config_global_remix))
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_config_global_remix>())).header as *const _ as usize },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_config_global_remix),
-            "::",
-            stringify!(header)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_config_global_remix>())).num_channels as *const _ as usize
-        },
-        8usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_config_global_remix),
-            "::",
-            stringify!(num_channels)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_config_global_remix>())).coefficient as *const _ as usize
-        },
-        12usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_config_global_remix),
-            "::",
-            stringify!(coefficient)
-        )
-    );
-}
-#[repr(C, packed)]
-#[derive(Debug, Copy, Clone)]
-pub struct cras_get_hotword_models {
-    pub header: cras_server_message,
-    pub node_id: cras_node_id_t,
-}
-#[test]
-fn bindgen_test_layout_cras_get_hotword_models() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_get_hotword_models>(),
-        16usize,
-        concat!("Size of: ", stringify!(cras_get_hotword_models))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_get_hotword_models>(),
-        1usize,
-        concat!("Alignment of ", stringify!(cras_get_hotword_models))
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_get_hotword_models>())).header as *const _ as usize },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_get_hotword_models),
-            "::",
-            stringify!(header)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_get_hotword_models>())).node_id as *const _ as usize },
-        8usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_get_hotword_models),
-            "::",
-            stringify!(node_id)
-        )
-    );
-}
-#[repr(C, packed)]
-#[derive(Debug, Copy, Clone)]
-pub struct cras_set_hotword_model {
-    pub header: cras_server_message,
-    pub node_id: cras_node_id_t,
-    pub model_name: [::std::os::raw::c_char; 12usize],
-}
-#[test]
-fn bindgen_test_layout_cras_set_hotword_model() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_set_hotword_model>(),
-        28usize,
-        concat!("Size of: ", stringify!(cras_set_hotword_model))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_set_hotword_model>(),
-        1usize,
-        concat!("Alignment of ", stringify!(cras_set_hotword_model))
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_set_hotword_model>())).header as *const _ as usize },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_set_hotword_model),
-            "::",
-            stringify!(header)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_set_hotword_model>())).node_id as *const _ as usize },
-        8usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_set_hotword_model),
-            "::",
-            stringify!(node_id)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_set_hotword_model>())).model_name as *const _ as usize
-        },
-        16usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_set_hotword_model),
-            "::",
-            stringify!(model_name)
-        )
-    );
-}
-#[repr(C, packed)]
-#[derive(Debug, Copy, Clone)]
-pub struct cras_set_aec_dump {
-    pub header: cras_server_message,
-    pub stream_id: cras_stream_id_t,
-    pub start: ::std::os::raw::c_uint,
-}
-#[test]
-fn bindgen_test_layout_cras_set_aec_dump() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_set_aec_dump>(),
-        16usize,
-        concat!("Size of: ", stringify!(cras_set_aec_dump))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_set_aec_dump>(),
-        1usize,
-        concat!("Alignment of ", stringify!(cras_set_aec_dump))
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_set_aec_dump>())).header as *const _ as usize },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_set_aec_dump),
-            "::",
-            stringify!(header)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_set_aec_dump>())).stream_id as *const _ as usize },
-        8usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_set_aec_dump),
-            "::",
-            stringify!(stream_id)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_set_aec_dump>())).start as *const _ as usize },
-        12usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_set_aec_dump),
-            "::",
-            stringify!(start)
-        )
-    );
-}
-#[repr(C, packed)]
-#[derive(Debug, Copy, Clone)]
-pub struct cras_reload_aec_config {
-    pub header: cras_server_message,
-}
-#[test]
-fn bindgen_test_layout_cras_reload_aec_config() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_reload_aec_config>(),
-        8usize,
-        concat!("Size of: ", stringify!(cras_reload_aec_config))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_reload_aec_config>(),
-        1usize,
-        concat!("Alignment of ", stringify!(cras_reload_aec_config))
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_reload_aec_config>())).header as *const _ as usize },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_reload_aec_config),
-            "::",
-            stringify!(header)
-        )
-    );
-}
-#[repr(C, packed)]
-#[derive(Debug, Copy, Clone)]
-pub struct cras_set_bt_wbs_enabled {
-    pub header: cras_server_message,
-    pub enabled: ::std::os::raw::c_uint,
-}
-#[test]
-fn bindgen_test_layout_cras_set_bt_wbs_enabled() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_set_bt_wbs_enabled>(),
-        12usize,
-        concat!("Size of: ", stringify!(cras_set_bt_wbs_enabled))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_set_bt_wbs_enabled>(),
-        1usize,
-        concat!("Alignment of ", stringify!(cras_set_bt_wbs_enabled))
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_set_bt_wbs_enabled>())).header as *const _ as usize },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_set_bt_wbs_enabled),
-            "::",
-            stringify!(header)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_set_bt_wbs_enabled>())).enabled as *const _ as usize },
-        8usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_set_bt_wbs_enabled),
-            "::",
-            stringify!(enabled)
-        )
-    );
-}
-#[repr(C, packed)]
-#[derive(Debug, Copy, Clone)]
-pub struct cras_register_notification {
-    pub header: cras_server_message,
-    pub msg_id: u32,
-    pub do_register: ::std::os::raw::c_int,
-}
-#[test]
-fn bindgen_test_layout_cras_register_notification() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_register_notification>(),
-        16usize,
-        concat!("Size of: ", stringify!(cras_register_notification))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_register_notification>(),
-        1usize,
-        concat!("Alignment of ", stringify!(cras_register_notification))
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_register_notification>())).header as *const _ as usize
-        },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_register_notification),
-            "::",
-            stringify!(header)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_register_notification>())).msg_id as *const _ as usize
-        },
-        8usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_register_notification),
-            "::",
-            stringify!(msg_id)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_register_notification>())).do_register as *const _ as usize
-        },
-        12usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_register_notification),
-            "::",
-            stringify!(do_register)
-        )
-    );
-}
-#[repr(C, packed)]
-#[derive(Debug, Copy, Clone)]
-pub struct cras_client_connected {
-    pub header: cras_client_message,
-    pub client_id: u32,
-}
-#[test]
-fn bindgen_test_layout_cras_client_connected() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_client_connected>(),
-        12usize,
-        concat!("Size of: ", stringify!(cras_client_connected))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_client_connected>(),
-        1usize,
-        concat!("Alignment of ", stringify!(cras_client_connected))
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_client_connected>())).header as *const _ as usize },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_client_connected),
-            "::",
-            stringify!(header)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_client_connected>())).client_id as *const _ as usize },
-        8usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_client_connected),
-            "::",
-            stringify!(client_id)
-        )
-    );
-}
-#[repr(C, packed)]
-#[derive(Debug, Copy, Clone)]
-pub struct cras_client_stream_connected {
-    pub header: cras_client_message,
-    pub err: i32,
-    pub stream_id: cras_stream_id_t,
-    pub format: cras_audio_format_packed,
-    pub samples_shm_size: u32,
-    pub effects: u64,
-}
-#[test]
-fn bindgen_test_layout_cras_client_stream_connected() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_client_stream_connected>(),
-        51usize,
-        concat!("Size of: ", stringify!(cras_client_stream_connected))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_client_stream_connected>(),
-        1usize,
-        concat!("Alignment of ", stringify!(cras_client_stream_connected))
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_client_stream_connected>())).header as *const _ as usize
-        },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_client_stream_connected),
-            "::",
-            stringify!(header)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_client_stream_connected>())).err as *const _ as usize
-        },
-        8usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_client_stream_connected),
-            "::",
-            stringify!(err)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_client_stream_connected>())).stream_id as *const _ as usize
-        },
-        12usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_client_stream_connected),
-            "::",
-            stringify!(stream_id)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_client_stream_connected>())).format as *const _ as usize
-        },
-        16usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_client_stream_connected),
-            "::",
-            stringify!(format)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_client_stream_connected>())).samples_shm_size as *const _
-                as usize
-        },
-        39usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_client_stream_connected),
-            "::",
-            stringify!(samples_shm_size)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_client_stream_connected>())).effects as *const _ as usize
-        },
-        43usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_client_stream_connected),
-            "::",
-            stringify!(effects)
-        )
-    );
-}
-#[repr(C, packed)]
-#[derive(Debug, Copy, Clone)]
-pub struct cras_client_audio_debug_info_ready {
-    pub header: cras_client_message,
-}
-#[test]
-fn bindgen_test_layout_cras_client_audio_debug_info_ready() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_client_audio_debug_info_ready>(),
-        8usize,
-        concat!("Size of: ", stringify!(cras_client_audio_debug_info_ready))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_client_audio_debug_info_ready>(),
-        1usize,
-        concat!(
-            "Alignment of ",
-            stringify!(cras_client_audio_debug_info_ready)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_client_audio_debug_info_ready>())).header as *const _
-                as usize
-        },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_client_audio_debug_info_ready),
-            "::",
-            stringify!(header)
-        )
-    );
-}
-#[repr(C, packed)]
-#[derive(Debug, Copy, Clone)]
-pub struct cras_client_atlog_fd_ready {
-    pub header: cras_client_message,
-}
-#[test]
-fn bindgen_test_layout_cras_client_atlog_fd_ready() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_client_atlog_fd_ready>(),
-        8usize,
-        concat!("Size of: ", stringify!(cras_client_atlog_fd_ready))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_client_atlog_fd_ready>(),
-        1usize,
-        concat!("Alignment of ", stringify!(cras_client_atlog_fd_ready))
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_client_atlog_fd_ready>())).header as *const _ as usize
-        },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_client_atlog_fd_ready),
-            "::",
-            stringify!(header)
-        )
-    );
-}
-#[repr(C, packed)]
-#[derive(Copy, Clone)]
-pub struct cras_client_get_hotword_models_ready {
-    pub header: cras_client_message,
-    pub hotword_models_size: i32,
-    pub hotword_models: [u8; 244usize],
-}
-#[test]
-fn bindgen_test_layout_cras_client_get_hotword_models_ready() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_client_get_hotword_models_ready>(),
-        256usize,
-        concat!(
-            "Size of: ",
-            stringify!(cras_client_get_hotword_models_ready)
-        )
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_client_get_hotword_models_ready>(),
-        1usize,
-        concat!(
-            "Alignment of ",
-            stringify!(cras_client_get_hotword_models_ready)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_client_get_hotword_models_ready>())).header as *const _
-                as usize
-        },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_client_get_hotword_models_ready),
-            "::",
-            stringify!(header)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_client_get_hotword_models_ready>())).hotword_models_size
-                as *const _ as usize
-        },
-        8usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_client_get_hotword_models_ready),
-            "::",
-            stringify!(hotword_models_size)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_client_get_hotword_models_ready>())).hotword_models
-                as *const _ as usize
-        },
-        12usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_client_get_hotword_models_ready),
-            "::",
-            stringify!(hotword_models)
-        )
-    );
-}
-#[repr(C, packed)]
-#[derive(Debug, Copy, Clone)]
-pub struct cras_client_volume_changed {
-    pub header: cras_client_message,
-    pub volume: i32,
-}
-#[test]
-fn bindgen_test_layout_cras_client_volume_changed() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_client_volume_changed>(),
-        12usize,
-        concat!("Size of: ", stringify!(cras_client_volume_changed))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_client_volume_changed>(),
-        1usize,
-        concat!("Alignment of ", stringify!(cras_client_volume_changed))
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_client_volume_changed>())).header as *const _ as usize
-        },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_client_volume_changed),
-            "::",
-            stringify!(header)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_client_volume_changed>())).volume as *const _ as usize
-        },
-        8usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_client_volume_changed),
-            "::",
-            stringify!(volume)
-        )
-    );
-}
-#[repr(C, packed)]
-#[derive(Debug, Copy, Clone)]
-pub struct cras_client_mute_changed {
-    pub header: cras_client_message,
-    pub muted: i32,
-    pub user_muted: i32,
-    pub mute_locked: i32,
-}
-#[test]
-fn bindgen_test_layout_cras_client_mute_changed() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_client_mute_changed>(),
-        20usize,
-        concat!("Size of: ", stringify!(cras_client_mute_changed))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_client_mute_changed>(),
-        1usize,
-        concat!("Alignment of ", stringify!(cras_client_mute_changed))
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_client_mute_changed>())).header as *const _ as usize },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_client_mute_changed),
-            "::",
-            stringify!(header)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_client_mute_changed>())).muted as *const _ as usize },
-        8usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_client_mute_changed),
-            "::",
-            stringify!(muted)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_client_mute_changed>())).user_muted as *const _ as usize
-        },
-        12usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_client_mute_changed),
-            "::",
-            stringify!(user_muted)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_client_mute_changed>())).mute_locked as *const _ as usize
-        },
-        16usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_client_mute_changed),
-            "::",
-            stringify!(mute_locked)
-        )
-    );
-}
-#[repr(C, packed)]
-#[derive(Debug, Copy, Clone)]
-pub struct cras_client_nodes_changed {
-    pub header: cras_client_message,
-}
-#[test]
-fn bindgen_test_layout_cras_client_nodes_changed() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_client_nodes_changed>(),
-        8usize,
-        concat!("Size of: ", stringify!(cras_client_nodes_changed))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_client_nodes_changed>(),
-        1usize,
-        concat!("Alignment of ", stringify!(cras_client_nodes_changed))
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_client_nodes_changed>())).header as *const _ as usize
-        },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_client_nodes_changed),
-            "::",
-            stringify!(header)
-        )
-    );
-}
-#[repr(C, packed)]
-#[derive(Debug, Copy, Clone)]
-pub struct cras_client_active_node_changed {
-    pub header: cras_client_message,
-    pub direction: u32,
-    pub node_id: cras_node_id_t,
-}
-#[test]
-fn bindgen_test_layout_cras_client_active_node_changed() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_client_active_node_changed>(),
-        20usize,
-        concat!("Size of: ", stringify!(cras_client_active_node_changed))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_client_active_node_changed>(),
-        1usize,
-        concat!("Alignment of ", stringify!(cras_client_active_node_changed))
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_client_active_node_changed>())).header as *const _ as usize
-        },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_client_active_node_changed),
-            "::",
-            stringify!(header)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_client_active_node_changed>())).direction as *const _
-                as usize
-        },
-        8usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_client_active_node_changed),
-            "::",
-            stringify!(direction)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_client_active_node_changed>())).node_id as *const _ as usize
-        },
-        12usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_client_active_node_changed),
-            "::",
-            stringify!(node_id)
-        )
-    );
-}
-#[repr(C, packed)]
-#[derive(Debug, Copy, Clone)]
-pub struct cras_client_node_value_changed {
-    pub header: cras_client_message,
-    pub node_id: cras_node_id_t,
-    pub value: i32,
-}
-#[test]
-fn bindgen_test_layout_cras_client_node_value_changed() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_client_node_value_changed>(),
-        20usize,
-        concat!("Size of: ", stringify!(cras_client_node_value_changed))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_client_node_value_changed>(),
-        1usize,
-        concat!("Alignment of ", stringify!(cras_client_node_value_changed))
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_client_node_value_changed>())).header as *const _ as usize
-        },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_client_node_value_changed),
-            "::",
-            stringify!(header)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_client_node_value_changed>())).node_id as *const _ as usize
-        },
-        8usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_client_node_value_changed),
-            "::",
-            stringify!(node_id)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_client_node_value_changed>())).value as *const _ as usize
-        },
-        16usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_client_node_value_changed),
-            "::",
-            stringify!(value)
-        )
-    );
-}
-#[repr(C, packed)]
-#[derive(Debug, Copy, Clone)]
-pub struct cras_client_num_active_streams_changed {
-    pub header: cras_client_message,
-    pub direction: u32,
-    pub num_active_streams: u32,
-}
-#[test]
-fn bindgen_test_layout_cras_client_num_active_streams_changed() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_client_num_active_streams_changed>(),
-        16usize,
-        concat!(
-            "Size of: ",
-            stringify!(cras_client_num_active_streams_changed)
-        )
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_client_num_active_streams_changed>(),
-        1usize,
-        concat!(
-            "Alignment of ",
-            stringify!(cras_client_num_active_streams_changed)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_client_num_active_streams_changed>())).header as *const _
-                as usize
-        },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_client_num_active_streams_changed),
-            "::",
-            stringify!(header)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_client_num_active_streams_changed>())).direction as *const _
-                as usize
-        },
-        8usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_client_num_active_streams_changed),
-            "::",
-            stringify!(direction)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_client_num_active_streams_changed>())).num_active_streams
-                as *const _ as usize
-        },
-        12usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_client_num_active_streams_changed),
-            "::",
-            stringify!(num_active_streams)
-        )
-    );
-}
-#[repr(u32)]
-#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum CRAS_AUDIO_MESSAGE_ID {
-    AUDIO_MESSAGE_REQUEST_DATA = 0,
-    AUDIO_MESSAGE_DATA_READY = 1,
-    AUDIO_MESSAGE_DATA_CAPTURED = 2,
-    NUM_AUDIO_MESSAGES = 3,
-}
-#[repr(C, packed)]
-#[derive(Debug, Copy, Clone)]
-pub struct audio_message {
-    pub id: CRAS_AUDIO_MESSAGE_ID,
-    pub error: i32,
-    pub frames: u32,
-}
-#[test]
-fn bindgen_test_layout_audio_message() {
-    assert_eq!(
-        ::std::mem::size_of::<audio_message>(),
-        12usize,
-        concat!("Size of: ", stringify!(audio_message))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<audio_message>(),
-        1usize,
-        concat!("Alignment of ", stringify!(audio_message))
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<audio_message>())).id as *const _ as usize },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(audio_message),
-            "::",
-            stringify!(id)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<audio_message>())).error as *const _ as usize },
-        4usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(audio_message),
-            "::",
-            stringify!(error)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<audio_message>())).frames as *const _ as usize },
-        8usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(audio_message),
-            "::",
-            stringify!(frames)
-        )
-    );
-}
-#[repr(C, packed)]
-#[derive(Debug, Copy, Clone)]
-pub struct cras_audio_shm_config {
-    pub used_size: u32,
-    pub frame_bytes: u32,
-}
-#[test]
-fn bindgen_test_layout_cras_audio_shm_config() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_audio_shm_config>(),
-        8usize,
-        concat!("Size of: ", stringify!(cras_audio_shm_config))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_audio_shm_config>(),
-        1usize,
-        concat!("Alignment of ", stringify!(cras_audio_shm_config))
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_audio_shm_config>())).used_size as *const _ as usize },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_audio_shm_config),
-            "::",
-            stringify!(used_size)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_audio_shm_config>())).frame_bytes as *const _ as usize
-        },
-        4usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_audio_shm_config),
-            "::",
-            stringify!(frame_bytes)
-        )
-    );
-}
-#[repr(C, packed)]
-#[derive(Debug, Copy, Clone)]
-pub struct cras_audio_shm_header {
-    pub config: cras_audio_shm_config,
-    pub read_buf_idx: u32,
-    pub write_buf_idx: u32,
-    pub read_offset: [u32; 2usize],
-    pub write_offset: [u32; 2usize],
-    pub write_in_progress: [i32; 2usize],
-    pub volume_scaler: f32,
-    pub mute: i32,
-    pub callback_pending: i32,
-    pub num_overruns: u32,
-    pub ts: cras_timespec,
-    pub buffer_offset: [u64; 2usize],
-}
-#[test]
-fn bindgen_test_layout_cras_audio_shm_header() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_audio_shm_header>(),
-        88usize,
-        concat!("Size of: ", stringify!(cras_audio_shm_header))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_audio_shm_header>(),
-        1usize,
-        concat!("Alignment of ", stringify!(cras_audio_shm_header))
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_audio_shm_header>())).config as *const _ as usize },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_audio_shm_header),
-            "::",
-            stringify!(config)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_audio_shm_header>())).read_buf_idx as *const _ as usize
-        },
-        8usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_audio_shm_header),
-            "::",
-            stringify!(read_buf_idx)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_audio_shm_header>())).write_buf_idx as *const _ as usize
-        },
-        12usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_audio_shm_header),
-            "::",
-            stringify!(write_buf_idx)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_audio_shm_header>())).read_offset as *const _ as usize
-        },
-        16usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_audio_shm_header),
-            "::",
-            stringify!(read_offset)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_audio_shm_header>())).write_offset as *const _ as usize
-        },
-        24usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_audio_shm_header),
-            "::",
-            stringify!(write_offset)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_audio_shm_header>())).write_in_progress as *const _ as usize
-        },
-        32usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_audio_shm_header),
-            "::",
-            stringify!(write_in_progress)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_audio_shm_header>())).volume_scaler as *const _ as usize
-        },
-        40usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_audio_shm_header),
-            "::",
-            stringify!(volume_scaler)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_audio_shm_header>())).mute as *const _ as usize },
-        44usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_audio_shm_header),
-            "::",
-            stringify!(mute)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_audio_shm_header>())).callback_pending as *const _ as usize
-        },
-        48usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_audio_shm_header),
-            "::",
-            stringify!(callback_pending)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_audio_shm_header>())).num_overruns as *const _ as usize
-        },
-        52usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_audio_shm_header),
-            "::",
-            stringify!(num_overruns)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_audio_shm_header>())).ts as *const _ as usize },
-        56usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_audio_shm_header),
-            "::",
-            stringify!(ts)
-        )
-    );
-    assert_eq!(
-        unsafe {
-            &(*(::std::ptr::null::<cras_audio_shm_header>())).buffer_offset as *const _ as usize
-        },
-        72usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_audio_shm_header),
-            "::",
-            stringify!(buffer_offset)
-        )
-    );
-}
-#[repr(C)]
-#[derive(Copy, Clone)]
-pub struct cras_shm_info {
-    pub fd: ::std::os::raw::c_int,
-    pub name: [::std::os::raw::c_char; 255usize],
-    pub length: usize,
-}
-#[test]
-fn bindgen_test_layout_cras_shm_info() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_shm_info>(),
-        272usize,
-        concat!("Size of: ", stringify!(cras_shm_info))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_shm_info>(),
-        8usize,
-        concat!("Alignment of ", stringify!(cras_shm_info))
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_shm_info>())).fd as *const _ as usize },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_shm_info),
-            "::",
-            stringify!(fd)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_shm_info>())).name as *const _ as usize },
-        4usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_shm_info),
-            "::",
-            stringify!(name)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_shm_info>())).length as *const _ as usize },
-        264usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_shm_info),
-            "::",
-            stringify!(length)
-        )
-    );
-}
-#[repr(C)]
-#[derive(Copy, Clone)]
-pub struct cras_audio_shm {
-    pub config: cras_audio_shm_config,
-    pub header_info: cras_shm_info,
-    pub header: *mut cras_audio_shm_header,
-    pub samples_info: cras_shm_info,
-    pub samples: *mut u8,
-}
-#[test]
-fn bindgen_test_layout_cras_audio_shm() {
-    assert_eq!(
-        ::std::mem::size_of::<cras_audio_shm>(),
-        568usize,
-        concat!("Size of: ", stringify!(cras_audio_shm))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<cras_audio_shm>(),
-        8usize,
-        concat!("Alignment of ", stringify!(cras_audio_shm))
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_audio_shm>())).config as *const _ as usize },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_audio_shm),
-            "::",
-            stringify!(config)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_audio_shm>())).header_info as *const _ as usize },
-        8usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_audio_shm),
-            "::",
-            stringify!(header_info)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_audio_shm>())).header as *const _ as usize },
-        280usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_audio_shm),
-            "::",
-            stringify!(header)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_audio_shm>())).samples_info as *const _ as usize },
-        288usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_audio_shm),
-            "::",
-            stringify!(samples_info)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<cras_audio_shm>())).samples as *const _ as usize },
-        560usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(cras_audio_shm),
-            "::",
-            stringify!(samples)
-        )
-    );
-}
diff --git a/cras/client/cras-sys/src/lib.rs b/cras/client/cras-sys/src/lib.rs
deleted file mode 100644
index 2b3d21e..0000000
--- a/cras/client/cras-sys/src/lib.rs
+++ /dev/null
@@ -1,657 +0,0 @@
-// Copyright 2019 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-extern crate audio_streams;
-extern crate data_model;
-
-use std::cmp::min;
-use std::convert::{TryFrom, TryInto};
-use std::error;
-use std::fmt;
-use std::iter::FromIterator;
-use std::os::raw::c_char;
-use std::str::FromStr;
-use std::time::Duration;
-
-#[allow(dead_code)]
-#[allow(non_upper_case_globals)]
-#[allow(non_camel_case_types)]
-#[allow(non_snake_case)]
-pub mod gen;
-use gen::{
-    _snd_pcm_format, audio_dev_debug_info, audio_message, audio_stream_debug_info,
-    cras_audio_format_packed, cras_iodev_info, cras_ionode_info, cras_ionode_info__bindgen_ty_1,
-    cras_timespec, snd_pcm_format_t, CRAS_AUDIO_MESSAGE_ID, CRAS_CHANNEL, CRAS_CLIENT_TYPE,
-    CRAS_NODE_TYPE, CRAS_STREAM_DIRECTION, CRAS_STREAM_EFFECT, CRAS_STREAM_TYPE,
-};
-
-use audio_streams::{SampleFormat, StreamDirection, StreamEffect};
-
-unsafe impl data_model::DataInit for gen::audio_message {}
-unsafe impl data_model::DataInit for gen::audio_debug_info {}
-unsafe impl data_model::DataInit for gen::audio_dev_debug_info {}
-unsafe impl data_model::DataInit for gen::audio_stream_debug_info {}
-unsafe impl data_model::DataInit for gen::cras_client_connected {}
-unsafe impl data_model::DataInit for gen::cras_client_stream_connected {}
-unsafe impl data_model::DataInit for gen::cras_connect_message {}
-unsafe impl data_model::DataInit for gen::cras_disconnect_stream_message {}
-unsafe impl data_model::DataInit for gen::cras_dump_audio_thread {}
-unsafe impl data_model::DataInit for gen::cras_iodev_info {}
-unsafe impl data_model::DataInit for gen::cras_ionode_info {}
-unsafe impl data_model::DataInit for gen::cras_server_state {}
-unsafe impl data_model::DataInit for gen::cras_set_system_mute {}
-unsafe impl data_model::DataInit for gen::cras_set_system_volume {}
-
-/// An enumeration of errors that can occur when converting the packed C
-/// structs into Rust-style structs.
-#[derive(Debug)]
-pub enum Error {
-    InvalidChannel(i8),
-    InvalidClientType(u32),
-    InvalidClientTypeStr,
-    InvalidStreamType(u32),
-}
-
-impl error::Error for Error {}
-
-impl fmt::Display for Error {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        use Error::*;
-        match self {
-            InvalidChannel(c) => write!(
-                f,
-                "Channel value {} is not within valid range [0, {})",
-                c,
-                CRAS_CHANNEL::CRAS_CH_MAX as u32
-            ),
-            InvalidClientType(t) => write!(
-                f,
-                "Client type {} is not within valid range [0, {})",
-                t,
-                CRAS_CLIENT_TYPE::CRAS_CLIENT_TYPE_SERVER_STREAM as u32 + 1
-            ),
-            InvalidClientTypeStr => write!(f, "Invalid client type string"),
-            InvalidStreamType(t) => write!(
-                f,
-                "Stream type {} is not within valid range [0, {})",
-                t,
-                CRAS_STREAM_TYPE::CRAS_STREAM_NUM_TYPES as u32
-            ),
-        }
-    }
-}
-
-impl cras_audio_format_packed {
-    /// Initializes `cras_audio_format_packed` from input parameters.
-    /// Field `channel_layout` will be assigned with default channel layout defined in
-    /// `Self::default_channel_layout`.
-    ///
-    /// # Arguments
-    /// * `format` - Format in used.
-    /// * `rate` - Rate in used.
-    /// * `num_channels` - Number of channels in used.
-    /// * `direction` - Stream direction enumeration.
-    ///
-    /// # Returns
-    /// Structure `cras_audio_format_packed`
-    pub fn new(
-        format: _snd_pcm_format,
-        rate: u32,
-        num_channels: usize,
-        direction: CRAS_STREAM_DIRECTION,
-    ) -> Self {
-        Self {
-            format: format as i32,
-            frame_rate: rate,
-            num_channels: num_channels as u32,
-            channel_layout: Self::default_channel_layout(num_channels, direction),
-        }
-    }
-
-    /// Generates default channel layout by given number of channels and stream direction.
-    /// ```
-    /// use cras_sys::gen::{
-    ///     _snd_pcm_format,
-    ///     cras_audio_format_packed,
-    ///     CRAS_STREAM_DIRECTION::*
-    /// };
-    /// let test_one = | num_channels, direction, expected_results | {
-    ///     let default_channel_fmt = cras_audio_format_packed::new(
-    ///         _snd_pcm_format::SND_PCM_FORMAT_S16,
-    ///         48000,
-    ///         num_channels,
-    ///         direction
-    ///     );
-    ///     assert_eq!(default_channel_fmt.channel_layout, expected_results);
-    /// };
-    /// test_one(2, CRAS_STREAM_OUTPUT, [0, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1]);
-    /// test_one(4, CRAS_STREAM_OUTPUT, [0, 1, 2, 3, -1, -1, -1, -1, -1, -1, -1]);
-    /// test_one(6, CRAS_STREAM_OUTPUT, [0, 1, 4, 5, 2, 3, -1, -1, -1, -1, -1]);
-    /// test_one(2, CRAS_STREAM_INPUT, [0, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1]);
-    /// test_one(4, CRAS_STREAM_INPUT, [0, 1, 2, 3, -1, -1, -1, -1, -1, -1, -1]);
-    /// test_one(6, CRAS_STREAM_INPUT, [0, 1, 2, 3, 4, 5, -1, -1, -1, -1, -1]);
-    /// ```
-    fn default_channel_layout(
-        num_channels: usize,
-        direction: CRAS_STREAM_DIRECTION,
-    ) -> [i8; CRAS_CHANNEL::CRAS_CH_MAX as usize] {
-        use {CRAS_CHANNEL::*, CRAS_STREAM_DIRECTION::*};
-
-        let mut channel_layout = [-1; CRAS_CH_MAX as usize];
-        match (num_channels, direction) {
-            (6, CRAS_STREAM_OUTPUT) => {
-                [
-                    CRAS_CH_FL,
-                    CRAS_CH_FR,
-                    CRAS_CH_FC,
-                    CRAS_CH_LFE,
-                    CRAS_CH_RL,
-                    CRAS_CH_RR,
-                ]
-                .iter()
-                .enumerate()
-                .for_each(|(idx, &channel)| channel_layout[channel as usize] = idx as i8);
-            }
-            _ => {
-                for (i, channel) in channel_layout
-                    .iter_mut()
-                    .enumerate()
-                    .take(min(num_channels, CRAS_CH_MAX as usize))
-                {
-                    *channel = i as i8;
-                }
-            }
-        }
-        channel_layout
-    }
-}
-
-impl Default for audio_message {
-    fn default() -> Self {
-        Self {
-            error: 0,
-            frames: 0,
-            id: CRAS_AUDIO_MESSAGE_ID::NUM_AUDIO_MESSAGES,
-        }
-    }
-}
-
-impl Default for cras_iodev_info {
-    fn default() -> Self {
-        Self {
-            idx: 0,
-            name: [0; 64usize],
-            stable_id: 0,
-            max_supported_channels: 0,
-        }
-    }
-}
-
-#[derive(Debug)]
-pub struct CrasIodevInfo {
-    pub index: u32,
-    pub name: String,
-}
-
-fn cstring_to_string(cstring: &[c_char]) -> String {
-    let null_idx = match cstring.iter().enumerate().find(|(_, &c)| c == 0) {
-        Some((i, _)) => i,
-        None => return "".to_owned(),
-    };
-
-    let ptr = cstring.as_ptr() as *const u8;
-    let slice = unsafe { core::slice::from_raw_parts(ptr, null_idx) };
-    String::from_utf8_lossy(slice).to_string()
-}
-
-impl From<cras_iodev_info> for CrasIodevInfo {
-    fn from(info: cras_iodev_info) -> Self {
-        Self {
-            index: info.idx,
-            name: cstring_to_string(&info.name),
-        }
-    }
-}
-
-impl Default for cras_ionode_info {
-    fn default() -> Self {
-        Self {
-            iodev_idx: 0,
-            ionode_idx: 0,
-            plugged: 0,
-            active: 0,
-            plugged_time: cras_ionode_info__bindgen_ty_1 {
-                tv_sec: 0,
-                tv_usec: 0,
-            },
-            volume: 0,
-            ui_gain_scaler: 0.0,
-            capture_gain: 0,
-            left_right_swapped: 0,
-            type_enum: 0,
-            stable_id: 0,
-            type_: [0; 32usize],
-            name: [0; 64usize],
-            active_hotword_model: [0; 16usize],
-        }
-    }
-}
-
-impl From<u32> for CRAS_NODE_TYPE {
-    fn from(node_type: u32) -> CRAS_NODE_TYPE {
-        use CRAS_NODE_TYPE::*;
-        match node_type {
-            0 => CRAS_NODE_TYPE_INTERNAL_SPEAKER,
-            1 => CRAS_NODE_TYPE_HEADPHONE,
-            2 => CRAS_NODE_TYPE_HDMI,
-            3 => CRAS_NODE_TYPE_HAPTIC,
-            4 => CRAS_NODE_TYPE_LINEOUT,
-            5 => CRAS_NODE_TYPE_MIC,
-            6 => CRAS_NODE_TYPE_HOTWORD,
-            7 => CRAS_NODE_TYPE_POST_MIX_PRE_DSP,
-            8 => CRAS_NODE_TYPE_POST_DSP,
-            9 => CRAS_NODE_TYPE_USB,
-            10 => CRAS_NODE_TYPE_BLUETOOTH,
-            _ => CRAS_NODE_TYPE_UNKNOWN,
-        }
-    }
-}
-
-#[derive(Debug)]
-pub struct CrasIonodeInfo {
-    pub name: String,
-    pub iodev_index: u32,
-    pub ionode_index: u32,
-    pub stable_id: u32,
-    pub plugged: bool,
-    pub active: bool,
-    pub node_type: CRAS_NODE_TYPE,
-    pub type_name: String,
-    pub volume: u32,
-    pub capture_gain: i32,
-    pub plugged_time: cras_timespec,
-}
-
-impl From<cras_ionode_info> for CrasIonodeInfo {
-    fn from(info: cras_ionode_info) -> Self {
-        Self {
-            name: cstring_to_string(&info.name),
-            iodev_index: info.iodev_idx,
-            ionode_index: info.ionode_idx,
-            stable_id: info.stable_id,
-            plugged: info.plugged != 0,
-            active: info.active != 0,
-            node_type: CRAS_NODE_TYPE::from(info.type_enum),
-            type_name: cstring_to_string(&info.type_),
-            volume: info.volume,
-            capture_gain: info.capture_gain,
-            plugged_time: cras_timespec {
-                tv_sec: info.plugged_time.tv_sec,
-                tv_nsec: info.plugged_time.tv_usec * 1000,
-            },
-        }
-    }
-}
-
-impl From<u32> for CRAS_STREAM_DIRECTION {
-    fn from(node_type: u32) -> CRAS_STREAM_DIRECTION {
-        use CRAS_STREAM_DIRECTION::*;
-        match node_type {
-            0 => CRAS_STREAM_OUTPUT,
-            1 => CRAS_STREAM_INPUT,
-            2 => CRAS_STREAM_UNDEFINED,
-            3 => CRAS_STREAM_POST_MIX_PRE_DSP,
-            _ => CRAS_STREAM_UNDEFINED,
-        }
-    }
-}
-
-impl Default for audio_dev_debug_info {
-    fn default() -> Self {
-        Self {
-            dev_name: [0; 64],
-            buffer_size: 0,
-            min_buffer_level: 0,
-            min_cb_level: 0,
-            max_cb_level: 0,
-            frame_rate: 0,
-            num_channels: 0,
-            est_rate_ratio: 0.0,
-            direction: 0,
-            num_underruns: 0,
-            num_severe_underruns: 0,
-            highest_hw_level: 0,
-            runtime_sec: 0,
-            runtime_nsec: 0,
-            longest_wake_sec: 0,
-            longest_wake_nsec: 0,
-            software_gain_scaler: 0.0,
-        }
-    }
-}
-
-/// A rust-style representation of the server's packed audio_dev_debug_info
-/// struct.
-#[derive(Debug)]
-pub struct AudioDevDebugInfo {
-    pub dev_name: String,
-    pub buffer_size: u32,
-    pub min_buffer_level: u32,
-    pub min_cb_level: u32,
-    pub max_cb_level: u32,
-    pub frame_rate: u32,
-    pub num_channels: u32,
-    pub est_rate_ratio: f64,
-    pub direction: CRAS_STREAM_DIRECTION,
-    pub num_underruns: u32,
-    pub num_severe_underruns: u32,
-    pub highest_hw_level: u32,
-    pub runtime: Duration,
-    pub longest_wake: Duration,
-    pub software_gain_scaler: f64,
-}
-
-impl From<audio_dev_debug_info> for AudioDevDebugInfo {
-    fn from(info: audio_dev_debug_info) -> Self {
-        Self {
-            dev_name: cstring_to_string(&info.dev_name),
-            buffer_size: info.buffer_size,
-            min_buffer_level: info.min_buffer_level,
-            min_cb_level: info.min_cb_level,
-            max_cb_level: info.max_cb_level,
-            frame_rate: info.frame_rate,
-            num_channels: info.num_channels,
-            est_rate_ratio: info.est_rate_ratio,
-            direction: CRAS_STREAM_DIRECTION::from(u32::from(info.direction)),
-            num_underruns: info.num_underruns,
-            num_severe_underruns: info.num_severe_underruns,
-            highest_hw_level: info.highest_hw_level,
-            runtime: Duration::new(info.runtime_sec.into(), info.runtime_nsec),
-            longest_wake: Duration::new(info.longest_wake_sec.into(), info.longest_wake_nsec),
-            software_gain_scaler: info.software_gain_scaler,
-        }
-    }
-}
-
-impl fmt::Display for AudioDevDebugInfo {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        writeln!(f, "Device: {}", self.dev_name)?;
-        writeln!(f, "  Direction: {:?}", self.direction)?;
-        writeln!(f, "  Buffer size: {}", self.buffer_size)?;
-        writeln!(f, "  Minimum buffer level: {}", self.min_buffer_level)?;
-        writeln!(f, "  Minimum callback level: {}", self.min_cb_level)?;
-        writeln!(f, "  Max callback level: {}", self.max_cb_level)?;
-        writeln!(f, "  Frame rate: {}", self.frame_rate)?;
-        writeln!(f, "  Number of channels: {}", self.num_channels)?;
-        writeln!(f, "  Estimated rate ratio: {:.2}", self.est_rate_ratio)?;
-        writeln!(f, "  Underrun count: {}", self.num_underruns)?;
-        writeln!(f, "  Severe underrun count: {}", self.num_severe_underruns)?;
-        writeln!(f, "  Highest hardware level: {}", self.highest_hw_level)?;
-        writeln!(f, "  Runtime: {:?}", self.runtime)?;
-        writeln!(f, "  Longest wake: {:?}", self.longest_wake)?;
-        writeln!(f, "  Software gain scaler: {}", self.software_gain_scaler)?;
-        Ok(())
-    }
-}
-
-impl TryFrom<u32> for CRAS_STREAM_TYPE {
-    type Error = Error;
-    fn try_from(stream_type: u32) -> Result<Self, Self::Error> {
-        use CRAS_STREAM_TYPE::*;
-        match stream_type {
-            0 => Ok(CRAS_STREAM_TYPE_DEFAULT),
-            1 => Ok(CRAS_STREAM_TYPE_MULTIMEDIA),
-            2 => Ok(CRAS_STREAM_TYPE_VOICE_COMMUNICATION),
-            3 => Ok(CRAS_STREAM_TYPE_SPEECH_RECOGNITION),
-            4 => Ok(CRAS_STREAM_TYPE_PRO_AUDIO),
-            5 => Ok(CRAS_STREAM_TYPE_ACCESSIBILITY),
-            _ => Err(Error::InvalidStreamType(stream_type)),
-        }
-    }
-}
-
-impl TryFrom<u32> for CRAS_CLIENT_TYPE {
-    type Error = Error;
-    fn try_from(client_type: u32) -> Result<Self, Self::Error> {
-        use CRAS_CLIENT_TYPE::*;
-        match client_type {
-            0 => Ok(CRAS_CLIENT_TYPE_UNKNOWN),
-            1 => Ok(CRAS_CLIENT_TYPE_LEGACY),
-            2 => Ok(CRAS_CLIENT_TYPE_TEST),
-            3 => Ok(CRAS_CLIENT_TYPE_PCM),
-            4 => Ok(CRAS_CLIENT_TYPE_CHROME),
-            5 => Ok(CRAS_CLIENT_TYPE_ARC),
-            6 => Ok(CRAS_CLIENT_TYPE_CROSVM),
-            7 => Ok(CRAS_CLIENT_TYPE_SERVER_STREAM),
-            8 => Ok(CRAS_CLIENT_TYPE_LACROS),
-            _ => Err(Error::InvalidClientType(client_type)),
-        }
-    }
-}
-
-impl FromStr for CRAS_CLIENT_TYPE {
-    type Err = Error;
-    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
-        use CRAS_CLIENT_TYPE::*;
-        match s {
-            "crosvm" => Ok(CRAS_CLIENT_TYPE_CROSVM),
-            "arcvm" => Ok(CRAS_CLIENT_TYPE_ARCVM),
-            _ => Err(Error::InvalidClientTypeStr),
-        }
-    }
-}
-
-impl Default for audio_stream_debug_info {
-    fn default() -> Self {
-        Self {
-            stream_id: 0,
-            dev_idx: 0,
-            direction: 0,
-            stream_type: 0,
-            client_type: 0,
-            buffer_frames: 0,
-            cb_threshold: 0,
-            effects: 0,
-            flags: 0,
-            frame_rate: 0,
-            num_channels: 0,
-            longest_fetch_sec: 0,
-            longest_fetch_nsec: 0,
-            num_missed_cb: 0,
-            num_overruns: 0,
-            is_pinned: 0,
-            pinned_dev_idx: 0,
-            runtime_sec: 0,
-            runtime_nsec: 0,
-            stream_volume: 0.0,
-            channel_layout: [0; 11],
-        }
-    }
-}
-
-impl TryFrom<i8> for CRAS_CHANNEL {
-    type Error = Error;
-    fn try_from(channel: i8) -> Result<Self, Self::Error> {
-        use CRAS_CHANNEL::*;
-        match channel {
-            0 => Ok(CRAS_CH_FL),
-            1 => Ok(CRAS_CH_FR),
-            2 => Ok(CRAS_CH_RL),
-            3 => Ok(CRAS_CH_RR),
-            4 => Ok(CRAS_CH_FC),
-            5 => Ok(CRAS_CH_LFE),
-            6 => Ok(CRAS_CH_SL),
-            7 => Ok(CRAS_CH_SR),
-            8 => Ok(CRAS_CH_RC),
-            9 => Ok(CRAS_CH_FLC),
-            10 => Ok(CRAS_CH_FRC),
-            _ => Err(Error::InvalidChannel(channel)),
-        }
-    }
-}
-
-/// A rust-style representation of the server's packed audio_stream_debug_info
-/// struct.
-#[derive(Debug)]
-pub struct AudioStreamDebugInfo {
-    pub stream_id: u64,
-    pub dev_idx: u32,
-    pub direction: CRAS_STREAM_DIRECTION,
-    pub stream_type: CRAS_STREAM_TYPE,
-    pub client_type: CRAS_CLIENT_TYPE,
-    pub buffer_frames: u32,
-    pub cb_threshold: u32,
-    pub effects: u64,
-    pub flags: u32,
-    pub frame_rate: u32,
-    pub num_channels: u32,
-    pub longest_fetch: Duration,
-    pub num_missed_cb: u32,
-    pub num_overruns: u32,
-    pub is_pinned: bool,
-    pub pinned_dev_idx: u32,
-    pub runtime: Duration,
-    pub stream_volume: f64,
-    pub channel_layout: Vec<CRAS_CHANNEL>,
-}
-
-impl TryFrom<audio_stream_debug_info> for AudioStreamDebugInfo {
-    type Error = Error;
-    fn try_from(info: audio_stream_debug_info) -> Result<Self, Self::Error> {
-        let channel_layout = info
-            .channel_layout
-            .iter()
-            .cloned()
-            .take_while(|&c| c != -1)
-            .map(TryInto::try_into)
-            .collect::<Result<Vec<_>, _>>()?;
-        Ok(Self {
-            stream_id: info.stream_id,
-            dev_idx: info.dev_idx,
-            direction: info.direction.into(),
-            stream_type: info.stream_type.try_into()?,
-            client_type: info.client_type.try_into()?,
-            buffer_frames: info.buffer_frames,
-            cb_threshold: info.cb_threshold,
-            effects: info.effects,
-            flags: info.flags,
-            frame_rate: info.frame_rate,
-            num_channels: info.num_channels,
-            longest_fetch: Duration::new(info.longest_fetch_sec.into(), info.longest_fetch_nsec),
-            num_missed_cb: info.num_missed_cb,
-            num_overruns: info.num_overruns,
-            is_pinned: info.is_pinned != 0,
-            pinned_dev_idx: info.pinned_dev_idx,
-            runtime: Duration::new(info.runtime_sec.into(), info.runtime_nsec),
-            stream_volume: info.stream_volume,
-            channel_layout,
-        })
-    }
-}
-
-impl fmt::Display for AudioStreamDebugInfo {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        writeln!(
-            f,
-            "Stream: {}, Device index: {}",
-            self.stream_id, self.dev_idx
-        )?;
-        writeln!(f, "  Direction: {:?}", self.direction)?;
-        writeln!(f, "  Stream type: {:?}", self.stream_type)?;
-        writeln!(f, "  Client type: {:?}", self.client_type)?;
-        writeln!(f, "  Buffer frames: {}", self.buffer_frames)?;
-        writeln!(f, "  Callback threshold: {}", self.cb_threshold)?;
-        writeln!(f, "  Effects: {:#x}", self.effects)?;
-        writeln!(f, "  Frame rate: {}", self.frame_rate)?;
-        writeln!(f, "  Number of channels: {}", self.num_channels)?;
-        writeln!(f, "  Longest fetch: {:?}", self.longest_fetch)?;
-        writeln!(f, "  Overrun count: {}", self.num_overruns)?;
-        writeln!(f, "  Pinned: {}", self.is_pinned)?;
-        writeln!(f, "  Pinned device index: {}", self.pinned_dev_idx)?;
-        writeln!(f, "  Missed callbacks: {}", self.num_missed_cb)?;
-        match self.direction {
-            CRAS_STREAM_DIRECTION::CRAS_STREAM_OUTPUT => {
-                writeln!(f, "  Volume: {:.2}", self.stream_volume)?
-            }
-            CRAS_STREAM_DIRECTION::CRAS_STREAM_INPUT => {
-                writeln!(f, "  Gain: {:.2}", self.stream_volume)?
-            }
-            _ => (),
-        };
-        writeln!(f, "  Runtime: {:?}", self.runtime)?;
-        write!(f, "  Channel map:")?;
-        for channel in &self.channel_layout {
-            write!(f, " {:?}", channel)?;
-        }
-        writeln!(f)?;
-        Ok(())
-    }
-}
-
-/// A rust-style representation of the server's audio debug info.
-pub struct AudioDebugInfo {
-    pub devices: Vec<AudioDevDebugInfo>,
-    pub streams: Vec<AudioStreamDebugInfo>,
-}
-
-impl AudioDebugInfo {
-    pub fn new(devices: Vec<AudioDevDebugInfo>, streams: Vec<AudioStreamDebugInfo>) -> Self {
-        Self { devices, streams }
-    }
-}
-
-impl Into<u64> for CRAS_STREAM_EFFECT {
-    fn into(self) -> u64 {
-        u64::from(self.0)
-    }
-}
-
-impl CRAS_STREAM_EFFECT {
-    pub fn empty() -> Self {
-        CRAS_STREAM_EFFECT(0)
-    }
-}
-
-impl From<StreamDirection> for CRAS_STREAM_DIRECTION {
-    /// Convert an audio_streams StreamDirection into the corresponding CRAS_STREAM_DIRECTION.
-    fn from(direction: StreamDirection) -> Self {
-        match direction {
-            StreamDirection::Playback => CRAS_STREAM_DIRECTION::CRAS_STREAM_OUTPUT,
-            StreamDirection::Capture => CRAS_STREAM_DIRECTION::CRAS_STREAM_INPUT,
-        }
-    }
-}
-
-impl From<StreamEffect> for CRAS_STREAM_EFFECT {
-    /// Convert an audio_streams StreamEffect into the corresponding CRAS_STREAM_EFFECT.
-    fn from(effect: StreamEffect) -> Self {
-        match effect {
-            StreamEffect::NoEffect => CRAS_STREAM_EFFECT::empty(),
-            StreamEffect::EchoCancellation => CRAS_STREAM_EFFECT::APM_ECHO_CANCELLATION,
-        }
-    }
-}
-
-impl<'a> FromIterator<&'a StreamEffect> for CRAS_STREAM_EFFECT {
-    fn from_iter<I>(iter: I) -> Self
-    where
-        I: IntoIterator<Item = &'a StreamEffect>,
-    {
-        iter.into_iter().fold(
-            CRAS_STREAM_EFFECT::empty(),
-            |cras_effect, &stream_effect| cras_effect | stream_effect.into(),
-        )
-    }
-}
-
-/// Convert an audio_streams SampleFormat into the corresponding pcm_format.
-impl From<SampleFormat> for snd_pcm_format_t {
-    fn from(format: SampleFormat) -> Self {
-        match format {
-            SampleFormat::U8 => snd_pcm_format_t::SND_PCM_FORMAT_U8,
-            SampleFormat::S16LE => snd_pcm_format_t::SND_PCM_FORMAT_S16_LE,
-            SampleFormat::S24LE => snd_pcm_format_t::SND_PCM_FORMAT_S24_LE,
-            SampleFormat::S32LE => snd_pcm_format_t::SND_PCM_FORMAT_S32_LE,
-        }
-    }
-}
diff --git a/cras/client/cras_tests/.gitignore b/cras/client/cras_tests/.gitignore
deleted file mode 100644
index 302b31d..0000000
--- a/cras/client/cras_tests/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-target/
-.*.rustfmt
diff --git a/cras/client/cras_tests/.rustfmt.toml b/cras/client/cras_tests/.rustfmt.toml
deleted file mode 100644
index a2db301..0000000
--- a/cras/client/cras_tests/.rustfmt.toml
+++ /dev/null
@@ -1,2 +0,0 @@
-use_field_init_shorthand = true
-use_try_shorthand = true
diff --git a/cras/client/cras_tests/Cargo.toml b/cras/client/cras_tests/Cargo.toml
deleted file mode 100644
index 108fe6c..0000000
--- a/cras/client/cras_tests/Cargo.toml
+++ /dev/null
@@ -1,17 +0,0 @@
-[package]
-name = "cras_tests"
-version = "0.1.0"
-authors = ["The Chromium OS Authors"]
-edition = "2018"
-
-[dependencies]
-audio_streams = { path = "../../../audio_streams" } # provided by ebuild
-getopts = "0.2.18"
-hound = "3.4.0"
-libcras = { path = "../libcras" } # provided by ebuild
-sys_util = { path = "../../../../crosvm/sys_util" } # provided by ebuild
-
-[profile.release]
-lto = true
-panic = 'abort'
-overflow-checks = true
diff --git a/cras/client/cras_tests/src/arguments.rs b/cras/client/cras_tests/src/arguments.rs
deleted file mode 100644
index 59e9ec2..0000000
--- a/cras/client/cras_tests/src/arguments.rs
+++ /dev/null
@@ -1,462 +0,0 @@
-// Copyright 2019 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-use std::error;
-use std::fmt;
-use std::path::PathBuf;
-
-use audio_streams::SampleFormat;
-use getopts::{self, Matches, Options};
-
-#[derive(Debug)]
-pub enum Error {
-    GetOpts(getopts::Fail),
-    InvalidArgument(String, String, String),
-    InvalidFiletype(String),
-    MissingArgument(String),
-    MissingCommand,
-    MissingFilename,
-    UnknownCommand(String),
-}
-
-impl error::Error for Error {}
-
-impl fmt::Display for Error {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        use Error::*;
-        match self {
-            GetOpts(e) => write!(f, "Getopts Error: {}", e),
-            InvalidArgument(flag, value, error_msg) => {
-                write!(f, "Invalid {} argument '{}': {}", flag, value, error_msg)
-            }
-            InvalidFiletype(extension) => write!(
-                f,
-                "Invalid file extension '{}'. Supported types are 'wav' and 'raw'",
-                extension
-            ),
-            MissingArgument(subcommand) => write!(f, "Missing argument for {}", subcommand),
-            MissingCommand => write!(f, "A command must be provided"),
-            MissingFilename => write!(f, "A file name must be provided"),
-            UnknownCommand(s) => write!(f, "Unknown command '{}'", s),
-        }
-    }
-}
-
-type Result<T> = std::result::Result<T, Error>;
-
-/// The different types of commands that can be given to cras_tests.
-/// Any options for those commands are passed as parameters to the enum values.
-#[derive(Debug, PartialEq)]
-pub enum Command {
-    Capture(AudioOptions),
-    Playback(AudioOptions),
-    Control(ControlCommand),
-}
-
-impl Command {
-    pub fn parse<T: AsRef<str>>(args: &[T]) -> Result<Option<Self>> {
-        let program_name = args.get(0).map(|s| s.as_ref()).unwrap_or("cras_tests");
-        let remaining_args = args.get(2..).unwrap_or(&[]);
-        match args.get(1).map(|s| s.as_ref()) {
-            None => {
-                show_usage(program_name);
-                Err(Error::MissingCommand)
-            }
-            Some("help") => {
-                show_usage(program_name);
-                Ok(None)
-            }
-            Some("capture") => Ok(
-                AudioOptions::parse(program_name, "capture", remaining_args)?.map(Command::Capture),
-            ),
-            Some("playback") => Ok(
-                AudioOptions::parse(program_name, "playback", remaining_args)?
-                    .map(Command::Playback),
-            ),
-            Some("control") => {
-                Ok(ControlCommand::parse(program_name, remaining_args)?.map(Command::Control))
-            }
-            Some(s) => {
-                show_usage(program_name);
-                Err(Error::UnknownCommand(s.to_string()))
-            }
-        }
-    }
-}
-
-#[derive(Debug, PartialEq)]
-pub enum FileType {
-    Raw,
-    Wav,
-}
-
-impl fmt::Display for FileType {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        match self {
-            FileType::Raw => write!(f, "raw data"),
-            FileType::Wav => write!(f, "WAVE"),
-        }
-    }
-}
-
-fn show_usage(program_name: &str) {
-    eprintln!("Usage: {} [command] <command args>", program_name);
-    eprintln!("\nCommands:\n");
-    eprintln!("capture - Capture to a file from CRAS");
-    eprintln!("playback - Playback to CRAS from a file");
-    eprintln!("control - Get and set server settings");
-    eprintln!("\nhelp - Print help message");
-}
-
-fn show_audio_command_usage(program_name: &str, command: &str, opts: &Options) {
-    let brief = format!("Usage: {} {} [options] [filename]", program_name, command);
-    eprint!("{}", opts.usage(&brief));
-}
-
-/// The possible command line options that can be passed to the 'playback' and
-/// 'capture' commands. Optional values will be `Some(_)` only if a value was
-/// explicitly provided by the user.
-///
-/// This struct will be passed to `playback()` and `capture()`.
-#[derive(Debug, PartialEq)]
-pub enum LoopbackType {
-    PreDsp,
-    PostDsp,
-}
-
-#[derive(Debug, PartialEq)]
-pub struct AudioOptions {
-    pub file_name: PathBuf,
-    pub loopback_type: Option<LoopbackType>,
-    pub file_type: FileType,
-    pub buffer_size: Option<usize>,
-    pub num_channels: Option<usize>,
-    pub format: Option<SampleFormat>,
-    pub frame_rate: Option<u32>,
-}
-
-fn get_u32_param(matches: &Matches, option_name: &str) -> Result<Option<u32>> {
-    matches.opt_get::<u32>(option_name).map_err(|e| {
-        let argument = matches.opt_str(option_name).unwrap_or_default();
-        Error::InvalidArgument(option_name.to_string(), argument, e.to_string())
-    })
-}
-
-fn get_usize_param(matches: &Matches, option_name: &str) -> Result<Option<usize>> {
-    matches.opt_get::<usize>(option_name).map_err(|e| {
-        let argument = matches.opt_str(option_name).unwrap_or_default();
-        Error::InvalidArgument(option_name.to_string(), argument, e.to_string())
-    })
-}
-
-impl AudioOptions {
-    fn parse<T: AsRef<str>>(
-        program_name: &str,
-        command_name: &str,
-        args: &[T],
-    ) -> Result<Option<Self>> {
-        let mut opts = Options::new();
-        opts.optopt("b", "buffer_size", "Buffer size in frames", "SIZE")
-            .optopt("c", "channels", "Number of channels", "NUM")
-            .optopt(
-                "f",
-                "format",
-                "Sample format (U8, S16_LE, S24_LE, or S32_LE)",
-                "FORMAT",
-            )
-            .optopt("r", "rate", "Audio frame rate (Hz)", "RATE")
-            .optflag("h", "help", "Print help message");
-
-        if command_name == "capture" {
-            opts.optopt(
-                "",
-                "loopback",
-                "Capture from loopback device ('pre_dsp' or 'post_dsp')",
-                "DEVICE",
-            );
-        }
-
-        let args = args.iter().map(|s| s.as_ref());
-        let matches = match opts.parse(args) {
-            Ok(m) => m,
-            Err(e) => {
-                show_audio_command_usage(program_name, command_name, &opts);
-                return Err(Error::GetOpts(e));
-            }
-        };
-        if matches.opt_present("h") {
-            show_audio_command_usage(program_name, command_name, &opts);
-            return Ok(None);
-        }
-
-        let loopback_type = if matches.opt_defined("loopback") {
-            match matches.opt_str("loopback").as_deref() {
-                Some("pre_dsp") => Some(LoopbackType::PreDsp),
-                Some("post_dsp") => Some(LoopbackType::PostDsp),
-                Some(s) => {
-                    return Err(Error::InvalidArgument(
-                        "loopback".to_string(),
-                        s.to_string(),
-                        "Loopback type must be 'pre_dsp' or 'post_dsp'".to_string(),
-                    ))
-                }
-                None => None,
-            }
-        } else {
-            None
-        };
-
-        let file_name = match matches.free.get(0) {
-            None => {
-                show_audio_command_usage(program_name, command_name, &opts);
-                return Err(Error::MissingFilename);
-            }
-            Some(file_name) => PathBuf::from(file_name),
-        };
-
-        let extension = file_name
-            .extension()
-            .map(|s| s.to_string_lossy().into_owned());
-        let file_type = match extension.as_deref() {
-            Some("wav") | Some("wave") => FileType::Wav,
-            Some("raw") | None => FileType::Raw,
-            Some(extension) => return Err(Error::InvalidFiletype(extension.to_string())),
-        };
-
-        let buffer_size = get_usize_param(&matches, "buffer_size")?;
-        let num_channels = get_usize_param(&matches, "channels")?;
-        let frame_rate = get_u32_param(&matches, "rate")?;
-        let format = match matches.opt_str("format").as_deref() {
-            Some("U8") => Some(SampleFormat::U8),
-            Some("S16_LE") => Some(SampleFormat::S16LE),
-            Some("S24_LE") => Some(SampleFormat::S24LE),
-            Some("S32_LE") => Some(SampleFormat::S32LE),
-            Some(s) => {
-                show_audio_command_usage(program_name, command_name, &opts);
-                return Err(Error::InvalidArgument(
-                    "format".to_string(),
-                    s.to_string(),
-                    "Format must be 'U8', 'S16_LE', 'S24_LE', or 'S32_LE'".to_string(),
-                ));
-            }
-            None => None,
-        };
-
-        Ok(Some(AudioOptions {
-            loopback_type,
-            file_name,
-            file_type,
-            buffer_size,
-            num_channels,
-            format,
-            frame_rate,
-        }))
-    }
-}
-
-fn show_control_command_usage(program_name: &str) {
-    eprintln!("Usage: {} control [command] <command args>", program_name);
-    eprintln!("");
-    eprintln!("Commands:");
-    let commands = [
-        ("help", "", "Print help message"),
-        ("", "", ""),
-        ("get_volume", "", "Get the system volume (0 - 100)"),
-        (
-            "set_volume",
-            "VOLUME",
-            "Set the system volume to VOLUME (0 - 100)",
-        ),
-        ("get_mute", "", "Get the system mute state (true or false)"),
-        (
-            "set_mute",
-            "MUTE",
-            "Set the system mute state to MUTE (true or false)",
-        ),
-        ("", "", ""),
-        ("list_output_devices", "", "Print list of output devices"),
-        ("list_input_devices", "", "Print list of input devices"),
-        ("list_output_nodes", "", "Print list of output nodes"),
-        ("list_input_nodes", "", "Print list of input nodes"),
-        (
-            "dump_audio_debug_info",
-            "",
-            "Print stream info, device info, and audio thread log.",
-        ),
-    ];
-    for command in &commands {
-        let command_string = format!("{} {}", command.0, command.1);
-        eprintln!("\t{: <23} {}", command_string, command.2);
-    }
-}
-
-#[derive(Debug, PartialEq)]
-pub enum ControlCommand {
-    GetSystemVolume,
-    SetSystemVolume(u32),
-    GetSystemMute,
-    SetSystemMute(bool),
-    ListOutputDevices,
-    ListInputDevices,
-    ListOutputNodes,
-    ListInputNodes,
-    DumpAudioDebugInfo,
-}
-
-impl ControlCommand {
-    fn parse<T: AsRef<str>>(program_name: &str, args: &[T]) -> Result<Option<Self>> {
-        let mut args = args.iter().map(|s| s.as_ref());
-        match args.next() {
-            Some("help") => {
-                show_control_command_usage(program_name);
-                Ok(None)
-            }
-            Some("get_volume") => Ok(Some(ControlCommand::GetSystemVolume)),
-            Some("set_volume") => {
-                let volume_str = args
-                    .next()
-                    .ok_or_else(|| Error::MissingArgument("set_volume".to_string()))?;
-
-                let volume = volume_str.parse::<u32>().map_err(|e| {
-                    Error::InvalidArgument(
-                        "set_volume".to_string(),
-                        volume_str.to_string(),
-                        e.to_string(),
-                    )
-                })?;
-
-                Ok(Some(ControlCommand::SetSystemVolume(volume)))
-            }
-            Some("get_mute") => Ok(Some(ControlCommand::GetSystemMute)),
-            Some("set_mute") => {
-                let mute_str = args
-                    .next()
-                    .ok_or_else(|| Error::MissingArgument("set_mute".to_string()))?;
-
-                let mute = mute_str.parse::<bool>().map_err(|e| {
-                    Error::InvalidArgument(
-                        "set_mute".to_string(),
-                        mute_str.to_string(),
-                        e.to_string(),
-                    )
-                })?;
-                Ok(Some(ControlCommand::SetSystemMute(mute)))
-            }
-            Some("list_output_devices") => Ok(Some(ControlCommand::ListOutputDevices)),
-            Some("list_input_devices") => Ok(Some(ControlCommand::ListInputDevices)),
-            Some("list_output_nodes") => Ok(Some(ControlCommand::ListOutputNodes)),
-            Some("list_input_nodes") => Ok(Some(ControlCommand::ListInputNodes)),
-            Some("dump_audio_debug_info") => Ok(Some(ControlCommand::DumpAudioDebugInfo)),
-            Some(s) => {
-                show_control_command_usage(program_name);
-                Err(Error::UnknownCommand(s.to_string()))
-            }
-            None => {
-                show_control_command_usage(program_name);
-                Err(Error::MissingCommand)
-            }
-        }
-    }
-}
-
-#[cfg(test)]
-mod tests {
-    use super::*;
-
-    #[test]
-    fn parse_command() {
-        let command = Command::parse(&["cras_tests", "playback", "output.wav"])
-            .unwrap()
-            .unwrap();
-        assert_eq!(
-            command,
-            Command::Playback(AudioOptions {
-                file_name: PathBuf::from("output.wav"),
-                loopback_type: None,
-                file_type: FileType::Wav,
-                frame_rate: None,
-                num_channels: None,
-                format: None,
-                buffer_size: None,
-            })
-        );
-        let command = Command::parse(&["cras_tests", "capture", "input.raw"])
-            .unwrap()
-            .unwrap();
-        assert_eq!(
-            command,
-            Command::Capture(AudioOptions {
-                file_name: PathBuf::from("input.raw"),
-                loopback_type: None,
-                file_type: FileType::Raw,
-                frame_rate: None,
-                num_channels: None,
-                format: None,
-                buffer_size: None,
-            })
-        );
-
-        let command = Command::parse(&[
-            "cras_tests",
-            "playback",
-            "-r",
-            "44100",
-            "output.wave",
-            "-c",
-            "2",
-        ])
-        .unwrap()
-        .unwrap();
-        assert_eq!(
-            command,
-            Command::Playback(AudioOptions {
-                file_name: PathBuf::from("output.wave"),
-                loopback_type: None,
-                file_type: FileType::Wav,
-                frame_rate: Some(44100),
-                num_channels: Some(2),
-                format: None,
-                buffer_size: None,
-            })
-        );
-
-        let command =
-            Command::parse(&["cras_tests", "playback", "-r", "44100", "output", "-c", "2"])
-                .unwrap()
-                .unwrap();
-        assert_eq!(
-            command,
-            Command::Playback(AudioOptions {
-                file_name: PathBuf::from("output"),
-                loopback_type: None,
-                file_type: FileType::Raw,
-                frame_rate: Some(44100),
-                num_channels: Some(2),
-                format: None,
-                buffer_size: None,
-            })
-        );
-
-        assert!(Command::parse(&["cras_tests"]).is_err());
-        assert!(Command::parse(&["cras_tests", "capture"]).is_err());
-        assert!(Command::parse(&["cras_tests", "capture", "input.mp3"]).is_err());
-        assert!(Command::parse(&["cras_tests", "capture", "input.ogg"]).is_err());
-        assert!(Command::parse(&["cras_tests", "capture", "input.flac"]).is_err());
-        assert!(Command::parse(&["cras_tests", "playback"]).is_err());
-        assert!(Command::parse(&["cras_tests", "loopback"]).is_err());
-        assert!(Command::parse(&["cras_tests", "loopback", "file.ogg"]).is_err());
-        assert!(Command::parse(&["cras_tests", "filename.wav"]).is_err());
-        assert!(Command::parse(&["cras_tests", "filename.wav", "capture"]).is_err());
-        assert!(Command::parse(&["cras_tests", "help"]).is_ok());
-        assert!(Command::parse(&[
-            "cras_tests",
-            "-c",
-            "2",
-            "playback",
-            "output.wav",
-            "-r",
-            "44100"
-        ])
-        .is_err());
-    }
-}
diff --git a/cras/client/cras_tests/src/audio.rs b/cras/client/cras_tests/src/audio.rs
deleted file mode 100644
index 23018fd..0000000
--- a/cras/client/cras_tests/src/audio.rs
+++ /dev/null
@@ -1,414 +0,0 @@
-// Copyright 2019 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-use std::error;
-use std::fmt;
-use std::fs::File;
-use std::io::{self, BufReader, BufWriter, Read, Write};
-use std::os::raw::c_int;
-use std::path::Path;
-use std::sync::atomic::{AtomicBool, Ordering};
-
-use audio_streams::{SampleFormat, StreamSource};
-use hound::{WavReader, WavSpec, WavWriter};
-use libcras::{BoxError, CrasClient, CrasNodeType};
-use sys_util::{register_signal_handler, set_rt_prio_limit, set_rt_round_robin};
-
-use crate::arguments::{AudioOptions, FileType, LoopbackType};
-
-#[derive(Debug)]
-pub enum Error {
-    CreateStream(BoxError),
-    FetchStream(BoxError),
-    FloatingPointSamples,
-    InvalidWavFile(hound::Error),
-    Io(io::Error),
-    Libcras(libcras::Error),
-    NoLoopbackNode(CrasNodeType),
-    OpenFile(hound::Error),
-    SampleBits(u16),
-    SysUtil(sys_util::Error),
-}
-
-impl error::Error for Error {}
-
-impl fmt::Display for Error {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        use Error::*;
-        match self {
-            CreateStream(e) => write!(f, "Failed to create stream: {}", e),
-            FetchStream(e) => write!(f, "Failed to fetch buffer from stream: {}", e),
-            FloatingPointSamples => write!(f, "Floating point audio samples are not supported"),
-            InvalidWavFile(e) => write!(f, "Could not open file as WAV file: {}", e),
-            Io(e) => write!(f, "IO Error: {}", e),
-            Libcras(e) => write!(f, "Libcras Error: {}", e),
-            NoLoopbackNode(typ) => write!(f, "No loopback node found with type {:?}", typ),
-            OpenFile(e) => write!(f, "Could not open WAV file for writing: {}", e),
-            SampleBits(bits) => write!(
-                f,
-                "Sample size {} is not supported, only 8, 16, 24, and 32 bit samples are supported",
-                bits
-            ),
-            SysUtil(e) => write!(f, "SysUtil Error: {}", e),
-        }
-    }
-}
-
-type Result<T> = std::result::Result<T, Error>;
-
-static INTERRUPTED: AtomicBool = AtomicBool::new(false);
-
-extern "C" fn sigint_handler(_: c_int) {
-    // Check if we've already received one SIGINT. If we have, the program may
-    // be misbehaving and not terminating, so to be safe we'll forcefully exit.
-    if INTERRUPTED.load(Ordering::Acquire) {
-        std::process::exit(1);
-    }
-    INTERRUPTED.store(true, Ordering::Release);
-}
-
-fn add_sigint_handler() -> Result<()> {
-    const SIGINT: c_int = 2;
-    let result = unsafe { register_signal_handler(SIGINT, sigint_handler) };
-    result.map_err(Error::SysUtil)
-}
-
-fn set_priority_to_realtime() {
-    const AUDIO_THREAD_RTPRIO: u16 = 10;
-    if set_rt_prio_limit(AUDIO_THREAD_RTPRIO as u64).is_err()
-        || set_rt_round_robin(AUDIO_THREAD_RTPRIO as i32).is_err()
-    {
-        println!("Attempt to use real-time priority failed, running with default scheduler.");
-    }
-}
-
-fn channel_string(num_channels: usize) -> String {
-    match num_channels {
-        1 => "Mono".to_string(),
-        2 => "Stereo".to_string(),
-        _ => format!("{} Channels", num_channels),
-    }
-}
-
-struct WavSource {
-    wav_reader: WavReader<BufReader<File>>,
-    format: SampleFormat,
-    num_channels: usize,
-    frame_rate: u32,
-}
-
-impl WavSource {
-    fn try_new(opts: &AudioOptions) -> Result<Self> {
-        let wav_reader = WavReader::open(&opts.file_name).map_err(Error::InvalidWavFile)?;
-        let spec = wav_reader.spec();
-        if spec.sample_format == hound::SampleFormat::Float {
-            return Err(Error::FloatingPointSamples);
-        }
-
-        let format = match spec.bits_per_sample {
-            8 => SampleFormat::U8,
-            16 => SampleFormat::S16LE,
-            24 => SampleFormat::S24LE,
-            32 => SampleFormat::S32LE,
-            s => return Err(Error::SampleBits(s)),
-        };
-        if opts.format.is_some() && Some(format) != opts.format {
-            eprintln!("Warning: format changed to {:?}", format);
-        }
-
-        let num_channels = spec.channels as usize;
-        if opts.num_channels.is_some() && Some(num_channels) != opts.num_channels {
-            eprintln!("Warning: number of channels changed to {}", num_channels);
-        }
-
-        let frame_rate = spec.sample_rate;
-        if opts.frame_rate.is_some() && Some(frame_rate) != opts.frame_rate {
-            eprintln!("Warning: frame rate changed to {}", frame_rate);
-        }
-
-        Ok(Self {
-            wav_reader,
-            format,
-            num_channels,
-            frame_rate,
-        })
-    }
-
-    fn format(&self) -> SampleFormat {
-        self.format
-    }
-
-    fn num_channels(&self) -> usize {
-        self.num_channels
-    }
-
-    fn frame_rate(&self) -> u32 {
-        self.frame_rate
-    }
-}
-
-impl Read for WavSource {
-    fn read(&mut self, mut buf: &mut [u8]) -> io::Result<usize> {
-        let frame_size = self.format.sample_bytes() * self.num_channels;
-        let read_len = buf.len() - buf.len() % frame_size;
-        let num_samples = read_len / self.format.sample_bytes();
-        let samples = self.wav_reader.samples::<i32>();
-        let mut read = 0;
-        for s in samples.take(num_samples) {
-            match s {
-                Ok(sample) => {
-                    let result = match self.format {
-                        SampleFormat::U8 => buf.write_all(&((sample + 128) as u8).to_le_bytes()),
-                        SampleFormat::S16LE => buf.write_all(&(sample as i16).to_le_bytes()),
-                        SampleFormat::S24LE | SampleFormat::S32LE => {
-                            buf.write_all(&sample.to_le_bytes())
-                        }
-                    };
-
-                    match result {
-                        Ok(()) => read += self.format.sample_bytes(),
-                        Err(_) => return Ok(read),
-                    };
-                }
-                Err(_) => return Ok(read),
-            };
-        }
-        Ok(read)
-    }
-}
-
-pub fn playback(opts: AudioOptions) -> Result<()> {
-    let num_channels;
-    let frame_rate;
-    let format;
-    let mut sample_source: Box<dyn Read> = match opts.file_type {
-        FileType::Wav => {
-            let wav_source = WavSource::try_new(&opts)?;
-            num_channels = wav_source.num_channels();
-            frame_rate = wav_source.frame_rate();
-            format = wav_source.format();
-            Box::new(wav_source)
-        }
-        FileType::Raw => {
-            num_channels = opts.num_channels.unwrap_or(2);
-            frame_rate = opts.frame_rate.unwrap_or(48000);
-            format = opts.format.unwrap_or(SampleFormat::S16LE);
-            Box::new(BufReader::new(
-                File::open(&opts.file_name).map_err(Error::Io)?,
-            ))
-        }
-    };
-
-    println!(
-        "Playing {} '{}' : {}, Rate {} Hz, {}",
-        opts.file_type,
-        opts.file_name.display(),
-        format,
-        frame_rate,
-        channel_string(num_channels)
-    );
-
-    let mut cras_client = CrasClient::new().map_err(Error::Libcras)?;
-    let (_control, mut stream) = cras_client
-        .new_playback_stream(
-            num_channels,
-            format,
-            frame_rate,
-            opts.buffer_size.unwrap_or(256),
-        )
-        .map_err(Error::CreateStream)?;
-    set_priority_to_realtime();
-
-    add_sigint_handler()?;
-    while !INTERRUPTED.load(Ordering::Acquire) {
-        let mut buffer = stream.next_playback_buffer().map_err(Error::FetchStream)?;
-
-        let frame_size = num_channels * format.sample_bytes();
-        let frames = buffer.frame_capacity();
-
-        let mut chunk = (&mut sample_source).take((frames * frame_size) as u64);
-        let transferred = io::copy(&mut chunk, &mut buffer).map_err(Error::Io)?;
-        if transferred == 0 {
-            break;
-        }
-    }
-    // Stream and client should gracefully be closed out of this scope
-
-    Ok(())
-}
-
-struct WavSink {
-    wav_writer: WavWriter<BufWriter<File>>,
-    format: SampleFormat,
-}
-
-impl WavSink {
-    fn try_new<P: AsRef<Path>>(
-        path: P,
-        num_channels: usize,
-        format: SampleFormat,
-        frame_rate: u32,
-    ) -> Result<Self> {
-        let spec = WavSpec {
-            channels: num_channels as u16,
-            sample_rate: frame_rate,
-            bits_per_sample: (format.sample_bytes() * 8) as u16,
-            sample_format: hound::SampleFormat::Int,
-        };
-        let wav_writer = WavWriter::create(path, spec).map_err(Error::OpenFile)?;
-        Ok(Self { wav_writer, format })
-    }
-}
-
-impl Write for WavSink {
-    fn write(&mut self, samples: &[u8]) -> io::Result<usize> {
-        let sample_bytes = self.format.sample_bytes();
-        if samples.len() % sample_bytes != 0 {
-            return Err(io::Error::new(
-                io::ErrorKind::InvalidInput,
-                format!(
-                    "u8 samples vector of length {} cannot be interpreted as {:?} samples",
-                    samples.len(),
-                    self.format
-                ),
-            ));
-        }
-        let num_samples = samples.len() / sample_bytes;
-        match self.format {
-            SampleFormat::U8 => {
-                for sample in samples {
-                    self.wav_writer.write_sample(*sample as i8).map_err(|e| {
-                        io::Error::new(
-                            io::ErrorKind::Other,
-                            format!("Failed to write sample: {}", e),
-                        )
-                    })?;
-                }
-            }
-            SampleFormat::S16LE => {
-                // hound offers an optimized i16 writer, so special case here.
-                let mut writer = self.wav_writer.get_i16_writer(num_samples as u32);
-                for i in 0..num_samples {
-                    let sample = i16::from_le_bytes([
-                        samples[sample_bytes * i],
-                        samples[sample_bytes * i + 1],
-                    ]);
-                    writer.write_sample(sample);
-                }
-                // I16Writer buffers internally and must be explicitly flushed to write
-                // samples to the backing writer. Flush is not called automatically
-                // on drop.
-                // The flush method only writes data from the i16_writer to the underlying
-                // WavWriter, it does not actually guarantee a flush to disk.
-                writer.flush().map_err(|e| {
-                    io::Error::new(
-                        io::ErrorKind::Other,
-                        format!("Failed to flush SampleWriter: {}", e),
-                    )
-                })?;
-            }
-            SampleFormat::S24LE | SampleFormat::S32LE => {
-                for i in 0..num_samples {
-                    let mut sample = i32::from_le_bytes([
-                        samples[sample_bytes * i],
-                        samples[sample_bytes * i + 1],
-                        samples[sample_bytes * i + 2],
-                        samples[sample_bytes * i + 3],
-                    ]);
-
-                    // Upsample to 32 bit since CRAS doesn't support S24_3LE.
-                    // Our wav encoder/decoder, hound, does have support for
-                    // S24_LE, but it hasn't released a new version since the
-                    // support was added. If getting that support is an issue,
-                    // push upstream to cut a new a release.
-                    if self.format == SampleFormat::S24LE {
-                        sample <<= 8;
-                    }
-
-                    self.wav_writer.write_sample(sample).map_err(|e| {
-                        io::Error::new(
-                            io::ErrorKind::Other,
-                            format!("Failed to write sample: {}", e),
-                        )
-                    })?;
-                }
-            }
-        }
-
-        Ok(samples.len())
-    }
-
-    fn flush(&mut self) -> io::Result<()> {
-        self.wav_writer.flush().map_err(|e| {
-            io::Error::new(
-                io::ErrorKind::Other,
-                format!("Failed to flush WavWriter: {}", e),
-            )
-        })
-    }
-}
-
-pub fn capture(opts: AudioOptions) -> Result<()> {
-    let num_channels = opts.num_channels.unwrap_or(2);
-    let format = opts.format.unwrap_or(SampleFormat::S16LE);
-    let frame_rate = opts.frame_rate.unwrap_or(48000);
-    let buffer_size = opts.buffer_size.unwrap_or(256);
-
-    let mut sample_sink: Box<dyn Write> = match opts.file_type {
-        FileType::Raw => Box::new(BufWriter::new(
-            File::create(&opts.file_name).map_err(Error::Io)?,
-        )),
-        FileType::Wav => Box::new(WavSink::try_new(
-            &opts.file_name,
-            num_channels,
-            format,
-            frame_rate,
-        )?),
-    };
-
-    println!(
-        "Recording {} '{}' : {}, Rate {} Hz, {}",
-        opts.file_type,
-        opts.file_name.display(),
-        format,
-        frame_rate,
-        channel_string(num_channels)
-    );
-
-    let mut cras_client = CrasClient::new().map_err(Error::Libcras)?;
-    cras_client.enable_cras_capture();
-    let (_control, mut stream) = match opts.loopback_type {
-        Some(loopback_type) => {
-            let node_type = match loopback_type {
-                LoopbackType::PreDsp => CrasNodeType::CRAS_NODE_TYPE_POST_MIX_PRE_DSP,
-                LoopbackType::PostDsp => CrasNodeType::CRAS_NODE_TYPE_POST_DSP,
-            };
-
-            let loopback_node = cras_client
-                .input_nodes()
-                .find(|node| node.node_type == node_type)
-                .ok_or(Error::NoLoopbackNode(node_type))?;
-
-            cras_client
-                .new_pinned_capture_stream(
-                    loopback_node.iodev_index,
-                    num_channels,
-                    format,
-                    frame_rate,
-                    buffer_size,
-                )
-                .map_err(Error::CreateStream)?
-        }
-        None => cras_client
-            .new_capture_stream(num_channels, format, frame_rate, buffer_size)
-            .map_err(Error::CreateStream)?,
-    };
-    set_priority_to_realtime();
-    add_sigint_handler()?;
-    while !INTERRUPTED.load(Ordering::Acquire) {
-        let mut buf = stream.next_capture_buffer().map_err(Error::FetchStream)?;
-        io::copy(&mut buf, &mut sample_sink).map_err(Error::Io)?;
-    }
-    Ok(())
-}
diff --git a/cras/client/cras_tests/src/control.rs b/cras/client/cras_tests/src/control.rs
deleted file mode 100644
index 3a98ec9..0000000
--- a/cras/client/cras_tests/src/control.rs
+++ /dev/null
@@ -1,106 +0,0 @@
-// Copyright 2019 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-use std::error;
-use std::fmt;
-
-use libcras::{AudioDebugInfo, CrasClient, CrasIonodeInfo};
-
-use crate::arguments::ControlCommand;
-
-/// An enumeration of errors that can occur when running `ControlCommand` using
-/// the `control()` function.
-#[derive(Debug)]
-pub enum Error {
-    Libcras(libcras::Error),
-}
-
-impl error::Error for Error {}
-
-impl fmt::Display for Error {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        use Error::*;
-        match self {
-            Libcras(e) => write!(f, "Libcras Error: {}", e),
-        }
-    }
-}
-
-type Result<T> = std::result::Result<T, Error>;
-
-fn print_nodes(nodes: impl Iterator<Item = CrasIonodeInfo>) {
-    println!(
-        "{: <13}{: <7}{: <6}{: <10}{: <13}{: <20} {: <10}",
-        "Stable ID", "ID", "Vol", "Plugged", "Time", "Type", "Name"
-    );
-    for node in nodes {
-        let id = format!("{}:{}", node.iodev_index, node.ionode_index);
-        let stable_id = format!("({:08x})", node.stable_id);
-        let plugged_time = node.plugged_time.tv_sec;
-        let active = if node.active { "*" } else { " " };
-        println!(
-            "{: <13}{: <7}{: <6}{: <10}{: <13}{: <20}{}{: <10}",
-            stable_id,
-            id,
-            node.volume,
-            node.plugged,
-            plugged_time,
-            node.type_name,
-            active,
-            node.name
-        );
-    }
-}
-
-fn print_audio_debug_info(info: &AudioDebugInfo) {
-    println!("Audio Debug Stats:");
-    println!("-------------devices------------");
-    for device in &info.devices {
-        println!("{}", device);
-        println!();
-    }
-
-    println!("-------------stream_dump------------");
-    for stream in &info.streams {
-        println!("{}", stream);
-        println!();
-    }
-}
-
-/// Connect to CRAS and run the given `ControlCommand`.
-pub fn control(command: ControlCommand) -> Result<()> {
-    use ControlCommand::*;
-    let mut cras_client = CrasClient::new().map_err(Error::Libcras)?;
-    match command {
-        GetSystemVolume => println!("{}", cras_client.get_system_volume()),
-        SetSystemVolume(volume) => {
-            cras_client
-                .set_system_volume(volume)
-                .map_err(Error::Libcras)?;
-        }
-        GetSystemMute => println!("{}", cras_client.get_system_mute()),
-        SetSystemMute(mute) => {
-            cras_client.set_system_mute(mute).map_err(Error::Libcras)?;
-        }
-        ListOutputDevices => {
-            println!("{: <5}{: <10}", "ID", "Name");
-            for dev in cras_client.output_devices() {
-                println!("{: <5}{: <10}", dev.index, dev.name);
-            }
-        }
-        ListInputDevices => {
-            println!("{: <5}{: <10}", "ID", "Name");
-            for dev in cras_client.input_devices() {
-                println!("{: <5}{: <10}", dev.index, dev.name);
-            }
-        }
-        ListOutputNodes => print_nodes(cras_client.output_nodes()),
-        ListInputNodes => print_nodes(cras_client.input_nodes()),
-        DumpAudioDebugInfo => {
-            let debug_info = cras_client.get_audio_debug_info().map_err(Error::Libcras)?;
-            print_audio_debug_info(&debug_info);
-        }
-    };
-    Ok(())
-}
diff --git a/cras/client/cras_tests/src/main.rs b/cras/client/cras_tests/src/main.rs
deleted file mode 100644
index 50ffd09..0000000
--- a/cras/client/cras_tests/src/main.rs
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright 2019 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-mod arguments;
-mod audio;
-mod control;
-
-use std::error;
-use std::fmt;
-
-use crate::arguments::Command;
-use crate::audio::{capture, playback};
-use crate::control::control;
-
-#[derive(Debug)]
-pub enum Error {
-    Audio(audio::Error),
-    ParseArgs(arguments::Error),
-    Control(control::Error),
-}
-
-impl error::Error for Error {}
-
-impl fmt::Display for Error {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        use Error::*;
-        match self {
-            Audio(e) => e.fmt(f),
-            ParseArgs(e) => write!(f, "Failed to parse arguments: {}", e),
-            Control(e) => e.fmt(f),
-        }
-    }
-}
-
-type Result<T> = std::result::Result<T, Error>;
-
-fn run() -> Result<()> {
-    let args: Vec<String> = std::env::args().collect();
-    let command = match Command::parse(&args).map_err(Error::ParseArgs)? {
-        None => return Ok(()),
-        Some(v) => v,
-    };
-
-    match command {
-        Command::Capture(audio_opts) => capture(audio_opts).map_err(Error::Audio),
-        Command::Control(command) => control(command).map_err(Error::Control),
-        Command::Playback(audio_opts) => playback(audio_opts).map_err(Error::Audio),
-    }
-}
-
-fn main() {
-    // Use run() instead of returning a Result from main() so that we can print
-    // errors using Display instead of Debug.
-    if let Err(e) = run() {
-        eprintln!("{}", e);
-    }
-}
diff --git a/cras/client/libcras/.gitignore b/cras/client/libcras/.gitignore
deleted file mode 100644
index fa8d85a..0000000
--- a/cras/client/libcras/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Cargo.lock
-target
diff --git a/cras/client/libcras/.rustfmt.toml b/cras/client/libcras/.rustfmt.toml
deleted file mode 100644
index a2db301..0000000
--- a/cras/client/libcras/.rustfmt.toml
+++ /dev/null
@@ -1,2 +0,0 @@
-use_field_init_shorthand = true
-use_try_shorthand = true
diff --git a/cras/client/libcras/Android.bp b/cras/client/libcras/Android.bp
deleted file mode 100644
index aecb27a..0000000
--- a/cras/client/libcras/Android.bp
+++ /dev/null
@@ -1,69 +0,0 @@
-// This file is generated by cargo2android.py --run --device --test --global_defaults=crosvm_defaults --dependencies.
-
-package {
-    // See: http://go/android-license-faq
-    // A large-scale-change added 'default_applicable_licenses' to import
-    // all of the 'license_kinds' from "external_adhd_license"
-    // to get the below license kinds:
-    //   SPDX-license-identifier-BSD
-    default_applicable_licenses: ["external_adhd_license"],
-}
-
-rust_defaults {
-    name: "libcras_defaults",
-    defaults: ["crosvm_defaults"],
-    crate_name: "libcras",
-    srcs: ["src/libcras.rs"],
-    test_suites: ["general-tests"],
-    auto_gen_config: true,
-    edition: "2018",
-    rustlibs: [
-        "libaudio_streams",
-        "libcras_sys",
-        "libdata_model",
-        "liblibc",
-        "libsys_util",
-    ],
-}
-
-rust_test_host {
-    name: "libcras_host_test_src_libcras",
-    defaults: ["libcras_defaults"],
-}
-
-rust_test {
-    name: "libcras_device_test_src_libcras",
-    defaults: ["libcras_defaults"],
-}
-
-rust_library {
-    name: "liblibcras",
-    defaults: ["crosvm_defaults"],
-    host_supported: true,
-    crate_name: "libcras",
-    srcs: ["src/libcras.rs"],
-    edition: "2018",
-    rustlibs: [
-        "libaudio_streams",
-        "libcras_sys",
-        "libdata_model",
-        "liblibc",
-        "libsys_util",
-    ],
-}
-
-// dependent_library ["feature_list"]
-//   ../../../../crosvm/assertions/src/lib.rs
-//   ../../../../crosvm/data_model/src/lib.rs
-//   ../../../../crosvm/sync/src/lib.rs
-//   ../../../../crosvm/sys_util/poll_token_derive/poll_token_derive.rs
-//   ../../../../crosvm/sys_util/src/lib.rs
-//   ../../../../crosvm/syscall_defines/src/lib.rs
-//   ../../../../crosvm/tempfile/src/lib.rs
-//   ../../../audio_streams/src/audio_streams.rs
-//   ../cras-sys/src/lib.rs
-//   libc-0.2.76 "default,std"
-//   proc-macro2-1.0.19 "default,proc-macro"
-//   quote-1.0.7 "default,proc-macro"
-//   syn-1.0.39 "clone-impls,default,derive,parsing,printing,proc-macro,quote"
-//   unicode-xid-0.2.1 "default"
diff --git a/cras/client/libcras/Cargo.toml b/cras/client/libcras/Cargo.toml
deleted file mode 100644
index b52a261..0000000
--- a/cras/client/libcras/Cargo.toml
+++ /dev/null
@@ -1,15 +0,0 @@
-[package]
-name = "libcras"
-version = "0.1.0"
-authors = ["The Chromium OS Authors"]
-edition = "2018"
-
-[lib]
-path = "src/libcras.rs"
-
-[dependencies]
-audio_streams = { path = "../../../audio_streams" } # provided by ebuild
-libc = "*"
-cras-sys = { path = "../cras-sys" } # provided by ebuild
-data_model = { path = "../../../../crosvm/data_model" } # provided by ebuild
-sys_util = { path = "../../../../crosvm/sys_util" } # provided by ebuild
diff --git a/cras/client/libcras/src/audio_socket.rs b/cras/client/libcras/src/audio_socket.rs
deleted file mode 100644
index ac56144..0000000
--- a/cras/client/libcras/src/audio_socket.rs
+++ /dev/null
@@ -1,316 +0,0 @@
-// Copyright 2019 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-use std::io;
-use std::io::{Read, Write};
-use std::mem;
-use std::os::unix::{
-    io::{AsRawFd, RawFd},
-    net::UnixStream,
-};
-use std::time::Duration;
-
-use cras_sys::gen::{audio_message, CRAS_AUDIO_MESSAGE_ID};
-use data_model::DataInit;
-use sys_util::{PollContext, PollToken};
-
-/// A structure for interacting with the CRAS server audio thread through a `UnixStream::pair`.
-pub struct AudioSocket {
-    socket: UnixStream,
-}
-
-/// Audio message results which are exchanged by `CrasStream` and CRAS audio server.
-/// through an audio socket.
-#[allow(dead_code)]
-#[derive(Debug)]
-pub enum AudioMessage {
-    /// * `id` - Audio message id, which is a `enum CRAS_AUDIO_MESSAGE_ID`.
-    /// * `frames` - A `u32` indicating the read or written frame count.
-    Success {
-        id: CRAS_AUDIO_MESSAGE_ID,
-        frames: u32,
-    },
-    /// * `error` - Error code when a error occurs.
-    Error(i32),
-}
-
-/// Converts AudioMessage to raw audio_message for CRAS audio server.
-impl Into<audio_message> for AudioMessage {
-    fn into(self) -> audio_message {
-        match self {
-            AudioMessage::Success { id, frames } => audio_message {
-                id,
-                error: 0,
-                frames,
-            },
-            AudioMessage::Error(error) => audio_message {
-                id: CRAS_AUDIO_MESSAGE_ID::AUDIO_MESSAGE_REQUEST_DATA,
-                error,
-                frames: 0,
-            },
-        }
-    }
-}
-
-/// Converts AudioMessage from raw audio_message from CRAS audio server.
-impl From<audio_message> for AudioMessage {
-    fn from(message: audio_message) -> Self {
-        match message.error {
-            0 => AudioMessage::Success {
-                id: message.id as CRAS_AUDIO_MESSAGE_ID,
-                frames: message.frames,
-            },
-            error => AudioMessage::Error(error),
-        }
-    }
-}
-
-impl AudioSocket {
-    /// Creates `AudioSocket` from a `UnixStream`.
-    ///
-    /// # Arguments
-    /// `socket` - A `UnixStream`.
-    pub fn new(socket: UnixStream) -> Self {
-        AudioSocket { socket }
-    }
-
-    fn read_from_socket<T>(&mut self) -> io::Result<T>
-    where
-        T: Sized + DataInit + Default,
-    {
-        let mut message: T = Default::default();
-        let rc = self.socket.read(message.as_mut_slice())?;
-        if rc == mem::size_of::<T>() {
-            Ok(message)
-        } else {
-            Err(io::Error::new(io::ErrorKind::Other, "Read truncated data."))
-        }
-    }
-
-    /// Blocks reading an `audio message`.
-    ///
-    /// # Returns
-    /// `AudioMessage` - AudioMessage enum.
-    ///
-    /// # Errors
-    /// Returns io::Error if error occurs.
-    pub fn read_audio_message(&mut self) -> io::Result<AudioMessage> {
-        match self.read_audio_message_with_timeout(None)? {
-            None => Err(io::Error::new(io::ErrorKind::Other, "Unexpected exit")),
-            Some(message) => Ok(message),
-        }
-    }
-
-    /// Blocks waiting for an `audio message` until `timeout` occurs. If `timeout`
-    /// is None, blocks indefinitely.
-    ///
-    /// # Returns
-    /// Some(AudioMessage) - AudioMessage enum if we receive a message before timeout.
-    /// None - If the timeout expires.
-    ///
-    /// # Errors
-    /// Returns io::Error if error occurs.
-    pub fn read_audio_message_with_timeout(
-        &mut self,
-        timeout: Option<Duration>,
-    ) -> io::Result<Option<AudioMessage>> {
-        #[derive(PollToken)]
-        enum Token {
-            AudioMsg,
-        }
-        let poll_ctx: PollContext<Token> =
-            match PollContext::new().and_then(|pc| pc.add(self, Token::AudioMsg).and(Ok(pc))) {
-                Ok(pc) => pc,
-                Err(e) => {
-                    return Err(io::Error::new(
-                        io::ErrorKind::Other,
-                        format!("Failed to create PollContext: {}", e),
-                    ));
-                }
-            };
-        let events = {
-            let result = match timeout {
-                None => poll_ctx.wait(),
-                Some(duration) => poll_ctx.wait_timeout(duration),
-            };
-            match result {
-                Ok(v) => v,
-                Err(e) => {
-                    return Err(io::Error::new(
-                        io::ErrorKind::Other,
-                        format!("Failed to poll: {:?}", e),
-                    ));
-                }
-            }
-        };
-
-        // Check the first readable message
-        let tokens: Vec<Token> = events.iter_readable().map(|e| e.token()).collect();
-        match tokens.get(0) {
-            None => Ok(None),
-            Some(&Token::AudioMsg) => {
-                let raw_msg: audio_message = self.read_from_socket()?;
-                Ok(Some(AudioMessage::from(raw_msg)))
-            }
-        }
-    }
-
-    /// Sends raw audio message with given AudioMessage enum.
-    ///
-    /// # Arguments
-    /// * `msg` - enum AudioMessage, which could be `Success` with message id
-    /// and frames or `Error` with error code.
-    ///
-    /// # Errors
-    /// Returns error if `libc::write` fails.
-    fn send_audio_message(&mut self, msg: AudioMessage) -> io::Result<()> {
-        let msg: audio_message = msg.into();
-        let rc = self.socket.write(msg.as_slice())?;
-        if rc < mem::size_of::<audio_message>() {
-            Err(io::Error::new(io::ErrorKind::Other, "Sent truncated data."))
-        } else {
-            Ok(())
-        }
-    }
-
-    /// Sends the data ready message with written frame count.
-    ///
-    /// # Arguments
-    /// * `frames` - An `u32` indicating the written frame count.
-    pub fn data_ready(&mut self, frames: u32) -> io::Result<()> {
-        self.send_audio_message(AudioMessage::Success {
-            id: CRAS_AUDIO_MESSAGE_ID::AUDIO_MESSAGE_DATA_READY,
-            frames,
-        })
-    }
-
-    /// Sends the capture ready message with read frame count.
-    ///
-    /// # Arguments
-    ///
-    /// * `frames` - An `u32` indicating the number of read frames.
-    pub fn capture_ready(&mut self, frames: u32) -> io::Result<()> {
-        self.send_audio_message(AudioMessage::Success {
-            id: CRAS_AUDIO_MESSAGE_ID::AUDIO_MESSAGE_DATA_CAPTURED,
-            frames,
-        })
-    }
-}
-
-impl AsRawFd for AudioSocket {
-    fn as_raw_fd(&self) -> RawFd {
-        self.socket.as_raw_fd()
-    }
-}
-
-#[cfg(test)]
-mod tests {
-    use super::*;
-
-    // PartialEq for comparing AudioMessage in tests
-    impl PartialEq for AudioMessage {
-        fn eq(&self, other: &Self) -> bool {
-            match (self, other) {
-                (
-                    AudioMessage::Success { id, frames },
-                    AudioMessage::Success {
-                        id: other_id,
-                        frames: other_frames,
-                    },
-                ) => id == other_id && frames == other_frames,
-                (AudioMessage::Error(err), AudioMessage::Error(other_err)) => err == other_err,
-                _ => false,
-            }
-        }
-    }
-
-    fn init_audio_socket_pair() -> (AudioSocket, AudioSocket) {
-        let (sock1, sock2) = UnixStream::pair().unwrap();
-        let sender = AudioSocket::new(sock1);
-        let receiver = AudioSocket::new(sock2);
-        (sender, receiver)
-    }
-
-    #[test]
-    fn audio_socket_send_and_recv_audio_message() {
-        let (mut sender, mut receiver) = init_audio_socket_pair();
-        let message_succ = AudioMessage::Success {
-            id: CRAS_AUDIO_MESSAGE_ID::AUDIO_MESSAGE_REQUEST_DATA,
-            frames: 0,
-        };
-        sender.send_audio_message(message_succ).unwrap();
-        let res = receiver.read_audio_message().unwrap();
-        assert_eq!(
-            res,
-            AudioMessage::Success {
-                id: CRAS_AUDIO_MESSAGE_ID::AUDIO_MESSAGE_REQUEST_DATA,
-                frames: 0
-            }
-        );
-
-        let message_err = AudioMessage::Error(123);
-        sender.send_audio_message(message_err).unwrap();
-        let res = receiver.read_audio_message().unwrap();
-        assert_eq!(res, AudioMessage::Error(123));
-    }
-
-    #[test]
-    fn audio_socket_data_ready_send_and_recv() {
-        let (sock1, sock2) = UnixStream::pair().unwrap();
-        let mut audio_socket_send = AudioSocket::new(sock1);
-        let mut audio_socket_recv = AudioSocket::new(sock2);
-        audio_socket_send.data_ready(256).unwrap();
-
-        // Test receiving by using raw audio_message since CRAS audio server use this.
-        let audio_msg: audio_message = audio_socket_recv.read_from_socket().unwrap();
-        let ref_audio_msg = audio_message {
-            id: CRAS_AUDIO_MESSAGE_ID::AUDIO_MESSAGE_DATA_READY,
-            error: 0,
-            frames: 256,
-        };
-        // Use brace to copy unaligned data locally
-        assert_eq!({ audio_msg.id }, { ref_audio_msg.id });
-        assert_eq!({ audio_msg.error }, { ref_audio_msg.error });
-        assert_eq!({ audio_msg.frames }, { ref_audio_msg.frames });
-    }
-
-    #[test]
-    fn audio_socket_capture_ready() {
-        let (sock1, sock2) = UnixStream::pair().unwrap();
-        let mut audio_socket_send = AudioSocket::new(sock1);
-        let mut audio_socket_recv = AudioSocket::new(sock2);
-        audio_socket_send
-            .capture_ready(256)
-            .expect("Failed to send capture ready message.");
-
-        // Test receiving by using raw audio_message since CRAS audio server use this.
-        let audio_msg: audio_message = audio_socket_recv
-            .read_from_socket()
-            .expect("Failed to read audio message from AudioSocket.");
-        let ref_audio_msg = audio_message {
-            id: CRAS_AUDIO_MESSAGE_ID::AUDIO_MESSAGE_DATA_CAPTURED,
-            error: 0,
-            frames: 256,
-        };
-        // Use brace to copy unaligned data locally
-        assert_eq!({ audio_msg.id }, { ref_audio_msg.id });
-        assert_eq!({ audio_msg.error }, { ref_audio_msg.error });
-        assert_eq!({ audio_msg.frames }, { ref_audio_msg.frames });
-    }
-
-    #[test]
-    fn audio_socket_send_when_broken_pipe() {
-        let sock1 = {
-            let (sock1, _) = UnixStream::pair().unwrap();
-            sock1
-        };
-        let mut audio_socket = AudioSocket::new(sock1);
-        let res = audio_socket.data_ready(256);
-        //Broken pipe
-        assert_eq!(
-            res.expect_err("Result should be an error.").kind(),
-            io::Error::from_raw_os_error(32).kind(),
-            "Error should be broken pipe.",
-        );
-    }
-}
diff --git a/cras/client/libcras/src/cras_client_message.rs b/cras/client/libcras/src/cras_client_message.rs
deleted file mode 100644
index c1c5ec5..0000000
--- a/cras/client/libcras/src/cras_client_message.rs
+++ /dev/null
@@ -1,200 +0,0 @@
-// Copyright 2019 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-use std::{array::TryFromSliceError, convert::TryInto, error, fmt, io, mem, os::unix::io::RawFd};
-
-use cras_sys::gen::{
-    cras_client_connected, cras_client_message, cras_client_stream_connected,
-    CRAS_CLIENT_MAX_MSG_SIZE,
-    CRAS_CLIENT_MESSAGE_ID::{self, *},
-};
-use data_model::DataInit;
-use sys_util::ScmSocket;
-
-use crate::cras_server_socket::CrasServerSocket;
-use crate::cras_shm::*;
-use crate::cras_stream;
-
-#[derive(Debug)]
-pub enum Error {
-    IoError(io::Error),
-    SysUtilError(sys_util::Error),
-    CrasStreamError(cras_stream::Error),
-    ArrayTryFromSliceError(TryFromSliceError),
-    InvalidSize,
-    MessageTypeError,
-    MessageNumFdError,
-    MessageTruncated,
-    MessageIdError,
-    MessageFromSliceError,
-}
-
-impl error::Error for Error {}
-
-impl fmt::Display for Error {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        match self {
-            Error::IoError(ref err) => err.fmt(f),
-            Error::SysUtilError(ref err) => err.fmt(f),
-            Error::MessageTypeError => write!(f, "Message type error"),
-            Error::CrasStreamError(ref err) => err.fmt(f),
-            Error::ArrayTryFromSliceError(ref err) => err.fmt(f),
-            Error::MessageNumFdError => write!(f, "Message the number of fds is not matched"),
-            Error::MessageTruncated => write!(f, "Read truncated message"),
-            Error::MessageIdError => write!(f, "No such id"),
-            Error::MessageFromSliceError => write!(f, "Message from slice error"),
-            Error::InvalidSize => write!(f, "Invalid data size"),
-        }
-    }
-}
-
-type Result<T> = std::result::Result<T, Error>;
-
-impl From<io::Error> for Error {
-    fn from(io_err: io::Error) -> Self {
-        Error::IoError(io_err)
-    }
-}
-
-impl From<sys_util::Error> for Error {
-    fn from(sys_util_err: sys_util::Error) -> Self {
-        Error::SysUtilError(sys_util_err)
-    }
-}
-
-impl From<cras_stream::Error> for Error {
-    fn from(err: cras_stream::Error) -> Self {
-        Error::CrasStreamError(err)
-    }
-}
-
-impl From<TryFromSliceError> for Error {
-    fn from(err: TryFromSliceError) -> Self {
-        Error::ArrayTryFromSliceError(err)
-    }
-}
-
-/// A handled server result from one message sent from CRAS server.
-pub enum ServerResult {
-    /// client_id, CrasServerStateShmFd
-    Connected(u32, CrasServerStateShmFd),
-    /// stream_id, header_fd, samples_fd
-    StreamConnected(u32, CrasAudioShmHeaderFd, CrasShmFd),
-    DebugInfoReady,
-}
-
-impl ServerResult {
-    /// Reads and handles one server message and converts `CrasClientMessage` into `ServerResult`
-    /// with error handling.
-    ///
-    /// # Arguments
-    /// * `server_socket`: A reference to `CrasServerSocket`.
-    pub fn handle_server_message(server_socket: &CrasServerSocket) -> Result<ServerResult> {
-        let message = CrasClientMessage::try_new(&server_socket)?;
-        match message.get_id()? {
-            CRAS_CLIENT_MESSAGE_ID::CRAS_CLIENT_CONNECTED => {
-                let cmsg: &cras_client_connected = message.get_message()?;
-                // CRAS server should return a shared memory area which contains
-                // `cras_server_state`.
-                let server_state_fd = unsafe { CrasServerStateShmFd::new(message.fds[0]) };
-                Ok(ServerResult::Connected(cmsg.client_id, server_state_fd))
-            }
-            CRAS_CLIENT_MESSAGE_ID::CRAS_CLIENT_STREAM_CONNECTED => {
-                let cmsg: &cras_client_stream_connected = message.get_message()?;
-                // CRAS should return two shared memory areas the first which has
-                // mem::size_of::<cras_audio_shm_header>() bytes, and the second which has
-                // `samples_shm_size` bytes.
-                Ok(ServerResult::StreamConnected(
-                    cmsg.stream_id,
-                    // Safe because CRAS ensures that the first fd contains a cras_audio_shm_header
-                    unsafe { CrasAudioShmHeaderFd::new(message.fds[0]) },
-                    // Safe because CRAS ensures that the second fd has length 'samples_shm_size'
-                    unsafe { CrasShmFd::new(message.fds[1], cmsg.samples_shm_size as usize) },
-                ))
-            }
-            CRAS_CLIENT_MESSAGE_ID::CRAS_CLIENT_AUDIO_DEBUG_INFO_READY => {
-                Ok(ServerResult::DebugInfoReady)
-            }
-            _ => Err(Error::MessageTypeError),
-        }
-    }
-}
-
-// A structure for raw message with fds from CRAS server.
-struct CrasClientMessage {
-    fds: [RawFd; 2],
-    data: [u8; CRAS_CLIENT_MAX_MSG_SIZE as usize],
-    len: usize,
-}
-
-/// The default constructor won't be used outside of this file and it's an optimization to prevent
-/// having to copy the message data from a temp buffer.
-impl Default for CrasClientMessage {
-    // Initializes fields with default values.
-    fn default() -> Self {
-        Self {
-            fds: [-1; 2],
-            data: [0; CRAS_CLIENT_MAX_MSG_SIZE as usize],
-            len: 0,
-        }
-    }
-}
-
-impl CrasClientMessage {
-    // Reads a message from server_socket and checks validity of the read result
-    fn try_new(server_socket: &CrasServerSocket) -> Result<CrasClientMessage> {
-        let mut message: Self = Default::default();
-        let (len, fd_nums) = server_socket.recv_with_fds(&mut message.data, &mut message.fds)?;
-
-        if len < mem::size_of::<cras_client_message>() {
-            Err(Error::MessageTruncated)
-        } else {
-            message.len = len;
-            message.check_fd_nums(fd_nums)?;
-            Ok(message)
-        }
-    }
-
-    // Check if `fd nums` of a read result is valid
-    fn check_fd_nums(&self, fd_nums: usize) -> Result<()> {
-        match self.get_id()? {
-            CRAS_CLIENT_CONNECTED => match fd_nums {
-                1 => Ok(()),
-                _ => Err(Error::MessageNumFdError),
-            },
-            CRAS_CLIENT_STREAM_CONNECTED => match fd_nums {
-                // CRAS should return two shared memory areas the first which has
-                // mem::size_of::<cras_audio_shm_header>() bytes, and the second which has
-                // `samples_shm_size` bytes.
-                2 => Ok(()),
-                _ => Err(Error::MessageNumFdError),
-            },
-            CRAS_CLIENT_AUDIO_DEBUG_INFO_READY => match fd_nums {
-                0 => Ok(()),
-                _ => Err(Error::MessageNumFdError),
-            },
-            _ => Err(Error::MessageTypeError),
-        }
-    }
-
-    // Gets the message id
-    fn get_id(&self) -> Result<CRAS_CLIENT_MESSAGE_ID> {
-        let offset = mem::size_of::<u32>();
-        match u32::from_le_bytes(self.data[offset..offset + 4].try_into()?) {
-            id if id == (CRAS_CLIENT_CONNECTED as u32) => Ok(CRAS_CLIENT_CONNECTED),
-            id if id == (CRAS_CLIENT_STREAM_CONNECTED as u32) => Ok(CRAS_CLIENT_STREAM_CONNECTED),
-            id if id == (CRAS_CLIENT_AUDIO_DEBUG_INFO_READY as u32) => {
-                Ok(CRAS_CLIENT_AUDIO_DEBUG_INFO_READY)
-            }
-            _ => Err(Error::MessageIdError),
-        }
-    }
-
-    // Gets a reference to the message content
-    fn get_message<T: DataInit>(&self) -> Result<&T> {
-        if self.len != mem::size_of::<T>() {
-            return Err(Error::InvalidSize);
-        }
-        T::from_slice(&self.data[..mem::size_of::<T>()]).ok_or(Error::MessageFromSliceError)
-    }
-}
diff --git a/cras/client/libcras/src/cras_server_socket.rs b/cras/client/libcras/src/cras_server_socket.rs
deleted file mode 100644
index 4a7d915..0000000
--- a/cras/client/libcras/src/cras_server_socket.rs
+++ /dev/null
@@ -1,124 +0,0 @@
-// Copyright 2019 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-use std::os::unix::io::{AsRawFd, RawFd};
-use std::{io, mem};
-
-use cras_sys::gen::{cras_disconnect_stream_message, cras_server_message, CRAS_SERVER_MESSAGE_ID};
-use sys_util::{net::UnixSeqpacket, ScmSocket};
-
-use data_model::DataInit;
-
-/// Server socket type to connect.
-pub enum CrasSocketType {
-    /// A server socket type supports only playback function.
-    Legacy,
-    /// A server socket type supports both playback and capture functions.
-    Unified,
-}
-
-impl CrasSocketType {
-    fn sock_path(&self) -> &str {
-        match self {
-            Self::Legacy => "/run/cras/.cras_socket",
-            Self::Unified => "/run/cras/.cras_unified",
-        }
-    }
-}
-
-/// A socket connecting to the CRAS audio server.
-pub struct CrasServerSocket {
-    socket: UnixSeqpacket,
-}
-
-impl CrasServerSocket {
-    pub fn new() -> io::Result<CrasServerSocket> {
-        Self::with_type(CrasSocketType::Legacy)
-    }
-
-    /// Creates a `CrasServerSocket` with given `CrasSocketType`.
-    ///
-    /// # Errors
-    ///
-    /// Returns the `io::Error` generated when connecting to the socket on failure.
-    pub fn with_type(socket_type: CrasSocketType) -> io::Result<CrasServerSocket> {
-        Ok(CrasServerSocket {
-            socket: UnixSeqpacket::connect(socket_type.sock_path())?,
-        })
-    }
-
-    /// Sends a sized and packed server messge to the server socket. The message
-    /// must implement `Sized` and `DataInit`.
-    /// # Arguments
-    /// * `message` - A sized and packed message.
-    /// * `fds` - A slice of fds to send.
-    ///
-    /// # Returns
-    /// * Length of written bytes in `usize`.
-    ///
-    /// # Errors
-    /// Return error if the socket fails to write message to server.
-    pub fn send_server_message_with_fds<M: Sized + DataInit>(
-        &self,
-        message: &M,
-        fds: &[RawFd],
-    ) -> io::Result<usize> {
-        match fds.len() {
-            0 => self.socket.send(message.as_slice()),
-            _ => {
-                let ioslice = io::IoSlice::new(message.as_slice());
-                match self.send_with_fds(&[ioslice], fds) {
-                    Ok(len) => Ok(len),
-                    Err(err) => Err(io::Error::new(io::ErrorKind::Other, format!("{}", err))),
-                }
-            }
-        }
-    }
-
-    /// Creates a clone of the underlying socket. The returned clone can also be
-    /// used to communicate with the cras server.
-    pub fn try_clone(&self) -> io::Result<CrasServerSocket> {
-        let new_sock = self.socket.try_clone()?;
-        Ok(CrasServerSocket { socket: new_sock })
-    }
-
-    /// Send a message to request disconnection of the given stream.
-    ///
-    /// Builds a `cras_disconnect_stream_message` containing `stream_id` and
-    /// sends it to the server.
-    /// No response is expected.
-    ///
-    /// # Arguments
-    ///
-    /// * `stream_id` - The id of the stream that should be disconnected.
-    ///
-    /// # Errors
-    ///
-    /// * If the message was not written to the server socket successfully.
-    pub fn disconnect_stream(&self, stream_id: u32) -> io::Result<()> {
-        let msg_header = cras_server_message {
-            length: mem::size_of::<cras_disconnect_stream_message>() as u32,
-            id: CRAS_SERVER_MESSAGE_ID::CRAS_SERVER_DISCONNECT_STREAM,
-        };
-        let server_cmsg = cras_disconnect_stream_message {
-            header: msg_header,
-            stream_id,
-        };
-        self.send_server_message_with_fds(&server_cmsg, &[])
-            .map(|_| ())
-    }
-}
-
-// For using `recv_with_fds` and `send_with_fds`.
-impl ScmSocket for CrasServerSocket {
-    fn socket_fd(&self) -> RawFd {
-        self.socket.as_raw_fd()
-    }
-}
-
-// For using `PollContex`.
-impl AsRawFd for CrasServerSocket {
-    fn as_raw_fd(&self) -> RawFd {
-        self.socket.as_raw_fd()
-    }
-}
diff --git a/cras/client/libcras/src/cras_shm.rs b/cras/client/libcras/src/cras_shm.rs
deleted file mode 100644
index 0553375..0000000
--- a/cras/client/libcras/src/cras_shm.rs
+++ /dev/null
@@ -1,1308 +0,0 @@
-// Copyright 2019 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-use std::convert::TryFrom;
-use std::io;
-use std::mem;
-use std::os::unix::io::{AsRawFd, RawFd};
-use std::ptr;
-use std::ptr::NonNull;
-use std::slice;
-use std::sync::atomic::{self, Ordering};
-use std::thread;
-
-use cras_sys::gen::{
-    audio_dev_debug_info, audio_stream_debug_info, cras_audio_shm_header, cras_iodev_info,
-    cras_ionode_info, cras_server_state, CRAS_MAX_IODEVS, CRAS_MAX_IONODES, CRAS_NUM_SHM_BUFFERS,
-    CRAS_SERVER_STATE_VERSION, CRAS_SHM_BUFFERS_MASK, MAX_DEBUG_DEVS, MAX_DEBUG_STREAMS,
-};
-use cras_sys::{
-    AudioDebugInfo, AudioDevDebugInfo, AudioStreamDebugInfo, CrasIodevInfo, CrasIonodeInfo,
-};
-use data_model::{VolatileRef, VolatileSlice};
-use sys_util::warn;
-
-/// A structure wrapping a fd which contains a shared `cras_audio_shm_header`.
-/// * `shm_fd` - A shared memory fd contains a `cras_audio_shm_header`
-pub struct CrasAudioShmHeaderFd {
-    fd: CrasShmFd,
-}
-
-impl CrasAudioShmHeaderFd {
-    /// Creates a `CrasAudioShmHeaderFd` by shared memory fd
-    /// # Arguments
-    /// * `fd` - A shared memory file descriptor, which will be owned by the resulting structure and
-    /// the fd will be closed on drop.
-    ///
-    /// # Returns
-    /// A structure wrapping a `CrasShmFd` with the input fd and `size` which equals to
-    /// the size of `cras_audio_shm_header`.
-    ///
-    /// To use this function safely, we need to make sure
-    /// - The input fd is a valid shared memory fd.
-    /// - The input shared memory fd won't be used by others.
-    /// - The shared memory area in the input fd contains a `cras_audio_shm_header`.
-    pub unsafe fn new(fd: libc::c_int) -> Self {
-        Self {
-            fd: CrasShmFd::new(fd, mem::size_of::<cras_audio_shm_header>()),
-        }
-    }
-}
-
-/// A wrapper for the raw structure `cras_audio_shm_header` with
-/// size information for the separate audio samples shm area and several
-/// `VolatileRef` to sub fields for safe access to the header.
-pub struct CrasAudioHeader<'a> {
-    addr: *mut libc::c_void,
-    /// Size of the buffer for samples in CrasAudioBuffer
-    samples_len: usize,
-    used_size: VolatileRef<'a, u32>,
-    frame_size: VolatileRef<'a, u32>,
-    read_buf_idx: VolatileRef<'a, u32>,
-    write_buf_idx: VolatileRef<'a, u32>,
-    read_offset: [VolatileRef<'a, u32>; CRAS_NUM_SHM_BUFFERS as usize],
-    write_offset: [VolatileRef<'a, u32>; CRAS_NUM_SHM_BUFFERS as usize],
-    buffer_offset: [VolatileRef<'a, u64>; CRAS_NUM_SHM_BUFFERS as usize],
-}
-
-// It is safe to send audio buffers between threads as this struct has exclusive ownership of the
-// pointers contained in it.
-unsafe impl<'a> Send for CrasAudioHeader<'a> {}
-
-/// An unsafe macro for getting `VolatileRef` for a field from a given NonNull pointer.
-/// It Supports
-/// - Nested sub-field
-/// - Element of an array field
-///
-/// To use this macro safely, we need to
-/// - Make sure the pointer address is readable and writable for its structure.
-/// - Make sure all `VolatileRef`s generated from this macro have exclusive ownership for the same
-/// pointer.
-#[macro_export]
-macro_rules! vref_from_addr {
-    ($addr:ident, $($field:ident).*) => {
-        VolatileRef::new(&mut $addr.as_mut().$($field).* as *mut _)
-    };
-
-    ($addr:ident, $field:ident[$idx:tt]) => {
-        VolatileRef::new(&mut $addr.as_mut().$field[$idx] as *mut _)
-    };
-}
-
-// Generates error when an index is out of range.
-fn index_out_of_range() -> io::Error {
-    io::Error::new(io::ErrorKind::InvalidInput, "Index out of range.")
-}
-
-impl<'a> CrasAudioHeader<'a> {
-    // Creates a `CrasAudioHeader` with given `CrasAudioShmHeaderFd` and `samples_len`
-    fn new(header_fd: CrasAudioShmHeaderFd, samples_len: usize) -> io::Result<Self> {
-        // Safe because the creator of CrasAudioShmHeaderFd already
-        // ensured that header_fd contains a cras_audio_shm_header.
-        let mmap_addr = unsafe {
-            cras_mmap(
-                header_fd.fd.size,
-                libc::PROT_READ | libc::PROT_WRITE,
-                header_fd.fd.as_raw_fd(),
-            )?
-        };
-
-        let mut addr = NonNull::new(mmap_addr as *mut cras_audio_shm_header)
-            .ok_or_else(|| io::Error::new(io::ErrorKind::Other, "Failed to create header."))?;
-
-        // Safe because we know that mmap_addr (contained in addr) contains a
-        // cras_audio_shm_header, and the mapped area will be exclusively
-        // owned by this struct.
-        unsafe {
-            Ok(CrasAudioHeader {
-                addr: addr.as_ptr() as *mut libc::c_void,
-                samples_len,
-                used_size: vref_from_addr!(addr, config.used_size),
-                frame_size: vref_from_addr!(addr, config.frame_bytes),
-                read_buf_idx: vref_from_addr!(addr, read_buf_idx),
-                write_buf_idx: vref_from_addr!(addr, write_buf_idx),
-                read_offset: [
-                    vref_from_addr!(addr, read_offset[0]),
-                    vref_from_addr!(addr, read_offset[1]),
-                ],
-                write_offset: [
-                    vref_from_addr!(addr, write_offset[0]),
-                    vref_from_addr!(addr, write_offset[1]),
-                ],
-                buffer_offset: [
-                    vref_from_addr!(addr, buffer_offset[0]),
-                    vref_from_addr!(addr, buffer_offset[1]),
-                ],
-            })
-        }
-    }
-
-    /// Calculates the length of a buffer with the given offset. This length will
-    /// be `used_size`, unless the offset is closer than `used_size` to the end
-    /// of samples, in which case the length will be as long as possible.
-    ///
-    /// If that buffer length is invalid (too small to hold a frame of audio data),
-    /// then returns an error.
-    /// The returned buffer length will be rounded down to a multiple of `frame_size`.
-    fn buffer_len_from_offset(&self, offset: usize) -> io::Result<usize> {
-        if offset > self.samples_len {
-            return Err(io::Error::new(
-                io::ErrorKind::InvalidInput,
-                format!(
-                    "Buffer offset {} exceeds the length of samples area ({}).",
-                    offset, self.samples_len
-                ),
-            ));
-        }
-
-        let used_size = self.get_used_size();
-        let frame_size = self.get_frame_size();
-
-        // We explicitly allow a buffer shorter than used_size, but only
-        // at the end of the samples area.
-        // This is useful if we're playing a file where the number of samples is
-        // not a multiple of used_size (meaning the length of the samples area
-        // won't be either). Then, the last buffer played will be smaller than
-        // used_size.
-        let mut buffer_length = used_size.min(self.samples_len - offset);
-        if buffer_length < frame_size {
-            return Err(io::Error::new(
-                io::ErrorKind::InvalidInput,
-                format!(
-                    "Buffer offset {} gives buffer length {} smaller than frame size {}.",
-                    offset, buffer_length, frame_size
-                ),
-            ));
-        }
-
-        // Round buffer_length down to a multiple of frame size
-        buffer_length = buffer_length / frame_size * frame_size;
-        Ok(buffer_length)
-    }
-
-    /// Gets the base of the write buffer and the writable length (rounded to `frame_size`).
-    /// Does not take into account the write offset.
-    ///
-    /// # Returns
-    ///
-    ///  * (`usize`, `usize`) - write buffer base as an offset from the start of
-    ///                         the samples area and buffer length in bytes.
-    pub fn get_write_offset_and_len(&self) -> io::Result<(usize, usize)> {
-        let idx = self.get_write_buf_idx() as usize;
-        let offset = self.get_buffer_offset(idx)?;
-        let len = self.buffer_len_from_offset(offset)?;
-
-        Ok((offset, len))
-    }
-
-    /// Gets the buffer offset of the read buffer.
-    ///
-    ///  # Returns
-    ///
-    ///  * `usize` - read offset in bytes
-    pub fn get_read_buffer_offset(&self) -> io::Result<usize> {
-        let idx = self.get_read_buf_idx() as usize;
-        self.get_buffer_offset(idx)
-    }
-
-    /// Gets the offset of a buffer from the start of samples.
-    ///
-    /// # Arguments
-    /// `index` - 0 <= `index` < `CRAS_NUM_SHM_BUFFERS`. The index of the buffer
-    /// for which we want the `buffer_offset`.
-    ///
-    /// # Returns
-    /// * `usize` - buffer offset in bytes
-    fn get_buffer_offset(&self, idx: usize) -> io::Result<usize> {
-        let buffer_offset = self
-            .buffer_offset
-            .get(idx)
-            .ok_or_else(index_out_of_range)?
-            .load() as usize;
-        self.check_buffer_offset(idx, buffer_offset)?;
-        Ok(buffer_offset)
-    }
-
-    /// Gets the number of bytes per frame from the shared memory structure.
-    ///
-    /// # Returns
-    ///
-    /// * `usize` - Number of bytes per frame
-    pub fn get_frame_size(&self) -> usize {
-        self.frame_size.load() as usize
-    }
-
-    /// Gets the max size in bytes of each shared memory buffer within
-    /// the samples area.
-    ///
-    /// # Returns
-    ///
-    /// * `usize` - Value of `used_size` fetched from the shared memory header.
-    pub fn get_used_size(&self) -> usize {
-        self.used_size.load() as usize
-    }
-
-    /// Gets the index of the current written buffer.
-    ///
-    /// # Returns
-    /// `u32` - the returned index is less than `CRAS_NUM_SHM_BUFFERS`.
-    fn get_write_buf_idx(&self) -> u32 {
-        self.write_buf_idx.load() & CRAS_SHM_BUFFERS_MASK
-    }
-
-    fn get_read_buf_idx(&self) -> u32 {
-        self.read_buf_idx.load() & CRAS_SHM_BUFFERS_MASK
-    }
-
-    /// Switches the written buffer.
-    fn switch_write_buf_idx(&mut self) {
-        self.write_buf_idx
-            .store(self.get_write_buf_idx() as u32 ^ 1u32)
-    }
-
-    /// Switches the buffer to read.
-    fn switch_read_buf_idx(&mut self) {
-        self.read_buf_idx
-            .store(self.get_read_buf_idx() as u32 ^ 1u32)
-    }
-
-    /// Checks if the offset value for setting write_offset or read_offset is
-    /// out of range or not.
-    ///
-    /// # Arguments
-    /// `idx` - The index of the buffer for which we're checking the offset.
-    /// `offset` - 0 <= `offset` <= `used_size` && `buffer_offset[idx]` + `offset` <=
-    /// `samples_len`. Writable or readable size equals to 0 when offset equals
-    /// to `used_size`.
-    ///
-    /// # Errors
-    /// Returns an error if `offset` is out of range or if idx is not a valid
-    /// buffer idx.
-    fn check_rw_offset(&self, idx: usize, offset: u32) -> io::Result<()> {
-        let buffer_len = self.buffer_len_from_offset(self.get_buffer_offset(idx)?)?;
-        if offset as usize > buffer_len {
-            return Err(io::Error::new(
-                io::ErrorKind::InvalidInput,
-                format!(
-                    "Offset {} is larger than buffer size {}.",
-                    offset, buffer_len
-                ),
-            ));
-        }
-
-        Ok(())
-    }
-
-    /// Sets `write_offset[idx]` to the count of written bytes.
-    ///
-    /// # Arguments
-    /// `idx` - 0 <= `idx` < `CRAS_NUM_SHM_BUFFERS`
-    /// `offset` - 0 <= `offset` <= `used_size` && `offset` + `used_size` <=
-    /// `samples_len`. Writable size equals to 0 when offset equals to
-    /// `used_size`.
-    ///
-    /// # Errors
-    /// Returns an error if `offset` is out of range.
-    fn set_write_offset(&mut self, idx: usize, offset: u32) -> io::Result<()> {
-        self.check_rw_offset(idx, offset)?;
-        let write_offset = self.write_offset.get(idx).ok_or_else(index_out_of_range)?;
-        write_offset.store(offset);
-        Ok(())
-    }
-
-    /// Sets `read_offset[idx]` to count of written bytes.
-    ///
-    /// # Arguments
-    /// `idx` - 0 <= `idx` < `CRAS_NUM_SHM_BUFFERS`
-    /// `offset` - 0 <= `offset` <= `used_size` && `offset` + `used_size` <=
-    /// `samples_len`. Readable size equals to 0 when offset equals to
-    /// `used_size`.
-    ///
-    /// # Errors
-    /// Returns error if index out of range.
-    fn set_read_offset(&mut self, idx: usize, offset: u32) -> io::Result<()> {
-        self.check_rw_offset(idx, offset)?;
-        let read_offset = self.read_offset.get(idx).ok_or_else(index_out_of_range)?;
-        read_offset.store(offset);
-        Ok(())
-    }
-
-    /// Check that `offset` is a valid buffer offset for the buffer at `idx`
-    /// An offset is not valid if it is
-    ///  * outside of the samples area
-    ///  * overlaps some other buffer `[other_offset, other_offset + used_size)`
-    ///  * is close enough to the end of the samples area that the buffer would
-    ///    be shorter than `frame_size`.
-    fn check_buffer_offset(&self, idx: usize, offset: usize) -> io::Result<()> {
-        let start = offset;
-        let end = start + self.buffer_len_from_offset(start)?;
-
-        let other_idx = (idx ^ 1) as usize;
-        let other_start = self
-            .buffer_offset
-            .get(other_idx)
-            .ok_or_else(index_out_of_range)?
-            .load() as usize;
-        let other_end = other_start + self.buffer_len_from_offset(other_start)?;
-        if start < other_end && other_start < end {
-            // Special case: occasionally we get the same buffer offset twice
-            // from the intel8x0 kernel driver in crosvm's AC97 device, and we
-            // don't want to crash in that case.
-            if start == other_start && end == other_end {
-                warn!(
-                    "Setting buffer {} to same index/offset as buffer {}, [{}, {})",
-                    idx, other_idx, other_start, other_end
-                );
-            } else {
-                return Err(io::Error::new(
-                    io::ErrorKind::InvalidInput,
-                    format!(
-                        "Setting buffer {} to [{}, {}) overlaps buffer {} at [{}, {})",
-                        idx, start, end, other_idx, other_start, other_end,
-                    ),
-                ));
-            }
-        }
-        Ok(())
-    }
-
-    /// Sets the location of the audio buffer `idx` within the samples area to
-    /// `offset`, so that CRAS will read/write samples for that buffer from that
-    /// offset.
-    ///
-    /// # Arguments
-    /// `idx` - 0 <= `idx` < `CRAS_NUM_SHM_BUFFERS`
-    /// `offset` - 0 <= `offset` && `offset` + `frame_size` <= `samples_len`
-    ///
-    /// # Errors
-    /// If `idx` is out of range
-    /// If the offset is invalid, which can happen if `offset` is
-    ///  * outside of the samples area
-    ///  * overlaps some other buffer `[other_offset, other_offset + used_size)`
-    ///  * is close enough to the end of the samples area that the buffer would
-    ///    be shorter than `frame_size`.
-    pub fn set_buffer_offset(&mut self, idx: usize, offset: usize) -> io::Result<()> {
-        self.check_buffer_offset(idx, offset)?;
-
-        let buffer_offset = self.buffer_offset.get(idx).ok_or_else(index_out_of_range)?;
-        buffer_offset.store(offset as u64);
-        Ok(())
-    }
-
-    /// Commits written frames by switching the current buffer to the other one
-    /// after samples are ready and indexes of current buffer are all set.
-    /// - Sets `write_offset` of current buffer to `frame_count * frame_size`
-    /// - Sets `read_offset` of current buffer to `0`.
-    ///
-    /// # Arguments
-    ///
-    /// * `frame_count` - Number of frames written to the current buffer
-    ///
-    /// # Errors
-    ///
-    /// * Returns error if `frame_count` is larger than buffer size
-    ///
-    /// This function is safe because we switch `write_buf_idx` after letting
-    /// `write_offset` and `read_offset` ready and we read / write shared memory
-    /// variables with volatile operations.
-    pub fn commit_written_frames(&mut self, frame_count: u32) -> io::Result<()> {
-        // Uses `u64` to prevent possible overflow
-        let byte_count = frame_count as u64 * self.get_frame_size() as u64;
-        if byte_count > self.get_used_size() as u64 {
-            Err(io::Error::new(
-                io::ErrorKind::InvalidInput,
-                "frame_count * frame_size is larger than used_size",
-            ))
-        } else {
-            let idx = self.get_write_buf_idx() as usize;
-            // Sets `write_offset` of current buffer to frame_count * frame_size
-            self.set_write_offset(idx, byte_count as u32)?;
-            // Sets `read_offset` of current buffer to `0`.
-            self.set_read_offset(idx, 0)?;
-            // Switch to the other buffer
-            self.switch_write_buf_idx();
-            Ok(())
-        }
-    }
-
-    /// Get readable frames in current buffer.
-    ///
-    /// # Returns
-    ///
-    /// * `usize` - number of readable frames.
-    ///
-    /// # Errors
-    ///
-    /// Returns error if index out of range.
-    pub fn get_readable_frames(&self) -> io::Result<usize> {
-        let idx = self.get_read_buf_idx() as usize;
-        let read_offset = self.read_offset.get(idx).ok_or_else(index_out_of_range)?;
-        let write_offset = self.write_offset.get(idx).ok_or_else(index_out_of_range)?;
-        let nframes =
-            (write_offset.load() as i32 - read_offset.load() as i32) / self.get_frame_size() as i32;
-        if nframes < 0 {
-            Ok(0)
-        } else {
-            Ok(nframes as usize)
-        }
-    }
-
-    /// Commit read frames from reader, .
-    /// - Sets `read_offset` of current buffer to `read_offset + frame_count * frame_size`.
-    /// If `read_offset` is larger than or equal to `write_offset`, then
-    /// - Sets `read_offset` and `write_offset` to `0` and switch `read_buf_idx`.
-    ///
-    /// # Arguments
-    ///
-    /// * `frame_count` - Read frames in current read buffer.
-    ///
-    /// # Errors
-    ///
-    /// Returns error if index out of range.
-    pub fn commit_read_frames(&mut self, frame_count: u32) -> io::Result<()> {
-        let idx = self.get_read_buf_idx() as usize;
-        let read_offset = self.read_offset.get(idx).ok_or_else(index_out_of_range)?;
-        let write_offset = self.write_offset.get(idx).ok_or_else(index_out_of_range)?;
-        read_offset.store(read_offset.load() + frame_count * self.get_frame_size() as u32);
-        if read_offset.load() >= write_offset.load() {
-            read_offset.store(0);
-            write_offset.store(0);
-            self.switch_read_buf_idx();
-        }
-        Ok(())
-    }
-}
-
-impl<'a> Drop for CrasAudioHeader<'a> {
-    fn drop(&mut self) {
-        // Safe because all references must be gone by the time drop is called.
-        unsafe {
-            libc::munmap(self.addr as *mut _, mem::size_of::<cras_audio_shm_header>());
-        }
-    }
-}
-
-// To use this safely, we need to make sure
-// - The given fd contains valid space which is larger than `len` + `offset`
-unsafe fn cras_mmap_offset(
-    len: usize,
-    prot: libc::c_int,
-    fd: libc::c_int,
-    offset: usize,
-) -> io::Result<*mut libc::c_void> {
-    if offset > libc::off_t::max_value() as usize {
-        return Err(io::Error::new(
-            io::ErrorKind::InvalidInput,
-            "Requested offset is out of range of `libc::off_t`.",
-        ));
-    }
-    // It's safe because we handle its returned results.
-    match libc::mmap(
-        ptr::null_mut(),
-        len,
-        prot,
-        libc::MAP_SHARED,
-        fd,
-        offset as libc::off_t,
-    ) {
-        libc::MAP_FAILED => Err(io::Error::last_os_error()),
-        shm_ptr => Ok(shm_ptr),
-    }
-}
-
-// To use this safely, we need to make sure
-// - The given fd contains valid space which is larger than `len`
-unsafe fn cras_mmap(
-    len: usize,
-    prot: libc::c_int,
-    fd: libc::c_int,
-) -> io::Result<*mut libc::c_void> {
-    cras_mmap_offset(len, prot, fd, 0)
-}
-
-/// An unsafe macro for getting a `VolatileSlice` representing an entire array
-/// field from a given NonNull pointer.
-///
-/// To use this macro safely, we need to
-/// - Make sure the pointer address is readable and writeable for its struct.
-/// - Make sure all `VolatileSlice`s generated from this macro have exclusive ownership for the same
-/// pointer.
-/// - Make sure the length of the array field is non-zero.
-#[macro_export]
-macro_rules! vslice_from_addr {
-    ($addr:ident, $($field:ident).*) => {{
-        let ptr = &mut $addr.as_mut().$($field).* as *mut _ as *mut u8;
-        let size = std::mem::size_of_val(&$addr.as_mut().$($field).*);
-        VolatileSlice::from_raw_parts(ptr, size)
-    }};
-}
-
-/// A structure that points to RO shared memory area - `cras_server_state`
-/// The structure is created from a shared memory fd which contains the structure.
-#[derive(Debug)]
-pub struct CrasServerState<'a> {
-    addr: *mut libc::c_void,
-    volume: VolatileRef<'a, u32>,
-    mute: VolatileRef<'a, i32>,
-    num_output_devs: VolatileRef<'a, u32>,
-    output_devs: VolatileSlice<'a>,
-    num_input_devs: VolatileRef<'a, u32>,
-    input_devs: VolatileSlice<'a>,
-    num_output_nodes: VolatileRef<'a, u32>,
-    num_input_nodes: VolatileRef<'a, u32>,
-    output_nodes: VolatileSlice<'a>,
-    input_nodes: VolatileSlice<'a>,
-    update_count: VolatileRef<'a, u32>,
-    debug_info_num_devs: VolatileRef<'a, u32>,
-    debug_info_devs: VolatileSlice<'a>,
-    debug_info_num_streams: VolatileRef<'a, u32>,
-    debug_info_streams: VolatileSlice<'a>,
-}
-
-// It is safe to send server_state between threads as this struct has exclusive
-// ownership of the shared memory area contained in it.
-unsafe impl<'a> Send for CrasServerState<'a> {}
-
-impl<'a> CrasServerState<'a> {
-    /// Create a CrasServerState
-    pub fn try_new(state_fd: CrasServerStateShmFd) -> io::Result<Self> {
-        // Safe because the creator of CrasServerStateShmFd already
-        // ensured that state_fd contains a cras_server_state.
-        let mmap_addr =
-            unsafe { cras_mmap(state_fd.fd.size, libc::PROT_READ, state_fd.fd.as_raw_fd())? };
-
-        let mut addr = NonNull::new(mmap_addr as *mut cras_server_state).ok_or_else(|| {
-            io::Error::new(io::ErrorKind::Other, "Failed to create CrasServerState.")
-        })?;
-
-        // Safe because we know that addr is a non-null pointer to cras_server_state.
-        let state_version = unsafe { vref_from_addr!(addr, state_version) };
-        if state_version.load() != CRAS_SERVER_STATE_VERSION {
-            return Err(io::Error::new(
-                io::ErrorKind::Other,
-                format!(
-                    "CrasServerState version {} does not match expected version {}",
-                    state_version.load(),
-                    CRAS_SERVER_STATE_VERSION
-                ),
-            ));
-        }
-
-        // Safe because we know that mmap_addr (contained in addr) contains a
-        // cras_server_state, and the mapped area will be exclusively
-        // owned by this struct.
-        unsafe {
-            Ok(CrasServerState {
-                addr: addr.as_ptr() as *mut libc::c_void,
-                volume: vref_from_addr!(addr, volume),
-                mute: vref_from_addr!(addr, mute),
-                num_output_devs: vref_from_addr!(addr, num_output_devs),
-                num_input_devs: vref_from_addr!(addr, num_input_devs),
-                output_devs: vslice_from_addr!(addr, output_devs),
-                input_devs: vslice_from_addr!(addr, input_devs),
-                num_output_nodes: vref_from_addr!(addr, num_output_nodes),
-                num_input_nodes: vref_from_addr!(addr, num_input_nodes),
-                output_nodes: vslice_from_addr!(addr, output_nodes),
-                input_nodes: vslice_from_addr!(addr, input_nodes),
-                update_count: vref_from_addr!(addr, update_count),
-                debug_info_num_devs: vref_from_addr!(addr, audio_debug_info.num_devs),
-                debug_info_devs: vslice_from_addr!(addr, audio_debug_info.devs),
-                debug_info_num_streams: vref_from_addr!(addr, audio_debug_info.num_streams),
-                debug_info_streams: vslice_from_addr!(addr, audio_debug_info.streams),
-            })
-        }
-    }
-
-    /// Gets the system volume.
-    ///
-    /// Read the current value for system volume from shared memory.
-    pub fn get_system_volume(&self) -> u32 {
-        self.volume.load()
-    }
-
-    /// Gets the system mute.
-    ///
-    /// Read the current value for system mute from shared memory.
-    pub fn get_system_mute(&self) -> bool {
-        self.mute.load() != 0
-    }
-
-    /// Runs a closure safely such that it can be sure that the server state
-    /// was not updated during the read.
-    /// This can be used for an "atomic" read of non-atomic data from the
-    /// state shared memory.
-    fn synchronized_state_read<F, T>(&self, mut func: F) -> T
-    where
-        F: FnMut() -> T,
-    {
-        // Waits until the server has completed a state update before returning
-        // the current update count.
-        let begin_server_state_read = || -> u32 {
-            loop {
-                let update_count = self.update_count.load();
-                if update_count % 2 == 0 {
-                    atomic::fence(Ordering::Acquire);
-                    return update_count;
-                } else {
-                    thread::yield_now();
-                }
-            }
-        };
-
-        // Checks that the update count has not changed since the start
-        // of the server state read.
-        let end_server_state_read = |count: u32| -> bool {
-            let result = count == self.update_count.load();
-            atomic::fence(Ordering::Release);
-            result
-        };
-
-        // Get the state's update count and run the provided closure.
-        // If the update count has not changed once the closure is finished,
-        // return the result, otherwise repeat the process.
-        loop {
-            let update_count = begin_server_state_read();
-            let result = func();
-            if end_server_state_read(update_count) {
-                return result;
-            }
-        }
-    }
-
-    /// Gets a list of output devices
-    ///
-    /// Read a list of the currently attached output devices from shared memory.
-    pub fn output_devices(&self) -> impl Iterator<Item = CrasIodevInfo> {
-        let mut devs: Vec<cras_iodev_info> = vec![Default::default(); CRAS_MAX_IODEVS as usize];
-        let num_devs = self.synchronized_state_read(|| {
-            self.output_devs.copy_to(&mut devs);
-            self.num_output_devs.load()
-        });
-        devs.into_iter()
-            .take(num_devs as usize)
-            .map(CrasIodevInfo::from)
-    }
-
-    /// Gets a list of input devices
-    ///
-    /// Read a list of the currently attached input devices from shared memory.
-    pub fn input_devices(&self) -> impl Iterator<Item = CrasIodevInfo> {
-        let mut devs: Vec<cras_iodev_info> = vec![Default::default(); CRAS_MAX_IODEVS as usize];
-        let num_devs = self.synchronized_state_read(|| {
-            self.input_devs.copy_to(&mut devs);
-            self.num_input_devs.load()
-        });
-        devs.into_iter()
-            .take(num_devs as usize)
-            .map(CrasIodevInfo::from)
-    }
-
-    /// Gets a list of output nodes
-    ///
-    /// Read a list of the currently attached output nodes from shared memory.
-    pub fn output_nodes(&self) -> impl Iterator<Item = CrasIonodeInfo> {
-        let mut nodes: Vec<cras_ionode_info> = vec![Default::default(); CRAS_MAX_IONODES as usize];
-        let num_nodes = self.synchronized_state_read(|| {
-            self.output_nodes.copy_to(&mut nodes);
-            self.num_output_nodes.load()
-        });
-        nodes
-            .into_iter()
-            .take(num_nodes as usize)
-            .map(CrasIonodeInfo::from)
-    }
-
-    /// Gets a list of input nodes
-    ///
-    /// Read a list of the currently attached input nodes from shared memory.
-    pub fn input_nodes(&self) -> impl Iterator<Item = CrasIonodeInfo> {
-        let mut nodes: Vec<cras_ionode_info> = vec![Default::default(); CRAS_MAX_IONODES as usize];
-        let num_nodes = self.synchronized_state_read(|| {
-            self.input_nodes.copy_to(&mut nodes);
-            self.num_input_nodes.load()
-        });
-        nodes
-            .into_iter()
-            .take(num_nodes as usize)
-            .map(CrasIonodeInfo::from)
-    }
-
-    /// Get audio debug info
-    ///
-    /// Loads the server's audio_debug_info struct and converts it into an
-    /// idiomatic rust representation.
-    ///
-    /// # Errors
-    /// * If any of the stream debug information structs are invalid.
-    pub fn get_audio_debug_info(&self) -> Result<AudioDebugInfo, cras_sys::Error> {
-        let mut devs: Vec<audio_dev_debug_info> = vec![Default::default(); MAX_DEBUG_DEVS as usize];
-        let mut streams: Vec<audio_stream_debug_info> =
-            vec![Default::default(); MAX_DEBUG_STREAMS as usize];
-        let (num_devs, num_streams) = self.synchronized_state_read(|| {
-            self.debug_info_devs.copy_to(&mut devs);
-            self.debug_info_streams.copy_to(&mut streams);
-            (
-                self.debug_info_num_devs.load(),
-                self.debug_info_num_streams.load(),
-            )
-        });
-        let dev_info = devs
-            .into_iter()
-            .take(num_devs as usize)
-            .map(AudioDevDebugInfo::from)
-            .collect();
-        let stream_info = streams
-            .into_iter()
-            .take(num_streams as usize)
-            .map(AudioStreamDebugInfo::try_from)
-            .collect::<Result<Vec<_>, _>>()?;
-        Ok(AudioDebugInfo::new(dev_info, stream_info))
-    }
-}
-
-impl<'a> Drop for CrasServerState<'a> {
-    /// Call `munmap` for `addr`.
-    fn drop(&mut self) {
-        unsafe {
-            // Safe because all references must be gone by the time drop is called.
-            libc::munmap(self.addr, mem::size_of::<cras_server_state>());
-        }
-    }
-}
-
-/// A structure holding the mapped shared memory area used to exchange
-/// samples with CRAS. The shared memory is owned exclusively by this structure,
-/// and will be cleaned up on drop.
-/// * `addr` - The address of the mapped shared memory.
-/// * `len` - Length of the mapped shared memory in bytes.
-pub struct CrasAudioBuffer {
-    addr: *mut u8,
-    len: usize,
-}
-
-// It is safe to send audio buffers between threads as this struct has exclusive ownership of the
-// shared memory area contained in it.
-unsafe impl Send for CrasAudioBuffer {}
-
-impl CrasAudioBuffer {
-    fn new(samples_fd: CrasShmFd) -> io::Result<Self> {
-        // This is safe because we checked that the size of the shm in samples_fd
-        // was at least samples_fd.size when it was created.
-        let addr = unsafe {
-            cras_mmap(
-                samples_fd.size,
-                libc::PROT_READ | libc::PROT_WRITE,
-                samples_fd.as_raw_fd(),
-            )? as *mut u8
-        };
-        Ok(Self {
-            addr,
-            len: samples_fd.size,
-        })
-    }
-
-    /// Provides a mutable slice to be filled with audio samples.
-    pub fn get_buffer(&mut self) -> &mut [u8] {
-        // This is safe because it takes a mutable reference to self, and there can only be one
-        // taken at a time. Although this is shared memory, the reader side must have it mapped as
-        // read only.
-        unsafe { slice::from_raw_parts_mut(self.addr, self.len) }
-    }
-}
-
-impl Drop for CrasAudioBuffer {
-    fn drop(&mut self) {
-        // Safe because all references must be gone by the time drop is called.
-        unsafe {
-            libc::munmap(self.addr as *mut _, self.len);
-        }
-    }
-}
-
-/// Creates header and buffer from given shared memory fds.
-pub fn create_header_and_buffers<'a>(
-    header_fd: CrasAudioShmHeaderFd,
-    samples_fd: CrasShmFd,
-) -> io::Result<(CrasAudioHeader<'a>, CrasAudioBuffer)> {
-    let header = CrasAudioHeader::new(header_fd, samples_fd.size)?;
-    let buffer = CrasAudioBuffer::new(samples_fd)?;
-
-    Ok((header, buffer))
-}
-
-/// Creates header from header shared memory fds. Use this function
-/// when mapping the samples shm is not necessary, for instance with a
-/// client-provided shm stream.
-pub fn create_header<'a>(
-    header_fd: CrasAudioShmHeaderFd,
-    samples_len: usize,
-) -> io::Result<CrasAudioHeader<'a>> {
-    Ok(CrasAudioHeader::new(header_fd, samples_len)?)
-}
-
-/// A structure wrapping a fd which contains a shared memory area and its size.
-/// * `fd` - The shared memory file descriptor, a `libc::c_int`.
-/// * `size` - Size of the shared memory area.
-pub struct CrasShmFd {
-    fd: libc::c_int,
-    size: usize,
-}
-
-impl CrasShmFd {
-    /// Creates a `CrasShmFd` by shared memory fd and size
-    /// # Arguments
-    /// * `fd` - A shared memory file descriptor, which will be owned by the resulting structure and
-    /// the fd will be closed on drop.
-    /// * `size` - Size of the shared memory.
-    ///
-    /// # Returns
-    /// * `CrasShmFd` - Wrap the input arguments without doing anything.
-    ///
-    /// To use this function safely, we need to make sure
-    /// - The input fd is a valid shared memory fd.
-    /// - The input shared memory fd won't be used by others.
-    /// - The input fd contains memory size larger than `size`.
-    pub unsafe fn new(fd: libc::c_int, size: usize) -> CrasShmFd {
-        CrasShmFd { fd, size }
-    }
-}
-
-impl AsRawFd for CrasShmFd {
-    fn as_raw_fd(&self) -> RawFd {
-        self.fd
-    }
-}
-
-impl Drop for CrasShmFd {
-    fn drop(&mut self) {
-        // It's safe here if we make sure
-        // - the input fd is valid and
-        // - `CrasShmFd` is the only owner
-        // in `new` function
-        unsafe {
-            libc::close(self.fd);
-        }
-    }
-}
-
-/// A structure wrapping a fd which contains a shared `cras_server_state`.
-/// * `shm_fd` - A shared memory fd contains a `cras_server_state`
-pub struct CrasServerStateShmFd {
-    fd: CrasShmFd,
-}
-
-impl CrasServerStateShmFd {
-    /// Creates a `CrasServerStateShmFd` by shared memory fd
-    /// # Arguments
-    /// * `fd` - A shared memory file descriptor, which will be owned by the resulting structure and
-    /// the fd will be closed on drop.
-    ///
-    /// # Returns
-    /// A structure wrapping a `CrasShmFd` with the input fd and `size` which equals to
-    /// the size of `cras_server_sate`.
-    ///
-    /// To use this function safely, we need to make sure
-    /// - The input fd is a valid shared memory fd.
-    /// - The input shared memory fd won't be used by others.
-    /// - The shared memory area in the input fd contains a `cras_server_state`.
-    pub unsafe fn new(fd: libc::c_int) -> Self {
-        Self {
-            fd: CrasShmFd::new(fd, mem::size_of::<cras_server_state>()),
-        }
-    }
-}
-
-#[cfg(test)]
-mod tests {
-    use super::*;
-    use std::fs::File;
-    use std::os::unix::io::IntoRawFd;
-    use std::sync::{Arc, Mutex};
-    use std::thread;
-    use sys_util::{kernel_has_memfd, SharedMemory};
-
-    #[test]
-    fn cras_audio_header_switch_test() {
-        if !kernel_has_memfd() {
-            return;
-        }
-        let mut header = create_cras_audio_header(20);
-        assert_eq!(0, header.get_write_buf_idx());
-        header.switch_write_buf_idx();
-        assert_eq!(1, header.get_write_buf_idx());
-    }
-
-    #[test]
-    fn cras_audio_header_write_offset_test() {
-        if !kernel_has_memfd() {
-            return;
-        }
-        let mut header = create_cras_audio_header(20);
-        header.frame_size.store(2);
-        header.used_size.store(5);
-        header.set_buffer_offset(0, 12).unwrap();
-
-        assert_eq!(0, header.write_offset[0].load());
-        // Index out of bound
-        assert!(header.set_write_offset(2, 5).is_err());
-        // Offset out of bound
-        // Buffer length is 4, since that's the largest multiple of frame_size
-        // less than used_size.
-        assert!(header.set_write_offset(0, 6).is_err());
-        assert_eq!(0, header.write_offset[0].load());
-        assert!(header.set_write_offset(0, 5).is_err());
-        assert_eq!(0, header.write_offset[0].load());
-        assert!(header.set_write_offset(0, 4).is_ok());
-        assert_eq!(4, header.write_offset[0].load());
-    }
-
-    #[test]
-    fn cras_audio_header_read_offset_test() {
-        if !kernel_has_memfd() {
-            return;
-        }
-        let mut header = create_cras_audio_header(20);
-        header.frame_size.store(2);
-        header.used_size.store(5);
-        header.set_buffer_offset(0, 12).unwrap();
-
-        assert_eq!(0, header.read_offset[0].load());
-        // Index out of bound
-        assert!(header.set_read_offset(2, 5).is_err());
-        // Offset out of bound
-        // Buffer length is 4, since that's the largest multiple of frame_size
-        // less than used_size.
-        assert!(header.set_read_offset(0, 6).is_err());
-        assert_eq!(0, header.read_offset[0].load());
-        assert!(header.set_read_offset(0, 5).is_err());
-        assert_eq!(0, header.read_offset[0].load());
-        assert!(header.set_read_offset(0, 4).is_ok());
-        assert_eq!(4, header.read_offset[0].load());
-    }
-
-    #[test]
-    fn cras_audio_header_commit_written_frame_test() {
-        if !kernel_has_memfd() {
-            return;
-        }
-        let mut header = create_cras_audio_header(20);
-        header.frame_size.store(2);
-        header.used_size.store(10);
-        header.read_offset[0].store(10);
-        header.set_buffer_offset(0, 10).unwrap();
-
-        assert!(header.commit_written_frames(5).is_ok());
-        assert_eq!(header.write_offset[0].load(), 10);
-        assert_eq!(header.read_offset[0].load(), 0);
-        assert_eq!(header.write_buf_idx.load(), 1);
-    }
-
-    #[test]
-    fn cras_audio_header_get_readable_frames_test() {
-        if !kernel_has_memfd() {
-            return;
-        }
-        let header = create_cras_audio_header(20);
-        header.frame_size.store(2);
-        header.used_size.store(10);
-        header.read_offset[0].store(2);
-        header.write_offset[0].store(10);
-        let frames = header
-            .get_readable_frames()
-            .expect("Failed to get readable frames.");
-        assert_eq!(frames, 4);
-    }
-
-    #[test]
-    fn cras_audio_header_commit_read_frames_test() {
-        if !kernel_has_memfd() {
-            return;
-        }
-        let mut header = create_cras_audio_header(20);
-        header.frame_size.store(2);
-        header.used_size.store(10);
-        header.read_offset[0].store(2);
-        header.write_offset[0].store(10);
-        header
-            .commit_read_frames(3)
-            .expect("Failed to commit read frames.");
-        assert_eq!(header.get_read_buf_idx(), 0);
-        assert_eq!(header.read_offset[0].load(), 8);
-
-        header
-            .commit_read_frames(1)
-            .expect("Failed to commit read frames.");
-        // Read buffer should be switched
-        assert_eq!(header.get_read_buf_idx(), 1);
-        assert_eq!(header.read_offset[0].load(), 0);
-        assert_eq!(header.read_offset[0].load(), 0);
-    }
-
-    #[test]
-    fn cras_audio_header_get_write_offset_and_len() {
-        if !kernel_has_memfd() {
-            return;
-        }
-        let header = create_cras_audio_header(30);
-        header.frame_size.store(2);
-        header.used_size.store(10);
-        header.write_buf_idx.store(0);
-        header.read_offset[0].store(0);
-        header.write_offset[0].store(0);
-        header.buffer_offset[0].store(0);
-
-        header.read_buf_idx.store(1);
-        header.read_offset[1].store(0);
-        header.write_offset[1].store(0);
-        header.buffer_offset[1].store(10);
-
-        // standard offsets and lens
-        let (offset, len) = header.get_write_offset_and_len().unwrap();
-        assert_eq!(offset, 0);
-        assert_eq!(len, 10);
-
-        header.write_buf_idx.store(1);
-        header.read_buf_idx.store(0);
-        let (offset, len) = header.get_write_offset_and_len().unwrap();
-        assert_eq!(offset, 10);
-        assert_eq!(len, 10);
-
-        // relocate buffer offsets
-        header.buffer_offset[1].store(16);
-        let (offset, len) = header.get_write_offset_and_len().unwrap();
-        assert_eq!(offset, 16);
-        assert_eq!(len, 10);
-
-        header.buffer_offset[0].store(5);
-        header.write_buf_idx.store(0);
-        let (offset, len) = header.get_write_offset_and_len().unwrap();
-        assert_eq!(offset, 5);
-        assert_eq!(len, 10);
-
-        header.write_buf_idx.store(0);
-        header.buffer_offset[0].store(2);
-        header.read_buf_idx.store(1);
-        header.buffer_offset[1].store(10);
-        let result = header.get_write_offset_and_len();
-        // Should be an error as write buffer would overrun into other buffer.
-        assert!(result.is_err());
-
-        header.buffer_offset[0].store(24);
-        header.buffer_offset[1].store(10);
-        let (offset, len) = header.get_write_offset_and_len().unwrap();
-        // Should be ok since we're only running up against the end of samples.
-        assert_eq!(offset, 24);
-        assert_eq!(len, 6);
-
-        header.buffer_offset[0].store(25);
-        let (offset, len) = header.get_write_offset_and_len().unwrap();
-        // Should be ok, but we'll truncate len to frame_size.
-        assert_eq!(offset, 25);
-        assert_eq!(len, 4);
-
-        header.buffer_offset[0].store(29);
-        let result = header.get_write_offset_and_len();
-        // Should be an error as buffer is smaller than frame_size.
-        assert!(result.is_err());
-    }
-
-    #[test]
-    fn cras_audio_header_set_buffer_offset() {
-        if !kernel_has_memfd() {
-            return;
-        }
-        let mut header = create_cras_audio_header(30);
-        header.frame_size.store(2);
-        header.used_size.store(10);
-        header.write_buf_idx.store(0);
-        header.read_offset[0].store(0);
-        header.write_offset[0].store(0);
-        header.buffer_offset[0].store(0);
-
-        header.read_buf_idx.store(1);
-        header.read_offset[1].store(0);
-        header.write_offset[1].store(0);
-        header.buffer_offset[1].store(10);
-
-        // Setting buffer_offset to exactly overlap with other buffer is okay
-        assert!(header.set_buffer_offset(0, 10).is_ok());
-
-        // Setting buffer_offset to partially overlap other buffer is not okay
-        assert!(header.set_buffer_offset(0, 9).is_err());
-
-        header.buffer_offset[0].store(0);
-        header.write_offset[1].store(8);
-        // With samples, it's still an error.
-        assert!(header.set_buffer_offset(0, 9).is_err());
-
-        // Setting the offset past the end of the other buffer is okay
-        assert!(header.set_buffer_offset(0, 20).is_ok());
-
-        // Setting buffer offset such that buffer length is less than used_size
-        // is okay, but only at the end of the samples area.
-        assert!(header.set_buffer_offset(0, 21).is_ok());
-        assert!(header.set_buffer_offset(0, 27).is_ok());
-
-        // It's not okay if we get a buffer with length less than frame_size.
-        assert!(header.set_buffer_offset(0, 29).is_err());
-        assert!(header.set_buffer_offset(0, 30).is_err());
-
-        // If we try to overlap another buffer with that other buffer at the end,
-        // it's not okay, unless it's the exact same index.
-        assert!(header.set_buffer_offset(1, 25).is_err());
-        assert!(header.set_buffer_offset(1, 27).is_ok());
-        assert!(header.set_buffer_offset(1, 28).is_err());
-
-        // Setting buffer offset past the end of samples is an error.
-        assert!(header.set_buffer_offset(0, 33).is_err());
-    }
-
-    #[test]
-    fn create_header_and_buffers_test() {
-        if !kernel_has_memfd() {
-            return;
-        }
-        let header_fd = cras_audio_header_fd();
-        let samples_fd = cras_audio_samples_fd(20);
-        let res = create_header_and_buffers(header_fd, samples_fd);
-        res.expect("Failed to create header and buffer.");
-    }
-
-    fn create_shm(size: usize) -> File {
-        let mut shm = SharedMemory::new(None).expect("failed to create shm");
-        shm.set_size(size as u64).expect("failed to set shm size");
-        shm.into()
-    }
-
-    fn create_cras_audio_header<'a>(samples_len: usize) -> CrasAudioHeader<'a> {
-        CrasAudioHeader::new(cras_audio_header_fd(), samples_len).unwrap()
-    }
-
-    fn cras_audio_header_fd() -> CrasAudioShmHeaderFd {
-        let size = mem::size_of::<cras_audio_shm_header>();
-        let shm = create_shm(size);
-        unsafe { CrasAudioShmHeaderFd::new(shm.into_raw_fd()) }
-    }
-
-    fn cras_audio_samples_fd(size: usize) -> CrasShmFd {
-        let shm = create_shm(size);
-        unsafe { CrasShmFd::new(shm.into_raw_fd(), size) }
-    }
-
-    #[test]
-    fn cras_mmap_pass() {
-        if !kernel_has_memfd() {
-            return;
-        }
-        let shm = create_shm(100);
-        let rc = unsafe { cras_mmap(10, libc::PROT_READ, shm.as_raw_fd()) };
-        assert!(rc.is_ok());
-        unsafe { libc::munmap(rc.unwrap(), 10) };
-    }
-
-    #[test]
-    fn cras_mmap_failed() {
-        if !kernel_has_memfd() {
-            return;
-        }
-        let rc = unsafe { cras_mmap(10, libc::PROT_READ, -1) };
-        assert!(rc.is_err());
-    }
-
-    #[test]
-    fn cras_server_state() {
-        let size = mem::size_of::<cras_server_state>();
-        let shm = create_shm(size);
-        unsafe {
-            let addr = cras_mmap(size, libc::PROT_WRITE, shm.as_raw_fd())
-                .expect("failed to mmap state shm");
-            {
-                let state: &mut cras_server_state = &mut *(addr as *mut cras_server_state);
-                state.state_version = CRAS_SERVER_STATE_VERSION;
-                state.volume = 47;
-                state.mute = 1;
-            }
-            libc::munmap(addr, size);
-        };
-        let state_fd = unsafe { CrasServerStateShmFd::new(shm.into_raw_fd()) };
-        let state =
-            CrasServerState::try_new(state_fd).expect("try_new failed for valid server_state fd");
-        assert_eq!(state.get_system_volume(), 47);
-        assert_eq!(state.get_system_mute(), true);
-    }
-
-    #[test]
-    fn cras_server_state_old_version() {
-        let size = mem::size_of::<cras_server_state>();
-        let shm = create_shm(size);
-        unsafe {
-            let addr = cras_mmap(size, libc::PROT_WRITE, shm.as_raw_fd())
-                .expect("failed to mmap state shm");
-            {
-                let state: &mut cras_server_state = &mut *(addr as *mut cras_server_state);
-                state.state_version = CRAS_SERVER_STATE_VERSION - 1;
-                state.volume = 29;
-                state.mute = 0;
-            }
-            libc::munmap(addr, size);
-        };
-        let state_fd = unsafe { CrasServerStateShmFd::new(shm.into_raw_fd()) };
-        CrasServerState::try_new(state_fd)
-            .expect_err("try_new succeeded for invalid state version");
-    }
-
-    #[test]
-    fn cras_server_sync_state_read() {
-        let size = mem::size_of::<cras_server_state>();
-        let shm = create_shm(size);
-        let addr = unsafe { cras_mmap(size, libc::PROT_WRITE, shm.as_raw_fd()).unwrap() };
-        let state: &mut cras_server_state = unsafe { &mut *(addr as *mut cras_server_state) };
-        state.state_version = CRAS_SERVER_STATE_VERSION;
-        state.update_count = 14;
-        state.volume = 12;
-
-        let state_fd = unsafe { CrasServerStateShmFd::new(shm.into_raw_fd()) };
-        let state_struct = CrasServerState::try_new(state_fd).unwrap();
-
-        // Create a lock so that we can block the reader while we change the
-        // update_count;
-        let lock = Arc::new(Mutex::new(()));
-        let thread_lock = lock.clone();
-        let reader_thread = {
-            let _guard = lock.lock().unwrap();
-
-            // Create reader thread that will get the value of volume. Since we
-            // hold the lock currently, this will block until we release the lock.
-            let reader_thread = thread::spawn(move || {
-                state_struct.synchronized_state_read(|| {
-                    let _guard = thread_lock.lock().unwrap();
-                    state_struct.volume.load()
-                })
-            });
-
-            // Update volume and change update count so that the synchronized read
-            // will not return (odd update count means update in progress).
-            state.volume = 27;
-            state.update_count = 15;
-
-            reader_thread
-        };
-
-        // The lock has been released, but the reader thread should still not
-        // terminate, because of the update in progress.
-
-        // Yield thread to give reader_thread a chance to get scheduled.
-        thread::yield_now();
-        {
-            let _guard = lock.lock().unwrap();
-
-            // Update volume and change update count to indicate the write has
-            // finished.
-            state.volume = 42;
-            state.update_count = 16;
-        }
-
-        let read_value = reader_thread.join().unwrap();
-        assert_eq!(read_value, 42);
-    }
-}
diff --git a/cras/client/libcras/src/cras_shm_stream.rs b/cras/client/libcras/src/cras_shm_stream.rs
deleted file mode 100644
index f72cc07..0000000
--- a/cras/client/libcras/src/cras_shm_stream.rs
+++ /dev/null
@@ -1,191 +0,0 @@
-// Copyright 2019 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-use std::time::Duration;
-use std::{error, fmt};
-
-use audio_streams::{
-    shm_streams::{BufferSet, ServerRequest, ShmStream},
-    BoxError, SampleFormat, StreamDirection,
-};
-use cras_sys::gen::CRAS_AUDIO_MESSAGE_ID;
-use sys_util::error;
-
-use crate::audio_socket::{AudioMessage, AudioSocket};
-use crate::cras_server_socket::CrasServerSocket;
-use crate::cras_shm::{self, CrasAudioHeader, CrasAudioShmHeaderFd};
-
-#[derive(Debug)]
-pub enum Error {
-    MessageTypeError,
-    CaptureBufferTooSmall,
-}
-
-impl error::Error for Error {}
-
-impl fmt::Display for Error {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        match self {
-            Error::MessageTypeError => write!(f, "Message type error"),
-            Error::CaptureBufferTooSmall => write!(
-                f,
-                "Capture buffer too small, must have size at least 'used_size'."
-            ),
-        }
-    }
-}
-
-/// An object that handles interactions with CRAS for a shm stream.
-/// The object implements `ShmStream` and so can be used to wait for
-/// `ServerRequest` and `BufferComplete` messages.
-pub struct CrasShmStream<'a> {
-    stream_id: u32,
-    server_socket: CrasServerSocket,
-    audio_socket: AudioSocket,
-    direction: StreamDirection,
-    header: CrasAudioHeader<'a>,
-    frame_size: usize,
-    num_channels: usize,
-    frame_rate: u32,
-    // The index of the next buffer within SHM to set the buffer offset for.
-    next_buffer_idx: usize,
-}
-
-impl<'a> CrasShmStream<'a> {
-    /// Attempt to creates a CrasShmStream with the given arguments.
-    ///
-    /// # Arguments
-    ///
-    /// * `stream_id` - The server's ID for the stream.
-    /// * `server_socket` - The socket that is connected to the server.
-    /// * `audio_socket` - The socket for audio request and audio available messages.
-    /// * `direction` - The direction of the stream, `Playback` or `Capture`.
-    /// * `num_channels` - The number of audio channels for the stream.
-    /// * `format` - The format to use for the stream's samples.
-    /// * `header_fd` - The file descriptor for the audio header shm area.
-    /// * `samples_len` - The size of the audio samples shm area.
-    ///
-    /// # Returns
-    ///
-    /// `CrasShmStream` - CRAS client stream.
-    ///
-    /// # Errors
-    ///
-    /// * If `header_fd` could not be successfully mmapped.
-    #[allow(clippy::too_many_arguments)]
-    pub fn try_new(
-        stream_id: u32,
-        server_socket: CrasServerSocket,
-        audio_socket: AudioSocket,
-        direction: StreamDirection,
-        num_channels: usize,
-        frame_rate: u32,
-        format: SampleFormat,
-        header_fd: CrasAudioShmHeaderFd,
-        samples_len: usize,
-    ) -> Result<Self, BoxError> {
-        let header = cras_shm::create_header(header_fd, samples_len)?;
-        Ok(Self {
-            stream_id,
-            server_socket,
-            audio_socket,
-            direction,
-            header,
-            frame_size: format.sample_bytes() * num_channels,
-            num_channels,
-            frame_rate,
-            // We have either sent zero or two offsets to the server, so we will
-            // need to update index 0 next.
-            next_buffer_idx: 0,
-        })
-    }
-}
-
-impl<'a> Drop for CrasShmStream<'a> {
-    /// Send the disconnect stream message and log an error if sending fails.
-    fn drop(&mut self) {
-        if let Err(e) = self.server_socket.disconnect_stream(self.stream_id) {
-            error!("CrasShmStream::drop error: {}", e);
-        }
-    }
-}
-
-impl<'a> ShmStream for CrasShmStream<'a> {
-    fn frame_size(&self) -> usize {
-        self.frame_size
-    }
-
-    fn num_channels(&self) -> usize {
-        self.num_channels
-    }
-
-    fn frame_rate(&self) -> u32 {
-        self.frame_rate
-    }
-
-    fn wait_for_next_action_with_timeout(
-        &mut self,
-        timeout: Duration,
-    ) -> Result<Option<ServerRequest>, BoxError> {
-        let expected_id = match self.direction {
-            StreamDirection::Playback => CRAS_AUDIO_MESSAGE_ID::AUDIO_MESSAGE_REQUEST_DATA,
-            StreamDirection::Capture => CRAS_AUDIO_MESSAGE_ID::AUDIO_MESSAGE_DATA_READY,
-        };
-
-        match self
-            .audio_socket
-            .read_audio_message_with_timeout(Some(timeout))?
-        {
-            Some(AudioMessage::Success { id, frames }) if id == expected_id => {
-                Ok(Some(ServerRequest::new(frames as usize, self)))
-            }
-            None => Ok(None),
-            _ => Err(Box::new(Error::MessageTypeError)),
-        }
-    }
-}
-
-impl BufferSet for CrasShmStream<'_> {
-    fn callback(&mut self, offset: usize, frames: usize) -> Result<(), BoxError> {
-        self.header
-            .set_buffer_offset(self.next_buffer_idx, offset)?;
-        self.next_buffer_idx ^= 1;
-        let frames = frames as u32;
-
-        match self.direction {
-            StreamDirection::Playback => {
-                self.header.commit_written_frames(frames)?;
-
-                // Notify CRAS that we've made playback data available.
-                self.audio_socket.data_ready(frames)?
-            }
-            StreamDirection::Capture => {
-                let used_size = self.header.get_used_size();
-                // Because CRAS doesn't know how long our buffer in shm is, we
-                // must make sure that there are always at least buffer_size
-                // frames available so that it doesn't write outside the buffer.
-                if frames < (used_size / self.frame_size) as u32 {
-                    return Err(Box::new(Error::CaptureBufferTooSmall));
-                }
-
-                self.header.commit_read_frames(frames)?;
-                self.audio_socket.capture_ready(frames)?;
-            }
-        }
-
-        Ok(())
-    }
-
-    fn ignore(&mut self) -> Result<(), BoxError> {
-        // We send an empty buffer for an ignored playback request since the
-        // server will not read from a 0-length buffer. We don't do anything for
-        // an ignored capture request, since we don't have a way to communicate
-        // buffer length to the server, and we don't want the server writing
-        // data to offsets within the SHM area that aren't audio buffers.
-        if self.direction == StreamDirection::Playback {
-            self.callback(0, 0)?;
-        }
-
-        Ok(())
-    }
-}
diff --git a/cras/client/libcras/src/cras_stream.rs b/cras/client/libcras/src/cras_stream.rs
deleted file mode 100644
index f600480..0000000
--- a/cras/client/libcras/src/cras_stream.rs
+++ /dev/null
@@ -1,224 +0,0 @@
-// Copyright 2019 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-use std::cmp::min;
-use std::io;
-use std::marker::PhantomData;
-use std::{error, fmt};
-
-use audio_streams::{
-    capture::{CaptureBuffer, CaptureBufferStream},
-    BoxError, BufferDrop, PlaybackBuffer, PlaybackBufferStream,
-};
-use cras_sys::gen::{snd_pcm_format_t, CRAS_AUDIO_MESSAGE_ID, CRAS_STREAM_DIRECTION};
-use sys_util::error;
-
-use crate::audio_socket::{AudioMessage, AudioSocket};
-use crate::cras_server_socket::CrasServerSocket;
-use crate::cras_shm::*;
-
-#[derive(Debug)]
-pub enum Error {
-    IoError(io::Error),
-    MessageTypeError,
-}
-
-impl error::Error for Error {}
-
-impl fmt::Display for Error {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        match self {
-            Error::IoError(ref err) => err.fmt(f),
-            Error::MessageTypeError => write!(f, "Message type error"),
-        }
-    }
-}
-
-impl From<io::Error> for Error {
-    fn from(io_err: io::Error) -> Error {
-        Error::IoError(io_err)
-    }
-}
-
-/// A trait controls the state of `CrasAudioHeader` and
-/// interacts with server's audio thread through `AudioSocket`.
-pub trait CrasStreamData<'a>: Send {
-    // Creates `CrasStreamData` with only `AudioSocket`.
-    fn new(audio_sock: AudioSocket, header: CrasAudioHeader<'a>) -> Self;
-    fn header_mut(&mut self) -> &mut CrasAudioHeader<'a>;
-    fn audio_sock_mut(&mut self) -> &mut AudioSocket;
-}
-
-/// `CrasStreamData` implementation for `PlaybackBufferStream`.
-pub struct CrasPlaybackData<'a> {
-    audio_sock: AudioSocket,
-    header: CrasAudioHeader<'a>,
-}
-
-impl<'a> CrasStreamData<'a> for CrasPlaybackData<'a> {
-    fn new(audio_sock: AudioSocket, header: CrasAudioHeader<'a>) -> Self {
-        Self { audio_sock, header }
-    }
-
-    fn header_mut(&mut self) -> &mut CrasAudioHeader<'a> {
-        &mut self.header
-    }
-
-    fn audio_sock_mut(&mut self) -> &mut AudioSocket {
-        &mut self.audio_sock
-    }
-}
-
-impl<'a> BufferDrop for CrasPlaybackData<'a> {
-    fn trigger(&mut self, nframes: usize) {
-        let log_err = |e| error!("BufferDrop error: {}", e);
-        if let Err(e) = self.header.commit_written_frames(nframes as u32) {
-            log_err(e);
-        }
-        if let Err(e) = self.audio_sock.data_ready(nframes as u32) {
-            log_err(e);
-        }
-    }
-}
-
-/// `CrasStreamData` implementation for `CaptureBufferStream`.
-pub struct CrasCaptureData<'a> {
-    audio_sock: AudioSocket,
-    header: CrasAudioHeader<'a>,
-}
-
-impl<'a> CrasStreamData<'a> for CrasCaptureData<'a> {
-    fn new(audio_sock: AudioSocket, header: CrasAudioHeader<'a>) -> Self {
-        Self { audio_sock, header }
-    }
-
-    fn header_mut(&mut self) -> &mut CrasAudioHeader<'a> {
-        &mut self.header
-    }
-
-    fn audio_sock_mut(&mut self) -> &mut AudioSocket {
-        &mut self.audio_sock
-    }
-}
-
-impl<'a> BufferDrop for CrasCaptureData<'a> {
-    fn trigger(&mut self, nframes: usize) {
-        let log_err = |e| error!("BufferDrop error: {}", e);
-        if let Err(e) = self.header.commit_read_frames(nframes as u32) {
-            log_err(e);
-        }
-        if let Err(e) = self.audio_sock.capture_ready(nframes as u32) {
-            log_err(e);
-        }
-    }
-}
-
-#[allow(dead_code)]
-pub struct CrasStream<'a, T: CrasStreamData<'a> + BufferDrop> {
-    stream_id: u32,
-    server_socket: CrasServerSocket,
-    block_size: u32,
-    direction: CRAS_STREAM_DIRECTION,
-    rate: u32,
-    num_channels: usize,
-    format: snd_pcm_format_t,
-    /// A structure for stream to interact with server audio thread.
-    controls: T,
-    /// The `PhantomData` is used by `controls: T`
-    phantom: PhantomData<CrasAudioHeader<'a>>,
-    audio_buffer: CrasAudioBuffer,
-}
-
-impl<'a, T: CrasStreamData<'a> + BufferDrop> CrasStream<'a, T> {
-    /// Creates a CrasStream by given arguments.
-    ///
-    /// # Returns
-    /// `CrasStream` - CRAS client stream.
-    #[allow(clippy::too_many_arguments)]
-    pub fn try_new(
-        stream_id: u32,
-        server_socket: CrasServerSocket,
-        block_size: u32,
-        direction: CRAS_STREAM_DIRECTION,
-        rate: u32,
-        num_channels: usize,
-        format: snd_pcm_format_t,
-        audio_sock: AudioSocket,
-        header_fd: CrasAudioShmHeaderFd,
-        samples_fd: CrasShmFd,
-    ) -> Result<Self, Error> {
-        let (header, audio_buffer) = create_header_and_buffers(header_fd, samples_fd)?;
-
-        Ok(Self {
-            stream_id,
-            server_socket,
-            block_size,
-            direction,
-            rate,
-            num_channels,
-            format,
-            controls: T::new(audio_sock, header),
-            phantom: PhantomData,
-            audio_buffer,
-        })
-    }
-
-    fn wait_request_data(&mut self) -> Result<(), Error> {
-        match self.controls.audio_sock_mut().read_audio_message()? {
-            AudioMessage::Success {
-                id: CRAS_AUDIO_MESSAGE_ID::AUDIO_MESSAGE_REQUEST_DATA,
-                ..
-            } => Ok(()),
-            _ => Err(Error::MessageTypeError),
-        }
-    }
-
-    fn wait_data_ready(&mut self) -> Result<u32, Error> {
-        match self.controls.audio_sock_mut().read_audio_message()? {
-            AudioMessage::Success {
-                id: CRAS_AUDIO_MESSAGE_ID::AUDIO_MESSAGE_DATA_READY,
-                frames,
-            } => Ok(frames),
-            _ => Err(Error::MessageTypeError),
-        }
-    }
-}
-
-impl<'a, T: CrasStreamData<'a> + BufferDrop> Drop for CrasStream<'a, T> {
-    /// A blocking drop function, sends the disconnect message to `CrasClient` and waits for
-    /// the return message.
-    /// Logs an error message to stderr if the method fails.
-    fn drop(&mut self) {
-        if let Err(e) = self.server_socket.disconnect_stream(self.stream_id) {
-            error!("CrasStream::Drop error: {}", e);
-        }
-    }
-}
-
-impl<'a, T: CrasStreamData<'a> + BufferDrop> PlaybackBufferStream for CrasStream<'a, T> {
-    fn next_playback_buffer(&mut self) -> Result<PlaybackBuffer, BoxError> {
-        // Wait for request audio message
-        self.wait_request_data()?;
-        let header = self.controls.header_mut();
-        let frame_size = header.get_frame_size();
-        let (offset, len) = header.get_write_offset_and_len()?;
-        let buf = &mut self.audio_buffer.get_buffer()[offset..offset + len];
-
-        PlaybackBuffer::new(frame_size, buf, &mut self.controls).map_err(Box::from)
-    }
-}
-
-impl<'a, T: CrasStreamData<'a> + BufferDrop> CaptureBufferStream for CrasStream<'a, T> {
-    fn next_capture_buffer(&mut self) -> Result<CaptureBuffer, BoxError> {
-        // Wait for data ready message
-        let frames = self.wait_data_ready()?;
-        let header = self.controls.header_mut();
-        let frame_size = header.get_frame_size();
-        let shm_frames = header.get_readable_frames()?;
-        let len = min(shm_frames, frames as usize) * frame_size;
-        let offset = header.get_read_buffer_offset()?;
-        let buf = &mut self.audio_buffer.get_buffer()[offset..offset + len];
-
-        CaptureBuffer::new(frame_size, buf, &mut self.controls).map_err(Box::from)
-    }
-}
diff --git a/cras/client/libcras/src/libcras.rs b/cras/client/libcras/src/libcras.rs
deleted file mode 100644
index 402a4a2..0000000
--- a/cras/client/libcras/src/libcras.rs
+++ /dev/null
@@ -1,699 +0,0 @@
-// Copyright 2019 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//! Provides an interface for playing and recording audio through CRAS server.
-//!
-//! `CrasClient` implements `StreamSource` trait and it can create playback or capture
-//! stream - `CrasStream` which can be a
-//! - `PlaybackBufferStream` for audio playback or
-//! - `CaptureBufferStream` for audio capture.
-//!
-//! # Example of file audio playback
-//!
-//! `PlaybackBuffer`s to be filled with audio samples are obtained by calling
-//! `next_playback_buffer` from `CrasStream`.
-//!
-//! Users playing audio fill the provided buffers with audio. When a `PlaybackBuffer` is dropped,
-//! the samples written to it are committed to the `CrasStream` it came from.
-//!
-//!
-//! ```
-//! // An example of playing raw audio data from a given file
-//! use std::env;
-//! use std::fs::File;
-//! use std::io::{Read, Write};
-//! use std::thread::{spawn, JoinHandle};
-//! type Result<T> = std::result::Result<T, BoxError>;
-//!
-//! use libcras::{BoxError, CrasClient, CrasClientType};
-//! use audio_streams::{SampleFormat, StreamSource};
-//!
-//! const BUFFER_SIZE: usize = 256;
-//! const FRAME_RATE: u32 = 44100;
-//! const NUM_CHANNELS: usize = 2;
-//! const FORMAT: SampleFormat = SampleFormat::S16LE;
-//!
-//! # fn main() -> Result<()> {
-//! #    let args: Vec<String> = env::args().collect();
-//! #    match args.len() {
-//! #        2 => {
-//!              let mut cras_client = CrasClient::new()?;
-//!              cras_client.set_client_type(CrasClientType::CRAS_CLIENT_TYPE_TEST);
-//!              let (_control, mut stream) = cras_client
-//!                  .new_playback_stream(NUM_CHANNELS, FORMAT, FRAME_RATE, BUFFER_SIZE)?;
-//!
-//!              // Plays 1000 * BUFFER_SIZE samples from the given file
-//!              let mut file = File::open(&args[1])?;
-//!              let mut local_buffer = [0u8; BUFFER_SIZE * NUM_CHANNELS * 2];
-//!              for _i in 0..1000 {
-//!                  // Reads data to local buffer
-//!                  let _read_count = file.read(&mut local_buffer)?;
-//!
-//!                  // Gets writable buffer from stream and
-//!                  let mut buffer = stream.next_playback_buffer()?;
-//!                  // Writes data to stream buffer
-//!                  let _write_frames = buffer.write(&local_buffer)?;
-//!              }
-//!              // Stream and client should gracefully be closed out of this scope
-//! #        }
-//! #        _ => {
-//! #            println!("{} /path/to/playback_file.raw", args[0]);
-//! #        }
-//! #    };
-//! #    Ok(())
-//! # }
-//! ```
-//!
-//! # Example of file audio capture
-//!
-//! `CaptureBuffer`s which contain audio samples are obtained by calling
-//! `next_capture_buffer` from `CrasStream`.
-//!
-//! Users get captured audio samples from the provided buffers. When a `CaptureBuffer` is dropped,
-//! the number of read samples will be committed to the `CrasStream` it came from.
-//! ```
-//! use std::env;
-//! use std::fs::File;
-//! use std::io::{Read, Write};
-//! use std::thread::{spawn, JoinHandle};
-//! type Result<T> = std::result::Result<T, BoxError>;
-//!
-//! use libcras::{BoxError, CrasClient, CrasClientType};
-//! use audio_streams::{SampleFormat, StreamSource};
-//!
-//! const BUFFER_SIZE: usize = 256;
-//! const FRAME_RATE: u32 = 44100;
-//! const NUM_CHANNELS: usize = 2;
-//! const FORMAT: SampleFormat = SampleFormat::S16LE;
-//!
-//! # fn main() -> Result<()> {
-//! #    let args: Vec<String> = env::args().collect();
-//! #    match args.len() {
-//! #        2 => {
-//!              let mut cras_client = CrasClient::new()?;
-//!              cras_client.set_client_type(CrasClientType::CRAS_CLIENT_TYPE_TEST);
-//!              let (_control, mut stream) = cras_client
-//!                  .new_capture_stream(NUM_CHANNELS, FORMAT, FRAME_RATE, BUFFER_SIZE)?;
-//!
-//!              // Capture 1000 * BUFFER_SIZE samples to the given file
-//!              let mut file = File::create(&args[1])?;
-//!              let mut local_buffer = [0u8; BUFFER_SIZE * NUM_CHANNELS * 2];
-//!              for _i in 0..1000 {
-//!
-//!                  // Gets readable buffer from stream and
-//!                  let mut buffer = stream.next_capture_buffer()?;
-//!                  // Reads data to local buffer
-//!                  let read_count = buffer.read(&mut local_buffer)?;
-//!                  // Writes data to file
-//!                  let _read_frames = file.write(&local_buffer[..read_count])?;
-//!              }
-//!              // Stream and client should gracefully be closed out of this scope
-//! #        }
-//! #        _ => {
-//! #            println!("{} /path/to/capture_file.raw", args[0]);
-//! #        }
-//! #    };
-//! #    Ok(())
-//! # }
-//! ```
-use std::io;
-use std::mem;
-use std::os::unix::{
-    io::{AsRawFd, RawFd},
-    net::UnixStream,
-};
-use std::{error, fmt};
-
-pub use audio_streams::BoxError;
-use audio_streams::{
-    capture::{CaptureBufferStream, NoopCaptureStream},
-    shm_streams::{NullShmStream, ShmStream, ShmStreamSource},
-    BufferDrop, NoopStreamControl, PlaybackBufferStream, SampleFormat, StreamControl,
-    StreamDirection, StreamEffect, StreamSource,
-};
-use cras_sys::gen::*;
-pub use cras_sys::gen::{
-    CRAS_CLIENT_TYPE as CrasClientType, CRAS_NODE_TYPE as CrasNodeType,
-    CRAS_STREAM_EFFECT as CrasStreamEffect,
-};
-pub use cras_sys::{AudioDebugInfo, CrasIodevInfo, CrasIonodeInfo, Error as CrasSysError};
-use sys_util::{PollContext, PollToken, SharedMemory};
-
-mod audio_socket;
-use crate::audio_socket::AudioSocket;
-mod cras_server_socket;
-use crate::cras_server_socket::CrasServerSocket;
-pub use crate::cras_server_socket::CrasSocketType;
-mod cras_shm;
-use crate::cras_shm::CrasServerState;
-pub mod cras_shm_stream;
-use crate::cras_shm_stream::CrasShmStream;
-mod cras_stream;
-use crate::cras_stream::{CrasCaptureData, CrasPlaybackData, CrasStream, CrasStreamData};
-mod cras_client_message;
-use crate::cras_client_message::*;
-
-#[derive(Debug)]
-pub enum Error {
-    CrasClientMessageError(cras_client_message::Error),
-    CrasStreamError(cras_stream::Error),
-    CrasSysError(cras_sys::Error),
-    IoError(io::Error),
-    SysUtilError(sys_util::Error),
-    MessageTypeError,
-    UnexpectedExit,
-}
-
-impl error::Error for Error {}
-
-impl fmt::Display for Error {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        match self {
-            Error::CrasClientMessageError(ref err) => err.fmt(f),
-            Error::CrasStreamError(ref err) => err.fmt(f),
-            Error::CrasSysError(ref err) => err.fmt(f),
-            Error::IoError(ref err) => err.fmt(f),
-            Error::SysUtilError(ref err) => err.fmt(f),
-            Error::MessageTypeError => write!(f, "Message type error"),
-            Error::UnexpectedExit => write!(f, "Unexpected exit"),
-        }
-    }
-}
-
-type Result<T> = std::result::Result<T, Error>;
-
-impl From<io::Error> for Error {
-    fn from(io_err: io::Error) -> Self {
-        Error::IoError(io_err)
-    }
-}
-
-impl From<sys_util::Error> for Error {
-    fn from(sys_util_err: sys_util::Error) -> Self {
-        Error::SysUtilError(sys_util_err)
-    }
-}
-
-impl From<cras_stream::Error> for Error {
-    fn from(err: cras_stream::Error) -> Self {
-        Error::CrasStreamError(err)
-    }
-}
-
-impl From<cras_client_message::Error> for Error {
-    fn from(err: cras_client_message::Error) -> Self {
-        Error::CrasClientMessageError(err)
-    }
-}
-
-/// A CRAS server client, which implements StreamSource and ShmStreamSource.
-/// It can create audio streams connecting to CRAS server.
-pub struct CrasClient<'a> {
-    server_socket: CrasServerSocket,
-    server_state: CrasServerState<'a>,
-    client_id: u32,
-    next_stream_id: u32,
-    cras_capture: bool,
-    client_type: CRAS_CLIENT_TYPE,
-}
-
-impl<'a> CrasClient<'a> {
-    /// Blocks creating a `CrasClient` with registered `client_id`
-    ///
-    /// # Results
-    ///
-    /// * `CrasClient` - A client to interact with CRAS server
-    ///
-    /// # Errors
-    ///
-    /// Returns error if error occurs while handling server message or message
-    /// type is incorrect
-    pub fn new() -> Result<Self> {
-        Self::with_type(CrasSocketType::Legacy)
-    }
-
-    /// Tries to create a `CrasClient` with a given `CrasSocketType`.
-    ///
-    /// # Errors
-    ///
-    /// Returns error if error occurs while handling server message or message
-    /// type is incorrect.
-    pub fn with_type(socket_type: CrasSocketType) -> Result<Self> {
-        // Create a connection to the server.
-        let mut server_socket = CrasServerSocket::with_type(socket_type)?;
-        // Gets client ID and server state fd from server
-        if let ServerResult::Connected(client_id, server_state_fd) =
-            CrasClient::wait_for_message(&mut server_socket)?
-        {
-            Ok(Self {
-                server_socket,
-                server_state: CrasServerState::try_new(server_state_fd)?,
-                client_id,
-                next_stream_id: 0,
-                cras_capture: false,
-                client_type: CRAS_CLIENT_TYPE::CRAS_CLIENT_TYPE_UNKNOWN,
-            })
-        } else {
-            Err(Error::MessageTypeError)
-        }
-    }
-
-    /// Enables capturing audio through CRAS server.
-    pub fn enable_cras_capture(&mut self) {
-        self.cras_capture = true;
-    }
-
-    /// Set the type of this client to report to CRAS when connecting streams.
-    pub fn set_client_type(&mut self, client_type: CRAS_CLIENT_TYPE) {
-        self.client_type = client_type;
-    }
-
-    /// Sets the system volume to `volume`.
-    ///
-    /// Send a message to the server to request setting the system volume
-    /// to `volume`. No response is returned from the server.
-    ///
-    /// # Errors
-    ///
-    /// If writing the message to the server socket failed.
-    pub fn set_system_volume(&mut self, volume: u32) -> Result<()> {
-        let header = cras_server_message {
-            length: mem::size_of::<cras_set_system_volume>() as u32,
-            id: CRAS_SERVER_MESSAGE_ID::CRAS_SERVER_SET_SYSTEM_VOLUME,
-        };
-        let msg = cras_set_system_volume { header, volume };
-
-        self.server_socket.send_server_message_with_fds(&msg, &[])?;
-        Ok(())
-    }
-
-    /// Sets the system mute status to `mute`.
-    ///
-    /// Send a message to the server to request setting the system mute
-    /// to `mute`. No response is returned from the server.
-    ///
-    /// # Errors
-    ///
-    /// If writing the message to the server socket failed.
-    pub fn set_system_mute(&mut self, mute: bool) -> Result<()> {
-        let header = cras_server_message {
-            length: mem::size_of::<cras_set_system_mute>() as u32,
-            id: CRAS_SERVER_MESSAGE_ID::CRAS_SERVER_SET_SYSTEM_MUTE,
-        };
-        let msg = cras_set_system_mute {
-            header,
-            mute: mute as i32,
-        };
-
-        self.server_socket.send_server_message_with_fds(&msg, &[])?;
-        Ok(())
-    }
-
-    /// Gets the system volume.
-    ///
-    /// Read the current value for system volume from the server shared memory.
-    pub fn get_system_volume(&self) -> u32 {
-        self.server_state.get_system_volume()
-    }
-
-    /// Gets the system mute.
-    ///
-    /// Read the current value for system mute from the server shared memory.
-    pub fn get_system_mute(&self) -> bool {
-        self.server_state.get_system_mute()
-    }
-
-    /// Gets a list of output devices
-    ///
-    /// Read a list of the currently attached output devices from the server shared memory.
-    pub fn output_devices(&self) -> impl Iterator<Item = CrasIodevInfo> {
-        self.server_state.output_devices()
-    }
-
-    /// Gets a list of input devices
-    ///
-    /// Read a list of the currently attached input devices from the server shared memory.
-    pub fn input_devices(&self) -> impl Iterator<Item = CrasIodevInfo> {
-        self.server_state.input_devices()
-    }
-
-    /// Gets a list of output nodes
-    ///
-    /// Read a list of the currently attached output nodes from the server shared memory.
-    pub fn output_nodes(&self) -> impl Iterator<Item = CrasIonodeInfo> {
-        self.server_state.output_nodes()
-    }
-
-    /// Gets a list of input nodes
-    ///
-    /// Read a list of the currently attached input nodes from the server shared memory.
-    pub fn input_nodes(&self) -> impl Iterator<Item = CrasIonodeInfo> {
-        self.server_state.input_nodes()
-    }
-
-    /// Gets the server's audio debug info.
-    ///
-    /// Sends a message to the server requesting an update of audio debug info,
-    /// waits for the response, and then reads the info from the server state.
-    ///
-    /// # Errors
-    ///
-    /// * If sending the message to the server failed.
-    /// * If an unexpected response message is received.
-    pub fn get_audio_debug_info(&mut self) -> Result<AudioDebugInfo> {
-        let header = cras_server_message {
-            length: mem::size_of::<cras_dump_audio_thread>() as u32,
-            id: CRAS_SERVER_MESSAGE_ID::CRAS_SERVER_DUMP_AUDIO_THREAD,
-        };
-        let msg = cras_dump_audio_thread { header };
-
-        self.server_socket.send_server_message_with_fds(&msg, &[])?;
-
-        match CrasClient::wait_for_message(&mut self.server_socket)? {
-            ServerResult::DebugInfoReady => Ok(self
-                .server_state
-                .get_audio_debug_info()
-                .map_err(Error::CrasSysError)?),
-            _ => Err(Error::MessageTypeError),
-        }
-    }
-
-    // Gets next server_stream_id from client and increment stream_id counter.
-    fn next_server_stream_id(&mut self) -> u32 {
-        let res = self.next_stream_id;
-        self.next_stream_id += 1;
-        self.server_stream_id(res)
-    }
-
-    // Gets server_stream_id from given stream_id
-    fn server_stream_id(&self, stream_id: u32) -> u32 {
-        (self.client_id << 16) | stream_id
-    }
-
-    // Creates general stream with given parameters
-    fn create_stream<'b, T: BufferDrop + CrasStreamData<'b>>(
-        &mut self,
-        device_index: Option<u32>,
-        block_size: u32,
-        direction: CRAS_STREAM_DIRECTION,
-        rate: u32,
-        channel_num: usize,
-        format: SampleFormat,
-    ) -> Result<CrasStream<'b, T>> {
-        let stream_id = self.next_server_stream_id();
-
-        // Prepares server message
-        let audio_format =
-            cras_audio_format_packed::new(format.into(), rate, channel_num, direction);
-        let msg_header = cras_server_message {
-            length: mem::size_of::<cras_connect_message>() as u32,
-            id: CRAS_SERVER_MESSAGE_ID::CRAS_SERVER_CONNECT_STREAM,
-        };
-        let server_cmsg = cras_connect_message {
-            header: msg_header,
-            proto_version: CRAS_PROTO_VER,
-            direction,
-            stream_id,
-            stream_type: CRAS_STREAM_TYPE::CRAS_STREAM_TYPE_DEFAULT,
-            buffer_frames: block_size,
-            cb_threshold: block_size,
-            flags: 0,
-            format: audio_format,
-            dev_idx: device_index.unwrap_or(CRAS_SPECIAL_DEVICE::NO_DEVICE as u32),
-            effects: 0,
-            client_type: self.client_type,
-            client_shm_size: 0,
-            buffer_offsets: [0, 0],
-        };
-
-        // Creates AudioSocket pair
-        let (sock1, sock2) = UnixStream::pair()?;
-
-        // Sends `CRAS_SERVER_CONNECT_STREAM` message
-        let socks = [sock2.as_raw_fd()];
-        self.server_socket
-            .send_server_message_with_fds(&server_cmsg, &socks)?;
-
-        let audio_socket = AudioSocket::new(sock1);
-        loop {
-            let result = CrasClient::wait_for_message(&mut self.server_socket)?;
-            if let ServerResult::StreamConnected(_stream_id, header_fd, samples_fd) = result {
-                return CrasStream::try_new(
-                    stream_id,
-                    self.server_socket.try_clone()?,
-                    block_size,
-                    direction,
-                    rate,
-                    channel_num,
-                    format.into(),
-                    audio_socket,
-                    header_fd,
-                    samples_fd,
-                )
-                .map_err(Error::CrasStreamError);
-            }
-        }
-    }
-
-    /// Creates a new playback stream pinned to the device at `device_index`.
-    ///
-    /// # Arguments
-    ///
-    /// * `device_index` - The device to which the stream will be attached.
-    /// * `num_channels` - The count of audio channels for the stream.
-    /// * `format` - The format to use for stream audio samples.
-    /// * `frame_rate` - The sample rate of the stream.
-    /// * `buffer_size` - The transfer size granularity in frames.
-    #[allow(clippy::type_complexity)]
-    pub fn new_pinned_playback_stream(
-        &mut self,
-        device_index: u32,
-        num_channels: usize,
-        format: SampleFormat,
-        frame_rate: u32,
-        buffer_size: usize,
-    ) -> std::result::Result<(Box<dyn StreamControl>, Box<dyn PlaybackBufferStream>), BoxError>
-    {
-        Ok((
-            Box::new(NoopStreamControl::new()),
-            Box::new(self.create_stream::<CrasPlaybackData>(
-                Some(device_index),
-                buffer_size as u32,
-                CRAS_STREAM_DIRECTION::CRAS_STREAM_OUTPUT,
-                frame_rate,
-                num_channels,
-                format,
-            )?),
-        ))
-    }
-
-    /// Creates a new capture stream pinned to the device at `device_index`.
-    ///
-    /// This is useful for, among other things, capturing from a loopback
-    /// device.
-    ///
-    /// # Arguments
-    ///
-    /// * `device_index` - The device to which the stream will be attached.
-    /// * `num_channels` - The count of audio channels for the stream.
-    /// * `format` - The format to use for stream audio samples.
-    /// * `frame_rate` - The sample rate of the stream.
-    /// * `buffer_size` - The transfer size granularity in frames.
-    #[allow(clippy::type_complexity)]
-    pub fn new_pinned_capture_stream(
-        &mut self,
-        device_index: u32,
-        num_channels: usize,
-        format: SampleFormat,
-        frame_rate: u32,
-        buffer_size: usize,
-    ) -> std::result::Result<(Box<dyn StreamControl>, Box<dyn CaptureBufferStream>), BoxError> {
-        Ok((
-            Box::new(NoopStreamControl::new()),
-            Box::new(self.create_stream::<CrasCaptureData>(
-                Some(device_index),
-                buffer_size as u32,
-                CRAS_STREAM_DIRECTION::CRAS_STREAM_INPUT,
-                frame_rate,
-                num_channels,
-                format,
-            )?),
-        ))
-    }
-
-    // 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(socket, Token::ServerMsg).and(Ok(pc)))?;
-
-        let events = poll_ctx.wait()?;
-        // Check the first readable message
-        let tokens: Vec<Token> = events.iter_readable().map(|e| e.token()).collect();
-        tokens
-            .get(0)
-            .ok_or(Error::UnexpectedExit)
-            .and_then(|ref token| {
-                match token {
-                    Token::ServerMsg => ServerResult::handle_server_message(socket),
-                }
-                .map_err(Into::into)
-            })
-    }
-
-    /// Returns any open file descriptors needed by CrasClient.
-    /// This function is shared between StreamSource and ShmStreamSource.
-    fn keep_fds(&self) -> Vec<RawFd> {
-        vec![self.server_socket.as_raw_fd()]
-    }
-}
-
-impl<'a> StreamSource for CrasClient<'a> {
-    #[allow(clippy::type_complexity)]
-    fn new_playback_stream(
-        &mut self,
-        num_channels: usize,
-        format: SampleFormat,
-        frame_rate: u32,
-        buffer_size: usize,
-    ) -> std::result::Result<(Box<dyn StreamControl>, Box<dyn PlaybackBufferStream>), BoxError>
-    {
-        Ok((
-            Box::new(NoopStreamControl::new()),
-            Box::new(self.create_stream::<CrasPlaybackData>(
-                None,
-                buffer_size as u32,
-                CRAS_STREAM_DIRECTION::CRAS_STREAM_OUTPUT,
-                frame_rate,
-                num_channels,
-                format,
-            )?),
-        ))
-    }
-
-    #[allow(clippy::type_complexity)]
-    fn new_capture_stream(
-        &mut self,
-        num_channels: usize,
-        format: SampleFormat,
-        frame_rate: u32,
-        buffer_size: usize,
-    ) -> std::result::Result<(Box<dyn StreamControl>, Box<dyn CaptureBufferStream>), BoxError> {
-        if self.cras_capture {
-            Ok((
-                Box::new(NoopStreamControl::new()),
-                Box::new(self.create_stream::<CrasCaptureData>(
-                    None,
-                    buffer_size as u32,
-                    CRAS_STREAM_DIRECTION::CRAS_STREAM_INPUT,
-                    frame_rate,
-                    num_channels,
-                    format,
-                )?),
-            ))
-        } else {
-            Ok((
-                Box::new(NoopStreamControl::new()),
-                Box::new(NoopCaptureStream::new(
-                    num_channels,
-                    format,
-                    frame_rate,
-                    buffer_size,
-                )),
-            ))
-        }
-    }
-
-    fn keep_fds(&self) -> Option<Vec<RawFd>> {
-        Some(CrasClient::keep_fds(self))
-    }
-}
-
-impl<'a> ShmStreamSource for CrasClient<'a> {
-    fn new_stream(
-        &mut self,
-        direction: StreamDirection,
-        num_channels: usize,
-        format: SampleFormat,
-        frame_rate: u32,
-        buffer_size: usize,
-        effects: &[StreamEffect],
-        client_shm: &SharedMemory,
-        buffer_offsets: [u64; 2],
-    ) -> std::result::Result<Box<dyn ShmStream>, BoxError> {
-        if direction == StreamDirection::Capture && !self.cras_capture {
-            return Ok(Box::new(NullShmStream::new(
-                buffer_size,
-                num_channels,
-                format,
-                frame_rate,
-            )));
-        }
-
-        let buffer_size = buffer_size as u32;
-
-        // Prepares server message
-        let stream_id = self.next_server_stream_id();
-        let audio_format = cras_audio_format_packed::new(
-            format.into(),
-            frame_rate,
-            num_channels,
-            direction.into(),
-        );
-        let msg_header = cras_server_message {
-            length: mem::size_of::<cras_connect_message>() as u32,
-            id: CRAS_SERVER_MESSAGE_ID::CRAS_SERVER_CONNECT_STREAM,
-        };
-
-        let server_cmsg = cras_connect_message {
-            header: msg_header,
-            proto_version: CRAS_PROTO_VER,
-            direction: direction.into(),
-            stream_id,
-            stream_type: CRAS_STREAM_TYPE::CRAS_STREAM_TYPE_DEFAULT,
-            buffer_frames: buffer_size,
-            cb_threshold: buffer_size,
-            flags: 0,
-            format: audio_format,
-            dev_idx: CRAS_SPECIAL_DEVICE::NO_DEVICE as u32,
-            effects: effects.iter().collect::<CrasStreamEffect>().into(),
-            client_type: self.client_type,
-            client_shm_size: client_shm.size(),
-            buffer_offsets,
-        };
-
-        // Creates AudioSocket pair
-        let (sock1, sock2) = UnixStream::pair()?;
-
-        // Sends `CRAS_SERVER_CONNECT_STREAM` message
-        let fds = [sock2.as_raw_fd(), client_shm.as_raw_fd()];
-        self.server_socket
-            .send_server_message_with_fds(&server_cmsg, &fds)?;
-
-        loop {
-            let result = CrasClient::wait_for_message(&mut self.server_socket)?;
-            if let ServerResult::StreamConnected(_stream_id, header_fd, _samples_fd) = result {
-                let audio_socket = AudioSocket::new(sock1);
-                let stream = CrasShmStream::try_new(
-                    stream_id,
-                    self.server_socket.try_clone()?,
-                    audio_socket,
-                    direction,
-                    num_channels,
-                    frame_rate,
-                    format,
-                    header_fd,
-                    client_shm.size() as usize,
-                )?;
-                return Ok(Box::new(stream));
-            }
-        }
-    }
-
-    fn keep_fds(&self) -> Vec<RawFd> {
-        CrasClient::keep_fds(self)
-    }
-}
diff --git a/cras/configure.ac b/cras/configure.ac
deleted file mode 100644
index f39a14a..0000000
--- a/cras/configure.ac
+++ /dev/null
@@ -1,206 +0,0 @@
-# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-AC_INIT([cras], [0.1], [dgreid@chromium.org],
-             [cras], [http://www.chromium.org/])
-AC_PREREQ([2.59])
-
-AC_CANONICAL_HOST
-
-AM_INIT_AUTOMAKE([1.10 -Wall no-define])
-#AC_CONFIG_HEADERS([config.h])
-
-# To compile with full logs, use V=1 with make instead.
-AM_SILENT_RULES([yes])
-
-m4_ifdef([AM_PROG_AR], [AM_PROG_AR])
-AC_PROG_LIBTOOL
-AC_PROG_CC
-# c++ unit test (gtest).
-AC_PROG_CXX
-AC_LANG_C
-AM_PROG_CC_C_O
-PKG_PROG_PKG_CONFIG
-AC_CONFIG_FILES([Makefile src/Makefile libcras.pc])
-
-PKG_CHECK_MODULES([LIBSPEEX], [ speexdsp >= 1.2 ])
-PKG_CHECK_MODULES([ASOUNDLIB], [ alsa >= 1.1.0 ])
-
-AC_CHECK_HEADERS([iniparser/iniparser.h])
-
-AC_ARG_ENABLE([dbus], AS_HELP_STRING([--disable-dbus], [Disable all DBUS uses]), have_dbus=$enableval, have_dbus=yes)
-AM_CONDITIONAL(HAVE_DBUS, test "$have_dbus" = "yes")
-if test "$have_dbus" = "yes"; then
-    PKG_CHECK_MODULES([DBUS], [ dbus-1 >= 1.4.12 ])
-    AS_VAR_APPEND([DBUS_CFLAGS], [" -DCRAS_DBUS"])
-else
-    DBUS_CFLAGS=
-    DBUS_LIBS=
-fi
-AC_SUBST(DBUS_LIBS)
-AC_SUBST(DBUS_CFLAGS)
-
-AC_ARG_ENABLE([selinux], AS_HELP_STRING([--enable-selinux], [Enable SELinux calls]), have_selinux=$enableval, have_selinux=no)
-AM_CONDITIONAL(HAVE_SELINUX, test "$have_selinux" = "yes")
-if test "$have_selinux" = "yes"; then
-    PKG_CHECK_MODULES([SELINUX], [ libselinux ])
-    AS_VAR_APPEND([SELINUX_CFLAGS], [" -DCRAS_SELINUX"])
-else
-    SELINUX_CFLAGS=
-    SELINUX_LIBS=
-fi
-AC_SUBST(SELINUX_CFLAGS)
-AC_SUBST(SELINUX_LIBS)
-
-# WEBRTC APM support
-AC_ARG_ENABLE([webrtc-apm], AS_HELP_STRING([--enable-webrtc-apm], [Enable webrtc-apm uses]), have_webrtc_apm=$enableval, have_webrtc_apm=no)
-AM_CONDITIONAL(HAVE_WEBRTC_APM, test "$have_webrtc_apm" = "yes")
-if test "$have_webrtc_apm" = "yes"; then
-    PKG_CHECK_MODULES([WEBRTC_APM], [ libwebrtc_apm ])
-    AC_DEFINE(HAVE_WEBRTC_APM, 1, [Define to use webrtc-apm.])
-else
-    WEBRTC_APM_LIBS=
-fi
-AC_SUBST(WEBRTC_APM_LIBS)
-
-# Build fuzzer binaries
-AC_ARG_ENABLE([fuzzer], AS_HELP_STRING([--enable-fuzzer], [Enable fuzzer build]), have_fuzzer=$enableval, have_fuzzer=no)
-AM_CONDITIONAL(HAVE_FUZZER, test "$have_fuzzer" = "yes")
-if test "$have_fuzzer" = "yes"; then
-    AC_DEFINE(HAVE_FUZZER, 1, [Define to build fuzzers.])
-fi
-
-PKG_CHECK_MODULES([SBC], [ sbc >= 1.0 ])
-AC_CHECK_HEADERS([iniparser/iniparser.h iniparser.h], [FOUND_INIPARSER=1;break])
-test [$FOUND_INIPARSER] || AC_MSG_ERROR([Missing iniparser, please install.])
-AC_SEARCH_LIBS([LADSPA], [ladspa-sdk], [], [
-	AC_CHECK_HEADERS([ladspa.h], [], [
-		AC_MSG_ERROR([Missing ladspa-sdk, please install.])
-	])
-])
-PKG_CHECK_MODULES([UDEV], [ libudev >= 1.0 ])
-PKG_CHECK_MODULES([GTEST], [ gtest >= 1.0 ])
-AC_CHECK_LIB(asound, snd_pcm_ioplug_create,,
-	     AC_ERROR([*** libasound has no external plugin SDK]), -ldl)
-
-AC_ARG_ENABLE([alsa-plugin], AS_HELP_STRING([--disable-alsa-plugin],
-                                            [Disable building of ALSA plugin]))
-
-AC_ARG_ENABLE([metrics], AS_HELP_STRING([--enable-metrics], [Enable metrics uses]), have_metrics=$enableval, have_metrics=no)
-if test "$have_metrics" = "yes"; then
-    AC_DEFINE(HAVE_LIB_METRICS, 1, [Define to use libmetrics])
-    METRICS_LIBS=-lmetrics
-else
-    METRICS_LIBS=
-fi
-AC_SUBST(METRICS_LIBS)
-
-# Check if the system copy of the cras rust library should be used. If not, make sure cargo and rustc are present to build it.
-AC_ARG_WITH([system-cras-rust],
-	    AS_HELP_STRING([--with-system-cras-rust], [Use the system provided cras_rust library]),
-	    with_system_rust=$enableval,
-	    with_system_rust=no)
-AM_CONDITIONAL(WITH_SYSTEM_RUST, test "$with_system_rust" = "yes")
-if test "$with_system_rust" = "no"; then
-    AC_CHECK_PROG(CARGO, [cargo], [yes], [no])
-    AS_IF(test x$CARGO = xno,
-        AC_MSG_ERROR([cargo is required to build cras rust lib.])
-    )
-    AC_CHECK_PROG(RUSTC, [rustc], [yes], [no])
-    AS_IF(test x$RUSTC = xno,
-        AC_MSG_ERROR([rustc is required to build cras rust lib.])
-    )
-fi
-
-# Determine ALSA plugin directory.
-test "x$prefix" = xNONE && prefix=$ac_default_prefix
-test "x$exec_prefix" = xNONE && exec_prefix=$prefix
-
-AC_ARG_WITH(plugindir,
-    AS_HELP_STRING([--with-plugindir=dir],
-	[path where ALSA plugin files are stored]),
-    plugindir="$withval", plugindir="")
-if test -z "$plugindir"; then
-    eval dir="$libdir"
-    case "$dir" in
-    /*) ;;
-    *) dir="$dir"
-    esac
-    plugindir="$dir/alsa-lib"
-fi
-AC_DEFINE_UNQUOTED(ALSA_PLUGIN_DIR, "$plugindir",
-                   [directory containing ALSA add-on modules])
-ALSA_PLUGIN_DIR="$plugindir"
-AC_SUBST(ALSA_PLUGIN_DIR)
-
-# Determine CRAS configuration directory.
-eval cras_config_file_dir="$sysconfdir/cras"
-AC_DEFINE_UNQUOTED(CRAS_CONFIG_FILE_DIR, "$cras_config_file_dir",
-                   [directory containing CRAS configuration])
-
-# CRAS socket dir
-AC_ARG_WITH(socketdir,
-    AS_HELP_STRING([--with-socketdir=dir],
-        [path where CRAS stores its sockets]),
-    socketdir="$withval",
-    socketdir="/run/cras")
-AC_DEFINE_UNQUOTED(CRAS_SOCKET_FILE_DIR, "$socketdir",
-                   [directory containing CRAS socket files])
-
-# SSE4_2 support
-AC_ARG_ENABLE(sse42, [AS_HELP_STRING([--enable-sse42],[enable SSE42 optimizations])], have_sse42=$enableval, have_sse42=yes)
-if  test "x$host_cpu" != xx86_64; then
-	have_sse42=no
-fi
-if test "$have_sse42" = "yes"; then
-        AC_DEFINE(HAVE_SSE42,1,[Define to enable SSE42 optimizations.])
-	SSE42_CFLAGS="-DOPS_SSE42 -msse4.2 -ffast-math"
-fi
-AM_CONDITIONAL(HAVE_SSE42, test "$have_sse42" = "yes")
-AC_SUBST(SSE42_CFLAGS)
-
-# AVX support
-AC_ARG_ENABLE(avx, [AS_HELP_STRING([--enable-avx],[enable AVX optimizations])], have_avx=$enableval, have_avx=yes)
-if  test "x$host_cpu" != xx86_64; then
-	have_avx=no
-fi
-if test "$have_avx" = "yes"; then
-        AC_DEFINE(HAVE_AVX,1,[Define to enable AVX optimizations.])
-	AVX_CFLAGS="-DOPS_AVX -mavx -ffast-math"
-fi
-AM_CONDITIONAL(HAVE_AVX, test "$have_avx" = "yes")
-AC_SUBST(AVX_CFLAGS)
-
-# AVX2 support
-AC_ARG_ENABLE(avx2, [AS_HELP_STRING([--enable-avx2],[enable AVX2 optimizations])], have_avx2=$enableval, have_avx2=yes)
-if  test "x$host_cpu" != xx86_64; then
-	have_avx2=no
-fi
-if test "$have_avx2" = "yes"; then
-        AC_DEFINE(HAVE_AVX2,1,[Define to enable AVX2 optimizations.])
-	AVX2_CFLAGS="-DOPS_AVX2 -mavx2 -ffast-math"
-fi
-AM_CONDITIONAL(HAVE_AVX2, test "$have_avx2" = "yes")
-AC_SUBST(AVX2_CFLAGS)
-
-# FMA support
-AC_ARG_ENABLE(fma, [AS_HELP_STRING([--enable-fma],[enable FMA optimizations])], have_fma=$enableval, have_fma=yes)
-if  test "x$host_cpu" != xx86_64; then
-	have_fma=no
-fi
-if test "$have_fma" = "yes"; then
-        AC_DEFINE(HAVE_FMA,1,[Define to enable FMA optimizations.])
-	FMA_CFLAGS="-DOPS_FMA -mavx2 -mfma -ffast-math"
-fi
-AM_CONDITIONAL(HAVE_FMA, test "$have_fma" = "yes")
-AC_SUBST(FMA_CFLAGS)
-
-AC_OUTPUT
-
-AC_MSG_NOTICE([
-
-Enable SSE42:                  ${have_sse42}
-Enable AVX:                    ${have_avx}
-Enable AVX2:                   ${have_avx2}
-Enable FMA:                    ${have_fma}
-])
diff --git a/cras/cras.mk b/cras/cras.mk
deleted file mode 100644
index 8ad715e..0000000
--- a/cras/cras.mk
+++ /dev/null
@@ -1,32 +0,0 @@
-# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-#include $(ADHD_DIR)/defs/definitions.mk
-CWARN=
-CFLAGS=
-
-$(ADHD_DIR)/cras/configure: $(ADHD_DIR)/cras/configure.ac \
-                            $(ADHD_DIR)/cras/Makefile.am
-	(cd $(ADHD_DIR)/cras		&&	\
-	$(ADHD_DIR)/cras/git_prepare.sh)
-
-$(ADHD_DIR)/cras/Makefile: $(ADHD_DIR)/cras/configure
-	(cd $(ADHD_DIR)/cras		&&	\
-	$(ADHD_DIR)/cras/configure		\
-	    --build=$(CBUILD)			\
-	    --host=$(CHOST)			\
-	    --prefix=/usr			\
-	    --mandir=/usr/share/man		\
-	    --infodir=/usr/share/info		\
-	    --datadir=/usr/share		\
-	    --sysconfdir=/etc			\
-	    --localstatedir=/var/lib)
-
-cras: $(ADHD_DIR)/cras/Makefile
-	(cd $(ADHD_DIR)/cras		&&	\
-	$(MAKE) -f $(ADHD_DIR)/cras/Makefile)
-
-cras_install:
-	(cd $(ADHD_DIR)/cras		&&	\
-	$(MAKE) -f $(ADHD_DIR)/cras/Makefile install)
-
diff --git a/cras/examples/Makefile b/cras/examples/Makefile
deleted file mode 100644
index 2e23692..0000000
--- a/cras/examples/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
-cplay: cplay.c
-	gcc -o cplay cplay.c -lcras
-
-cplay_buffer: cplay_buffer.c
-	gcc -o cplay_buffer cplay_buffer.c -lcras
diff --git a/cras/examples/cplay.c b/cras/examples/cplay.c
deleted file mode 100644
index eb6d8e6..0000000
--- a/cras/examples/cplay.c
+++ /dev/null
@@ -1,100 +0,0 @@
-/* Copyright (c) 2015 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- *
- * This example plays a file.  The filename is the only argument.  The file is
- * assumed to contain raw stereo 16-bit PCM data to be played at 48kHz.
- * usage:  cplay <filename>
- */
-
-#include <cras_client.h>
-#include <cras_helpers.h>
-#include <stdio.h>
-#include <stdint.h>
-
-/* Used as a cookie for the playing stream. */
-struct stream_data {
-	int fd;
-	unsigned int frame_bytes;
-};
-
-/* Run from callback thread. */
-static int put_samples(struct cras_client *client, cras_stream_id_t stream_id,
-		       uint8_t *captured_samples, uint8_t *playback_samples,
-		       unsigned int frames,
-		       const struct timespec *captured_time,
-		       const struct timespec *playback_time, void *user_arg)
-{
-	struct stream_data *data = (struct stream_data *)user_arg;
-	int nread;
-
-	nread = read(data->fd, playback_samples, frames * data->frame_bytes);
-	if (nread <= 0)
-		return EOF;
-
-	return nread / data->frame_bytes;
-}
-
-/* Run from callback thread. */
-static int stream_error(struct cras_client *client, cras_stream_id_t stream_id,
-			int err, void *arg)
-{
-	printf("Stream error %d\n", err);
-	exit(err);
-	return 0;
-}
-
-int main(int argc, char **argv)
-{
-	struct cras_client *client;
-	cras_stream_id_t stream_id;
-	struct stream_data *data;
-	int rc = 0;
-	int fd;
-	const unsigned int block_size = 4800;
-	const unsigned int num_channels = 2;
-	const unsigned int rate = 48000;
-	const unsigned int flags = 0;
-
-	if (argc < 2)
-		printf("Usage: %s filename\n", argv[0]);
-
-	fd = open(argv[1], O_RDONLY);
-	if (fd < 0) {
-		perror("failed to open file");
-		return -errno;
-	}
-
-	rc = cras_helper_create_connect(&client);
-	if (rc < 0) {
-		fprintf(stderr, "Couldn't create client.\n");
-		close(fd);
-		return rc;
-	}
-
-	data = malloc(sizeof(*data));
-	data->fd = fd;
-	data->frame_bytes = 4;
-
-	rc = cras_helper_add_stream_simple(client, CRAS_STREAM_OUTPUT, data,
-					   put_samples, stream_error,
-					   SND_PCM_FORMAT_S16_LE, rate,
-					   num_channels, NO_DEVICE, &stream_id);
-	if (rc < 0) {
-		fprintf(stderr, "adding a stream %d\n", rc);
-		goto destroy_exit;
-	}
-
-	/* At this point the stream has been added and audio callbacks will
-	 * start to fire.  This app can now go off and do other things, but this
-	 * example just loops forever. */
-	while (1) {
-		sleep(1);
-	}
-
-destroy_exit:
-	cras_client_destroy(client);
-	close(fd);
-	free(data);
-	return rc;
-}
diff --git a/cras/examples/cplay_buffer.c b/cras/examples/cplay_buffer.c
deleted file mode 100644
index 07e5d0f..0000000
--- a/cras/examples/cplay_buffer.c
+++ /dev/null
@@ -1,77 +0,0 @@
-/* Copyright (c) 2015 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- *
- * This example plays a file.  The filename is the only argument.  The file is
- * assumed to contain raw stereo 16-bit PCM data to be played at 48kHz.
- * usage:  cplay <filename>
- */
-
-#include <cras_client.h>
-#include <cras_helpers.h>
-#include <sys/param.h>
-#include <stdio.h>
-#include <stdint.h>
-
-int main(int argc, char **argv)
-{
-	struct cras_client *client;
-	cras_stream_id_t stream_id;
-	int rc = 0;
-	int fd;
-	const unsigned int num_channels = 2;
-	const unsigned int rate = 48000;
-	const unsigned int flags = 0;
-	uint8_t *buffer;
-	int nread;
-
-	if (argc < 2)
-		printf("Usage: %s filename\n", argv[0]);
-
-	fd = open(argv[1], O_RDONLY);
-	if (fd < 0) {
-		perror("failed to open file");
-		return -errno;
-	}
-
-	buffer = malloc(48000 * 4 * 5);
-
-	nread = read(fd, buffer, 48000 * 4 * 5);
-	if (nread <= 0) {
-		free(buffer);
-		close(fd);
-		return nread;
-	}
-
-	rc = cras_helper_create_connect(&client);
-	if (rc < 0) {
-		fprintf(stderr, "Couldn't create client.\n");
-		free(buffer);
-		close(fd);
-		return rc;
-	}
-
-	rc = cras_helper_play_buffer(client, buffer, nread / 4,
-				     SND_PCM_FORMAT_S16_LE, rate, num_channels,
-				     cras_client_get_first_dev_type_idx(
-					     client,
-					     CRAS_NODE_TYPE_INTERNAL_SPEAKER,
-					     CRAS_STREAM_OUTPUT));
-	if (rc < 0) {
-		fprintf(stderr, "playing a buffer %d\n", rc);
-		goto destroy_exit;
-	}
-
-	/* At this point the stream has been added and audio callbacks will
-	 * start to fire.  This app can now go off and do other things, but this
-	 * example just loops forever. */
-	while (1) {
-		sleep(1);
-	}
-
-destroy_exit:
-	cras_client_destroy(client);
-	free(buffer);
-	close(fd);
-	return rc;
-}
diff --git a/cras/git_prepare.sh b/cras/git_prepare.sh
deleted file mode 100755
index d53eb06..0000000
--- a/cras/git_prepare.sh
+++ /dev/null
@@ -1,5 +0,0 @@
-# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-#!/bin/sh
-libtoolize && aclocal && autoconf && automake --add-missing
diff --git a/cras/install_deps.sh b/cras/install_deps.sh
deleted file mode 100755
index 6eac01a..0000000
--- a/cras/install_deps.sh
+++ /dev/null
@@ -1,51 +0,0 @@
-#!/bin/sh
-apt-get install -y \
-  automake \
-  build-essential \
-  cmake \
-  g++ \
-  gdb \
-  git \
-  ladspa-sdk \
-  libasound-dev \
-  libdbus-1-dev \
-  libncurses5-dev \
-  libsbc-dev \
-  libsndfile-dev \
-  libspeexdsp-dev \
-  libtool \
-  libudev-dev \
-  wget \
-  zip
-cd /tmp
-git clone https://github.com/ndevilla/iniparser.git
-cd iniparser
-make
-cp libiniparser.* /usr/local/lib
-cp src/dictionary.h src/iniparser.h /usr/local/include
-chmod 644 /usr/local/include/dictionary.h /usr/local/include/iniparser.h
-chmod 644 /usr/local/lib/libiniparser.a
-chmod 755 /usr/local/lib/libiniparser.so.*
-
-cd /tmp
-git clone https://github.com/google/googletest.git -b v1.8.x
-cd googletest
-mkdir build
-cd build
-cmake .. -DBUILD_SHARED_LIBS=ON \
-  -DINSTALL_GTEST=ON \
-  -DCMAKE_INSTALL_PREFIX:PATH=/usr
-make
-make install
-
-# Need to build and install alsa so there is a static lib.
-mkdir -p /tmp/alsa-build &&
-  cd /tmp/alsa-build && \
-  wget ftp://ftp.alsa-project.org/pub/lib/alsa-lib-1.1.4.1.tar.bz2 && \
-  bzip2 -f -d alsa-lib-* && \
-  tar xf alsa-lib-* && \
-  cd alsa-lib-* && \
-  ./configure --enable-static --disable-shared && \
-  make clean && \
-  make -j$(nproc) all && \
-  make install
diff --git a/cras/libcras.pc.in b/cras/libcras.pc.in
deleted file mode 100644
index 0637522..0000000
--- a/cras/libcras.pc.in
+++ /dev/null
@@ -1,11 +0,0 @@
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-libdir=@libdir@
-includedir=@includedir@
-modlibexecdir=@modlibexecdir@
-
-Name: libcras
-Description: ChromeOS Audio Server Interface
-Version: @PACKAGE_VERSION@
-Libs: -L${libdir} -lcras
-Cflags: -I${includedir}
diff --git a/cras/src/Android.bp b/cras/src/Android.bp
deleted file mode 100644
index 17b9919..0000000
--- a/cras/src/Android.bp
+++ /dev/null
@@ -1,44 +0,0 @@
-package {
-    // See: http://go/android-license-faq
-    // A large-scale-change added 'default_applicable_licenses' to import
-    // all of the 'license_kinds' from "external_adhd_license"
-    // to get the below license kinds:
-    //   SPDX-license-identifier-BSD
-    //   SPDX-license-identifier-LGPL
-    default_applicable_licenses: ["external_adhd_license"],
-}
-
-cc_library_static {
-    name: "libcras",
-
-    srcs: [
-        "common/cras_audio_format.c",
-        "common/cras_config.c",
-        "common/cras_file_wait.c",
-        "common/cras_shm.c",
-        "common/cras_util.c",
-        "common/edid_utils.c",
-        "libcras/cras_client.c",
-        "libcras/cras_helpers.c",
-    ],
-
-    shared_libs: [
-        "libcutils",
-        "libtinyalsa",
-    ],
-
-    export_include_dirs: [
-        "common",
-        "libcras",
-    ],
-
-    cflags: [
-        "-DCRAS_SOCKET_FILE_DIR=\"/var/run/cras\"",
-        "-Wall",
-        "-Werror",
-        "-Wno-error=missing-field-initializers",
-        "-Wno-sign-compare",
-        "-Wno-unused-function",
-        "-Wno-unused-parameter",
-    ],
-}
diff --git a/cras/src/Makefile.am b/cras/src/Makefile.am
deleted file mode 100644
index 1e89f81..0000000
--- a/cras/src/Makefile.am
+++ /dev/null
@@ -1,1078 +0,0 @@
-# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-AUTOMAKE_OPTIONS = subdir-objects
-ACLOCAL_AMFLAGS = ${ACLOCAL_FLAGS}
-
-if HAVE_SSE42
-CRAS_SSE4_2 = libcrasmix_sse42.la
-else
-CRAS_SSE4_2 =
-endif
-
-if HAVE_AVX
-CRAS_AVX = libcrasmix_avx.la
-else
-CRAS_AVX =
-endif
-
-if HAVE_AVX2
-CRAS_AVX2 = libcrasmix_avx2.la
-else
-CRAS_AVX2 =
-endif
-
-if HAVE_FMA
-CRAS_FMA = libcrasmix_fma.la
-else
-CRAS_FMA =
-endif
-
-if HAVE_WEBRTC_APM
-CRAS_WEBRTC_APM_SOURCES = \
-	server/cras_apm_list.c
-else
-CRAS_WEBRTC_APM_SOURCES =
-endif
-
-CRAS_UT_TMPDIR_CFLAGS=-DCRAS_UT_TMPDIR=\"/tmp\"
-COMMON_CPPFLAGS = -O2 -Wall -Werror -Wno-error=cpp
-COMMON_SIMD_CPPFLAGS = -O3 -Wall -Werror -Wno-error=cpp
-
-bin_PROGRAMS = cras cras_test_client cras_monitor cras_router
-noinst_PROGRAMS =
-
-if HAVE_DBUS
-CRAS_DBUS_SOURCES = \
-	common/cras_sbc_codec.c \
-	common/packet_status_logger.c \
-	server/cras_bt_manager.c \
-	server/cras_bt_adapter.c \
-	server/cras_bt_device.c \
-	server/cras_bt_transport.c \
-	server/cras_bt_endpoint.c \
-	server/cras_bt_player.c \
-	server/cras_bt_io.c \
-	server/cras_bt_profile.c \
-	server/cras_bt_battery_provider.c \
-	server/cras_dbus.c \
-	server/cras_dbus_util.c \
-	server/cras_dbus_control.c \
-	server/cras_hfp_ag_profile.c \
-	server/cras_hfp_iodev.c \
-	server/cras_hfp_alsa_iodev.c \
-	server/cras_hfp_info.c \
-	server/cras_hfp_slc.c \
-	server/cras_a2dp_endpoint.c \
-	server/cras_a2dp_info.c \
-	server/cras_a2dp_iodev.c \
-	server/cras_telephony.c \
-	server/cras_utf8.c
-else
-CRAS_DBUS_SOURCES =
-endif
-
-if HAVE_SELINUX
-CRAS_SELINUX_SOURCES = common/cras_selinux_helper.c
-CRAS_SELINUX_UNITTEST_SOURCES = tests/cras_selinux_helper_unittest.c
-else
-CRAS_SELINUX_SOURCES =
-CRAS_SELINUX_UNITTEST_SOURCES =
-endif
-
-cras_server_SOURCES = \
-	$(CRAS_DBUS_SOURCES) \
-	$(CRAS_SELINUX_SOURCES) \
-	$(CRAS_WEBRTC_APM_SOURCES) \
-	common/cras_audio_format.c \
-	common/cras_checksum.c \
-	common/cras_config.c \
-	common/cras_metrics.c \
-	common/cras_shm.c \
-	common/cras_util.c \
-	common/dumper.c \
-	common/edid_utils.c \
-	common/sfh.c \
-	dsp/biquad.c \
-	dsp/crossover.c \
-	dsp/crossover2.c \
-	dsp/dcblock.c \
-	dsp/drc.c \
-	dsp/drc_kernel.c \
-	dsp/drc_math.c \
-	dsp/dsp_util.c \
-	dsp/eq.c \
-	dsp/eq2.c \
-	plc/cras_plc.c\
-	server/audio_thread.c \
-	server/buffer_share.c \
-	server/config/cras_board_config.c \
-	server/config/cras_card_config.c \
-	server/config/cras_device_blocklist.c \
-	server/cras_alert.c \
-	server/cras_alsa_card.c \
-	server/cras_alsa_helpers.c \
-	server/cras_alsa_io.c \
-	server/cras_alsa_jack.c \
-	server/cras_alsa_mixer.c \
-	server/cras_alsa_mixer_name.c \
-	server/cras_alsa_plugin_io.c \
-	server/cras_alsa_ucm.c \
-	server/cras_alsa_ucm_section.c \
-	server/cras_audio_area.c \
-	server/cras_audio_thread_monitor.c \
-	server/cras_device_monitor.c \
-	server/cras_dsp.c \
-	server/cras_dsp_ini.c \
-	server/cras_dsp_mod_builtin.c \
-	server/cras_dsp_mod_ladspa.c \
-	server/cras_dsp_pipeline.c \
-	server/cras_empty_iodev.c \
-	server/cras_expr.c \
-	server/cras_fmt_conv.c \
-	server/cras_fmt_conv_ops.c \
-	server/cras_gpio_jack.c \
-	server/cras_hotword_handler.c \
-	server/cras_iodev.c \
-	server/cras_iodev_list.c \
-	server/cras_loopback_iodev.c \
-	server/cras_main_message.c \
-	server/cras_mix.c \
-	server/cras_non_empty_audio_handler.c \
-	server/cras_observer.c \
-	server/cras_ramp.c \
-	server/cras_rclient.c \
-	server/cras_rclient_util.c \
-	server/cras_control_rclient.c \
-	server/cras_playback_rclient.c \
-	server/cras_capture_rclient.c \
-	server/cras_unified_rclient.c \
-	server/cras_rstream.c \
-	server/cras_rstream_config.c \
-	server/cras_server_metrics.c \
-	server/cras_system_state.c \
-	server/cras_tm.c \
-	server/cras_udev.c \
-	server/cras_volume_curve.c \
-	server/dev_io.c \
-	server/dev_stream.c \
-	server/ewma_power.c \
-	server/input_data.c \
-	server/linear_resampler.c \
-	server/polled_interval_checker.c \
-	server/server_stream.c \
-	server/stream_list.c \
-	server/test_iodev.c \
-	server/softvol_curve.c
-
-SERVER_RUST_SRCDIR = $(top_srcdir)/src/server/rust
-
-libcrasserver_la_SOURCES = \
-	$(cras_server_SOURCES)
-libcrasserver_la_CPPFLAGS = $(COMMON_CPPFLAGS) -I$(top_srcdir)/src/common \
-	-I$(top_srcdir)/src/dsp -I$(top_srcdir)/src/server \
-	-I$(top_srcdir)/src/server/config -I$(top_srcdir)/src/plc \
-	-I$(SERVER_RUST_SRCDIR)/src/headers \
-	$(DBUS_CFLAGS) $(SBC_CFLAGS) $(SELINUX_CFLAGS)
-libcrasserver_la_LIBADD = \
-	$(CRAS_RUST) \
-	libcrasmix.la \
-	$(CRAS_SSE4_2) \
-	$(CRAS_AVX) \
-	$(CRAS_AVX2) \
-	$(CRAS_FMA) \
-	-lpthread -lasound -lrt -liniparser -ludev -ldl -lm -lspeexdsp \
-	$(SBC_LIBS) \
-	$(DBUS_LIBS) \
-	$(SELINUX_LIBS)
-
-cras_SOURCES = \
-	server/cras.c \
-	server/cras_server.c
-
-cras_CPPFLAGS = $(COMMON_CPPFLAGS) -I$(top_srcdir)/src/common \
-	-I$(top_srcdir)/src/dsp -I$(top_srcdir)/src/server \
-	-I$(top_srcdir)/src/server/config -I$(top_srcdir)/src/plc \
-	$(DBUS_CFLAGS) $(SBC_CFLAGS)
-
-cras_LDADD = \
-	libcrasmix.la \
-	libcrasserver.la \
-	$(CRAS_SSE4_2) \
-	$(CRAS_AVX) \
-	$(CRAS_AVX2) \
-	$(CRAS_FMA) \
-	$(CRAS_RUST) \
-	-lpthread -lasound -lrt -liniparser -ludev -ldl -lm -lspeexdsp \
-	$(METRICS_LIBS) \
-	$(SBC_LIBS) \
-	$(DBUS_LIBS) \
-	$(WEBRTC_APM_LIBS)
-
-noinst_LTLIBRARIES = \
-	$(CRAS_SSE4_2) \
-	$(CRAS_AVX) \
-	$(CRAS_AVX2) \
-	$(CRAS_FMA) \
-	libcrasmix.la \
-	libcrasserver.la
-
-libcrasmix_la_SOURCES = \
-	server/cras_mix_ops.c
-
-libcrasmix_la_CFLAGS = \
-	$(COMMON_CPPFLAGS) -I$(top_srcdir)/src/common \
-	-I$(top_srcdir)/src/dsp -I$(top_srcdir)/src/server \
-	-I$(top_srcdir)/src/server/config -I$(top_srcdir)/src/plc \
-	$(DBUS_CFLAGS) $(SBC_CFLAGS)
-
-libcrasmix_sse42_la_SOURCES = \
-	server/cras_mix_ops.c
-
-libcrasmix_sse42_la_CFLAGS = \
-	$(COMMON_SIMD_CPPFLAGS) -I$(top_srcdir)/src/common \
-	-I$(top_srcdir)/src/dsp -I$(top_srcdir)/src/server \
-	-I$(top_srcdir)/src/server/config -I$(top_srcdir)/src/plc \
-	$(DBUS_CFLAGS) $(SSE42_CFLAGS)
-
-libcrasmix_avx_la_SOURCES = \
-	server/cras_mix_ops.c
-
-libcrasmix_avx_la_CFLAGS = \
-	$(COMMON_SIMD_CPPFLAGS) -I$(top_srcdir)/src/common \
-	-I$(top_srcdir)/src/dsp -I$(top_srcdir)/src/server \
-	-I$(top_srcdir)/src/server/config -I$(top_srcdir)/src/plc \
-	$(DBUS_CFLAGS) $(AVX_CFLAGS)
-
-libcrasmix_avx2_la_SOURCES = \
-	server/cras_mix_ops.c
-
-libcrasmix_avx2_la_CFLAGS = \
-	$(COMMON_SIMD_CPPFLAGS) -I$(top_srcdir)/src/common \
-	-I$(top_srcdir)/src/dsp -I$(top_srcdir)/src/server \
-	-I$(top_srcdir)/src/server/config -I$(top_srcdir)/src/plc \
-	$(DBUS_CFLAGS) $(AVX2_CFLAGS)
-
-libcrasmix_fma_la_SOURCES = \
-	server/cras_mix_ops.c
-
-libcrasmix_fma_la_CFLAGS = \
-	$(COMMON_SIMD_CPPFLAGS) -I$(top_srcdir)/src/common \
-	-I$(top_srcdir)/src/dsp -I$(top_srcdir)/src/server \
-	-I$(top_srcdir)/src/server/config -I$(top_srcdir)/src/plc \
-	$(DBUS_CFLAGS) $(FMA_CFLAGS)
-
-lib_LTLIBRARIES = libcras.la
-libcras_la_SOURCES = \
-	common/cras_audio_format.c \
-	common/cras_config.c \
-	common/cras_file_wait.c \
-	common/cras_shm.c \
-	common/cras_util.c \
-	common/edid_utils.c \
-	libcras/cras_client.c \
-	libcras/cras_helpers.c
-
-include_HEADERS = \
-	common/cras_audio_format.h \
-	common/cras_config.h \
-	common/cras_iodev_info.h \
-	common/cras_messages.h \
-	common/cras_shm.h \
-	common/cras_types.h \
-	common/cras_util.h \
-	common/edid_utils.h \
-	common/packet_status_logger.h \
-	common/utlist.h \
-	libcras/cras_client.h \
-	libcras/cras_helpers.h
-
-libcras_la_CPPFLAGS = $(COMMON_CPPFLAGS) -I$(top_srcdir)/src/common \
-	-I$(top_srcdir)/src/libcras
-libcras_la_LIBADD = -lpthread -lasound -lrt
-libcras_la_LDFLAGS = -version-info 0:0:0
-
-asound_module_pcm_cras_LTLIBRARIES = libasound_module_pcm_cras.la
-asound_module_ctl_cras_LTLIBRARIES = libasound_module_ctl_cras.la
-asound_module_pcm_crasdir = @ALSA_PLUGIN_DIR@
-asound_module_ctl_crasdir = @ALSA_PLUGIN_DIR@
-libasound_module_pcm_cras_la_CPPFLAGS = $(COMMON_CPPFLAGS) -I$(top_srcdir)/src/common \
-	-I$(top_srcdir)/src/libcras
-libasound_module_pcm_cras_la_LDFLAGS = -module -avoid-version -export-dynamic -no-undefined \
-	$(LDFLAGS_NOUNDEFINED)
-libasound_module_ctl_cras_la_CPPFLAGS = $(COMMON_CPPFLAGS) -I$(top_srcdir)/src/common \
-	-I$(top_srcdir)/src/libcras
-libasound_module_ctl_cras_la_LDFLAGS = -module -avoid-version -export-dynamic -no-undefined \
-	$(LDFLAGS_NOUNDEFINED)
-libasound_module_pcm_cras_la_SOURCES = alsa_plugin/pcm_cras.c
-libasound_module_pcm_cras_la_LIBADD = -lasound libcras.la
-libasound_module_ctl_cras_la_SOURCES = alsa_plugin/ctl_cras.c
-libasound_module_ctl_cras_la_LIBADD = -lasound libcras.la
-
-if !WITH_SYSTEM_RUST
-RUST_FILES = \
-	$(SERVER_RUST_SRCDIR)/Cargo.toml \
-	$(SERVER_RUST_SRCDIR)/src/rate_estimator_bindings.rs \
-	$(SERVER_RUST_SRCDIR)/src/rate_estimator.rs
-
-CRAS_RUST_TARGET_DIR = $(top_builddir)/src/server/rust/target
-CRAS_RUST = $(CRAS_RUST_TARGET_DIR)/release/libcras_rust.a
-$(CRAS_RUST): $(RUST_FILES)
-	cargo build --release \
-		--manifest-path $(SERVER_RUST_SRCDIR)/Cargo.toml \
-		--target-dir $(CRAS_RUST_TARGET_DIR)
-
-clean-local:
-	cargo clean --release \
-		--manifest-path $(SERVER_RUST_SRCDIR)/Cargo.toml \
-		--target-dir $(CRAS_RUST_TARGET_DIR)
-
-else
-CRAS_RUST = -lcras_rust
-endif
-
-# Inject a dependency between the installation rules of libcras and its modules.
-# This avoids a race when the modules are relinked before libcras is actually
-# installed.
-#
-# Automake will refuse to generate a rule that collides with a user-specified
-# one. The hide_install variable prevents automake from noticing these rules,
-# so everything else will behave as usual.
-hide_install=install
-$(hide_install)-asound_module_pcm_crasLTLIBRARIES: install-libLTLIBRARIES
-$(hide_install)-asound_module_ctl_crasLTLIBRARIES: install-libLTLIBRARIES
-
-# ==== Fuzzer section
-if HAVE_FUZZER
-FUZZERS = \
-	cras_rclient_message_fuzzer \
-	cras_hfp_slc_fuzzer
-
-noinst_PROGRAMS += $(FUZZERS)
-
-FUZZER_CPPFLAGS = $(COMMON_CPPFLAGS) \
-	-I$(top_srcdir)/src/common \
-	-I$(top_srcdir)/src/dsp -I$(top_srcdir)/src/server \
-	-I$(top_srcdir)/src/server/config -I$(top_srcdir)/src/plc \
-	$(DBUS_CFLAGS) $(SBC_CFLAGS)
-
-FUZZER_LDADD = \
-	libcrasmix.la \
-	libcrasserver.la \
-	$(CRAS_SSE4_2) \
-	$(CRAS_AVX) \
-	$(CRAS_AVX2) \
-	$(CRAS_FMA) \
-	$(CRAS_RUST) \
-	-lpthread -lasound -lrt -liniparser -ludev -ldl -lm -lspeexdsp \
-	$(METRICS_LIBS) \
-	$(SBC_LIBS) \
-	$(DBUS_LIBS) \
-	$(WEBRTC_APM_LIBS)
-
-cras_rclient_message_fuzzer_SOURCES = \
-	fuzz/rclient_message.cc
-
-cras_rclient_message_fuzzer_CPPFLAGS = $(FUZZER_CPPFLAGS)
-cras_rclient_message_fuzzer_LDFLAGS = $(FUZZER_LDFLAGS)
-cras_rclient_message_fuzzer_LDADD = $(FUZZER_LDADD)
-
-cras_hfp_slc_fuzzer_SOURCES = \
-	fuzz/cras_hfp_slc.cc
-
-cras_hfp_slc_fuzzer_CPPFLAGS = $(FUZZER_CPPFLAGS)
-cras_hfp_slc_fuzzer_LDFLAGS = $(FUZZER_LDFLAGS)
-cras_hfp_slc_fuzzer_LDADD = $(FUZZER_LDADD)
-endif
-
-# ==== Tests section
-if HAVE_DBUS
-DBUS_TESTS = \
-	a2dp_info_unittest \
-	a2dp_iodev_unittest \
-	alsa_io_unittest \
-	bt_device_unittest \
-	bt_io_unittest \
-	hfp_iodev_unittest \
-	hfp_alsa_iodev_unittest \
-	hfp_ag_profile_unittest \
-	hfp_slc_unittest
-else
-DBUS_TESTS =
-endif
-
-if HAVE_WEBRTC_APM
-CRAS_WEBRTC_APM_TESTS = \
-	apm_list_unittest
-else
-CRAS_WEBRTC_APM_TESTS =
-endif
-
-TESTS = \
-	$(DBUS_TESTS) \
-	$(CRAS_WEBRTC_APM_TESTS) \
-	audio_area_unittest \
-	audio_format_unittest \
-	audio_thread_unittest \
-	audio_thread_monitor_unittest \
-	alert_unittest \
-	alsa_card_unittest \
-	alsa_helpers_unittest \
-	alsa_jack_unittest \
-	alsa_mixer_unittest \
-	alsa_ucm_unittest \
-	array_unittest \
-	biquad_unittest \
-	byte_buffer_unittest \
-	card_config_unittest \
-	checksum_unittest \
-	cras_abi_unittest \
-	cras_client_unittest \
-	cras_tm_unittest \
-	device_monitor_unittest \
-	dev_io_unittest \
-	dev_stream_unittest \
-	device_blocklist_unittest \
-	dsp_core_unittest \
-	dsp_ini_unittest \
-	dsp_pipeline_unittest \
-	dsp_unittest \
-	dumper_unittest \
-	edid_utils_unittest \
-	empty_iodev_unittest \
-	expr_unittest \
-	ewma_power_unittest \
-	file_wait_unittest \
-	float_buffer_unittest \
-	fmt_conv_unittest \
-	fmt_conv_ops_unittest \
-	hfp_info_unittest \
-	buffer_share_unittest \
-	input_data_unittest \
-	iodev_list_unittest \
-	iodev_unittest \
-	loopback_iodev_unittest \
-	mix_unittest \
-	linear_resampler_unittest \
-	observer_unittest \
-	polled_interval_checker_unittest \
-	ramp_unittest \
-	rate_estimator_unittest \
-	control_rclient_unittest \
-	playback_rclient_unittest \
-	capture_rclient_unittest \
-	rstream_unittest \
-	shm_unittest \
-	server_metrics_unittest \
-	softvol_curve_unittest \
-	stream_list_unittest \
-	system_state_unittest \
-	timing_unittest \
-	utf8_unittest \
-	util_unittest \
-	volume_curve_unittest
-
-check_PROGRAMS = $(TESTS)
-
-cras_test_client_SOURCES = tools/cras_test_client/cras_test_client.c
-cras_test_client_LDADD = -lm libcras.la
-cras_test_client_CPPFLAGS = $(COMMON_CPPFLAGS) -I$(top_srcdir)/src/libcras \
-	-I$(top_srcdir)/src/common -I$(top_builddir)/src/common
-
-tools/cras_test_client/cras_test_client.c: common/cras_version.h
-
-cras_monitor_SOURCES = tools/cras_monitor/cras_monitor.c
-cras_monitor_LDADD = -lm libcras.la
-cras_monitor_CPPFLAGS = $(COMMON_CPPFLAGS) -I$(top_srcdir)/src/libcras \
-	-I$(top_srcdir)/src/common -I$(top_builddir)/src/common
-
-tools/cras_monitor/cras_monitor.c: common/cras_version.h
-
-cras_router_SOURCES = tools/cras_router/cras_router.c
-cras_router_LDADD = -lm libcras.la
-cras_router_CPPFLAGS = $(COMMON_CPPFLAGS) -I$(top_srcdir)/src/libcras \
-        -I$(top_srcdir)/src/common -I$(top_srcdir)/src/dsp \
-	-I$(top_srcdir)/src/server -I$(top_builddir)/src/common
-
-tools/cras_router/cras_router.c: common/cras_version.h
-
-CLEANFILES = common/cras_version.h
-.PHONY: common/cras_version.h
-common/cras_version.h:
-	if echo "$(CPPFLAGS)" | grep -q -- '-DVCSID='; then \
-		echo > $@.tmp; \
-	else \
-		commit="outoftree-$$(git rev-parse HEAD)"; \
-		if [ -n "$$(git diff-index --name-only HEAD)" ]; then \
-			commit="$${commit}-dirty"; \
-		fi; \
-		echo "#define VCSID \"$$commit\"" > $@.tmp; \
-	fi
-	diff $@.tmp $@ && rm -f $@.tmp || mv $@.tmp $@
-
-# dsp test programs (not run automatically)
-check_PROGRAMS += \
-	crossover_test \
-	crossover2_test \
-	dcblock_test \
-	drc_test \
-	dsp_util_test \
-	eq_test \
-	eq2_test \
-	cmpraw
-
-DSP_INCLUDE_PATHS = -I$(top_srcdir)/src/dsp -I$(top_srcdir)/src/common
-
-crossover_test_SOURCES = dsp/crossover.c dsp/biquad.c dsp/dsp_util.c \
-	dsp/tests/crossover_test.c dsp/tests/dsp_test_util.c dsp/tests/raw.c
-crossover_test_LDADD = -lrt -lm
-crossover_test_CPPFLAGS = $(COMMON_CPPFLAGS) $(DSP_INCLUDE_PATHS)
-
-crossover2_test_SOURCES = dsp/crossover2.c dsp/biquad.c dsp/dsp_util.c \
-	dsp/tests/crossover2_test.c dsp/tests/dsp_test_util.c dsp/tests/raw.c
-crossover2_test_LDADD = -lrt -lm
-crossover2_test_CPPFLAGS = $(COMMON_CPPFLAGS) $(DSP_INCLUDE_PATHS)
-
-dcblock_test_SOURCES = dsp/dcblock.c dsp/dsp_util.c dsp/tests/dcblock_test.c \
-	dsp/tests/dsp_test_util.c dsp/tests/raw.c
-dcblock_test_LDADD = -lrt -lm
-dcblock_test_CPPFLAGS = $(COMMON_CPPFLAGS) $(DSP_INCLUDE_PATHS)
-
-drc_test_SOURCES = dsp/drc.c dsp/drc_kernel.c dsp/drc_math.c \
-	dsp/crossover2.c dsp/eq2.c dsp/biquad.c dsp/dsp_util.c \
-	dsp/tests/drc_test.c dsp/tests/dsp_test_util.c dsp/tests/raw.c
-drc_test_LDADD = -lrt -lm
-drc_test_CPPFLAGS = $(COMMON_CPPFLAGS) $(DSP_INCLUDE_PATHS)
-
-dsp_util_test_SOURCES = dsp/tests/dsp_util_test.c dsp/dsp_util.c
-dsp_util_test_LDADD = -lm
-dsp_util_test_CPPFLAGS = $(COMMON_CPPFLAGS) $(DSP_INCLUDE_PATHS) -Wno-error=strict-aliasing
-
-eq_test_SOURCES = dsp/biquad.c dsp/eq.c dsp/dsp_util.c dsp/tests/eq_test.c \
-	dsp/tests/dsp_test_util.c dsp/tests/raw.c
-eq_test_LDADD = -lrt -lm
-eq_test_CPPFLAGS = $(COMMON_CPPFLAGS) $(DSP_INCLUDE_PATHS)
-
-eq2_test_SOURCES = dsp/biquad.c dsp/eq2.c dsp/dsp_util.c dsp/tests/eq2_test.c \
-	dsp/tests/dsp_test_util.c dsp/tests/raw.c
-eq2_test_LDADD = -lrt -lm
-eq2_test_CPPFLAGS = $(COMMON_CPPFLAGS) $(DSP_INCLUDE_PATHS)
-
-cmpraw_SOURCES = dsp/tests/cmpraw.c dsp/tests/raw.c
-cmpraw_LDADD = -lm
-cmpraw_CPPFLAGS = $(COMMON_CPPFLAGS) $(DSP_INCLUDE_PATHS)
-
-cras_plc_test_SOURCES = plc/cras_plc_test.c plc/cras_plc.c \
-	common/cras_sbc_codec.c
-cras_plc_test_LDADD = -lrt -lm $(SBC_LIBS)
-cras_plc_test_CPPFLAGS = $(COMMON_CPPFLAGS) -I$(top_srcdir)/src/plc \
-	-I$(top_srcdir)/src/common \
-	$(SBC_CFLAGS)
-check_PROGRAMS += cras_plc_test
-
-# unit tests
-alert_unittest_SOURCES = tests/alert_unittest.cc \
-	server/cras_alert.c
-alert_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) \
-	-I$(top_srcdir)/src/common \
-	-I$(top_srcdir)/src/server
-alert_unittest_LDADD = -lgtest -lpthread
-
-alsa_card_unittest_SOURCES = tests/alsa_card_unittest.cc \
-	server/cras_alsa_card.c server/cras_alsa_mixer_name.c \
-	server/cras_alsa_ucm_section.c
-alsa_card_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) \
-	-I$(top_srcdir)/src/common \
-	-I$(top_srcdir)/src/server \
-	-I$(top_srcdir)/src/server/config
-alsa_card_unittest_LDADD = -lgtest -lpthread
-
-alsa_helpers_unittest_SOURCES = tests/alsa_helpers_unittest.cc \
-	common/cras_audio_format.c
-alsa_helpers_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) \
-	-I$(top_srcdir)/src/common \
-	-I$(top_srcdir)/src/server
-alsa_helpers_unittest_LDADD = -lgtest -lpthread
-
-audio_area_unittest_SOURCES = tests/audio_area_unittest.cc \
-	server/cras_audio_area.c
-audio_area_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) -I$(top_srcdir)/src/server \
-	-I$(top_srcdir)/src/common
-audio_area_unittest_LDADD = -lgtest -lpthread
-
-audio_format_unittest_SOURCES = tests/audio_format_unittest.cc
-audio_format_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) -I$(top_srcdir)/src/server \
-	-I$(top_srcdir)/src/common
-audio_format_unittest_LDADD = -lgtest -lpthread
-
-if HAVE_DBUS
-a2dp_info_unittest_SOURCES =  \
-	server/cras_a2dp_info.c \
-	tests/a2dp_info_unittest.cc \
-	tests/sbc_codec_stub.cc
-a2dp_info_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) -I$(top_srcdir)/src/server \
-	-I$(top_srcdir)/src/common
-a2dp_info_unittest_LDADD = -lgtest -lpthread
-
-a2dp_iodev_unittest_SOURCES = tests/a2dp_iodev_unittest.cc
-a2dp_iodev_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) -I$(top_srcdir)/src/server \
-	-I$(top_srcdir)/src/common $(DBUS_CFLAGS)
-a2dp_iodev_unittest_LDADD = -lgtest -lpthread $(DBUS_LIBS)
-endif
-
-alsa_io_unittest_SOURCES = tests/alsa_io_unittest.cc server/softvol_curve.c \
-	common/sfh.c \
-	server/cras_alsa_ucm_section.c \
-	server/cras_alsa_mixer_name.c
-alsa_io_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) $(DBUS_CFLAGS) \
-	-I$(top_srcdir)/src/server \
-	-I$(top_srcdir)/src/common \
-	-I$(top_srcdir)/src/server/config
-alsa_io_unittest_LDADD = -lgtest -lpthread
-
-alsa_jack_unittest_SOURCES = tests/alsa_jack_unittest.cc \
-	server/cras_alsa_jack.c \
-	server/cras_alsa_ucm_section.c \
-	server/cras_alsa_mixer_name.c
-alsa_jack_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) -I$(top_srcdir)/src/common \
-	-I$(top_srcdir)/src/server
-alsa_jack_unittest_LDADD = -lgtest -lpthread
-
-alsa_mixer_unittest_SOURCES = tests/alsa_mixer_unittest.cc \
-	server/cras_alsa_mixer_name.c \
-	server/cras_alsa_ucm_section.c
-alsa_mixer_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) \
-	-I$(top_srcdir)/src/common \
-	-I$(top_srcdir)/src/server \
-	-I$(top_srcdir)/src/server/config
-alsa_mixer_unittest_LDADD = -lgtest -lpthread
-
-alsa_ucm_unittest_SOURCES = tests/alsa_ucm_unittest.cc \
-	server/cras_alsa_mixer_name.c \
-	server/cras_alsa_ucm_section.c
-alsa_ucm_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) \
-	-I$(top_srcdir)/src/common \
-	-I$(top_srcdir)/src/server \
-	-I$(top_srcdir)/src/server/config
-alsa_ucm_unittest_LDADD = -lgtest -lpthread
-
-if HAVE_WEBRTC_APM
-apm_list_unittest_SOURCES = tests/apm_list_unittest.cc \
-	server/cras_apm_list.c
-apm_list_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) \
-	$(DSP_INCLUDE_PATHS) \
-	-I$(top_srcdir)/src/server \
-	-I$(top_srcdir)/src/server/config \
-	$(WEBRTC_APM_CFLAGS)
-apm_list_unittest_LDADD = -lgtest -liniparser
-endif
-
-array_unittest_SOURCES = tests/array_unittest.cc
-array_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) -I$(top_srcdir)/src/common
-array_unittest_LDADD = -lgtest -lpthread
-
-audio_thread_unittest_SOURCES = tests/audio_thread_unittest.cc \
-	server/dev_io.c tests/empty_audio_stub.cc tests/metrics_stub.cc \
-	common/cras_shm.c
-audio_thread_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) \
-	-I$(top_srcdir)/src/common -I$(top_srcdir)/src/server \
-	-I$(SERVER_RUST_SRCDIR)/src/headers
-audio_thread_unittest_LDADD = -lgtest -lpthread -lrt
-
-audio_thread_monitor_unittest_SOURCES = tests/audio_thread_monitor_unittest.cc
-audio_thread_monitor_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) \
-	-I$(top_srcdir)/src/common -I$(top_srcdir)/src/server
-audio_thread_monitor_unittest_LDADD = -lgtest -lpthread -lrt
-
-if HAVE_DBUS
-bt_device_unittest_SOURCES = tests/bt_device_unittest.cc \
-	server/cras_bt_device.c \
-	tests/metrics_stub.cc common/sfh.c
-bt_device_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) -I$(top_srcdir)/src/server \
-	-I$(top_srcdir)/src/common $(DBUS_CFLAGS)
-bt_device_unittest_LDADD = -lgtest -lpthread $(DBUS_LIBS)
-
-bt_io_unittest_SOURCES = tests/bt_io_unittest.cc common/sfh.c
-bt_io_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) -I$(top_srcdir)/src/server \
-	-I$(top_srcdir)/src/common $(DBUS_CFLAGS)
-bt_io_unittest_LDADD = -lgtest -lpthread $(DBUS_LIBS)
-endif
-
-biquad_unittest_SOURCES = tests/biquad_unittest.cc \
-	dsp/biquad.c
-biquad_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) $(DSP_INCLUDE_PATHS) \
-	-I$(top_srcdir)/src/server
-biquad_unittest_LDADD = -lgtest -lpthread -lm
-
-byte_buffer_unittest_SOURCES = tests/byte_buffer_unittest.cc
-byte_buffer_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) -I$(top_srcdir)/src/common
-byte_buffer_unittest_LDADD = -lgtest -lpthread
-
-card_config_unittest_SOURCES = tests/card_config_unittest.cc \
-	server/config/cras_card_config.c
-card_config_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) \
-	-I$(top_srcdir)/src/common -I$(top_srcdir)/src/server \
-	-I$(top_srcdir)/src/server/config $(CRAS_UT_TMPDIR_CFLAGS)
-card_config_unittest_LDADD = -lgtest -liniparser -lpthread
-
-checksum_unittest_SOURCES = tests/checksum_unittest.cc common/cras_checksum.c
-checksum_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) -I$(top_srcdir)/src/common
-checksum_unittest_LDADD = -lgtest -lpthread
-
-cras_abi_unittest_SOURCES = tests/cras_abi_unittest.cc \
-	common/cras_config.c common/cras_shm.c common/cras_util.c \
-	common/cras_file_wait.c common/cras_audio_format.c
-cras_abi_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) -I$(top_srcdir)/src/common \
-	-I$(top_srcdir)/src/libcras
-cras_abi_unittest_LDADD = -lgtest -lpthread -lrt -lspeexdsp
-
-cras_client_unittest_SOURCES = tests/cras_client_unittest.cc \
-	common/cras_config.c common/cras_shm.c common/cras_util.c \
-	common/cras_file_wait.c
-cras_client_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) -I$(top_srcdir)/src/common \
-	-I$(top_srcdir)/src/libcras
-cras_client_unittest_LDADD = -lgtest -lpthread -lrt -lspeexdsp
-
-cras_tm_unittest_SOURCES = tests/cras_tm_unittest.cc server/cras_tm.c
-cras_tm_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) -I$(top_srcdir)/src/common \
-	 -I$(top_srcdir)/src/server
-cras_tm_unittest_LDADD = -lgtest -lpthread
-
-dev_io_unittest_SOURCES = \
-	$(CRAS_SELINUX_UNITTEST_SOURCES) \
-	common/cras_audio_format.c \
-	server/dev_io.c \
-	tests/dev_io_stubs.cc \
-	tests/iodev_stub.cc \
-	tests/empty_audio_stub.cc \
-	tests/metrics_stub.cc \
-	tests/rstream_stub.cc \
-	tests/dev_io_unittest.cc
-dev_io_unittest_CXXFLAGS = \
-	-std=c++11 -Wno-noexcept-type
-dev_io_unittest_CPPFLAGS = \
-	$(COMMON_CPPFLAGS) \
-	-I$(top_srcdir)/src/common \
-	-I$(top_srcdir)/src/server \
-	-I$(top_srcdir)/src/server/config \
-	-I$(SERVER_RUST_SRCDIR)/src/headers \
-	$(SELINUX_CFLAGS)
-dev_io_unittest_LDADD = \
-	libcrasmix.la \
-	$(CRAS_SSE4_2) \
-	$(CRAS_AVX) \
-	$(CRAS_AVX2) \
-	$(CRAS_FMA) \
-	$(SELINUX_LIBS) \
-	-lgtest -lrt -lpthread -ldl -lm -lspeexdsp
-
-dev_stream_unittest_SOURCES = tests/dev_stream_unittest.cc \
-	server/dev_stream.c common/cras_shm.c
-dev_stream_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) \
-	-I$(top_srcdir)/src/common -I$(top_srcdir)/src/server
-dev_stream_unittest_LDADD = -lgtest -liniparser -lpthread -lrt
-
-device_blocklist_unittest_SOURCES = tests/device_blocklist_unittest.cc \
-	server/config/cras_device_blocklist.c
-device_blocklist_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) \
-	-I$(top_srcdir)/src/common -I$(top_srcdir)/src/server \
-	-I$(top_srcdir)/src/server/config $(CRAS_UT_TMPDIR_CFLAGS)
-device_blocklist_unittest_LDADD = -lgtest -liniparser -lpthread
-
-device_monitor_unittest_SOURCES = tests/device_monitor_unittest.cc
-device_monitor_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) -I$(top_srcdir)/src/common \
-	-I$(top_srcdir)/src/server
-device_monitor_unittest_LDADD = -lgtest -lpthread
-
-dsp_core_unittest_SOURCES = tests/dsp_core_unittest.cc dsp/eq.c dsp/eq2.c \
-	dsp/biquad.c dsp/dsp_util.c dsp/crossover.c dsp/crossover2.c dsp/drc.c \
-	dsp/drc_kernel.c dsp/drc_math.c
-dsp_core_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) $(DSP_INCLUDE_PATHS)
-dsp_core_unittest_LDADD = -lgtest -lpthread
-
-dsp_ini_unittest_SOURCES = tests/dsp_ini_unittest.cc \
-	server/cras_dsp_ini.c server/cras_expr.c common/dumper.c
-dsp_ini_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) -I$(top_srcdir)/src/common \
-	-I$(top_srcdir)/src/server
-dsp_ini_unittest_LDADD = -lgtest -liniparser -lpthread
-
-dsp_pipeline_unittest_SOURCES = tests/cras_dsp_pipeline_unittest.cc \
-	server/cras_dsp_ini.c server/cras_expr.c server/cras_dsp_pipeline.c \
-	common/dumper.c dsp/dsp_util.c
-dsp_pipeline_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) \
-	-I$(top_srcdir)/src/server $(DSP_INCLUDE_PATHS)
-dsp_pipeline_unittest_LDADD = -lgtest -lrt -liniparser -lpthread
-
-dsp_unittest_SOURCES = tests/dsp_unittest.cc \
-	server/cras_dsp.c server/cras_dsp_ini.c server/cras_dsp_pipeline.c \
-	server/cras_expr.c common/dumper.c dsp/dsp_util.c \
-	dsp/tests/dsp_test_util.c
-dsp_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) \
-	-I$(top_srcdir)/src/server $(DSP_INCLUDE_PATHS)
-dsp_unittest_LDADD = -lgtest -lrt -liniparser -lpthread
-
-dumper_unittest_SOURCES = tests/dumper_unittest.cc common/dumper.c
-dumper_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) -I$(top_srcdir)/src/common
-dumper_unittest_LDADD = -lgtest -lpthread
-
-edid_utils_unittest_SOURCES = tests/edid_utils_unittest.cc common/edid_utils.c
-edid_utils_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) -I$(top_srcdir)/src/common
-edid_utils_unittest_LDADD = -lgtest -lpthread
-
-empty_iodev_unittest_SOURCES = tests/empty_iodev_unittest.cc \
-	server/cras_empty_iodev.c
-empty_iodev_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) -I$(top_srcdir)/src/common \
-	-I$(top_srcdir)/src/server
-empty_iodev_unittest_LDADD = -lgtest -lpthread
-
-expr_unittest_SOURCES = tests/expr_unittest.cc server/cras_expr.c common/dumper.c
-expr_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) -I$(top_srcdir)/src/common \
-	-I$(top_srcdir)/src/server
-expr_unittest_LDADD = -lgtest -lpthread
-
-file_wait_unittest_SOURCES = tests/file_wait_unittest.cc \
-	common/cras_file_wait.c common/cras_util.c
-file_wait_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) -I$(top_srcdir)/src/common \
-	$(CRAS_UT_TMPDIR_CFLAGS)
-file_wait_unittest_LDADD = -lgtest -lpthread
-
-
-float_buffer_unittest_SOURCES = tests/float_buffer_unittest.cc
-float_buffer_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) -I$(top_srcdir)/src/common \
-	-I$(top_srcdir)/src/server
-float_buffer_unittest_LDADD = -lgtest -lpthread
-
-fmt_conv_unittest_SOURCES = tests/fmt_conv_unittest.cc server/cras_fmt_conv.c \
-	server/cras_fmt_conv_ops.c
-fmt_conv_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) -I$(top_srcdir)/src/common \
-	 -I$(top_srcdir)/src/server
-fmt_conv_unittest_LDADD = -lasound -lspeexdsp -lgtest -lpthread
-
-fmt_conv_ops_unittest_SOURCES = tests/fmt_conv_ops_unittest.cc \
-	server/cras_fmt_conv_ops.c
-fmt_conv_ops_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) -I$(top_srcdir)/src/common \
-	 -I$(top_srcdir)/src/server
-fmt_conv_ops_unittest_LDADD = -lasound -lspeexdsp -lgtest -lpthread
-
-hfp_info_unittest_SOURCES = tests/hfp_info_unittest.cc \
-	tests/metrics_stub.cc tests/sbc_codec_stub.cc
-hfp_info_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) -I$(top_srcdir)/src/common \
-	-I$(top_srcdir)/src/server -I$(top_srcdir)/src/plc
-hfp_info_unittest_LDADD = -lgtest -lpthread
-
-if HAVE_DBUS
-hfp_iodev_unittest_SOURCES = tests/hfp_iodev_unittest.cc \
-	server/cras_hfp_iodev.c
-hfp_iodev_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) -I$(top_srcdir)/src/common \
-	-I$(top_srcdir)/src/server $(DBUS_CFLAGS)
-hfp_iodev_unittest_LDADD = -lgtest -lpthread $(DBUS_LIBS)
-
-hfp_alsa_iodev_unittest_SOURCES = tests/hfp_alsa_iodev_unittest.cc \
-	server/cras_hfp_alsa_iodev.c
-hfp_alsa_iodev_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) \
-	-I$(top_srcdir)/src/common -I$(top_srcdir)/src/server $(DBUS_CFLAGS)
-hfp_alsa_iodev_unittest_LDADD = -lgtest -lpthread $(DBUS_LIBS)
-
-hfp_ag_profile_unittest_SOURCES = tests/hfp_ag_profile_unittest.cc \
-	server/cras_hfp_ag_profile.c common/sfh.c tests/metrics_stub.cc
-hfp_ag_profile_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) \
-	-I$(top_srcdir)/src/common -I$(top_srcdir)/src/server $(DBUS_CFLAGS)
-hfp_ag_profile_unittest_LDADD = -lgtest -lpthread $(DBUS_LIBS)
-
-hfp_slc_unittest_SOURCES = tests/hfp_slc_unittest.cc \
-	server/cras_hfp_slc.c tests/metrics_stub.cc
-hfp_slc_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) -I$(top_srcdir)/src/common \
-	-I$(top_srcdir)/src/server $(DBUS_CFLAGS)
-hfp_slc_unittest_LDADD = -lgtest -lpthread $(DBUS_LIBS)
-endif
-
-buffer_share_unittest_SOURCES = tests/buffer_share_unittest.cc \
-	server/buffer_share.c
-buffer_share_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) \
-	-I$(top_srcdir)/src/common -I$(top_srcdir)/src/server
-buffer_share_unittest_LDADD = -lgtest -liniparser -lpthread
-
-ewma_power_unittest_SOURCES = tests/ewma_power_unittest.cc \
-	common/cras_audio_format.c server/cras_audio_area.c \
-	server/ewma_power.c
-
-ewma_power_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) \
-	-I$(top_srcdir)/src/common -I$(top_srcdir)/src/server
-ewma_power_unittest_LDADD = -lgtest
-
-iodev_list_unittest_SOURCES = tests/iodev_list_unittest.cc \
-	server/cras_iodev_list.c
-iodev_list_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) -I$(top_srcdir)/src/common \
-	 -I$(top_srcdir)/src/server
-iodev_list_unittest_LDADD = -lgtest -lpthread
-
-loopback_iodev_unittest_SOURCES = tests/loopback_iodev_unittest.cc \
-	server/cras_loopback_iodev.c common/cras_shm.c common/sfh.c
-loopback_iodev_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) \
-	-I$(top_srcdir)/src/common \
-	-I$(top_srcdir)/src/server
-loopback_iodev_unittest_LDADD = -lgtest -lpthread -lrt
-
-input_data_unittest_SOURCES = tests/input_data_unittest.cc \
-	server/input_data.c
-input_data_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) -I$(top_srcdir)/src/common \
-	 -I$(top_srcdir)/src/dsp -I$(top_srcdir)/src/server
-input_data_unittest_LDADD = -lgtest -lpthread
-
-iodev_unittest_SOURCES = tests/iodev_unittest.cc \
-	server/cras_iodev.c common/cras_shm.c
-iodev_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) -I$(top_srcdir)/src/common \
-	-I$(top_srcdir)/src/server \
-	-I$(SERVER_RUST_SRCDIR)/src/headers
-iodev_unittest_LDADD = -lgtest -lpthread -lrt
-
-mix_unittest_SOURCES = tests/mix_unittest.cc server/cras_mix.c
-mix_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) -I$(top_srcdir)/src/common \
-	 -I$(top_srcdir)/src/server
-mix_unittest_LDADD = libcrasmix.la \
-	$(CRAS_SSE4_2) \
-	$(CRAS_AVX) \
-	$(CRAS_AVX2) \
-	$(CRAS_FMA) \
-	-lgtest \
-	-lpthread
-
-linear_resampler_unittest_SOURCES = tests/linear_resampler_unittest.cc \
-	server/linear_resampler.c server/cras_audio_area.c
-linear_resampler_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) -I$(top_srcdir)/src/common \
-	 -I$(top_srcdir)/src/server
-linear_resampler_unittest_LDADD = -lgtest -lpthread
-
-observer_unittest_SOURCES = tests/observer_unittest.cc
-observer_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) -I$(top_srcdir)/src/common \
-	-I$(top_srcdir)/src/server
-observer_unittest_LDADD = -lgtest -lpthread
-
-polled_interval_checker_unittest_SOURCES = tests/polled_interval_checker_unittest.cc \
-    server/polled_interval_checker.c
-polled_interval_checker_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) -I$(top_srcdir)/src/common \
-	-I$(top_srcdir)/src/server
-polled_interval_checker_unittest_LDADD = -lgtest -lpthread
-
-ramp_unittest_SOURCES = tests/ramp_unittest.cc
-ramp_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) -I$(top_srcdir)/src/common \
-	-I$(top_srcdir)/src/server
-ramp_unittest_LDADD = -lgtest -lpthread
-
-rate_estimator_unittest_SOURCES = tests/rate_estimator_unittest.cc
-rate_estimator_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) -I$(top_srcdir)/src/common \
-	 -I$(top_srcdir)/src/server \
-	 -I$(SERVER_RUST_SRCDIR)/src/headers
-rate_estimator_unittest_LDADD = $(CRAS_RUST) -lgtest -ldl -lpthread
-
-control_rclient_unittest_SOURCES = tests/control_rclient_unittest.cc \
-				   server/cras_rstream_config.c
-control_rclient_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) \
-	-I$(top_srcdir)/src/common \
-	-I$(top_srcdir)/src/server $(CRAS_UT_TMPDIR_CFLAGS) \
-	$(DBUS_CFLAGS)
-control_rclient_unittest_LDADD = -lgtest -lpthread $(DBUS_LIBS)
-
-playback_rclient_unittest_SOURCES = tests/playback_rclient_unittest.cc \
-				    server/cras_rstream_config.c
-playback_rclient_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) \
-	-I$(top_srcdir)/src/common \
-	-I$(top_srcdir)/src/server $(CRAS_UT_TMPDIR_CFLAGS)
-playback_rclient_unittest_LDADD = -lgtest -lpthread
-
-capture_rclient_unittest_SOURCES = tests/capture_rclient_unittest.cc \
-				   server/cras_rstream_config.c
-capture_rclient_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) \
-	-I$(top_srcdir)/src/common \
-	-I$(top_srcdir)/src/server $(CRAS_UT_TMPDIR_CFLAGS)
-capture_rclient_unittest_LDADD = -lgtest -lpthread
-
-rstream_unittest_SOURCES = tests/rstream_unittest.cc server/cras_rstream.c \
-	common/cras_shm.c tests/metrics_stub.cc \
-	server/cras_rstream_config.c $(CRAS_SELINUX_UNITTEST_SOURCES)
-rstream_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) -I$(top_srcdir)/src/common \
-	 -I$(top_srcdir)/src/server $(SELINUX_CFLAGS)
-rstream_unittest_LDADD = $(SELINUX_LIBS) \
-	-lasound -lgtest -lpthread -lrt
-
-server_metrics_unittest_SOURCES = tests/server_metrics_unittest.cc
-server_metrics_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) -I$(top_srcdir)/src/common \
-	-I$(top_srcdir)/src/server
-server_metrics_unittest_LDADD = -lgtest -lpthread
-
-shm_unittest_SOURCES = tests/shm_unittest.cc
-shm_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) -I$(top_srcdir)/src/common
-shm_unittest_LDADD = -lgtest -lpthread
-
-softvol_curve_unittest_SOURCES = tests/softvol_curve_unittest.cc server/softvol_curve.c
-softvol_curve_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) -I$(top_srcdir)/src/common \
-	 -I$(top_srcdir)/src/server
-softvol_curve_unittest_LDADD = -lgtest -lpthread
-
-stream_list_unittest_SOURCES = tests/stream_list_unittest.cc \
-	server/stream_list.c
-stream_list_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) -I$(top_srcdir)/src/common \
-	 -I$(top_srcdir)/src/server
-stream_list_unittest_LDADD = -lgtest -lpthread
-
-system_state_unittest_SOURCES = tests/system_state_unittest.cc \
-	server/cras_system_state.c common/cras_shm.c \
-       	$(CRAS_SELINUX_UNITTEST_SOURCES)
-system_state_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) \
-	-I$(top_srcdir)/src/common -I$(top_srcdir)/src/server \
-	-I$(top_srcdir)/src/server/config $(SELINUX_CFLAGS)
-system_state_unittest_LDADD = $(SELINUX_LIBS) \
-	-lgtest -liniparser -lpthread -lrt
-
-timing_unittest_SOURCES = \
-	$(CRAS_SELINUX_UNITTEST_SOURCES) \
-	common/cras_audio_format.c \
-	common/cras_shm.c \
-	server/cras_audio_area.c \
-	server/cras_fmt_conv.c \
-	server/cras_fmt_conv_ops.c \
-	server/cras_mix.c \
-	server/cras_mix_ops.c \
-	server/dev_io.c \
-	server/dev_stream.c \
-	server/linear_resampler.c \
-	tests/dev_io_stubs.cc \
-	tests/iodev_stub.cc \
-	tests/empty_audio_stub.cc \
-	tests/metrics_stub.cc \
-	tests/rstream_stub.cc \
-	tests/timing_unittest.cc
-timing_unittest_CXXFLAGS = \
-	-std=c++11 -Wno-noexcept-type
-timing_unittest_CPPFLAGS = \
-	$(COMMON_CPPFLAGS) \
-	-I$(top_srcdir)/src/common \
-	-I$(top_srcdir)/src/server \
-	-I$(top_srcdir)/src/server/config \
-	-I$(SERVER_RUST_SRCDIR)/src/headers \
-	$(SELINUX_CFLAGS)
-timing_unittest_LDADD = \
-	libcrasmix.la \
-	$(CRAS_SSE4_2) \
-	$(CRAS_AVX) \
-	$(CRAS_AVX2) \
-	$(CRAS_FMA) \
-	$(SELINUX_LIBS) \
-	-lgtest -lrt -lpthread -ldl -lm -lspeexdsp
-
-utf8_unittest_SOURCES = tests/utf8_unittest.cc server/cras_utf8.c
-utf8_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) -I$(top_srcdir)/src/common \
-	-I$(top_srcdir)/src/server
-utf8_unittest_LDADD = -lgtest -lpthread
-
-util_unittest_SOURCES = tests/util_unittest.cc common/cras_util.c \
-	common/cras_config.c
-util_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) -I$(top_srcdir)/src/common
-util_unittest_LDADD = -lgtest -lpthread
-
-volume_curve_unittest_SOURCES = tests/volume_curve_unittest.cc \
-	server/cras_volume_curve.c
-volume_curve_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) \
-	-I$(top_srcdir)/src/common -I$(top_srcdir)/src/server
-volume_curve_unittest_LDADD = -lgtest -lpthread
diff --git a/cras/src/alsa_plugin/ctl_cras.c b/cras/src/alsa_plugin/ctl_cras.c
deleted file mode 100644
index 76b0c03..0000000
--- a/cras/src/alsa_plugin/ctl_cras.c
+++ /dev/null
@@ -1,280 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <alsa/asoundlib.h>
-#include <alsa/control_external.h>
-#include <cras_client.h>
-
-static const size_t MAX_IODEVS = 10; /* Max devices to print out. */
-static const size_t MAX_IONODES = 20; /* Max ionodes to print out. */
-
-/* Support basic input/output volume/mute only. */
-enum CTL_CRAS_MIXER_CONTROLS {
-	CTL_CRAS_MIXER_PLAYBACK_SWITCH,
-	CTL_CRAS_MIXER_PLAYBACK_VOLUME,
-	NUM_CTL_CRAS_MIXER_ELEMS
-};
-
-/* Hold info specific to each control. */
-struct cras_mixer_control {
-	const char *name;
-	int type;
-	unsigned int access;
-	unsigned int count;
-};
-
-/* CRAS mixer elements. */
-static const struct cras_mixer_control cras_elems[NUM_CTL_CRAS_MIXER_ELEMS] = {
-	{ "Master Playback Switch", SND_CTL_ELEM_TYPE_BOOLEAN,
-	  SND_CTL_EXT_ACCESS_READWRITE, 1 },
-	{ "Master Playback Volume", SND_CTL_ELEM_TYPE_INTEGER,
-	  SND_CTL_EXT_ACCESS_READWRITE, 1 },
-};
-
-/* Holds the client and ctl plugin pointers. */
-struct ctl_cras {
-	snd_ctl_ext_t ext_ctl;
-	struct cras_client *client;
-};
-
-/* Frees resources when the plugin is closed. */
-static void ctl_cras_close(snd_ctl_ext_t *ext_ctl)
-{
-	struct ctl_cras *cras = (struct ctl_cras *)ext_ctl->private_data;
-
-	if (cras) {
-		cras_client_stop(cras->client);
-		cras_client_destroy(cras->client);
-	}
-	free(cras);
-}
-
-/* Lists available controls. */
-static int ctl_cras_elem_list(snd_ctl_ext_t *ext_ctl, unsigned int offset,
-			      snd_ctl_elem_id_t *id)
-{
-	snd_ctl_elem_id_set_interface(id, SND_CTL_ELEM_IFACE_MIXER);
-	if (offset >= NUM_CTL_CRAS_MIXER_ELEMS)
-		return -EINVAL;
-	snd_ctl_elem_id_set_name(id, cras_elems[offset].name);
-	return 0;
-}
-
-/* Returns the number of available controls. */
-static int ctl_cras_elem_count(snd_ctl_ext_t *ext_ctl)
-{
-	return NUM_CTL_CRAS_MIXER_ELEMS;
-}
-
-/* Gets a control key from a search id. */
-static snd_ctl_ext_key_t ctl_cras_find_elem(snd_ctl_ext_t *ext_ctl,
-					    const snd_ctl_elem_id_t *id)
-{
-	const char *name;
-	unsigned int numid;
-
-	numid = snd_ctl_elem_id_get_numid(id);
-	if (numid - 1 < NUM_CTL_CRAS_MIXER_ELEMS)
-		return numid - 1;
-
-	name = snd_ctl_elem_id_get_name(id);
-
-	for (numid = 0; numid < NUM_CTL_CRAS_MIXER_ELEMS; numid++)
-		if (strcmp(cras_elems[numid].name, name) == 0)
-			return numid;
-
-	return SND_CTL_EXT_KEY_NOT_FOUND;
-}
-
-/* Fills accessibility, type and count based on the specified control. */
-static int ctl_cras_get_attribute(snd_ctl_ext_t *ext_ctl, snd_ctl_ext_key_t key,
-				  int *type, unsigned int *acc,
-				  unsigned int *count)
-{
-	if (key >= NUM_CTL_CRAS_MIXER_ELEMS)
-		return -EINVAL;
-	*type = cras_elems[key].type;
-	*acc = cras_elems[key].access;
-	*count = cras_elems[key].count;
-	return 0;
-}
-
-/* Returns the range of the specified control.  The volume sliders always run
- * from 0 to 100 for CRAS. */
-static int ctl_cras_get_integer_info(snd_ctl_ext_t *ext_ctl,
-				     snd_ctl_ext_key_t key, long *imin,
-				     long *imax, long *istep)
-{
-	*istep = 0;
-	*imin = 0;
-	*imax = 100;
-	return 0;
-}
-
-static int get_nodes(struct cras_client *client, enum CRAS_STREAM_DIRECTION dir,
-		     struct cras_ionode_info *nodes, size_t num_nodes)
-{
-	struct cras_iodev_info devs[MAX_IODEVS];
-	size_t num_devs;
-	int rc;
-
-	if (dir == CRAS_STREAM_OUTPUT)
-		rc = cras_client_get_output_devices(client, devs, nodes,
-						    &num_devs, &num_nodes);
-	else
-		rc = cras_client_get_input_devices(client, devs, nodes,
-						   &num_devs, &num_nodes);
-	if (rc < 0)
-		return 0;
-	return num_nodes;
-}
-
-/* Gets the value of the given control from CRAS and puts it in value. */
-static int ctl_cras_read_integer(snd_ctl_ext_t *ext_ctl, snd_ctl_ext_key_t key,
-				 long *value)
-{
-	struct ctl_cras *cras = (struct ctl_cras *)ext_ctl->private_data;
-	struct cras_ionode_info nodes[MAX_IONODES];
-	int num_nodes, i;
-
-	switch (key) {
-	case CTL_CRAS_MIXER_PLAYBACK_SWITCH:
-		*value = !cras_client_get_user_muted(cras->client);
-		break;
-	case CTL_CRAS_MIXER_PLAYBACK_VOLUME:
-		num_nodes = get_nodes(cras->client, CRAS_STREAM_OUTPUT, nodes,
-				      MAX_IONODES);
-		for (i = 0; i < num_nodes; i++) {
-			if (!nodes[i].active)
-				continue;
-			*value = nodes[i].volume;
-			break;
-		}
-		break;
-	default:
-		return -EINVAL;
-	}
-
-	return 0;
-}
-
-/* Writes the given values to CRAS. */
-static int ctl_cras_write_integer(snd_ctl_ext_t *ext_ctl, snd_ctl_ext_key_t key,
-				  long *value)
-{
-	struct ctl_cras *cras = (struct ctl_cras *)ext_ctl->private_data;
-	struct cras_ionode_info nodes[MAX_IONODES];
-	int num_nodes, i;
-
-	switch (key) {
-	case CTL_CRAS_MIXER_PLAYBACK_SWITCH:
-		cras_client_set_user_mute(cras->client, !(*value));
-		break;
-	case CTL_CRAS_MIXER_PLAYBACK_VOLUME:
-		num_nodes = get_nodes(cras->client, CRAS_STREAM_OUTPUT, nodes,
-				      MAX_IONODES);
-		for (i = 0; i < num_nodes; i++) {
-			if (!nodes[i].active)
-				continue;
-			cras_client_set_node_volume(
-				cras->client,
-				cras_make_node_id(nodes[i].iodev_idx,
-						  nodes[i].ionode_idx),
-				*value);
-		}
-		break;
-	default:
-		return -EINVAL;
-	}
-
-	return 0;
-}
-
-static const snd_ctl_ext_callback_t ctl_cras_ext_callback = {
-	.close = ctl_cras_close,
-	.elem_count = ctl_cras_elem_count,
-	.elem_list = ctl_cras_elem_list,
-	.find_elem = ctl_cras_find_elem,
-	.get_attribute = ctl_cras_get_attribute,
-	.get_integer_info = ctl_cras_get_integer_info,
-	.read_integer = ctl_cras_read_integer,
-	.write_integer = ctl_cras_write_integer,
-};
-
-SND_CTL_PLUGIN_DEFINE_FUNC(cras)
-{
-	struct ctl_cras *cras;
-	int rc;
-
-	cras = malloc(sizeof(*cras));
-	if (cras == NULL)
-		return -ENOMEM;
-
-	rc = cras_client_create(&cras->client);
-	if (rc != 0 || cras->client == NULL) {
-		fprintf(stderr, "Couldn't create CRAS client\n");
-		free(cras);
-		return rc;
-	}
-
-	rc = cras_client_connect(cras->client);
-	if (rc < 0) {
-		fprintf(stderr, "Couldn't connect to cras.\n");
-		cras_client_destroy(cras->client);
-		free(cras);
-		return rc;
-	}
-
-	rc = cras_client_run_thread(cras->client);
-	if (rc < 0) {
-		fprintf(stderr, "Couldn't start client thread.\n");
-		cras_client_stop(cras->client);
-		cras_client_destroy(cras->client);
-		free(cras);
-		return rc;
-	}
-
-	rc = cras_client_connected_wait(cras->client);
-	if (rc < 0) {
-		fprintf(stderr, "CRAS client wouldn't connect.\n");
-		cras_client_stop(cras->client);
-		cras_client_destroy(cras->client);
-		free(cras);
-		return rc;
-	}
-
-	cras->ext_ctl.version = SND_CTL_EXT_VERSION;
-	cras->ext_ctl.card_idx = 0;
-	strncpy(cras->ext_ctl.id, "cras", sizeof(cras->ext_ctl.id) - 1);
-	cras->ext_ctl.id[sizeof(cras->ext_ctl.id) - 1] = '\0';
-	strncpy(cras->ext_ctl.driver, "CRAS plugin",
-		sizeof(cras->ext_ctl.driver) - 1);
-	cras->ext_ctl.driver[sizeof(cras->ext_ctl.driver) - 1] = '\0';
-	strncpy(cras->ext_ctl.name, "CRAS", sizeof(cras->ext_ctl.name) - 1);
-	cras->ext_ctl.name[sizeof(cras->ext_ctl.name) - 1] = '\0';
-	strncpy(cras->ext_ctl.longname, "CRAS",
-		sizeof(cras->ext_ctl.longname) - 1);
-	cras->ext_ctl.longname[sizeof(cras->ext_ctl.longname) - 1] = '\0';
-	strncpy(cras->ext_ctl.mixername, "CRAS",
-		sizeof(cras->ext_ctl.mixername) - 1);
-	cras->ext_ctl.mixername[sizeof(cras->ext_ctl.mixername) - 1] = '\0';
-	cras->ext_ctl.poll_fd = -1;
-
-	cras->ext_ctl.callback = &ctl_cras_ext_callback;
-	cras->ext_ctl.private_data = cras;
-
-	rc = snd_ctl_ext_create(&cras->ext_ctl, name, mode);
-	if (rc < 0) {
-		cras_client_stop(cras->client);
-		cras_client_destroy(cras->client);
-		free(cras);
-		return rc;
-	}
-
-	*handlep = cras->ext_ctl.handle;
-	return 0;
-}
-
-SND_CTL_PLUGIN_SYMBOL(cras);
diff --git a/cras/src/alsa_plugin/pcm_cras.c b/cras/src/alsa_plugin/pcm_cras.c
deleted file mode 100644
index 7bc960b..0000000
--- a/cras/src/alsa_plugin/pcm_cras.c
+++ /dev/null
@@ -1,405 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <alsa/asoundlib.h>
-#include <alsa/pcm_external.h>
-#include <cras_client.h>
-#include <sys/socket.h>
-
-/* Holds configuration for the alsa plugin.
- *  io - ALSA ioplug object.
- *  fd - Wakes users with polled io.
- *  stream_playing - Indicates if the stream is playing/capturing.
- *  hw_ptr - Current read or write position.
- *  channels - Number of channels.
- *  stream_id - CRAS ID of the playing/capturing stream.
- *  bytes_per_frame - number of bytes in an audio frame.
- *  direction - input or output.
- *  areas - ALSA areas used to read from/write to.
- *  client - CRAS client object.
- *  capture_sample_index - The sample tracked for capture latency calculation.
- *  playback_sample_index - The sample tracked for playback latency calculation.
- *  capture_sample_time - The time when capture_sample_index was captured.
- *  playback_sample_time - The time when playback_sample_index was captured.
- */
-struct snd_pcm_cras {
-	snd_pcm_ioplug_t io;
-	int fd;
-	int stream_playing;
-	unsigned int hw_ptr;
-	unsigned int channels;
-	cras_stream_id_t stream_id;
-	size_t bytes_per_frame;
-	enum CRAS_STREAM_DIRECTION direction;
-	snd_pcm_channel_area_t *areas;
-	struct cras_client *client;
-	int capture_sample_index;
-	int playback_sample_index;
-	struct timespec capture_sample_time;
-	struct timespec playback_sample_time;
-};
-
-/* Frees all resources allocated during use. */
-static void snd_pcm_cras_free(struct snd_pcm_cras *pcm_cras)
-{
-	if (pcm_cras == NULL)
-		return;
-	assert(!pcm_cras->stream_playing);
-	if (pcm_cras->fd >= 0)
-		close(pcm_cras->fd);
-	if (pcm_cras->io.poll_fd >= 0)
-		close(pcm_cras->io.poll_fd);
-	cras_client_destroy(pcm_cras->client);
-	free(pcm_cras->areas);
-	free(pcm_cras);
-}
-
-/* Stops a playing or capturing CRAS plugin. */
-static int snd_pcm_cras_stop(snd_pcm_ioplug_t *io)
-{
-	struct snd_pcm_cras *pcm_cras = io->private_data;
-
-	if (pcm_cras->stream_playing) {
-		cras_client_rm_stream(pcm_cras->client, pcm_cras->stream_id);
-		cras_client_stop(pcm_cras->client);
-		pcm_cras->stream_playing = 0;
-	}
-	return 0;
-}
-
-/* Close a CRAS plugin opened with snd_pcm_cras_open. */
-static int snd_pcm_cras_close(snd_pcm_ioplug_t *io)
-{
-	struct snd_pcm_cras *pcm_cras = io->private_data;
-
-	if (pcm_cras->stream_playing)
-		snd_pcm_cras_stop(io);
-	snd_pcm_cras_free(pcm_cras);
-	return 0;
-}
-
-/* Poll callback used to wait for data ready (playback) or space available
- * (capture). */
-static int snd_pcm_cras_poll_revents(snd_pcm_ioplug_t *io, struct pollfd *pfds,
-				     unsigned int nfds, unsigned short *revents)
-{
-	static char buf[1];
-	int rc;
-
-	if (pfds == NULL || nfds != 1 || revents == NULL)
-		return -EINVAL;
-	rc = read(pfds[0].fd, buf, 1);
-	if (rc < 0 && errno != EWOULDBLOCK && errno != EAGAIN) {
-		fprintf(stderr, "%s read failed %d\n", __func__, errno);
-		return errno;
-	}
-	*revents = pfds[0].revents & ~(POLLIN | POLLOUT);
-	if (pfds[0].revents & POLLIN)
-		*revents |= (io->stream == SND_PCM_STREAM_PLAYBACK) ? POLLOUT :
-								      POLLIN;
-	return 0;
-}
-
-/* Callback to return the location of the write (playback) or read (capture)
- * pointer. */
-static snd_pcm_sframes_t snd_pcm_cras_pointer(snd_pcm_ioplug_t *io)
-{
-	struct snd_pcm_cras *pcm_cras = io->private_data;
-	return pcm_cras->hw_ptr;
-}
-
-/* Main callback for processing audio.  This is called by CRAS when more samples
- * are needed (playback) or ready (capture).  Copies bytes between ALSA and CRAS
- * buffers. */
-static int pcm_cras_process_cb(struct cras_client *client,
-			       cras_stream_id_t stream_id,
-			       uint8_t *capture_samples,
-			       uint8_t *playback_samples, unsigned int nframes,
-			       const struct timespec *capture_ts,
-			       const struct timespec *playback_ts, void *arg)
-{
-	snd_pcm_ioplug_t *io;
-	struct snd_pcm_cras *pcm_cras;
-	const snd_pcm_channel_area_t *areas;
-	snd_pcm_uframes_t copied_frames;
-	char empty_byte;
-	size_t chan, frame_bytes, sample_bytes;
-	int rc;
-	uint8_t *samples;
-	const struct timespec *sample_time;
-
-	samples = capture_samples ?: playback_samples;
-	sample_time = capture_ts ?: playback_ts;
-
-	io = (snd_pcm_ioplug_t *)arg;
-	pcm_cras = (struct snd_pcm_cras *)io->private_data;
-	frame_bytes = pcm_cras->bytes_per_frame;
-	sample_bytes = snd_pcm_format_physical_width(io->format) / 8;
-
-	if (io->stream == SND_PCM_STREAM_PLAYBACK) {
-		if (io->state != SND_PCM_STATE_RUNNING &&
-		    io->state != SND_PCM_STATE_DRAINING) {
-			memset(samples, 0, nframes * frame_bytes);
-			return nframes;
-		}
-		/* Only take one period of data at a time. */
-		if (nframes > io->period_size)
-			nframes = io->period_size;
-
-		/* Keep track of the first transmitted sample index and the time
-		 * it will be played. */
-		pcm_cras->playback_sample_index = io->hw_ptr;
-		pcm_cras->playback_sample_time = *sample_time;
-	} else {
-		/* Keep track of the first read sample index and the time it
-		 * was captured. */
-		pcm_cras->capture_sample_index = io->hw_ptr;
-		pcm_cras->capture_sample_time = *sample_time;
-	}
-
-	/* CRAS always takes interleaved samples. */
-	for (chan = 0; chan < io->channels; chan++) {
-		pcm_cras->areas[chan].addr = samples + chan * sample_bytes;
-		pcm_cras->areas[chan].first = 0;
-		pcm_cras->areas[chan].step =
-			snd_pcm_format_physical_width(io->format) *
-			io->channels;
-	}
-
-	areas = snd_pcm_ioplug_mmap_areas(io);
-
-	copied_frames = 0;
-	while (copied_frames < nframes) {
-		snd_pcm_uframes_t frames = nframes - copied_frames;
-		snd_pcm_uframes_t remain = io->buffer_size - pcm_cras->hw_ptr;
-
-		if (frames > remain)
-			frames = remain;
-
-		for (chan = 0; chan < io->channels; chan++)
-			if (io->stream == SND_PCM_STREAM_PLAYBACK)
-				snd_pcm_area_copy(&pcm_cras->areas[chan],
-						  copied_frames, &areas[chan],
-						  pcm_cras->hw_ptr, frames,
-						  io->format);
-			else
-				snd_pcm_area_copy(&areas[chan],
-						  pcm_cras->hw_ptr,
-						  &pcm_cras->areas[chan],
-						  copied_frames, frames,
-						  io->format);
-
-		pcm_cras->hw_ptr += frames;
-		pcm_cras->hw_ptr %= io->buffer_size;
-		copied_frames += frames;
-	}
-
-	rc = write(pcm_cras->fd, &empty_byte, 1); /* Wake up polling clients. */
-	if (rc < 0 && errno != EWOULDBLOCK && errno != EAGAIN)
-		fprintf(stderr, "%s write failed %d\n", __func__, errno);
-
-	return nframes;
-}
-
-/* Callback from CRAS for stream errors. */
-static int pcm_cras_error_cb(struct cras_client *client,
-			     cras_stream_id_t stream_id, int err, void *arg)
-{
-	fprintf(stderr, "Stream error %d\n", err);
-	return 0;
-}
-
-/* ALSA calls this automatically when the stream enters the
- * SND_PCM_STATE_PREPARED state. */
-static int snd_pcm_cras_prepare(snd_pcm_ioplug_t *io)
-{
-	struct snd_pcm_cras *pcm_cras = io->private_data;
-
-	return cras_client_connect(pcm_cras->client);
-}
-
-/* Called when an ALSA stream is started. */
-static int snd_pcm_cras_start(snd_pcm_ioplug_t *io)
-{
-	struct snd_pcm_cras *pcm_cras = io->private_data;
-	struct cras_stream_params *params;
-	struct cras_audio_format *audio_format;
-	int rc;
-
-	audio_format =
-		cras_audio_format_create(io->format, io->rate, io->channels);
-	if (audio_format == NULL)
-		return -ENOMEM;
-
-	params = cras_client_unified_params_create(
-		pcm_cras->direction, io->period_size, 0, 0, io,
-		pcm_cras_process_cb, pcm_cras_error_cb, audio_format);
-	if (params == NULL) {
-		rc = -ENOMEM;
-		goto error_out;
-	}
-
-	cras_client_stream_params_set_client_type(params, CRAS_CLIENT_TYPE_PCM);
-
-	rc = cras_client_run_thread(pcm_cras->client);
-	if (rc < 0)
-		goto error_out;
-
-	pcm_cras->bytes_per_frame =
-		cras_client_format_bytes_per_frame(audio_format);
-
-	rc = cras_client_add_stream(pcm_cras->client, &pcm_cras->stream_id,
-				    params);
-	if (rc < 0) {
-		fprintf(stderr, "CRAS add failed\n");
-		goto error_out;
-	}
-	pcm_cras->stream_playing = 1;
-
-error_out:
-	cras_audio_format_destroy(audio_format);
-	cras_client_stream_params_destroy(params);
-	return rc;
-}
-
-static snd_pcm_ioplug_callback_t cras_pcm_callback = {
-	.close = snd_pcm_cras_close,
-	.start = snd_pcm_cras_start,
-	.stop = snd_pcm_cras_stop,
-	.pointer = snd_pcm_cras_pointer,
-	.prepare = snd_pcm_cras_prepare,
-	.poll_revents = snd_pcm_cras_poll_revents,
-};
-
-/* Set constraints for hw_params.  This lists the handled formats, sample rates,
- * access patters, and buffer/period sizes.  These are enforce in
- * snd_pcm_set_params(). */
-static int set_hw_constraints(struct snd_pcm_cras *pcm_cras)
-{
-	// clang-format off
-	static const unsigned int access_list[] = {
-		SND_PCM_ACCESS_MMAP_INTERLEAVED,
-		SND_PCM_ACCESS_MMAP_NONINTERLEAVED,
-		SND_PCM_ACCESS_RW_INTERLEAVED,
-		SND_PCM_ACCESS_RW_NONINTERLEAVED
-	};
-	static const unsigned int format_list[] = {
-		SND_PCM_FORMAT_U8,
-		SND_PCM_FORMAT_S16_LE,
-		SND_PCM_FORMAT_S24_LE,
-		SND_PCM_FORMAT_S32_LE,
-		SND_PCM_FORMAT_S24_3LE,
-	};
-	// clang-format on
-	int rc;
-
-	rc = snd_pcm_ioplug_set_param_list(&pcm_cras->io,
-					   SND_PCM_IOPLUG_HW_ACCESS,
-					   ARRAY_SIZE(access_list),
-					   access_list);
-	if (rc < 0)
-		return rc;
-	rc = snd_pcm_ioplug_set_param_list(&pcm_cras->io,
-					   SND_PCM_IOPLUG_HW_FORMAT,
-					   ARRAY_SIZE(format_list),
-					   format_list);
-	if (rc < 0)
-		return rc;
-	rc = snd_pcm_ioplug_set_param_minmax(&pcm_cras->io,
-					     SND_PCM_IOPLUG_HW_CHANNELS, 1,
-					     pcm_cras->channels);
-	if (rc < 0)
-		return rc;
-	rc = snd_pcm_ioplug_set_param_minmax(
-		&pcm_cras->io, SND_PCM_IOPLUG_HW_RATE, 8000, 48000);
-	if (rc < 0)
-		return rc;
-	rc = snd_pcm_ioplug_set_param_minmax(&pcm_cras->io,
-					     SND_PCM_IOPLUG_HW_BUFFER_BYTES, 64,
-					     2 * 1024 * 1024);
-	if (rc < 0)
-		return rc;
-	rc = snd_pcm_ioplug_set_param_minmax(&pcm_cras->io,
-					     SND_PCM_IOPLUG_HW_PERIOD_BYTES, 64,
-					     2 * 1024 * 1024);
-	if (rc < 0)
-		return rc;
-	rc = snd_pcm_ioplug_set_param_minmax(
-		&pcm_cras->io, SND_PCM_IOPLUG_HW_PERIODS, 1, 2048);
-	return rc;
-}
-
-/* Called by snd_pcm_open().  Creates a CRAS client and an ioplug plugin. */
-static int snd_pcm_cras_open(snd_pcm_t **pcmp, const char *name,
-			     snd_pcm_stream_t stream, int mode)
-{
-	struct snd_pcm_cras *pcm_cras;
-	int rc;
-	int fd[2];
-
-	assert(pcmp);
-	pcm_cras = calloc(1, sizeof(*pcm_cras));
-	if (!pcm_cras)
-		return -ENOMEM;
-
-	pcm_cras->fd = -1;
-	pcm_cras->io.poll_fd = -1;
-	pcm_cras->channels = 2;
-	pcm_cras->direction = (stream == SND_PCM_STREAM_PLAYBACK) ?
-				      CRAS_STREAM_OUTPUT :
-				      CRAS_STREAM_INPUT;
-
-	rc = cras_client_create(&pcm_cras->client);
-	if (rc != 0 || pcm_cras->client == NULL) {
-		fprintf(stderr, "Couldn't create CRAS client\n");
-		free(pcm_cras);
-		return rc;
-	}
-
-	pcm_cras->areas =
-		calloc(pcm_cras->channels, sizeof(snd_pcm_channel_area_t));
-	if (pcm_cras->areas == NULL) {
-		snd_pcm_cras_free(pcm_cras);
-		return -ENOMEM;
-	}
-
-	socketpair(AF_LOCAL, SOCK_STREAM, 0, fd);
-
-	cras_make_fd_nonblocking(fd[0]);
-	cras_make_fd_nonblocking(fd[1]);
-
-	pcm_cras->fd = fd[0];
-
-	pcm_cras->io.version = SND_PCM_IOPLUG_VERSION;
-	pcm_cras->io.name = "ALSA to CRAS Plugin";
-	pcm_cras->io.callback = &cras_pcm_callback;
-	pcm_cras->io.private_data = pcm_cras;
-	pcm_cras->io.poll_fd = fd[1];
-	pcm_cras->io.poll_events = POLLIN;
-	pcm_cras->io.mmap_rw = 1;
-
-	rc = snd_pcm_ioplug_create(&pcm_cras->io, name, stream, mode);
-	if (rc < 0) {
-		snd_pcm_cras_free(pcm_cras);
-		return rc;
-	}
-
-	rc = set_hw_constraints(pcm_cras);
-	if (rc < 0) {
-		snd_pcm_ioplug_delete(&pcm_cras->io);
-		return rc;
-	}
-
-	*pcmp = pcm_cras->io.pcm;
-
-	return 0;
-}
-
-SND_PCM_PLUGIN_DEFINE_FUNC(cras)
-{
-	return snd_pcm_cras_open(pcmp, name, stream, mode);
-}
-
-SND_PCM_PLUGIN_SYMBOL(cras);
diff --git a/cras/src/common/a2dp-codecs.h b/cras/src/common/a2dp-codecs.h
deleted file mode 100644
index 006d9fe..0000000
--- a/cras/src/common/a2dp-codecs.h
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- *
- *  BlueZ - Bluetooth protocol stack for Linux
- *
- *  Copyright (C) 2006-2010  Nokia Corporation
- *  Copyright (C) 2004-2010  Marcel Holtmann <marcel@holtmann.org>
- *
- *
- *  This library is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public
- *  License as published by the Free Software Foundation; either
- *  version 2.1 of the License, or (at your option) any later version.
- *
- *  This library is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this library; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- *
- */
-
-#define A2DP_CODEC_SBC 0x00
-#define A2DP_CODEC_MPEG12 0x01
-#define A2DP_CODEC_MPEG24 0x02
-#define A2DP_CODEC_ATRAC 0x03
-#define A2DP_CODEC_VENDOR 0xFF
-
-#define SBC_SAMPLING_FREQ_16000 (1 << 3)
-#define SBC_SAMPLING_FREQ_32000 (1 << 2)
-#define SBC_SAMPLING_FREQ_44100 (1 << 1)
-#define SBC_SAMPLING_FREQ_48000 1
-
-#define SBC_CHANNEL_MODE_MONO (1 << 3)
-#define SBC_CHANNEL_MODE_DUAL_CHANNEL (1 << 2)
-#define SBC_CHANNEL_MODE_STEREO (1 << 1)
-#define SBC_CHANNEL_MODE_JOINT_STEREO 1
-
-#define SBC_BLOCK_LENGTH_4 (1 << 3)
-#define SBC_BLOCK_LENGTH_8 (1 << 2)
-#define SBC_BLOCK_LENGTH_12 (1 << 1)
-#define SBC_BLOCK_LENGTH_16 1
-
-#define SBC_SUBBANDS_4 (1 << 1)
-#define SBC_SUBBANDS_8 1
-
-#define SBC_ALLOCATION_SNR (1 << 1)
-#define SBC_ALLOCATION_LOUDNESS 1
-
-#define MAX_BITPOOL 64
-#define MIN_BITPOOL 2
-
-#define MPEG_CHANNEL_MODE_MONO (1 << 3)
-#define MPEG_CHANNEL_MODE_DUAL_CHANNEL (1 << 2)
-#define MPEG_CHANNEL_MODE_STEREO (1 << 1)
-#define MPEG_CHANNEL_MODE_JOINT_STEREO 1
-
-#define MPEG_LAYER_MP1 (1 << 2)
-#define MPEG_LAYER_MP2 (1 << 1)
-#define MPEG_LAYER_MP3 1
-
-#define MPEG_SAMPLING_FREQ_16000 (1 << 5)
-#define MPEG_SAMPLING_FREQ_22050 (1 << 4)
-#define MPEG_SAMPLING_FREQ_24000 (1 << 3)
-#define MPEG_SAMPLING_FREQ_32000 (1 << 2)
-#define MPEG_SAMPLING_FREQ_44100 (1 << 1)
-#define MPEG_SAMPLING_FREQ_48000 1
-
-#define MPEG_BIT_RATE_VBR 0x8000
-#define MPEG_BIT_RATE_320000 0x4000
-#define MPEG_BIT_RATE_256000 0x2000
-#define MPEG_BIT_RATE_224000 0x1000
-#define MPEG_BIT_RATE_192000 0x0800
-#define MPEG_BIT_RATE_160000 0x0400
-#define MPEG_BIT_RATE_128000 0x0200
-#define MPEG_BIT_RATE_112000 0x0100
-#define MPEG_BIT_RATE_96000 0x0080
-#define MPEG_BIT_RATE_80000 0x0040
-#define MPEG_BIT_RATE_64000 0x0020
-#define MPEG_BIT_RATE_56000 0x0010
-#define MPEG_BIT_RATE_48000 0x0008
-#define MPEG_BIT_RATE_40000 0x0004
-#define MPEG_BIT_RATE_32000 0x0002
-#define MPEG_BIT_RATE_FREE 0x0001
-
-#if __BYTE_ORDER == __LITTLE_ENDIAN
-
-typedef struct {
-	uint8_t channel_mode : 4;
-	uint8_t frequency : 4;
-	uint8_t allocation_method : 2;
-	uint8_t subbands : 2;
-	uint8_t block_length : 4;
-	uint8_t min_bitpool;
-	uint8_t max_bitpool;
-} __attribute__((packed)) a2dp_sbc_t;
-
-typedef struct {
-	uint8_t channel_mode : 4;
-	uint8_t crc : 1;
-	uint8_t layer : 3;
-	uint8_t frequency : 6;
-	uint8_t mpf : 1;
-	uint8_t rfa : 1;
-	uint16_t bitrate;
-} __attribute__((packed)) a2dp_mpeg_t;
-
-#elif __BYTE_ORDER == __BIG_ENDIAN
-
-typedef struct {
-	uint8_t frequency : 4;
-	uint8_t channel_mode : 4;
-	uint8_t block_length : 4;
-	uint8_t subbands : 2;
-	uint8_t allocation_method : 2;
-	uint8_t min_bitpool;
-	uint8_t max_bitpool;
-} __attribute__((packed)) a2dp_sbc_t;
-
-typedef struct {
-	uint8_t layer : 3;
-	uint8_t crc : 1;
-	uint8_t channel_mode : 4;
-	uint8_t rfa : 1;
-	uint8_t mpf : 1;
-	uint8_t frequency : 6;
-	uint16_t bitrate;
-} __attribute__((packed)) a2dp_mpeg_t;
-
-#else
-#error "Unknown byte order"
-#endif
-
-typedef struct {
-	uint8_t vendor_id[4];
-	uint8_t codec_id[2];
-} __attribute__((packed)) a2dp_vendor_codec_t;
diff --git a/cras/src/common/array.h b/cras/src/common/array.h
deleted file mode 100644
index b21987e..0000000
--- a/cras/src/common/array.h
+++ /dev/null
@@ -1,117 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_ARRAY_H_
-#define CRAS_ARRAY_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <string.h>
-
-/*
-
-Sample usage:
-
-DECLARE_ARRAY_TYPE(double, double_array);
-
-void f()
-{
-	int i;
-	double *p;
-	double_array a = ARRAY_INIT;
-
-	ARRAY_APPEND(&a, 1.0);
-	*ARRAY_APPEND_ZERO(&a) = 2.0;
-
-	ARRAY_ELEMENT_FOREACH(&a, i, p) {
-		printf("%f\n", *p);  // prints 1.0 2.0
-	}
-
-	ARRAY_FREE(&a);
-}
-
-*/
-
-/* Define a type for the array given the element type */
-#define DECLARE_ARRAY_TYPE(element_type, array_type)                           \
-	typedef struct {                                                       \
-		int count;                                                     \
-		int size;                                                      \
-		element_type *element;                                         \
-	} array_type;
-
-/* The initializer for an empty array is the zero value. */
-#define ARRAY_INIT                                                             \
-	{                                                                      \
-	}
-
-#define _ARRAY_EXTEND(a)                                                       \
-	({                                                                     \
-		if ((a)->count >= (a)->size) {                                 \
-			if ((a)->size == 0)                                    \
-				(a)->size = 4;                                 \
-			else                                                   \
-				(a)->size *= 2;                                \
-			(a)->element = (__typeof((a)->element))realloc(        \
-				(a)->element,                                  \
-				(a)->size * sizeof((a)->element[0]));          \
-		}                                                              \
-		&(a)->element[((a)->count)++];                                 \
-	})
-
-/* Append an element with the given value to the array a */
-#define ARRAY_APPEND(a, value)                                                 \
-	do {                                                                   \
-		*_ARRAY_EXTEND(a) = (value);                                   \
-	} while (0)
-
-/* Append a zero element to the array a and return the pointer to the element */
-#define ARRAY_APPEND_ZERO(a)                                                   \
-	({                                                                     \
-		typeof((a)->element) _tmp_ptr = _ARRAY_EXTEND(a);              \
-		memset(_tmp_ptr, 0, sizeof(*_tmp_ptr));                        \
-		_tmp_ptr;                                                      \
-	})
-
-/* Return the number of elements in the array a */
-#define ARRAY_COUNT(a) ((a)->count)
-
-/* Return a pointer to the i-th element in the array a */
-#define ARRAY_ELEMENT(a, i) ((a)->element + (i))
-
-/* Return the index of the element pointed by p in the array a */
-#define ARRAY_INDEX(a, p) ((p) - (a)->element)
-
-/* Go through each element in the array a and assign index and pointer
-   to the element to the variable i and ptr */
-#define ARRAY_ELEMENT_FOREACH(a, i, ptr)                                       \
-	for ((i) = 0, (ptr) = (a)->element; (i) < (a)->count; (i)++, (ptr)++)
-
-/* Free the memory used by the array a. The array becomes an empty array. */
-#define ARRAY_FREE(a)                                                          \
-	do {                                                                   \
-		free((a)->element);                                            \
-		(a)->element = NULL;                                           \
-		(a)->size = 0;                                                 \
-		(a)->count = 0;                                                \
-	} while (0)
-
-/* Return the index of the element with the value x. -1 if not found */
-#define ARRAY_FIND(a, x)                                                       \
-	({                                                                     \
-		typeof((a)->element) _bptr = (a)->element;                     \
-		typeof((a)->element) _eptr = (a)->element + (a)->count;        \
-		for (; _bptr != _eptr && *_bptr != x; _bptr++)                 \
-			;                                                      \
-		(_bptr == _eptr) ? -1 : (_bptr - (a)->element);                \
-	})
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif /* CRAS_ARRAY_H_ */
diff --git a/cras/src/common/bluetooth.h b/cras/src/common/bluetooth.h
deleted file mode 100644
index 66beada..0000000
--- a/cras/src/common/bluetooth.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/* Copyright (c) 2015 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-/* Definitions from Linux bluetooth directory that are useful for
- * bluetotoh audio.
- * TODO(hychao): Remove this file when there is bluetooth user
- * space header provided.
- */
-
-#include <unistd.h>
-
-#define HCI_VIRTUAL 0
-#define HCI_USB 1
-#define HCI_PCCARD 2
-#define HCI_UART 3
-#define HCI_RS232 4
-#define HCI_PCI 5
-#define HCI_SDIO 6
-#define HCI_BUS_MAX 7
-
-#define BTPROTO_HCI 1
-#define BTPROTO_SCO 2
-
-#define SCO_OPTIONS 0x01
-#define SOL_SCO 17
-
-#define HCIGETDEVINFO _IOR('H', 211, int)
-
-typedef struct {
-	uint8_t b[6];
-} __attribute__((packed)) bdaddr_t;
-
-struct hci_dev_stats {
-	uint32_t err_rx;
-	uint32_t err_tx;
-	uint32_t cmd_tx;
-	uint32_t evt_rx;
-	uint32_t acl_tx;
-	uint32_t acl_rx;
-	uint32_t sco_tx;
-	uint32_t sco_rx;
-	uint32_t byte_rx;
-	uint32_t byte_tx;
-};
-
-struct hci_dev_info {
-	uint16_t dev_id;
-	char name[8];
-	bdaddr_t bdaddr;
-	uint32_t flags;
-	uint8_t type;
-	uint8_t features[8];
-	uint32_t pkt_type;
-	uint32_t link_policy;
-	uint32_t link_mode;
-	uint16_t acl_mtu;
-	uint16_t acl_pkts;
-	uint16_t sco_mtu;
-	uint16_t sco_pkts;
-	struct hci_dev_stats stat;
-};
-
-struct sco_options {
-	uint16_t mtu;
-};
-
-#define SOL_BLUETOOTH 274
-
-#define BT_VOICE 11
-struct bt_voice {
-	uint16_t setting;
-};
-
-#define BT_VOICE_TRANSPARENT 0x0003
-
-#define BT_SNDMTU 12
-
-#define BT_RCVMTU 13
-
-#define BT_PKT_STATUS 16
-
-#define BT_SCM_PKT_STATUS 0x03
diff --git a/cras/src/common/byte_buffer.h b/cras/src/common/byte_buffer.h
deleted file mode 100644
index dd9cb2d..0000000
--- a/cras/src/common/byte_buffer.h
+++ /dev/null
@@ -1,137 +0,0 @@
-/* Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef BYTE_BUFFER_H_
-#define BYTE_BUFFER_H_
-
-#include <stdint.h>
-#include <stdlib.h>
-#include <sys/param.h>
-
-struct byte_buffer {
-	unsigned int write_idx;
-	unsigned int read_idx;
-	unsigned int level;
-	unsigned int max_size;
-	unsigned int used_size;
-	uint8_t bytes[];
-};
-
-/* Create a byte buffer to hold buffer_size_bytes worth of data. */
-static inline struct byte_buffer *byte_buffer_create(size_t buffer_size_bytes)
-{
-	struct byte_buffer *buf;
-	buf = (struct byte_buffer *)calloc(1, sizeof(struct byte_buffer) +
-						      buffer_size_bytes);
-	if (!buf)
-		return buf;
-	buf->max_size = buffer_size_bytes;
-	buf->used_size = buffer_size_bytes;
-	return buf;
-}
-
-static inline void byte_buffer_set_used_size(struct byte_buffer *buf,
-					     size_t used_size)
-{
-	buf->used_size = MIN(used_size, buf->max_size);
-}
-
-/* Destory a byte_buffer created with byte_buffer_create. */
-static inline void byte_buffer_destroy(struct byte_buffer **buf)
-{
-	free(*buf);
-	*buf = NULL;
-}
-
-static inline unsigned int buf_writable(struct byte_buffer *buf)
-{
-	if (buf->level >= buf->used_size)
-		return 0;
-	if (buf->write_idx < buf->read_idx)
-		return buf->read_idx - buf->write_idx;
-
-	return buf->used_size - buf->write_idx;
-}
-
-static inline unsigned int buf_readable(struct byte_buffer *buf)
-{
-	if (buf->level == 0)
-		return 0;
-
-	if (buf->read_idx < buf->write_idx)
-		return buf->write_idx - buf->read_idx;
-
-	return buf->used_size - buf->read_idx;
-}
-
-/* Adjust readable size to given value. Use with caution. */
-static inline unsigned int buf_adjust_readable(struct byte_buffer *buf,
-					       size_t readable)
-{
-	buf->level = MIN(readable, buf->used_size);
-	buf->write_idx = (buf->read_idx + buf->level) % buf->used_size;
-	return 0;
-}
-
-static inline unsigned int buf_queued(struct byte_buffer *buf)
-{
-	return buf->level;
-}
-
-static inline unsigned int buf_available(const struct byte_buffer *buf)
-{
-	return buf->used_size - buf->level;
-}
-
-static inline uint8_t *buf_read_pointer(struct byte_buffer *buf)
-{
-	return &buf->bytes[buf->read_idx];
-}
-
-static inline uint8_t *buf_read_pointer_size(struct byte_buffer *buf,
-					     unsigned int *readable)
-{
-	*readable = buf_readable(buf);
-	return buf_read_pointer(buf);
-}
-
-static inline void buf_increment_read(struct byte_buffer *buf, size_t inc)
-{
-	inc = MIN(inc, buf->level);
-	buf->read_idx += inc;
-	buf->read_idx %= buf->used_size;
-	buf->level -= inc;
-}
-
-static inline uint8_t *buf_write_pointer(struct byte_buffer *buf)
-{
-	return &buf->bytes[buf->write_idx];
-}
-
-static inline uint8_t *buf_write_pointer_size(struct byte_buffer *buf,
-					      unsigned int *writeable)
-{
-	*writeable = buf_writable(buf);
-	return buf_write_pointer(buf);
-}
-
-static inline void buf_increment_write(struct byte_buffer *buf, size_t inc)
-{
-	buf->write_idx += inc;
-	buf->write_idx %= buf->used_size;
-	if (buf->level + inc < buf->used_size)
-		buf->level += inc;
-	else
-		buf->level = buf->used_size;
-}
-
-static inline void buf_reset(struct byte_buffer *buf)
-{
-	buf->write_idx = 0;
-	buf->read_idx = 0;
-	buf->level = 0;
-}
-
-#endif /* BYTE_BUFFER_H_ */
diff --git a/cras/src/common/cras_audio_codec.h b/cras/src/common/cras_audio_codec.h
deleted file mode 100644
index 01277ea..0000000
--- a/cras/src/common/cras_audio_codec.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef COMMON_CRAS_AUDIO_CODEC_H_
-#define COMMON_CRAS_AUDIO_CODEC_H_
-
-/* A audio codec that transforms audio between different formats.
- * decode - Function to decode audio samples. Returns the number of decoded
- *   bytes of input buffer, number of decoded bytes of output buffer
- *   will be filled in count.
- * encode - Function to encode audio samples. Returns the number of encoded
- *   bytes of input buffer, number of encoded bytes of output buffer
- *   will be filled in count.
- * priv_data - Private data for specific use.
- */
-struct cras_audio_codec {
-	int (*decode)(struct cras_audio_codec *codec, const void *input,
-		      size_t input_len, void *output, size_t output_len,
-		      size_t *count);
-	int (*encode)(struct cras_audio_codec *codec, const void *input,
-		      size_t intput_len, void *output, size_t output_len,
-		      size_t *count);
-	void *priv_data;
-};
-
-#endif /* COMMON_CRAS_AUDIO_CODEC_H_ */
diff --git a/cras/src/common/cras_audio_format.c b/cras/src/common/cras_audio_format.c
deleted file mode 100644
index 8bd4865..0000000
--- a/cras/src/common/cras_audio_format.c
+++ /dev/null
@@ -1,171 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <errno.h>
-#include <stddef.h>
-#include <stdlib.h>
-#include <syslog.h>
-
-#include "cras_audio_format.h"
-
-/* Table for allowed alternatives when doing channel re-mapping.
- * When channel_alt[X][Y] is non-zero, it's allowed to map channel
- * from X to Y. */
-static const int channel_alt[CRAS_CH_MAX][CRAS_CH_MAX] = {
-	/*FL FR RL RR FC LFE SL SR RC FLC FRC */
-	{ 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, +0 }, /* FL */
-	{ 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, +0 }, /* FR */
-	{ 0, 0, 0, 0, 0, 0, +1, 0, 0, 0, +0 }, /* RL */
-	{ 0, 0, 0, 0, 0, 0, +0, 1, 0, 0, +0 }, /* RR */
-	{ 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, +0 }, /* FC */
-	{ 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, +0 }, /* LFE */
-	{ 0, 0, 1, 0, 0, 0, +0, 0, 0, 0, +0 }, /* SL */
-	{ 0, 0, 0, 1, 0, 0, +0, 0, 0, 0, +0 }, /* SR */
-	{ 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, +0 }, /* RC */
-	{ 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, +0 }, /* FLC */
-	{ 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, +0 }, /* FRC */
-};
-
-/* Create an audio format structure. */
-struct cras_audio_format *cras_audio_format_create(snd_pcm_format_t format,
-						   size_t frame_rate,
-						   size_t num_channels)
-{
-	struct cras_audio_format *fmt;
-	unsigned i;
-
-	fmt = (struct cras_audio_format *)calloc(1, sizeof(*fmt));
-	if (fmt == NULL)
-		return fmt;
-
-	fmt->format = format;
-	fmt->frame_rate = frame_rate;
-	fmt->num_channels = num_channels;
-
-	/* Set a default working channel layout according to num_channels.
-	 * Initialize all other channel position to -1(not set)
-	 */
-	for (i = 0; i < CRAS_CH_MAX; i++)
-		fmt->channel_layout[i] = (i < num_channels) ? i : -1;
-
-	return fmt;
-}
-
-int cras_audio_format_set_channel_layout(struct cras_audio_format *format,
-					 const int8_t layout[CRAS_CH_MAX])
-{
-	int i;
-
-	/* Check that the max channel index should not exceed the
-	 * channel count set in format.
-	 */
-	for (i = 0; i < CRAS_CH_MAX; i++)
-		if (layout[i] < -1 || layout[i] >= (int)format->num_channels)
-			return -EINVAL;
-
-	for (i = 0; i < CRAS_CH_MAX; i++)
-		format->channel_layout[i] = layout[i];
-
-	return 0;
-}
-
-/* Verifies if all channel_layout[i] are in [-1, fmt->num_channels). */
-bool cras_audio_format_valid(const struct cras_audio_format *fmt)
-{
-	int i;
-	for (i = 0; i < CRAS_CH_MAX; i++) {
-		if (fmt->channel_layout[i] < -1 ||
-		    fmt->channel_layout[i] >= (int)fmt->num_channels) {
-			return false;
-		}
-	}
-	return true;
-}
-
-/* Destroy an audio format struct created with cras_audio_format_crate. */
-void cras_audio_format_destroy(struct cras_audio_format *fmt)
-{
-	free(fmt);
-}
-
-float **cras_channel_conv_matrix_alloc(size_t in_ch, size_t out_ch)
-{
-	size_t i;
-	float **p;
-	p = (float **)calloc(out_ch, sizeof(*p));
-	if (p == NULL)
-		return NULL;
-	for (i = 0; i < out_ch; i++) {
-		p[i] = (float *)calloc(in_ch, sizeof(*p[i]));
-		if (p[i] == NULL)
-			goto alloc_err;
-	}
-	return p;
-
-alloc_err:
-	if (p)
-		cras_channel_conv_matrix_destroy(p, out_ch);
-	return NULL;
-}
-
-void cras_channel_conv_matrix_destroy(float **p, size_t out_ch)
-{
-	size_t i;
-	for (i = 0; i < out_ch; i++)
-		free(p[i]);
-	free(p);
-}
-
-float **cras_channel_conv_matrix_create(const struct cras_audio_format *in,
-					const struct cras_audio_format *out)
-{
-	int i;
-	float **mtx;
-
-	for (i = 0; i < CRAS_CH_MAX; i++) {
-		if (in->channel_layout[i] >= (int)in->num_channels ||
-		    out->channel_layout[i] >= (int)out->num_channels) {
-			syslog(LOG_ERR, "Fail to create conversion matrix "
-					"due to invalid channel layout");
-			return NULL;
-		}
-	}
-
-	mtx = cras_channel_conv_matrix_alloc(in->num_channels,
-					     out->num_channels);
-
-	/* For the in/out format pair which has the same set of channels
-	 * in use, create a permutation matrix for them.
-	 */
-	for (i = 0; i < CRAS_CH_MAX; i++) {
-		if (in->channel_layout[i] == -1 && out->channel_layout[i] == -1)
-			continue;
-		if (in->channel_layout[i] != -1 && out->channel_layout[i] != -1)
-			mtx[out->channel_layout[i]][in->channel_layout[i]] = 1;
-		else if (in->channel_layout[i] != -1) {
-			/* When the same channel does not appear at output
-			 * channel layout. Look up for allowed channel
-			 * alternatives.
-			 */
-			int alt;
-			for (alt = 0; alt <= CRAS_CH_MAX; alt++) {
-				if (alt == CRAS_CH_MAX)
-					goto fail;
-				if (channel_alt[i][alt] &&
-				    in->channel_layout[alt] == -1 &&
-				    out->channel_layout[alt] != -1) {
-					mtx[out->channel_layout[alt]]
-					   [in->channel_layout[i]] = 1;
-					break;
-				}
-			}
-		}
-	}
-
-	return mtx;
-fail:
-	cras_channel_conv_matrix_destroy(mtx, out->num_channels);
-	return NULL;
-}
diff --git a/cras/src/common/cras_audio_format.h b/cras/src/common/cras_audio_format.h
deleted file mode 100644
index f0cc94f..0000000
--- a/cras/src/common/cras_audio_format.h
+++ /dev/null
@@ -1,176 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_AUDIO_FORMAT_H_
-#define CRAS_AUDIO_FORMAT_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <stdbool.h>
-#include <stdint.h>
-#include <string.h>
-
-#ifdef __ANDROID__
-#include <hardware/audio.h>
-#include <tinyalsa/asoundlib.h>
-#define PCM_FORMAT_WIDTH(format) pcm_format_to_bits(format)
-typedef enum pcm_format snd_pcm_format_t;
-
-/* libasound audio formats. */
-#define SND_PCM_FORMAT_UNKNOWN -1
-#define SND_PCM_FORMAT_U8 1
-#define SND_PCM_FORMAT_S16_LE 2
-#define SND_PCM_FORMAT_S24_LE 6
-#define SND_PCM_FORMAT_S32_LE 10
-
-static inline int audio_format_to_cras_format(audio_format_t audio_format)
-{
-	switch (audio_format) {
-	case AUDIO_FORMAT_PCM_16_BIT:
-		return SND_PCM_FORMAT_S16_LE;
-	case AUDIO_FORMAT_PCM_8_BIT:
-		return SND_PCM_FORMAT_U8;
-	case AUDIO_FORMAT_PCM_32_BIT:
-		return SND_PCM_FORMAT_S32_LE;
-	case AUDIO_FORMAT_PCM_8_24_BIT:
-		return SND_PCM_FORMAT_S24_LE;
-	default:
-		return SND_PCM_FORMAT_UNKNOWN;
-	}
-}
-#else
-#include <alsa/asoundlib.h>
-#define PCM_FORMAT_WIDTH(format) snd_pcm_format_physical_width(format)
-#endif
-
-/* Identifiers for each channel in audio stream. */
-enum CRAS_CHANNEL {
-	/* First nine channels matches the
-	 * snd_mixer_selem_channel_id_t values.
-	 */
-	CRAS_CH_FL,
-	CRAS_CH_FR,
-	CRAS_CH_RL,
-	CRAS_CH_RR,
-	CRAS_CH_FC,
-	CRAS_CH_LFE,
-	CRAS_CH_SL,
-	CRAS_CH_SR,
-	CRAS_CH_RC,
-	/* Channels defined both in channel_layout.h and
-	 * alsa channel mapping API. */
-	CRAS_CH_FLC,
-	CRAS_CH_FRC,
-	/* Must be the last one */
-	CRAS_CH_MAX,
-};
-
-/* Audio format. */
-struct cras_audio_format {
-	snd_pcm_format_t format;
-	size_t frame_rate; /* Hz */
-
-	// TODO(hychao): use channel_layout to replace num_channels
-	size_t num_channels;
-
-	/* Channel layout whose value represents the index of each
-	 * CRAS_CHANNEL in the layout. Value -1 means the channel is
-	 * not used. For example: 0,1,2,3,4,5,-1,-1,-1,-1,-1 means the
-	 * channel order is FL,FR,RL,RR,FC.
-	 */
-	int8_t channel_layout[CRAS_CH_MAX];
-};
-
-/* Packed version of audio format, for use in messages. We cannot modify
- * the above structure to keep binary compatibility with Chromium.
- * If cras_audio_format ever changes, merge the 2 structures.
- */
-struct __attribute__((__packed__)) cras_audio_format_packed {
-	int32_t format;
-	uint32_t frame_rate;
-	uint32_t num_channels;
-	int8_t channel_layout[CRAS_CH_MAX];
-};
-
-static inline void pack_cras_audio_format(struct cras_audio_format_packed *dest,
-					  const struct cras_audio_format *src)
-{
-	dest->format = src->format;
-	dest->frame_rate = src->frame_rate;
-	dest->num_channels = src->num_channels;
-	memcpy(dest->channel_layout, src->channel_layout,
-	       sizeof(src->channel_layout));
-}
-
-static inline struct cras_audio_format
-unpack_cras_audio_format(const struct cras_audio_format_packed *src)
-{
-	struct cras_audio_format dest;
-	dest.format = (snd_pcm_format_t)src->format;
-	dest.frame_rate = src->frame_rate;
-	dest.num_channels = src->num_channels;
-	memcpy(dest.channel_layout, src->channel_layout,
-	       sizeof(src->channel_layout));
-	return dest;
-}
-
-/* Returns the number of bytes per sample.
- * This is bits per smaple / 8 * num_channels.
- */
-static inline size_t cras_get_format_bytes(const struct cras_audio_format *fmt)
-{
-	const int bytes = PCM_FORMAT_WIDTH(fmt->format) / 8;
-	return (size_t)bytes * fmt->num_channels;
-}
-
-/* Sets channel layout to a default value where channels [0, num_channels] are
- * placed to the same position of its channel index, otherwise set to -1. */
-static inline void
-cras_audio_format_set_default_channel_layout(struct cras_audio_format *format)
-{
-	unsigned int i;
-	for (i = 0; i < CRAS_CH_MAX; i++)
-		format->channel_layout[i] = i < format->num_channels ? i : -1;
-}
-
-/* Create an audio format structure. */
-struct cras_audio_format *cras_audio_format_create(snd_pcm_format_t format,
-						   size_t frame_rate,
-						   size_t num_channels);
-
-/* Destroy an audio format struct created with cras_audio_format_crate. */
-void cras_audio_format_destroy(struct cras_audio_format *fmt);
-
-/* Returns true if the audio format is valid */
-bool cras_audio_format_valid(const struct cras_audio_format *fmt);
-
-/* Sets the channel layout for given format.
- *    format - The format structure to carry channel layout info
- *    layout - An integer array representing the position of each
- *        channel in enum CRAS_CHANNEL
- */
-int cras_audio_format_set_channel_layout(struct cras_audio_format *format,
-					 const int8_t layout[CRAS_CH_MAX]);
-
-/* Allocates an empty channel conversion matrix of given size. */
-float **cras_channel_conv_matrix_alloc(size_t in_ch, size_t out_ch);
-
-/* Destroys the channel conversion matrix. */
-void cras_channel_conv_matrix_destroy(float **mtx, size_t out_ch);
-
-/* Creates channel conversion matrix for given input and output format.
- * Returns NULL if the conversion is not supported between the channel
- * layouts specified in input/ouput formats.
- */
-float **cras_channel_conv_matrix_create(const struct cras_audio_format *in,
-					const struct cras_audio_format *out);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* CRAS_AUDIO_FORMAT_H_ */
diff --git a/cras/src/common/cras_checksum.c b/cras/src/common/cras_checksum.c
deleted file mode 100644
index 33e9f60..0000000
--- a/cras/src/common/cras_checksum.c
+++ /dev/null
@@ -1,79 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-/* The table and the algorithm are taken from
- * http://pubs.opengroup.org/onlinepubs/9699919799/utilities/cksum.html
- *
- * The output of this function is the same as the output of the "cksum"
- * command.
- */
-
-#include "cras_checksum.h"
-
-static const uint32_t crctab[] = {
-	0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b,
-	0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
-	0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 0x4c11db70, 0x48d0c6c7,
-	0x4593e01e, 0x4152fda9, 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
-	0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3,
-	0x709f7b7a, 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
-	0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58, 0xbaea46ef,
-	0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
-	0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb,
-	0xceb42022, 0xca753d95, 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
-	0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0,
-	0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
-	0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 0x018aeb13, 0x054bf6a4,
-	0x0808d07d, 0x0cc9cdca, 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
-	0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08,
-	0x571d7dd1, 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
-	0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b, 0xbb60adfc,
-	0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
-	0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, 0xe0b41de7, 0xe4750050,
-	0xe9362689, 0xedf73b3e, 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
-	0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34,
-	0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
-	0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 0x4f040d56, 0x4bc510e1,
-	0x46863638, 0x42472b8f, 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
-	0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5,
-	0x3f9b762c, 0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
-	0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e, 0xf5ee4bb9,
-	0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
-	0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd,
-	0xcda1f604, 0xc960ebb3, 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
-	0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71,
-	0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
-	0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 0x4e8ee645, 0x4a4ffbf2,
-	0x470cdd2b, 0x43cdc09c, 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,
-	0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e,
-	0x18197087, 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
-	0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d, 0x2056cd3a,
-	0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,
-	0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, 0xe3a1cbc1, 0xe760d676,
-	0xea23f0af, 0xeee2ed18, 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
-	0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662,
-	0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,
-	0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
-};
-
-uint32_t crc32_checksum(const unsigned char *input, size_t n)
-{
-	size_t i;
-	uint32_t s = 0, c;
-
-	for (i = 0; i < n; i++) {
-		c = *input++;
-		s = (s << 8) ^ crctab[(s >> 24) ^ c];
-	}
-
-	/* Extend with the length of the string. */
-	while (n != 0) {
-		c = n & 0xff;
-		n >>= 8;
-		s = (s << 8) ^ crctab[(s >> 24) ^ c];
-	}
-
-	return ~s;
-}
diff --git a/cras/src/common/cras_checksum.h b/cras/src/common/cras_checksum.h
deleted file mode 100644
index d995d66..0000000
--- a/cras/src/common/cras_checksum.h
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_CHECKSUM_H_
-#define CRAS_CHECKSUM_H_
-
-#include "cras_types.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-uint32_t crc32_checksum(const unsigned char *input, size_t n);
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif /* CRAS_CHECKSUM_H_ */
diff --git a/cras/src/common/cras_config.c b/cras/src/common/cras_config.c
deleted file mode 100644
index 75fa24e..0000000
--- a/cras/src/common/cras_config.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <pwd.h>
-#include <stdlib.h>
-#include <sys/types.h>
-#include <unistd.h>
-
-#include "cras_config.h"
-
-const char *cras_config_get_system_socket_file_dir()
-{
-	/* This directory is created by the upstart script, eventually it would
-	 * be nice to make this more dynamic, but it isn't needed right now for
-	 * Chrome OS. */
-	return CRAS_SOCKET_FILE_DIR;
-}
-
-int cras_fill_socket_path(enum CRAS_CONNECTION_TYPE conn_type, char *sock_path)
-{
-	const char *sock_file;
-	const char *sock_dir;
-
-	sock_dir = cras_config_get_system_socket_file_dir();
-	if (sock_dir == NULL) {
-		return -ENOTDIR;
-	}
-
-	switch (conn_type) {
-	case CRAS_CONTROL:
-		sock_file = CRAS_SOCKET_FILE;
-		break;
-	case CRAS_PLAYBACK:
-		sock_file = CRAS_PLAYBACK_SOCKET_FILE;
-		break;
-	case CRAS_CAPTURE:
-		sock_file = CRAS_CAPTURE_SOCKET_FILE;
-		break;
-	case CRAS_VMS_LEGACY:
-		sock_file = CRAS_VMS_LEGACY_SOCKET_FILE;
-		break;
-	case CRAS_VMS_UNIFIED:
-		sock_file = CRAS_VMS_UNIFIED_SOCKET_FILE;
-		break;
-	case CRAS_PLUGIN_PLAYBACK:
-		sock_file = CRAS_PLUGIN_PLAYBACK_SOCKET_FILE;
-		break;
-	case CRAS_PLUGIN_UNIFIED:
-		sock_file = CRAS_PLUGIN_UNIFIED_SOCKET_FILE;
-		break;
-	default:
-		return -EINVAL;
-	}
-
-	snprintf(sock_path, CRAS_MAX_SOCKET_PATH_SIZE, "%s/%s", sock_dir,
-		 sock_file);
-
-	return 0;
-}
diff --git a/cras/src/common/cras_config.h b/cras/src/common/cras_config.h
deleted file mode 100644
index 1c8e55f..0000000
--- a/cras/src/common/cras_config.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_CONFIG_H_
-#define CRAS_CONFIG_H_
-
-#include "cras_types.h"
-
-#define CRAS_MIN_BUFFER_TIME_IN_US 1000 /* 1 milliseconds */
-#define CRAS_MAX_BUFFER_TIME_IN_S 10 /* 10 seconds */
-
-#define CRAS_SERVER_RT_THREAD_PRIORITY 12
-#define CRAS_CLIENT_RT_THREAD_PRIORITY 10
-#define CRAS_CLIENT_NICENESS_LEVEL -10
-#define CRAS_SOCKET_FILE ".cras_socket"
-#define CRAS_PLAYBACK_SOCKET_FILE ".cras_playback"
-#define CRAS_CAPTURE_SOCKET_FILE ".cras_capture"
-/* Socket file paths for VMs. */
-#define CRAS_VMS_LEGACY_SOCKET_FILE "vms/.cras_socket"
-#define CRAS_VMS_UNIFIED_SOCKET_FILE "vms/.cras_unified"
-/* Socket file paths for pluginVM. */
-#define CRAS_PLUGIN_PLAYBACK_SOCKET_FILE "vms/plugin/playback/.cras_socket"
-#define CRAS_PLUGIN_UNIFIED_SOCKET_FILE "vms/plugin/unified/.cras_socket"
-
-/* Maximum socket_path size, which is equals to sizeof(sun_path) in sockaddr_un
- * structure.
- */
-#define CRAS_MAX_SOCKET_PATH_SIZE 108
-
-/* CRAS_CONFIG_FILE_DIR is defined as $sysconfdir/cras by the configure
-   script. */
-
-/* Gets the path to save UDS socket files. */
-const char *cras_config_get_system_socket_file_dir();
-
-/* Fills sock_path by given connection type.
- *
- * Args:
- *    conn_type - server socket connection type.
- *    sock_path - socket path to be filled.
- *
- * Returns:
- *    0 for success, positive error code on error.
- */
-int cras_fill_socket_path(enum CRAS_CONNECTION_TYPE conn_type, char *sock_path);
-
-#endif /* CRAS_CONFIG_H_ */
diff --git a/cras/src/common/cras_file_wait.c b/cras/src/common/cras_file_wait.c
deleted file mode 100644
index 190a5e1..0000000
--- a/cras/src/common/cras_file_wait.c
+++ /dev/null
@@ -1,319 +0,0 @@
-/* Copyright 2016 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <errno.h>
-#include <fcntl.h>
-#include <stdlib.h>
-#include <string.h>
-#include <syslog.h>
-#include <sys/inotify.h>
-#include <sys/param.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <unistd.h>
-
-#include "cras_file_wait.h"
-
-#define CRAS_FILE_WAIT_EVENT_MIN_SIZE sizeof(struct inotify_event)
-#define CRAS_FILE_WAIT_EVENT_SIZE (CRAS_FILE_WAIT_EVENT_MIN_SIZE + NAME_MAX + 1)
-#define CRAS_FILE_WAIT_FLAG_MOCK_RACE (1u << 31)
-
-struct cras_file_wait {
-	cras_file_wait_callback_t callback;
-	void *callback_context;
-	const char *file_path;
-	size_t file_path_len;
-	char *watch_path;
-	char *watch_dir;
-	char *watch_file_name;
-	size_t watch_file_name_len;
-	int inotify_fd;
-	int watch_id;
-	char event_buf[CRAS_FILE_WAIT_EVENT_SIZE];
-	cras_file_wait_flag_t flags;
-};
-
-int cras_file_wait_get_fd(struct cras_file_wait *file_wait)
-{
-	if (!file_wait)
-		return -EINVAL;
-	if (file_wait->inotify_fd < 0)
-		return -EINVAL;
-	return file_wait->inotify_fd;
-}
-
-/* Defined for the unittest. */
-void cras_file_wait_mock_race_condition(struct cras_file_wait *file_wait);
-void cras_file_wait_mock_race_condition(struct cras_file_wait *file_wait)
-{
-	if (file_wait)
-		file_wait->flags |= CRAS_FILE_WAIT_FLAG_MOCK_RACE;
-}
-
-void cras_file_wait_destroy(struct cras_file_wait *file_wait)
-{
-	if (!file_wait)
-		return;
-	if (file_wait->inotify_fd >= 0)
-		close(file_wait->inotify_fd);
-	free(file_wait);
-}
-
-static int cras_file_wait_rm_watch(struct cras_file_wait *file_wait)
-{
-	int rc;
-
-	file_wait->watch_path[0] = 0;
-	file_wait->watch_dir[0] = 0;
-	file_wait->watch_file_name[0] = 0;
-	file_wait->watch_file_name_len = 0;
-	if (file_wait->inotify_fd >= 0 && file_wait->watch_id >= 0) {
-		rc = inotify_rm_watch(file_wait->inotify_fd,
-				      file_wait->watch_id);
-		file_wait->watch_id = -1;
-		if (rc < 0)
-			return -errno;
-	}
-	return 0;
-}
-
-int cras_file_wait_process_event(struct cras_file_wait *file_wait,
-				 struct inotify_event *event)
-{
-	cras_file_wait_event_t file_wait_event;
-
-	syslog(LOG_DEBUG,
-	       "file_wait->watch_id: %d, event->wd: %d"
-	       ", event->mask: %x, event->name: %s",
-	       file_wait->watch_id, event->wd, event->mask,
-	       event->len ? event->name : "");
-
-	if (event->wd != file_wait->watch_id)
-		return 0;
-
-	if (event->mask & IN_IGNORED) {
-		/* The watch has been removed. */
-		file_wait->watch_id = -1;
-		return cras_file_wait_rm_watch(file_wait);
-	}
-
-	if (event->len == 0 ||
-	    memcmp(event->name, file_wait->watch_file_name,
-		   file_wait->watch_file_name_len + 1) != 0) {
-		/* Some file we don't care about. */
-		return 0;
-	}
-
-	if ((event->mask & (IN_CREATE | IN_MOVED_TO)) != 0)
-		file_wait_event = CRAS_FILE_WAIT_EVENT_CREATED;
-	else if ((event->mask & (IN_DELETE | IN_MOVED_FROM)) != 0)
-		file_wait_event = CRAS_FILE_WAIT_EVENT_DELETED;
-	else
-		return 0;
-
-	/* Found the file! */
-	if (strcmp(file_wait->watch_path, file_wait->file_path) == 0) {
-		/* Tell the caller about this creation or deletion. */
-		file_wait->callback(file_wait->callback_context,
-				    file_wait_event, event->name);
-	} else {
-		/* Remove the watch for this file, move on. */
-		return cras_file_wait_rm_watch(file_wait);
-	}
-	return 0;
-}
-
-int cras_file_wait_dispatch(struct cras_file_wait *file_wait)
-{
-	struct inotify_event *event;
-	char *watch_dir_end;
-	size_t watch_dir_len;
-	char *watch_file_start;
-	size_t watch_path_len;
-	int rc = 0;
-	int flags;
-	ssize_t read_rc;
-	ssize_t read_offset;
-
-	if (!file_wait)
-		return -EINVAL;
-
-	/* If we have a file-descriptor, then read it and see what's up. */
-	if (file_wait->inotify_fd >= 0) {
-		read_offset = 0;
-		read_rc = read(file_wait->inotify_fd, file_wait->event_buf,
-			       CRAS_FILE_WAIT_EVENT_SIZE);
-		if (read_rc < 0) {
-			rc = -errno;
-			if ((rc == -EAGAIN || rc == -EWOULDBLOCK) &&
-			    file_wait->watch_id < 0) {
-				/* Really nothing to read yet: we need to
-				 * setup a watch. */
-				rc = 0;
-			}
-		} else if (read_rc < CRAS_FILE_WAIT_EVENT_MIN_SIZE) {
-			rc = -EIO;
-		} else if (file_wait->watch_id < 0) {
-			/* Processing messages related to old watches. */
-			rc = 0;
-		} else
-			while (rc == 0 && read_offset < read_rc) {
-				event = (struct inotify_event
-						 *)(file_wait->event_buf +
-						    read_offset);
-				read_offset += sizeof(*event) + event->len;
-				rc = cras_file_wait_process_event(file_wait,
-								  event);
-			}
-	}
-
-	/* Report errors from above here. */
-	if (rc < 0)
-		return rc;
-
-	if (file_wait->watch_id >= 0) {
-		/* Assume that the watch that we have is the right one. */
-		return 0;
-	}
-
-	/* Initialize inotify if we haven't already. */
-	if (file_wait->inotify_fd < 0) {
-		file_wait->inotify_fd = inotify_init1(IN_NONBLOCK | IN_CLOEXEC);
-		if (file_wait->inotify_fd < 0)
-			return -errno;
-	}
-
-	/* Figure out what we need to watch next. */
-	rc = -ENOENT;
-	strcpy(file_wait->watch_dir, file_wait->file_path);
-	watch_dir_len = file_wait->file_path_len;
-
-	while (rc == -ENOENT || rc == -EACCES) {
-		strcpy(file_wait->watch_path, file_wait->watch_dir);
-		watch_path_len = watch_dir_len;
-
-		/* Find the end of the parent directory. */
-		watch_dir_end = file_wait->watch_dir + watch_dir_len - 1;
-		while (watch_dir_end > file_wait->watch_dir &&
-		       *watch_dir_end != '/')
-			watch_dir_end--;
-		watch_file_start = watch_dir_end + 1;
-		/* Treat consecutive '/' characters as one. */
-		while (watch_dir_end > file_wait->watch_dir &&
-		       *(watch_dir_end - 1) == '/')
-			watch_dir_end--;
-		watch_dir_len = watch_dir_end - file_wait->watch_dir;
-
-		if (watch_dir_len == 0) {
-			/* We're looking for a file in the current directory. */
-			strcpy(file_wait->watch_file_name,
-			       file_wait->watch_path);
-			file_wait->watch_file_name_len = watch_path_len;
-			strcpy(file_wait->watch_dir, ".");
-			watch_dir_len = 1;
-		} else {
-			/* Copy out the file name that we're looking for, and
-			 * mark the end of the directory path. */
-			strcpy(file_wait->watch_file_name, watch_file_start);
-			file_wait->watch_file_name_len =
-				watch_path_len -
-				(watch_file_start - file_wait->watch_dir);
-			*watch_dir_end = 0;
-		}
-
-		if (file_wait->flags & CRAS_FILE_WAIT_FLAG_MOCK_RACE) {
-			/* For testing only. */
-			mknod(file_wait->watch_path, S_IFREG | 0600, 0);
-			file_wait->flags &= ~CRAS_FILE_WAIT_FLAG_MOCK_RACE;
-		}
-
-		flags = IN_CREATE | IN_MOVED_TO | IN_DELETE | IN_MOVED_FROM;
-		file_wait->watch_id = inotify_add_watch(
-			file_wait->inotify_fd, file_wait->watch_dir, flags);
-		if (file_wait->watch_id < 0) {
-			rc = -errno;
-			continue;
-		}
-
-		/* Satisfy the race condition between existence of the
-		 * file and creation of the watch. */
-		rc = access(file_wait->watch_path, F_OK);
-		if (rc < 0) {
-			rc = -errno;
-			if (rc == -ENOENT) {
-				/* As expected, the file still doesn't exist. */
-				rc = 0;
-			}
-			continue;
-		}
-
-		/* The file we're looking for exists. */
-		if (strcmp(file_wait->watch_path, file_wait->file_path) == 0) {
-			file_wait->callback(file_wait->callback_context,
-					    CRAS_FILE_WAIT_EVENT_CREATED,
-					    file_wait->watch_file_name);
-			return 0;
-		}
-
-		/* Start over again. */
-		rc = cras_file_wait_rm_watch(file_wait);
-		if (rc < 0)
-			return rc;
-		rc = -ENOENT;
-		strcpy(file_wait->watch_dir, file_wait->file_path);
-		watch_dir_len = file_wait->file_path_len;
-	}
-
-	/* Get out for permissions problems for example. */
-	return rc;
-}
-
-int cras_file_wait_create(const char *file_path, cras_file_wait_flag_t flags,
-			  cras_file_wait_callback_t callback,
-			  void *callback_context,
-			  struct cras_file_wait **file_wait_out)
-{
-	struct cras_file_wait *file_wait;
-	size_t file_path_len;
-	int rc;
-
-	if (!file_path || !*file_path || !callback || !file_wait_out)
-		return -EINVAL;
-	*file_wait_out = NULL;
-
-	/* Create a struct cras_file_wait to track waiting for this file. */
-	file_path_len = strlen(file_path);
-	file_wait = (struct cras_file_wait *)calloc(
-		1, sizeof(*file_wait) + ((file_path_len + 1) * 5));
-	if (!file_wait)
-		return -ENOMEM;
-	file_wait->callback = callback;
-	file_wait->callback_context = callback_context;
-	file_wait->inotify_fd = -1;
-	file_wait->watch_id = -1;
-	file_wait->file_path_len = file_path_len;
-	file_wait->flags = flags;
-
-	/* We've allocated memory such that the file_path, watch_path,
-	 * watch_dir, and watch_file_name data are appended to the end of
-	 * our cras_file_wait structure. */
-	file_wait->file_path = (const char *)file_wait + sizeof(*file_wait);
-	file_wait->watch_path =
-		(char *)file_wait->file_path + file_path_len + 1;
-	file_wait->watch_dir = file_wait->watch_path + file_path_len + 1;
-	file_wait->watch_file_name = file_wait->watch_dir + file_path_len + 1;
-	memcpy((void *)file_wait->file_path, file_path, file_path_len + 1);
-
-	/* Setup the first watch. If that fails unexpectedly, then we destroy
-	 * the file wait structure immediately. */
-	rc = cras_file_wait_dispatch(file_wait);
-	if (rc < 0) {
-		cras_file_wait_destroy(file_wait);
-		return rc;
-	}
-
-	*file_wait_out = file_wait;
-	return 0;
-}
diff --git a/cras/src/common/cras_file_wait.h b/cras/src/common/cras_file_wait.h
deleted file mode 100644
index e9ec3ad..0000000
--- a/cras/src/common/cras_file_wait.h
+++ /dev/null
@@ -1,128 +0,0 @@
-/* Copyright 2016 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_FILE_WAIT_H_
-#define CRAS_FILE_WAIT_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Structure used to track the current progress of a file wait. */
-struct cras_file_wait;
-
-/* Flags type for file wait. */
-typedef unsigned int cras_file_wait_flag_t;
-
-/* No flags. */
-#define CRAS_FILE_WAIT_FLAG_NONE ((cras_file_wait_flag_t)0)
-
-/* File wait events. */
-typedef enum cras_file_wait_event {
-	CRAS_FILE_WAIT_EVENT_NONE,
-	CRAS_FILE_WAIT_EVENT_CREATED,
-	CRAS_FILE_WAIT_EVENT_DELETED,
-} cras_file_wait_event_t;
-
-/*
- * File wait callback function.
- *
- * Called for cras_file_wait events. Do not call cras_file_wait_destroy()
- * from this function.
- *
- * Args:
- *    context - Context pointer passed to cras_file_wait_start().
- *    event - Event that has occurred related to this file wait.
- *    filename - Filename associated with the event.
- */
-typedef void (*cras_file_wait_callback_t)(void *context,
-					  cras_file_wait_event_t event,
-					  const char *filename);
-
-/*
- * Wait for the existence of a file.
- *
- * Setup a watch with the aim of determining if the given file path exists. If
- * any parent directory is missing, then the appropriate watch is created to
- * watch for the parent (or it's parent). Watches are created or renewed while
- * this file wait structure exists.
- *
- * The callback function will be called with event CRAS_FILE_WAIT_EVENT_CREATED
- * when the file is created, moved into the directory, or if it already exists
- * when this function is called.
- *
- * After the file is found future deletion and creation events for the file can
- * be observed using the same file_wait structure and callback. When the file
- * is deleted or moved out of it's parent, the callback is called with event
- * CRAS_FILE_WAIT_EVENT_DELETED.
- *
- * Call cras_file_wait_destroy() to cancel the wait anytime and cleanup
- * resources.
- *
- * Args:
- *    file_path - Path of the file or directory that must exist.
- *    flags - CRAS_FILE_WAIT_FLAG_* values bit-wise orred together. Set to
- *            CRAS_FILE_WAIT_FLAG_NONE for now.
- *    callback - Callback function to execute to notify of file existence.
- *    callback_context - Context pointer passed to the callback function.
- *    file_wait_out - Pointer to file wait structure that is initialized.
- *
- * Returns:
- *    - 0 for success, or negative on error.
- *    - On error cras_file_wait_destroy() need not be called.
- */
-int cras_file_wait_create(const char *file_path, cras_file_wait_flag_t flags,
-			  cras_file_wait_callback_t callback,
-			  void *callback_context,
-			  struct cras_file_wait **file_wait_out);
-
-/* Returns the file-descriptor to poll for a file wait.
- *
- * Poll for POLLIN on this file decriptor. When there is data available, call
- * cras_file_wait_continue() on the associated file_wait structure.
- *
- * Args:
- *    file_wait - The associated cras_file_wait structure initialized by
- *                cras_file_wait_start().
- *
- * Returns:
- *    Non-negative file descriptor number, or -EINVAL if the file_wait
- *    structure is NULL or otherwise invalid.
- */
-int cras_file_wait_get_fd(struct cras_file_wait *file_wait);
-
-/* Dispatch a file wait event.
- *
- * Call this function when the file descriptor from cras_file_wait_fd() has
- * data ready (POLLIN). This function will call the callback provided to
- * cras_file_wait_start when there is a relevant event.
- *
- * Args:
- *    file_wait - The associated cras_file_wait structure initialized by
- *                cras_file_wait_start().
- *
- * Returns:
- *    - 0 for success, negative on error.
- *    - -EAGAIN or -EWOULDBLOCK when this function would have blocked.
- */
-int cras_file_wait_dispatch(struct cras_file_wait *file_wait);
-
-/* Destroy a file wait structure.
- *
- * This function can be called to cleanup a cras_file_wait structure, and it
- * will interrupt any wait that is in progress; the pointer is subsequently
- * invalid.
- *
- * Args:
- *    file_wait - The cras_file_wait structure initialized by
- *                cras_file_wait_start();
- */
-void cras_file_wait_destroy(struct cras_file_wait *file_wait);
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif /* CRAS_FILE_WAIT_H_ */
diff --git a/cras/src/common/cras_iodev_info.h b/cras/src/common/cras_iodev_info.h
deleted file mode 100644
index 85d20f9..0000000
--- a/cras/src/common/cras_iodev_info.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_IODEV_INFO_H_
-#define CRAS_IODEV_INFO_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#define CRAS_IODEV_NAME_BUFFER_SIZE 64
-#define CRAS_NODE_TYPE_BUFFER_SIZE 32
-#define CRAS_NODE_MIC_POS_BUFFER_SIZE 128
-#define CRAS_NODE_NAME_BUFFER_SIZE 64
-#define CRAS_NODE_HOTWORD_MODEL_BUFFER_SIZE 16
-
-/* Identifying information about an IO device.
- *    idx - iodev index.
- *    name - Name displayed to the user.
- *    stable_id - ID that does not change due to device plug/unplug or reboot.
- *    max_supported_channels - Max supported channel count of this device.
- */
-struct __attribute__((__packed__)) cras_iodev_info {
-	uint32_t idx;
-	char name[CRAS_IODEV_NAME_BUFFER_SIZE];
-	uint32_t stable_id;
-	uint32_t max_supported_channels;
-};
-
-/* Identifying information about an ionode on an iodev.
- *    iodev_idx - Index of the device this node belongs.
- *    ionode_idx - Index of this node on the device.
- *    plugged - Set true if this node is known to be plugged in.
- *    plugged_time - If plugged is true, this is the time it was attached.
- *    active - If this is the node currently being used.
- *    volume - per-node volume (0-100)
- *    capture_gain - per-node capture gain/attenuation (in 100*dBFS)
- *    ui_gain_scaler - Adjustable gain scaler set by Chrome.
- *    left_right_swapped - Set true if left and right channels are swapped.
- *    stable_id - ID that does not change due to device plug/unplug or reboot.
- *    type - Type displayed to the user.
- *    name - Name displayed to the user.
- *    active_hotword_model - name of the currently selected hotword model.
- */
-struct __attribute__((__packed__)) cras_ionode_info {
-	uint32_t iodev_idx;
-	uint32_t ionode_idx;
-	int32_t plugged;
-	int32_t active;
-	struct {
-		int64_t tv_sec;
-		int64_t tv_usec;
-	} plugged_time;
-	uint32_t volume;
-	int32_t capture_gain;
-	float ui_gain_scaler;
-	int32_t left_right_swapped;
-	uint32_t type_enum;
-	uint32_t stable_id;
-	char type[CRAS_NODE_TYPE_BUFFER_SIZE];
-	char name[CRAS_NODE_NAME_BUFFER_SIZE];
-	char active_hotword_model[CRAS_NODE_HOTWORD_MODEL_BUFFER_SIZE];
-};
-
-/* This is used in the cras_client_set_node_attr API.
- *    IONODE_ATTR_PLUGGED - set the node as plugged/unplugged.
- *    IONODE_ATTR_VOLUME - set the node's output volume.
- *    IONODE_ATTR_CAPTURE_GAIN - set the node's capture gain.
- *    IONODE_ATTR_SWAP_LEFT_RIGHT - Swap the node's left and right channel.
- */
-enum ionode_attr {
-	IONODE_ATTR_PLUGGED,
-	IONODE_ATTR_VOLUME,
-	IONODE_ATTR_CAPTURE_GAIN,
-	IONODE_ATTR_SWAP_LEFT_RIGHT
-};
-
-#endif /* CRAS_IODEV_INFO_H_ */
diff --git a/cras/src/common/cras_messages.h b/cras/src/common/cras_messages.h
deleted file mode 100644
index 50cbe7c..0000000
--- a/cras/src/common/cras_messages.h
+++ /dev/null
@@ -1,756 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-/*
- * Messages sent between the server and clients.
- */
-#ifndef CRAS_MESSAGES_H_
-#define CRAS_MESSAGES_H_
-
-#include <stdint.h>
-
-#include "cras_iodev_info.h"
-#include "cras_types.h"
-
-/* Rev when message format changes. If new messages are added, or message ID
- * values change. */
-#define CRAS_PROTO_VER 7
-#define CRAS_SERV_MAX_MSG_SIZE 256
-#define CRAS_CLIENT_MAX_MSG_SIZE 256
-#define CRAS_MAX_HOTWORD_MODELS 243
-#define CRAS_MAX_REMIX_CHANNELS 8
-#define CRAS_MAX_TEST_DATA_LEN 224
-#define CRAS_AEC_DUMP_FILE_NAME_LEN 128
-
-/* Message IDs. */
-enum CRAS_SERVER_MESSAGE_ID {
-	/* Client -> Server*/
-	CRAS_SERVER_CONNECT_STREAM,
-	CRAS_SERVER_DISCONNECT_STREAM,
-	CRAS_SERVER_SWITCH_STREAM_TYPE_IODEV, /* Unused */
-	CRAS_SERVER_SET_SYSTEM_VOLUME,
-	CRAS_SERVER_SET_SYSTEM_MUTE,
-	CRAS_SERVER_SET_USER_MUTE,
-	CRAS_SERVER_SET_SYSTEM_MUTE_LOCKED,
-	CRAS_SERVER_SET_SYSTEM_CAPTURE_GAIN, /* Deprecated */
-	CRAS_SERVER_SET_SYSTEM_CAPTURE_MUTE,
-	CRAS_SERVER_SET_SYSTEM_CAPTURE_MUTE_LOCKED,
-	CRAS_SERVER_SET_NODE_ATTR,
-	CRAS_SERVER_SELECT_NODE,
-	CRAS_SERVER_RELOAD_DSP,
-	CRAS_SERVER_DUMP_DSP_INFO,
-	CRAS_SERVER_DUMP_AUDIO_THREAD,
-	CRAS_SERVER_DUMP_SNAPSHOTS,
-	CRAS_SERVER_ADD_ACTIVE_NODE,
-	CRAS_SERVER_RM_ACTIVE_NODE,
-	CRAS_SERVER_ADD_TEST_DEV,
-	CRAS_SERVER_TEST_DEV_COMMAND,
-	CRAS_SERVER_SUSPEND,
-	CRAS_SERVER_RESUME,
-	CRAS_CONFIG_GLOBAL_REMIX,
-	CRAS_SERVER_GET_HOTWORD_MODELS,
-	CRAS_SERVER_SET_HOTWORD_MODEL,
-	CRAS_SERVER_REGISTER_NOTIFICATION,
-	CRAS_SERVER_SET_AEC_DUMP,
-	CRAS_SERVER_RELOAD_AEC_CONFIG,
-	CRAS_SERVER_DUMP_BT,
-	CRAS_SERVER_SET_BT_WBS_ENABLED,
-	CRAS_SERVER_GET_ATLOG_FD,
-	CRAS_SERVER_DUMP_MAIN,
-};
-
-enum CRAS_CLIENT_MESSAGE_ID {
-	/* Server -> Client */
-	CRAS_CLIENT_CONNECTED,
-	CRAS_CLIENT_STREAM_CONNECTED,
-	CRAS_CLIENT_AUDIO_DEBUG_INFO_READY,
-	CRAS_CLIENT_GET_HOTWORD_MODELS_READY,
-	/* System status messages */
-	CRAS_CLIENT_OUTPUT_VOLUME_CHANGED,
-	CRAS_CLIENT_OUTPUT_MUTE_CHANGED,
-	CRAS_CLIENT_CAPTURE_GAIN_CHANGED,
-	CRAS_CLIENT_CAPTURE_MUTE_CHANGED,
-	CRAS_CLIENT_NODES_CHANGED,
-	CRAS_CLIENT_ACTIVE_NODE_CHANGED,
-	CRAS_CLIENT_OUTPUT_NODE_VOLUME_CHANGED,
-	CRAS_CLIENT_NODE_LEFT_RIGHT_SWAPPED_CHANGED,
-	CRAS_CLIENT_INPUT_NODE_GAIN_CHANGED,
-	CRAS_CLIENT_NUM_ACTIVE_STREAMS_CHANGED,
-	/* Server -> Client */
-	CRAS_CLIENT_ATLOG_FD_READY,
-};
-
-/* Messages that control the server. These are sent from the client to affect
- * and action on the server. */
-struct __attribute__((__packed__)) cras_server_message {
-	uint32_t length;
-	enum CRAS_SERVER_MESSAGE_ID id;
-};
-
-/* Messages that control the client. These are sent from the server to affect
- * and action on the client. */
-struct __attribute__((__packed__)) cras_client_message {
-	uint32_t length;
-	enum CRAS_CLIENT_MESSAGE_ID id;
-};
-
-/*
- * Messages from client to server.
- */
-
-/* Sent by a client to connect a stream to the server. */
-struct __attribute__((__packed__)) cras_connect_message {
-	struct cras_server_message header;
-	uint32_t proto_version;
-	enum CRAS_STREAM_DIRECTION direction; /* input/output/loopback */
-	cras_stream_id_t stream_id; /* unique id for this stream */
-	enum CRAS_STREAM_TYPE stream_type; /* media, or call, etc. */
-	uint32_t buffer_frames; /* Buffer size in frames. */
-	uint32_t cb_threshold; /* callback client when this much is left */
-	uint32_t flags;
-	struct cras_audio_format_packed format; /* rate, channel, sample size */
-	uint32_t dev_idx; /* device to attach stream, 0 if none */
-	uint64_t effects; /* Bit map of requested effects. */
-	enum CRAS_CLIENT_TYPE client_type; /* chrome, or arc, etc. */
-	uint64_t client_shm_size; /* Size of client-provided samples shm, if any */
-	/* Initial values for shm samples buffer offsets. These will be 0 for
-	 * streams that do not use client-provided shm */
-	uint64_t buffer_offsets[2];
-};
-
-static inline void cras_fill_connect_message(
-	struct cras_connect_message *m, enum CRAS_STREAM_DIRECTION direction,
-	cras_stream_id_t stream_id, enum CRAS_STREAM_TYPE stream_type,
-	enum CRAS_CLIENT_TYPE client_type, size_t buffer_frames,
-	size_t cb_threshold, uint32_t flags, uint64_t effects,
-	struct cras_audio_format format, uint32_t dev_idx)
-{
-	m->proto_version = CRAS_PROTO_VER;
-	m->direction = direction;
-	m->stream_id = stream_id;
-	m->stream_type = stream_type;
-	m->buffer_frames = buffer_frames;
-	m->cb_threshold = cb_threshold;
-	m->flags = flags;
-	m->effects = effects;
-	pack_cras_audio_format(&m->format, &format);
-	m->dev_idx = dev_idx;
-	m->client_type = client_type;
-	m->client_shm_size = 0;
-	m->buffer_offsets[0] = 0;
-	m->buffer_offsets[1] = 0;
-	m->header.id = CRAS_SERVER_CONNECT_STREAM;
-	m->header.length = sizeof(struct cras_connect_message);
-}
-
-/* Sent by a client to remove a stream from the server. */
-struct __attribute__((__packed__)) cras_disconnect_stream_message {
-	struct cras_server_message header;
-	cras_stream_id_t stream_id;
-};
-static inline void
-cras_fill_disconnect_stream_message(struct cras_disconnect_stream_message *m,
-				    cras_stream_id_t stream_id)
-{
-	m->stream_id = stream_id;
-	m->header.id = CRAS_SERVER_DISCONNECT_STREAM;
-	m->header.length = sizeof(struct cras_disconnect_stream_message);
-}
-
-/* Move streams of "type" to the iodev at "iodev_idx". */
-struct __attribute__((__packed__)) cras_switch_stream_type_iodev {
-	struct cras_server_message header;
-	enum CRAS_STREAM_TYPE stream_type;
-	uint32_t iodev_idx;
-};
-
-/* Set the system volume. */
-struct __attribute__((__packed__)) cras_set_system_volume {
-	struct cras_server_message header;
-	uint32_t volume;
-};
-static inline void cras_fill_set_system_volume(struct cras_set_system_volume *m,
-					       size_t volume)
-{
-	m->volume = volume;
-	m->header.id = CRAS_SERVER_SET_SYSTEM_VOLUME;
-	m->header.length = sizeof(*m);
-}
-
-/* Set the system mute state. */
-struct __attribute__((__packed__)) cras_set_system_mute {
-	struct cras_server_message header;
-	int32_t mute; /* 0 = un-mute, 1 = mute. */
-};
-static inline void cras_fill_set_system_mute(struct cras_set_system_mute *m,
-					     int mute)
-{
-	m->mute = mute;
-	m->header.id = CRAS_SERVER_SET_SYSTEM_MUTE;
-	m->header.length = sizeof(*m);
-}
-static inline void cras_fill_set_user_mute(struct cras_set_system_mute *m,
-					   int mute)
-{
-	m->mute = mute;
-	m->header.id = CRAS_SERVER_SET_USER_MUTE;
-	m->header.length = sizeof(*m);
-}
-static inline void
-cras_fill_set_system_mute_locked(struct cras_set_system_mute *m, int locked)
-{
-	m->mute = locked;
-	m->header.id = CRAS_SERVER_SET_SYSTEM_MUTE_LOCKED;
-	m->header.length = sizeof(*m);
-}
-static inline void
-cras_fill_set_system_capture_mute(struct cras_set_system_mute *m, int mute)
-{
-	m->mute = mute;
-	m->header.id = CRAS_SERVER_SET_SYSTEM_CAPTURE_MUTE;
-	m->header.length = sizeof(*m);
-}
-static inline void
-cras_fill_set_system_capture_mute_locked(struct cras_set_system_mute *m,
-					 int locked)
-{
-	m->mute = locked;
-	m->header.id = CRAS_SERVER_SET_SYSTEM_CAPTURE_MUTE_LOCKED;
-	m->header.length = sizeof(*m);
-}
-
-/* Set an attribute of an ionode. */
-struct __attribute__((__packed__)) cras_set_node_attr {
-	struct cras_server_message header;
-	cras_node_id_t node_id;
-	enum ionode_attr attr;
-	int32_t value;
-};
-static inline void cras_fill_set_node_attr(struct cras_set_node_attr *m,
-					   cras_node_id_t node_id,
-					   enum ionode_attr attr, int value)
-{
-	m->header.id = CRAS_SERVER_SET_NODE_ATTR;
-	m->node_id = node_id;
-	m->attr = attr;
-	m->value = value;
-	m->header.length = sizeof(*m);
-}
-
-/* Set an attribute of an ionode. */
-struct __attribute__((__packed__)) cras_select_node {
-	struct cras_server_message header;
-	enum CRAS_STREAM_DIRECTION direction;
-	cras_node_id_t node_id;
-};
-static inline void cras_fill_select_node(struct cras_select_node *m,
-					 enum CRAS_STREAM_DIRECTION direction,
-					 cras_node_id_t node_id)
-{
-	m->header.id = CRAS_SERVER_SELECT_NODE;
-	m->direction = direction;
-	m->node_id = node_id;
-	m->header.length = sizeof(*m);
-}
-
-/* Add an active ionode. */
-struct __attribute__((__packed__)) cras_add_active_node {
-	struct cras_server_message header;
-	enum CRAS_STREAM_DIRECTION direction;
-	cras_node_id_t node_id;
-};
-static inline void
-cras_fill_add_active_node(struct cras_add_active_node *m,
-			  enum CRAS_STREAM_DIRECTION direction,
-			  cras_node_id_t node_id)
-{
-	m->header.id = CRAS_SERVER_ADD_ACTIVE_NODE;
-	m->direction = direction;
-	m->node_id = node_id;
-	m->header.length = sizeof(*m);
-}
-
-/* Remove an active ionode. */
-struct __attribute__((__packed__)) cras_rm_active_node {
-	struct cras_server_message header;
-	enum CRAS_STREAM_DIRECTION direction;
-	cras_node_id_t node_id;
-};
-static inline void
-cras_fill_rm_active_node(struct cras_rm_active_node *m,
-			 enum CRAS_STREAM_DIRECTION direction,
-			 cras_node_id_t node_id)
-{
-	m->header.id = CRAS_SERVER_RM_ACTIVE_NODE;
-	m->direction = direction;
-	m->node_id = node_id;
-	m->header.length = sizeof(*m);
-}
-
-/* Reload the dsp configuration. */
-struct __attribute__((__packed__)) cras_reload_dsp {
-	struct cras_server_message header;
-};
-static inline void cras_fill_reload_dsp(struct cras_reload_dsp *m)
-{
-	m->header.id = CRAS_SERVER_RELOAD_DSP;
-	m->header.length = sizeof(*m);
-}
-
-/* Dump current dsp information to syslog. */
-struct __attribute__((__packed__)) cras_dump_dsp_info {
-	struct cras_server_message header;
-};
-
-static inline void cras_fill_dump_dsp_info(struct cras_dump_dsp_info *m)
-{
-	m->header.id = CRAS_SERVER_DUMP_DSP_INFO;
-	m->header.length = sizeof(*m);
-}
-
-/* Dump current audio thread information to syslog. */
-struct __attribute__((__packed__)) cras_dump_audio_thread {
-	struct cras_server_message header;
-};
-
-static inline void cras_fill_dump_audio_thread(struct cras_dump_audio_thread *m)
-{
-	m->header.id = CRAS_SERVER_DUMP_AUDIO_THREAD;
-	m->header.length = sizeof(*m);
-}
-
-struct __attribute__((__packed__)) cras_get_atlog_fd {
-	struct cras_server_message header;
-};
-
-static inline void cras_fill_get_atlog_fd(struct cras_get_atlog_fd *m)
-{
-	m->header.id = CRAS_SERVER_GET_ATLOG_FD;
-	m->header.length = sizeof(*m);
-}
-
-/* Dump events in CRAS main thread. */
-struct __attribute__((__packed__)) cras_dump_main {
-	struct cras_server_message header;
-};
-
-static inline void cras_fill_dump_main(struct cras_dump_main *m)
-{
-	m->header.id = CRAS_SERVER_DUMP_MAIN;
-	m->header.length = sizeof(*m);
-}
-
-/* Dump bluetooth events and state changes. */
-struct __attribute__((__packed__)) cras_dump_bt {
-	struct cras_server_message header;
-};
-
-static inline void cras_fill_dump_bt(struct cras_dump_bt *m)
-{
-	m->header.id = CRAS_SERVER_DUMP_BT;
-	m->header.length = sizeof(*m);
-}
-
-/* Dump current audio thread snapshots to shard memory with the client. */
-struct __attribute__((__packed__)) cras_dump_snapshots {
-	struct cras_server_message header;
-};
-
-static inline void cras_fill_dump_snapshots(struct cras_dump_snapshots *m)
-{
-	m->header.id = CRAS_SERVER_DUMP_SNAPSHOTS;
-	m->header.length = sizeof(*m);
-}
-
-/* Add a test device. */
-struct __attribute__((__packed__)) cras_add_test_dev {
-	struct cras_server_message header;
-	enum TEST_IODEV_TYPE type;
-};
-
-static inline void cras_fill_add_test_dev(struct cras_add_test_dev *m,
-					  enum TEST_IODEV_TYPE type)
-{
-	m->header.id = CRAS_SERVER_ADD_TEST_DEV;
-	m->header.length = sizeof(*m);
-	m->type = type;
-}
-
-/* Command a test device. */
-struct __attribute__((__packed__)) cras_test_dev_command {
-	struct cras_server_message header;
-	unsigned int command;
-	unsigned int iodev_idx;
-	unsigned int data_len;
-	uint8_t data[CRAS_MAX_TEST_DATA_LEN];
-};
-
-static inline void cras_fill_test_dev_command(struct cras_test_dev_command *m,
-					      unsigned int iodev_idx,
-					      enum CRAS_TEST_IODEV_CMD command,
-					      unsigned int data_len,
-					      const uint8_t *data)
-{
-	m->header.id = CRAS_SERVER_TEST_DEV_COMMAND;
-	m->header.length = sizeof(*m) + data_len;
-	m->iodev_idx = iodev_idx;
-	m->command = command;
-	m->data_len = data_len;
-	memcpy(m->data, data, data_len);
-}
-
-static inline void cras_fill_suspend_message(struct cras_server_message *m,
-					     int is_suspend)
-{
-	m->id = is_suspend ? CRAS_SERVER_SUSPEND : CRAS_SERVER_RESUME;
-	m->length = sizeof(*m);
-}
-
-/*
- * Configures the global remix converter.
- * `num_channels` must be less than `CRAS_MAX_REMIX_CHANNELS`.
- */
-struct __attribute__((__packed__)) cras_config_global_remix {
-	struct cras_server_message header;
-	unsigned int num_channels;
-	float coefficient[CRAS_MAX_REMIX_CHANNELS * CRAS_MAX_REMIX_CHANNELS];
-};
-
-static inline void
-cras_fill_config_global_remix_command(struct cras_config_global_remix *m,
-				      unsigned int num_channels, float *coeff,
-				      unsigned int count)
-{
-	m->header.id = CRAS_CONFIG_GLOBAL_REMIX;
-	m->header.length = sizeof(*m) + count * sizeof(*coeff);
-	m->num_channels = num_channels;
-	memcpy(m->coefficient, coeff, count * sizeof(*coeff));
-}
-
-/* Get supported hotword models. */
-struct __attribute__((__packed__)) cras_get_hotword_models {
-	struct cras_server_message header;
-	cras_node_id_t node_id;
-};
-
-static inline void
-cras_fill_get_hotword_models_message(struct cras_get_hotword_models *m,
-				     cras_node_id_t node_id)
-{
-	m->header.id = CRAS_SERVER_GET_HOTWORD_MODELS;
-	m->header.length = sizeof(*m);
-	m->node_id = node_id;
-}
-
-/* Set desired hotword model. */
-struct __attribute__((__packed__)) cras_set_hotword_model {
-	struct cras_server_message header;
-	cras_node_id_t node_id;
-	char model_name[CRAS_MAX_HOTWORD_MODEL_NAME_SIZE];
-};
-
-static inline void
-cras_fill_set_hotword_model_message(struct cras_set_hotword_model *m,
-				    cras_node_id_t node_id,
-				    const char *model_name)
-{
-	m->header.id = CRAS_SERVER_SET_HOTWORD_MODEL;
-	m->header.length = sizeof(*m);
-	m->node_id = node_id;
-	memcpy(m->model_name, model_name, CRAS_MAX_HOTWORD_MODEL_NAME_SIZE);
-}
-
-/* Set aec dump to start or stop. */
-struct __attribute__((__packed__)) cras_set_aec_dump {
-	struct cras_server_message header;
-	cras_stream_id_t stream_id;
-	unsigned int start;
-};
-
-static inline void cras_fill_set_aec_dump_message(struct cras_set_aec_dump *m,
-						  cras_stream_id_t stream_id,
-						  unsigned int start)
-{
-	m->header.id = CRAS_SERVER_SET_AEC_DUMP;
-	m->header.length = sizeof(*m);
-	m->stream_id = stream_id;
-	m->start = start;
-}
-
-/* Reload the aec configuration. */
-struct __attribute__((__packed__)) cras_reload_aec_config {
-	struct cras_server_message header;
-};
-static inline void cras_fill_reload_aec_config(struct cras_reload_aec_config *m)
-{
-	m->header.id = CRAS_SERVER_RELOAD_AEC_CONFIG;
-	m->header.length = sizeof(*m);
-}
-
-/* Sets the flag to enable or disable bluetooth wideband speech feature. */
-struct __attribute__((__packed__)) cras_set_bt_wbs_enabled {
-	struct cras_server_message header;
-	unsigned int enabled;
-};
-static inline void
-cras_fill_set_bt_wbs_enabled(struct cras_set_bt_wbs_enabled *m,
-			     unsigned int enabled)
-{
-	m->header.id = CRAS_SERVER_SET_BT_WBS_ENABLED;
-	m->header.length = sizeof(*m);
-	m->enabled = enabled;
-}
-
-struct __attribute__((__packed__)) cras_register_notification {
-	struct cras_server_message header;
-	uint32_t msg_id;
-	int do_register;
-};
-static inline void
-cras_fill_register_notification_message(struct cras_register_notification *m,
-					enum CRAS_CLIENT_MESSAGE_ID msg_id,
-					int do_register)
-{
-	m->header.id = CRAS_SERVER_REGISTER_NOTIFICATION;
-	m->header.length = sizeof(*m);
-	m->msg_id = msg_id;
-	m->do_register = do_register;
-}
-
-/*
- * Messages sent from server to client.
- */
-
-/* Reply from the server indicating that the client has connected. */
-struct __attribute__((__packed__)) cras_client_connected {
-	struct cras_client_message header;
-	uint32_t client_id;
-};
-static inline void cras_fill_client_connected(struct cras_client_connected *m,
-					      size_t client_id)
-{
-	m->client_id = client_id;
-	m->header.id = CRAS_CLIENT_CONNECTED;
-	m->header.length = sizeof(struct cras_client_connected);
-}
-
-/*
- * Reply from server that a stream has been successfully added.
- * Two file descriptors are added, input shm followed by out shm.
- *
- * |samples_shm_size| is valid for normal streams, not client-provided
- * shm streams.
- */
-struct __attribute__((__packed__)) cras_client_stream_connected {
-	struct cras_client_message header;
-	int32_t err;
-	cras_stream_id_t stream_id;
-	struct cras_audio_format_packed format;
-	uint32_t samples_shm_size;
-	uint64_t effects;
-};
-
-static inline void
-cras_fill_client_stream_connected(struct cras_client_stream_connected *m,
-				  int err, cras_stream_id_t stream_id,
-				  struct cras_audio_format *format,
-				  size_t samples_shm_size, uint64_t effects)
-{
-	m->err = err;
-	m->stream_id = stream_id;
-	pack_cras_audio_format(&m->format, format);
-	if (samples_shm_size > UINT32_MAX) {
-		samples_shm_size = UINT32_MAX;
-	}
-	m->samples_shm_size = samples_shm_size;
-	m->effects = effects;
-	m->header.id = CRAS_CLIENT_STREAM_CONNECTED;
-	m->header.length = sizeof(struct cras_client_stream_connected);
-}
-
-/* Sent from server to client when audio debug information is requested. */
-struct __attribute__((__packed__)) cras_client_audio_debug_info_ready {
-	struct cras_client_message header;
-};
-static inline void cras_fill_client_audio_debug_info_ready(
-	struct cras_client_audio_debug_info_ready *m)
-{
-	m->header.id = CRAS_CLIENT_AUDIO_DEBUG_INFO_READY;
-	m->header.length = sizeof(*m);
-}
-
-struct __attribute__((__packed__)) cras_client_atlog_fd_ready {
-	struct cras_client_message header;
-};
-
-static inline void
-cras_fill_client_atlog_fd_ready(struct cras_client_atlog_fd_ready *m)
-{
-	m->header.id = CRAS_CLIENT_ATLOG_FD_READY;
-	m->header.length = sizeof(*m);
-}
-
-/* Sent from server to client when hotword models info is ready. */
-struct __attribute__((__packed__)) cras_client_get_hotword_models_ready {
-	struct cras_client_message header;
-	int32_t hotword_models_size;
-	uint8_t hotword_models[CRAS_MAX_HOTWORD_MODELS + 1];
-};
-static inline void cras_fill_client_get_hotword_models_ready(
-	struct cras_client_get_hotword_models_ready *m,
-	const char *hotword_models, size_t hotword_models_size)
-{
-	m->header.id = CRAS_CLIENT_GET_HOTWORD_MODELS_READY;
-	m->header.length = sizeof(*m);
-	m->hotword_models_size = hotword_models_size;
-	/* Copy string data with terminator. */
-	if (hotword_models) {
-		strncpy((char *)m->hotword_models, hotword_models,
-			CRAS_MAX_HOTWORD_MODELS);
-		m->hotword_models[CRAS_MAX_HOTWORD_MODELS] = '\0';
-	}
-}
-
-/* System status messages sent from server to client when state changes. */
-struct __attribute__((__packed__)) cras_client_volume_changed {
-	struct cras_client_message header;
-	int32_t volume;
-};
-static inline void
-cras_fill_client_output_volume_changed(struct cras_client_volume_changed *m,
-				       int32_t volume)
-{
-	m->header.id = CRAS_CLIENT_OUTPUT_VOLUME_CHANGED;
-	m->header.length = sizeof(*m);
-	m->volume = volume;
-}
-static inline void
-cras_fill_client_capture_gain_changed(struct cras_client_volume_changed *m,
-				      int32_t gain)
-{
-	m->header.id = CRAS_CLIENT_CAPTURE_GAIN_CHANGED;
-	m->header.length = sizeof(*m);
-	m->volume = gain;
-}
-
-struct __attribute__((__packed__)) cras_client_mute_changed {
-	struct cras_client_message header;
-	int32_t muted;
-	int32_t user_muted;
-	int32_t mute_locked;
-};
-static inline void
-cras_fill_client_output_mute_changed(struct cras_client_mute_changed *m,
-				     int32_t muted, int32_t user_muted,
-				     int32_t mute_locked)
-{
-	m->header.id = CRAS_CLIENT_OUTPUT_MUTE_CHANGED;
-	m->header.length = sizeof(*m);
-	m->muted = muted;
-	m->user_muted = user_muted;
-	m->mute_locked = mute_locked;
-}
-static inline void
-cras_fill_client_capture_mute_changed(struct cras_client_mute_changed *m,
-				      int32_t muted, int32_t mute_locked)
-{
-	m->header.id = CRAS_CLIENT_CAPTURE_MUTE_CHANGED;
-	m->header.length = sizeof(*m);
-	m->muted = muted;
-	m->user_muted = 0;
-	m->mute_locked = mute_locked;
-}
-
-struct __attribute__((__packed__)) cras_client_nodes_changed {
-	struct cras_client_message header;
-};
-static inline void
-cras_fill_client_nodes_changed(struct cras_client_nodes_changed *m)
-{
-	m->header.id = CRAS_CLIENT_NODES_CHANGED;
-	m->header.length = sizeof(*m);
-}
-
-struct __attribute__((__packed__)) cras_client_active_node_changed {
-	struct cras_client_message header;
-	uint32_t direction;
-	cras_node_id_t node_id;
-};
-static inline void
-cras_fill_client_active_node_changed(struct cras_client_active_node_changed *m,
-				     enum CRAS_STREAM_DIRECTION direction,
-				     cras_node_id_t node_id)
-{
-	m->header.id = CRAS_CLIENT_ACTIVE_NODE_CHANGED;
-	m->header.length = sizeof(*m);
-	m->direction = direction;
-	m->node_id = node_id;
-};
-
-struct __attribute__((__packed__)) cras_client_node_value_changed {
-	struct cras_client_message header;
-	cras_node_id_t node_id;
-	int32_t value;
-};
-static inline void cras_fill_client_output_node_volume_changed(
-	struct cras_client_node_value_changed *m, cras_node_id_t node_id,
-	int32_t volume)
-{
-	m->header.id = CRAS_CLIENT_OUTPUT_NODE_VOLUME_CHANGED;
-	m->header.length = sizeof(*m);
-	m->node_id = node_id;
-	m->value = volume;
-};
-static inline void cras_fill_client_node_left_right_swapped_changed(
-	struct cras_client_node_value_changed *m, cras_node_id_t node_id,
-	int swapped)
-{
-	m->header.id = CRAS_CLIENT_NODE_LEFT_RIGHT_SWAPPED_CHANGED;
-	m->header.length = sizeof(*m);
-	m->node_id = node_id;
-	m->value = swapped;
-};
-static inline void cras_fill_client_input_node_gain_changed(
-	struct cras_client_node_value_changed *m, cras_node_id_t node_id,
-	int32_t gain)
-{
-	m->header.id = CRAS_CLIENT_INPUT_NODE_GAIN_CHANGED;
-	m->header.length = sizeof(*m);
-	m->node_id = node_id;
-	m->value = gain;
-};
-
-struct __attribute__((__packed__)) cras_client_num_active_streams_changed {
-	struct cras_client_message header;
-	uint32_t direction;
-	uint32_t num_active_streams;
-};
-static inline void cras_fill_client_num_active_streams_changed(
-	struct cras_client_num_active_streams_changed *m,
-	enum CRAS_STREAM_DIRECTION direction, uint32_t num_active_streams)
-{
-	m->header.id = CRAS_CLIENT_NUM_ACTIVE_STREAMS_CHANGED;
-	m->header.length = sizeof(*m);
-	m->direction = direction;
-	m->num_active_streams = num_active_streams;
-};
-
-/*
- * Messages specific to passing audio between client and server
- */
-enum CRAS_AUDIO_MESSAGE_ID {
-	AUDIO_MESSAGE_REQUEST_DATA,
-	AUDIO_MESSAGE_DATA_READY,
-	AUDIO_MESSAGE_DATA_CAPTURED,
-	NUM_AUDIO_MESSAGES
-};
-
-struct __attribute__((__packed__)) audio_message {
-	enum CRAS_AUDIO_MESSAGE_ID id;
-	int32_t error;
-	uint32_t frames; /* number of samples per channel */
-};
-
-#endif /* CRAS_MESSAGES_H_ */
diff --git a/cras/src/common/cras_metrics.c b/cras/src/common/cras_metrics.c
deleted file mode 100644
index b318fb4..0000000
--- a/cras/src/common/cras_metrics.c
+++ /dev/null
@@ -1,58 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <stdio.h>
-#include <syslog.h>
-#include <unistd.h>
-
-#ifdef HAVE_LIB_METRICS
-#include <metrics/c_metrics_library.h>
-
-void cras_metrics_log_event(const char *event)
-{
-	CMetricsLibrary handle;
-
-	syslog(LOG_DEBUG, "UMA event: %s", event);
-	handle = CMetricsLibraryNew();
-	CMetricsLibrarySendCrosEventToUMA(handle, event);
-	CMetricsLibraryDelete(handle);
-}
-
-void cras_metrics_log_histogram(const char *name, int sample, int min, int max,
-				int nbuckets)
-{
-	CMetricsLibrary handle;
-
-	syslog(LOG_DEBUG, "UMA name: %s", name);
-	handle = CMetricsLibraryNew();
-	CMetricsLibrarySendToUMA(handle, name, sample, min, max, nbuckets);
-	CMetricsLibraryDelete(handle);
-}
-
-void cras_metrics_log_sparse_histogram(const char *name, int sample)
-{
-	CMetricsLibrary handle;
-
-	syslog(LOG_DEBUG, "UMA name: %s", name);
-	handle = CMetricsLibraryNew();
-	CMetricsLibrarySendSparseToUMA(handle, name, sample);
-	CMetricsLibraryDelete(handle);
-}
-
-#else
-void cras_metrics_log_event(const char *event)
-{
-}
-void cras_metrics_log_histogram(const char *name, int sample, int min, int max,
-				int nbuckets)
-{
-}
-void cras_metrics_log_enum_histogram(const char *name, int sample, int max)
-{
-}
-void cras_metrics_log_sparse_histogram(const char *name, int sample)
-{
-}
-#endif
diff --git a/cras/src/common/cras_metrics.h b/cras/src/common/cras_metrics.h
deleted file mode 100644
index 814b3dd..0000000
--- a/cras/src/common/cras_metrics.h
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_METRICS_H_
-#define CRAS_METRICS_H_
-
-/* Logs the specified event. */
-void cras_metrics_log_event(const char *event);
-
-/* Sends histogram data. */
-void cras_metrics_log_histogram(const char *name, int sample, int min, int max,
-				int nbuckets);
-
-/* Sends sparse histogram data. */
-void cras_metrics_log_sparse_histogram(const char *name, int sample);
-
-#endif /* CRAS_METRICS_H_ */
diff --git a/cras/src/common/cras_observer_ops.h b/cras/src/common/cras_observer_ops.h
deleted file mode 100644
index e73845c..0000000
--- a/cras/src/common/cras_observer_ops.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/* Copyright 2016 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_OBSERVER_OPS_H
-#define CRAS_OBSERVER_OPS_H
-
-#include "cras_types.h"
-
-/* Observation of CRAS state.
- * Unless otherwise specified, all notifications only contain the data value
- * reflecting the current state: it is possible that multiple notifications
- * are queued within CRAS before being sent to the client.
- */
-struct cras_observer_ops {
-	/* System output volume changed. */
-	void (*output_volume_changed)(void *context, int32_t volume);
-	/* System output mute changed. */
-	void (*output_mute_changed)(void *context, int muted, int user_muted,
-				    int mute_locked);
-	/* System input/capture gain changed. */
-	void (*capture_gain_changed)(void *context, int32_t gain);
-	/* System input/capture mute changed. */
-	void (*capture_mute_changed)(void *context, int muted, int mute_locked);
-	/* Device or node topology changed. */
-	void (*nodes_changed)(void *context);
-	/* Active node changed. A notification is sent for every change.
-	 * When there is no active node, node_id is 0. */
-	void (*active_node_changed)(void *context,
-				    enum CRAS_STREAM_DIRECTION dir,
-				    cras_node_id_t node_id);
-	/* Output node volume changed. */
-	void (*output_node_volume_changed)(void *context,
-					   cras_node_id_t node_id,
-					   int32_t volume);
-	/* Node left/right swapped state change. */
-	void (*node_left_right_swapped_changed)(void *context,
-						cras_node_id_t node_id,
-						int swapped);
-	/* Input gain changed. */
-	void (*input_node_gain_changed)(void *context, cras_node_id_t node_id,
-					int32_t gain);
-	/* Suspend state changed. */
-	void (*suspend_changed)(void *context, int suspended);
-	/* Number of active streams changed. */
-	void (*num_active_streams_changed)(void *context,
-					   enum CRAS_STREAM_DIRECTION dir,
-					   uint32_t num_active_streams);
-	/* Number of input streams with permission changed. */
-	void (*num_input_streams_with_permission_changed)(
-		void *context,
-		uint32_t num_input_streams[CRAS_NUM_CLIENT_TYPE]);
-	/* Hotword triggered. */
-	void (*hotword_triggered)(void *context, int64_t tv_sec,
-				  int64_t tv_nsec);
-	/* State regarding whether non-empty audio is being played/captured has
-	 * changed. */
-	void (*non_empty_audio_state_changed)(void *context, int non_empty);
-	/* Bluetooth headset battery level changed. */
-	void (*bt_battery_changed)(void *context, const char *address,
-				   uint32_t level);
-};
-
-#endif /* CRAS_OBSERVER_OPS_H */
diff --git a/cras/src/common/cras_sbc_codec.c b/cras/src/common/cras_sbc_codec.c
deleted file mode 100644
index df02b3e..0000000
--- a/cras/src/common/cras_sbc_codec.c
+++ /dev/null
@@ -1,201 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <errno.h>
-#include <sbc/sbc.h>
-#include <stdlib.h>
-
-#include "cras_sbc_codec.h"
-
-/* SBC library encodes one PCM input block to one SBC output block. This
- * structure holds related info about the SBC codec.
- * Members:
- *    sbc - The main structure for SBC codec.
- *    codesize - The size of one PCM input block in bytes.
- *    frame_length - The size of one SBC output block in bytes.
- */
-struct cras_sbc_data {
-	sbc_t sbc;
-	unsigned int codesize;
-	unsigned int frame_length;
-};
-
-int cras_msbc_decode(struct cras_audio_codec *codec, const void *input,
-		     size_t input_len, void *output, size_t output_len,
-		     size_t *count)
-{
-	struct cras_sbc_data *data = (struct cras_sbc_data *)codec->priv_data;
-	size_t written = 0;
-	ssize_t decoded;
-
-	/*
-	 * Proceed decode when there is buffer left in input and room in
-	 * output.
-	 */
-	decoded = sbc_decode(&data->sbc, input, input_len, output, output_len,
-			     &written);
-
-	*count = written;
-	return decoded;
-}
-
-int cras_msbc_encode(struct cras_audio_codec *codec, const void *input,
-		     size_t input_len, void *output, size_t output_len,
-		     size_t *count)
-{
-	struct cras_sbc_data *data = (struct cras_sbc_data *)codec->priv_data;
-	ssize_t written = 0;
-	ssize_t encoded;
-
-	/*
-	 * Proceed encode when input buffer has at least one input block and
-	 * there is still room in output buffer.
-	 */
-	if (input_len < data->codesize)
-		return -EINVAL;
-
-	encoded = sbc_encode(&data->sbc, input, data->codesize, output,
-			     output_len, &written);
-
-	*count = written;
-	return encoded;
-}
-
-int cras_sbc_decode(struct cras_audio_codec *codec, const void *input,
-		    size_t input_len, void *output, size_t output_len,
-		    size_t *count)
-{
-	struct cras_sbc_data *data = (struct cras_sbc_data *)codec->priv_data;
-	size_t written;
-	ssize_t decoded;
-	int processed = 0;
-	int result = 0;
-
-	/* Proceed decode when there is buffer left in input and room in
-	 * output.
-	 */
-	while (input_len > processed && output_len > result) {
-		decoded = sbc_decode(&data->sbc, input + processed,
-				     input_len - processed, output + result,
-				     output_len - result, &written);
-		if (decoded <= 0)
-			break;
-
-		processed += decoded;
-		result += written;
-	}
-	*count = result;
-	return processed;
-}
-
-int cras_sbc_encode(struct cras_audio_codec *codec, const void *input,
-		    size_t input_len, void *output, size_t output_len,
-		    size_t *count)
-{
-	struct cras_sbc_data *data = (struct cras_sbc_data *)codec->priv_data;
-	ssize_t written, encoded;
-	int processed = 0, result = 0;
-
-	/* Proceed encode when input buffer has at least one input block and
-	 * there is still room in output buffer.
-	 */
-	while (input_len - processed >= data->codesize &&
-	       output_len >= result) {
-		encoded = sbc_encode(&data->sbc, input + processed,
-				     data->codesize, output + result,
-				     output_len - result, &written);
-		if (encoded == -ENOSPC)
-			break;
-		else if (encoded < 0)
-			return encoded;
-
-		processed += encoded;
-		result += written;
-	}
-	*count = result;
-	return processed;
-}
-
-int cras_sbc_get_codesize(struct cras_audio_codec *codec)
-{
-	struct cras_sbc_data *data = (struct cras_sbc_data *)codec->priv_data;
-	return data->codesize;
-}
-
-int cras_sbc_get_frame_length(struct cras_audio_codec *codec)
-{
-	struct cras_sbc_data *data = (struct cras_sbc_data *)codec->priv_data;
-	return data->frame_length;
-}
-
-struct cras_audio_codec *cras_msbc_codec_create()
-{
-	struct cras_audio_codec *codec;
-	struct cras_sbc_data *data;
-
-	codec = (struct cras_audio_codec *)calloc(1, sizeof(*codec));
-	if (!codec)
-		return NULL;
-
-	codec->priv_data =
-		(struct cras_sbc_data *)calloc(1, sizeof(struct cras_sbc_data));
-	if (!codec->priv_data) {
-		free(codec);
-		return NULL;
-	}
-
-	data = (struct cras_sbc_data *)codec->priv_data;
-	sbc_init_msbc(&data->sbc, 0L);
-	data->codesize = sbc_get_codesize(&data->sbc);
-	data->frame_length = sbc_get_frame_length(&data->sbc);
-
-	codec->decode = cras_msbc_decode;
-	codec->encode = cras_msbc_encode;
-	return codec;
-}
-
-struct cras_audio_codec *cras_sbc_codec_create(uint8_t freq, uint8_t mode,
-					       uint8_t subbands, uint8_t alloc,
-					       uint8_t blocks, uint8_t bitpool)
-{
-	struct cras_audio_codec *codec;
-	struct cras_sbc_data *data;
-
-	codec = (struct cras_audio_codec *)calloc(1, sizeof(*codec));
-	if (!codec)
-		return NULL;
-
-	codec->priv_data =
-		(struct cras_sbc_data *)calloc(1, sizeof(struct cras_sbc_data));
-	if (!codec->priv_data)
-		goto create_error;
-
-	data = (struct cras_sbc_data *)codec->priv_data;
-	sbc_init(&data->sbc, 0L);
-	data->sbc.endian = SBC_LE;
-	data->sbc.frequency = freq;
-	data->sbc.mode = mode;
-	data->sbc.subbands = subbands;
-	data->sbc.allocation = alloc;
-	data->sbc.blocks = blocks;
-	data->sbc.bitpool = bitpool;
-	data->codesize = sbc_get_codesize(&data->sbc);
-	data->frame_length = sbc_get_frame_length(&data->sbc);
-
-	codec->decode = cras_sbc_decode;
-	codec->encode = cras_sbc_encode;
-	return codec;
-
-create_error:
-	free(codec);
-	return NULL;
-}
-
-void cras_sbc_codec_destroy(struct cras_audio_codec *codec)
-{
-	sbc_finish(&((struct cras_sbc_data *)codec->priv_data)->sbc);
-	free(codec->priv_data);
-	free(codec);
-}
diff --git a/cras/src/common/cras_sbc_codec.h b/cras/src/common/cras_sbc_codec.h
deleted file mode 100644
index 322c45b..0000000
--- a/cras/src/common/cras_sbc_codec.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef COMMON_CRAS_SBC_CODEC_H_
-#define COMMON_CRAS_SBC_CODEC_H_
-
-#include <sbc/sbc.h>
-
-#include "cras_audio_codec.h"
-
-/* Creates an sbc codec.
- * Args:
- *    freq: frequency for sbc encoder settings.
- *    mode: mode for sbc encoder settings.
- *    subbands: subbands for sbc encoder settings.
- *    alloc: allocation method for sbc encoder settings.
- *    blocks: blocks for sbc encoder settings.
- *    bitpool: bitpool for sbc encoder settings.
- */
-struct cras_audio_codec *cras_sbc_codec_create(uint8_t freq, uint8_t mode,
-					       uint8_t subbands, uint8_t alloc,
-					       uint8_t blocks, uint8_t bitpool);
-
-/* Creates an mSBC codec, which is a version of SBC codec used for
- * wideband speech mode of HFP. */
-struct cras_audio_codec *cras_msbc_codec_create();
-
-/* Destroys an sbc codec.
- * Args:
- *    codec: the codec to destroy.
- */
-void cras_sbc_codec_destroy(struct cras_audio_codec *codec);
-
-/* Gets codesize, the input block size of sbc codec in bytes.
- */
-int cras_sbc_get_codesize(struct cras_audio_codec *codec);
-
-/* Gets frame_length, the output block size of sbc codec in bytes.
- */
-int cras_sbc_get_frame_length(struct cras_audio_codec *codec);
-
-#endif /* COMMON_CRAS_SBC_CODEC_H_ */
diff --git a/cras/src/common/cras_selinux_helper.c b/cras/src/common/cras_selinux_helper.c
deleted file mode 100644
index ddacc6a..0000000
--- a/cras/src/common/cras_selinux_helper.c
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2018 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <selinux/restorecon.h>
-
-#include "cras_shm.h"
-
-int cras_selinux_restorecon(const char *pathname)
-{
-	return selinux_restorecon(pathname, 0);
-}
diff --git a/cras/src/common/cras_shm.c b/cras/src/common/cras_shm.c
deleted file mode 100644
index ecb6169..0000000
--- a/cras/src/common/cras_shm.c
+++ /dev/null
@@ -1,309 +0,0 @@
-/* Copyright 2016 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <sys/cdefs.h>
-#include <sys/mman.h>
-#ifdef __BIONIC__
-#include <cutils/ashmem.h>
-#else
-#include <sys/shm.h>
-#endif
-#include <errno.h>
-#include <syslog.h>
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "cras_shm.h"
-
-int cras_shm_info_init(const char *stream_name, uint32_t length,
-		       struct cras_shm_info *info_out)
-{
-	struct cras_shm_info info;
-
-	if (!info_out)
-		return -EINVAL;
-
-	strncpy(info.name, stream_name, sizeof(info.name) - 1);
-	info.name[sizeof(info.name) - 1] = '\0';
-	info.length = length;
-	info.fd = cras_shm_open_rw(info.name, info.length);
-	if (info.fd < 0)
-		return info.fd;
-
-	*info_out = info;
-
-	return 0;
-}
-
-int cras_shm_info_init_with_fd(int fd, size_t length,
-			       struct cras_shm_info *info_out)
-{
-	struct cras_shm_info info;
-
-	if (!info_out)
-		return -EINVAL;
-
-	info.name[0] = '\0';
-	info.length = length;
-	info.fd = dup(fd);
-	if (info.fd < 0)
-		return info.fd;
-
-	*info_out = info;
-
-	return 0;
-}
-
-/* Move the resources from the cras_shm_info 'from' into the cras_shm_info 'to'.
- * The owner of 'to' will be responsible for cleaning up those resources with
- * cras_shm_info_cleanup.
- */
-static int cras_shm_info_move(struct cras_shm_info *from,
-			      struct cras_shm_info *to)
-{
-	if (!from || !to)
-		return -EINVAL;
-
-	*to = *from;
-	from->fd = -1;
-	from->name[0] = '\0';
-	return 0;
-}
-
-void cras_shm_info_cleanup(struct cras_shm_info *info)
-{
-	if (!info)
-		return;
-
-	if (info->name[0] != '\0')
-		cras_shm_close_unlink(info->name, info->fd);
-	else
-		close(info->fd);
-
-	info->fd = -1;
-	info->name[0] = '\0';
-}
-
-int cras_audio_shm_create(struct cras_shm_info *header_info,
-			  struct cras_shm_info *samples_info, int samples_prot,
-			  struct cras_audio_shm **shm_out)
-{
-	struct cras_audio_shm *shm;
-	int ret;
-
-	if (!header_info || !samples_info || !shm_out) {
-		ret = -EINVAL;
-		goto cleanup_info;
-	}
-
-	if (samples_prot != PROT_READ && samples_prot != PROT_WRITE) {
-		ret = -EINVAL;
-		syslog(LOG_ERR,
-		       "cras_shm: samples must be mapped read or write only");
-		goto cleanup_info;
-	}
-
-	shm = calloc(1, sizeof(*shm));
-	if (!shm) {
-		ret = -ENOMEM;
-		goto cleanup_info;
-	}
-
-	/* Move the cras_shm_info params into the new cras_audio_shm object.
-	 * The parameters are cleared, and the owner of cras_audio_shm is now
-	 * responsible for closing the fds and unlinking any associated shm
-	 * files using cras_audio_shm_destroy.
-	 */
-	ret = cras_shm_info_move(header_info, &shm->header_info);
-	if (ret)
-		goto free_shm;
-
-	ret = cras_shm_info_move(samples_info, &shm->samples_info);
-	if (ret)
-		goto free_shm;
-
-	shm->header =
-		mmap(NULL, shm->header_info.length, PROT_READ | PROT_WRITE,
-		     MAP_SHARED, shm->header_info.fd, 0);
-	if (shm->header == (struct cras_audio_shm_header *)-1) {
-		ret = -errno;
-		syslog(LOG_ERR, "cras_shm: mmap failed to map shm for header.");
-		goto free_shm;
-	}
-
-	shm->samples = mmap(NULL, shm->samples_info.length, samples_prot,
-			    MAP_SHARED, shm->samples_info.fd, 0);
-	if (shm->samples == (uint8_t *)-1) {
-		ret = -errno;
-		syslog(LOG_ERR,
-		       "cras_shm: mmap failed to map shm for samples.");
-		goto free_shm;
-	}
-
-	cras_shm_set_volume_scaler(shm, 1.0);
-
-	*shm_out = shm;
-	return 0;
-
-free_shm:
-	cras_audio_shm_destroy(shm);
-cleanup_info:
-	cras_shm_info_cleanup(samples_info);
-	cras_shm_info_cleanup(header_info);
-	return ret;
-}
-
-void cras_audio_shm_destroy(struct cras_audio_shm *shm)
-{
-	if (!shm)
-		return;
-
-	if (shm->samples != NULL && shm->samples != (uint8_t *)-1)
-		munmap(shm->samples, shm->samples_info.length);
-	cras_shm_info_cleanup(&shm->samples_info);
-	if (shm->header != NULL &&
-	    shm->header != (struct cras_audio_shm_header *)-1)
-		munmap(shm->header, shm->header_info.length);
-	cras_shm_info_cleanup(&shm->header_info);
-	free(shm);
-}
-
-/* Set the correct SELinux label for SHM fds. */
-static void cras_shm_restorecon(int fd)
-{
-#ifdef CRAS_SELINUX
-	char fd_proc_path[64];
-
-	if (snprintf(fd_proc_path, sizeof(fd_proc_path), "/proc/self/fd/%d",
-		     fd) < 0) {
-		syslog(LOG_WARNING,
-		       "Couldn't construct proc symlink path of fd: %d", fd);
-		return;
-	}
-
-	/* Get the actual file-path for this fd. */
-	char *path = realpath(fd_proc_path, NULL);
-	if (path == NULL) {
-		syslog(LOG_WARNING, "Couldn't run realpath() for %s: %s",
-		       fd_proc_path, strerror(errno));
-		return;
-	}
-
-	if (cras_selinux_restorecon(path) < 0) {
-		syslog(LOG_WARNING, "Restorecon on %s failed: %s", fd_proc_path,
-		       strerror(errno));
-	}
-
-	free(path);
-#endif
-}
-
-#ifdef __BIONIC__
-
-int cras_shm_open_rw(const char *name, size_t size)
-{
-	int fd;
-
-	/* Eliminate the / in the shm_name. */
-	if (name[0] == '/')
-		name++;
-	fd = ashmem_create_region(name, size);
-	if (fd < 0) {
-		fd = -errno;
-		syslog(LOG_ERR, "failed to ashmem_create_region %s: %s\n", name,
-		       strerror(-fd));
-	}
-	return fd;
-}
-
-int cras_shm_reopen_ro(const char *name, int fd)
-{
-	/* After mmaping the ashmem read/write, change it's protection
-	   bits to disallow further write access. */
-	if (ashmem_set_prot_region(fd, PROT_READ) != 0) {
-		fd = -errno;
-		syslog(LOG_ERR, "failed to ashmem_set_prot_region %s: %s\n",
-		       name, strerror(-fd));
-	}
-	return fd;
-}
-
-void cras_shm_close_unlink(const char *name, int fd)
-{
-	close(fd);
-}
-
-#else
-
-int cras_shm_open_rw(const char *name, size_t size)
-{
-	int fd;
-	int rc;
-
-	fd = shm_open(name, O_CREAT | O_EXCL | O_RDWR, 0600);
-	if (fd < 0) {
-		fd = -errno;
-		syslog(LOG_ERR, "failed to shm_open %s: %s\n", name,
-		       strerror(-fd));
-		return fd;
-	}
-	rc = posix_fallocate(fd, 0, size);
-	if (rc) {
-		rc = -errno;
-		syslog(LOG_ERR, "failed to set size of shm %s: %s\n", name,
-		       strerror(-rc));
-		return rc;
-	}
-
-	cras_shm_restorecon(fd);
-
-	return fd;
-}
-
-int cras_shm_reopen_ro(const char *name, int fd)
-{
-	/* Open a read-only copy to dup and pass to clients. */
-	fd = shm_open(name, O_RDONLY, 0);
-	if (fd < 0) {
-		fd = -errno;
-		syslog(LOG_ERR,
-		       "Failed to re-open shared memory '%s' read-only: %s",
-		       name, strerror(-fd));
-	}
-	return fd;
-}
-
-void cras_shm_close_unlink(const char *name, int fd)
-{
-	shm_unlink(name);
-	close(fd);
-}
-
-#endif
-
-void *cras_shm_setup(const char *name, size_t mmap_size, int *rw_fd_out,
-		     int *ro_fd_out)
-{
-	int rw_shm_fd = cras_shm_open_rw(name, mmap_size);
-	if (rw_shm_fd < 0)
-		return NULL;
-
-	/* mmap shm. */
-	void *exp_state = mmap(NULL, mmap_size, PROT_READ | PROT_WRITE,
-			       MAP_SHARED, rw_shm_fd, 0);
-	if (exp_state == (void *)-1)
-		return NULL;
-
-	/* Open a read-only copy to dup and pass to clients. */
-	int ro_shm_fd = cras_shm_reopen_ro(name, rw_shm_fd);
-	if (ro_shm_fd < 0)
-		return NULL;
-
-	*rw_fd_out = rw_shm_fd;
-	*ro_fd_out = ro_shm_fd;
-
-	return exp_state;
-}
diff --git a/cras/src/common/cras_shm.h b/cras/src/common/cras_shm.h
deleted file mode 100644
index 47786c3..0000000
--- a/cras/src/common/cras_shm.h
+++ /dev/null
@@ -1,659 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_SHM_H_
-#define CRAS_SHM_H_
-
-#include <assert.h>
-#include <stdint.h>
-#include <sys/mman.h>
-#include <sys/param.h>
-
-#include "cras_types.h"
-#include "cras_util.h"
-
-#define CRAS_NUM_SHM_BUFFERS 2U /* double buffer */
-#define CRAS_SHM_BUFFERS_MASK (CRAS_NUM_SHM_BUFFERS - 1)
-
-/* Configuration of the shm area.
- *
- *  used_size - The size in bytes of the sample area being actively used.
- *  frame_bytes - The size of each frame in bytes.
- */
-struct __attribute__((__packed__)) cras_audio_shm_config {
-	uint32_t used_size;
-	uint32_t frame_bytes;
-};
-
-/* Structure containing stream metadata shared between client and server.
- *
- *  config - Size config data.  A copy of the config shared with clients.
- *  read_buf_idx - index of the current buffer to read from (0 or 1 if double
- *    buffered).
- *  write_buf_idx - index of the current buffer to write to (0 or 1 if double
- *    buffered).
- *  read_offset - offset of the next sample to read (one per buffer).
- *  write_offset - offset of the next sample to write (one per buffer).
- *  write_in_progress - non-zero when a write is in progress.
- *  volume_scaler - volume scaling factor (0.0-1.0).
- *  muted - bool, true if stream should be muted.
- *  num_overruns - Starting at 0 this is incremented very time data is over
- *    written because too much accumulated before a read.
- *  ts - For capture, the time stamp of the next sample at read_index.  For
- *    playback, this is the time that the next sample written will be played.
- *    This is only valid in audio callbacks.
- *  buffer_offset - Offset of each buffer from start of samples area.
- *                  Valid range: 0 <= buffer_offset <= shm->samples_info.length
- */
-struct __attribute__((__packed__)) cras_audio_shm_header {
-	struct cras_audio_shm_config config;
-	uint32_t read_buf_idx; /* use buffer A or B */
-	uint32_t write_buf_idx;
-	uint32_t read_offset[CRAS_NUM_SHM_BUFFERS];
-	uint32_t write_offset[CRAS_NUM_SHM_BUFFERS];
-	int32_t write_in_progress[CRAS_NUM_SHM_BUFFERS];
-	float volume_scaler;
-	int32_t mute;
-	int32_t callback_pending;
-	uint32_t num_overruns;
-	struct cras_timespec ts;
-	uint64_t buffer_offset[CRAS_NUM_SHM_BUFFERS];
-};
-
-/* Returns the number of bytes needed to hold a cras_audio_shm_header. */
-static inline uint32_t cras_shm_header_size()
-{
-	return sizeof(struct cras_audio_shm_header);
-}
-
-/* Returns the number of bytes needed to hold the samples area for an audio
- * shm with the given used_size */
-static inline uint32_t cras_shm_calculate_samples_size(uint32_t used_size)
-{
-	return used_size * CRAS_NUM_SHM_BUFFERS;
-}
-
-/* Holds identifiers for a shm segment. All valid cras_shm_info objects will
- * have an fd and a length, and they may have the name of the shm file as well.
- *
- *  fd - File descriptor to access shm (shared between client/server).
- *  name - Name of the shm area. May be empty.
- *  length - Size of the shm region.
- */
-struct cras_shm_info {
-	int fd;
-	char name[NAME_MAX];
-	size_t length;
-};
-
-/* Initializes a cras_shm_info to be used as the backing shared memory for a
- * cras_audio_shm.
- *
- * shm_name - the name of the shm area to create.
- * length - the length of the shm area to create.
- * info_out - pointer where the created cras_shm_info will be stored.
- */
-int cras_shm_info_init(const char *shm_name, uint32_t length,
-		       struct cras_shm_info *info_out);
-
-/* Initializes a cras_shm_info to be used as the backing shared memory for a
- * cras_audio_shm.
- *
- * fd - file descriptor for the shm to be used. fd must be closed after
- *      calling this function.
- * length - the size of the shm referenced by fd.
- * info_out - pointer where the created cras_shm_info will be stored.
- */
-int cras_shm_info_init_with_fd(int fd, size_t length,
-			       struct cras_shm_info *info_out);
-
-/* Cleans up the resources for a cras_shm_info returned from cras_shm_info_init.
- *
- * info - the cras_shm_info to cleanup.
- */
-void cras_shm_info_cleanup(struct cras_shm_info *info);
-
-/* Structure that holds the config for and a pointer to the audio shm header and
- * samples area.
- *
- *  config - Size config data, kept separate so it can be checked.
- *  header_info - fd, name, and length of shm containing header.
- *  header - Shm region containing audio metadata
- *  samples_info - fd, name, and length of shm containing samples.
- *  samples - Shm region containing audio data.
- */
-struct cras_audio_shm {
-	struct cras_audio_shm_config config;
-	struct cras_shm_info header_info;
-	struct cras_audio_shm_header *header;
-	struct cras_shm_info samples_info;
-	uint8_t *samples;
-};
-
-/* Sets up a cras_audio_shm given info about the shared memory to use
- *
- * header_info - the underlying shm area to use for the header. The shm
- *               will be managed by the created cras_audio_shm object.
- *               The header_info parameter will be returned to an uninitialized
- *               state, and the client need not call cras_shm_info_destroy.
- * samples_info - the underlying shm area to use for the samples. The shm
- *               will be managed by the created cras_audio_shm object.
- *               The samples_info parameter will be returned to an
- *               uninitialized state, and the client need not call
- *               cras_shm_info_destroy.
- * samples_prot - the mapping protections to use when mapping samples. Allowed
- *                values are PROT_READ or PROT_WRITE.
- * shm_out - pointer where the created cras_audio_shm will be stored.
- *
- * Returns 0 on success or a negative error code on failure.
- */
-int cras_audio_shm_create(struct cras_shm_info *header_info,
-			  struct cras_shm_info *samples_info, int samples_prot,
-			  struct cras_audio_shm **shm_out);
-
-/* Destroys a cras_audio_shm returned from cras_audio_shm_create.
- *
- * shm - the cras_audio_shm to destroy.
- */
-void cras_audio_shm_destroy(struct cras_audio_shm *shm);
-
-/* Limit a buffer offset to within the samples area size. */
-static inline unsigned
-cras_shm_get_checked_buffer_offset(const struct cras_audio_shm *shm,
-				   uint32_t buf_idx)
-{
-	unsigned buffer_offset = shm->header->buffer_offset[buf_idx];
-
-	/* Cap buffer_offset at the length of the samples area */
-	return MIN(buffer_offset, shm->samples_info.length);
-}
-
-/* Get a pointer to the buffer at idx. */
-static inline uint8_t *cras_shm_buff_for_idx(const struct cras_audio_shm *shm,
-					     size_t idx)
-{
-	assert_on_compile_is_power_of_2(CRAS_NUM_SHM_BUFFERS);
-	idx = idx & CRAS_SHM_BUFFERS_MASK;
-
-	return shm->samples + cras_shm_get_checked_buffer_offset(shm, idx);
-}
-
-/* Limit a read offset to within the buffer size. */
-static inline unsigned
-cras_shm_get_checked_read_offset(const struct cras_audio_shm *shm,
-				 uint32_t buf_idx)
-{
-	unsigned buffer_offset =
-		cras_shm_get_checked_buffer_offset(shm, buf_idx);
-	unsigned read_offset = shm->header->read_offset[buf_idx];
-
-	/* The read_offset is allowed to be the total size, indicating that the
-	 * buffer is full. If read pointer is invalid assume it is at the
-	 * beginning. */
-	if (read_offset > shm->config.used_size)
-		return 0;
-	if (buffer_offset + read_offset > shm->samples_info.length)
-		return 0;
-	return read_offset;
-}
-
-/* Limit a write offset to within the buffer size. */
-static inline unsigned
-cras_shm_get_checked_write_offset(const struct cras_audio_shm *shm,
-				  uint32_t buf_idx)
-{
-	unsigned write_offset = shm->header->write_offset[buf_idx];
-	unsigned buffer_offset =
-		cras_shm_get_checked_buffer_offset(shm, buf_idx);
-
-	/* The write_offset is allowed to be the total size, indicating that the
-	 * buffer is full. If write pointer is past used size, assume it is at
-	 * used size. */
-	write_offset = MIN(write_offset, shm->config.used_size);
-
-	/* If the buffer offset plus the write offset overruns the samples area,
-	 * return the longest valid write_offset */
-	if (buffer_offset + write_offset > shm->samples_info.length)
-		return shm->samples_info.length - buffer_offset;
-	return write_offset;
-}
-
-/* Get the number of frames readable in current read buffer */
-static inline unsigned
-cras_shm_get_curr_read_frames(const struct cras_audio_shm *shm)
-{
-	unsigned buf_idx = shm->header->read_buf_idx & CRAS_SHM_BUFFERS_MASK;
-	unsigned read_offset, write_offset;
-
-	read_offset = cras_shm_get_checked_read_offset(shm, buf_idx);
-	write_offset = cras_shm_get_checked_write_offset(shm, buf_idx);
-
-	if (read_offset > write_offset)
-		return 0;
-	else
-		return (write_offset - read_offset) / shm->config.frame_bytes;
-}
-
-/* Get the base of the current read buffer. */
-static inline uint8_t *
-cras_shm_get_read_buffer_base(const struct cras_audio_shm *shm)
-{
-	unsigned i = shm->header->read_buf_idx & CRAS_SHM_BUFFERS_MASK;
-	return cras_shm_buff_for_idx(shm, i);
-}
-
-/* Get the base of the current write buffer. */
-static inline uint8_t *
-cras_shm_get_write_buffer_base(const struct cras_audio_shm *shm)
-{
-	unsigned i = shm->header->write_buf_idx & CRAS_SHM_BUFFERS_MASK;
-
-	return cras_shm_buff_for_idx(shm, i);
-}
-
-/* Get a pointer to the next buffer to write */
-static inline uint8_t *
-cras_shm_get_writeable_frames(const struct cras_audio_shm *shm,
-			      unsigned limit_frames, unsigned *frames)
-{
-	unsigned buf_idx = shm->header->write_buf_idx & CRAS_SHM_BUFFERS_MASK;
-	unsigned write_offset;
-	const unsigned frame_bytes = shm->config.frame_bytes;
-	unsigned written;
-
-	write_offset = cras_shm_get_checked_write_offset(shm, buf_idx);
-	written = write_offset / frame_bytes;
-	if (frames) {
-		if (limit_frames >= written)
-			*frames = limit_frames - written;
-		else
-			*frames = 0;
-	}
-
-	return cras_shm_buff_for_idx(shm, buf_idx) + write_offset;
-}
-
-/* Get a pointer to the current read buffer plus an offset.  The offset might be
- * in the next buffer. 'frames' is filled with the number of frames that can be
- * copied from the returned buffer.
- */
-static inline uint8_t *
-cras_shm_get_readable_frames(const struct cras_audio_shm *shm, size_t offset,
-			     size_t *frames)
-{
-	unsigned buf_idx = shm->header->read_buf_idx & CRAS_SHM_BUFFERS_MASK;
-	unsigned read_offset, write_offset, final_offset;
-
-	assert(frames != NULL);
-
-	read_offset = cras_shm_get_checked_read_offset(shm, buf_idx);
-	write_offset = cras_shm_get_checked_write_offset(shm, buf_idx);
-	final_offset = read_offset + offset * shm->config.frame_bytes;
-	if (final_offset >= write_offset) {
-		final_offset -= write_offset;
-		assert_on_compile_is_power_of_2(CRAS_NUM_SHM_BUFFERS);
-		buf_idx = (buf_idx + 1) & CRAS_SHM_BUFFERS_MASK;
-		write_offset = cras_shm_get_checked_write_offset(shm, buf_idx);
-	}
-	if (final_offset >= write_offset) {
-		/* Past end of samples. */
-		*frames = 0;
-		return NULL;
-	}
-	*frames = (write_offset - final_offset) / shm->config.frame_bytes;
-	return cras_shm_buff_for_idx(shm, buf_idx) + final_offset;
-}
-
-/* How many bytes are queued? */
-static inline size_t cras_shm_get_bytes_queued(const struct cras_audio_shm *shm)
-{
-	size_t total, i;
-	const unsigned used_size = shm->config.used_size;
-
-	total = 0;
-	for (i = 0; i < CRAS_NUM_SHM_BUFFERS; i++) {
-		unsigned read_offset, write_offset;
-
-		read_offset = MIN(shm->header->read_offset[i], used_size);
-		write_offset = MIN(shm->header->write_offset[i], used_size);
-
-		if (write_offset > read_offset)
-			total += write_offset - read_offset;
-	}
-	return total;
-}
-
-/* How many frames are queued? */
-static inline int cras_shm_get_frames(const struct cras_audio_shm *shm)
-{
-	size_t bytes;
-
-	bytes = cras_shm_get_bytes_queued(shm);
-	if (bytes % shm->config.frame_bytes != 0)
-		return -EIO;
-	return bytes / shm->config.frame_bytes;
-}
-
-/* How many frames in the current buffer? */
-static inline size_t
-cras_shm_get_frames_in_curr_buffer(const struct cras_audio_shm *shm)
-{
-	size_t buf_idx = shm->header->read_buf_idx & CRAS_SHM_BUFFERS_MASK;
-	unsigned read_offset, write_offset;
-	const unsigned used_size = shm->config.used_size;
-
-	read_offset = MIN(shm->header->read_offset[buf_idx], used_size);
-	write_offset = MIN(shm->header->write_offset[buf_idx], used_size);
-
-	if (write_offset <= read_offset)
-		return 0;
-
-	return (write_offset - read_offset) / shm->config.frame_bytes;
-}
-
-/* Return 1 if there is an empty buffer in the list. */
-static inline int cras_shm_is_buffer_available(const struct cras_audio_shm *shm)
-{
-	size_t buf_idx = shm->header->write_buf_idx & CRAS_SHM_BUFFERS_MASK;
-
-	return (shm->header->write_offset[buf_idx] == 0);
-}
-
-/* How many are available to be written? */
-static inline size_t
-cras_shm_get_num_writeable(const struct cras_audio_shm *shm)
-{
-	/* Not allowed to write to a buffer twice. */
-	if (!cras_shm_is_buffer_available(shm))
-		return 0;
-
-	return shm->config.used_size / shm->config.frame_bytes;
-}
-
-/* Flags an overrun if writing would cause one and reset the write offset.
- * Return 1 if overrun happens, otherwise return 0. */
-static inline int cras_shm_check_write_overrun(struct cras_audio_shm *shm)
-{
-	int ret = 0;
-	size_t write_buf_idx =
-		shm->header->write_buf_idx & CRAS_SHM_BUFFERS_MASK;
-
-	if (!shm->header->write_in_progress[write_buf_idx]) {
-		unsigned int used_size = shm->config.used_size;
-
-		if (shm->header->write_offset[write_buf_idx]) {
-			shm->header->num_overruns++; /* Will over-write unread */
-			ret = 1;
-		}
-
-		memset(cras_shm_buff_for_idx(shm, write_buf_idx), 0, used_size);
-
-		shm->header->write_in_progress[write_buf_idx] = 1;
-		shm->header->write_offset[write_buf_idx] = 0;
-	}
-	return ret;
-}
-
-/* Increment the write pointer for the current buffer. */
-static inline void cras_shm_buffer_written(struct cras_audio_shm *shm,
-					   size_t frames)
-{
-	size_t buf_idx = shm->header->write_buf_idx & CRAS_SHM_BUFFERS_MASK;
-
-	if (frames == 0)
-		return;
-
-	shm->header->write_offset[buf_idx] += frames * shm->config.frame_bytes;
-	shm->header->read_offset[buf_idx] = 0;
-}
-
-/* Returns the number of frames that have been written to the current buffer. */
-static inline unsigned int
-cras_shm_frames_written(const struct cras_audio_shm *shm)
-{
-	size_t buf_idx = shm->header->write_buf_idx & CRAS_SHM_BUFFERS_MASK;
-
-	return shm->header->write_offset[buf_idx] / shm->config.frame_bytes;
-}
-
-/* Signals the writing to this buffer is complete and moves to the next one. */
-static inline void cras_shm_buffer_write_complete(struct cras_audio_shm *shm)
-{
-	size_t buf_idx = shm->header->write_buf_idx & CRAS_SHM_BUFFERS_MASK;
-
-	shm->header->write_in_progress[buf_idx] = 0;
-
-	assert_on_compile_is_power_of_2(CRAS_NUM_SHM_BUFFERS);
-	buf_idx = (buf_idx + 1) & CRAS_SHM_BUFFERS_MASK;
-	shm->header->write_buf_idx = buf_idx;
-}
-
-/* Set the write pointer for the current buffer and complete the write. */
-static inline void cras_shm_buffer_written_start(struct cras_audio_shm *shm,
-						 size_t frames)
-{
-	size_t buf_idx = shm->header->write_buf_idx & CRAS_SHM_BUFFERS_MASK;
-
-	shm->header->write_offset[buf_idx] = frames * shm->config.frame_bytes;
-	shm->header->read_offset[buf_idx] = 0;
-	cras_shm_buffer_write_complete(shm);
-}
-
-/* Increment the read pointer.  If it goes past the write pointer for this
- * buffer, move to the next buffer. */
-static inline void cras_shm_buffer_read(struct cras_audio_shm *shm,
-					size_t frames)
-{
-	size_t buf_idx = shm->header->read_buf_idx & CRAS_SHM_BUFFERS_MASK;
-	size_t remainder;
-	struct cras_audio_shm_header *header = shm->header;
-	struct cras_audio_shm_config *config = &shm->config;
-
-	if (frames == 0)
-		return;
-
-	header->read_offset[buf_idx] += frames * config->frame_bytes;
-	if (header->read_offset[buf_idx] >= header->write_offset[buf_idx]) {
-		remainder = header->read_offset[buf_idx] -
-			    header->write_offset[buf_idx];
-		header->read_offset[buf_idx] = 0;
-		header->write_offset[buf_idx] = 0;
-		assert_on_compile_is_power_of_2(CRAS_NUM_SHM_BUFFERS);
-		buf_idx = (buf_idx + 1) & CRAS_SHM_BUFFERS_MASK;
-		if (remainder < header->write_offset[buf_idx]) {
-			header->read_offset[buf_idx] = remainder;
-		} else if (remainder) {
-			/* Read all of this buffer too. */
-			header->write_offset[buf_idx] = 0;
-			buf_idx = (buf_idx + 1) & CRAS_SHM_BUFFERS_MASK;
-		}
-		header->read_buf_idx = buf_idx;
-	}
-}
-
-/* Read from the current buffer. This is similar to cras_shm_buffer_read(), but
- * it doesn't check for the case we may read from two buffers. */
-static inline void cras_shm_buffer_read_current(struct cras_audio_shm *shm,
-						size_t frames)
-{
-	size_t buf_idx = shm->header->read_buf_idx & CRAS_SHM_BUFFERS_MASK;
-	struct cras_audio_shm_header *header = shm->header;
-	struct cras_audio_shm_config *config = &shm->config;
-
-	header->read_offset[buf_idx] += frames * config->frame_bytes;
-	if (header->read_offset[buf_idx] >= header->write_offset[buf_idx]) {
-		header->read_offset[buf_idx] = 0;
-		header->write_offset[buf_idx] = 0;
-		buf_idx = (buf_idx + 1) & CRAS_SHM_BUFFERS_MASK;
-		header->read_buf_idx = buf_idx;
-	}
-}
-
-/* Sets the volume for the stream.  The volume level is a scaling factor that
- * will be applied to the stream before mixing. */
-static inline void cras_shm_set_volume_scaler(struct cras_audio_shm *shm,
-					      float volume_scaler)
-{
-	volume_scaler = MAX(volume_scaler, 0.0);
-	shm->header->volume_scaler = MIN(volume_scaler, 1.0);
-}
-
-/* Returns the volume of the stream(0.0-1.0). */
-static inline float cras_shm_get_volume_scaler(const struct cras_audio_shm *shm)
-{
-	return shm->header->volume_scaler;
-}
-
-/* Indicates that the stream should be muted/unmuted */
-static inline void cras_shm_set_mute(struct cras_audio_shm *shm, size_t mute)
-{
-	shm->header->mute = !!mute;
-}
-
-/* Returns the mute state of the stream.  0 if not muted, non-zero if muted. */
-static inline size_t cras_shm_get_mute(const struct cras_audio_shm *shm)
-{
-	return shm->header->mute;
-}
-
-/* Sets the size of a frame in bytes. */
-static inline void cras_shm_set_frame_bytes(struct cras_audio_shm *shm,
-					    unsigned frame_bytes)
-{
-	shm->config.frame_bytes = frame_bytes;
-	if (shm->header)
-		shm->header->config.frame_bytes = frame_bytes;
-}
-
-/* Returns the size of a frame in bytes. */
-static inline unsigned cras_shm_frame_bytes(const struct cras_audio_shm *shm)
-{
-	return shm->config.frame_bytes;
-}
-
-/* Sets if a callback is pending with the client. */
-static inline void cras_shm_set_callback_pending(struct cras_audio_shm *shm,
-						 int pending)
-{
-	shm->header->callback_pending = !!pending;
-}
-
-/* Returns non-zero if a callback is pending for this shm region. */
-static inline int cras_shm_callback_pending(const struct cras_audio_shm *shm)
-{
-	return shm->header->callback_pending;
-}
-
-/* Sets the starting offset of a buffer */
-static inline void cras_shm_set_buffer_offset(struct cras_audio_shm *shm,
-					      uint32_t buf_idx, uint32_t offset)
-{
-	shm->header->buffer_offset[buf_idx] = offset;
-}
-
-/* Sets the used_size of the shm region.  This is the maximum number of bytes
- * that is exchanged each time a buffer is passed from client to server.
- *
- * Also sets the buffer_offsets to default values based on the used size.
- */
-static inline void cras_shm_set_used_size(struct cras_audio_shm *shm,
-					  unsigned used_size)
-{
-	uint32_t i;
-
-	shm->config.used_size = used_size;
-	if (shm->header) {
-		shm->header->config.used_size = used_size;
-
-		for (i = 0; i < CRAS_NUM_SHM_BUFFERS; i++)
-			cras_shm_set_buffer_offset(shm, i, i * used_size);
-	}
-}
-
-/* Returns the used size of the shm region in bytes. */
-static inline unsigned cras_shm_used_size(const struct cras_audio_shm *shm)
-{
-	return shm->config.used_size;
-}
-
-/* Returns the used size of the shm region in frames. */
-static inline unsigned cras_shm_used_frames(const struct cras_audio_shm *shm)
-{
-	return shm->config.used_size / shm->config.frame_bytes;
-}
-
-/* Returns the size of the samples shm region. */
-static inline uint64_t cras_shm_samples_size(const struct cras_audio_shm *shm)
-{
-	return shm->samples_info.length;
-}
-
-/* Gets the counter of over-runs. */
-static inline unsigned cras_shm_num_overruns(const struct cras_audio_shm *shm)
-{
-	return shm->header->num_overruns;
-}
-
-/* Copy the config from the shm region to the local config.  Used by clients
- * when initially setting up the region.
- */
-static inline void cras_shm_copy_shared_config(struct cras_audio_shm *shm)
-{
-	memcpy(&shm->config, &shm->header->config, sizeof(shm->config));
-}
-
-/* Open a read/write shared memory area with the given name.
- * Args:
- *    name - Name of the shared-memory area.
- *    size - Size of the shared-memory area.
- * Returns:
- *    >= 0 file descriptor value, or negative errno value on error.
- */
-int cras_shm_open_rw(const char *name, size_t size);
-
-/* Reopen an existing shared memory area read-only.
- * Args:
- *    name - Name of the shared-memory area.
- *    fd - Existing file descriptor.
- * Returns:
- *    >= 0 new file descriptor value, or negative errno value on error.
- */
-int cras_shm_reopen_ro(const char *name, int fd);
-
-/* Close and delete a shared memory area.
- * Args:
- *    name - Name of the shared-memory area.
- *    fd - Existing file descriptor.
- * Returns:
- *    >= 0 new file descriptor value, or negative errno value on error.
- */
-void cras_shm_close_unlink(const char *name, int fd);
-
-/*
- * Configure shared memory for the system state.
- * Args:
- *    name - Name of the shared-memory area.
- *    mmap_size - Amount of shared memor to map.
- *    rw_fd_out - Filled with the RW fd for the shm region.
- *    ro_fd_out - Filled with the RO fd for the shm region.
- * Returns a pointer to the new shared memory region. Or NULL on error.
- */
-void *cras_shm_setup(const char *name, size_t mmap_size, int *rw_fd_out,
-		     int *ro_fd_out);
-
-#ifdef CRAS_SELINUX
-/*
- * Wrapper around selinux_restorecon(). This is helpful in unit tests because
- * we can mock out the selinux_restorecon() behaviour there. That is required
- * because selinux_restorecon() would fail in the unit tests, since there
- * is no file_contexts file.
- * Args:
- *    pathname - Name of the file on which to run restorecon
- * Returns 0 on success, otherwise -1 and errno is set appropriately.
- */
-int cras_selinux_restorecon(const char *pathname);
-#endif
-
-#endif /* CRAS_SHM_H_ */
diff --git a/cras/src/common/cras_types.h b/cras/src/common/cras_types.h
deleted file mode 100644
index 544ba02..0000000
--- a/cras/src/common/cras_types.h
+++ /dev/null
@@ -1,723 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-/*
- * Types commonly used in the client and server are defined here.
- */
-#ifndef CRAS_TYPES_H_
-#define CRAS_TYPES_H_
-
-#include <stdbool.h>
-#include <stdint.h>
-#include <stdlib.h>
-
-#include "cras_audio_format.h"
-#include "cras_iodev_info.h"
-#include "packet_status_logger.h"
-
-/* Architecture independent timespec */
-struct __attribute__((__packed__)) cras_timespec {
-	int64_t tv_sec;
-	int64_t tv_nsec;
-};
-
-/* Some special device index values. */
-enum CRAS_SPECIAL_DEVICE {
-	NO_DEVICE,
-	SILENT_RECORD_DEVICE,
-	SILENT_PLAYBACK_DEVICE,
-	SILENT_HOTWORD_DEVICE,
-	MAX_SPECIAL_DEVICE_IDX
-};
-
-/*
- * Types of test iodevs supported.
- */
-enum TEST_IODEV_TYPE {
-	TEST_IODEV_HOTWORD,
-};
-
-/* Commands for test iodevs. */
-enum CRAS_TEST_IODEV_CMD {
-	TEST_IODEV_CMD_HOTWORD_TRIGGER,
-};
-
-/* CRAS client connection types. */
-enum CRAS_CONNECTION_TYPE {
-	CRAS_CONTROL, // For legacy client.
-	CRAS_PLAYBACK, // For playback client.
-	CRAS_CAPTURE, // For capture client.
-	CRAS_VMS_LEGACY, // For legacy client in vms.
-	CRAS_VMS_UNIFIED, // For unified client in vms.
-	CRAS_PLUGIN_PLAYBACK, // For playback client in vms/plugin.
-	CRAS_PLUGIN_UNIFIED, // For unified client in vms/plugin.
-	CRAS_NUM_CONN_TYPE,
-};
-
-static inline bool
-cras_validate_connection_type(enum CRAS_CONNECTION_TYPE conn_type)
-{
-	return 0 <= conn_type && conn_type < CRAS_NUM_CONN_TYPE;
-}
-
-/* Directions of audio streams.
- * Input, Output, or loopback.
- *
- * Note that we use enum CRAS_STREAM_DIRECTION to access the elements in
- * num_active_streams in cras_server_state. For example,
- * num_active_streams[CRAS_STREAM_OUTPUT] is the number of active
- * streams with direction CRAS_STREAM_OUTPUT.
- */
-enum CRAS_STREAM_DIRECTION {
-	CRAS_STREAM_OUTPUT,
-	CRAS_STREAM_INPUT,
-	CRAS_STREAM_UNDEFINED,
-	CRAS_STREAM_POST_MIX_PRE_DSP,
-	CRAS_NUM_DIRECTIONS
-};
-
-/* Bitmask for supporting all CRAS_STREAM_DIRECTION. */
-#define CRAS_STREAM_ALL_DIRECTION ((1 << CRAS_NUM_DIRECTIONS) - 1)
-
-/* Converts CRAS_STREAM_DIRECTION to bitmask.
- * Args:
- *   dir - An enum CRAS_STREAM_DIRECTION.
- *
- * Returns:
- *   bitmask for the given direction on success, negative on failure.
- */
-static inline int
-cras_stream_direction_mask(const enum CRAS_STREAM_DIRECTION dir)
-{
-	if (0 <= dir && dir < CRAS_NUM_DIRECTIONS)
-		return (1 << dir);
-	return -EINVAL;
-}
-
-/*
- * Flags for stream types.
- *  BULK_AUDIO_OK - This stream is OK with receiving up to a full shm of samples
- *      in a single callback.
- *  USE_DEV_TIMING - Don't wake up based on stream timing.  Only wake when the
- *      device is ready. Input streams only.
- *  HOTWORD_STREAM - This stream is used only to listen for hotwords such as "OK
- *      Google".  Hardware will wake the device when this phrase is heard.
- *  TRIGGER_ONLY - This stream only wants to receive when the data is available
- *      and does not want to receive data. Used with HOTWORD_STREAM.
- *  SERVER_ONLY - This stream doesn't associate to a client. It's used mainly
- *      for audio data to flow from hardware through iodev's dsp pipeline.
- */
-enum CRAS_INPUT_STREAM_FLAG {
-	BULK_AUDIO_OK = 0x01,
-	USE_DEV_TIMING = 0x02,
-	HOTWORD_STREAM = BULK_AUDIO_OK | USE_DEV_TIMING,
-	TRIGGER_ONLY = 0x04,
-	SERVER_ONLY = 0x08,
-};
-
-/*
- * Types of Loopback stream.
- */
-enum CRAS_LOOPBACK_TYPE {
-	LOOPBACK_POST_MIX_PRE_DSP,
-	LOOPBACK_POST_DSP,
-	LOOPBACK_NUM_TYPES,
-};
-
-static inline int cras_stream_uses_output_hw(enum CRAS_STREAM_DIRECTION dir)
-{
-	return dir == CRAS_STREAM_OUTPUT;
-}
-
-static inline int cras_stream_uses_input_hw(enum CRAS_STREAM_DIRECTION dir)
-{
-	return dir == CRAS_STREAM_INPUT;
-}
-
-static inline int cras_stream_has_input(enum CRAS_STREAM_DIRECTION dir)
-{
-	return dir != CRAS_STREAM_OUTPUT;
-}
-
-static inline int cras_stream_is_loopback(enum CRAS_STREAM_DIRECTION dir)
-{
-	return dir == CRAS_STREAM_POST_MIX_PRE_DSP;
-}
-
-/* Types of audio streams. */
-enum CRAS_STREAM_TYPE {
-	CRAS_STREAM_TYPE_DEFAULT,
-	CRAS_STREAM_TYPE_MULTIMEDIA,
-	CRAS_STREAM_TYPE_VOICE_COMMUNICATION,
-	CRAS_STREAM_TYPE_SPEECH_RECOGNITION,
-	CRAS_STREAM_TYPE_PRO_AUDIO,
-	CRAS_STREAM_TYPE_ACCESSIBILITY,
-	CRAS_STREAM_NUM_TYPES,
-};
-
-/* Types of audio clients. */
-enum CRAS_CLIENT_TYPE {
-	CRAS_CLIENT_TYPE_UNKNOWN, /* Unknown client */
-	CRAS_CLIENT_TYPE_LEGACY, /* A client with old craslib (CRAS_PROTO_VER = 3) */
-	CRAS_CLIENT_TYPE_TEST, /* cras_test_client */
-	CRAS_CLIENT_TYPE_PCM, /* A client using CRAS via pcm, like aplay */
-	CRAS_CLIENT_TYPE_CHROME, /* Chrome, UI */
-	CRAS_CLIENT_TYPE_ARC, /* ARC++ */
-	CRAS_CLIENT_TYPE_CROSVM, /* CROSVM */
-	CRAS_CLIENT_TYPE_SERVER_STREAM, /* Server stream */
-	CRAS_CLIENT_TYPE_LACROS, /* LaCrOS */
-	CRAS_CLIENT_TYPE_PLUGIN, /* PluginVM */
-	CRAS_CLIENT_TYPE_ARCVM, /* ARCVM */
-	CRAS_NUM_CLIENT_TYPE, /* numbers of CRAS_CLIENT_TYPE */
-};
-
-static inline bool cras_validate_client_type(enum CRAS_CLIENT_TYPE client_type)
-{
-	return 0 <= client_type && client_type < CRAS_NUM_CLIENT_TYPE;
-}
-
-#define ENUM_STR(x)                                                            \
-	case x:                                                                \
-		return #x;
-
-static inline const char *
-cras_stream_type_str(enum CRAS_STREAM_TYPE stream_type)
-{
-	// clang-format off
-	switch (stream_type) {
-	ENUM_STR(CRAS_STREAM_TYPE_DEFAULT)
-	ENUM_STR(CRAS_STREAM_TYPE_MULTIMEDIA)
-	ENUM_STR(CRAS_STREAM_TYPE_VOICE_COMMUNICATION)
-	ENUM_STR(CRAS_STREAM_TYPE_SPEECH_RECOGNITION)
-	ENUM_STR(CRAS_STREAM_TYPE_PRO_AUDIO)
-	ENUM_STR(CRAS_STREAM_TYPE_ACCESSIBILITY)
-	default:
-		return "INVALID_STREAM_TYPE";
-	}
-	// clang-format on
-}
-
-static inline const char *
-cras_client_type_str(enum CRAS_CLIENT_TYPE client_type)
-{
-	// clang-format off
-	switch (client_type) {
-	ENUM_STR(CRAS_CLIENT_TYPE_UNKNOWN)
-	ENUM_STR(CRAS_CLIENT_TYPE_LEGACY)
-	ENUM_STR(CRAS_CLIENT_TYPE_TEST)
-	ENUM_STR(CRAS_CLIENT_TYPE_PCM)
-	ENUM_STR(CRAS_CLIENT_TYPE_CHROME)
-	ENUM_STR(CRAS_CLIENT_TYPE_ARC)
-	ENUM_STR(CRAS_CLIENT_TYPE_CROSVM)
-	ENUM_STR(CRAS_CLIENT_TYPE_SERVER_STREAM)
-	ENUM_STR(CRAS_CLIENT_TYPE_LACROS)
-	ENUM_STR(CRAS_CLIENT_TYPE_PLUGIN)
-	ENUM_STR(CRAS_CLIENT_TYPE_ARCVM)
-	default:
-		return "INVALID_CLIENT_TYPE";
-	}
-	// clang-format on
-}
-
-/* Effects that can be enabled for a CRAS stream. */
-enum CRAS_STREAM_EFFECT {
-	APM_ECHO_CANCELLATION = (1 << 0),
-	APM_NOISE_SUPRESSION = (1 << 1),
-	APM_GAIN_CONTROL = (1 << 2),
-	APM_VOICE_DETECTION = (1 << 3),
-};
-
-/* Information about a client attached to the server. */
-struct __attribute__((__packed__)) cras_attached_client_info {
-	uint32_t id;
-	int32_t pid;
-	uint32_t uid;
-	uint32_t gid;
-};
-
-/* Each ionode has a unique id. The top 32 bits are the device index, lower 32
- * are the node index. */
-typedef uint64_t cras_node_id_t;
-
-static inline cras_node_id_t cras_make_node_id(uint32_t dev_index,
-					       uint32_t node_index)
-{
-	cras_node_id_t id = dev_index;
-	return (id << 32) | node_index;
-}
-
-static inline uint32_t dev_index_of(cras_node_id_t id)
-{
-	return (uint32_t)(id >> 32);
-}
-
-static inline uint32_t node_index_of(cras_node_id_t id)
-{
-	return (uint32_t)id;
-}
-
-#define CRAS_MAX_IODEVS 20
-#define CRAS_MAX_IONODES 20
-#define CRAS_MAX_ATTACHED_CLIENTS 20
-#define CRAS_MAX_AUDIO_THREAD_SNAPSHOTS 10
-#define CRAS_MAX_HOTWORD_MODEL_NAME_SIZE 12
-#define MAX_DEBUG_DEVS 4
-#define MAX_DEBUG_STREAMS 8
-#define AUDIO_THREAD_EVENT_LOG_SIZE (1024 * 6)
-#define CRAS_BT_EVENT_LOG_SIZE 1024
-#define MAIN_THREAD_EVENT_LOG_SIZE 1024
-
-/* There are 8 bits of space for events. */
-enum AUDIO_THREAD_LOG_EVENTS {
-	AUDIO_THREAD_WAKE,
-	AUDIO_THREAD_SLEEP,
-	AUDIO_THREAD_READ_AUDIO,
-	AUDIO_THREAD_READ_AUDIO_TSTAMP,
-	AUDIO_THREAD_READ_AUDIO_DONE,
-	AUDIO_THREAD_READ_OVERRUN,
-	AUDIO_THREAD_FILL_AUDIO,
-	AUDIO_THREAD_FILL_AUDIO_TSTAMP,
-	AUDIO_THREAD_FILL_AUDIO_DONE,
-	AUDIO_THREAD_WRITE_STREAMS_WAIT,
-	AUDIO_THREAD_WRITE_STREAMS_WAIT_TO,
-	AUDIO_THREAD_WRITE_STREAMS_MIX,
-	AUDIO_THREAD_WRITE_STREAMS_MIXED,
-	AUDIO_THREAD_WRITE_STREAMS_STREAM,
-	AUDIO_THREAD_FETCH_STREAM,
-	AUDIO_THREAD_STREAM_ADDED,
-	AUDIO_THREAD_STREAM_REMOVED,
-	AUDIO_THREAD_A2DP_FLUSH,
-	AUDIO_THREAD_A2DP_THROTTLE_TIME,
-	AUDIO_THREAD_A2DP_WRITE,
-	AUDIO_THREAD_DEV_STREAM_MIX,
-	AUDIO_THREAD_CAPTURE_POST,
-	AUDIO_THREAD_CAPTURE_WRITE,
-	AUDIO_THREAD_CONV_COPY,
-	AUDIO_THREAD_STREAM_FETCH_PENDING,
-	AUDIO_THREAD_STREAM_RESCHEDULE,
-	AUDIO_THREAD_STREAM_SLEEP_TIME,
-	AUDIO_THREAD_STREAM_SLEEP_ADJUST,
-	AUDIO_THREAD_STREAM_SKIP_CB,
-	AUDIO_THREAD_DEV_SLEEP_TIME,
-	AUDIO_THREAD_SET_DEV_WAKE,
-	AUDIO_THREAD_DEV_ADDED,
-	AUDIO_THREAD_DEV_REMOVED,
-	AUDIO_THREAD_IODEV_CB,
-	AUDIO_THREAD_PB_MSG,
-	AUDIO_THREAD_ODEV_NO_STREAMS,
-	AUDIO_THREAD_ODEV_START,
-	AUDIO_THREAD_ODEV_LEAVE_NO_STREAMS,
-	AUDIO_THREAD_ODEV_DEFAULT_NO_STREAMS,
-	AUDIO_THREAD_FILL_ODEV_ZEROS,
-	AUDIO_THREAD_UNDERRUN,
-	AUDIO_THREAD_SEVERE_UNDERRUN,
-	AUDIO_THREAD_CAPTURE_DROP_TIME,
-	AUDIO_THREAD_DEV_DROP_FRAMES,
-	AUDIO_THREAD_LOOPBACK_PUT,
-	AUDIO_THREAD_LOOPBACK_GET,
-	AUDIO_THREAD_LOOPBACK_SAMPLE_HOOK,
-	AUDIO_THREAD_DEV_OVERRUN,
-};
-
-/* Important events in main thread.
- * MAIN_THREAD_DEV_CLOSE - When an iodev closes at stream removal.
- * MAIN_THREAD_DEV_DISABLE - When an iodev is removed from active dev list.
- * MAIN_THREAD_DEV_INIT - When an iodev opens when stream attachs.
- * MAIN_THREAD_DEV_REOPEN - When an iodev reopens for format change.
- * MAIN_THREAD_ADD_ACTIVE_NODE - When an iodev is set as an additional
- *    active device.
- * MAIN_THREAD_SELECT_NODE - When UI selects an iodev as active.
- * MAIN_THREAD_NODE_PLUGGED - When a jack of iodev is plugged/unplugged.
- * MAIN_THREAD_ADD_TO_DEV_LIST - When iodev is added to list.
- * MAIN_THREAD_INPUT_NODE_GAIN - When input node gain changes.
- * MAIN_THREAD_OUTPUT_NODE_VOLUME - When output node volume changes.
- * MAIN_THREAD_SET_OUTPUT_USER_MUTE - When output mute state is set.
- * MAIN_THREAD_RESUME_DEVS - When system resumes and notifies CRAS.
- * MAIN_THREAD_SUSPEND_DEVS - When system suspends and notifies CRAS.
- * MAIN_THREAD_STREAM_ADDED - When an audio stream is added.
- * MAIN_THREAD_STREAM_REMOVED - When an audio stream is removed.
- */
-enum MAIN_THREAD_LOG_EVENTS {
-	/* iodev related */
-	MAIN_THREAD_DEV_CLOSE,
-	MAIN_THREAD_DEV_DISABLE,
-	MAIN_THREAD_DEV_INIT,
-	MAIN_THREAD_DEV_REOPEN,
-	MAIN_THREAD_ADD_ACTIVE_NODE,
-	MAIN_THREAD_SELECT_NODE,
-	MAIN_THREAD_NODE_PLUGGED,
-	MAIN_THREAD_ADD_TO_DEV_LIST,
-	MAIN_THREAD_INPUT_NODE_GAIN,
-	MAIN_THREAD_OUTPUT_NODE_VOLUME,
-	MAIN_THREAD_SET_OUTPUT_USER_MUTE,
-	MAIN_THREAD_RESUME_DEVS,
-	MAIN_THREAD_SUSPEND_DEVS,
-	/* stream related */
-	MAIN_THREAD_STREAM_ADDED,
-	MAIN_THREAD_STREAM_REMOVED,
-};
-
-/* There are 8 bits of space for events. */
-enum CRAS_BT_LOG_EVENTS {
-	BT_ADAPTER_ADDED,
-	BT_ADAPTER_REMOVED,
-	BT_AUDIO_GATEWAY_INIT,
-	BT_AUDIO_GATEWAY_START,
-	BT_AVAILABLE_CODECS,
-	BT_A2DP_CONFIGURED,
-	BT_A2DP_START,
-	BT_A2DP_SUSPENDED,
-	BT_CODEC_SELECTION,
-	BT_DEV_CONNECTED,
-	BT_DEV_DISCONNECTED,
-	BT_DEV_CONN_WATCH_CB,
-	BT_DEV_SUSPEND_CB,
-	BT_HFP_NEW_CONNECTION,
-	BT_HFP_REQUEST_DISCONNECT,
-	BT_HFP_SUPPORTED_FEATURES,
-	BT_HFP_HF_INDICATOR,
-	BT_HFP_SET_SPEAKER_GAIN,
-	BT_HFP_UPDATE_SPEAKER_GAIN,
-	BT_HSP_NEW_CONNECTION,
-	BT_HSP_REQUEST_DISCONNECT,
-	BT_NEW_AUDIO_PROFILE_AFTER_CONNECT,
-	BT_RESET,
-	BT_SCO_CONNECT,
-	BT_TRANSPORT_ACQUIRE,
-	BT_TRANSPORT_RELEASE,
-	BT_TRANSPORT_SET_VOLUME,
-	BT_TRANSPORT_UPDATE_VOLUME,
-};
-
-struct __attribute__((__packed__)) audio_thread_event {
-	uint32_t tag_sec;
-	uint32_t nsec;
-	uint32_t data1;
-	uint32_t data2;
-	uint32_t data3;
-};
-
-/* Ring buffer of log events from the audio thread. */
-struct __attribute__((__packed__)) audio_thread_event_log {
-	uint64_t write_pos;
-	uint64_t sync_write_pos;
-	uint32_t len;
-	struct audio_thread_event log[AUDIO_THREAD_EVENT_LOG_SIZE];
-};
-
-struct __attribute__((__packed__)) audio_dev_debug_info {
-	char dev_name[CRAS_NODE_NAME_BUFFER_SIZE];
-	uint32_t buffer_size;
-	uint32_t min_buffer_level;
-	uint32_t min_cb_level;
-	uint32_t max_cb_level;
-	uint32_t frame_rate;
-	uint32_t num_channels;
-	double est_rate_ratio;
-	uint8_t direction;
-	uint32_t num_underruns;
-	uint32_t num_severe_underruns;
-	uint32_t highest_hw_level;
-	uint32_t runtime_sec;
-	uint32_t runtime_nsec;
-	uint32_t longest_wake_sec;
-	uint32_t longest_wake_nsec;
-	double software_gain_scaler;
-};
-
-struct __attribute__((__packed__)) audio_stream_debug_info {
-	uint64_t stream_id;
-	uint32_t dev_idx;
-	uint32_t direction;
-	uint32_t stream_type;
-	uint32_t client_type;
-	uint32_t buffer_frames;
-	uint32_t cb_threshold;
-	uint64_t effects;
-	uint32_t flags;
-	uint32_t frame_rate;
-	uint32_t num_channels;
-	uint32_t longest_fetch_sec;
-	uint32_t longest_fetch_nsec;
-	uint32_t num_missed_cb;
-	uint32_t num_overruns;
-	uint32_t is_pinned;
-	uint32_t pinned_dev_idx;
-	uint32_t runtime_sec;
-	uint32_t runtime_nsec;
-	double stream_volume;
-	int8_t channel_layout[CRAS_CH_MAX];
-};
-
-/* Debug info shared from server to client. */
-struct __attribute__((__packed__)) audio_debug_info {
-	uint32_t num_streams;
-	uint32_t num_devs;
-	struct audio_dev_debug_info devs[MAX_DEBUG_DEVS];
-	struct audio_stream_debug_info streams[MAX_DEBUG_STREAMS];
-	struct audio_thread_event_log log;
-};
-
-struct __attribute__((__packed__)) main_thread_event {
-	uint32_t tag_sec;
-	uint32_t nsec;
-	uint32_t data1;
-	uint32_t data2;
-	uint32_t data3;
-};
-
-struct __attribute__((__packed__)) main_thread_event_log {
-	uint32_t write_pos;
-	uint32_t len;
-	struct main_thread_event log[MAIN_THREAD_EVENT_LOG_SIZE];
-};
-
-struct __attribute__((__packed__)) main_thread_debug_info {
-	struct main_thread_event_log main_log;
-};
-
-struct __attribute__((__packed__)) cras_bt_event {
-	uint32_t tag_sec;
-	uint32_t nsec;
-	uint32_t data1;
-	uint32_t data2;
-};
-
-struct __attribute__((__packed__)) cras_bt_event_log {
-	uint32_t write_pos;
-	uint32_t len;
-	struct cras_bt_event log[CRAS_BT_EVENT_LOG_SIZE];
-};
-
-struct __attribute__((__packed__)) cras_bt_debug_info {
-	struct cras_bt_event_log bt_log;
-	struct packet_status_logger wbs_logger;
-};
-
-/*
- * All event enums should be less then AUDIO_THREAD_EVENT_TYPE_COUNT,
- * or they will be ignored by the handler.
- */
-enum CRAS_AUDIO_THREAD_EVENT_TYPE {
-	AUDIO_THREAD_EVENT_A2DP_OVERRUN,
-	AUDIO_THREAD_EVENT_A2DP_THROTTLE,
-	AUDIO_THREAD_EVENT_BUSYLOOP,
-	AUDIO_THREAD_EVENT_DEBUG,
-	AUDIO_THREAD_EVENT_SEVERE_UNDERRUN,
-	AUDIO_THREAD_EVENT_UNDERRUN,
-	AUDIO_THREAD_EVENT_DROP_SAMPLES,
-	AUDIO_THREAD_EVENT_DEV_OVERRUN,
-	AUDIO_THREAD_EVENT_TYPE_COUNT,
-};
-
-/*
- * Structure of snapshot for audio thread.
- */
-struct __attribute__((__packed__)) cras_audio_thread_snapshot {
-	struct timespec timestamp;
-	enum CRAS_AUDIO_THREAD_EVENT_TYPE event_type;
-	struct audio_debug_info audio_debug_info;
-};
-
-/*
- * Ring buffer for storing snapshots.
- */
-struct __attribute__((__packed__)) cras_audio_thread_snapshot_buffer {
-	struct cras_audio_thread_snapshot
-		snapshots[CRAS_MAX_AUDIO_THREAD_SNAPSHOTS];
-	int pos;
-};
-
-/* The server state that is shared with clients.
- *    state_version - Version of this structure.
- *    volume - index from 0-100.
- *    min_volume_dBFS - volume in dB * 100 when volume = 1.
- *    max_volume_dBFS - volume in dB * 100 when volume = max.
- *    mute - 0 = unmuted, 1 = muted by system (device switch, suspend, etc).
- *    user_mute - 0 = unmuted, 1 = muted by user.
- *    mute_locked - 0 = unlocked, 1 = locked.
- *    suspended - 1 = suspended, 0 = resumed.
- *    capture_gain - Capture gain in dBFS * 100.
- *    capture_mute - 0 = unmuted, 1 = muted.
- *    capture_mute_locked - 0 = unlocked, 1 = locked.
- *    num_streams_attached - Total number of streams since server started.
- *    num_output_devs - Number of available output devices.
- *    num_input_devs - Number of available input devices.
- *    output_devs - Output audio devices currently attached.
- *    input_devs - Input audio devices currently attached.
- *    num_output_nodes - Number of available output nodes.
- *    num_input_nodes - Number of available input nodes.
- *    output_nodes - Output nodes currently attached.
- *    input_nodes - Input nodes currently attached.
- *    num_attached_clients - Number of clients attached to server.
- *    client_info - List of first 20 attached clients.
- *    update_count - Incremented twice each time the struct is updated.  Odd
- *        during updates.
- *    num_active_streams - An array containing numbers or active
- *        streams of different directions.
- *    last_active_stream_time - Time the last stream was removed.  Can be used
- *        to determine how long audio has been idle.
- *    audio_debug_info - Debug data filled in when a client requests it. This
- *        isn't protected against concurrent updating, only one client should
- *        use it.
- *    default_output_buffer_size - Default output buffer size in frames.
- *    non_empty_status - Whether any non-empty audio is being
- *        played/captured.
- *    aec_supported - Flag to indicate if system aec is supported.
- *    aec_group_id  - Group ID for the system aec to use for separating aec
- *        tunings.
- *    snapshot_buffer - ring buffer for storing audio thread snapshots.
- *    bt_debug_info - ring buffer for storing bluetooth event logs.
- *    bt_wbs_enabled - Whether or not bluetooth wideband speech is enabled.
- *    deprioritize_bt_wbs_mic - Whether Bluetooth wideband speech mic
- *        should be deprioritized for selecting as default audio input.
- *    main_thread_debug_info - ring buffer for storing main thread event logs.
- *    num_input_streams_with_permission - An array containing numbers of input
- *        streams with permission in each client type.
- *    noise_cancellation_enabled - Whether or not Noise Cancellation is enabled.
- *    hotword_pause_at_suspend - 1 = Pause hotword detection when the system
- *        suspends. Hotword detection is resumed after system resumes.
- *        0 - Hotword detection is allowed to continue running after system
- *        suspends, so a detected hotword can wake up the device.
- *
- */
-#define CRAS_SERVER_STATE_VERSION 2
-struct __attribute__((packed, aligned(4))) cras_server_state {
-	uint32_t state_version;
-	uint32_t volume;
-	int32_t min_volume_dBFS;
-	int32_t max_volume_dBFS;
-	int32_t mute;
-	int32_t user_mute;
-	int32_t mute_locked;
-	int32_t suspended;
-	int32_t capture_gain;
-	int32_t capture_mute;
-	int32_t capture_mute_locked;
-	uint32_t num_streams_attached;
-	uint32_t num_output_devs;
-	uint32_t num_input_devs;
-	struct cras_iodev_info output_devs[CRAS_MAX_IODEVS];
-	struct cras_iodev_info input_devs[CRAS_MAX_IODEVS];
-	uint32_t num_output_nodes;
-	uint32_t num_input_nodes;
-	struct cras_ionode_info output_nodes[CRAS_MAX_IONODES];
-	struct cras_ionode_info input_nodes[CRAS_MAX_IONODES];
-	uint32_t num_attached_clients;
-	struct cras_attached_client_info client_info[CRAS_MAX_ATTACHED_CLIENTS];
-	uint32_t update_count;
-	uint32_t num_active_streams[CRAS_NUM_DIRECTIONS];
-	struct cras_timespec last_active_stream_time;
-	struct audio_debug_info audio_debug_info;
-	int32_t default_output_buffer_size;
-	int32_t non_empty_status;
-	int32_t aec_supported;
-	int32_t aec_group_id;
-	struct cras_audio_thread_snapshot_buffer snapshot_buffer;
-	struct cras_bt_debug_info bt_debug_info;
-	int32_t bt_wbs_enabled;
-	int32_t deprioritize_bt_wbs_mic;
-	struct main_thread_debug_info main_thread_debug_info;
-	uint32_t num_input_streams_with_permission[CRAS_NUM_CLIENT_TYPE];
-	int32_t noise_cancellation_enabled;
-	int32_t hotword_pause_at_suspend;
-};
-
-/* Actions for card add/remove/change. */
-enum cras_notify_device_action {
-	/* Must match gavd action definitions.  */
-	CRAS_DEVICE_ACTION_ADD = 0,
-	CRAS_DEVICE_ACTION_REMOVE = 1,
-	CRAS_DEVICE_ACTION_CHANGE = 2,
-};
-
-/* Information about an ALSA card to be added to the system.
- *    card_type - Either internal card or a USB sound card.
- *    card_index - Index ALSA uses to refer to the card.  The X in "hw:X".
- *    priority - Base priority to give devices found on this card. Zero is the
- *      lowest priority.  Non-primary devices on the card will be given a
- *      lowered priority.
- *    usb_vendor_id - vendor ID if the device is on the USB bus.
- *    usb_product_id - product ID if the device is on the USB bus.
- *    usb_serial_number - serial number if the device is on the USB bus.
- *    usb_desc_checksum - the checksum of the USB descriptors if the device
- *      is on the USB bus.
- */
-enum CRAS_ALSA_CARD_TYPE {
-	ALSA_CARD_TYPE_INTERNAL,
-	ALSA_CARD_TYPE_USB,
-};
-#define USB_SERIAL_NUMBER_BUFFER_SIZE 64
-struct __attribute__((__packed__)) cras_alsa_card_info {
-	enum CRAS_ALSA_CARD_TYPE card_type;
-	uint32_t card_index;
-	uint32_t usb_vendor_id;
-	uint32_t usb_product_id;
-	char usb_serial_number[USB_SERIAL_NUMBER_BUFFER_SIZE];
-	uint32_t usb_desc_checksum;
-};
-
-/* Unique identifier for each active stream.
- * The top 16 bits are the client number, lower 16 are the stream number.
- */
-typedef uint32_t cras_stream_id_t;
-/* Generates a stream id for client stream. */
-static inline cras_stream_id_t cras_get_stream_id(uint16_t client_id,
-						  uint16_t stream_id)
-{
-	return (cras_stream_id_t)(((client_id & 0x0000ffff) << 16) |
-				  (stream_id & 0x0000ffff));
-}
-/* Verify if the stream_id fits the given client_id */
-static inline bool cras_valid_stream_id(cras_stream_id_t stream_id,
-					uint16_t client_id)
-{
-	return ((stream_id >> 16) ^ client_id) == 0;
-}
-
-enum CRAS_NODE_TYPE {
-	/* These value can be used for output nodes. */
-	CRAS_NODE_TYPE_INTERNAL_SPEAKER,
-	CRAS_NODE_TYPE_HEADPHONE,
-	CRAS_NODE_TYPE_HDMI,
-	CRAS_NODE_TYPE_HAPTIC,
-	CRAS_NODE_TYPE_LINEOUT,
-	/* These value can be used for input nodes. */
-	CRAS_NODE_TYPE_MIC,
-	CRAS_NODE_TYPE_HOTWORD,
-	CRAS_NODE_TYPE_POST_MIX_PRE_DSP,
-	CRAS_NODE_TYPE_POST_DSP,
-	/* Type for the legacy BT narrow band mic .*/
-	CRAS_NODE_TYPE_BLUETOOTH_NB_MIC,
-	/* These value can be used for both output and input nodes. */
-	CRAS_NODE_TYPE_USB,
-	CRAS_NODE_TYPE_BLUETOOTH,
-	CRAS_NODE_TYPE_FALLBACK_NORMAL,
-	CRAS_NODE_TYPE_FALLBACK_ABNORMAL,
-	CRAS_NODE_TYPE_UNKNOWN,
-	CRAS_NODE_TYPE_ECHO_REFERENCE,
-	CRAS_NODE_TYPE_ALSA_LOOPBACK,
-};
-
-/* Position values to described where a node locates on the system.
- * NODE_POSITION_EXTERNAL - The node works only when peripheral
- *     is plugged.
- * NODE_POSITION_INTERNAL - The node lives on the system and doesn't
- *     have specific direction.
- * NODE_POSITION_FRONT - The node locates on the side of system that
- *     faces user.
- * NODE_POSITION_REAR - The node locates on the opposite side of
- *     the system that faces user.
- * NODE_POSITION_KEYBOARD - The node locates under the keyboard.
- */
-enum CRAS_NODE_POSITION {
-	NODE_POSITION_EXTERNAL,
-	NODE_POSITION_INTERNAL,
-	NODE_POSITION_FRONT,
-	NODE_POSITION_REAR,
-	NODE_POSITION_KEYBOARD,
-};
-
-#endif /* CRAS_TYPES_H_ */
diff --git a/cras/src/common/cras_util.c b/cras/src/common/cras_util.c
deleted file mode 100644
index 28570bf..0000000
--- a/cras/src/common/cras_util.c
+++ /dev/null
@@ -1,264 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#define _GNU_SOURCE /* For ppoll() */
-
-#include <errno.h>
-#include <fcntl.h>
-#include <pthread.h>
-#include <poll.h>
-#include <sched.h>
-#include <stdlib.h>
-#include <string.h>
-#include <syslog.h>
-#include <sys/param.h>
-#include <sys/resource.h>
-#include <sys/socket.h>
-#include <sys/syscall.h>
-#include <sys/types.h>
-#include <unistd.h>
-
-#include "cras_util.h"
-
-int cras_set_rt_scheduling(int rt_lim)
-{
-	struct rlimit rl;
-
-	rl.rlim_cur = rl.rlim_max = rt_lim;
-
-	if (setrlimit(RLIMIT_RTPRIO, &rl) < 0) {
-		syslog(LOG_WARNING, "setrlimit %u failed: %d\n",
-		       (unsigned)rt_lim, errno);
-		return -EACCES;
-	}
-	return 0;
-}
-
-int cras_set_thread_priority(int priority)
-{
-	struct sched_param sched_param;
-	int err;
-
-	memset(&sched_param, 0, sizeof(sched_param));
-	sched_param.sched_priority = priority;
-
-	err = pthread_setschedparam(pthread_self(), SCHED_RR, &sched_param);
-	if (err)
-		syslog(LOG_WARNING,
-		       "Failed to set thread sched params to priority %d"
-		       ", rc: %d\n",
-		       priority, err);
-
-	return err;
-}
-
-int cras_set_nice_level(int nice)
-{
-	int rc;
-
-	/* Linux isn't posix compliant with setpriority(2), it will set a thread
-	 * priority if it is passed a tid, not affecting the rest of the threads
-	 * in the process.  Setting this priority will only succeed if the user
-	 * has been granted permission to adjust nice values on the system.
-	 */
-	rc = setpriority(PRIO_PROCESS, syscall(__NR_gettid), nice);
-	if (rc)
-		syslog(LOG_WARNING, "Failed to set nice to %d, rc: %d", nice,
-		       rc);
-
-	return rc;
-}
-
-int cras_make_fd_nonblocking(int fd)
-{
-	int fl;
-
-	fl = fcntl(fd, F_GETFL);
-	if (fl < 0)
-		return fl;
-	if (fl & O_NONBLOCK)
-		return 0;
-	return fcntl(fd, F_SETFL, fl | O_NONBLOCK);
-}
-
-int cras_make_fd_blocking(int fd)
-{
-	int fl;
-
-	fl = fcntl(fd, F_GETFL);
-	if (fl < 0)
-		return fl;
-	if ((~fl) & O_NONBLOCK)
-		return 0;
-	return fcntl(fd, F_SETFL, fl & ~O_NONBLOCK);
-}
-
-int cras_send_with_fds(int sockfd, const void *buf, size_t len, int *fd,
-		       unsigned int num_fds)
-{
-	struct msghdr msg = { 0 };
-	struct iovec iov;
-	struct cmsghdr *cmsg;
-	char *control;
-	const unsigned int control_size = CMSG_SPACE(sizeof(*fd) * num_fds);
-	int rc;
-
-	control = calloc(control_size, 1);
-
-	msg.msg_iov = &iov;
-	msg.msg_iovlen = 1;
-	iov.iov_base = (void *)buf;
-	iov.iov_len = len;
-
-	msg.msg_control = control;
-	msg.msg_controllen = control_size;
-
-	cmsg = CMSG_FIRSTHDR(&msg);
-	cmsg->cmsg_level = SOL_SOCKET;
-	cmsg->cmsg_type = SCM_RIGHTS;
-	cmsg->cmsg_len = CMSG_LEN(sizeof(*fd) * num_fds);
-	memcpy(CMSG_DATA(cmsg), fd, sizeof(*fd) * num_fds);
-
-	rc = sendmsg(sockfd, &msg, 0);
-	if (rc == -1)
-		rc = -errno;
-	free(control);
-	return rc;
-}
-
-int cras_recv_with_fds(int sockfd, void *buf, size_t len, int *fd,
-		       unsigned int *num_fds)
-{
-	struct msghdr msg = { 0 };
-	struct iovec iov;
-	struct cmsghdr *cmsg;
-	char *control;
-	const unsigned int control_size = CMSG_SPACE(sizeof(*fd) * *num_fds);
-	int rc;
-	int i;
-
-	control = calloc(control_size, 1);
-
-	for (i = 0; i < *num_fds; i++)
-		fd[i] = -1;
-
-	msg.msg_iov = &iov;
-	msg.msg_iovlen = 1;
-	iov.iov_base = buf;
-	iov.iov_len = len;
-	msg.msg_control = control;
-	msg.msg_controllen = control_size;
-
-	rc = recvmsg(sockfd, &msg, 0);
-	if (rc < 0) {
-		rc = -errno;
-		goto exit;
-	}
-
-	for (cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL;
-	     cmsg = CMSG_NXTHDR(&msg, cmsg)) {
-		if (cmsg->cmsg_level == SOL_SOCKET &&
-		    cmsg->cmsg_type == SCM_RIGHTS) {
-			size_t fd_size = cmsg->cmsg_len - sizeof(*cmsg);
-			*num_fds = MIN(*num_fds, fd_size / sizeof(*fd));
-			memcpy(fd, CMSG_DATA(cmsg), *num_fds * sizeof(*fd));
-			goto exit;
-		}
-	}
-
-	// If we reach here, we did not find any file descriptors.
-	*num_fds = 0;
-exit:
-	free(control);
-	return rc;
-}
-
-int cras_poll(struct pollfd *fds, nfds_t nfds, struct timespec *timeout,
-	      const sigset_t *sigmask)
-{
-	struct timespec now;
-	struct timespec future;
-	struct pollfd *fd = fds;
-	nfds_t i;
-	int rc = 0;
-
-	if (timeout) {
-		/* Treat a negative timeout as valid (but timed-out) since
-		 * this function could update timeout to have negative tv_sec
-		 * or tv_nsec. */
-		if (timeout->tv_sec < 0 || timeout->tv_nsec < 0)
-			return -ETIMEDOUT;
-		rc = clock_gettime(CLOCK_MONOTONIC_RAW, &future);
-		if (rc < 0)
-			return -errno;
-		add_timespecs(&future, timeout);
-	}
-
-	for (i = 0; i < nfds; i++) {
-		fd->revents = 0;
-		fd++;
-	}
-
-	rc = ppoll(fds, nfds, timeout, sigmask);
-	if (rc == 0 && timeout) {
-		rc = -ETIMEDOUT;
-	} else if (rc < 0) {
-		rc = -errno;
-	}
-
-	if (timeout) {
-		clock_gettime(CLOCK_MONOTONIC_RAW, &now);
-		subtract_timespecs(&future, &now, timeout);
-	}
-
-	return rc;
-}
-
-int wait_for_dev_input_access()
-{
-	/* Wait for /dev/input/event* files to become accessible by
-	 * having group 'input'.  Setting these files to have 'rw'
-	 * access to group 'input' is done through a udev rule
-	 * installed by adhd into /lib/udev/rules.d.
-	 *
-	 * Wait for up to 2 seconds for the /dev/input/event* files to be
-	 * readable by gavd.
-	 *
-	 * TODO(thutt): This could also be done with a udev enumerate
-	 *              and then a udev monitor.
-	 */
-	const unsigned max_iterations = 4;
-	unsigned i = 0;
-
-	while (i < max_iterations) {
-		int readable;
-		struct timeval timeout;
-		const char *const pathname = "/dev/input/event0";
-
-		timeout.tv_sec = 0;
-		timeout.tv_usec = 500000; /* 1/2 second. */
-		readable = access(pathname, R_OK);
-
-		/* If the file could be opened, then the udev rule has been
-		 * applied and gavd can read the event files.  If there are no
-		 * event files, then we don't need to wait.
-		 *
-		 * If access does not become available, then headphone &
-		 * microphone jack autoswitching will not function properly.
-		 */
-		if (readable == 0 || (readable == -1 && errno == ENOENT)) {
-			/* Access allowed, or file does not exist. */
-			break;
-		}
-		if (readable != -1 || errno != EACCES) {
-			syslog(LOG_ERR, "Bad access for input devs.");
-			return errno;
-		}
-		select(1, NULL, NULL, NULL, &timeout);
-		++i;
-	}
-
-	return 0;
-}
diff --git a/cras/src/common/cras_util.h b/cras/src/common/cras_util.h
deleted file mode 100644
index 96985ab..0000000
--- a/cras/src/common/cras_util.h
+++ /dev/null
@@ -1,254 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_UTIL_H_
-#define CRAS_UTIL_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <poll.h>
-#include <time.h>
-
-#include "cras_types.h"
-
-#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
-
-#define assert_on_compile(e) ((void)sizeof(char[1 - 2 * !(e)]))
-#define assert_on_compile_is_power_of_2(n)                                     \
-	assert_on_compile((n) != 0 && (((n) & ((n)-1)) == 0))
-
-/* Enables real time scheduling. */
-int cras_set_rt_scheduling(int rt_lim);
-/* Sets the priority. */
-int cras_set_thread_priority(int priority);
-/* Sets the niceness level of the current thread. */
-int cras_set_nice_level(int nice);
-
-/* Converts a buffer level from one sample rate to another. */
-static inline size_t cras_frames_at_rate(size_t orig_rate, size_t orig_frames,
-					 size_t act_rate)
-{
-	return (orig_frames * act_rate + orig_rate - 1) / orig_rate;
-}
-
-/* Converts a number of frames to a time in a timespec. */
-static inline void cras_frames_to_time(unsigned int frames, unsigned int rate,
-				       struct timespec *t)
-{
-	t->tv_sec = frames / rate;
-	frames = frames % rate;
-	t->tv_nsec = (uint64_t)frames * 1000000000 / rate;
-}
-
-/* Converts a number of frames to a time in a timespec. */
-static inline void cras_frames_to_time_precise(unsigned int frames, double rate,
-					       struct timespec *t)
-{
-	double seconds = frames / rate;
-	t->tv_sec = (unsigned int)seconds;
-	seconds -= t->tv_sec;
-	t->tv_nsec = (unsigned int)(seconds * 1000000000);
-}
-
-/* Converts a timespec duration to a frame count. */
-static inline uint64_t cras_time_to_frames(const struct timespec *t,
-					   unsigned int rate)
-{
-	return t->tv_nsec * (uint64_t)rate / 1000000000 + rate * t->tv_sec;
-}
-
-/* Converts a number of frames to a duration in ms. */
-static inline unsigned int cras_frames_to_ms(unsigned int frames,
-					     unsigned int rate)
-{
-	return 1000 * frames / rate;
-}
-
-/* Makes a file descriptor non blocking. */
-int cras_make_fd_nonblocking(int fd);
-
-/* Makes a file descriptor blocking. */
-int cras_make_fd_blocking(int fd);
-
-/* Send data in buf to the socket attach the fds. */
-int cras_send_with_fds(int sockfd, const void *buf, size_t len, int *fd,
-		       unsigned int num_fds);
-
-/* Receive data in buf from the socket. If file descriptors are received, put
- * them in *fd, otherwise set *fd to -1. */
-int cras_recv_with_fds(int sockfd, void *buf, size_t len, int *fd,
-		       unsigned int *num_fds);
-
-/* This must be written a million times... */
-static inline void subtract_timespecs(const struct timespec *end,
-				      const struct timespec *beg,
-				      struct timespec *diff)
-{
-	diff->tv_sec = end->tv_sec - beg->tv_sec;
-	diff->tv_nsec = end->tv_nsec - beg->tv_nsec;
-
-	/* Adjust tv_sec and tv_nsec to the same sign. */
-	if (diff->tv_sec > 0 && diff->tv_nsec < 0) {
-		diff->tv_sec--;
-		diff->tv_nsec += 1000000000L;
-	} else if (diff->tv_sec < 0 && diff->tv_nsec > 0) {
-		diff->tv_sec++;
-		diff->tv_nsec -= 1000000000L;
-	}
-}
-
-static inline void add_timespecs(struct timespec *a, const struct timespec *b)
-{
-	a->tv_sec += b->tv_sec;
-	a->tv_nsec += b->tv_nsec;
-
-	while (a->tv_nsec >= 1000000000L) {
-		a->tv_sec++;
-		a->tv_nsec -= 1000000000L;
-	}
-}
-
-/* Converts a fixed-size cras_timespec to a native timespec */
-static inline void cras_timespec_to_timespec(struct timespec *dest,
-					     const struct cras_timespec *src)
-{
-	dest->tv_sec = src->tv_sec;
-	dest->tv_nsec = src->tv_nsec;
-}
-
-/* Fills a fixed-size cras_timespec with the current system time */
-static inline int cras_clock_gettime(clockid_t clk_id,
-				     struct cras_timespec *ctp)
-{
-	struct timespec tp;
-	int ret = clock_gettime(clk_id, &tp);
-	ctp->tv_sec = tp.tv_sec;
-	ctp->tv_nsec = tp.tv_nsec;
-	return ret;
-}
-
-/* Returns true if timeval a is after timeval b */
-static inline int timeval_after(const struct timeval *a,
-				const struct timeval *b)
-{
-	return (a->tv_sec > b->tv_sec) ||
-	       (a->tv_sec == b->tv_sec && a->tv_usec > b->tv_usec);
-}
-
-/* Returns true if timespec a is after timespec b */
-static inline int timespec_after(const struct timespec *a,
-				 const struct timespec *b)
-{
-	return (a->tv_sec > b->tv_sec) ||
-	       (a->tv_sec == b->tv_sec && a->tv_nsec > b->tv_nsec);
-}
-
-/* Retruns the equivalent number of milliseconds for a given timespec.
- * The result is rounded up to the next millisecond. */
-static inline unsigned int timespec_to_ms(const struct timespec *ts)
-{
-	return ts->tv_sec * 1000 + (ts->tv_nsec + 999999) / 1000000;
-}
-
-/* Convert milliseconds to timespec. */
-static inline void ms_to_timespec(time_t milliseconds, struct timespec *ts)
-{
-	ts->tv_sec = milliseconds / 1000;
-	ts->tv_nsec = (milliseconds % 1000) * 1000000;
-}
-
-/* Returns true if the given timespec is zero. */
-static inline int timespec_is_zero(const struct timespec *ts)
-{
-	return ts && ts->tv_sec == 0 && ts->tv_nsec == 0;
-}
-
-/* Returns non-zero if the given timespec is non-zero. */
-static inline int timespec_is_nonzero(const struct timespec *ts)
-{
-	return ts && (ts->tv_sec != 0 || (ts->tv_sec == 0 && ts->tv_nsec != 0));
-}
-
-/* Calculates frames since time beg. */
-static inline uint64_t cras_frames_since_time(const struct timespec *beg,
-					      unsigned int rate)
-{
-	struct timespec now, time_since;
-
-	clock_gettime(CLOCK_MONOTONIC_RAW, &now);
-	if (!timespec_after(&now, beg))
-		return 0;
-
-	subtract_timespecs(&now, beg, &time_since);
-	return cras_time_to_frames(&time_since, rate);
-}
-
-/* Calculates frames until time end. */
-static inline uint64_t cras_frames_until_time(const struct timespec *end,
-					      unsigned int rate)
-{
-	struct timespec now, time_until;
-
-	clock_gettime(CLOCK_MONOTONIC_RAW, &now);
-	if (!timespec_after(end, &now))
-		return 0;
-
-	subtract_timespecs(end, &now, &time_until);
-	return cras_time_to_frames(&time_until, rate);
-}
-
-/* Returns true if the difference between a and b is  shorter than t. */
-static inline bool timespec_diff_shorter_than(const struct timespec *a,
-					      const struct timespec *b,
-					      const struct timespec *t)
-{
-	struct timespec diff;
-	if (timespec_after(a, b))
-		subtract_timespecs(a, b, &diff);
-	else
-		subtract_timespecs(b, a, &diff);
-	return timespec_after(t, &diff);
-}
-
-/* Poll on the given file descriptors.
- *
- * See ppoll(). This implementation changes the value of timeout to the
- * remaining time, and returns negative error codes on error.
- *
- * Args:
- *    fds - Array of pollfd structures.
- *    nfds - Number of pollfd structures.
- *    timeout - Timeout time updated upon return with remaining time. The
- *              timeout value may be updated to become invalid (negative
- *              tv_nsec or negative tv_sec). In that case, -tv_nsec is the
- *              number of nanoseconds by which the polling exceeded the
- *              supplied timeout. The function immediately returns with
- *              -ETIMEOUT if tv_nsec is negative, simplifying loops that
- *              rely on the returned remaining timeout.
- *    sigmask - Signal mask while in the poll.
- *
- * Returns:
- *    Positive when file decriptors are ready.
- *    Zero if no file descriptors are ready and timeout is NULL.
- *    -ETIMEDOUT when no file descriptors are ready and a timeout specified.
- *    Other negative error codes specified in the ppoll() man page.
- */
-int cras_poll(struct pollfd *fds, nfds_t nfds, struct timespec *timeout,
-	      const sigset_t *sigmask);
-
-/* Wait for /dev/input/event* files to become accessible.
- *
- * Returns:
- *   Zero on success. Otherwise a negative error code.
- */
-int wait_for_dev_input_access();
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif /* CRAS_UTIL_H_ */
diff --git a/cras/src/common/dumper.c b/cras/src/common/dumper.c
deleted file mode 100644
index 5da16df..0000000
--- a/cras/src/common/dumper.c
+++ /dev/null
@@ -1,159 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <stdarg.h>
-#include <stdlib.h>
-#include <string.h>
-#include <syslog.h>
-
-#include "dumper.h"
-
-void dumpf(struct dumper *dumper, const char *format, ...)
-{
-	va_list ap;
-	va_start(ap, format);
-	dumper->vprintf(dumper, format, ap);
-	va_end(ap);
-}
-
-/* dumper which outputs to syslog */
-
-struct syslog_data {
-	int priority;
-	struct dumper *mem_dumper;
-};
-
-static void syslog_vprintf(struct dumper *dumper, const char *fmt, va_list ap)
-{
-	char *buf;
-	int size, i;
-	struct syslog_data *data = (struct syslog_data *)dumper->data;
-	struct dumper *mem_dumper = data->mem_dumper;
-
-	/* We cannot use syslog() directly each time we are called,
-	 * because syslog() will always append a newline to the
-	 * output, so the user will not be able to construct a line
-	 * incrementally using multiple calls. What we do here is to
-	 * collect the output in a buffer until a newline is given by
-	 * the user. */
-
-	mem_dumper->vprintf(mem_dumper, fmt, ap);
-again:
-	mem_dumper_get(mem_dumper, &buf, &size);
-	for (i = 0; i < size; i++) {
-		if (buf[i] == '\n') {
-			syslog(data->priority, "%.*s", i + 1, buf);
-			mem_dumper_consume(mem_dumper, i + 1);
-			goto again;
-		}
-	}
-}
-
-struct dumper *syslog_dumper_create(int priority)
-{
-	struct dumper *dumper = calloc(1, sizeof(struct dumper));
-	struct syslog_data *data = calloc(1, sizeof(struct syslog_data));
-	data->priority = priority;
-	data->mem_dumper = mem_dumper_create();
-	dumper->data = data;
-	dumper->vprintf = &syslog_vprintf;
-	return dumper;
-}
-
-void syslog_dumper_free(struct dumper *dumper)
-{
-	mem_dumper_free(((struct syslog_data *)dumper->data)->mem_dumper);
-	free(dumper->data);
-	free(dumper);
-}
-
-/* dumper which outputs to a memory buffer */
-
-struct mem_data {
-	char *buf;
-	int size;
-	int capacity;
-};
-
-static void mem_vprintf(struct dumper *dumper, const char *format, va_list ap)
-{
-	int n;
-	char *tmp;
-	struct mem_data *data = (struct mem_data *)dumper->data;
-
-	while (1) {
-		/* try to use the remaining space */
-		int remaining = data->capacity - data->size;
-		n = vsnprintf(data->buf + data->size, remaining, format, ap);
-
-		/* enough space? */
-		if (n > -1 && n < remaining) {
-			data->size += n;
-			return;
-		}
-
-		/* allocate more space and try again */
-		tmp = realloc(data->buf, data->capacity * 2);
-		if (tmp == NULL)
-			return;
-		data->buf = tmp;
-		data->capacity *= 2;
-	}
-}
-
-struct dumper *mem_dumper_create()
-{
-	struct dumper *dumper = calloc(1, sizeof(struct dumper));
-	struct mem_data *data = calloc(1, sizeof(struct mem_data));
-	if (!dumper || !data)
-		goto error;
-	data->size = 0;
-	data->capacity = 80;
-	data->buf = malloc(data->capacity);
-	if (!data->buf)
-		goto error;
-	data->buf[0] = '\0';
-	dumper->data = data;
-	dumper->vprintf = &mem_vprintf;
-	return dumper;
-
-error:
-	if (dumper)
-		free(dumper);
-	if (data)
-		free(data);
-	return NULL;
-}
-
-void mem_dumper_free(struct dumper *dumper)
-{
-	struct mem_data *data = (struct mem_data *)dumper->data;
-	free(data->buf);
-	free(data);
-	free(dumper);
-}
-
-void mem_dumper_clear(struct dumper *dumper)
-{
-	struct mem_data *data = (struct mem_data *)dumper->data;
-	data->buf[0] = '\0';
-	data->size = 0;
-}
-
-void mem_dumper_consume(struct dumper *dumper, int n)
-{
-	struct mem_data *data = (struct mem_data *)dumper->data;
-	if (n > data->size)
-		n = data->size;
-	memmove(data->buf, data->buf + n, data->size - n + 1);
-	data->size -= n;
-}
-
-void mem_dumper_get(struct dumper *dumper, char **buf, int *size)
-{
-	struct mem_data *data = (struct mem_data *)dumper->data;
-	*buf = data->buf;
-	*size = data->size;
-}
diff --git a/cras/src/common/dumper.h b/cras/src/common/dumper.h
deleted file mode 100644
index a6a3227..0000000
--- a/cras/src/common/dumper.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_DUMPER_H_
-#define CRAS_DUMPER_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <stdio.h>
-
-/* dumper is an interface to output some human-readable information */
-struct dumper {
-	void (*vprintf)(struct dumper *dumper, const char *format, va_list ap);
-	void *data; /* private to each dumper */
-};
-
-/* a convenience function outputs to a dumper */
-void dumpf(struct dumper *dumper, const char *format, ...);
-
-/*
- * a dumper outputs to syslog with the given priority
- */
-struct dumper *syslog_dumper_create(int priority);
-void syslog_dumper_free(struct dumper *dumper);
-
-/*
- * a dumper saves the output in a memory buffer
- */
-struct dumper *mem_dumper_create();
-void mem_dumper_free(struct dumper *dumper);
-
-/* get the memory buffer of the output */
-void mem_dumper_get(struct dumper *dumper, char **buf, int *size);
-
-/* clear the memory buffer */
-void mem_dumper_clear(struct dumper *dumper);
-
-/* delete the first n characters in the memory buffer */
-void mem_dumper_consume(struct dumper *dumper, int n);
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif /* CRAS_DUMPER_H_ */
diff --git a/cras/src/common/edid_utils.c b/cras/src/common/edid_utils.c
deleted file mode 100644
index d9361f0..0000000
--- a/cras/src/common/edid_utils.c
+++ /dev/null
@@ -1,833 +0,0 @@
-// Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-
-#include "edid_utils.h"
-
-/* Dump out an EDID block in a simple format */
-void show_edid_data(FILE *outfile, unsigned char *edid_data, int items,
-		    int base)
-{
-	int item = 0;
-
-	while (item < items) {
-		int i;
-		fprintf(outfile, " 0x%04x:  ", item + base);
-		for (i = 0; i < 16; i++) {
-			fprintf(outfile, "%02x ", edid_data[item++]);
-			if (item >= items)
-				break;
-		}
-		fprintf(outfile, "\n");
-	}
-}
-
-unsigned char test_edid1[256] = {
-	0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x06, 0xaf, 0x5c, 0x20,
-	0x00, 0x00, 0x00, 0x00, 0x01, 0x12, 0x01, 0x03, 0x80, 0x1a, 0x0e, 0x78,
-	0x0a, 0x99, 0x85, 0x95, 0x55, 0x56, 0x92, 0x28, 0x22, 0x50, 0x54, 0x00,
-	0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
-	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x96, 0x19, 0x56, 0x28, 0x50, 0x00,
-	0x08, 0x30, 0x18, 0x10, 0x24, 0x00, 0x00, 0x90, 0x10, 0x00, 0x00, 0x18,
-	0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x41,
-	0x55, 0x4f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-	0x00, 0x00, 0x00, 0xfe, 0x00, 0x42, 0x31, 0x31, 0x36, 0x58, 0x57, 0x30,
-	0x32, 0x20, 0x56, 0x30, 0x20, 0x0a, 0x00, 0xf8
-};
-
-unsigned char test_edid2[256] = {
-	0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x30, 0xe4, 0x00, 0x00,
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x01, 0x03, 0x80, 0x1a, 0x0e, 0x78,
-	0x0a, 0xbf, 0x45, 0x95, 0x58, 0x52, 0x8a, 0x28, 0x25, 0x50, 0x54, 0x00,
-	0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
-	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x84, 0x1c, 0x56, 0xa8, 0x50, 0x00,
-	0x19, 0x30, 0x30, 0x20, 0x35, 0x00, 0x00, 0x90, 0x10, 0x00, 0x00, 0x1b,
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x4c,
-	0x47, 0x20, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x0a, 0x20, 0x20,
-	0x00, 0x00, 0x00, 0xfc, 0x00, 0x4c, 0x50, 0x31, 0x31, 0x36, 0x57, 0x48,
-	0x31, 0x2d, 0x54, 0x4c, 0x4e, 0x31, 0x00, 0x4e
-};
-
-unsigned char test_edid3[256] = {
-	0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x4d, 0xd9, 0x02, 0x00,
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x01, 0x03, 0x80, 0x00, 0x00, 0x78,
-	0x0a, 0x0d, 0xc9, 0xa0, 0x57, 0x47, 0x98, 0x27, 0x12, 0x48, 0x4c, 0x00,
-	0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
-	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x1d, 0x80, 0xd0, 0x72, 0x1c,
-	0x16, 0x20, 0x10, 0x2c, 0x25, 0x80, 0xc4, 0x8e, 0x21, 0x00, 0x00, 0x9e,
-	0x01, 0x1d, 0x80, 0x18, 0x71, 0x1c, 0x16, 0x20, 0x58, 0x2c, 0x25, 0x00,
-	0xc4, 0x8e, 0x21, 0x00, 0x00, 0x9e, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x48,
-	0x44, 0x4d, 0x49, 0x20, 0x4c, 0x4c, 0x43, 0x0a, 0x20, 0x20, 0x20, 0x20,
-	0x00, 0x00, 0x00, 0xfd, 0x00, 0x3b, 0x3d, 0x0f, 0x2d, 0x08, 0x00, 0x0a,
-	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x01, 0xc0, 0x02, 0x03, 0x1e, 0x47,
-	0x4f, 0x94, 0x13, 0x05, 0x03, 0x04, 0x02, 0x01, 0x16, 0x15, 0x07, 0x06,
-	0x11, 0x10, 0x12, 0x1f, 0x23, 0x09, 0x07, 0x01, 0x65, 0x03, 0x0c, 0x00,
-	0x10, 0x00, 0x8c, 0x0a, 0xd0, 0x90, 0x20, 0x40, 0x31, 0x20, 0x0c, 0x40,
-	0x55, 0x00, 0x13, 0x8e, 0x21, 0x00, 0x00, 0x18, 0x01, 0x1d, 0x00, 0xbc,
-	0x52, 0xd0, 0x1e, 0x20, 0xb8, 0x28, 0x55, 0x40, 0xc4, 0x8e, 0x21, 0x00,
-	0x00, 0x1e, 0x8c, 0x0a, 0xd0, 0x8a, 0x20, 0xe0, 0x2d, 0x10, 0x10, 0x3e,
-	0x96, 0x00, 0xc4, 0x8e, 0x21, 0x00, 0x00, 0x18, 0x01, 0x1d, 0x00, 0x72,
-	0x51, 0xd0, 0x1e, 0x20, 0x6e, 0x28, 0x55, 0x00, 0xc4, 0x8e, 0x21, 0x00,
-	0x00, 0x1e, 0x8c, 0x0a, 0xd0, 0x8a, 0x20, 0xe0, 0x2d, 0x10, 0x10, 0x3e,
-	0x96, 0x00, 0x13, 0x8e, 0x21, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00,
-	0x00, 0x00, 0x00, 0xfb
-};
-
-unsigned char test_edid4[256] = {
-	0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x4c, 0x2d, 0x10, 0x02,
-	0x00, 0x00, 0x00, 0x00, 0x31, 0x0f, 0x01, 0x03, 0x80, 0x10, 0x09, 0x8c,
-	0x0a, 0xe2, 0xbd, 0xa1, 0x5b, 0x4a, 0x98, 0x24, 0x15, 0x47, 0x4a, 0x20,
-	0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
-	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x1d, 0x00, 0x72, 0x51, 0xd0,
-	0x1e, 0x20, 0x6e, 0x28, 0x55, 0x00, 0xa0, 0x5a, 0x00, 0x00, 0x00, 0x1e,
-	0x01, 0x1d, 0x80, 0x18, 0x71, 0x1c, 0x16, 0x20, 0x58, 0x2c, 0x25, 0x00,
-	0xa0, 0x5a, 0x00, 0x00, 0x00, 0x9e, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x3b,
-	0x3d, 0x1e, 0x2e, 0x08, 0x00, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-	0x00, 0x00, 0x00, 0xfc, 0x00, 0x53, 0x41, 0x4d, 0x53, 0x55, 0x4e, 0x47,
-	0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x01, 0x8d, 0x02, 0x03, 0x16, 0x71,
-	0x43, 0x84, 0x05, 0x03, 0x23, 0x09, 0x07, 0x07, 0x83, 0x01, 0x00, 0x00,
-	0x65, 0x03, 0x0c, 0x00, 0x20, 0x00, 0x8c, 0x0a, 0xd0, 0x8a, 0x20, 0xe0,
-	0x2d, 0x10, 0x10, 0x3e, 0x96, 0x00, 0xa0, 0x5a, 0x00, 0x00, 0x00, 0x18,
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-	0x00, 0x00, 0x00, 0x30
-};
-
-unsigned char test_edid5[256] = {
-	0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x3d, 0xcb, 0x61, 0x07,
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x01, 0x03, 0x80, 0x00, 0x00, 0x78,
-	0x0a, 0x0d, 0xc9, 0xa0, 0x57, 0x47, 0x98, 0x27, 0x12, 0x48, 0x4c, 0x00,
-	0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
-	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x1d, 0x80, 0x18, 0x71, 0x1c,
-	0x16, 0x20, 0x58, 0x2c, 0x25, 0x00, 0xc4, 0x8e, 0x21, 0x00, 0x00, 0x9e,
-	0x01, 0x1d, 0x80, 0xd0, 0x72, 0x1c, 0x16, 0x20, 0x10, 0x2c, 0x25, 0x80,
-	0xc4, 0x8e, 0x21, 0x00, 0x00, 0x9e, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x54,
-	0x58, 0x2d, 0x53, 0x52, 0x36, 0x30, 0x35, 0x0a, 0x20, 0x20, 0x20, 0x20,
-	0x00, 0x00, 0x00, 0xfd, 0x00, 0x17, 0xf0, 0x0f, 0x7e, 0x11, 0x00, 0x0a,
-	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x01, 0x93, 0x02, 0x03, 0x3b, 0x72,
-	0x55, 0x85, 0x04, 0x03, 0x02, 0x0e, 0x0f, 0x07, 0x23, 0x24, 0x10, 0x94,
-	0x13, 0x12, 0x11, 0x1d, 0x1e, 0x16, 0x25, 0x26, 0x01, 0x1f, 0x35, 0x09,
-	0x7f, 0x07, 0x0f, 0x7f, 0x07, 0x17, 0x07, 0x50, 0x3f, 0x06, 0xc0, 0x57,
-	0x06, 0x00, 0x5f, 0x7e, 0x01, 0x67, 0x5e, 0x00, 0x83, 0x4f, 0x00, 0x00,
-	0x66, 0x03, 0x0c, 0x00, 0x20, 0x00, 0x80, 0x8c, 0x0a, 0xd0, 0x8a, 0x20,
-	0xe0, 0x2d, 0x10, 0x10, 0x3e, 0x96, 0x00, 0xc4, 0x8e, 0x21, 0x00, 0x00,
-	0x18, 0x8c, 0x0a, 0xd0, 0x90, 0x20, 0x40, 0x31, 0x20, 0x0c, 0x40, 0x55,
-	0x00, 0xc4, 0x8e, 0x21, 0x00, 0x00, 0x18, 0x01, 0x1d, 0x00, 0x72, 0x51,
-	0xd0, 0x1e, 0x20, 0x6e, 0x28, 0x55, 0x00, 0xc4, 0x8e, 0x21, 0x00, 0x00,
-	0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-	0x00, 0x00, 0x00, 0xdd
-};
-
-/* Has DTD that is too wide */
-unsigned char test_edid6[256] = {
-	0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x10, 0xac, 0x63, 0x40,
-	0x4c, 0x35, 0x31, 0x33, 0x0c, 0x15, 0x01, 0x03, 0x80, 0x40, 0x28, 0x78,
-	0xea, 0x8d, 0x85, 0xad, 0x4f, 0x35, 0xb1, 0x25, 0x0e, 0x50, 0x54, 0xa5,
-	0x4b, 0x00, 0x71, 0x4f, 0x81, 0x00, 0x81, 0x80, 0xa9, 0x40, 0xd1, 0x00,
-	0xd1, 0x40, 0x01, 0x01, 0x01, 0x01, 0xe2, 0x68, 0x00, 0xa0, 0xa0, 0x40,
-	0x2e, 0x60, 0x30, 0x20, 0x36, 0x00, 0x81, 0x91, 0x21, 0x00, 0x00, 0x1a,
-	0x00, 0x00, 0x00, 0xff, 0x00, 0x50, 0x48, 0x35, 0x4e, 0x59, 0x31, 0x33,
-	0x4d, 0x33, 0x31, 0x35, 0x4c, 0x0a, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x44,
-	0x45, 0x4c, 0x4c, 0x20, 0x55, 0x33, 0x30, 0x31, 0x31, 0x0a, 0x20, 0x20,
-	0x00, 0x00, 0x00, 0xfd, 0x00, 0x31, 0x56, 0x1d, 0x71, 0x1c, 0x00, 0x0a,
-	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0xb0
-};
-
-static unsigned char *test_edids[N_TEST_EDIDS] = { test_edid1, test_edid2,
-						   test_edid3, test_edid4,
-						   test_edid5, test_edid6 };
-
-int get_test_edid(int n, unsigned char *dst)
-{
-	if ((n < 1) || (n > N_TEST_EDIDS))
-		return -1;
-	memcpy(dst, test_edids[n - 1], 256);
-	return 0;
-}
-
-int show_test_edid(FILE *outfile, int n)
-{
-	if ((n < 1) || (n > N_TEST_EDIDS))
-		return -1;
-	fprintf(outfile, "Test EDID %d\n", n);
-	show_edid(outfile, test_edids[n - 1], 1);
-	return 0;
-}
-
-static void get_dtd_string(const char *str, char *buf, int buf_size)
-{
-	int stp;
-	int len = buf_size < 14 ? buf_size : 14;
-
-	strncpy(buf, str, len - 1);
-	for (stp = 0; stp < len - 1; stp++)
-		if (buf[stp] == 0x0a)
-			buf[stp] = 0;
-	buf[stp] = 0;
-}
-
-/* Print an edid descriptor block (standard case is at 54 + 18 * i) */
-void show_edid_dtd(FILE *outfile, unsigned char *base)
-{
-	int pelclk = base[DTD_PCLK_LO] + (base[DTD_PCLK_HI] << 8);
-	char monstr[DTD_SIZE];
-
-	if (pelclk != 0) {
-		int hres = base[DTD_HA_LO] + ((base[DTD_HABL_HI] & 0xf0) << 4);
-		int hbl = base[DTD_HBL_LO] + ((base[DTD_HABL_HI] & 0x0f) << 8);
-		int vres = base[DTD_VA_LO] + ((base[DTD_VABL_HI] & 0xf0) << 4);
-		int vbl = base[DTD_VBL_LO] + ((base[DTD_VABL_HI] & 0x0f) << 8);
-		int hso = base[DTD_HSO_LO] + ((base[DTD_HVSX_HI] & 0xc0) << 2);
-		int hsw = base[DTD_HSW_LO] + ((base[DTD_HVSX_HI] & 0x30) << 4);
-		int vso = (base[DTD_VSX_LO] >> 4) +
-			  ((base[DTD_HVSX_HI] & 0x0c) << 2);
-		int vsw = (base[DTD_VSX_LO] & 0xf) +
-			  ((base[DTD_HVSX_HI] & 0x03) << 4);
-		int hsiz = base[DTD_HSIZE_LO] +
-			   ((base[DTD_HVSIZE_HI] & 0xf0) << 4);
-		int vsiz = base[DTD_VSIZE_LO] +
-			   ((base[DTD_HVSIZE_HI] & 0x0f) << 8);
-		int hbdr = base[DTD_HBORDER];
-		int vbdr = base[DTD_VBORDER];
-		int mdflg = base[DTD_FLAGS];
-
-		int refr = (pelclk * 10000) / ((hres + hbl) * (vres + vbl));
-		int refm = (pelclk * 10000) % ((hres + hbl) * (vres + vbl));
-		int refd = (refm * 100) / ((hres + hbl) * (vres + vbl));
-
-		fprintf(outfile,
-			"%dx%d%c@%d.%02d, dot clock %d  %cHsync %cVsync\n",
-			hres, vres, (mdflg & 0x80) ? 'i' : 'p', refr, refd,
-			pelclk * 10000, (mdflg & 0x2) ? '+' : '-',
-			(mdflg & 0x4) ? '+' : '-');
-		fprintf(outfile, "H: start %d, end %d, total %d\n", hres + hso,
-			hres + hso + hsw, hres + hbl);
-		fprintf(outfile, "V: start %d, end %d, total %d\n", vres + vso,
-			vres + vso + vsw, vres + vbl);
-		fprintf(outfile, "Size %dx%dmm, Border %dx%d pixels\n", hsiz,
-			vsiz, hbdr, vbdr);
-		return;
-	}
-
-	switch (base[DTD_TYPETAG]) {
-	case DTDTYPE_SERIAL:
-	case DTDTYPE_STRING:
-	case DTDTYPE_NAME:
-		get_dtd_string((const char *)base + DTD_STRING, monstr,
-			       DTD_SIZE);
-
-		if (base[3] != DTDTYPE_STRING)
-			fprintf(outfile, "%s: %s\n",
-				(base[3] == DTDTYPE_NAME) ? "Name" : "Serial",
-				monstr);
-		else
-			fprintf(outfile, "%s\n", monstr);
-		break;
-
-	case DTDTYPE_LIMITS:
-		fprintf(outfile, "V %d - %d Hz, H %d - %d kHz, Pel <= %d MHz\n",
-			base[DTD_MINV_HZ], base[DTD_MAXV_HZ],
-			base[DTD_MINH_kHZ], base[DTD_MAXH_kHZ],
-			base[DTD_MAXCLK_100kHZ] * 10);
-		break;
-
-	default:
-		fprintf(outfile, "Undecoded descriptor block type 0x%x\n",
-			base[DTD_TYPETAG]);
-		break;
-	}
-}
-
-char *sad_audio_type[16] = {
-	"Reserved",
-	"LPCM",
-	"AC-3",
-	"MPEG1 (Layer 1 and 2)",
-	"MP3",
-	"MPEG2",
-	"AAC",
-	"DTS",
-	"ATRAC",
-	"SACD",
-	"DD+",
-	"DTS-HD",
-	"MLP/Dolby TrueHD",
-	"DST Audio",
-	"WMA Pro",
-	"Reserved",
-};
-
-char *uscanstr[4] = {
-	"not supported",
-	"always overscan",
-	"always underscan",
-	"supports both over- and underscan",
-};
-
-static inline void show_audio_dbc(FILE *outfile, const unsigned char *edid_ext,
-				  int dbc)
-{
-	int dbp = dbc + 1;
-	int db_len = edid_ext[dbc + DBC_TAG_LENGTH] & DBC_LEN_MASK;
-
-	while (dbp < (dbc + db_len + 1)) {
-		int atype = (edid_ext[dbp + DBCA_FORMAT] >> 3) & 0xf;
-		unsigned char dbca_rate = edid_ext[dbp + DBCA_RATE];
-
-		fprintf(outfile, "Audio: %d channels %s: ",
-			(edid_ext[dbp + DBCA_FORMAT] & 0x7) + 1,
-			sad_audio_type[atype]);
-
-		if (dbca_rate & 0x40)
-			fprintf(outfile, "192k ");
-		if (dbca_rate & 0x20)
-			fprintf(outfile, "176k ");
-		if (dbca_rate & 0x10)
-			fprintf(outfile, "96k ");
-		if (dbca_rate & 0x08)
-			fprintf(outfile, "88k ");
-		if (dbca_rate & 0x04)
-			fprintf(outfile, "48k ");
-		if (dbca_rate & 0x02)
-			fprintf(outfile, "44k ");
-		if (dbca_rate & 0x01)
-			fprintf(outfile, "32k ");
-
-		if (atype == 1) {
-			unsigned char dbca_info = edid_ext[dbp + DBCA_INFO];
-			fprintf(outfile, "%s%s%s\n",
-				(dbca_info & 0x4) ? "24-bit " : "",
-				(dbca_info & 0x2) ? "20-bit " : "",
-				(dbca_info & 0x1) ? "16-bit" : "");
-		} else if ((atype >= 2) && (atype <= 8)) {
-			fprintf(outfile, "Max %dkHz\n",
-				edid_ext[dbp + DBCA_INFO] * 8);
-		} else {
-			fprintf(outfile, "Codec vendor flags 0x%02x\n",
-				edid_ext[dbp + DBCA_INFO]);
-		}
-
-		dbp += DBCA_SIZE;
-	}
-}
-
-static inline void show_vendor_dbc(FILE *outfile, const unsigned char *edid_ext,
-				   int dbp)
-{
-	if ((edid_ext[dbp + DBCVND_IEEE_LO] != 0x03) ||
-	    (edid_ext[dbp + DBCVND_IEEE_MID] != 0x0C) ||
-	    (edid_ext[dbp + DBCVND_IEEE_HI] != 0x00)) {
-		fprintf(outfile, "Vendor block for %02x-%02x-%02x",
-			edid_ext[dbp + DBCVND_IEEE_LO],
-			edid_ext[dbp + DBCVND_IEEE_MID],
-			edid_ext[dbp + DBCVND_IEEE_HI]);
-		return;
-	}
-
-	fprintf(outfile,
-		"HDMI Vendor block (CEC @0x%04x):\n"
-		"Support: %s%s%s%s%s%s\n",
-		edid_ext[dbp + DBCVHDMI_CEC_LO] +
-			(edid_ext[dbp + DBCVHDMI_CEC_HI] << 8),
-		(edid_ext[dbp + DBCVHDMI_SUPPORT] & 0x80) ? "AI " : "",
-		(edid_ext[dbp + DBCVHDMI_SUPPORT] & 0x40) ? "DC_48bit " : "",
-		(edid_ext[dbp + DBCVHDMI_SUPPORT] & 0x20) ? "DC_36bit " : "",
-		(edid_ext[dbp + DBCVHDMI_SUPPORT] & 0x10) ? "DC_30bit " : "",
-		(edid_ext[dbp + DBCVHDMI_SUPPORT] & 0x08) ? "DC_Y444 " : "",
-		(edid_ext[dbp + DBCVHDMI_SUPPORT] & 0x01) ? "DVI_Dual" : "");
-
-	if (edid_ext[dbp + DBCVHDMI_MAXTMDS_5MHz] > 0)
-		fprintf(outfile, "Max TMDS Frequency %dMHz\n",
-			edid_ext[dbp + DBCVHDMI_MAXTMDS_5MHz] * 5);
-
-	if (edid_ext[dbp + DBCVHDMI_LATFLAGS] & 0x80)
-		fprintf(outfile, "Video latency %dms, audio latency %dms\n",
-			2 * (edid_ext[dbp + DBCVHDMI_VLAT] - 1),
-			2 * (edid_ext[dbp + DBCVHDMI_ALAT] - 1));
-
-	if (edid_ext[dbp + 7] & 0x40)
-		fprintf(outfile,
-			"Interlaced Video latency %dms, audio latency %dms\n",
-			2 * (edid_ext[dbp + DBCVHDMI_IVLAT] - 1),
-			2 * (edid_ext[dbp + DBCVHDMI_IALAT] - 1));
-}
-
-static void show_extended_dbc(FILE *outfile, const unsigned char *edid_ext,
-			      int dbc)
-{
-	int dbp = dbc + 1;
-	int db_len = edid_ext[dbc + DBC_TAG_LENGTH] & DBC_LEN_MASK;
-
-	switch (edid_ext[dbp + DBC_ETAG]) {
-	case DBC_ETAG_VCDB: {
-		unsigned char vcdb_flags;
-
-		fprintf(outfile, "Video Capabilities:\n");
-		fprintf(outfile, "  Quantization range selectable: %s\n",
-			(edid_ext[dbp + VCDB_FLAGS] & 0x40) ? "unknown" :
-							      "via AVI Q");
-
-		/* PT field zero implies no data, just use IT
-		 * and CE fields
-		 */
-		vcdb_flags = edid_ext[dbp + VCDB_FLAGS];
-		if (VCDB_S_PT(vcdb_flags))
-			fprintf(outfile, "  Preferred mode %s\n",
-				uscanstr[VCDB_S_PT(vcdb_flags)]);
-		fprintf(outfile, "  IT modes %s\n",
-			uscanstr[VCDB_S_IT(vcdb_flags)]);
-		fprintf(outfile, "  CE modes %s\n",
-			uscanstr[VCDB_S_CE(vcdb_flags)]);
-		break;
-	}
-
-	case DBC_ETAG_COL:
-		fprintf(outfile, "Colorimetry supports %s%s metadata 0x%x\n",
-			(edid_ext[dbp + COL_FLAGS] & 0x02) ? "HD(YCC709) " : "",
-			(edid_ext[dbp + COL_FLAGS] & 0x01) ? "SD(YCC601) " : "",
-			(edid_ext[dbp + COL_META] & 0x07));
-		break;
-
-	default:
-		fprintf(outfile,
-			"Unknown extended tag data block 0x%x,  length 0x%x\n",
-			edid_ext[dbc + DBC_ETAG], db_len);
-	}
-}
-
-void show_cea_timing(FILE *outfile, unsigned char *edid_ext)
-{
-	int i, dbc;
-	int off_dtd = edid_ext[CEA_DTD_OFFSET];
-	int n_dtd;
-	fprintf(outfile, "Found CEA EDID Timing Extension rev 3\n");
-
-	if (off_dtd < CEA_DBC_START) {
-		fprintf(outfile, "Block is empty (off_dtd = %d)\n", off_dtd);
-		return;
-	}
-	/* Ends with 0 and a checksum, have at least one pad byte */
-	n_dtd = (CEA_LAST_PAD - off_dtd) / DTD_SIZE;
-	fprintf(outfile,
-		"Block has DTDs starting at offset %d (%d bytes of DBCs)\n",
-		off_dtd, off_dtd - CEA_DBC_START);
-	fprintf(outfile, "There is space for %d DTDs in extension\n", n_dtd);
-	fprintf(outfile,
-		"There are %d native DTDs (between regular and extensions)\n",
-		edid_ext[CEA_NATIVE_DTDS] & 0xf);
-	fprintf(outfile, "IT formats %sdefault to underscan\n",
-		(edid_ext[CEA_SUPPORT] & 0x80) ? "" : "do not ");
-	fprintf(outfile,
-		"Support: %sbasic audio, %sYCrCb 4:4:4, %sYCrCb 4:2:2\n",
-		(edid_ext[CEA_SUPPORT] & 0x40) ? "" : "no ",
-		(edid_ext[CEA_SUPPORT] & 0x20) ? "" : "no ",
-		(edid_ext[CEA_SUPPORT] & 0x10) ? "" : "no ");
-
-	/* Between offset 4 and off_dtd is the Data Block Collection */
-	/* There may be none, in which case off_dtd == 4             */
-	dbc = CEA_DBC_START;
-	while (dbc < off_dtd) {
-		int db_len = edid_ext[dbc + DBC_TAG_LENGTH] & DBC_LEN_MASK;
-		int dbp = dbc + 1;
-
-		switch (edid_ext[dbc + DBC_TAG_LENGTH] >> DBC_TAG_SHIFT) {
-		case DBC_TAG_AUDIO:
-			/* Audio Data Block */
-			show_audio_dbc(outfile, edid_ext, dbc);
-			break;
-
-		case DBC_TAG_VIDEO:
-			/* Vidio Data Block */
-			while (dbp < (dbc + db_len + 1)) {
-				int vtype = edid_ext[dbp + DBCV_CODE] & 0x7f;
-				fprintf(outfile, "Video: Code %d %s\n", vtype,
-					(edid_ext[dbp + DBCV_CODE] & 0x80) ?
-						"(native)" :
-						"");
-				dbp += DBCV_SIZE;
-			}
-			break;
-
-		case DBC_TAG_VENDOR:
-			/* Vendor Data Block */
-			show_vendor_dbc(outfile, edid_ext, dbc + 1);
-			break;
-
-		case DBC_TAG_SPEAKER: {
-			/* Speaker allocation Block */
-			unsigned char dbcsp_alloc = edid_ext[dbp + DBCSP_ALLOC];
-
-			fprintf(outfile, "Speakers: %s%s%s%s%s%s%s\n",
-				(dbcsp_alloc & 0x40) ? "RearCenter L/R " : "",
-				(dbcsp_alloc & 0x20) ? "FrontCenter L/R " : "",
-				(dbcsp_alloc & 0x10) ? "Rear Center" : "",
-				(dbcsp_alloc & 0x08) ? "Rear L/R " : "",
-				(dbcsp_alloc & 0x04) ? "Front Center " : "",
-				(dbcsp_alloc & 0x02) ? "LFE " : "",
-				(dbcsp_alloc & 0x01) ? "Front L/R " : "");
-			break;
-		}
-
-		case DBC_TAG_EXTENDED:
-			show_extended_dbc(outfile, edid_ext, dbc);
-			break;
-
-		default:
-			fprintf(outfile,
-				"Unknown Data Block type tag 0x%x, len 0x%x\n",
-				edid_ext[dbc + DBC_TAG_LENGTH] >> DBC_TAG_SHIFT,
-				db_len);
-			break;
-		}
-
-		dbc += db_len + 1;
-	}
-	for (i = 0; i < n_dtd; i++) {
-		/* Find 0,0 when we hit padding */
-		if ((edid_ext[off_dtd + DTD_SIZE * i + DTD_PCLK_LO] == 0) &&
-		    (edid_ext[off_dtd + DTD_SIZE * i + DTD_PCLK_HI] == 0)) {
-			fprintf(outfile, "End of DTD padding after %d DTDs\n",
-				i);
-			break;
-		}
-		show_edid_dtd(outfile, edid_ext + (off_dtd + DTD_SIZE * i));
-	}
-}
-
-int edid_valid(const unsigned char *edid_data)
-{
-	return ((edid_data[EDID_HDR + 0] == 0x00) &&
-		(edid_data[EDID_HDR + 1] == 0xff) &&
-		(edid_data[EDID_HDR + 2] == 0xff) &&
-		(edid_data[EDID_HDR + 3] == 0xff) &&
-		(edid_data[EDID_HDR + 4] == 0xff) &&
-		(edid_data[EDID_HDR + 5] == 0xff) &&
-		(edid_data[EDID_HDR + 6] == 0xff) &&
-		(edid_data[EDID_HDR + 7] == 0x00));
-}
-
-int edid_lpcm_support(const unsigned char *edid_data, int ext)
-{
-	const unsigned char *edid_ext = edid_data + EDID_SIZE;
-	int dbc;
-	int off_dtd = edid_ext[CEA_DTD_OFFSET];
-
-	/* No if no extension, which can happen for two reasons */
-	/* a) ext < 1 indicates no data was read into the extension area */
-	/* b) edid_data[126] < 1 indicates EDID does not use extension area */
-	if ((ext < 1) || (edid_data[EDID_EXT_FLAG] < 1))
-		return 0;
-
-	/* No if extension is not CEA rev 3 */
-	if (!((edid_ext[EEXT_TAG] == 0x02) && (edid_ext[EEXT_REV] == 0x03)))
-		return 0;
-
-	/* If DBC block is not empty look for audio info */
-	if (off_dtd <= CEA_DBC_START)
-		goto done_dtd;
-
-	/* Between offset 4 and off_dtd is the Data Block Collection */
-	/* There may be none, in which case off_dtd == 4             */
-	dbc = CEA_DBC_START;
-	while (dbc < off_dtd) {
-		int db_len = edid_ext[dbc + DBC_TAG_LENGTH] & DBC_LEN_MASK;
-		int dbp = dbc + 1;
-		unsigned char dbc_type;
-
-		/* Audio Data Block, type LPCM, return bitmap of frequencies */
-		dbc_type = edid_ext[dbc + DBC_TAG_LENGTH] >> DBC_TAG_SHIFT;
-		if ((dbc_type == DBC_TAG_AUDIO) &&
-		    (((edid_ext[dbp + DBCA_FORMAT] >> 3) & 0xF) ==
-		     DBCA_FMT_LPCM))
-			return edid_ext[dbp + DBCA_RATE];
-
-		dbc += db_len + 1;
-	}
-	/* Get here if failed to find LPCM info in DBC block */
-
-done_dtd:
-	/* Last chance is to look for Basic Audio support. Return bitmap for 32,
-	 * 44.1, 48 */
-	if (edid_ext[CEA_SUPPORT] & 0x40)
-		return 0x7;
-
-	return 0;
-}
-
-int edid_has_hdmi_info(const unsigned char *edid_data, int ext)
-{
-	const unsigned char *edid_ext = edid_data + EDID_SIZE;
-	int dbc;
-	int off_dtd = edid_ext[CEA_DTD_OFFSET];
-
-	/* No if no extension, which can happen for two reasons */
-	/* a) ext < 1 indicates no data was read into the extension area */
-	/* b) edid_data[126] < 1 indicates EDID does not use extension area */
-	if ((ext < 1) || (edid_data[EDID_EXT_FLAG] < 1))
-		return 0;
-
-	/* No if extension is not CEA rev 3 */
-	if (!((edid_ext[EEXT_TAG] == 0x02) && (edid_ext[EEXT_REV] == 0x03)))
-		return 0;
-
-	/* No if block is empty */
-	if (off_dtd < CEA_DBC_START)
-		return 0;
-
-	/* Between offset 4 and off_dtd is the Data Block Collection */
-	/* There may be none, in which case off_dtd == 4             */
-	dbc = CEA_DBC_START;
-	while (dbc < off_dtd) {
-		int db_len = edid_ext[dbc + DBC_TAG_LENGTH] & DBC_LEN_MASK;
-		int dbp = dbc + 1;
-		unsigned char dbc_type;
-
-		dbc_type = edid_ext[dbc + DBC_TAG_LENGTH] >> DBC_TAG_SHIFT;
-		if (dbc_type == DBC_TAG_VENDOR) {
-			/* Vendor Data Block */
-			if ((edid_ext[dbp + DBCVND_IEEE_LO] == 0x03) &&
-			    (edid_ext[dbp + DBCVND_IEEE_MID] == 0x0C) &&
-			    (edid_ext[dbp + DBCVND_IEEE_HI] == 0x00))
-				return 1;
-		}
-		dbc += db_len + 1;
-	}
-	return 0;
-}
-
-/* Print out an EDID */
-void show_edid(FILE *outfile, unsigned char *edid_data, int ext)
-{
-	int i;
-	int edidver = edid_data[EDID_VERSION];
-	int edidrev = edid_data[EDID_REVISION];
-	unsigned char *edid_ext;
-	unsigned char edid_features;
-
-	if (!edid_valid(edid_data)) {
-		fprintf(outfile, "Block does not contain EDID header\n");
-		return;
-	}
-	/* unsigned edid_data so the right shifts pull in zeros */
-	fprintf(outfile, "Manufacturer ID %c%c%c, product ID 0x%x\n",
-		'@' + (edid_data[EDID_MFG_EID] >> 2),
-		'@' + (((edid_data[EDID_MFG_EID] & 3) << 3) +
-		       (edid_data[EDID_MFG_EID + 1] >> 5)),
-		'@' + (edid_data[EDID_MFG_EID + 1] & 0x1f),
-		edid_data[EDID_MFG_PROD_LO] +
-			(edid_data[EDID_MFG_PROD_HI] << 8));
-	fprintf(outfile, "Manufactured wk %d of %d. Edid version %d.%d\n",
-		edid_data[EDID_MFG_WEEK], 1990 + edid_data[EDID_MFG_YEAR],
-		edidver, edidrev);
-	fprintf(outfile,
-		"Input: %s, vid level %d, %s, %s %s %s %s sync, %dx%dcm, Gamma %f\n",
-		(edid_data[EDID_VIDEO_IN] & 0x80) ? "digital" : "analog",
-		(edid_data[EDID_VIDEO_IN] >> 5) & 3,
-		(edid_data[EDID_VIDEO_IN] & 0x10) ? "Blank to black" : "",
-		(edid_data[EDID_VIDEO_IN] & 0x08) ? "Separate" : "",
-		(edid_data[EDID_VIDEO_IN] & 0x04) ? "Composite" : "",
-		(edid_data[EDID_VIDEO_IN] & 0x02) ? "On-green" : "",
-		(edid_data[EDID_VIDEO_IN] & 0x01) ? "Serration V" : "",
-		edid_data[EDID_MAX_HSIZE], edid_data[EDID_MAX_VSIZE],
-		1.0 + ((float)edid_data[EDID_GAMMA] / 100.0));
-
-	edid_features = edid_data[EDID_FEATURES];
-	fprintf(outfile, "Features: %s %s %s %s %s %s %s\n",
-		(edid_features & 0x80) ? "standby" : "",
-		(edid_features & 0x40) ? "suspend" : "",
-		(edid_features & 0x20) ? "active-off" : "",
-		(edid_features & 0x18) ? "colour" : "monochrome",
-		(edid_features & 0x04) ? "std-cspace" : "non-std-cspace",
-		(edid_features & 0x02) ? "preferred-timing" : "",
-		(edid_features & 0x01) ? "default-GTF" : "");
-
-	fprintf(outfile, "Established Timing:\n");
-	if (edid_data[EDID_ESTTIME1] & 0x80)
-		fprintf(outfile, "720x400@70\n");
-	if (edid_data[EDID_ESTTIME1] & 0x40)
-		fprintf(outfile, "720x400@88\n");
-	if (edid_data[EDID_ESTTIME1] & 0x20)
-		fprintf(outfile, "640x480@60\n");
-	if (edid_data[EDID_ESTTIME1] & 0x10)
-		fprintf(outfile, "640x480@67\n");
-	if (edid_data[EDID_ESTTIME1] & 0x08)
-		fprintf(outfile, "640x480@72\n");
-	if (edid_data[EDID_ESTTIME1] & 0x04)
-		fprintf(outfile, "640x480@75\n");
-	if (edid_data[EDID_ESTTIME1] & 0x02)
-		fprintf(outfile, "800x600@56\n");
-	if (edid_data[EDID_ESTTIME1] & 0x01)
-		fprintf(outfile, "800x600@60\n");
-	if (edid_data[EDID_ESTTIME2] & 0x80)
-		fprintf(outfile, "800x600@72\n");
-	if (edid_data[EDID_ESTTIME2] & 0x40)
-		fprintf(outfile, "800x600@75\n");
-	if (edid_data[EDID_ESTTIME2] & 0x20)
-		fprintf(outfile, "832x624@75\n");
-	if (edid_data[EDID_ESTTIME2] & 0x10)
-		fprintf(outfile, "1024x768i@87\n");
-	if (edid_data[EDID_ESTTIME2] & 0x08)
-		fprintf(outfile, "1024x768@60\n");
-	if (edid_data[EDID_ESTTIME2] & 0x04)
-		fprintf(outfile, "1024x768@70\n");
-	if (edid_data[EDID_ESTTIME2] & 0x02)
-		fprintf(outfile, "1024x768@75\n");
-	if (edid_data[EDID_ESTTIME2] & 0x01)
-		fprintf(outfile, "1280x1024@75\n");
-	if (edid_data[EDID_MFGTIME] & 0x80)
-		fprintf(outfile, "1152x870@75\n");
-
-	fprintf(outfile, "Standard timing:\n");
-	for (i = 0; i < EDID_N_STDTIME; i++) {
-		int hinfo = edid_data[EDID_STDTIMEH + 2 * i];
-		int vinfo = edid_data[EDID_STDTIMEV + 2 * i];
-		int hres, vres;
-
-		/* 01 01 is pad by spec, but 00 00 and 20 20 are see in wild */
-		if (((hinfo == 0x01) && (vinfo == 0x01)) ||
-		    ((hinfo == 0x00) && (vinfo == 0x00)) ||
-		    ((hinfo == 0x20) && (vinfo == 0x20)))
-			continue;
-		hres = (hinfo * 8) + 248;
-		switch (vinfo >> 6) {
-		case ASPECT_16_10:
-			vres = (hres * 10) / 16;
-			break;
-		case ASPECT_4_3:
-			vres = (hres * 3) / 4;
-			break;
-		case ASPECT_5_4:
-			vres = (hres * 4) / 5;
-			break;
-		case ASPECT_16_9:
-			vres = (hres * 9) / 16;
-			break;
-			/* Default only hit if compiler broken */
-		default:
-			vres = 0;
-		}
-		fprintf(outfile, "%d: %dx%d@%d\n", i, hres, vres,
-			60 + (vinfo & 0x3f));
-	}
-
-	fprintf(outfile, "Descriptor blocks:\n");
-	for (i = 0; i < EDID_N_DTDS; i++)
-		show_edid_dtd(outfile,
-			      edid_data + (EDID_DTD_BASE + i * DTD_SIZE));
-	fprintf(outfile, "EDID contains %d extensions\n",
-		edid_data[EDID_EXT_FLAG]);
-
-	edid_ext = edid_data + EDID_SIZE;
-
-	if ((ext >= 1) && (edid_data[EDID_EXT_FLAG] >= 1)) {
-		unsigned char eext_tag = edid_ext[EEXT_TAG];
-		if ((eext_tag == 0x02) && (edid_ext[EEXT_REV] == 0x03)) {
-			show_cea_timing(outfile, edid_ext);
-		} else {
-			char *tagtype;
-			switch (eext_tag) {
-			case 0x01:
-				tagtype = "LCD Timings";
-				break;
-			case 0x02:
-				tagtype = "CEA";
-				break;
-			case 0x20:
-				tagtype = "EDID 2.0";
-				break;
-			case 0x30:
-				tagtype = "Color Information";
-				break;
-			case 0x40:
-				tagtype = "DVI Feature";
-				break;
-			case 0x50:
-				tagtype = "Touch Screen Map";
-				break;
-			case 0xF0:
-				tagtype = "Block Map";
-				break;
-			case 0xFF:
-				tagtype = "Manufacturer";
-				break;
-			default:
-				tagtype = "Unknown";
-			}
-			fprintf(outfile,
-				"EDID %s ext tag 0x%02x rev 0x%02x skipped\n",
-				tagtype, edid_ext[EEXT_TAG],
-				edid_ext[EEXT_REV]);
-		}
-	}
-}
-
-/* Pixel counts normally round to 8 */
-#define CLOSE_ENOUGH(a, b) (abs((a) - (b)) < 16)
-
-/* These match order of defines ASPECT_x_y in edid_utils.h */
-char *aspect_to_str[] = { "16:10", "4:3", "5:4", "16:9" };
-
-int find_aspect(int h, int v)
-{
-	if (CLOSE_ENOUGH((h * 3), (v * 4)))
-		return ASPECT_4_3;
-	if (CLOSE_ENOUGH((h * 4), (v * 5)))
-		return ASPECT_5_4;
-	if (CLOSE_ENOUGH((h * 9), (v * 16)))
-		return ASPECT_16_9;
-	if (CLOSE_ENOUGH((h * 10), (v * 16)))
-		return ASPECT_16_10;
-
-	return -1;
-}
-
-int find_aspect_fromisize(unsigned char *edid_data)
-{
-	int hsiz = edid_data[EDID_MAX_HSIZE];
-	int vsiz = edid_data[EDID_MAX_VSIZE];
-	int res;
-
-	/* Zero size for projector */
-	/* Only use this code if there was no preferred resolution */
-	/* So assume it is an older 4:3 projector not a video one  */
-	if ((hsiz == 0) && (vsiz == 0))
-		return ASPECT_4_3;
-
-	res = find_aspect(hsiz, vsiz);
-
-	/* If things didn't work out, assume the old 4:3 case */
-	if (res < 0)
-		return ASPECT_4_3;
-	else
-		return res;
-}
-
-int edid_get_monitor_name(const unsigned char *edid_data, char *buf,
-			  unsigned int buf_size)
-{
-	int i;
-	const unsigned char *dtd;
-
-	for (i = 0; i < EDID_N_DTDS; i++) {
-		dtd = edid_data + (EDID_DTD_BASE + i * DTD_SIZE);
-		if (dtd[DTD_PCLK_LO] == 0x00 && dtd[DTD_PCLK_HI] == 0x00 &&
-		    dtd[DTD_TYPETAG] == DTDTYPE_NAME) {
-			get_dtd_string((const char *)dtd + DTD_STRING, buf,
-				       buf_size);
-			return 0;
-		}
-	}
-
-	return -1;
-}
diff --git a/cras/src/common/edid_utils.h b/cras/src/common/edid_utils.h
deleted file mode 100644
index b43a6bc..0000000
--- a/cras/src/common/edid_utils.h
+++ /dev/null
@@ -1,204 +0,0 @@
-// Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef __EDID_UTILS_H__
-#define __EDID_UTILS_H__
-
-#include "stdio.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* These match the EDID encoding for Standard Timing block */
-#define ASPECT_16_10 0
-#define ASPECT_4_3 1
-#define ASPECT_5_4 2
-#define ASPECT_16_9 3
-#define N_ASPECTS 4
-
-/* Defines based on EDID and CEA-861D descriptions */
-#define EDID_HDR 0
-#define EDID_MFG_EID 0x8
-#define EDID_MFG_PROD_LO 0x0A
-#define EDID_MFG_PROD_HI 0x0B
-#define EDID_MFG_SERIAL 0x0C
-#define EDID_MFG_WEEK 0x10
-#define EDID_MFG_YEAR 0x11
-#define EDID_VERSION 0x12
-#define EDID_REVISION 0x13
-#define EDID_VIDEO_IN 0x14
-#define EDID_MAX_HSIZE 0x15
-#define EDID_MAX_VSIZE 0x16
-#define EDID_GAMMA 0x17
-#define EDID_FEATURES 0x18
-
-#define EDID_ESTTIME1 0x23
-#define EDID_ESTTIME2 0x24
-#define EDID_MFGTIME 0x25
-/* Next two repeat 8 times for standard timings 1-8 */
-#define EDID_STDTIMEH 0x26
-#define EDID_STDTIMEV 0x27
-#define EDID_N_STDTIME 8
-
-/* There are 4 DTD blocks in the EDID */
-#define EDID_DTD_BASE 0x36
-#define EDID_N_DTDS 4
-
-#define EDID_EXT_FLAG 0x7E
-#define EDID_CSUM 0x7F
-#define EDID_SIZE 0x80
-
-#define EEXT_TAG 0
-#define EEXT_REV 1
-#define EEXT_SIZE 0x80
-
-#define EEDID_SIZE (EDID_SIZE + EEXT_SIZE)
-
-/* 2 byte standard timing structure */
-#define STDTIME_HBASE 248
-#define STDTIME_HMULT 8
-#define STDTIME_VASPECT_SHIFT 6
-#define STDTIME_VREFMINUS60_MASK 0x3f
-#define STDTIME_SIZE 2
-
-/* 18 byte DTD structure */
-#define DTD_PCLK_LO 0
-#define DTD_PCLK_HI 1
-#define DTD_HA_LO 2
-#define DTD_HBL_LO 3
-#define DTD_HABL_HI 4
-#define DTD_VA_LO 5
-#define DTD_VBL_LO 6
-#define DTD_VABL_HI 7
-#define DTD_HSO_LO 8
-#define DTD_HSW_LO 9
-#define DTD_VSX_LO 10
-#define DTD_HVSX_HI 11
-#define DTD_HSIZE_LO 12
-#define DTD_VSIZE_LO 13
-#define DTD_HVSIZE_HI 14
-#define DTD_HBORDER 15
-#define DTD_VBORDER 16
-#define DTD_FLAGS 17
-#define DTD_SIZE 18
-
-/* These apply when PCLK is zero */
-#define DTD_TYPETAG 3
-#define DTD_STRING 5
-#define DTD_MINV_HZ 5
-#define DTD_MAXV_HZ 6
-#define DTD_MINH_kHZ 7
-#define DTD_MAXH_kHZ 8
-#define DTD_MAXCLK_100kHZ 9
-
-/* Types in the TYPETAG field */
-#define DTDTYPE_MANUF 0x0f
-#define DTDTYPE_STDTIME 0xfa
-#define DTDTYPE_COLPOINT 0xfb
-#define DTDTYPE_NAME 0xfc
-#define DTDTYPE_LIMITS 0xfd
-#define DTDTYPE_STRING 0xfe
-#define DTDTYPE_SERIAL 0xff
-
-/* This is the CEA extension version 3 */
-#define CEA_TAG 0
-#define CEA_REV 1
-#define CEA_DTD_OFFSET 2
-/* Next two are low nibble, high nibble of same byte */
-#define CEA_NATIVE_DTDS 3
-#define CEA_SUPPORT 3
-#define CEA_DBC_START 4
-/* Last DBC is at [CEA_DTD_OFFSET]-1, first DTD is at [CEA_DTD_OFFSET] */
-/* Padding needs min of two (gives PCLK=00 in DTD) */
-#define CEA_LAST_PAD 125
-#define CEA_END_PAD 126
-#define CEA_CHECKSUM 127
-
-/* Data Block Collections */
-/* Same byte: upper 3 bits tag, low five length */
-#define DBC_TAG_LENGTH 0
-#define DBC_LEN_MASK 0x1f
-#define DBC_TAG_SHIFT 5
-#define DBC_ETAG 1
-
-#define DBCA_FORMAT 0
-#define DBCA_RATE 1
-#define DBCA_INFO 2
-#define DBCA_SIZE 3
-
-#define DBCA_FMT_LPCM 1
-
-#define DBCV_CODE 0
-#define DBCV_SIZE 1
-
-#define DBCVND_IEEE_LO 0
-#define DBCVND_IEEE_MID 1
-#define DBCVND_IEEE_HI 2
-
-#define DBCVHDMI_CEC_LO 3
-#define DBCVHDMI_CEC_HI 4
-#define DBCVHDMI_SUPPORT 5
-#define DBCVHDMI_MAXTMDS_5MHz 6
-#define DBCVHDMI_LATFLAGS 7
-#define DBCVHDMI_VLAT 8
-#define DBCVHDMI_ALAT 9
-#define DBCVHDMI_IVLAT 10
-#define DBCVHDMI_IALAT 11
-
-#define DBCSP_ALLOC 0
-#define DBCSP_SIZE 3
-
-#define DBC_TAG_AUDIO 1
-#define DBC_TAG_VIDEO 2
-#define DBC_TAG_VENDOR 3
-#define DBC_TAG_SPEAKER 4
-#define DBC_TAG_VESA 5
-#define DBC_TAG_EXTENDED 7
-
-#define DBC_ETAG_VCDB 0
-#define DBC_ETAG_VENDOR_VDB 1
-#define DBC_ETAG_COL 5
-
-#define VCDB_TAG 0
-#define VCDB_ETAG 1
-#define VCDB_FLAGS 2
-#define VCDB_S_PT(x) (((x)&0x30) >> 4)
-#define VCDB_S_IT(x) (((x)&0x0C) >> 2)
-#define VCDB_S_CE(x) (((x)&0x03))
-
-#define COL_TAG 0
-#define COL_ETAG 1
-#define COL_FLAGS 2
-#define COL_META 3
-
-/* Number of test EDID arrays available to get/show_test_edid */
-#define N_TEST_EDIDS 6
-
-int edid_valid(const unsigned char *edid_data);
-int edid_has_hdmi_info(const unsigned char *edid_data, int ext);
-int edid_lpcm_support(const unsigned char *edid_data, int ext);
-void show_edid_data(FILE *outfile, unsigned char *edid_data, int items,
-		    int base);
-void show_edid(FILE *outfile, unsigned char *edid_data, int ext);
-int find_aspect(int h, int v);
-int find_aspect_fromisize(unsigned char *edid_data);
-extern char *aspect_to_str[];
-int get_test_edid(int n, unsigned char *dst);
-int show_test_edid(FILE *outfile, int n);
-
-/* Gets monitor name from EDID.
- * Args:
- *    edid_data - EDID data.
- *    buf - buffer to store monitor name.
- *    buf_size - buffer size.
- */
-int edid_get_monitor_name(const unsigned char *edid_data, char *buf,
-			  unsigned int buf_size);
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif
diff --git a/cras/src/common/packet_status_logger.c b/cras/src/common/packet_status_logger.c
deleted file mode 100644
index f1be696..0000000
--- a/cras/src/common/packet_status_logger.c
+++ /dev/null
@@ -1,35 +0,0 @@
-/* Copyright 2020 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <string.h>
-#include <time.h>
-
-#include "cras_util.h"
-#include "packet_status_logger.h"
-
-void packet_status_logger_init(struct packet_status_logger *logger)
-{
-	memset(logger->data, 0, PACKET_STATUS_LEN_BYTES);
-	logger->size = PACKET_STATUS_LEN_BYTES * 8;
-	logger->wp = 0;
-	logger->num_wraps = 0;
-	clock_gettime(CLOCK_MONOTONIC_RAW, &logger->ts);
-}
-
-void packet_status_logger_update(struct packet_status_logger *logger, bool val)
-{
-	if (val) {
-		logger->data[logger->wp / 8] |= 1UL << (logger->wp % 8);
-	} else {
-		logger->data[logger->wp / 8] &= ~(1UL << (logger->wp % 8));
-	}
-	logger->wp++;
-	if (logger->wp >= logger->size) {
-		logger->wp %= logger->size;
-		logger->num_wraps += 1;
-	}
-	if (logger->wp == 0 || (logger->num_wraps == 0 && logger->wp == 1))
-		clock_gettime(CLOCK_MONOTONIC_RAW, &logger->ts);
-}
diff --git a/cras/src/common/packet_status_logger.h b/cras/src/common/packet_status_logger.h
deleted file mode 100644
index 3bc9004..0000000
--- a/cras/src/common/packet_status_logger.h
+++ /dev/null
@@ -1,127 +0,0 @@
-/* Copyright 2020 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef PACKET_STATUS_LOGGER_
-#define PACKET_STATUS_LOGGER_
-
-#include <stdint.h>
-#include <stdbool.h>
-
-#define PACKET_STATUS_LEN_BYTES 64
-#define WBS_FRAME_NS 7500000
-
-/* Avoid 32, 40, 64 consecutive hex characters so CrOS feedback redact
- * tool doesn't trim our dump. */
-#define PACKET_STATUS_LOG_LINE_WRAP 50
-
-/*
- * Object to log consecutive packets' status.
- * Members:
- *    data - Bytes to store packets' status.
- *    size - Total number of bits in |data|.
- *    wp - Position of the next bit to log packet status.
- *    num_wraps - Number of times the ring buffer has wrapped.
- *    ts - The timestamp of the last time when the first bit of |data| updated.
- */
-struct packet_status_logger {
-	uint8_t data[PACKET_STATUS_LEN_BYTES];
-	int size;
-	int wp;
-	int num_wraps;
-	struct timespec ts;
-};
-
-/* Initializes the packet status logger. */
-void packet_status_logger_init(struct packet_status_logger *logger);
-
-/* Updates the next packet status to logger. */
-void packet_status_logger_update(struct packet_status_logger *logger, bool val);
-
-/* Rewinds logger's time stamp to calculate the beginning.
- * If logger's ring buffer hasn't wrapped, simply return logger_ts.
- * Otherwise beginning_ts = logger_ts - WBS_FRAME_NS * (size - wp)
- */
-static inline void
-packet_status_logger_begin_ts(const struct packet_status_logger *logger,
-			      struct timespec *ts)
-{
-	long nsec = WBS_FRAME_NS * (logger->size - logger->wp);
-
-	*ts = logger->ts;
-	if (logger->num_wraps == 0)
-		return;
-	while (nsec > 1000000000L) {
-		ts->tv_sec--;
-		nsec -= 1000000000L;
-	}
-	ts->tv_nsec -= nsec;
-	if (ts->tv_nsec < 0) {
-		ts->tv_sec--;
-		ts->tv_nsec += 1000000000L;
-	}
-}
-
-/* Fast-forwards the logger's time stamp to calculate the end.
- * In other words, end_ts = logger_ts + WBS_FRAME_NS * wp
- */
-static inline void
-packet_status_logger_end_ts(const struct packet_status_logger *logger,
-			    struct timespec *ts)
-{
-	*ts = logger->ts;
-	ts->tv_nsec += WBS_FRAME_NS * logger->wp;
-	while (ts->tv_nsec > 1000000000L) {
-		ts->tv_sec++;
-		ts->tv_nsec -= 1000000000L;
-	}
-}
-
-/* Prints the logger data in hex format */
-static inline void
-packet_status_logger_dump_hex(const struct packet_status_logger *logger)
-{
-	int i = logger->wp / 8;
-
-	/* Print the bits after wp only if buffer has wrapped. */
-	if (logger->num_wraps) {
-		if (logger->wp % 8)
-			printf("%.2x",
-			       logger->data[i] & (0xff << (logger->wp % 8)));
-		for (; i < PACKET_STATUS_LEN_BYTES; i++)
-			printf("%.2x", logger->data[i]);
-	}
-	for (i = 0; i < logger->wp / 8; i++)
-		printf("%.2x", logger->data[i]);
-	if (logger->wp % 8)
-		printf("%.2x", logger->data[i] & (~(0xff << (logger->wp % 8))));
-	printf("\n");
-}
-
-/* Prints the logger data in binary format */
-static inline void
-packet_status_logger_dump_binary(const struct packet_status_logger *logger)
-{
-	/* Don't print the bits after wp if buffer hasn't wrapped. */
-	int head = logger->num_wraps ? logger->wp : 0;
-	int len = logger->num_wraps ? logger->size : logger->wp;
-	int i, j;
-
-	for (i = 0; i < len; ++i) {
-		j = (head + i) % logger->size;
-		printf("%d", (logger->data[j / 8] >> (j % 8)) & 1U);
-		if ((i + 1) % PACKET_STATUS_LOG_LINE_WRAP == 0)
-			printf("\n");
-	}
-	/* Fill indicator digit 'D' until the last line wraps. */
-	if (len % PACKET_STATUS_LOG_LINE_WRAP) {
-		while (len % PACKET_STATUS_LOG_LINE_WRAP) {
-			printf("D");
-			++len;
-		}
-		printf("\n");
-	}
-}
-
-#endif /* PACKET_STATUS_LOGGER_ */
diff --git a/cras/src/common/rtp.h b/cras/src/common/rtp.h
deleted file mode 100644
index d0fb14a..0000000
--- a/cras/src/common/rtp.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- *
- *  BlueZ - Bluetooth protocol stack for Linux
- *
- *  Copyright (C) 2004-2010  Marcel Holtmann <marcel@holtmann.org>
- *
- *
- *  This library is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public
- *  License as published by the Free Software Foundation; either
- *  version 2.1 of the License, or (at your option) any later version.
- *
- *  This library is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this library; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- *
- */
-
-#if __BYTE_ORDER == __LITTLE_ENDIAN
-
-struct rtp_header {
-	unsigned cc : 4;
-	unsigned x : 1;
-	unsigned p : 1;
-	unsigned v : 2;
-
-	unsigned pt : 7;
-	unsigned m : 1;
-
-	uint16_t sequence_number;
-	uint32_t timestamp;
-	uint32_t ssrc;
-	uint32_t csrc[0];
-} __attribute__((packed));
-
-struct rtp_payload {
-	unsigned frame_count : 4;
-	unsigned rfa0 : 1;
-	unsigned is_last_fragment : 1;
-	unsigned is_first_fragment : 1;
-	unsigned is_fragmented : 1;
-} __attribute__((packed));
-
-#elif __BYTE_ORDER == __BIG_ENDIAN
-
-struct rtp_header {
-	unsigned v : 2;
-	unsigned p : 1;
-	unsigned x : 1;
-	unsigned cc : 4;
-
-	unsigned m : 1;
-	unsigned pt : 7;
-
-	uint16_t sequence_number;
-	uint32_t timestamp;
-	uint32_t ssrc;
-	uint32_t csrc[0];
-} __attribute__((packed));
-
-struct rtp_payload {
-	unsigned is_fragmented : 1;
-	unsigned is_first_fragment : 1;
-	unsigned is_last_fragment : 1;
-	unsigned rfa0 : 1;
-	unsigned frame_count : 4;
-} __attribute__((packed));
-
-#else
-#error "Unknown byte order"
-#endif
diff --git a/cras/src/common/sfh.c b/cras/src/common/sfh.c
deleted file mode 100644
index 56ac755..0000000
--- a/cras/src/common/sfh.c
+++ /dev/null
@@ -1,92 +0,0 @@
-/* Copyright (c) 2010, Paul Hsieh
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * * Redistributions of source code must retain the above copyright notice, this
- *   list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright notice,
- *   this list of conditions and the following disclaimer in the documentation
- *   and/or other materials provided with the distribution.
- * * Neither my name, Paul Hsieh, nor the names of any other contributors to the
- *   code use may not be used to endorse or promote products derived from this
- *   software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <stddef.h>
-#include <stdint.h>
-
-#undef get16bits
-#if (defined(__GNUC__) && defined(__i386__)) || defined(__WATCOMC__) ||        \
-	defined(_MSC_VER) || defined(__BORLANDC__) || defined(__TURBOC__)
-#define get16bits(d) (*((const uint16_t *)(d)))
-#endif
-
-#if !defined(get16bits)
-#define get16bits(d)                                                           \
-	((((uint32_t)(((const uint8_t *)(d))[1])) << 8) +                      \
-	 (uint32_t)(((const uint8_t *)(d))[0]))
-#endif
-
-uint32_t SuperFastHash(const char *data, int len, uint32_t hash)
-{
-	uint32_t tmp;
-	int rem;
-
-	if (len <= 0 || data == NULL)
-		return 0;
-
-	rem = len & 3;
-	len >>= 2;
-
-	/* Main loop */
-	for (; len > 0; len--) {
-		hash += get16bits(data);
-		tmp = (get16bits(data + 2) << 11) ^ hash;
-		hash = (hash << 16) ^ tmp;
-		data += 2 * sizeof(uint16_t);
-		hash += hash >> 11;
-	}
-
-	/* Handle end cases */
-	switch (rem) {
-	case 3:
-		hash += get16bits(data);
-		hash ^= hash << 16;
-		hash ^= ((signed char)data[sizeof(uint16_t)]) << 18;
-		hash += hash >> 11;
-		break;
-	case 2:
-		hash += get16bits(data);
-		hash ^= hash << 11;
-		hash += hash >> 17;
-		break;
-	case 1:
-		hash += (signed char)*data;
-		hash ^= hash << 10;
-		hash += hash >> 1;
-	}
-
-	/* Force "avalanching" of final 127 bits */
-	hash ^= hash << 3;
-	hash += hash >> 5;
-	hash ^= hash << 4;
-	hash += hash >> 17;
-	hash ^= hash << 25;
-	hash += hash >> 6;
-
-	return hash;
-}
diff --git a/cras/src/common/sfh.h b/cras/src/common/sfh.h
deleted file mode 100644
index f68fc91..0000000
--- a/cras/src/common/sfh.h
+++ /dev/null
@@ -1,16 +0,0 @@
-/* Copyright (c) 2015 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- *
- * An incremental version of the SuperFastHash hash function from
- * http://www.azillionmonkeys.com/qed/hash.html
- * The code did not come with its own header file, so declaring the function
- * here.
- */
-
-#ifndef SFH_H_
-#define SFH_H_
-
-uint32_t SuperFastHash(const char *data, int len, uint32_t hash);
-
-#endif /* SFH_H_ */
diff --git a/cras/src/common/utlist.h b/cras/src/common/utlist.h
deleted file mode 100644
index 6c7f1e3..0000000
--- a/cras/src/common/utlist.h
+++ /dev/null
@@ -1,231 +0,0 @@
-/*
-Copyright (c) 2007-2011, Troy D. Hanson   http://uthash.sourceforge.net
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
-IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
-OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef UTLIST_H
-#define UTLIST_H
-
-#define UTLIST_VERSION 1.9.4
-
-#include <assert.h>
-
-/*
- * This file contains macros to manipulate singly and doubly-linked lists.
- *
- * 1. LL_ macros:  singly-linked lists.
- * 2. DL_ macros:  doubly-linked lists.
- * 3. CDL_ macros: circular doubly-linked lists.
- *
- * To use singly-linked lists, your structure must have a "next" pointer.
- * To use doubly-linked lists, your structure must "prev" and "next" pointers.
- * Either way, the pointer to the head of the list must be initialized to NULL.
- *
- * ----------------.EXAMPLE -------------------------
- * struct item {
- *      int id;
- *      struct item *prev, *next;
- * }
- *
- * struct item *list = NULL:
- *
- * int main() {
- *      struct item *item;
- *      ... allocate and populate item ...
- *      DL_APPEND(list, item);
- * }
- * --------------------------------------------------
- *
- * For doubly-linked lists, the append and delete macros are O(1)
- * For singly-linked lists, append and delete are O(n) but prepend is O(1)
- */
-
-/******************************************************************************
- * Singly linked list macros (non-circular).
- *****************************************************************************/
-#define LL_PREPEND(head, add)                                                  \
-	do {                                                                   \
-		(add)->next = head;                                            \
-		head = add;                                                    \
-	} while (0)
-
-#define LL_CONCAT(head1, head2)                                                \
-	do {                                                                   \
-		__typeof(head1) _tmp;                                          \
-		if (head1) {                                                   \
-			_tmp = head1;                                          \
-			while (_tmp->next)                                     \
-				_tmp = _tmp->next;                             \
-			_tmp->next = (head2);                                  \
-		} else                                                         \
-			(head1) = (head2);                                     \
-	} while (0)
-
-#define LL_APPEND(head, add)                                                   \
-	do {                                                                   \
-		__typeof(head) _tmp;                                           \
-		(add)->next = NULL;                                            \
-		if (head) {                                                    \
-			_tmp = head;                                           \
-			while (_tmp->next)                                     \
-				_tmp = _tmp->next;                             \
-			_tmp->next = (add);                                    \
-		} else {                                                       \
-			(head) = (add);                                        \
-		}                                                              \
-	} while (0)
-
-#define LL_DELETE(head, del)                                                   \
-	do {                                                                   \
-		__typeof(head) _tmp;                                           \
-		if ((head) == (del))                                           \
-			(head) = (head)->next;                                 \
-		else {                                                         \
-			_tmp = head;                                           \
-			while (_tmp->next && (_tmp->next != (del)))            \
-				_tmp = _tmp->next;                             \
-			if (_tmp->next)                                        \
-				_tmp->next = ((del)->next);                    \
-		}                                                              \
-	} while (0)
-
-#define LL_FOREACH(head, el) for (el = head; el; el = el->next)
-
-#define LL_FOREACH_SAFE(head, el, tmp)                                         \
-	for ((el) = (head); (el) && (tmp = (el)->next, 1); (el) = tmp)
-
-#define LL_SEARCH_SCALAR(head, out, field, val)                                \
-	do {                                                                   \
-		LL_FOREACH (head, out)                                         \
-			if ((out)->field == (val))                             \
-				break;                                         \
-	} while (0)
-
-#define LL_SEARCH_SCALAR_WITH_CAST(head, out, nout, field, val)                \
-	do {                                                                   \
-		LL_FOREACH (head, out) {                                       \
-			(nout) = (__typeof(nout))out;                          \
-			if ((nout)->field == (val))                            \
-				break;                                         \
-			(nout) = 0;                                            \
-		}                                                              \
-	} while (0)
-
-#define LL_SEARCH(head, out, elt, cmp)                                         \
-	do {                                                                   \
-		LL_FOREACH (head, out)                                         \
-			if ((cmp(out, elt)) == 0)                              \
-				break;                                         \
-	} while (0)
-
-/******************************************************************************
- * Doubly linked list macros (non-circular).
- *****************************************************************************/
-#define DL_PREPEND(head, add)                                                  \
-	do {                                                                   \
-		(add)->next = head;                                            \
-		if (head) {                                                    \
-			(add)->prev = (head)->prev;                            \
-			(head)->prev = (add);                                  \
-		} else                                                         \
-			(add)->prev = (add);                                   \
-		(head) = (add);                                                \
-	} while (0)
-
-#define DL_APPEND(head, add)                                                   \
-	do {                                                                   \
-		if (head) {                                                    \
-			(add)->prev = (head)->prev;                            \
-			(head)->prev->next = (add);                            \
-			(head)->prev = (add);                                  \
-			(add)->next = NULL;                                    \
-		} else {                                                       \
-			(head) = (add);                                        \
-			(head)->prev = (head);                                 \
-			(head)->next = NULL;                                   \
-		}                                                              \
-	} while (0)
-
-#define DL_INSERT(head, next_node, add)                                        \
-	do {                                                                   \
-		if (head == next_node)                                         \
-			DL_PREPEND(head, add);                                 \
-		else if (next_node == NULL) {                                  \
-			DL_APPEND(head, add);                                  \
-		} else {                                                       \
-			(add)->prev = (next_node)->prev;                       \
-			(next_node)->prev->next = (add);                       \
-			(add)->next = (next_node);                             \
-			(next_node)->prev = (add);                             \
-		}                                                              \
-	} while (0)
-
-#define DL_CONCAT(head1, head2)                                                \
-	do {                                                                   \
-		__typeof(head1) _tmp;                                          \
-		if (head2) {                                                   \
-			if (head1) {                                           \
-				_tmp = (head2)->prev;                          \
-				(head2)->prev = (head1)->prev;                 \
-				(head1)->prev->next = (head2);                 \
-				(head1)->prev = _tmp;                          \
-			} else                                                 \
-				(head1) = (head2);                             \
-		}                                                              \
-	} while (0)
-
-#define DL_DELETE(head, del)                                                   \
-	do {                                                                   \
-		assert((head) != NULL);                                        \
-		assert((del)->prev != NULL);                                   \
-		if ((del)->prev == (del)) {                                    \
-			(head) = NULL;                                         \
-		} else if ((del) == (head)) {                                  \
-			(del)->next->prev = (del)->prev;                       \
-			(head) = (del)->next;                                  \
-		} else {                                                       \
-			(del)->prev->next = (del)->next;                       \
-			if ((del)->next)                                       \
-				(del)->next->prev = (del)->prev;               \
-			else                                                   \
-				(head)->prev = (del)->prev;                    \
-		}                                                              \
-	} while (0)
-
-/* Create a variable name using given prefix and current line number. */
-#define MAKE_NAME(prefix) TOKEN_PASTE2(prefix, __LINE__)
-#define TOKEN_PASTE2(x, y) TOKEN_PASTE(x, y)
-#define TOKEN_PASTE(x, y) x##y
-
-/* This version creates a temporary variable to to make it safe for deleting the
- * elements during iteration. */
-#define DL_FOREACH(head, el)                                                   \
-	DL_FOREACH_INTERNAL (head, el, MAKE_NAME(_dl_foreach_))
-#define DL_FOREACH_INTERNAL(head, el, tmp)                                     \
-	__typeof__(el) tmp;                                                    \
-	for ((el) = (head); (el) && (tmp = (el)->next, 1); (el) = tmp)
-
-/* These are identical to their singly-linked list counterparts. */
-#define DL_SEARCH_SCALAR LL_SEARCH_SCALAR
-#define DL_SEARCH_SCALAR_WITH_CAST LL_SEARCH_SCALAR_WITH_CAST
-#define DL_SEARCH LL_SEARCH
-
-#endif /* UTLIST_H */
diff --git a/cras/src/dsp/biquad.c b/cras/src/dsp/biquad.c
deleted file mode 100644
index 337a439..0000000
--- a/cras/src/dsp/biquad.c
+++ /dev/null
@@ -1,381 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-/* Copyright (C) 2010 Google Inc. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE.WEBKIT file.
- */
-
-#include <math.h>
-#include "biquad.h"
-
-#ifndef max
-#define max(a, b)                                                              \
-	({                                                                     \
-		__typeof__(a) _a = (a);                                        \
-		__typeof__(b) _b = (b);                                        \
-		_a > _b ? _a : _b;                                             \
-	})
-#endif
-
-#ifndef min
-#define min(a, b)                                                              \
-	({                                                                     \
-		__typeof__(a) _a = (a);                                        \
-		__typeof__(b) _b = (b);                                        \
-		_a < _b ? _a : _b;                                             \
-	})
-#endif
-
-#ifndef M_PI
-#define M_PI 3.14159265358979323846
-#endif
-
-static void set_coefficient(struct biquad *bq, double b0, double b1, double b2,
-			    double a0, double a1, double a2)
-{
-	double a0_inv = 1 / a0;
-	bq->b0 = b0 * a0_inv;
-	bq->b1 = b1 * a0_inv;
-	bq->b2 = b2 * a0_inv;
-	bq->a1 = a1 * a0_inv;
-	bq->a2 = a2 * a0_inv;
-}
-
-static void biquad_lowpass(struct biquad *bq, double cutoff, double resonance)
-{
-	/* Limit cutoff to 0 to 1. */
-	cutoff = max(0.0, min(cutoff, 1.0));
-
-	if (cutoff == 1 || cutoff == 0) {
-		/* When cutoff is 1, the z-transform is 1.
-		 * When cutoff is zero, nothing gets through the filter, so set
-		 * coefficients up correctly.
-		 */
-		set_coefficient(bq, cutoff, 0, 0, 1, 0, 0);
-		return;
-	}
-
-	/* Compute biquad coefficients for lowpass filter */
-	resonance = max(0.0, resonance); /* can't go negative */
-	double g = pow(10.0, 0.05 * resonance);
-	double d = sqrt((4 - sqrt(16 - 16 / (g * g))) / 2);
-
-	double theta = M_PI * cutoff;
-	double sn = 0.5 * d * sin(theta);
-	double beta = 0.5 * (1 - sn) / (1 + sn);
-	double gamma = (0.5 + beta) * cos(theta);
-	double alpha = 0.25 * (0.5 + beta - gamma);
-
-	double b0 = 2 * alpha;
-	double b1 = 2 * 2 * alpha;
-	double b2 = 2 * alpha;
-	double a1 = 2 * -gamma;
-	double a2 = 2 * beta;
-
-	set_coefficient(bq, b0, b1, b2, 1, a1, a2);
-}
-
-static void biquad_highpass(struct biquad *bq, double cutoff, double resonance)
-{
-	/* Limit cutoff to 0 to 1. */
-	cutoff = max(0.0, min(cutoff, 1.0));
-
-	if (cutoff == 1 || cutoff == 0) {
-		/* When cutoff is one, the z-transform is 0. */
-		/* When cutoff is zero, we need to be careful because the above
-		 * gives a quadratic divided by the same quadratic, with poles
-		 * and zeros on the unit circle in the same place. When cutoff
-		 * is zero, the z-transform is 1.
-		 */
-		set_coefficient(bq, 1 - cutoff, 0, 0, 1, 0, 0);
-		return;
-	}
-
-	/* Compute biquad coefficients for highpass filter */
-	resonance = max(0.0, resonance); /* can't go negative */
-	double g = pow(10.0, 0.05 * resonance);
-	double d = sqrt((4 - sqrt(16 - 16 / (g * g))) / 2);
-
-	double theta = M_PI * cutoff;
-	double sn = 0.5 * d * sin(theta);
-	double beta = 0.5 * (1 - sn) / (1 + sn);
-	double gamma = (0.5 + beta) * cos(theta);
-	double alpha = 0.25 * (0.5 + beta + gamma);
-
-	double b0 = 2 * alpha;
-	double b1 = 2 * -2 * alpha;
-	double b2 = 2 * alpha;
-	double a1 = 2 * -gamma;
-	double a2 = 2 * beta;
-
-	set_coefficient(bq, b0, b1, b2, 1, a1, a2);
-}
-
-static void biquad_bandpass(struct biquad *bq, double frequency, double Q)
-{
-	/* No negative frequencies allowed. */
-	frequency = max(0.0, frequency);
-
-	/* Don't let Q go negative, which causes an unstable filter. */
-	Q = max(0.0, Q);
-
-	if (frequency <= 0 || frequency >= 1) {
-		/* When the cutoff is zero, the z-transform approaches 0, if Q
-		 * > 0. When both Q and cutoff are zero, the z-transform is
-		 * pretty much undefined. What should we do in this case?
-		 * For now, just make the filter 0. When the cutoff is 1, the
-		 * z-transform also approaches 0.
-		 */
-		set_coefficient(bq, 0, 0, 0, 1, 0, 0);
-		return;
-	}
-	if (Q <= 0) {
-		/* When Q = 0, the above formulas have problems. If we
-		 * look at the z-transform, we can see that the limit
-		 * as Q->0 is 1, so set the filter that way.
-		 */
-		set_coefficient(bq, 1, 0, 0, 1, 0, 0);
-		return;
-	}
-
-	double w0 = M_PI * frequency;
-	double alpha = sin(w0) / (2 * Q);
-	double k = cos(w0);
-
-	double b0 = alpha;
-	double b1 = 0;
-	double b2 = -alpha;
-	double a0 = 1 + alpha;
-	double a1 = -2 * k;
-	double a2 = 1 - alpha;
-
-	set_coefficient(bq, b0, b1, b2, a0, a1, a2);
-}
-
-static void biquad_lowshelf(struct biquad *bq, double frequency, double db_gain)
-{
-	/* Clip frequencies to between 0 and 1, inclusive. */
-	frequency = max(0.0, min(frequency, 1.0));
-
-	double A = pow(10.0, db_gain / 40);
-
-	if (frequency == 1) {
-		/* The z-transform is a constant gain. */
-		set_coefficient(bq, A * A, 0, 0, 1, 0, 0);
-		return;
-	}
-	if (frequency <= 0) {
-		/* When frequency is 0, the z-transform is 1. */
-		set_coefficient(bq, 1, 0, 0, 1, 0, 0);
-		return;
-	}
-
-	double w0 = M_PI * frequency;
-	double S = 1; /* filter slope (1 is max value) */
-	double alpha = 0.5 * sin(w0) * sqrt((A + 1 / A) * (1 / S - 1) + 2);
-	double k = cos(w0);
-	double k2 = 2 * sqrt(A) * alpha;
-	double a_plus_one = A + 1;
-	double a_minus_one = A - 1;
-
-	double b0 = A * (a_plus_one - a_minus_one * k + k2);
-	double b1 = 2 * A * (a_minus_one - a_plus_one * k);
-	double b2 = A * (a_plus_one - a_minus_one * k - k2);
-	double a0 = a_plus_one + a_minus_one * k + k2;
-	double a1 = -2 * (a_minus_one + a_plus_one * k);
-	double a2 = a_plus_one + a_minus_one * k - k2;
-
-	set_coefficient(bq, b0, b1, b2, a0, a1, a2);
-}
-
-static void biquad_highshelf(struct biquad *bq, double frequency,
-			     double db_gain)
-{
-	/* Clip frequencies to between 0 and 1, inclusive. */
-	frequency = max(0.0, min(frequency, 1.0));
-
-	double A = pow(10.0, db_gain / 40);
-
-	if (frequency == 1) {
-		/* The z-transform is 1. */
-		set_coefficient(bq, 1, 0, 0, 1, 0, 0);
-		return;
-	}
-	if (frequency <= 0) {
-		/* When frequency = 0, the filter is just a gain, A^2. */
-		set_coefficient(bq, A * A, 0, 0, 1, 0, 0);
-		return;
-	}
-
-	double w0 = M_PI * frequency;
-	double S = 1; /* filter slope (1 is max value) */
-	double alpha = 0.5 * sin(w0) * sqrt((A + 1 / A) * (1 / S - 1) + 2);
-	double k = cos(w0);
-	double k2 = 2 * sqrt(A) * alpha;
-	double a_plus_one = A + 1;
-	double a_minus_one = A - 1;
-
-	double b0 = A * (a_plus_one + a_minus_one * k + k2);
-	double b1 = -2 * A * (a_minus_one + a_plus_one * k);
-	double b2 = A * (a_plus_one + a_minus_one * k - k2);
-	double a0 = a_plus_one - a_minus_one * k + k2;
-	double a1 = 2 * (a_minus_one - a_plus_one * k);
-	double a2 = a_plus_one - a_minus_one * k - k2;
-
-	set_coefficient(bq, b0, b1, b2, a0, a1, a2);
-}
-
-static void biquad_peaking(struct biquad *bq, double frequency, double Q,
-			   double db_gain)
-{
-	/* Clip frequencies to between 0 and 1, inclusive. */
-	frequency = max(0.0, min(frequency, 1.0));
-
-	/* Don't let Q go negative, which causes an unstable filter. */
-	Q = max(0.0, Q);
-
-	double A = pow(10.0, db_gain / 40);
-
-	if (frequency <= 0 || frequency >= 1) {
-		/* When frequency is 0 or 1, the z-transform is 1. */
-		set_coefficient(bq, 1, 0, 0, 1, 0, 0);
-		return;
-	}
-	if (Q <= 0) {
-		/* When Q = 0, the above formulas have problems. If we
-		 * look at the z-transform, we can see that the limit
-		 * as Q->0 is A^2, so set the filter that way.
-		 */
-		set_coefficient(bq, A * A, 0, 0, 1, 0, 0);
-		return;
-	}
-
-	double w0 = M_PI * frequency;
-	double alpha = sin(w0) / (2 * Q);
-	double k = cos(w0);
-
-	double b0 = 1 + alpha * A;
-	double b1 = -2 * k;
-	double b2 = 1 - alpha * A;
-	double a0 = 1 + alpha / A;
-	double a1 = -2 * k;
-	double a2 = 1 - alpha / A;
-
-	set_coefficient(bq, b0, b1, b2, a0, a1, a2);
-}
-
-static void biquad_notch(struct biquad *bq, double frequency, double Q)
-{
-	/* Clip frequencies to between 0 and 1, inclusive. */
-	frequency = max(0.0, min(frequency, 1.0));
-
-	/* Don't let Q go negative, which causes an unstable filter. */
-	Q = max(0.0, Q);
-
-	if (frequency <= 0 || frequency >= 1) {
-		/* When frequency is 0 or 1, the z-transform is 1. */
-		set_coefficient(bq, 1, 0, 0, 1, 0, 0);
-		return;
-	}
-	if (Q <= 0) {
-		/* When Q = 0, the above formulas have problems. If we
-		 * look at the z-transform, we can see that the limit
-		 * as Q->0 is 0, so set the filter that way.
-		 */
-		set_coefficient(bq, 0, 0, 0, 1, 0, 0);
-		return;
-	}
-
-	double w0 = M_PI * frequency;
-	double alpha = sin(w0) / (2 * Q);
-	double k = cos(w0);
-
-	double b0 = 1;
-	double b1 = -2 * k;
-	double b2 = 1;
-	double a0 = 1 + alpha;
-	double a1 = -2 * k;
-	double a2 = 1 - alpha;
-
-	set_coefficient(bq, b0, b1, b2, a0, a1, a2);
-}
-
-static void biquad_allpass(struct biquad *bq, double frequency, double Q)
-{
-	/* Clip frequencies to between 0 and 1, inclusive. */
-	frequency = max(0.0, min(frequency, 1.0));
-
-	/* Don't let Q go negative, which causes an unstable filter. */
-	Q = max(0.0, Q);
-
-	if (frequency <= 0 || frequency >= 1) {
-		/* When frequency is 0 or 1, the z-transform is 1. */
-		set_coefficient(bq, 1, 0, 0, 1, 0, 0);
-		return;
-	}
-
-	if (Q <= 0) {
-		/* When Q = 0, the above formulas have problems. If we
-		 * look at the z-transform, we can see that the limit
-		 * as Q->0 is -1, so set the filter that way.
-		 */
-		set_coefficient(bq, -1, 0, 0, 1, 0, 0);
-		return;
-	}
-
-	double w0 = M_PI * frequency;
-	double alpha = sin(w0) / (2 * Q);
-	double k = cos(w0);
-
-	double b0 = 1 - alpha;
-	double b1 = -2 * k;
-	double b2 = 1 + alpha;
-	double a0 = 1 + alpha;
-	double a1 = -2 * k;
-	double a2 = 1 - alpha;
-
-	set_coefficient(bq, b0, b1, b2, a0, a1, a2);
-}
-
-void biquad_set(struct biquad *bq, enum biquad_type type, double freq, double Q,
-		double gain)
-{
-	/* Default is an identity filter. Also clear history values. */
-	set_coefficient(bq, 1, 0, 0, 1, 0, 0);
-	bq->x1 = 0;
-	bq->x2 = 0;
-	bq->y1 = 0;
-	bq->y2 = 0;
-
-	switch (type) {
-	case BQ_LOWPASS:
-		biquad_lowpass(bq, freq, Q);
-		break;
-	case BQ_HIGHPASS:
-		biquad_highpass(bq, freq, Q);
-		break;
-	case BQ_BANDPASS:
-		biquad_bandpass(bq, freq, Q);
-		break;
-	case BQ_LOWSHELF:
-		biquad_lowshelf(bq, freq, gain);
-		break;
-	case BQ_HIGHSHELF:
-		biquad_highshelf(bq, freq, gain);
-		break;
-	case BQ_PEAKING:
-		biquad_peaking(bq, freq, Q, gain);
-		break;
-	case BQ_NOTCH:
-		biquad_notch(bq, freq, Q);
-		break;
-	case BQ_ALLPASS:
-		biquad_allpass(bq, freq, Q);
-		break;
-	case BQ_NONE:
-		break;
-	}
-}
diff --git a/cras/src/dsp/biquad.h b/cras/src/dsp/biquad.h
deleted file mode 100644
index c584aa9..0000000
--- a/cras/src/dsp/biquad.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef BIQUAD_H_
-#define BIQUAD_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* The biquad filter parameters. The transfer function H(z) is (b0 + b1 * z^(-1)
- * + b2 * z^(-2)) / (1 + a1 * z^(-1) + a2 * z^(-2)).  The previous two inputs
- * are stored in x1 and x2, and the previous two outputs are stored in y1 and
- * y2.
- *
- * We use double during the coefficients calculation for better accurary, but
- * float is used during the actual filtering for faster computation.
- */
-struct biquad {
-	float b0, b1, b2;
-	float a1, a2;
-	float x1, x2;
-	float y1, y2;
-};
-
-/* The type of the biquad filters */
-enum biquad_type {
-	BQ_NONE,
-	BQ_LOWPASS,
-	BQ_HIGHPASS,
-	BQ_BANDPASS,
-	BQ_LOWSHELF,
-	BQ_HIGHSHELF,
-	BQ_PEAKING,
-	BQ_NOTCH,
-	BQ_ALLPASS
-};
-
-/* Initialize a biquad filter parameters from its type and parameters.
- * Args:
- *    bq - The biquad filter we want to set.
- *    type - The type of the biquad filter.
- *    frequency - The value should be in the range [0, 1]. It is relative to
- *        half of the sampling rate.
- *    Q - Quality factor. See Web Audio API for details.
- *    gain - The value is in dB. See Web Audio API for details.
- */
-void biquad_set(struct biquad *bq, enum biquad_type type, double freq, double Q,
-		double gain);
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif /* BIQUAD_H_ */
diff --git a/cras/src/dsp/crossover.c b/cras/src/dsp/crossover.c
deleted file mode 100644
index 48dce89..0000000
--- a/cras/src/dsp/crossover.c
+++ /dev/null
@@ -1,188 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include "crossover.h"
-#include "biquad.h"
-
-static void lr4_set(struct lr4 *lr4, enum biquad_type type, float freq)
-{
-	struct biquad q;
-	biquad_set(&q, type, freq, 0, 0);
-	lr4->b0 = q.b0;
-	lr4->b1 = q.b1;
-	lr4->b2 = q.b2;
-	lr4->a1 = q.a1;
-	lr4->a2 = q.a2;
-	lr4->x1 = 0;
-	lr4->x2 = 0;
-	lr4->y1 = 0;
-	lr4->y2 = 0;
-	lr4->z1 = 0;
-	lr4->z2 = 0;
-}
-
-/* Split input data using two LR4 filters, put the result into the input array
- * and another array.
- *
- * data0 --+-- lp --> data0
- *         |
- *         \-- hp --> data1
- */
-static void lr4_split(struct lr4 *lp, struct lr4 *hp, int count, float *data0,
-		      float *data1)
-{
-	float lx1 = lp->x1;
-	float lx2 = lp->x2;
-	float ly1 = lp->y1;
-	float ly2 = lp->y2;
-	float lz1 = lp->z1;
-	float lz2 = lp->z2;
-	float lb0 = lp->b0;
-	float lb1 = lp->b1;
-	float lb2 = lp->b2;
-	float la1 = lp->a1;
-	float la2 = lp->a2;
-
-	float hx1 = hp->x1;
-	float hx2 = hp->x2;
-	float hy1 = hp->y1;
-	float hy2 = hp->y2;
-	float hz1 = hp->z1;
-	float hz2 = hp->z2;
-	float hb0 = hp->b0;
-	float hb1 = hp->b1;
-	float hb2 = hp->b2;
-	float ha1 = hp->a1;
-	float ha2 = hp->a2;
-
-	int i;
-	for (i = 0; i < count; i++) {
-		float x, y, z;
-		x = data0[i];
-		y = lb0 * x + lb1 * lx1 + lb2 * lx2 - la1 * ly1 - la2 * ly2;
-		z = lb0 * y + lb1 * ly1 + lb2 * ly2 - la1 * lz1 - la2 * lz2;
-		lx2 = lx1;
-		lx1 = x;
-		ly2 = ly1;
-		ly1 = y;
-		lz2 = lz1;
-		lz1 = z;
-		data0[i] = z;
-
-		y = hb0 * x + hb1 * hx1 + hb2 * hx2 - ha1 * hy1 - ha2 * hy2;
-		z = hb0 * y + hb1 * hy1 + hb2 * hy2 - ha1 * hz1 - ha2 * hz2;
-		hx2 = hx1;
-		hx1 = x;
-		hy2 = hy1;
-		hy1 = y;
-		hz2 = hz1;
-		hz1 = z;
-		data1[i] = z;
-	}
-
-	lp->x1 = lx1;
-	lp->x2 = lx2;
-	lp->y1 = ly1;
-	lp->y2 = ly2;
-	lp->z1 = lz1;
-	lp->z2 = lz2;
-
-	hp->x1 = hx1;
-	hp->x2 = hx2;
-	hp->y1 = hy1;
-	hp->y2 = hy2;
-	hp->z1 = hz1;
-	hp->z2 = hz2;
-}
-
-/* Split input data using two LR4 filters and sum them back to the original
- * data array.
- *
- * data --+-- lp --+--> data
- *        |        |
- *        \-- hp --/
- */
-static void lr4_merge(struct lr4 *lp, struct lr4 *hp, int count, float *data)
-{
-	float lx1 = lp->x1;
-	float lx2 = lp->x2;
-	float ly1 = lp->y1;
-	float ly2 = lp->y2;
-	float lz1 = lp->z1;
-	float lz2 = lp->z2;
-	float lb0 = lp->b0;
-	float lb1 = lp->b1;
-	float lb2 = lp->b2;
-	float la1 = lp->a1;
-	float la2 = lp->a2;
-
-	float hx1 = hp->x1;
-	float hx2 = hp->x2;
-	float hy1 = hp->y1;
-	float hy2 = hp->y2;
-	float hz1 = hp->z1;
-	float hz2 = hp->z2;
-	float hb0 = hp->b0;
-	float hb1 = hp->b1;
-	float hb2 = hp->b2;
-	float ha1 = hp->a1;
-	float ha2 = hp->a2;
-
-	int i;
-	for (i = 0; i < count; i++) {
-		float x, y, z;
-		x = data[i];
-		y = lb0 * x + lb1 * lx1 + lb2 * lx2 - la1 * ly1 - la2 * ly2;
-		z = lb0 * y + lb1 * ly1 + lb2 * ly2 - la1 * lz1 - la2 * lz2;
-		lx2 = lx1;
-		lx1 = x;
-		ly2 = ly1;
-		ly1 = y;
-		lz2 = lz1;
-		lz1 = z;
-
-		y = hb0 * x + hb1 * hx1 + hb2 * hx2 - ha1 * hy1 - ha2 * hy2;
-		z = hb0 * y + hb1 * hy1 + hb2 * hy2 - ha1 * hz1 - ha2 * hz2;
-		hx2 = hx1;
-		hx1 = x;
-		hy2 = hy1;
-		hy1 = y;
-		hz2 = hz1;
-		hz1 = z;
-		data[i] = z + lz1;
-	}
-
-	lp->x1 = lx1;
-	lp->x2 = lx2;
-	lp->y1 = ly1;
-	lp->y2 = ly2;
-	lp->z1 = lz1;
-	lp->z2 = lz2;
-
-	hp->x1 = hx1;
-	hp->x2 = hx2;
-	hp->y1 = hy1;
-	hp->y2 = hy2;
-	hp->z1 = hz1;
-	hp->z2 = hz2;
-}
-
-void crossover_init(struct crossover *xo, float freq1, float freq2)
-{
-	int i;
-	for (i = 0; i < 3; i++) {
-		float f = (i == 0) ? freq1 : freq2;
-		lr4_set(&xo->lp[i], BQ_LOWPASS, f);
-		lr4_set(&xo->hp[i], BQ_HIGHPASS, f);
-	}
-}
-
-void crossover_process(struct crossover *xo, int count, float *data0,
-		       float *data1, float *data2)
-{
-	lr4_split(&xo->lp[0], &xo->hp[0], count, data0, data1);
-	lr4_merge(&xo->lp[1], &xo->hp[1], count, data0);
-	lr4_split(&xo->lp[2], &xo->hp[2], count, data1, data2);
-}
diff --git a/cras/src/dsp/crossover.h b/cras/src/dsp/crossover.h
deleted file mode 100644
index 99a601c..0000000
--- a/cras/src/dsp/crossover.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CROSSOVER_H_
-#define CROSSOVER_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* An LR4 filter is two biquads with the same parameters connected in series:
- *
- * x -- [BIQUAD] -- y -- [BIQUAD] -- z
- *
- * Both biquad filter has the same parameter b[012] and a[12],
- * The variable [xyz][12] keep the history values.
- */
-struct lr4 {
-	float b0, b1, b2;
-	float a1, a2;
-	float x1, x2;
-	float y1, y2;
-	float z1, z2;
-};
-
-/* Three bands crossover filter:
- *
- * INPUT --+-- lp0 --+-- lp1 --+---> LOW (0)
- *         |         |         |
- *         |         \-- hp1 --/
- *         |
- *         \-- hp0 --+-- lp2 ------> MID (1)
- *                   |
- *                   \-- hp2 ------> HIGH (2)
- *
- *            [f0]       [f1]
- *
- * Each lp or hp is an LR4 filter, which consists of two second-order
- * lowpass or highpass butterworth filters.
- */
-struct crossover {
-	struct lr4 lp[3], hp[3];
-};
-
-/* Initializes a crossover filter
- * Args:
- *    xo - The crossover filter we want to initialize.
- *    freq1 - The normalized frequency splits low and mid band.
- *    freq2 - The normalized frequency splits mid and high band.
- */
-void crossover_init(struct crossover *xo, float freq1, float freq2);
-
-/* Splits input samples to three bands.
- * Args:
- *    xo - The crossover filter to use.
- *    count - The number of input samples.
- *    data0 - The input samples, also the place to store low band output.
- *    data1 - The place to store mid band output.
- *    data2 - The place to store high band output.
- */
-void crossover_process(struct crossover *xo, int count, float *data0,
-		       float *data1, float *data2);
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif /* CROSSOVER_H_ */
diff --git a/cras/src/dsp/crossover2.c b/cras/src/dsp/crossover2.c
deleted file mode 100644
index 7d7e99c..0000000
--- a/cras/src/dsp/crossover2.c
+++ /dev/null
@@ -1,689 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <string.h>
-#include "crossover2.h"
-#include "biquad.h"
-
-static void lr42_set(struct lr42 *lr42, enum biquad_type type, float freq)
-{
-	struct biquad q;
-	biquad_set(&q, type, freq, 0, 0);
-	memset(lr42, 0, sizeof(*lr42));
-	lr42->b0 = q.b0;
-	lr42->b1 = q.b1;
-	lr42->b2 = q.b2;
-	lr42->a1 = q.a1;
-	lr42->a2 = q.a2;
-}
-
-/* Split input data using two LR4 filters, put the result into the input array
- * and another array.
- *
- * data0 --+-- lp --> data0
- *         |
- *         \-- hp --> data1
- */
-#if defined(__ARM_NEON__)
-#include <arm_neon.h>
-static void lr42_split(struct lr42 *lp, struct lr42 *hp, int count,
-		       float *data0L, float *data0R, float *data1L,
-		       float *data1R)
-{
-	float32x4_t x1 = { lp->x1L, hp->x1L, lp->x1R, hp->x1R };
-	float32x4_t x2 = { lp->x2L, hp->x2L, lp->x2R, hp->x2R };
-	float32x4_t y1 = { lp->y1L, hp->y1L, lp->y1R, hp->y1R };
-	float32x4_t y2 = { lp->y2L, hp->y2L, lp->y2R, hp->y2R };
-	float32x4_t z1 = { lp->z1L, hp->z1L, lp->z1R, hp->z1R };
-	float32x4_t z2 = { lp->z2L, hp->z2L, lp->z2R, hp->z2R };
-	float32x4_t b0 = { lp->b0, hp->b0, lp->b0, hp->b0 };
-	float32x4_t b1 = { lp->b1, hp->b1, lp->b1, hp->b1 };
-	float32x4_t b2 = { lp->b2, hp->b2, lp->b2, hp->b2 };
-	float32x4_t a1 = { lp->a1, hp->a1, lp->a1, hp->a1 };
-	float32x4_t a2 = { lp->a2, hp->a2, lp->a2, hp->a2 };
-
-	// clang-format off
-	__asm__ __volatile__(
-		/* q0 = x, q1 = y, q2 = z */
-		"1:                                     \n"
-		"vmul.f32 q1, %q[b1], %q[x1]            \n"
-		"vld1.32 d0[], [%[data0L]]              \n"
-		"vld1.32 d1[], [%[data0R]]              \n"
-		"subs %[count], #1                      \n"
-		"vmul.f32 q2, %q[b1], %q[y1]            \n"
-		"vmla.f32 q1, %q[b0], q0                \n"
-		"vmla.f32 q1, %q[b2], %q[x2]            \n"
-		"vmov.f32 %q[x2], %q[x1]                \n"
-		"vmov.f32 %q[x1], q0                    \n"
-		"vmls.f32 q1, %q[a1], %q[y1]            \n"
-		"vmls.f32 q1, %q[a2], %q[y2]            \n"
-		"vmla.f32 q2, %q[b0], q1                \n"
-		"vmla.f32 q2, %q[b2], %q[y2]            \n"
-		"vmov.f32 %q[y2], %q[y1]                \n"
-		"vmov.f32 %q[y1], q1                    \n"
-		"vmls.f32 q2, %q[a1], %q[z1]            \n"
-		"vmls.f32 q2, %q[a2], %q[z2]            \n"
-		"vmov.f32 %q[z2], %q[z1]                \n"
-		"vmov.f32 %q[z1], q2                    \n"
-		"vst1.f32 d4[0], [%[data0L]]!           \n"
-		"vst1.f32 d4[1], [%[data1L]]!           \n"
-		"vst1.f32 d5[0], [%[data0R]]!           \n"
-		"vst1.f32 d5[1], [%[data1R]]!           \n"
-		"bne 1b                                 \n"
-		: /* output */
-		  "=r"(data0L),
-		  "=r"(data0R),
-		  "=r"(data1L),
-		  "=r"(data1R),
-		  "=r"(count),
-		  [x1]"+w"(x1),
-		  [x2]"+w"(x2),
-		  [y1]"+w"(y1),
-		  [y2]"+w"(y2),
-		  [z1]"+w"(z1),
-		  [z2]"+w"(z2)
-		: /* input */
-		  [data0L]"0"(data0L),
-		  [data0R]"1"(data0R),
-		  [data1L]"2"(data1L),
-		  [data1R]"3"(data1R),
-		  [count]"4"(count),
-		  [b0]"w"(b0),
-		  [b1]"w"(b1),
-		  [b2]"w"(b2),
-		  [a1]"w"(a1),
-		  [a2]"w"(a2)
-		: /* clobber */
-		  "q0", "q1", "q2", "memory", "cc");
-	// clang-format on
-
-	lp->x1L = x1[0];
-	lp->x1R = x1[2];
-	lp->x2L = x2[0];
-	lp->x2R = x2[2];
-	lp->y1L = y1[0];
-	lp->y1R = y1[2];
-	lp->y2L = y2[0];
-	lp->y2R = y2[2];
-	lp->z1L = z1[0];
-	lp->z1R = z1[2];
-	lp->z2L = z2[0];
-	lp->z2R = z2[2];
-
-	hp->x1L = x1[1];
-	hp->x1R = x1[3];
-	hp->x2L = x2[1];
-	hp->x2R = x2[3];
-	hp->y1L = y1[1];
-	hp->y1R = y1[3];
-	hp->y2L = y2[1];
-	hp->y2R = y2[3];
-	hp->z1L = z1[1];
-	hp->z1R = z1[3];
-	hp->z2L = z2[1];
-	hp->z2R = z2[3];
-}
-#elif defined(__SSE3__) && defined(__x86_64__)
-#include <emmintrin.h>
-static void lr42_split(struct lr42 *lp, struct lr42 *hp, int count,
-		       float *data0L, float *data0R, float *data1L,
-		       float *data1R)
-{
-	__m128 x1 = { lp->x1L, hp->x1L, lp->x1R, hp->x1R };
-	__m128 x2 = { lp->x2L, hp->x2L, lp->x2R, hp->x2R };
-	__m128 y1 = { lp->y1L, hp->y1L, lp->y1R, hp->y1R };
-	__m128 y2 = { lp->y2L, hp->y2L, lp->y2R, hp->y2R };
-	__m128 z1 = { lp->z1L, hp->z1L, lp->z1R, hp->z1R };
-	__m128 z2 = { lp->z2L, hp->z2L, lp->z2R, hp->z2R };
-	__m128 b0 = { lp->b0, hp->b0, lp->b0, hp->b0 };
-	__m128 b1 = { lp->b1, hp->b1, lp->b1, hp->b1 };
-	__m128 b2 = { lp->b2, hp->b2, lp->b2, hp->b2 };
-	__m128 a1 = { lp->a1, hp->a1, lp->a1, hp->a1 };
-	__m128 a2 = { lp->a2, hp->a2, lp->a2, hp->a2 };
-
-	// clang-format off
-	__asm__ __volatile__(
-		"1:                                     \n"
-		"movss (%[data0L]), %%xmm2              \n"
-		"movss (%[data0R]), %%xmm1              \n"
-		"shufps $0, %%xmm1, %%xmm2              \n"
-		"mulps %[b2],%[x2]                      \n"
-		"movaps %[b0], %%xmm0                   \n"
-		"mulps %[a2],%[z2]                      \n"
-		"movaps %[b1], %%xmm1                   \n"
-		"mulps %%xmm2,%%xmm0                    \n"
-		"mulps %[x1],%%xmm1                     \n"
-		"addps %%xmm1,%%xmm0                    \n"
-		"movaps %[a1],%%xmm1                    \n"
-		"mulps %[y1],%%xmm1                     \n"
-		"addps %[x2],%%xmm0                     \n"
-		"movaps %[b1],%[x2]                     \n"
-		"mulps %[y1],%[x2]                      \n"
-		"subps %%xmm1,%%xmm0                    \n"
-		"movaps %[a2],%%xmm1                    \n"
-		"mulps %[y2],%%xmm1                     \n"
-		"mulps %[b2],%[y2]                      \n"
-		"subps %%xmm1,%%xmm0                    \n"
-		"movaps %[b0],%%xmm1                    \n"
-		"mulps %%xmm0,%%xmm1                    \n"
-		"addps %[x2],%%xmm1                     \n"
-		"movaps %[x1],%[x2]                     \n"
-		"movaps %%xmm2,%[x1]                    \n"
-		"addps %[y2],%%xmm1                     \n"
-		"movaps %[a1],%[y2]                     \n"
-		"mulps %[z1],%[y2]                      \n"
-		"subps %[y2],%%xmm1                     \n"
-		"movaps %[y1],%[y2]                     \n"
-		"movaps %%xmm0,%[y1]                    \n"
-		"subps %[z2],%%xmm1                     \n"
-		"movaps %[z1],%[z2]                     \n"
-		"movaps %%xmm1,%[z1]                    \n"
-		"movss %%xmm1, (%[data0L])              \n"
-		"shufps $0x39, %%xmm1, %%xmm1           \n"
-		"movss %%xmm1, (%[data1L])              \n"
-		"shufps $0x39, %%xmm1, %%xmm1           \n"
-		"movss %%xmm1, (%[data0R])              \n"
-		"shufps $0x39, %%xmm1, %%xmm1           \n"
-		"movss %%xmm1, (%[data1R])              \n"
-		"add $4, %[data0L]                      \n"
-		"add $4, %[data1L]                      \n"
-		"add $4, %[data0R]                      \n"
-		"add $4, %[data1R]                      \n"
-		"sub $1, %[count]                       \n"
-		"jnz 1b                                 \n"
-		: /* output */
-		  [data0L]"+r"(data0L),
-		  [data0R]"+r"(data0R),
-		  [data1L]"+r"(data1L),
-		  [data1R]"+r"(data1R),
-		  [count]"+r"(count),
-		  [x1]"+x"(x1),
-		  [x2]"+x"(x2),
-		  [y1]"+x"(y1),
-		  [y2]"+x"(y2),
-		  [z1]"+x"(z1),
-		  [z2]"+x"(z2)
-		: /* input */
-		  [b0]"x"(b0),
-		  [b1]"x"(b1),
-		  [b2]"x"(b2),
-		  [a1]"x"(a1),
-		  [a2]"x"(a2)
-		: /* clobber */
-		  "xmm0", "xmm1", "xmm2", "memory", "cc");
-	// clang-format on
-
-	lp->x1L = x1[0];
-	lp->x1R = x1[2];
-	lp->x2L = x2[0];
-	lp->x2R = x2[2];
-	lp->y1L = y1[0];
-	lp->y1R = y1[2];
-	lp->y2L = y2[0];
-	lp->y2R = y2[2];
-	lp->z1L = z1[0];
-	lp->z1R = z1[2];
-	lp->z2L = z2[0];
-	lp->z2R = z2[2];
-
-	hp->x1L = x1[1];
-	hp->x1R = x1[3];
-	hp->x2L = x2[1];
-	hp->x2R = x2[3];
-	hp->y1L = y1[1];
-	hp->y1R = y1[3];
-	hp->y2L = y2[1];
-	hp->y2R = y2[3];
-	hp->z1L = z1[1];
-	hp->z1R = z1[3];
-	hp->z2L = z2[1];
-	hp->z2R = z2[3];
-}
-#else
-static void lr42_split(struct lr42 *lp, struct lr42 *hp, int count,
-		       float *data0L, float *data0R, float *data1L,
-		       float *data1R)
-{
-	float lx1L = lp->x1L, lx1R = lp->x1R;
-	float lx2L = lp->x2L, lx2R = lp->x2R;
-	float ly1L = lp->y1L, ly1R = lp->y1R;
-	float ly2L = lp->y2L, ly2R = lp->y2R;
-	float lz1L = lp->z1L, lz1R = lp->z1R;
-	float lz2L = lp->z2L, lz2R = lp->z2R;
-	float lb0 = lp->b0;
-	float lb1 = lp->b1;
-	float lb2 = lp->b2;
-	float la1 = lp->a1;
-	float la2 = lp->a2;
-
-	float hx1L = hp->x1L, hx1R = hp->x1R;
-	float hx2L = hp->x2L, hx2R = hp->x2R;
-	float hy1L = hp->y1L, hy1R = hp->y1R;
-	float hy2L = hp->y2L, hy2R = hp->y2R;
-	float hz1L = hp->z1L, hz1R = hp->z1R;
-	float hz2L = hp->z2L, hz2R = hp->z2R;
-	float hb0 = hp->b0;
-	float hb1 = hp->b1;
-	float hb2 = hp->b2;
-	float ha1 = hp->a1;
-	float ha2 = hp->a2;
-
-	int i;
-	for (i = 0; i < count; i++) {
-		float xL, yL, zL, xR, yR, zR;
-		xL = data0L[i];
-		xR = data0R[i];
-		yL = lb0 * xL + lb1 * lx1L + lb2 * lx2L - la1 * ly1L -
-		     la2 * ly2L;
-		yR = lb0 * xR + lb1 * lx1R + lb2 * lx2R - la1 * ly1R -
-		     la2 * ly2R;
-		zL = lb0 * yL + lb1 * ly1L + lb2 * ly2L - la1 * lz1L -
-		     la2 * lz2L;
-		zR = lb0 * yR + lb1 * ly1R + lb2 * ly2R - la1 * lz1R -
-		     la2 * lz2R;
-		lx2L = lx1L;
-		lx2R = lx1R;
-		lx1L = xL;
-		lx1R = xR;
-		ly2L = ly1L;
-		ly2R = ly1R;
-		ly1L = yL;
-		ly1R = yR;
-		lz2L = lz1L;
-		lz2R = lz1R;
-		lz1L = zL;
-		lz1R = zR;
-		data0L[i] = zL;
-		data0R[i] = zR;
-
-		yL = hb0 * xL + hb1 * hx1L + hb2 * hx2L - ha1 * hy1L -
-		     ha2 * hy2L;
-		yR = hb0 * xR + hb1 * hx1R + hb2 * hx2R - ha1 * hy1R -
-		     ha2 * hy2R;
-		zL = hb0 * yL + hb1 * hy1L + hb2 * hy2L - ha1 * hz1L -
-		     ha2 * hz2L;
-		zR = hb0 * yR + hb1 * hy1R + hb2 * hy2R - ha1 * hz1R -
-		     ha2 * hz2R;
-		hx2L = hx1L;
-		hx2R = hx1R;
-		hx1L = xL;
-		hx1R = xR;
-		hy2L = hy1L;
-		hy2R = hy1R;
-		hy1L = yL;
-		hy1R = yR;
-		hz2L = hz1L;
-		hz2R = hz1R;
-		hz1L = zL;
-		hz1R = zR;
-		data1L[i] = zL;
-		data1R[i] = zR;
-	}
-
-	lp->x1L = lx1L;
-	lp->x1R = lx1R;
-	lp->x2L = lx2L;
-	lp->x2R = lx2R;
-	lp->y1L = ly1L;
-	lp->y1R = ly1R;
-	lp->y2L = ly2L;
-	lp->y2R = ly2R;
-	lp->z1L = lz1L;
-	lp->z1R = lz1R;
-	lp->z2L = lz2L;
-	lp->z2R = lz2R;
-
-	hp->x1L = hx1L;
-	hp->x1R = hx1R;
-	hp->x2L = hx2L;
-	hp->x2R = hx2R;
-	hp->y1L = hy1L;
-	hp->y1R = hy1R;
-	hp->y2L = hy2L;
-	hp->y2R = hy2R;
-	hp->z1L = hz1L;
-	hp->z1R = hz1R;
-	hp->z2L = hz2L;
-	hp->z2R = hz2R;
-}
-#endif
-
-/* Split input data using two LR4 filters and sum them back to the original
- * data array.
- *
- * data --+-- lp --+--> data
- *        |        |
- *        \-- hp --/
- */
-#if defined(__ARM_NEON__)
-#include <arm_neon.h>
-static void lr42_merge(struct lr42 *lp, struct lr42 *hp, int count,
-		       float *dataL, float *dataR)
-{
-	float32x4_t x1 = { lp->x1L, hp->x1L, lp->x1R, hp->x1R };
-	float32x4_t x2 = { lp->x2L, hp->x2L, lp->x2R, hp->x2R };
-	float32x4_t y1 = { lp->y1L, hp->y1L, lp->y1R, hp->y1R };
-	float32x4_t y2 = { lp->y2L, hp->y2L, lp->y2R, hp->y2R };
-	float32x4_t z1 = { lp->z1L, hp->z1L, lp->z1R, hp->z1R };
-	float32x4_t z2 = { lp->z2L, hp->z2L, lp->z2R, hp->z2R };
-	float32x4_t b0 = { lp->b0, hp->b0, lp->b0, hp->b0 };
-	float32x4_t b1 = { lp->b1, hp->b1, lp->b1, hp->b1 };
-	float32x4_t b2 = { lp->b2, hp->b2, lp->b2, hp->b2 };
-	float32x4_t a1 = { lp->a1, hp->a1, lp->a1, hp->a1 };
-	float32x4_t a2 = { lp->a2, hp->a2, lp->a2, hp->a2 };
-
-	// clang-format off
-	__asm__ __volatile__(
-		/* q0 = x, q1 = y, q2 = z */
-		"1:                                     \n"
-		"vmul.f32 q1, %q[b1], %q[x1]            \n"
-		"vld1.32 d0[], [%[dataL]]               \n"
-		"vld1.32 d1[], [%[dataR]]               \n"
-		"subs %[count], #1                      \n"
-		"vmul.f32 q2, %q[b1], %q[y1]            \n"
-		"vmla.f32 q1, %q[b0], q0                \n"
-		"vmla.f32 q1, %q[b2], %q[x2]            \n"
-		"vmov.f32 %q[x2], %q[x1]                \n"
-		"vmov.f32 %q[x1], q0                    \n"
-		"vmls.f32 q1, %q[a1], %q[y1]            \n"
-		"vmls.f32 q1, %q[a2], %q[y2]            \n"
-		"vmla.f32 q2, %q[b0], q1                \n"
-		"vmla.f32 q2, %q[b2], %q[y2]            \n"
-		"vmov.f32 %q[y2], %q[y1]                \n"
-		"vmov.f32 %q[y1], q1                    \n"
-		"vmls.f32 q2, %q[a1], %q[z1]            \n"
-		"vmls.f32 q2, %q[a2], %q[z2]            \n"
-		"vmov.f32 %q[z2], %q[z1]                \n"
-		"vmov.f32 %q[z1], q2                    \n"
-		"vpadd.f32 d4, d4, d5                   \n"
-		"vst1.f32 d4[0], [%[dataL]]!            \n"
-		"vst1.f32 d4[1], [%[dataR]]!            \n"
-		"bne 1b                                 \n"
-		: /* output */
-		  "=r"(dataL),
-		  "=r"(dataR),
-		  "=r"(count),
-		  [x1]"+w"(x1),
-		  [x2]"+w"(x2),
-		  [y1]"+w"(y1),
-		  [y2]"+w"(y2),
-		  [z1]"+w"(z1),
-		  [z2]"+w"(z2)
-		: /* input */
-		  [dataL]"0"(dataL),
-		  [dataR]"1"(dataR),
-		  [count]"2"(count),
-		  [b0]"w"(b0),
-		  [b1]"w"(b1),
-		  [b2]"w"(b2),
-		  [a1]"w"(a1),
-		  [a2]"w"(a2)
-		: /* clobber */
-		  "q0", "q1", "q2", "memory", "cc");
-	// clang-format on
-
-	lp->x1L = x1[0];
-	lp->x1R = x1[2];
-	lp->x2L = x2[0];
-	lp->x2R = x2[2];
-	lp->y1L = y1[0];
-	lp->y1R = y1[2];
-	lp->y2L = y2[0];
-	lp->y2R = y2[2];
-	lp->z1L = z1[0];
-	lp->z1R = z1[2];
-	lp->z2L = z2[0];
-	lp->z2R = z2[2];
-
-	hp->x1L = x1[1];
-	hp->x1R = x1[3];
-	hp->x2L = x2[1];
-	hp->x2R = x2[3];
-	hp->y1L = y1[1];
-	hp->y1R = y1[3];
-	hp->y2L = y2[1];
-	hp->y2R = y2[3];
-	hp->z1L = z1[1];
-	hp->z1R = z1[3];
-	hp->z2L = z2[1];
-	hp->z2R = z2[3];
-}
-#elif defined(__SSE3__) && defined(__x86_64__)
-#include <emmintrin.h>
-static void lr42_merge(struct lr42 *lp, struct lr42 *hp, int count,
-		       float *dataL, float *dataR)
-{
-	__m128 x1 = { lp->x1L, hp->x1L, lp->x1R, hp->x1R };
-	__m128 x2 = { lp->x2L, hp->x2L, lp->x2R, hp->x2R };
-	__m128 y1 = { lp->y1L, hp->y1L, lp->y1R, hp->y1R };
-	__m128 y2 = { lp->y2L, hp->y2L, lp->y2R, hp->y2R };
-	__m128 z1 = { lp->z1L, hp->z1L, lp->z1R, hp->z1R };
-	__m128 z2 = { lp->z2L, hp->z2L, lp->z2R, hp->z2R };
-	__m128 b0 = { lp->b0, hp->b0, lp->b0, hp->b0 };
-	__m128 b1 = { lp->b1, hp->b1, lp->b1, hp->b1 };
-	__m128 b2 = { lp->b2, hp->b2, lp->b2, hp->b2 };
-	__m128 a1 = { lp->a1, hp->a1, lp->a1, hp->a1 };
-	__m128 a2 = { lp->a2, hp->a2, lp->a2, hp->a2 };
-
-	// clang-format off
-	__asm__ __volatile__(
-		"1:                                     \n"
-		"movss (%[dataL]), %%xmm2               \n"
-		"movss (%[dataR]), %%xmm1               \n"
-		"shufps $0, %%xmm1, %%xmm2              \n"
-		"mulps %[b2],%[x2]                      \n"
-		"movaps %[b0], %%xmm0                   \n"
-		"mulps %[a2],%[z2]                      \n"
-		"movaps %[b1], %%xmm1                   \n"
-		"mulps %%xmm2,%%xmm0                    \n"
-		"mulps %[x1],%%xmm1                     \n"
-		"addps %%xmm1,%%xmm0                    \n"
-		"movaps %[a1],%%xmm1                    \n"
-		"mulps %[y1],%%xmm1                     \n"
-		"addps %[x2],%%xmm0                     \n"
-		"movaps %[b1],%[x2]                     \n"
-		"mulps %[y1],%[x2]                      \n"
-		"subps %%xmm1,%%xmm0                    \n"
-		"movaps %[a2],%%xmm1                    \n"
-		"mulps %[y2],%%xmm1                     \n"
-		"mulps %[b2],%[y2]                      \n"
-		"subps %%xmm1,%%xmm0                    \n"
-		"movaps %[b0],%%xmm1                    \n"
-		"mulps %%xmm0,%%xmm1                    \n"
-		"addps %[x2],%%xmm1                     \n"
-		"movaps %[x1],%[x2]                     \n"
-		"movaps %%xmm2,%[x1]                    \n"
-		"addps %[y2],%%xmm1                     \n"
-		"movaps %[a1],%[y2]                     \n"
-		"mulps %[z1],%[y2]                      \n"
-		"subps %[y2],%%xmm1                     \n"
-		"movaps %[y1],%[y2]                     \n"
-		"movaps %%xmm0,%[y1]                    \n"
-		"subps %[z2],%%xmm1                     \n"
-		"movaps %[z1],%[z2]                     \n"
-		"movaps %%xmm1,%[z1]                    \n"
-		"haddps %%xmm1, %%xmm1                  \n"
-		"movss %%xmm1, (%[dataL])               \n"
-		"shufps $0x39, %%xmm1, %%xmm1           \n"
-		"movss %%xmm1, (%[dataR])               \n"
-		"add $4, %[dataL]                       \n"
-		"add $4, %[dataR]                       \n"
-		"sub $1, %[count]                       \n"
-		"jnz 1b                                 \n"
-		: /* output */
-		  [dataL]"+r"(dataL),
-		  [dataR]"+r"(dataR),
-		  [count]"+r"(count),
-		  [x1]"+x"(x1),
-		  [x2]"+x"(x2),
-		  [y1]"+x"(y1),
-		  [y2]"+x"(y2),
-		  [z1]"+x"(z1),
-		  [z2]"+x"(z2)
-		: /* input */
-		  [b0]"x"(b0),
-		  [b1]"x"(b1),
-		  [b2]"x"(b2),
-		  [a1]"x"(a1),
-		  [a2]"x"(a2)
-		: /* clobber */
-		  "xmm0", "xmm1", "xmm2", "memory", "cc");
-	// clang-format on
-
-	lp->x1L = x1[0];
-	lp->x1R = x1[2];
-	lp->x2L = x2[0];
-	lp->x2R = x2[2];
-	lp->y1L = y1[0];
-	lp->y1R = y1[2];
-	lp->y2L = y2[0];
-	lp->y2R = y2[2];
-	lp->z1L = z1[0];
-	lp->z1R = z1[2];
-	lp->z2L = z2[0];
-	lp->z2R = z2[2];
-
-	hp->x1L = x1[1];
-	hp->x1R = x1[3];
-	hp->x2L = x2[1];
-	hp->x2R = x2[3];
-	hp->y1L = y1[1];
-	hp->y1R = y1[3];
-	hp->y2L = y2[1];
-	hp->y2R = y2[3];
-	hp->z1L = z1[1];
-	hp->z1R = z1[3];
-	hp->z2L = z2[1];
-	hp->z2R = z2[3];
-}
-#else
-static void lr42_merge(struct lr42 *lp, struct lr42 *hp, int count,
-		       float *dataL, float *dataR)
-{
-	float lx1L = lp->x1L, lx1R = lp->x1R;
-	float lx2L = lp->x2L, lx2R = lp->x2R;
-	float ly1L = lp->y1L, ly1R = lp->y1R;
-	float ly2L = lp->y2L, ly2R = lp->y2R;
-	float lz1L = lp->z1L, lz1R = lp->z1R;
-	float lz2L = lp->z2L, lz2R = lp->z2R;
-	float lb0 = lp->b0;
-	float lb1 = lp->b1;
-	float lb2 = lp->b2;
-	float la1 = lp->a1;
-	float la2 = lp->a2;
-
-	float hx1L = hp->x1L, hx1R = hp->x1R;
-	float hx2L = hp->x2L, hx2R = hp->x2R;
-	float hy1L = hp->y1L, hy1R = hp->y1R;
-	float hy2L = hp->y2L, hy2R = hp->y2R;
-	float hz1L = hp->z1L, hz1R = hp->z1R;
-	float hz2L = hp->z2L, hz2R = hp->z2R;
-	float hb0 = hp->b0;
-	float hb1 = hp->b1;
-	float hb2 = hp->b2;
-	float ha1 = hp->a1;
-	float ha2 = hp->a2;
-
-	int i;
-	for (i = 0; i < count; i++) {
-		float xL, yL, zL, xR, yR, zR;
-		xL = dataL[i];
-		xR = dataR[i];
-		yL = lb0 * xL + lb1 * lx1L + lb2 * lx2L - la1 * ly1L -
-		     la2 * ly2L;
-		yR = lb0 * xR + lb1 * lx1R + lb2 * lx2R - la1 * ly1R -
-		     la2 * ly2R;
-		zL = lb0 * yL + lb1 * ly1L + lb2 * ly2L - la1 * lz1L -
-		     la2 * lz2L;
-		zR = lb0 * yR + lb1 * ly1R + lb2 * ly2R - la1 * lz1R -
-		     la2 * lz2R;
-		lx2L = lx1L;
-		lx2R = lx1R;
-		lx1L = xL;
-		lx1R = xR;
-		ly2L = ly1L;
-		ly2R = ly1R;
-		ly1L = yL;
-		ly1R = yR;
-		lz2L = lz1L;
-		lz2R = lz1R;
-		lz1L = zL;
-		lz1R = zR;
-
-		yL = hb0 * xL + hb1 * hx1L + hb2 * hx2L - ha1 * hy1L -
-		     ha2 * hy2L;
-		yR = hb0 * xR + hb1 * hx1R + hb2 * hx2R - ha1 * hy1R -
-		     ha2 * hy2R;
-		zL = hb0 * yL + hb1 * hy1L + hb2 * hy2L - ha1 * hz1L -
-		     ha2 * hz2L;
-		zR = hb0 * yR + hb1 * hy1R + hb2 * hy2R - ha1 * hz1R -
-		     ha2 * hz2R;
-		hx2L = hx1L;
-		hx2R = hx1R;
-		hx1L = xL;
-		hx1R = xR;
-		hy2L = hy1L;
-		hy2R = hy1R;
-		hy1L = yL;
-		hy1R = yR;
-		hz2L = hz1L;
-		hz2R = hz1R;
-		hz1L = zL;
-		hz1R = zR;
-		dataL[i] = zL + lz1L;
-		dataR[i] = zR + lz1R;
-	}
-
-	lp->x1L = lx1L;
-	lp->x1R = lx1R;
-	lp->x2L = lx2L;
-	lp->x2R = lx2R;
-	lp->y1L = ly1L;
-	lp->y1R = ly1R;
-	lp->y2L = ly2L;
-	lp->y2R = ly2R;
-	lp->z1L = lz1L;
-	lp->z1R = lz1R;
-	lp->z2L = lz2L;
-	lp->z2R = lz2R;
-
-	hp->x1L = hx1L;
-	hp->x1R = hx1R;
-	hp->x2L = hx2L;
-	hp->x2R = hx2R;
-	hp->y1L = hy1L;
-	hp->y1R = hy1R;
-	hp->y2L = hy2L;
-	hp->y2R = hy2R;
-	hp->z1L = hz1L;
-	hp->z1R = hz1R;
-	hp->z2L = hz2L;
-	hp->z2R = hz2R;
-}
-#endif
-
-void crossover2_init(struct crossover2 *xo2, float freq1, float freq2)
-{
-	int i;
-	for (i = 0; i < 3; i++) {
-		float f = (i == 0) ? freq1 : freq2;
-		lr42_set(&xo2->lp[i], BQ_LOWPASS, f);
-		lr42_set(&xo2->hp[i], BQ_HIGHPASS, f);
-	}
-}
-
-void crossover2_process(struct crossover2 *xo2, int count, float *data0L,
-			float *data0R, float *data1L, float *data1R,
-			float *data2L, float *data2R)
-{
-	if (!count)
-		return;
-
-	lr42_split(&xo2->lp[0], &xo2->hp[0], count, data0L, data0R, data1L,
-		   data1R);
-	lr42_merge(&xo2->lp[1], &xo2->hp[1], count, data0L, data0R);
-	lr42_split(&xo2->lp[2], &xo2->hp[2], count, data1L, data1R, data2L,
-		   data2R);
-}
diff --git a/cras/src/dsp/crossover2.h b/cras/src/dsp/crossover2.h
deleted file mode 100644
index 9afa0e8..0000000
--- a/cras/src/dsp/crossover2.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CROSSOVER2_H_
-#define CROSSOVER2_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* "crossover2" is a two channel version of the "crossover" filter. It processes
- * two channels of data at once to increase performance. */
-
-/* An LR4 filter is two biquads with the same parameters connected in series:
- *
- * x -- [BIQUAD] -- y -- [BIQUAD] -- z
- *
- * Both biquad filter has the same parameter b[012] and a[12],
- * The variable [xyz][12][LR] keep the history values.
- */
-struct lr42 {
-	float b0, b1, b2;
-	float a1, a2;
-	float x1L, x1R, x2L, x2R;
-	float y1L, y1R, y2L, y2R;
-	float z1L, z1R, z2L, z2R;
-};
-
-/* Three bands crossover filter:
- *
- * INPUT --+-- lp0 --+-- lp1 --+---> LOW (0)
- *         |         |         |
- *         |         \-- hp1 --/
- *         |
- *         \-- hp0 --+-- lp2 ------> MID (1)
- *                   |
- *                   \-- hp2 ------> HIGH (2)
- *
- *            [f0]       [f1]
- *
- * Each lp or hp is an LR4 filter, which consists of two second-order
- * lowpass or highpass butterworth filters.
- */
-struct crossover2 {
-	struct lr42 lp[3], hp[3];
-};
-
-/* Initializes a crossover2 filter
- * Args:
- *    xo2 - The crossover2 filter we want to initialize.
- *    freq1 - The normalized frequency splits low and mid band.
- *    freq2 - The normalized frequency splits mid and high band.
- */
-void crossover2_init(struct crossover2 *xo2, float freq1, float freq2);
-
-/* Splits input samples to three bands.
- * Args:
- *    xo2 - The crossover2 filter to use.
- *    count - The number of input samples.
- *    data0L, data0R - The input samples, also the place to store low band
- *                     output.
- *    data1L, data1R - The place to store mid band output.
- *    data2L, data2R - The place to store high band output.
- */
-void crossover2_process(struct crossover2 *xo2, int count, float *data0L,
-			float *data0R, float *data1L, float *data1R,
-			float *data2L, float *data2R);
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif /* CROSSOVER2_H_ */
diff --git a/cras/src/dsp/dcblock.c b/cras/src/dsp/dcblock.c
deleted file mode 100644
index 53ba941..0000000
--- a/cras/src/dsp/dcblock.c
+++ /dev/null
@@ -1,68 +0,0 @@
-/* Copyright 2017 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <stdlib.h>
-#include "dcblock.h"
-
-#define RAMP_TIME_MS 20
-
-struct dcblock {
-	float R;
-	float x_prev;
-	float y_prev;
-	float ramp_factor;
-	float ramp_increment;
-	int initialized;
-};
-
-struct dcblock *dcblock_new(float R, unsigned long sample_rate)
-{
-	struct dcblock *dcblock = (struct dcblock *)calloc(1, sizeof(*dcblock));
-	dcblock->R = R;
-	dcblock->ramp_increment = 1000. / (float)(RAMP_TIME_MS * sample_rate);
-	return dcblock;
-}
-
-void dcblock_free(struct dcblock *dcblock)
-{
-	free(dcblock);
-}
-
-/* This is the prototype of the processing loop. */
-void dcblock_process(struct dcblock *dcblock, float *data, int count)
-{
-	int n;
-	float x_prev = dcblock->x_prev;
-	float y_prev = dcblock->y_prev;
-	float R = dcblock->R;
-
-	if (!dcblock->initialized) {
-		x_prev = data[0];
-		dcblock->initialized = 1;
-	}
-
-	for (n = 0; n < count; n++) {
-		float x = data[n];
-		float d = x - x_prev + R * y_prev;
-
-		y_prev = d;
-		x_prev = x;
-
-		/*
-		 * It takes a while for this DC-block filter to completely
-		 * filter out a large DC-offset, so apply a mix-in ramp to
-		 * avoid any residual jump discontinuities that can lead to
-		 * "pop" during capture.
-		 */
-		if (dcblock->ramp_factor < 1.0) {
-			d *= dcblock->ramp_factor;
-			dcblock->ramp_factor += dcblock->ramp_increment;
-		}
-
-		data[n] = d;
-	}
-	dcblock->x_prev = x_prev;
-	dcblock->y_prev = y_prev;
-}
diff --git a/cras/src/dsp/dcblock.h b/cras/src/dsp/dcblock.h
deleted file mode 100644
index a2ac427..0000000
--- a/cras/src/dsp/dcblock.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef DCBLOCK_H_
-#define DCBLOCK_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* A DC blocking filter. */
-
-struct dcblock;
-
-/*
- * Create a DC blocking filter.
- *
- * Transfer fn: (1 - z^-1) / (1 - R * z^-1)
- * Args:
- *    R - DC block filter coefficient.
- *    sample_rate - The sample rate, in Hz.
- */
-struct dcblock *dcblock_new(float R, unsigned long sample_rate);
-
-/* Free a DC blocking filter. */
-void dcblock_free(struct dcblock *dcblock);
-
-/* Process a buffer of audio data through the filter.
- * Args:
- *    dcblock - The filter we want to use.
- *    data - The array of audio samples.
- *    count - The number of elements in the data array to process.
- */
-void dcblock_process(struct dcblock *dcblock, float *data, int count);
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif /* DCBLOCK_H_ */
diff --git a/cras/src/dsp/drc.c b/cras/src/dsp/drc.c
deleted file mode 100644
index e609841..0000000
--- a/cras/src/dsp/drc.c
+++ /dev/null
@@ -1,396 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-/* Copyright (C) 2011 Google Inc. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE.WEBKIT file.
- */
-
-#include <assert.h>
-#include <stdlib.h>
-
-#include "drc.h"
-#include "drc_math.h"
-
-static void set_default_parameters(struct drc *drc);
-static void init_data_buffer(struct drc *drc);
-static void init_emphasis_eq(struct drc *drc);
-static void init_crossover(struct drc *drc);
-static void init_kernel(struct drc *drc);
-static void free_data_buffer(struct drc *drc);
-static void free_emphasis_eq(struct drc *drc);
-static void free_kernel(struct drc *drc);
-
-struct drc *drc_new(float sample_rate)
-{
-	struct drc *drc = (struct drc *)calloc(1, sizeof(struct drc));
-	drc->sample_rate = sample_rate;
-	set_default_parameters(drc);
-	return drc;
-}
-
-void drc_init(struct drc *drc)
-{
-	init_data_buffer(drc);
-	init_emphasis_eq(drc);
-	init_crossover(drc);
-	init_kernel(drc);
-}
-
-void drc_free(struct drc *drc)
-{
-	free_kernel(drc);
-	free_emphasis_eq(drc);
-	free_data_buffer(drc);
-	free(drc);
-}
-
-/* Allocates temporary buffers used during drc_process(). */
-static void init_data_buffer(struct drc *drc)
-{
-	int i;
-	size_t size = sizeof(float) * DRC_PROCESS_MAX_FRAMES;
-
-	for (i = 0; i < DRC_NUM_CHANNELS; i++) {
-		drc->data1[i] = (float *)calloc(1, size);
-		drc->data2[i] = (float *)calloc(1, size);
-	}
-}
-
-/* Frees temporary buffers */
-static void free_data_buffer(struct drc *drc)
-{
-	int i;
-
-	for (i = 0; i < DRC_NUM_CHANNELS; i++) {
-		free(drc->data1[i]);
-		free(drc->data2[i]);
-	}
-}
-
-void drc_set_param(struct drc *drc, int index, unsigned paramID, float value)
-{
-	assert(paramID < PARAM_LAST);
-	if (paramID < PARAM_LAST)
-		drc->parameters[index][paramID] = value;
-}
-
-static float drc_get_param(struct drc *drc, int index, unsigned paramID)
-{
-	assert(paramID < PARAM_LAST);
-	return drc->parameters[index][paramID];
-}
-
-/* Initializes parameters to default values. */
-static void set_default_parameters(struct drc *drc)
-{
-	float nyquist = drc->sample_rate / 2;
-	int i;
-
-	for (i = 0; i < DRC_NUM_KERNELS; i++) {
-		float *param = drc->parameters[i];
-		param[PARAM_THRESHOLD] = -24; /* dB */
-		param[PARAM_KNEE] = 30; /* dB */
-		param[PARAM_RATIO] = 12; /* unit-less */
-		param[PARAM_ATTACK] = 0.003f; /* seconds */
-		param[PARAM_RELEASE] = 0.250f; /* seconds */
-		param[PARAM_PRE_DELAY] = DRC_DEFAULT_PRE_DELAY; /* seconds */
-
-		/* Release zone values 0 -> 1. */
-		param[PARAM_RELEASE_ZONE1] = 0.09f;
-		param[PARAM_RELEASE_ZONE2] = 0.16f;
-		param[PARAM_RELEASE_ZONE3] = 0.42f;
-		param[PARAM_RELEASE_ZONE4] = 0.98f;
-
-		/* This is effectively a main volume on the compressed
-		 * signal */
-		param[PARAM_POST_GAIN] = 0; /* dB */
-		param[PARAM_ENABLED] = 0;
-	}
-
-	drc->parameters[0][PARAM_CROSSOVER_LOWER_FREQ] = 0;
-	drc->parameters[1][PARAM_CROSSOVER_LOWER_FREQ] = 200 / nyquist;
-	drc->parameters[2][PARAM_CROSSOVER_LOWER_FREQ] = 2000 / nyquist;
-
-	/* These parameters has only one copy */
-	drc->parameters[0][PARAM_FILTER_STAGE_GAIN] = 4.4f; /* dB */
-	drc->parameters[0][PARAM_FILTER_STAGE_RATIO] = 2;
-	drc->parameters[0][PARAM_FILTER_ANCHOR] = 15000 / nyquist;
-}
-
-/* Finds the zero and pole for one stage of the emphasis filter */
-static void emphasis_stage_roots(float gain, float normalized_frequency,
-				 float *zero, float *pole)
-{
-	float gk = 1 - gain / 20;
-	float f1 = normalized_frequency * gk;
-	float f2 = normalized_frequency / gk;
-	*zero = expf(-f1 * PI_FLOAT);
-	*pole = expf(-f2 * PI_FLOAT);
-}
-
-/* Calculates the biquad coefficients for two emphasis stages. */
-static void emphasis_stage_pair_biquads(float gain, float f1, float f2,
-					struct biquad *emphasis,
-					struct biquad *deemphasis)
-{
-	float z1, p1;
-	float z2, p2;
-
-	emphasis_stage_roots(gain, f1, &z1, &p1);
-	emphasis_stage_roots(gain, f2, &z2, &p2);
-
-	float b0 = 1;
-	float b1 = -(z1 + z2);
-	float b2 = z1 * z2;
-	float a0 = 1;
-	float a1 = -(p1 + p2);
-	float a2 = p1 * p2;
-
-	/* Gain compensation to make 0dB @ 0Hz */
-	float alpha = (a0 + a1 + a2) / (b0 + b1 + b2);
-
-	emphasis->b0 = b0 * alpha;
-	emphasis->b1 = b1 * alpha;
-	emphasis->b2 = b2 * alpha;
-	emphasis->a1 = a1;
-	emphasis->a2 = a2;
-
-	float beta = (b0 + b1 + b2) / (a0 + a1 + a2);
-
-	deemphasis->b0 = a0 * beta;
-	deemphasis->b1 = a1 * beta;
-	deemphasis->b2 = a2 * beta;
-	deemphasis->a1 = b1;
-	deemphasis->a2 = b2;
-}
-
-/* Initializes the emphasis and deemphasis filter */
-static void init_emphasis_eq(struct drc *drc)
-{
-	struct biquad e = { 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f };
-	struct biquad d = { 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f };
-	int i, j;
-
-	float stage_gain = drc_get_param(drc, 0, PARAM_FILTER_STAGE_GAIN);
-	float stage_ratio = drc_get_param(drc, 0, PARAM_FILTER_STAGE_RATIO);
-	float anchor_freq = drc_get_param(drc, 0, PARAM_FILTER_ANCHOR);
-
-	drc->emphasis_eq = eq2_new();
-	drc->deemphasis_eq = eq2_new();
-
-	for (i = 0; i < 2; i++) {
-		emphasis_stage_pair_biquads(stage_gain, anchor_freq,
-					    anchor_freq / stage_ratio, &e, &d);
-		for (j = 0; j < 2; j++) {
-			eq2_append_biquad_direct(drc->emphasis_eq, j, &e);
-			eq2_append_biquad_direct(drc->deemphasis_eq, j, &d);
-		}
-		anchor_freq /= (stage_ratio * stage_ratio);
-	}
-}
-
-/* Frees the emphasis and deemphasis filter */
-static void free_emphasis_eq(struct drc *drc)
-{
-	eq2_free(drc->emphasis_eq);
-	eq2_free(drc->deemphasis_eq);
-}
-
-/* Initializes the crossover filter */
-static void init_crossover(struct drc *drc)
-{
-	float freq1 = drc->parameters[1][PARAM_CROSSOVER_LOWER_FREQ];
-	float freq2 = drc->parameters[2][PARAM_CROSSOVER_LOWER_FREQ];
-
-	crossover2_init(&drc->xo2, freq1, freq2);
-}
-
-/* Initializes the compressor kernels */
-static void init_kernel(struct drc *drc)
-{
-	int i;
-
-	for (i = 0; i < DRC_NUM_KERNELS; i++) {
-		dk_init(&drc->kernel[i], drc->sample_rate);
-
-		float db_threshold = drc_get_param(drc, i, PARAM_THRESHOLD);
-		float db_knee = drc_get_param(drc, i, PARAM_KNEE);
-		float ratio = drc_get_param(drc, i, PARAM_RATIO);
-		float attack_time = drc_get_param(drc, i, PARAM_ATTACK);
-		float release_time = drc_get_param(drc, i, PARAM_RELEASE);
-		float pre_delay_time = drc_get_param(drc, i, PARAM_PRE_DELAY);
-		float releaseZone1 = drc_get_param(drc, i, PARAM_RELEASE_ZONE1);
-		float releaseZone2 = drc_get_param(drc, i, PARAM_RELEASE_ZONE2);
-		float releaseZone3 = drc_get_param(drc, i, PARAM_RELEASE_ZONE3);
-		float releaseZone4 = drc_get_param(drc, i, PARAM_RELEASE_ZONE4);
-		float db_post_gain = drc_get_param(drc, i, PARAM_POST_GAIN);
-		int enabled = drc_get_param(drc, i, PARAM_ENABLED);
-
-		dk_set_parameters(&drc->kernel[i], db_threshold, db_knee, ratio,
-				  attack_time, release_time, pre_delay_time,
-				  db_post_gain, releaseZone1, releaseZone2,
-				  releaseZone3, releaseZone4);
-
-		dk_set_enabled(&drc->kernel[i], enabled);
-	}
-}
-
-/* Frees the compressor kernels */
-static void free_kernel(struct drc *drc)
-{
-	int i;
-	for (i = 0; i < DRC_NUM_KERNELS; i++)
-		dk_free(&drc->kernel[i]);
-}
-
-// Note gcc 4.9+ with -O2 on aarch64 produces vectorized version of C
-// that is comparable performance, but twice as large.  -O1 and -Os produce
-// small but slower code (4x slower than Neon).
-#if defined(__aarch64__)
-static void sum3(float *data, const float *data1, const float *data2, int n)
-{
-	int count = n / 4;
-	int i;
-
-	if (count) {
-		// clang-format off
-		__asm__ __volatile(
-			"1:                                         \n"
-			"ld1 {v0.4s}, [%[data1]], #16               \n"
-			"ld1 {v1.4s}, [%[data2]], #16               \n"
-			"ld1 {v2.4s}, [%[data]]                     \n"
-			"fadd v0.4s, v0.4s, v1.4s                   \n"
-			"fadd v0.4s, v0.4s, v2.4s                   \n"
-			"st1 {v0.4s}, [%[data]], #16                \n"
-			"subs %w[count], %w[count], #1              \n"
-			"b.ne 1b                                    \n"
-			: /* output */
-			  [data]"+r"(data),
-			  [data1]"+r"(data1),
-			  [data2]"+r"(data2),
-			  [count]"+r"(count)
-			: /* input */
-			: /* clobber */
-			  "v0", "v1", "v2", "memory", "cc");
-		// clang-format on
-	}
-
-	n &= 3;
-	for (i = 0; i < n; i++)
-		data[i] += data1[i] + data2[i];
-}
-#elif defined(__ARM_NEON__)
-static void sum3(float *data, const float *data1, const float *data2, int n)
-{
-	int count = n / 4;
-	int i;
-
-	if (count) {
-		// clang-format off
-		__asm__ __volatile(
-			"1:                                         \n"
-			"vld1.32 {q0}, [%[data1]]!                  \n"
-			"vld1.32 {q1}, [%[data2]]!                  \n"
-			"vld1.32 {q2}, [%[data]]                    \n"
-			"vadd.f32 q0, q0, q1                        \n"
-			"vadd.f32 q0, q0, q2                        \n"
-			"vst1.32 {q0}, [%[data]]!                   \n"
-			"subs %[count], #1                          \n"
-			"bne 1b                                     \n"
-			: /* output */
-			  [data]"+r"(data),
-			  [data1]"+r"(data1),
-			  [data2]"+r"(data2),
-			  [count]"+r"(count)
-			: /* input */
-			: /* clobber */
-			  "q0", "q1", "q2", "memory", "cc");
-		// clang-format on
-	}
-
-	n &= 3;
-	for (i = 0; i < n; i++)
-		data[i] += data1[i] + data2[i];
-}
-#elif defined(__SSE3__)
-#include <emmintrin.h>
-static void sum3(float *data, const float *data1, const float *data2, int n)
-{
-	__m128 x, y, z;
-	int count = n / 4;
-	int i;
-
-	if (count) {
-		// clang-format off
-		__asm__ __volatile(
-			"1:                                         \n"
-			"lddqu (%[data1]), %[x]                     \n"
-			"lddqu (%[data2]), %[y]                     \n"
-			"lddqu (%[data]), %[z]                      \n"
-			"addps %[x], %[y]                           \n"
-			"addps %[y], %[z]                           \n"
-			"movdqu %[z], (%[data])                     \n"
-			"add $16, %[data1]                          \n"
-			"add $16, %[data2]                          \n"
-			"add $16, %[data]                           \n"
-			"sub $1, %[count]                           \n"
-			"jne 1b                                     \n"
-			: /* output */
-			  [data]"+r"(data),
-			  [data1]"+r"(data1),
-			  [data2]"+r"(data2),
-			  [count]"+r"(count),
-			  [x]"=x"(x),
-			  [y]"=x"(y),
-			  [z]"=x"(z)
-			: /* input */
-			: /* clobber */
-			  "memory", "cc");
-		// clang-format on
-	}
-
-	n &= 3;
-	for (i = 0; i < n; i++)
-		data[i] += data1[i] + data2[i];
-}
-#else
-static void sum3(float *data, const float *data1, const float *data2, int n)
-{
-	int i;
-	for (i = 0; i < n; i++)
-		data[i] += data1[i] + data2[i];
-}
-#endif
-
-void drc_process(struct drc *drc, float **data, int frames)
-{
-	int i;
-	float **data1 = drc->data1;
-	float **data2 = drc->data2;
-
-	/* Apply pre-emphasis filter if it is not disabled. */
-	if (!drc->emphasis_disabled)
-		eq2_process(drc->emphasis_eq, data[0], data[1], frames);
-
-	/* Crossover */
-	crossover2_process(&drc->xo2, frames, data[0], data[1], data1[0],
-			   data1[1], data2[0], data2[1]);
-
-	/* Apply compression to each band of the signal. The processing is
-	 * performed in place.
-	 */
-	dk_process(&drc->kernel[0], data, frames);
-	dk_process(&drc->kernel[1], data1, frames);
-	dk_process(&drc->kernel[2], data2, frames);
-
-	/* Sum the three bands of signal */
-	for (i = 0; i < DRC_NUM_CHANNELS; i++)
-		sum3(data[i], data1[i], data2[i], frames);
-
-	/* Apply de-emphasis filter if emphasis is not disabled. */
-	if (!drc->emphasis_disabled)
-		eq2_process(drc->deemphasis_eq, data[0], data[1], frames);
-}
diff --git a/cras/src/dsp/drc.h b/cras/src/dsp/drc.h
deleted file mode 100644
index f61e851..0000000
--- a/cras/src/dsp/drc.h
+++ /dev/null
@@ -1,183 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-/* Copyright (C) 2011 Google Inc. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE.WEBKIT file.
- */
-
-#ifndef DRC_H_
-#define DRC_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "crossover2.h"
-#include "drc_kernel.h"
-#include "eq2.h"
-
-/* DRC implements a flexible audio dynamics compression effect such as is
- * commonly used in musical production and game audio. It lowers the volume of
- * the loudest parts of the signal and raises the volume of the softest parts,
- * making the sound richer, fuller, and more controlled.
- *
- * This is a three band stereo DRC. There are three compressor kernels, and each
- * can have its own parameters. If a kernel is disabled, it only delays the
- * signal and does not compress it.
- *
- *                   INPUT
- *                     |
- *                +----------+
- *                | emphasis |
- *                +----------+
- *                     |
- *               +------------+
- *               | crossover  |
- *               +------------+
- *               /     |      \
- *      (low band) (mid band) (high band)
- *             /       |        \
- *         +------+ +------+ +------+
- *         |  drc | |  drc | |  drc |
- *         |kernel| |kernel| |kernel|
- *         +------+ +------+ +------+
- *              \      |        /
- *               \     |       /
- *              +-------------+
- *              |     (+)     |
- *              +-------------+
- *                     |
- *              +------------+
- *              | deemphasis |
- *              +------------+
- *                     |
- *                   OUTPUT
- *
- */
-
-/* The parameters of the DRC compressor.
- *
- * PARAM_THRESHOLD - The value above which the compression starts, in dB.
- * PARAM_KNEE - The value above which the knee region starts, in dB.
- * PARAM_RATIO - The input/output dB ratio after the knee region.
- * PARAM_ATTACK - The time to reduce the gain by 10dB, in seconds.
- * PARAM_RELEASE - The time to increase the gain by 10dB, in seconds.
- * PARAM_PRE_DELAY - The lookahead time for the compressor, in seconds.
- * PARAM_RELEASE_ZONE[1-4] - The adaptive release curve parameters.
- * PARAM_POST_GAIN - The static boost value in output, in dB.
- * PARAM_FILTER_STAGE_GAIN - The gain of each emphasis filter stage.
- * PARAM_FILTER_STAGE_RATIO - The frequency ratio for each emphasis filter stage
- *     to the previous stage.
- * PARAM_FILTER_ANCHOR - The frequency of the first emphasis filter, in
- *     normalized frequency (in [0, 1], relative to half of the sample rate).
- * PARAM_CROSSOVER_LOWER_FREQ - The lower frequency of the band, in normalized
- *     frequency (in [0, 1], relative to half of the sample rate).
- * PARAM_ENABLED - 1 to enable the compressor, 0 to disable it.
- */
-enum { PARAM_THRESHOLD,
-       PARAM_KNEE,
-       PARAM_RATIO,
-       PARAM_ATTACK,
-       PARAM_RELEASE,
-       PARAM_PRE_DELAY,
-       PARAM_RELEASE_ZONE1,
-       PARAM_RELEASE_ZONE2,
-       PARAM_RELEASE_ZONE3,
-       PARAM_RELEASE_ZONE4,
-       PARAM_POST_GAIN,
-       PARAM_FILTER_STAGE_GAIN,
-       PARAM_FILTER_STAGE_RATIO,
-       PARAM_FILTER_ANCHOR,
-       PARAM_CROSSOVER_LOWER_FREQ,
-       PARAM_ENABLED,
-       PARAM_LAST };
-
-/* The number of compressor kernels (also the number of bands). */
-#define DRC_NUM_KERNELS 3
-
-/* The maximum number of frames can be passed to drc_process() call. */
-#define DRC_PROCESS_MAX_FRAMES 2048
-
-/* The default value of PARAM_PRE_DELAY in seconds. */
-#define DRC_DEFAULT_PRE_DELAY 0.006f
-
-struct drc {
-	/* sample rate in Hz */
-	float sample_rate;
-
-	/* 1 to disable the emphasis and deemphasis, 0 to enable it. */
-	int emphasis_disabled;
-
-	/* parameters holds the tweakable compressor parameters. */
-	float parameters[DRC_NUM_KERNELS][PARAM_LAST];
-
-	/* The emphasis filter and deemphasis filter */
-	struct eq2 *emphasis_eq;
-	struct eq2 *deemphasis_eq;
-
-	/* The crossover filter */
-	struct crossover2 xo2;
-
-	/* The compressor kernels */
-	struct drc_kernel kernel[DRC_NUM_KERNELS];
-
-	/* Temporary buffer used during drc_process(). The mid and high band
-	 * signal is stored in these buffers (the low band is stored in the
-	 * original input buffer). */
-	float *data1[DRC_NUM_CHANNELS];
-	float *data2[DRC_NUM_CHANNELS];
-};
-
-/* DRC needs the parameters to be set before initialization. So drc_new() should
- * be called first to allocated an instance, then drc_set_param() is called
- * (multiple times) to set the parameters. Finally drc_init() is called to do
- * the initialization. After that drc_process() can be used to process data. The
- * sequence is:
- *
- *  drc_new();
- *  drc_set_param();
- *  ...
- *  drc_set_param();
- *  drc_init();
- *  drc_process();
- *  ...
- *  drc_process();
- *  drc_free();
- */
-
-/* Allocates a DRC. */
-struct drc *drc_new(float sample_rate);
-
-/* Initializes a DRC. */
-void drc_init(struct drc *drc);
-
-/* Frees a DRC.*/
-void drc_free(struct drc *drc);
-
-/* Processes input data using a DRC.
- * Args:
- *    drc - The DRC we want to use.
- *    float **data - Pointers to input/output data. The input must be stereo
- *        and one channel is pointed by data[0], another pointed by data[1]. The
- *        output data is stored in the same place.
- *    frames - The number of frames to process.
- */
-void drc_process(struct drc *drc, float **data, int frames);
-
-/* Sets a parameter for the DRC.
- * Args:
- *    drc - The DRC we want to use.
- *    index - The index of the kernel we want to set its parameter.
- *    paramID - One of the PARAM_* enum constant.
- *    value - The parameter value
- */
-void drc_set_param(struct drc *drc, int index, unsigned paramID, float value);
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif /* DRC_H_ */
diff --git a/cras/src/dsp/drc_kernel.c b/cras/src/dsp/drc_kernel.c
deleted file mode 100644
index 8c3404f..0000000
--- a/cras/src/dsp/drc_kernel.c
+++ /dev/null
@@ -1,1060 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-/* Copyright (C) 2011 Google Inc. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE.WEBKIT file.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "drc_math.h"
-#include "drc_kernel.h"
-
-#define MAX_PRE_DELAY_FRAMES 1024
-#define MAX_PRE_DELAY_FRAMES_MASK (MAX_PRE_DELAY_FRAMES - 1)
-#define DEFAULT_PRE_DELAY_FRAMES 256
-#define DIVISION_FRAMES 32
-#define DIVISION_FRAMES_MASK (DIVISION_FRAMES - 1)
-
-#define assert_on_compile(e) ((void)sizeof(char[1 - 2 * !(e)]))
-#define assert_on_compile_is_power_of_2(n)                                     \
-	assert_on_compile((n) != 0 && (((n) & ((n)-1)) == 0))
-
-const float uninitialized_value = -1;
-static int drc_math_initialized;
-
-void dk_init(struct drc_kernel *dk, float sample_rate)
-{
-	int i;
-
-	if (!drc_math_initialized) {
-		drc_math_initialized = 1;
-		drc_math_init();
-	}
-
-	dk->sample_rate = sample_rate;
-	dk->detector_average = 0;
-	dk->compressor_gain = 1;
-	dk->enabled = 0;
-	dk->processed = 0;
-	dk->last_pre_delay_frames = DEFAULT_PRE_DELAY_FRAMES;
-	dk->pre_delay_read_index = 0;
-	dk->pre_delay_write_index = DEFAULT_PRE_DELAY_FRAMES;
-	dk->max_attack_compression_diff_db = -INFINITY;
-	dk->ratio = uninitialized_value;
-	dk->slope = uninitialized_value;
-	dk->linear_threshold = uninitialized_value;
-	dk->db_threshold = uninitialized_value;
-	dk->db_knee = uninitialized_value;
-	dk->knee_threshold = uninitialized_value;
-	dk->ratio_base = uninitialized_value;
-	dk->K = uninitialized_value;
-
-	assert_on_compile_is_power_of_2(DIVISION_FRAMES);
-	assert_on_compile(DIVISION_FRAMES % 4 == 0);
-	/* Allocate predelay buffers */
-	assert_on_compile_is_power_of_2(MAX_PRE_DELAY_FRAMES);
-	for (i = 0; i < DRC_NUM_CHANNELS; i++) {
-		size_t size = sizeof(float) * MAX_PRE_DELAY_FRAMES;
-		dk->pre_delay_buffers[i] = (float *)calloc(1, size);
-	}
-}
-
-void dk_free(struct drc_kernel *dk)
-{
-	int i;
-	for (i = 0; i < DRC_NUM_CHANNELS; ++i)
-		free(dk->pre_delay_buffers[i]);
-}
-
-/* Sets the pre-delay (lookahead) buffer size */
-static void set_pre_delay_time(struct drc_kernel *dk, float pre_delay_time)
-{
-	int i;
-	/* Re-configure look-ahead section pre-delay if delay time has
-	 * changed. */
-	unsigned pre_delay_frames = pre_delay_time * dk->sample_rate;
-	pre_delay_frames = min(pre_delay_frames, MAX_PRE_DELAY_FRAMES - 1);
-
-	/* Make pre_delay_frames multiplies of DIVISION_FRAMES. This way we
-	 * won't split a division of samples into two blocks of memory, so it is
-	 * easier to process. This may make the actual delay time slightly less
-	 * than the specified value, but the difference is less than 1ms. */
-	pre_delay_frames &= ~DIVISION_FRAMES_MASK;
-
-	/* We need at least one division buffer, so the incoming data won't
-	 * overwrite the output data */
-	pre_delay_frames = max(pre_delay_frames, DIVISION_FRAMES);
-
-	if (dk->last_pre_delay_frames != pre_delay_frames) {
-		dk->last_pre_delay_frames = pre_delay_frames;
-		for (i = 0; i < DRC_NUM_CHANNELS; ++i) {
-			size_t size = sizeof(float) * MAX_PRE_DELAY_FRAMES;
-			memset(dk->pre_delay_buffers[i], 0, size);
-		}
-
-		dk->pre_delay_read_index = 0;
-		dk->pre_delay_write_index = pre_delay_frames;
-	}
-}
-
-/* Exponential curve for the knee.  It is 1st derivative matched at
- * dk->linear_threshold and asymptotically approaches the value
- * dk->linear_threshold + 1 / k.
- *
- * This is used only when calculating the static curve, not used when actually
- * compress the input data (knee_curveK below is used instead).
- */
-static float knee_curve(struct drc_kernel *dk, float x, float k)
-{
-	/* Linear up to threshold. */
-	if (x < dk->linear_threshold)
-		return x;
-
-	return dk->linear_threshold +
-	       (1 - knee_expf(-k * (x - dk->linear_threshold))) / k;
-}
-
-/* Approximate 1st derivative with input and output expressed in dB.  This slope
- * is equal to the inverse of the compression "ratio".  In other words, a
- * compression ratio of 20 would be a slope of 1/20.
- */
-static float slope_at(struct drc_kernel *dk, float x, float k)
-{
-	if (x < dk->linear_threshold)
-		return 1;
-
-	float x2 = x * 1.001;
-
-	float x_db = linear_to_decibels(x);
-	float x2Db = linear_to_decibels(x2);
-
-	float y_db = linear_to_decibels(knee_curve(dk, x, k));
-	float y2Db = linear_to_decibels(knee_curve(dk, x2, k));
-
-	float m = (y2Db - y_db) / (x2Db - x_db);
-
-	return m;
-}
-
-static float k_at_slope(struct drc_kernel *dk, float desired_slope)
-{
-	float x_db = dk->db_threshold + dk->db_knee;
-	float x = decibels_to_linear(x_db);
-
-	/* Approximate k given initial values. */
-	float minK = 0.1;
-	float maxK = 10000;
-	float k = 5;
-	int i;
-
-	for (i = 0; i < 15; ++i) {
-		/* A high value for k will more quickly asymptotically approach
-		 * a slope of 0. */
-		float slope = slope_at(dk, x, k);
-
-		if (slope < desired_slope) {
-			/* k is too high. */
-			maxK = k;
-		} else {
-			/* k is too low. */
-			minK = k;
-		}
-
-		/* Re-calculate based on geometric mean. */
-		k = sqrtf(minK * maxK);
-	}
-
-	return k;
-}
-
-static void update_static_curve_parameters(struct drc_kernel *dk,
-					   float db_threshold, float db_knee,
-					   float ratio)
-{
-	if (db_threshold != dk->db_threshold || db_knee != dk->db_knee ||
-	    ratio != dk->ratio) {
-		/* Threshold and knee. */
-		dk->db_threshold = db_threshold;
-		dk->linear_threshold = decibels_to_linear(db_threshold);
-		dk->db_knee = db_knee;
-
-		/* Compute knee parameters. */
-		dk->ratio = ratio;
-		dk->slope = 1 / dk->ratio;
-
-		float k = k_at_slope(dk, 1 / dk->ratio);
-		dk->K = k;
-		/* See knee_curveK() for details */
-		dk->knee_alpha = dk->linear_threshold + 1 / k;
-		dk->knee_beta = -expf(k * dk->linear_threshold) / k;
-
-		dk->knee_threshold = decibels_to_linear(db_threshold + db_knee);
-		/* See volume_gain() for details */
-		float y0 = knee_curve(dk, dk->knee_threshold, k);
-		dk->ratio_base = y0 * powf(dk->knee_threshold, -dk->slope);
-	}
-}
-
-/* This is the knee part of the compression curve. Returns the output level
- * given the input level x. */
-static float knee_curveK(struct drc_kernel *dk, float x)
-{
-	/* The formula in knee_curveK is dk->linear_threshold +
-	 * (1 - expf(-k * (x - dk->linear_threshold))) / k
-	 * which simplifies to (alpha + beta * expf(gamma))
-	 * where alpha = dk->linear_threshold + 1 / k
-	 *	 beta = -expf(k * dk->linear_threshold) / k
-	 *	 gamma = -k * x
-	 */
-	return dk->knee_alpha + dk->knee_beta * knee_expf(-dk->K * x);
-}
-
-/* Full compression curve with constant ratio after knee. Returns the ratio of
- * output and input signal. */
-static float volume_gain(struct drc_kernel *dk, float x)
-{
-	float y;
-
-	if (x < dk->knee_threshold) {
-		if (x < dk->linear_threshold)
-			return 1;
-		y = knee_curveK(dk, x) / x;
-	} else {
-		/* Constant ratio after knee.
-		 * log(y/y0) = s * log(x/x0)
-		 * => y = y0 * (x/x0)^s
-		 * => y = [y0 * (1/x0)^s] * x^s
-		 * => y = dk->ratio_base * x^s
-		 * => y/x = dk->ratio_base * x^(s - 1)
-		 * => y/x = dk->ratio_base * e^(log(x) * (s - 1))
-		 */
-		y = dk->ratio_base * knee_expf(logf(x) * (dk->slope - 1));
-	}
-
-	return y;
-}
-
-void dk_set_parameters(struct drc_kernel *dk, float db_threshold, float db_knee,
-		       float ratio, float attack_time, float release_time,
-		       float pre_delay_time, float db_post_gain,
-		       float releaseZone1, float releaseZone2,
-		       float releaseZone3, float releaseZone4)
-{
-	float sample_rate = dk->sample_rate;
-
-	update_static_curve_parameters(dk, db_threshold, db_knee, ratio);
-
-	/* Makeup gain. */
-	float full_range_gain = volume_gain(dk, 1);
-	float full_range_makeup_gain = 1 / full_range_gain;
-
-	/* Empirical/perceptual tuning. */
-	full_range_makeup_gain = powf(full_range_makeup_gain, 0.6f);
-
-	dk->main_linear_gain =
-		decibels_to_linear(db_post_gain) * full_range_makeup_gain;
-
-	/* Attack parameters. */
-	attack_time = max(0.001f, attack_time);
-	dk->attack_frames = attack_time * sample_rate;
-
-	/* Release parameters. */
-	float release_frames = sample_rate * release_time;
-
-	/* Detector release time. */
-	float sat_release_time = 0.0025f;
-	float sat_release_frames = sat_release_time * sample_rate;
-	dk->sat_release_frames_inv_neg = -1 / sat_release_frames;
-	dk->sat_release_rate_at_neg_two_db =
-		decibels_to_linear(-2 * dk->sat_release_frames_inv_neg) - 1;
-
-	/* Create a smooth function which passes through four points.
-	 * Polynomial of the form y = a + b*x + c*x^2 + d*x^3 + e*x^4
-	 */
-	float y1 = release_frames * releaseZone1;
-	float y2 = release_frames * releaseZone2;
-	float y3 = release_frames * releaseZone3;
-	float y4 = release_frames * releaseZone4;
-
-	/* All of these coefficients were derived for 4th order polynomial curve
-	 * fitting where the y values match the evenly spaced x values as
-	 * follows: (y1 : x == 0, y2 : x == 1, y3 : x == 2, y4 : x == 3)
-	 */
-	dk->kA = 0.9999999999999998f * y1 + 1.8432219684323923e-16f * y2 -
-		 1.9373394351676423e-16f * y3 + 8.824516011816245e-18f * y4;
-	dk->kB = -1.5788320352845888f * y1 + 2.3305837032074286f * y2 -
-		 0.9141194204840429f * y3 + 0.1623677525612032f * y4;
-	dk->kC = 0.5334142869106424f * y1 - 1.272736789213631f * y2 +
-		 0.9258856042207512f * y3 - 0.18656310191776226f * y4;
-	dk->kD = 0.08783463138207234f * y1 - 0.1694162967925622f * y2 +
-		 0.08588057951595272f * y3 - 0.00429891410546283f * y4;
-	dk->kE = -0.042416883008123074f * y1 + 0.1115693827987602f * y2 -
-		 0.09764676325265872f * y3 + 0.028494263462021576f * y4;
-
-	/* x ranges from 0 -> 3	      0	   1	2   3
-	 *			     -15  -10  -5   0db
-	 *
-	 * y calculates adaptive release frames depending on the amount of
-	 * compression.
-	 */
-	set_pre_delay_time(dk, pre_delay_time);
-}
-
-void dk_set_enabled(struct drc_kernel *dk, int enabled)
-{
-	dk->enabled = enabled;
-}
-
-/* Updates the envelope_rate used for the next division */
-static void dk_update_envelope(struct drc_kernel *dk)
-{
-	const float kA = dk->kA;
-	const float kB = dk->kB;
-	const float kC = dk->kC;
-	const float kD = dk->kD;
-	const float kE = dk->kE;
-	const float attack_frames = dk->attack_frames;
-
-	/* Calculate desired gain */
-	float desired_gain = dk->detector_average;
-
-	/* Pre-warp so we get desired_gain after sin() warp below. */
-	float scaled_desired_gain = warp_asinf(desired_gain);
-
-	/* Deal with envelopes */
-
-	/* envelope_rate is the rate we slew from current compressor level to
-	 * the desired level.  The exact rate depends on if we're attacking or
-	 * releasing and by how much.
-	 */
-	float envelope_rate;
-
-	int is_releasing = scaled_desired_gain > dk->compressor_gain;
-
-	/* compression_diff_db is the difference between current compression
-	 * level and the desired level. */
-	float compression_diff_db =
-		linear_to_decibels(dk->compressor_gain / scaled_desired_gain);
-
-	if (is_releasing) {
-		/* Release mode - compression_diff_db should be negative dB */
-		dk->max_attack_compression_diff_db = -INFINITY;
-
-		/* Fix gremlins. */
-		if (isbadf(compression_diff_db))
-			compression_diff_db = -1;
-
-		/* Adaptive release - higher compression (lower
-		 * compression_diff_db) releases faster. Contain within range:
-		 * -12 -> 0 then scale to go from 0 -> 3
-		 */
-		float x = compression_diff_db;
-		x = max(-12.0f, x);
-		x = min(0.0f, x);
-		x = 0.25f * (x + 12);
-
-		/* Compute adaptive release curve using 4th order polynomial.
-		 * Normal values for the polynomial coefficients would create a
-		 * monotonically increasing function.
-		 */
-		float x2 = x * x;
-		float x3 = x2 * x;
-		float x4 = x2 * x2;
-		float release_frames =
-			kA + kB * x + kC * x2 + kD * x3 + kE * x4;
-
-#define kSpacingDb 5
-		float db_per_frame = kSpacingDb / release_frames;
-		envelope_rate = decibels_to_linear(db_per_frame);
-	} else {
-		/* Attack mode - compression_diff_db should be positive dB */
-
-		/* Fix gremlins. */
-		if (isbadf(compression_diff_db))
-			compression_diff_db = 1;
-
-		/* As long as we're still in attack mode, use a rate based off
-		 * the largest compression_diff_db we've encountered so far.
-		 */
-		dk->max_attack_compression_diff_db =
-			max(dk->max_attack_compression_diff_db,
-			    compression_diff_db);
-
-		float eff_atten_diff_db =
-			max(0.5f, dk->max_attack_compression_diff_db);
-
-		float x = 0.25f / eff_atten_diff_db;
-		envelope_rate = 1 - powf(x, 1 / attack_frames);
-	}
-
-	dk->envelope_rate = envelope_rate;
-	dk->scaled_desired_gain = scaled_desired_gain;
-}
-
-/* For a division of frames, take the absolute values of left channel and right
- * channel, store the maximum of them in output. */
-#if defined(__aarch64__)
-static inline void max_abs_division(float *output, const float *data0,
-				    const float *data1)
-{
-	int count = DIVISION_FRAMES / 4;
-
-	// clang-format off
-	__asm__ __volatile__(
-		"1:                                     \n"
-		"ld1 {v0.4s}, [%[data0]], #16           \n"
-		"ld1 {v1.4s}, [%[data1]], #16           \n"
-		"fabs v0.4s, v0.4s                      \n"
-		"fabs v1.4s, v1.4s                      \n"
-		"fmax v0.4s, v0.4s, v1.4s               \n"
-		"st1 {v0.4s}, [%[output]], #16          \n"
-		"subs %w[count], %w[count], #1          \n"
-		"b.ne 1b                                \n"
-		: /* output */
-		  [data0]"+r"(data0),
-		  [data1]"+r"(data1),
-		  [output]"+r"(output),
-		  [count]"+r"(count)
-		: /* input */
-		: /* clobber */
-		  "v0", "v1", "memory", "cc");
-	// clang-format on
-}
-#elif defined(__ARM_NEON__)
-static inline void max_abs_division(float *output, const float *data0,
-				    const float *data1)
-{
-	int count = DIVISION_FRAMES / 4;
-
-	// clang-format off
-	__asm__ __volatile__(
-		"1:                                     \n"
-		"vld1.32 {q0}, [%[data0]]!              \n"
-		"vld1.32 {q1}, [%[data1]]!              \n"
-		"vabs.f32 q0, q0                        \n"
-		"vabs.f32 q1, q1                        \n"
-		"vmax.f32 q0, q1                        \n"
-		"vst1.32 {q0}, [%[output]]!             \n"
-		"subs %[count], #1                      \n"
-		"bne 1b                                 \n"
-		: /* output */
-		  [data0]"+r"(data0),
-		  [data1]"+r"(data1),
-		  [output]"+r"(output),
-		  [count]"+r"(count)
-		: /* input */
-		: /* clobber */
-		  "q0", "q1", "memory", "cc");
-	// clang-format on
-}
-#elif defined(__SSE3__)
-#include <emmintrin.h>
-static inline void max_abs_division(float *output, const float *data0,
-				    const float *data1)
-{
-	__m128 x, y;
-	int count = DIVISION_FRAMES / 4;
-	// clang-format off
-	__asm__ __volatile__(
-		"1:                                     \n"
-		"lddqu (%[data0]), %[x]                 \n"
-		"lddqu (%[data1]), %[y]                 \n"
-		"andps %[mask], %[x]                    \n"
-		"andps %[mask], %[y]                    \n"
-		"maxps %[y], %[x]                       \n"
-		"movdqu %[x], (%[output])               \n"
-		"add $16, %[data0]                      \n"
-		"add $16, %[data1]                      \n"
-		"add $16, %[output]                     \n"
-		"sub $1, %[count]                       \n"
-		"jnz 1b                                 \n"
-		: /* output */
-		  [data0]"+r"(data0),
-		  [data1]"+r"(data1),
-		  [output]"+r"(output),
-		  [count]"+r"(count),
-		  [x]"=&x"(x),
-		  [y]"=&x"(y)
-		: /* input */
-		  [mask]"x"(_mm_set1_epi32(0x7fffffff))
-		: /* clobber */
-		  "memory", "cc");
-	// clang-format on
-}
-#else
-static inline void max_abs_division(float *output, const float *data0,
-				    const float *data1)
-{
-	int i;
-	for (i = 0; i < DIVISION_FRAMES; i++)
-		output[i] = fmaxf(fabsf(data0[i]), fabsf(data1[i]));
-}
-#endif
-
-/* Update detector_average from the last input division. */
-static void dk_update_detector_average(struct drc_kernel *dk)
-{
-	float abs_input_array[DIVISION_FRAMES];
-	const float sat_release_frames_inv_neg = dk->sat_release_frames_inv_neg;
-	const float sat_release_rate_at_neg_two_db =
-		dk->sat_release_rate_at_neg_two_db;
-	float detector_average = dk->detector_average;
-	int div_start, i;
-
-	/* Calculate the start index of the last input division */
-	if (dk->pre_delay_write_index == 0) {
-		div_start = MAX_PRE_DELAY_FRAMES - DIVISION_FRAMES;
-	} else {
-		div_start = dk->pre_delay_write_index - DIVISION_FRAMES;
-	}
-
-	/* The max abs value across all channels for this frame */
-	max_abs_division(abs_input_array, &dk->pre_delay_buffers[0][div_start],
-			 &dk->pre_delay_buffers[1][div_start]);
-
-	for (i = 0; i < DIVISION_FRAMES; i++) {
-		/* Compute compression amount from un-delayed signal */
-		float abs_input = abs_input_array[i];
-
-		/* Calculate shaped power on undelayed input.  Put through
-		 * shaping curve. This is linear up to the threshold, then
-		 * enters a "knee" portion followed by the "ratio" portion. The
-		 * transition from the threshold to the knee is smooth (1st
-		 * derivative matched). The transition from the knee to the
-		 * ratio portion is smooth (1st derivative matched).
-		 */
-		float gain = volume_gain(dk, abs_input);
-		int is_release = (gain > detector_average);
-		if (is_release) {
-			if (gain > NEG_TWO_DB) {
-				detector_average +=
-					(gain - detector_average) *
-					sat_release_rate_at_neg_two_db;
-			} else {
-				float gain_db = linear_to_decibels(gain);
-				float db_per_frame =
-					gain_db * sat_release_frames_inv_neg;
-				float sat_release_rate =
-					decibels_to_linear(db_per_frame) - 1;
-				detector_average += (gain - detector_average) *
-						    sat_release_rate;
-			}
-		} else {
-			detector_average = gain;
-		}
-
-		/* Fix gremlins. */
-		if (isbadf(detector_average))
-			detector_average = 1.0f;
-		else
-			detector_average = min(detector_average, 1.0f);
-	}
-
-	dk->detector_average = detector_average;
-}
-
-/* Calculate compress_gain from the envelope and apply total_gain to compress
- * the next output division. */
-/* TODO(fbarchard): Port to aarch64 */
-#if defined(__ARM_NEON__)
-#include <arm_neon.h>
-static void dk_compress_output(struct drc_kernel *dk)
-{
-	const float main_linear_gain = dk->main_linear_gain;
-	const float envelope_rate = dk->envelope_rate;
-	const float scaled_desired_gain = dk->scaled_desired_gain;
-	const float compressor_gain = dk->compressor_gain;
-	const int div_start = dk->pre_delay_read_index;
-	float *ptr_left = &dk->pre_delay_buffers[0][div_start];
-	float *ptr_right = &dk->pre_delay_buffers[1][div_start];
-	int count = DIVISION_FRAMES / 4;
-
-	/* See warp_sinf() for the details for the constants. */
-	const float32x4_t A7 = vdupq_n_f32(-4.3330336920917034149169921875e-3f);
-	const float32x4_t A5 = vdupq_n_f32(7.9434238374233245849609375e-2f);
-	const float32x4_t A3 = vdupq_n_f32(-0.645892798900604248046875f);
-	const float32x4_t A1 = vdupq_n_f32(1.5707910060882568359375f);
-
-	/* Exponential approach to desired gain. */
-	if (envelope_rate < 1) {
-		float c = compressor_gain - scaled_desired_gain;
-		float r = 1 - envelope_rate;
-		float32x4_t x0 = { c * r, c * r * r, c * r * r * r,
-				   c * r * r * r * r };
-		float32x4_t x, x2, x4, left, right, tmp1, tmp2;
-
-		// clang-format off
-		__asm__ __volatile(
-			"b 2f                                               \n"
-			"1:                                                 \n"
-			"vmul.f32 %q[x0], %q[r4]                            \n"
-			"2:                                                 \n"
-			"vld1.32 {%e[left],%f[left]}, [%[ptr_left]]         \n"
-			"vld1.32 {%e[right],%f[right]}, [%[ptr_right]]      \n"
-			"vadd.f32 %q[x], %q[x0], %q[base]                   \n"
-			/* Calculate warp_sin() for four values in x. */
-			"vmul.f32 %q[x2], %q[x], %q[x]                      \n"
-			"vmov.f32 %q[tmp1], %q[A5]                          \n"
-			"vmov.f32 %q[tmp2], %q[A1]                          \n"
-			"vmul.f32 %q[x4], %q[x2], %q[x2]                    \n"
-			"vmla.f32 %q[tmp1], %q[A7], %q[x2]                  \n"
-			"vmla.f32 %q[tmp2], %q[A3], %q[x2]                  \n"
-			"vmla.f32 %q[tmp2], %q[tmp1], %q[x4]                \n"
-			"vmul.f32 %q[tmp2], %q[tmp2], %q[x]                 \n"
-			/* Now tmp2 contains the result of warp_sin(). */
-			"vmul.f32 %q[tmp2], %q[tmp2], %q[g]                 \n"
-			"vmul.f32 %q[left], %q[tmp2]                        \n"
-			"vmul.f32 %q[right], %q[tmp2]                       \n"
-			"vst1.32 {%e[left],%f[left]}, [%[ptr_left]]!        \n"
-			"vst1.32 {%e[right],%f[right]}, [%[ptr_right]]!     \n"
-			"subs %[count], #1                                  \n"
-			"bne 1b                                             \n"
-			: /* output */
-			  "=r"(count),
-			  "=r"(ptr_left),
-			  "=r"(ptr_right),
-			  "=w"(x0),
-			  [x]"=&w"(x),
-			  [x2]"=&w"(x2),
-			  [x4]"=&w"(x4),
-			  [left]"=&w"(left),
-			  [right]"=&w"(right),
-			  [tmp1]"=&w"(tmp1),
-			  [tmp2]"=&w"(tmp2)
-			: /* input */
-			  [count]"0"(count),
-			  [ptr_left]"1"(ptr_left),
-			  [ptr_right]"2"(ptr_right),
-			  [x0]"3"(x0),
-			  [A1]"w"(A1),
-			  [A3]"w"(A3),
-			  [A5]"w"(A5),
-			  [A7]"w"(A7),
-			  [base]"w"(vdupq_n_f32(scaled_desired_gain)),
-			  [r4]"w"(vdupq_n_f32(r*r*r*r)),
-			  [g]"w"(vdupq_n_f32(main_linear_gain))
-			: /* clobber */
-			  "memory", "cc");
-		// clang-format on
-		dk->compressor_gain = x[3];
-	} else {
-		float c = compressor_gain;
-		float r = envelope_rate;
-		float32x4_t x = { c * r, c * r * r, c * r * r * r,
-				  c * r * r * r * r };
-		float32x4_t x2, x4, left, right, tmp1, tmp2;
-
-		// clang-format off
-		__asm__ __volatile(
-			"b 2f                                               \n"
-			"1:                                                 \n"
-			"vmul.f32 %q[x], %q[r4]                             \n"
-			"2:                                                 \n"
-			"vld1.32 {%e[left],%f[left]}, [%[ptr_left]]         \n"
-			"vld1.32 {%e[right],%f[right]}, [%[ptr_right]]      \n"
-			"vmin.f32 %q[x], %q[one]                            \n"
-			/* Calculate warp_sin() for four values in x. */
-			"vmul.f32 %q[x2], %q[x], %q[x]                      \n"
-			"vmov.f32 %q[tmp1], %q[A5]                          \n"
-			"vmov.f32 %q[tmp2], %q[A1]                          \n"
-			"vmul.f32 %q[x4], %q[x2], %q[x2]                    \n"
-			"vmla.f32 %q[tmp1], %q[A7], %q[x2]                  \n"
-			"vmla.f32 %q[tmp2], %q[A3], %q[x2]                  \n"
-			"vmla.f32 %q[tmp2], %q[tmp1], %q[x4]                \n"
-			"vmul.f32 %q[tmp2], %q[tmp2], %q[x]                 \n"
-			/* Now tmp2 contains the result of warp_sin(). */
-			"vmul.f32 %q[tmp2], %q[tmp2], %q[g]                 \n"
-			"vmul.f32 %q[left], %q[tmp2]                        \n"
-			"vmul.f32 %q[right], %q[tmp2]                       \n"
-			"vst1.32 {%e[left],%f[left]}, [%[ptr_left]]!        \n"
-			"vst1.32 {%e[right],%f[right]}, [%[ptr_right]]!     \n"
-			"subs %[count], #1                                  \n"
-			"bne 1b                                             \n"
-			: /* output */
-			  "=r"(count),
-			  "=r"(ptr_left),
-			  "=r"(ptr_right),
-			  "=w"(x),
-			  [x2]"=&w"(x2),
-			  [x4]"=&w"(x4),
-			  [left]"=&w"(left),
-			  [right]"=&w"(right),
-			  [tmp1]"=&w"(tmp1),
-			  [tmp2]"=&w"(tmp2)
-			: /* input */
-			  [count]"0"(count),
-			  [ptr_left]"1"(ptr_left),
-			  [ptr_right]"2"(ptr_right),
-			  [x]"3"(x),
-			  [A1]"w"(A1),
-			  [A3]"w"(A3),
-			  [A5]"w"(A5),
-			  [A7]"w"(A7),
-			  [one]"w"(vdupq_n_f32(1)),
-			  [r4]"w"(vdupq_n_f32(r*r*r*r)),
-			  [g]"w"(vdupq_n_f32(main_linear_gain))
-			: /* clobber */
-			  "memory", "cc");
-		// clang-format on
-		dk->compressor_gain = x[3];
-	}
-}
-#elif defined(__SSE3__) && defined(__x86_64__)
-#include <emmintrin.h>
-static void dk_compress_output(struct drc_kernel *dk)
-{
-	const float main_linear_gain = dk->main_linear_gain;
-	const float envelope_rate = dk->envelope_rate;
-	const float scaled_desired_gain = dk->scaled_desired_gain;
-	const float compressor_gain = dk->compressor_gain;
-	const int div_start = dk->pre_delay_read_index;
-	float *ptr_left = &dk->pre_delay_buffers[0][div_start];
-	float *ptr_right = &dk->pre_delay_buffers[1][div_start];
-	int count = DIVISION_FRAMES / 4;
-
-	/* See warp_sinf() for the details for the constants. */
-	const __m128 A7 = _mm_set1_ps(-4.3330336920917034149169921875e-3f);
-	const __m128 A5 = _mm_set1_ps(7.9434238374233245849609375e-2f);
-	const __m128 A3 = _mm_set1_ps(-0.645892798900604248046875f);
-	const __m128 A1 = _mm_set1_ps(1.5707910060882568359375f);
-
-	/* Exponential approach to desired gain. */
-	if (envelope_rate < 1) {
-		float c = compressor_gain - scaled_desired_gain;
-		float r = 1 - envelope_rate;
-		__m128 x0 = { c * r, c * r * r, c * r * r * r,
-			      c * r * r * r * r };
-		__m128 x, x2, x4, left, right, tmp1, tmp2;
-
-		// clang-format off
-		__asm__ __volatile(
-			"jmp 2f                                     \n"
-			"1:                                         \n"
-			"mulps %[r4], %[x0]                         \n"
-			"2:                                         \n"
-			"lddqu (%[ptr_left]), %[left]               \n"
-			"lddqu (%[ptr_right]), %[right]             \n"
-			"movaps %[x0], %[x]                         \n"
-			"addps %[base], %[x]                        \n"
-			/* Calculate warp_sin() for four values in x. */
-			"movaps %[x], %[x2]                         \n"
-			"mulps %[x], %[x2]                          \n"
-			"movaps %[x2], %[x4]                        \n"
-			"movaps %[x2], %[tmp1]                      \n"
-			"movaps %[x2], %[tmp2]                      \n"
-			"mulps %[x2], %[x4]                         \n"
-			"mulps %[A7], %[tmp1]                       \n"
-			"mulps %[A3], %[tmp2]                       \n"
-			"addps %[A5], %[tmp1]                       \n"
-			"addps %[A1], %[tmp2]                       \n"
-			"mulps %[x4], %[tmp1]                       \n"
-			"addps %[tmp1], %[tmp2]                     \n"
-			"mulps %[x], %[tmp2]                        \n"
-			/* Now tmp2 contains the result of warp_sin(). */
-			"mulps %[g], %[tmp2]                        \n"
-			"mulps %[tmp2], %[left]                     \n"
-			"mulps %[tmp2], %[right]                    \n"
-			"movdqu %[left], (%[ptr_left])              \n"
-			"movdqu %[right], (%[ptr_right])            \n"
-			"add $16, %[ptr_left]                       \n"
-			"add $16, %[ptr_right]                      \n"
-			"sub $1, %[count]                           \n"
-			"jne 1b                                     \n"
-			: /* output */
-			  "=r"(count),
-			  "=r"(ptr_left),
-			  "=r"(ptr_right),
-			  "=x"(x0),
-			  [x]"=&x"(x),
-			  [x2]"=&x"(x2),
-			  [x4]"=&x"(x4),
-			  [left]"=&x"(left),
-			  [right]"=&x"(right),
-			  [tmp1]"=&x"(tmp1),
-			  [tmp2]"=&x"(tmp2)
-			: /* input */
-			  [count]"0"(count),
-			  [ptr_left]"1"(ptr_left),
-			  [ptr_right]"2"(ptr_right),
-			  [x0]"3"(x0),
-			  [A1]"x"(A1),
-			  [A3]"x"(A3),
-			  [A5]"x"(A5),
-			  [A7]"x"(A7),
-			  [base]"x"(_mm_set1_ps(scaled_desired_gain)),
-			  [r4]"x"(_mm_set1_ps(r*r*r*r)),
-			  [g]"x"(_mm_set1_ps(main_linear_gain))
-			: /* clobber */
-			  "memory", "cc");
-		// clang-format on
-		dk->compressor_gain = x[3];
-	} else {
-		/* See warp_sinf() for the details for the constants. */
-		__m128 A7 = _mm_set1_ps(-4.3330336920917034149169921875e-3f);
-		__m128 A5 = _mm_set1_ps(7.9434238374233245849609375e-2f);
-		__m128 A3 = _mm_set1_ps(-0.645892798900604248046875f);
-		__m128 A1 = _mm_set1_ps(1.5707910060882568359375f);
-
-		float c = compressor_gain;
-		float r = envelope_rate;
-		__m128 x = { c * r, c * r * r, c * r * r * r,
-			     c * r * r * r * r };
-		__m128 x2, x4, left, right, tmp1, tmp2;
-
-		// clang-format off
-		__asm__ __volatile(
-			"jmp 2f                                     \n"
-			"1:                                         \n"
-			"mulps %[r4], %[x]                          \n"
-			"2:                                         \n"
-			"lddqu (%[ptr_left]), %[left]               \n"
-			"lddqu (%[ptr_right]), %[right]             \n"
-			"minps %[one], %[x]                         \n"
-			/* Calculate warp_sin() for four values in x. */
-			"movaps %[x], %[x2]                         \n"
-			"mulps %[x], %[x2]                          \n"
-			"movaps %[x2], %[x4]                        \n"
-			"movaps %[x2], %[tmp1]                      \n"
-			"movaps %[x2], %[tmp2]                      \n"
-			"mulps %[x2], %[x4]                         \n"
-			"mulps %[A7], %[tmp1]                       \n"
-			"mulps %[A3], %[tmp2]                       \n"
-			"addps %[A5], %[tmp1]                       \n"
-			"addps %[A1], %[tmp2]                       \n"
-			"mulps %[x4], %[tmp1]                       \n"
-			"addps %[tmp1], %[tmp2]                     \n"
-			"mulps %[x], %[tmp2]                        \n"
-			/* Now tmp2 contains the result of warp_sin(). */
-			"mulps %[g], %[tmp2]                        \n"
-			"mulps %[tmp2], %[left]                     \n"
-			"mulps %[tmp2], %[right]                    \n"
-			"movdqu %[left], (%[ptr_left])              \n"
-			"movdqu %[right], (%[ptr_right])            \n"
-			"add $16, %[ptr_left]                       \n"
-			"add $16, %[ptr_right]                      \n"
-			"sub $1, %[count]                           \n"
-			"jne 1b                                     \n"
-			: /* output */
-			  "=r"(count),
-			  "=r"(ptr_left),
-			  "=r"(ptr_right),
-			  "=x"(x),
-			  [x2]"=&x"(x2),
-			  [x4]"=&x"(x4),
-			  [left]"=&x"(left),
-			  [right]"=&x"(right),
-			  [tmp1]"=&x"(tmp1),
-			  [tmp2]"=&x"(tmp2)
-			: /* input */
-			  [count]"0"(count),
-			  [ptr_left]"1"(ptr_left),
-			  [ptr_right]"2"(ptr_right),
-			  [x]"3"(x),
-			  [A1]"x"(A1),
-			  [A3]"x"(A3),
-			  [A5]"x"(A5),
-			  [A7]"x"(A7),
-			  [one]"x"(_mm_set1_ps(1)),
-			  [r4]"x"(_mm_set1_ps(r*r*r*r)),
-			  [g]"x"(_mm_set1_ps(main_linear_gain))
-			: /* clobber */
-			  "memory", "cc");
-		// clang-format on
-		dk->compressor_gain = x[3];
-	}
-}
-#else
-static void dk_compress_output(struct drc_kernel *dk)
-{
-	const float main_linear_gain = dk->main_linear_gain;
-	const float envelope_rate = dk->envelope_rate;
-	const float scaled_desired_gain = dk->scaled_desired_gain;
-	const float compressor_gain = dk->compressor_gain;
-	const int div_start = dk->pre_delay_read_index;
-	float *ptr_left = &dk->pre_delay_buffers[0][div_start];
-	float *ptr_right = &dk->pre_delay_buffers[1][div_start];
-	int count = DIVISION_FRAMES / 4;
-
-	int i, j;
-
-	/* Exponential approach to desired gain. */
-	if (envelope_rate < 1) {
-		/* Attack - reduce gain to desired. */
-		float c = compressor_gain - scaled_desired_gain;
-		float base = scaled_desired_gain;
-		float r = 1 - envelope_rate;
-		float x[4] = { c * r, c * r * r, c * r * r * r,
-			       c * r * r * r * r };
-		float r4 = r * r * r * r;
-
-		i = 0;
-		while (1) {
-			for (j = 0; j < 4; j++) {
-				/* Warp pre-compression gain to smooth out sharp
-				 * exponential transition points.
-				 */
-				float post_warp_compressor_gain =
-					warp_sinf(x[j] + base);
-
-				/* Calculate total gain using main gain. */
-				float total_gain = main_linear_gain *
-						   post_warp_compressor_gain;
-
-				/* Apply final gain. */
-				*ptr_left++ *= total_gain;
-				*ptr_right++ *= total_gain;
-			}
-
-			if (++i == count)
-				break;
-
-			for (j = 0; j < 4; j++)
-				x[j] = x[j] * r4;
-		}
-
-		dk->compressor_gain = x[3] + base;
-	} else {
-		/* Release - exponentially increase gain to 1.0 */
-		float c = compressor_gain;
-		float r = envelope_rate;
-		float x[4] = { c * r, c * r * r, c * r * r * r,
-			       c * r * r * r * r };
-		float r4 = r * r * r * r;
-
-		i = 0;
-		while (1) {
-			for (j = 0; j < 4; j++) {
-				/* Warp pre-compression gain to smooth out sharp
-				 * exponential transition points.
-				 */
-				float post_warp_compressor_gain =
-					warp_sinf(x[j]);
-
-				/* Calculate total gain using main gain. */
-				float total_gain = main_linear_gain *
-						   post_warp_compressor_gain;
-
-				/* Apply final gain. */
-				*ptr_left++ *= total_gain;
-				*ptr_right++ *= total_gain;
-			}
-
-			if (++i == count)
-				break;
-
-			for (j = 0; j < 4; j++)
-				x[j] = min(1.0f, x[j] * r4);
-		}
-
-		dk->compressor_gain = x[3];
-	}
-}
-#endif
-
-/* After one complete divison of samples have been received (and one divison of
- * samples have been output), we calculate shaped power average
- * (detector_average) from the input division, update envelope parameters from
- * detector_average, then prepare the next output division by applying the
- * envelope to compress the samples.
- */
-static void dk_process_one_division(struct drc_kernel *dk)
-{
-	dk_update_detector_average(dk);
-	dk_update_envelope(dk);
-	dk_compress_output(dk);
-}
-
-/* Copy the input data to the pre-delay buffer, and copy the output data back to
- * the input buffer */
-static void dk_copy_fragment(struct drc_kernel *dk, float *data_channels[],
-			     unsigned frame_index, int frames_to_process)
-{
-	int write_index = dk->pre_delay_write_index;
-	int read_index = dk->pre_delay_read_index;
-	int j;
-
-	for (j = 0; j < DRC_NUM_CHANNELS; ++j) {
-		memcpy(&dk->pre_delay_buffers[j][write_index],
-		       &data_channels[j][frame_index],
-		       frames_to_process * sizeof(float));
-		memcpy(&data_channels[j][frame_index],
-		       &dk->pre_delay_buffers[j][read_index],
-		       frames_to_process * sizeof(float));
-	}
-
-	dk->pre_delay_write_index =
-		(write_index + frames_to_process) & MAX_PRE_DELAY_FRAMES_MASK;
-	dk->pre_delay_read_index =
-		(read_index + frames_to_process) & MAX_PRE_DELAY_FRAMES_MASK;
-}
-
-/* Delay the input sample only and don't do other processing. This is used when
- * the kernel is disabled. We want to do this to match the processing delay in
- * kernels of other bands.
- */
-static void dk_process_delay_only(struct drc_kernel *dk, float *data_channels[],
-				  unsigned count)
-{
-	int read_index = dk->pre_delay_read_index;
-	int write_index = dk->pre_delay_write_index;
-	int i = 0;
-
-	while (i < count) {
-		int j;
-		int small = min(read_index, write_index);
-		int large = max(read_index, write_index);
-		/* chunk is the minimum of readable samples in contiguous
-		 * buffer, writable samples in contiguous buffer, and the
-		 * available input samples. */
-		int chunk = min(large - small, MAX_PRE_DELAY_FRAMES - large);
-		chunk = min(chunk, count - i);
-		for (j = 0; j < DRC_NUM_CHANNELS; ++j) {
-			memcpy(&dk->pre_delay_buffers[j][write_index],
-			       &data_channels[j][i], chunk * sizeof(float));
-			memcpy(&data_channels[j][i],
-			       &dk->pre_delay_buffers[j][read_index],
-			       chunk * sizeof(float));
-		}
-		read_index = (read_index + chunk) & MAX_PRE_DELAY_FRAMES_MASK;
-		write_index = (write_index + chunk) & MAX_PRE_DELAY_FRAMES_MASK;
-		i += chunk;
-	}
-
-	dk->pre_delay_read_index = read_index;
-	dk->pre_delay_write_index = write_index;
-}
-
-void dk_process(struct drc_kernel *dk, float *data_channels[], unsigned count)
-{
-	int i = 0;
-	int fragment;
-
-	if (!dk->enabled) {
-		dk_process_delay_only(dk, data_channels, count);
-		return;
-	}
-
-	if (!dk->processed) {
-		dk_update_envelope(dk);
-		dk_compress_output(dk);
-		dk->processed = 1;
-	}
-
-	int offset = dk->pre_delay_write_index & DIVISION_FRAMES_MASK;
-	while (i < count) {
-		fragment = min(DIVISION_FRAMES - offset, count - i);
-		dk_copy_fragment(dk, data_channels, i, fragment);
-		i += fragment;
-		offset = (offset + fragment) & DIVISION_FRAMES_MASK;
-
-		/* Process the input division (32 frames). */
-		if (offset == 0)
-			dk_process_one_division(dk);
-	}
-}
diff --git a/cras/src/dsp/drc_kernel.h b/cras/src/dsp/drc_kernel.h
deleted file mode 100644
index 2ed9956..0000000
--- a/cras/src/dsp/drc_kernel.h
+++ /dev/null
@@ -1,109 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-/* Copyright (C) 2011 Google Inc. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE.WEBKIT file.
- */
-
-#ifndef DRC_KERNEL_H_
-#define DRC_KERNEL_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define DRC_NUM_CHANNELS 2
-
-struct drc_kernel {
-	float sample_rate;
-
-	/* The detector_average is the target gain obtained by looking at the
-	 * future samples in the lookahead buffer and applying the compression
-	 * curve on them. compressor_gain is the gain applied to the current
-	 * samples. compressor_gain moves towards detector_average with the
-	 * speed envelope_rate which is calculated once for each division (32
-	 * frames). */
-	float detector_average;
-	float compressor_gain;
-	int enabled;
-	int processed;
-
-	/* Lookahead section. */
-	unsigned last_pre_delay_frames;
-	float *pre_delay_buffers[DRC_NUM_CHANNELS];
-	int pre_delay_read_index;
-	int pre_delay_write_index;
-
-	float max_attack_compression_diff_db;
-
-	/* Amount of input change in dB required for 1 dB of output change.
-	 * This applies to the portion of the curve above knee_threshold
-	 * (see below).
-	 */
-	float ratio;
-	float slope; /* Inverse ratio. */
-
-	/* The input to output change below the threshold is 1:1. */
-	float linear_threshold;
-	float db_threshold;
-
-	/* db_knee is the number of dB above the threshold before we enter the
-	 * "ratio" portion of the curve.  The portion between db_threshold and
-	 * (db_threshold + db_knee) is the "soft knee" portion of the curve
-	 * which transitions smoothly from the linear portion to the ratio
-	 * portion. knee_threshold is db_to_linear(db_threshold + db_knee).
-	 */
-	float db_knee;
-	float knee_threshold;
-	float ratio_base;
-
-	/* Internal parameter for the knee portion of the curve. */
-	float K;
-
-	/* The release frames coefficients */
-	float kA, kB, kC, kD, kE;
-
-	/* Calculated parameters */
-	float main_linear_gain;
-	float attack_frames;
-	float sat_release_frames_inv_neg;
-	float sat_release_rate_at_neg_two_db;
-	float knee_alpha, knee_beta;
-
-	/* envelope for the current division */
-	float envelope_rate;
-	float scaled_desired_gain;
-};
-
-/* Initializes a drc kernel */
-void dk_init(struct drc_kernel *dk, float sample_rate);
-
-/* Frees a drc kernel */
-void dk_free(struct drc_kernel *dk);
-
-/* Sets the parameters of a drc kernel. See drc.h for details */
-void dk_set_parameters(struct drc_kernel *dk, float db_threshold, float db_knee,
-		       float ratio, float attack_time, float release_time,
-		       float pre_delay_time, float db_post_gain,
-		       float releaseZone1, float releaseZone2,
-		       float releaseZone3, float releaseZone4);
-
-/* Enables or disables a drc kernel */
-void dk_set_enabled(struct drc_kernel *dk, int enabled);
-
-/* Performs stereo-linked compression.
- * Args:
- *    dk - The DRC kernel.
- *    data - The pointers to the audio sample buffer. One pointer per channel.
- *    count - The number of audio samples per channel.
- */
-void dk_process(struct drc_kernel *dk, float *data_channels[], unsigned count);
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif /* DRC_KERNEL_H_ */
diff --git a/cras/src/dsp/drc_math.c b/cras/src/dsp/drc_math.c
deleted file mode 100644
index 1ee5c81..0000000
--- a/cras/src/dsp/drc_math.c
+++ /dev/null
@@ -1,14 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-#include "drc_math.h"
-
-float db_to_linear[201]; /* from -100dB to 100dB */
-
-void drc_math_init()
-{
-	int i;
-	for (i = -100; i <= 100; i++)
-		db_to_linear[i + 100] = pow(10, i / 20.0);
-}
diff --git a/cras/src/dsp/drc_math.h b/cras/src/dsp/drc_math.h
deleted file mode 100644
index 970b729..0000000
--- a/cras/src/dsp/drc_math.h
+++ /dev/null
@@ -1,217 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef DRC_MATH_H_
-#define DRC_MATH_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <stddef.h>
-#include <math.h>
-
-#ifndef __BIONIC__
-#include <ieee754.h>
-#else
-union ieee754_float {
-	float f;
-	/* Little endian float fields */
-	struct {
-		unsigned int mantissa : 23;
-		unsigned int exponent : 8;
-		unsigned int negative : 1;
-	} ieee;
-};
-#endif
-
-/* Uncomment to use the slow but accurate functions. */
-/* #define SLOW_DB_TO_LINEAR */
-/* #define SLOW_LINEAR_TO_DB */
-/* #define SLOW_WARP_SIN */
-/* #define SLOW_KNEE_EXP */
-/* #define SLOW_FREXPF */
-
-#define PI_FLOAT 3.141592653589793f
-#define PI_OVER_TWO_FLOAT 1.57079632679489661923f
-#define TWO_OVER_PI_FLOAT 0.63661977236758134f
-#define NEG_TWO_DB 0.7943282347242815f /* -2dB = 10^(-2/20) */
-
-#ifndef max
-#define max(a, b)                                                              \
-	({                                                                     \
-		__typeof__(a) _a = (a);                                        \
-		__typeof__(b) _b = (b);                                        \
-		_a > _b ? _a : _b;                                             \
-	})
-#endif
-
-#ifndef min
-#define min(a, b)                                                              \
-	({                                                                     \
-		__typeof__(a) _a = (a);                                        \
-		__typeof__(b) _b = (b);                                        \
-		_a < _b ? _a : _b;                                             \
-	})
-#endif
-
-#ifndef M_PI
-#define M_PI 3.14159265358979323846
-#endif
-
-#define PURE __attribute__((pure))
-static inline float decibels_to_linear(float decibels) PURE;
-static inline float linear_to_decibels(float linear) PURE;
-static inline float warp_sinf(float x) PURE;
-static inline float warp_asinf(float x) PURE;
-static inline float knee_expf(float input) PURE;
-
-extern float db_to_linear[201]; /* from -100dB to 100dB */
-
-void drc_math_init();
-
-/* Rounds the input number to the nearest integer */
-#if defined(__arm__)
-static inline float round_int(float x)
-{
-	return x < 0 ? (int)(x - 0.5f) : (int)(x + 0.5f);
-}
-#else
-#define round_int rintf /* Uses frintx for arm64 and roundss for SSE4.1 */
-#endif
-
-static inline float decibels_to_linear(float decibels)
-{
-#ifdef SLOW_DB_TO_LINEAR
-	/* 10^(x/20) = e^(x * log(10^(1/20))) */
-	return expf(0.1151292546497022f * decibels);
-#else
-	float x;
-	float fi;
-	int i;
-
-	fi = round_int(decibels);
-	x = decibels - fi;
-	i = (int)fi;
-	i = max(min(i, 100), -100);
-
-	/* Coefficients obtained from:
-	 * fpminimax(10^(x/20), [|1,2,3|], [|SG...|], [-0.5;0.5], 1, absolute);
-	 * max error ~= 7.897e-8
-	 */
-	const float A3 = 2.54408805631101131439208984375e-4f;
-	const float A2 = 6.628888659179210662841796875e-3f;
-	const float A1 = 0.11512924730777740478515625f;
-	const float A0 = 1.0f;
-
-	float x2 = x * x;
-	return ((A3 * x + A2) * x2 + (A1 * x + A0)) * db_to_linear[i + 100];
-#endif
-}
-
-static inline float frexpf_fast(float x, int *e)
-{
-#ifdef SLOW_FREXPF
-	return frexpf(x, e);
-#else
-	union ieee754_float u;
-	u.f = x;
-	int exp = u.ieee.exponent;
-	if (exp == 0xff)
-		return NAN;
-	*e = exp - 126;
-	u.ieee.exponent = 126;
-	return u.f;
-#endif
-}
-
-static inline float linear_to_decibels(float linear)
-{
-	/* For negative or zero, just return a very small dB value. */
-	if (linear <= 0)
-		return -1000;
-
-#ifdef SLOW_LINEAR_TO_DB
-	/* 20 * log10(x) = 20 / log(10) * log(x) */
-	return 8.6858896380650366f * logf(linear);
-#else
-	int e = 0;
-	float x = frexpf_fast(linear, &e);
-	float exp = e;
-
-	if (x > 0.707106781186548f) {
-		x *= 0.707106781186548f;
-		exp += 0.5f;
-	}
-
-	/* Coefficients obtained from:
-	 * fpminimax(log10(x), 5, [|SG...|], [1/2;sqrt(2)/2], absolute);
-	 * max err ~= 6.088e-8
-	 */
-	const float A5 = 1.131880283355712890625f;
-	const float A4 = -4.258677959442138671875f;
-	const float A3 = 6.81631565093994140625f;
-	const float A2 = -6.1185703277587890625f;
-	const float A1 = 3.6505267620086669921875f;
-	const float A0 = -1.217894077301025390625f;
-
-	float x2 = x * x;
-	float x4 = x2 * x2;
-	return ((A5 * x + A4) * x4 + (A3 * x + A2) * x2 + (A1 * x + A0)) *
-		       20.0f +
-	       exp * 6.0205999132796239f;
-#endif
-}
-
-static inline float warp_sinf(float x)
-{
-#ifdef SLOW_WARP_SIN
-	return sinf(PI_OVER_TWO_FLOAT * x);
-#else
-	/* Coefficients obtained from:
-	 * fpminimax(sin(x*pi/2), [|1,3,5,7|], [|SG...|], [-1e-30;1], absolute)
-	 * max err ~= 5.901e-7
-	 */
-	const float A7 = -4.3330336920917034149169921875e-3f;
-	const float A5 = 7.9434238374233245849609375e-2f;
-	const float A3 = -0.645892798900604248046875f;
-	const float A1 = 1.5707910060882568359375f;
-
-	float x2 = x * x;
-	float x4 = x2 * x2;
-	return x * ((A7 * x2 + A5) * x4 + (A3 * x2 + A1));
-#endif
-}
-
-static inline float warp_asinf(float x)
-{
-	return asinf(x) * TWO_OVER_PI_FLOAT;
-}
-
-static inline float knee_expf(float input)
-{
-#ifdef SLOW_KNEE_EXP
-	return expf(input);
-#else
-	/* exp(x) = decibels_to_linear(20*log10(e)*x) */
-	return decibels_to_linear(8.685889638065044f * input);
-#endif
-}
-
-/* Returns 1 for nan or inf, 0 otherwise. This is faster than the alternative
- * return x != 0 && !isnormal(x);
- */
-static inline int isbadf(float x)
-{
-	union ieee754_float u;
-	u.f = x;
-	return u.ieee.exponent == 0xff;
-}
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif /* DRC_MATH_H_ */
diff --git a/cras/src/dsp/dsp_util.c b/cras/src/dsp/dsp_util.c
deleted file mode 100644
index 86679e1..0000000
--- a/cras/src/dsp/dsp_util.c
+++ /dev/null
@@ -1,611 +0,0 @@
-/* Copyright 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <limits.h>
-#include <syslog.h>
-
-#include "dsp_util.h"
-
-#ifndef max
-#define max(a, b)                                                              \
-	({                                                                     \
-		__typeof__(a) _a = (a);                                        \
-		__typeof__(b) _b = (b);                                        \
-		_a > _b ? _a : _b;                                             \
-	})
-#endif
-
-#ifndef min
-#define min(a, b)                                                              \
-	({                                                                     \
-		__typeof__(a) _a = (a);                                        \
-		__typeof__(b) _b = (b);                                        \
-		_a < _b ? _a : _b;                                             \
-	})
-#endif
-
-#undef deinterleave_stereo
-#undef interleave_stereo
-
-/* Converts shorts in range of -32768 to 32767 to floats in range of
- * -1.0f to 1.0f.
- * scvtf instruction accepts fixed point ints, so sxtl is used to lengthen
- * shorts to int with sign extension.
- */
-#ifdef __aarch64__
-static void deinterleave_stereo(int16_t *input, float *output1, float *output2,
-				int frames)
-{
-	int chunk = frames >> 3;
-	frames &= 7;
-	/* Process 8 frames (16 samples) each loop. */
-	/* L0 R0 L1 R1 L2 R2 L3 R3... -> L0 L1 L2 L3... R0 R1 R2 R3... */
-	if (chunk) {
-		// clang-format off
-		__asm__ __volatile__(
-			"1:                                         \n"
-			"ld2  {v2.8h, v3.8h}, [%[input]], #32       \n"
-			"subs %w[chunk], %w[chunk], #1              \n"
-			"sxtl   v0.4s, v2.4h                        \n"
-			"sxtl2  v1.4s, v2.8h                        \n"
-			"sxtl   v2.4s, v3.4h                        \n"
-			"sxtl2  v3.4s, v3.8h                        \n"
-			"scvtf  v0.4s, v0.4s, #15                   \n"
-			"scvtf  v1.4s, v1.4s, #15                   \n"
-			"scvtf  v2.4s, v2.4s, #15                   \n"
-			"scvtf  v3.4s, v3.4s, #15                   \n"
-			"st1    {v0.4s, v1.4s}, [%[output1]], #32   \n"
-			"st1    {v2.4s, v3.4s}, [%[output2]], #32   \n"
-			"b.ne   1b                                  \n"
-			: /* output */
-			  [chunk]"+r"(chunk),
-			  [input]"+r"(input),
-			  [output1]"+r"(output1),
-			  [output2]"+r"(output2)
-			: /* input */
-			: /* clobber */
-			  "v0", "v1", "v2", "v3", "memory", "cc");
-		// clang-format on
-	}
-
-	/* The remaining samples. */
-	while (frames--) {
-		*output1++ = *input++ / 32768.0f;
-		*output2++ = *input++ / 32768.0f;
-	}
-}
-#define deinterleave_stereo deinterleave_stereo
-
-/* Converts floats in range of -1.0f to 1.0f to shorts in range of
- * -32768 to 32767 with rounding to nearest, with ties (0.5) rounding away
- * from zero.
- * Rounding is achieved by using fcvtas instruction. (a = away)
- * The float scaled to a range of -32768 to 32767 by adding 15 to the exponent.
- * Add to exponent is equivalent to multiply for exponent range of 0 to 239,
- * which is 2.59 * 10^33.  A signed saturating add (sqadd) limits exponents
- * from 240 to 255 to clamp to 255.
- * For very large values, beyond +/- 2 billion, fcvtas will clamp the result
- * to the min or max value that fits an int.
- * For other values, sqxtn clamps the output to -32768 to 32767 range.
- */
-static void interleave_stereo(float *input1, float *input2, int16_t *output,
-			      int frames)
-{
-	/* Process 4 frames (8 samples) each loop. */
-	/* L0 L1 L2 L3, R0 R1 R2 R3 -> L0 R0 L1 R1, L2 R2 L3 R3 */
-	int chunk = frames >> 2;
-	frames &= 3;
-
-	if (chunk) {
-		// clang-format off
-		__asm__ __volatile__(
-			"dup    v2.4s, %w[scale]                    \n"
-			"1:                                         \n"
-			"ld1    {v0.4s}, [%[input1]], #16           \n"
-			"ld1    {v1.4s}, [%[input2]], #16           \n"
-			"subs   %w[chunk], %w[chunk], #1            \n"
-			"sqadd  v0.4s, v0.4s, v2.4s                 \n"
-			"sqadd  v1.4s, v1.4s, v2.4s                 \n"
-			"fcvtas v0.4s, v0.4s                        \n"
-			"fcvtas v1.4s, v1.4s                        \n"
-			"sqxtn  v0.4h, v0.4s                        \n"
-			"sqxtn  v1.4h, v1.4s                        \n"
-			"st2    {v0.4h, v1.4h}, [%[output]], #16    \n"
-			"b.ne   1b                                  \n"
-			: /* output */
-			  [chunk]"+r"(chunk),
-			  [input1]"+r"(input1),
-			  [input2]"+r"(input2),
-			  [output]"+r"(output)
-			: /* input */
-			  [scale]"r"(15 << 23)
-			: /* clobber */
-			  "v0", "v1", "v2", "memory", "cc");
-		// clang-format on
-	}
-
-	/* The remaining samples */
-	while (frames--) {
-		float f;
-		f = *input1++ * 32768.0f;
-		f += (f >= 0) ? 0.5f : -0.5f;
-		*output++ = max(-32768, min(32767, (int)(f)));
-		f = *input2++ * 32768.0f;
-		f += (f >= 0) ? 0.5f : -0.5f;
-		*output++ = max(-32768, min(32767, (int)(f)));
-	}
-}
-#define interleave_stereo interleave_stereo
-#endif
-
-#ifdef __ARM_NEON__
-#include <arm_neon.h>
-
-static void deinterleave_stereo(int16_t *input, float *output1, float *output2,
-				int frames)
-{
-	/* Process 8 frames (16 samples) each loop. */
-	/* L0 R0 L1 R1 L2 R2 L3 R3... -> L0 L1 L2 L3... R0 R1 R2 R3... */
-	int chunk = frames >> 3;
-	frames &= 7;
-	if (chunk) {
-		// clang-format off
-		__asm__ __volatile__(
-			"1:					    \n"
-			"vld2.16 {d0-d3}, [%[input]]!		    \n"
-			"subs %[chunk], #1			    \n"
-			"vmovl.s16 q3, d3			    \n"
-			"vmovl.s16 q2, d2			    \n"
-			"vmovl.s16 q1, d1			    \n"
-			"vmovl.s16 q0, d0			    \n"
-			"vcvt.f32.s32 q3, q3, #15		    \n"
-			"vcvt.f32.s32 q2, q2, #15		    \n"
-			"vcvt.f32.s32 q1, q1, #15		    \n"
-			"vcvt.f32.s32 q0, q0, #15		    \n"
-			"vst1.32 {d4-d7}, [%[output2]]!		    \n"
-			"vst1.32 {d0-d3}, [%[output1]]!		    \n"
-			"bne 1b					    \n"
-			: /* output */
-			  [chunk]"+r"(chunk),
-			  [input]"+r"(input),
-			  [output1]"+r"(output1),
-			  [output2]"+r"(output2)
-			: /* input */
-			: /* clobber */
-			  "q0", "q1", "q2", "q3", "memory", "cc");
-		// clang-format on
-	}
-
-	/* The remaining samples. */
-	while (frames--) {
-		*output1++ = *input++ / 32768.0f;
-		*output2++ = *input++ / 32768.0f;
-	}
-}
-#define deinterleave_stereo deinterleave_stereo
-
-/* Converts floats in range of -1.0f to 1.0f to shorts in range of
- * -32768 to 32767 with rounding to nearest, with ties (0.5) rounding away
- * from zero.
- * Rounding is achieved by adding 0.5 or -0.5 adjusted for fixed point
- * precision, and then converting float to fixed point using vcvt instruction
- * which truncated toward zero.
- * For very large values, beyond +/- 2 billion, vcvt will clamp the result
- * to the min or max value that fits an int.
- * For other values, vqmovn clamps the output to -32768 to 32767 range.
- */
-static void interleave_stereo(float *input1, float *input2, int16_t *output,
-			      int frames)
-{
-	/* Process 4 frames (8 samples) each loop. */
-	/* L0 L1 L2 L3, R0 R1 R2 R3 -> L0 R0 L1 R1, L2 R2 L3 R3 */
-	float32x4_t pos = vdupq_n_f32(0.5f / 32768.0f);
-	float32x4_t neg = vdupq_n_f32(-0.5f / 32768.0f);
-	int chunk = frames >> 2;
-	frames &= 3;
-
-	if (chunk) {
-		// clang-format off
-		__asm__ __volatile__(
-			"veor q0, q0, q0			    \n"
-			"1:					    \n"
-			"vld1.32 {d2-d3}, [%[input1]]!		    \n"
-			"vld1.32 {d4-d5}, [%[input2]]!		    \n"
-			"subs %[chunk], #1			    \n"
-			/* We try to round to the nearest number by adding 0.5
-			 * to positive input, and adding -0.5 to the negative
-			 * input, then truncate.
-			 */
-			"vcgt.f32 q3, q1, q0			    \n"
-			"vcgt.f32 q4, q2, q0			    \n"
-			"vbsl q3, %q[pos], %q[neg]		    \n"
-			"vbsl q4, %q[pos], %q[neg]		    \n"
-			"vadd.f32 q1, q1, q3			    \n"
-			"vadd.f32 q2, q2, q4			    \n"
-			"vcvt.s32.f32 q1, q1, #15		    \n"
-			"vcvt.s32.f32 q2, q2, #15		    \n"
-			"vqmovn.s32 d2, q1			    \n"
-			"vqmovn.s32 d3, q2			    \n"
-			"vst2.16 {d2-d3}, [%[output]]!		    \n"
-			"bne 1b					    \n"
-			: /* output */
-			  [chunk]"+r"(chunk),
-			  [input1]"+r"(input1),
-			  [input2]"+r"(input2),
-			  [output]"+r"(output)
-			: /* input */
-			  [pos]"w"(pos),
-			  [neg]"w"(neg)
-			: /* clobber */
-			  "q0", "q1", "q2", "q3", "q4", "memory", "cc");
-		// clang-format on
-	}
-
-	/* The remaining samples */
-	while (frames--) {
-		float f;
-		f = *input1++ * 32768.0f;
-		f += (f >= 0) ? 0.5f : -0.5f;
-		*output++ = max(-32768, min(32767, (int)(f)));
-		f = *input2++ * 32768.0f;
-		f += (f >= 0) ? 0.5f : -0.5f;
-		*output++ = max(-32768, min(32767, (int)(f)));
-	}
-}
-#define interleave_stereo interleave_stereo
-#endif
-
-#ifdef __SSE3__
-#include <emmintrin.h>
-
-/* Converts shorts in range of -32768 to 32767 to floats in range of
- * -1.0f to 1.0f.
- * pslld and psrad shifts are used to isolate the low and high word, but
- * each in a different range:
- * The low word is shifted to the high bits in range 0x80000000 .. 0x7fff0000.
- * The high word is shifted to the low bits in range 0x00008000 .. 0x00007fff.
- * cvtdq2ps converts ints to floats as is.
- * mulps is used to normalize the range of the low and high words, adjusting
- * for high and low words being in different range.
- */
-static void deinterleave_stereo(int16_t *input, float *output1, float *output2,
-				int frames)
-{
-	/* Process 8 frames (16 samples) each loop. */
-	/* L0 R0 L1 R1 L2 R2 L3 R3... -> L0 L1 L2 L3... R0 R1 R2 R3... */
-	int chunk = frames >> 3;
-	frames &= 7;
-	if (chunk) {
-		// clang-format off
-		__asm__ __volatile__(
-			"1:                                         \n"
-			"lddqu (%[input]), %%xmm0                   \n"
-			"lddqu 16(%[input]), %%xmm1                 \n"
-			"add $32, %[input]                          \n"
-			"movdqa %%xmm0, %%xmm2                      \n"
-			"movdqa %%xmm1, %%xmm3                      \n"
-			"pslld $16, %%xmm0                          \n"
-			"pslld $16, %%xmm1                          \n"
-			"psrad $16, %%xmm2                          \n"
-			"psrad $16, %%xmm3                          \n"
-			"cvtdq2ps %%xmm0, %%xmm0                    \n"
-			"cvtdq2ps %%xmm1, %%xmm1                    \n"
-			"cvtdq2ps %%xmm2, %%xmm2                    \n"
-			"cvtdq2ps %%xmm3, %%xmm3                    \n"
-			"mulps %[scale_2_n31], %%xmm0               \n"
-			"mulps %[scale_2_n31], %%xmm1               \n"
-			"mulps %[scale_2_n15], %%xmm2               \n"
-			"mulps %[scale_2_n15], %%xmm3               \n"
-			"movdqu %%xmm0, (%[output1])                \n"
-			"movdqu %%xmm1, 16(%[output1])              \n"
-			"movdqu %%xmm2, (%[output2])                \n"
-			"movdqu %%xmm3, 16(%[output2])              \n"
-			"add $32, %[output1]                        \n"
-			"add $32, %[output2]                        \n"
-			"sub $1, %[chunk]                           \n"
-			"jnz 1b                                     \n"
-			: /* output */
-			  [chunk]"+r"(chunk),
-			  [input]"+r"(input),
-			  [output1]"+r"(output1),
-			  [output2]"+r"(output2)
-			: /* input */
-			  [scale_2_n31]"x"(_mm_set1_ps(1.0f/(1<<15)/(1<<16))),
-			  [scale_2_n15]"x"(_mm_set1_ps(1.0f/(1<<15)))
-			: /* clobber */
-			  "xmm0", "xmm1", "xmm2", "xmm3", "memory", "cc");
-		// clang-format on
-	}
-
-	/* The remaining samples. */
-	while (frames--) {
-		*output1++ = *input++ / 32768.0f;
-		*output2++ = *input++ / 32768.0f;
-	}
-}
-#define deinterleave_stereo deinterleave_stereo
-
-/* Converts floats in range of -1.0f to 1.0f to shorts in range of
- * -32768 to 32767 with rounding to nearest, with ties (0.5) rounding to
- * even.
- * For very large values, beyond +/- 2 billion, cvtps2dq will produce
- * 0x80000000 and packssdw will clamp -32768.
- */
-static void interleave_stereo(float *input1, float *input2, int16_t *output,
-			      int frames)
-{
-	/* Process 4 frames (8 samples) each loop. */
-	/* L0 L1 L2 L3, R0 R1 R2 R3 -> L0 R0 L1 R1, L2 R2 L3 R3 */
-	int chunk = frames >> 2;
-	frames &= 3;
-
-	if (chunk) {
-		// clang-format off
-		__asm__ __volatile__(
-			"1:                                         \n"
-			"lddqu (%[input1]), %%xmm0                  \n"
-			"lddqu (%[input2]), %%xmm2                  \n"
-			"add $16, %[input1]                         \n"
-			"add $16, %[input2]                         \n"
-			"movaps %%xmm0, %%xmm1                      \n"
-			"unpcklps %%xmm2, %%xmm0                    \n"
-			"unpckhps %%xmm2, %%xmm1                    \n"
-			"paddsw %[scale_2_15], %%xmm0               \n"
-			"paddsw %[scale_2_15], %%xmm1               \n"
-			"cvtps2dq %%xmm0, %%xmm0                    \n"
-			"cvtps2dq %%xmm1, %%xmm1                    \n"
-			"packssdw %%xmm1, %%xmm0                    \n"
-			"movdqu %%xmm0, (%[output])                 \n"
-			"add $16, %[output]                         \n"
-			"sub $1, %[chunk]                           \n"
-			"jnz 1b                                     \n"
-			: /* output */
-			  [chunk]"+r"(chunk),
-			  [input1]"+r"(input1),
-			  [input2]"+r"(input2),
-			  [output]"+r"(output)
-			: /* input */
-			  [scale_2_15]"x"(_mm_set1_epi32(15 << 23)),
-			  [clamp_large]"x"(_mm_set1_ps(32767.0f))
-			: /* clobber */
-			  "xmm0", "xmm1", "xmm2", "memory", "cc");
-		// clang-format on
-	}
-
-	/* The remaining samples */
-	while (frames--) {
-		float f;
-		f = *input1++ * 32768.0f;
-		f += (f >= 0) ? 0.5f : -0.5f;
-		*output++ = max(-32768, min(32767, (int)(f)));
-		f = *input2++ * 32768.0f;
-		f += (f >= 0) ? 0.5f : -0.5f;
-		*output++ = max(-32768, min(32767, (int)(f)));
-	}
-}
-#define interleave_stereo interleave_stereo
-#endif
-
-static void dsp_util_deinterleave_s16le(int16_t *input, float *const *output,
-					int channels, int frames)
-{
-	float *output_ptr[channels];
-	int i, j;
-
-#ifdef deinterleave_stereo
-	if (channels == 2) {
-		deinterleave_stereo(input, output[0], output[1], frames);
-		return;
-	}
-#endif
-
-	for (i = 0; i < channels; i++)
-		output_ptr[i] = output[i];
-
-	for (i = 0; i < frames; i++)
-		for (j = 0; j < channels; j++)
-			*(output_ptr[j]++) = *input++ / 32768.0f;
-}
-
-static void dsp_util_deinterleave_s24le(int32_t *input, float *const *output,
-					int channels, int frames)
-{
-	float *output_ptr[channels];
-	int i, j;
-
-	for (i = 0; i < channels; i++)
-		output_ptr[i] = output[i];
-
-	for (i = 0; i < frames; i++)
-		for (j = 0; j < channels; j++, input++)
-			*(output_ptr[j]++) = (*input << 8) / 2147483648.0f;
-}
-
-static void dsp_util_deinterleave_s243le(uint8_t *input, float *const *output,
-					 int channels, int frames)
-{
-	float *output_ptr[channels];
-	int32_t sample;
-	int i, j;
-
-	for (i = 0; i < channels; i++)
-		output_ptr[i] = output[i];
-
-	for (i = 0; i < frames; i++)
-		for (j = 0; j < channels; j++, input += 3) {
-			sample = 0;
-			memcpy((uint8_t *)&sample + 1, input, 3);
-			*(output_ptr[j]++) = sample / 2147483648.0f;
-		}
-}
-
-static void dsp_util_deinterleave_s32le(int32_t *input, float *const *output,
-					int channels, int frames)
-{
-	float *output_ptr[channels];
-	int i, j;
-
-	for (i = 0; i < channels; i++)
-		output_ptr[i] = output[i];
-
-	for (i = 0; i < frames; i++)
-		for (j = 0; j < channels; j++, input++)
-			*(output_ptr[j]++) = *input / 2147483648.0f;
-}
-
-int dsp_util_deinterleave(uint8_t *input, float *const *output, int channels,
-			  snd_pcm_format_t format, int frames)
-{
-	switch (format) {
-	case SND_PCM_FORMAT_S16_LE:
-		dsp_util_deinterleave_s16le((int16_t *)input, output, channels,
-					    frames);
-		break;
-	case SND_PCM_FORMAT_S24_LE:
-		dsp_util_deinterleave_s24le((int32_t *)input, output, channels,
-					    frames);
-		break;
-	case SND_PCM_FORMAT_S24_3LE:
-		dsp_util_deinterleave_s243le(input, output, channels, frames);
-		break;
-	case SND_PCM_FORMAT_S32_LE:
-		dsp_util_deinterleave_s32le((int32_t *)input, output, channels,
-					    frames);
-		break;
-	default:
-		syslog(LOG_ERR, "Invalid format to deinterleave");
-		return -EINVAL;
-	}
-	return 0;
-}
-
-static void dsp_util_interleave_s16le(float *const *input, int16_t *output,
-				      int channels, int frames)
-{
-	float *input_ptr[channels];
-	int i, j;
-
-#ifdef interleave_stereo
-	if (channels == 2) {
-		interleave_stereo(input[0], input[1], output, frames);
-		return;
-	}
-#endif
-
-	for (i = 0; i < channels; i++)
-		input_ptr[i] = input[i];
-
-	for (i = 0; i < frames; i++)
-		for (j = 0; j < channels; j++) {
-			float f = *(input_ptr[j]++) * 32768.0f;
-			f += (f >= 0) ? 0.5f : -0.5f;
-			*output++ = max(-32768, min(32767, (int)(f)));
-		}
-}
-
-static void dsp_util_interleave_s24le(float *const *input, int32_t *output,
-				      int channels, int frames)
-{
-	float *input_ptr[channels];
-	int i, j;
-
-	for (i = 0; i < channels; i++)
-		input_ptr[i] = input[i];
-
-	for (i = 0; i < frames; i++)
-		for (j = 0; j < channels; j++, output++) {
-			float f = *(input_ptr[j]++) * 2147483648.0f;
-			f += (f >= 0) ? 0.5f : -0.5f;
-			*output = max((float)INT_MIN, min((float)INT_MAX, f));
-			*output = (*output >> 8) & 0x00ffffff;
-		}
-}
-
-static void dsp_util_interleave_s243le(float *const *input, uint8_t *output,
-				       int channels, int frames)
-{
-	float *input_ptr[channels];
-	int i, j;
-	int32_t tmp;
-
-	for (i = 0; i < channels; i++)
-		input_ptr[i] = input[i];
-
-	for (i = 0; i < frames; i++)
-		for (j = 0; j < channels; j++, output += 3) {
-			float f = *(input_ptr[j]++) * 2147483648.0f;
-			f += (f >= 0) ? 0.5f : -0.5f;
-			tmp = max((float)INT_MIN, min((float)INT_MAX, f));
-			tmp >>= 8;
-			memcpy(output, &tmp, 3);
-		}
-}
-
-static void dsp_util_interleave_s32le(float *const *input, int32_t *output,
-				      int channels, int frames)
-{
-	float *input_ptr[channels];
-	int i, j;
-
-	for (i = 0; i < channels; i++)
-		input_ptr[i] = input[i];
-
-	for (i = 0; i < frames; i++)
-		for (j = 0; j < channels; j++, output++) {
-			float f = *(input_ptr[j]++) * 2147483648.0f;
-			f += (f >= 0) ? 0.5f : -0.5f;
-			*output = max((float)INT_MIN, min((float)INT_MAX, f));
-		}
-}
-
-int dsp_util_interleave(float *const *input, uint8_t *output, int channels,
-			snd_pcm_format_t format, int frames)
-{
-	switch (format) {
-	case SND_PCM_FORMAT_S16_LE:
-		dsp_util_interleave_s16le(input, (int16_t *)output, channels,
-					  frames);
-		break;
-	case SND_PCM_FORMAT_S24_LE:
-		dsp_util_interleave_s24le(input, (int32_t *)output, channels,
-					  frames);
-		break;
-	case SND_PCM_FORMAT_S24_3LE:
-		dsp_util_interleave_s243le(input, output, channels, frames);
-		break;
-	case SND_PCM_FORMAT_S32_LE:
-		dsp_util_interleave_s32le(input, (int32_t *)output, channels,
-					  frames);
-		break;
-	default:
-		syslog(LOG_ERR, "Invalid format to interleave");
-		return -EINVAL;
-	}
-	return 0;
-}
-
-void dsp_enable_flush_denormal_to_zero()
-{
-#if defined(__i386__) || defined(__x86_64__)
-	unsigned int mxcsr;
-	mxcsr = __builtin_ia32_stmxcsr();
-	__builtin_ia32_ldmxcsr(mxcsr | 0x8040);
-#elif defined(__aarch64__)
-	uint64_t cw;
-	__asm__ __volatile__("mrs    %0, fpcr			    \n"
-			     "orr    %0, %0, #0x1000000		    \n"
-			     "msr    fpcr, %0			    \n"
-			     "isb					    \n"
-			     : "=r"(cw)::"memory");
-#elif defined(__arm__)
-	uint32_t cw;
-	__asm__ __volatile__("vmrs   %0, fpscr			    \n"
-			     "orr    %0, %0, #0x1000000		    \n"
-			     "vmsr   fpscr, %0			    \n"
-			     : "=r"(cw)::"memory");
-#else
-#warning "Don't know how to disable denorms. Performace may suffer."
-#endif
-}
diff --git a/cras/src/dsp/dsp_util.h b/cras/src/dsp/dsp_util.h
deleted file mode 100644
index 7ca227a..0000000
--- a/cras/src/dsp/dsp_util.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef DSPUTIL_H_
-#define DSPUTIL_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <stdint.h>
-
-#include "cras_audio_format.h"
-
-/* Converts from interleaved int16_t samples to non-interleaved float samples.
- * The int16_t samples have range [-32768, 32767], and the float samples have
- * range [-1.0, 1.0].
- * Args:
- *    input - The interleaved input buffer. Every "channels" samples is a frame.
- *    output - Pointers to output buffers. There are "channels" output buffers.
- *    channels - The number of samples per frame.
- *    frames - The number of frames to convert.
- * Returns:
- *    Negative error if format isn't supported, otherwise 0.
- */
-int dsp_util_deinterleave(uint8_t *input, float *const *output, int channels,
-			  snd_pcm_format_t format, int frames);
-
-/* Converts from non-interleaved float samples to interleaved int16_t samples.
- * The int16_t samples have range [-32768, 32767], and the float samples have
- * range [-1.0, 1.0]. This is the inverse of dsputil_deinterleave().
- * Args:
- *    input - Pointers to input buffers. There are "channels" input buffers.
- *    output - The interleaved output buffer. Every "channels" samples is a
- *        frame.
- *    channels - The number of samples per frame.
- *    frames - The number of frames to convert.
- * Returns:
- *    Negative error if format isn't supported, otherwise 0.
- */
-int dsp_util_interleave(float *const *input, uint8_t *output, int channels,
-			snd_pcm_format_t format, int frames);
-
-/* Disables denormal numbers in floating point calculation. Denormal numbers
- * happens often in IIR filters, and it can be very slow.
- */
-void dsp_enable_flush_denormal_to_zero();
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif /* DSPUTIL_H_ */
diff --git a/cras/src/dsp/eq.c b/cras/src/dsp/eq.c
deleted file mode 100644
index 9f3197f..0000000
--- a/cras/src/dsp/eq.c
+++ /dev/null
@@ -1,148 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <stdlib.h>
-#include "eq.h"
-
-struct eq {
-	int n;
-	struct biquad biquad[MAX_BIQUADS_PER_EQ];
-};
-
-struct eq *eq_new()
-{
-	struct eq *eq = (struct eq *)calloc(1, sizeof(*eq));
-	return eq;
-}
-
-void eq_free(struct eq *eq)
-{
-	free(eq);
-}
-
-int eq_append_biquad(struct eq *eq, enum biquad_type type, float freq, float Q,
-		     float gain)
-{
-	if (eq->n >= MAX_BIQUADS_PER_EQ)
-		return -1;
-	biquad_set(&eq->biquad[eq->n++], type, freq, Q, gain);
-	return 0;
-}
-
-int eq_append_biquad_direct(struct eq *eq, const struct biquad *biquad)
-{
-	if (eq->n >= MAX_BIQUADS_PER_EQ)
-		return -1;
-	eq->biquad[eq->n++] = *biquad;
-	return 0;
-}
-
-/* This is the prototype of the processing loop. */
-void eq_process1(struct eq *eq, float *data, int count)
-{
-	int i, j;
-	for (i = 0; i < eq->n; i++) {
-		struct biquad *q = &eq->biquad[i];
-		float x1 = q->x1;
-		float x2 = q->x2;
-		float y1 = q->y1;
-		float y2 = q->y2;
-		float b0 = q->b0;
-		float b1 = q->b1;
-		float b2 = q->b2;
-		float a1 = q->a1;
-		float a2 = q->a2;
-		for (j = 0; j < count; j++) {
-			float x = data[j];
-			float y =
-				b0 * x + b1 * x1 + b2 * x2 - a1 * y1 - a2 * y2;
-			data[j] = y;
-			x2 = x1;
-			x1 = x;
-			y2 = y1;
-			y1 = y;
-		}
-		q->x1 = x1;
-		q->x2 = x2;
-		q->y1 = y1;
-		q->y2 = y2;
-	}
-}
-
-/* This is the actual processing loop used. It is the unrolled version of the
- * above prototype. */
-void eq_process(struct eq *eq, float *data, int count)
-{
-	int i, j;
-	for (i = 0; i < eq->n; i += 2) {
-		if (i + 1 == eq->n) {
-			struct biquad *q = &eq->biquad[i];
-			float x1 = q->x1;
-			float x2 = q->x2;
-			float y1 = q->y1;
-			float y2 = q->y2;
-			float b0 = q->b0;
-			float b1 = q->b1;
-			float b2 = q->b2;
-			float a1 = q->a1;
-			float a2 = q->a2;
-			for (j = 0; j < count; j++) {
-				float x = data[j];
-				float y = b0 * x + b1 * x1 + b2 * x2 - a1 * y1 -
-					  a2 * y2;
-				data[j] = y;
-				x2 = x1;
-				x1 = x;
-				y2 = y1;
-				y1 = y;
-			}
-			q->x1 = x1;
-			q->x2 = x2;
-			q->y1 = y1;
-			q->y2 = y2;
-		} else {
-			struct biquad *q = &eq->biquad[i];
-			struct biquad *r = &eq->biquad[i + 1];
-			float x1 = q->x1;
-			float x2 = q->x2;
-			float y1 = q->y1;
-			float y2 = q->y2;
-			float qb0 = q->b0;
-			float qb1 = q->b1;
-			float qb2 = q->b2;
-			float qa1 = q->a1;
-			float qa2 = q->a2;
-
-			float z1 = r->y1;
-			float z2 = r->y2;
-			float rb0 = r->b0;
-			float rb1 = r->b1;
-			float rb2 = r->b2;
-			float ra1 = r->a1;
-			float ra2 = r->a2;
-
-			for (j = 0; j < count; j++) {
-				float x = data[j];
-				float y = qb0 * x + qb1 * x1 + qb2 * x2 -
-					  qa1 * y1 - qa2 * y2;
-				float z = rb0 * y + rb1 * y1 + rb2 * y2 -
-					  ra1 * z1 - ra2 * z2;
-				data[j] = z;
-				x2 = x1;
-				x1 = x;
-				y2 = y1;
-				y1 = y;
-				z2 = z1;
-				z1 = z;
-			}
-			q->x1 = x1;
-			q->x2 = x2;
-			q->y1 = y1;
-			q->y2 = y2;
-			r->y1 = z1;
-			r->y2 = z2;
-		}
-	}
-}
diff --git a/cras/src/dsp/eq.h b/cras/src/dsp/eq.h
deleted file mode 100644
index 212f653..0000000
--- a/cras/src/dsp/eq.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef EQ_H_
-#define EQ_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* An EQ is a chain of biquad filters. See Web Audio API spec for details of the
- * biquad filters and their parameters. */
-
-#include "biquad.h"
-
-/* Maximum number of biquad filters an EQ can have */
-#define MAX_BIQUADS_PER_EQ 10
-
-struct eq;
-
-/* Create an EQ. */
-struct eq *eq_new();
-
-/* Free an EQ. */
-void eq_free(struct eq *eq);
-
-/* Append a biquad filter to an EQ. An EQ can have at most MAX_BIQUADS_PER_EQ
- * biquad filters.
- * Args:
- *    eq - The EQ we want to use.
- *    type - The type of the biquad filter we want to append.
- *    frequency - The value should be in the range [0, 1]. It is relative to
- *        half of the sampling rate.
- *    Q, gain - The meaning depends on the type of the filter. See Web Audio
- *        API for details.
- * Returns:
- *    0 if success. -1 if the eq has no room for more biquads.
- */
-int eq_append_biquad(struct eq *eq, enum biquad_type type, float freq, float Q,
-		     float gain);
-
-/* Append a biquad filter to an EQ. An EQ can have at most MAX_BIQUADS_PER_EQ
- * biquad filters. This is similar to eq_append_biquad(), but it specifies the
- * biquad coefficients directly.
- * Args:
- *    eq - The EQ we want to use.
- *    biquad - The parameters for the biquad filter.
- * Returns:
- *    0 if success. -1 if the eq has no room for more biquads.
- */
-int eq_append_biquad_direct(struct eq *eq, const struct biquad *biquad);
-
-/* Process a buffer of audio data through the EQ.
- * Args:
- *    eq - The EQ we want to use.
- *    data - The array of audio samples.
- *    count - The number of elements in the data array to process.
- */
-void eq_process(struct eq *eq, float *data, int count);
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif /* EQ_H_ */
diff --git a/cras/src/dsp/eq2.c b/cras/src/dsp/eq2.c
deleted file mode 100644
index f4f4185..0000000
--- a/cras/src/dsp/eq2.c
+++ /dev/null
@@ -1,343 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <stdlib.h>
-#include "eq2.h"
-
-struct eq2 {
-	int n[2];
-	struct biquad biquad[MAX_BIQUADS_PER_EQ2][2];
-};
-
-struct eq2 *eq2_new()
-{
-	struct eq2 *eq2 = (struct eq2 *)calloc(1, sizeof(*eq2));
-	int i, j;
-
-	/* Initialize all biquads to identity filter, so if two channels have
-	 * different numbers of biquads, it still works. */
-	for (i = 0; i < MAX_BIQUADS_PER_EQ2; i++)
-		for (j = 0; j < 2; j++)
-			biquad_set(&eq2->biquad[i][j], BQ_NONE, 0, 0, 0);
-
-	return eq2;
-}
-
-void eq2_free(struct eq2 *eq2)
-{
-	free(eq2);
-}
-
-int eq2_append_biquad(struct eq2 *eq2, int channel, enum biquad_type type,
-		      float freq, float Q, float gain)
-{
-	if (eq2->n[channel] >= MAX_BIQUADS_PER_EQ2)
-		return -1;
-	biquad_set(&eq2->biquad[eq2->n[channel]++][channel], type, freq, Q,
-		   gain);
-	return 0;
-}
-
-int eq2_append_biquad_direct(struct eq2 *eq2, int channel,
-			     const struct biquad *biquad)
-{
-	if (eq2->n[channel] >= MAX_BIQUADS_PER_EQ2)
-		return -1;
-	eq2->biquad[eq2->n[channel]++][channel] = *biquad;
-	return 0;
-}
-
-static inline void eq2_process_one(struct biquad (*bq)[2], float *data0,
-				   float *data1, int count)
-{
-	struct biquad *qL = &bq[0][0];
-	struct biquad *qR = &bq[0][1];
-
-	float x1L = qL->x1;
-	float x2L = qL->x2;
-	float y1L = qL->y1;
-	float y2L = qL->y2;
-	float b0L = qL->b0;
-	float b1L = qL->b1;
-	float b2L = qL->b2;
-	float a1L = qL->a1;
-	float a2L = qL->a2;
-
-	float x1R = qR->x1;
-	float x2R = qR->x2;
-	float y1R = qR->y1;
-	float y2R = qR->y2;
-	float b0R = qR->b0;
-	float b1R = qR->b1;
-	float b2R = qR->b2;
-	float a1R = qR->a1;
-	float a2R = qR->a2;
-
-	int j;
-	for (j = 0; j < count; j++) {
-		float xL = data0[j];
-		float xR = data1[j];
-
-		float yL = b0L * xL + b1L * x1L + b2L * x2L - a1L * y1L -
-			   a2L * y2L;
-		x2L = x1L;
-		x1L = xL;
-		y2L = y1L;
-		y1L = yL;
-
-		float yR = b0R * xR + b1R * x1R + b2R * x2R - a1R * y1R -
-			   a2R * y2R;
-		x2R = x1R;
-		x1R = xR;
-		y2R = y1R;
-		y1R = yR;
-
-		data0[j] = yL;
-		data1[j] = yR;
-	}
-
-	qL->x1 = x1L;
-	qL->x2 = x2L;
-	qL->y1 = y1L;
-	qL->y2 = y2L;
-	qR->x1 = x1R;
-	qR->x2 = x2R;
-	qR->y1 = y1R;
-	qR->y2 = y2R;
-}
-
-#ifdef __ARM_NEON__
-#include <arm_neon.h>
-static inline void eq2_process_two_neon(struct biquad (*bq)[2], float *data0,
-					float *data1, int count)
-{
-	struct biquad *qL = &bq[0][0];
-	struct biquad *rL = &bq[1][0];
-	struct biquad *qR = &bq[0][1];
-	struct biquad *rR = &bq[1][1];
-
-	float32x2_t x1 = { qL->x1, qR->x1 };
-	float32x2_t x2 = { qL->x2, qR->x2 };
-	float32x2_t y1 = { qL->y1, qR->y1 };
-	float32x2_t y2 = { qL->y2, qR->y2 };
-	float32x2_t qb0 = { qL->b0, qR->b0 };
-	float32x2_t qb1 = { qL->b1, qR->b1 };
-	float32x2_t qb2 = { qL->b2, qR->b2 };
-	float32x2_t qa1 = { qL->a1, qR->a1 };
-	float32x2_t qa2 = { qL->a2, qR->a2 };
-
-	float32x2_t z1 = { rL->y1, rR->y1 };
-	float32x2_t z2 = { rL->y2, rR->y2 };
-	float32x2_t rb0 = { rL->b0, rR->b0 };
-	float32x2_t rb1 = { rL->b1, rR->b1 };
-	float32x2_t rb2 = { rL->b2, rR->b2 };
-	float32x2_t ra1 = { rL->a1, rR->a1 };
-	float32x2_t ra2 = { rL->a2, rR->a2 };
-
-	// clang-format off
-	__asm__ __volatile__(
-		/* d0 = x, d1 = y, d2 = z */
-		"1:                                     \n"
-		"vmul.f32 d1, %P[qb1], %P[x1]           \n"
-		"vld1.32 d0[0], [%[data0]]              \n"
-		"vld1.32 d0[1], [%[data1]]              \n"
-		"subs %[count], #1                      \n"
-		"vmul.f32 d2, %P[rb1], %P[y1]           \n"
-		"vmla.f32 d1, %P[qb0], d0               \n"
-		"vmla.f32 d1, %P[qb2], %P[x2]           \n"
-		"vmov.f32 %P[x2], %P[x1]                \n"
-		"vmov.f32 %P[x1], d0                    \n"
-		"vmls.f32 d1, %P[qa1], %P[y1]           \n"
-		"vmls.f32 d1, %P[qa2], %P[y2]           \n"
-		"vmla.f32 d2, %P[rb0], d1               \n"
-		"vmla.f32 d2, %P[rb2], %P[y2]           \n"
-		"vmov.f32 %P[y2], %P[y1]                \n"
-		"vmov.f32 %P[y1], d1                    \n"
-		"vmls.f32 d2, %P[ra1], %P[z1]           \n"
-		"vmls.f32 d2, %P[ra2], %P[z2]           \n"
-		"vmov.f32 %P[z2], %P[z1]                \n"
-		"vmov.f32 %P[z1], d2                    \n"
-		"vst1.f32 d2[0], [%[data0]]!            \n"
-		"vst1.f32 d2[1], [%[data1]]!            \n"
-		"bne 1b                                 \n"
-		: /* output */
-		  [data0]"+r"(data0),
-		  [data1]"+r"(data1),
-		  [count]"+r"(count),
-		  [x1]"+w"(x1),
-		  [x2]"+w"(x2),
-		  [y1]"+w"(y1),
-		  [y2]"+w"(y2),
-		  [z1]"+w"(z1),
-		  [z2]"+w"(z2)
-		: /* input */
-		  [qb0]"w"(qb0),
-		  [qb1]"w"(qb1),
-		  [qb2]"w"(qb2),
-		  [qa1]"w"(qa1),
-		  [qa2]"w"(qa2),
-		  [rb0]"w"(rb0),
-		  [rb1]"w"(rb1),
-		  [rb2]"w"(rb2),
-		  [ra1]"w"(ra1),
-		  [ra2]"w"(ra2)
-		: /* clobber */
-		  "d0", "d1", "d2", "memory", "cc");
-	// clang-format on
-
-	qL->x1 = x1[0];
-	qL->x2 = x2[0];
-	qL->y1 = y1[0];
-	qL->y2 = y2[0];
-	rL->y1 = z1[0];
-	rL->y2 = z2[0];
-	qR->x1 = x1[1];
-	qR->x2 = x2[1];
-	qR->y1 = y1[1];
-	qR->y2 = y2[1];
-	rR->y1 = z1[1];
-	rR->y2 = z2[1];
-}
-#endif
-
-#if defined(__SSE3__) && defined(__x86_64__)
-#include <emmintrin.h>
-static inline void eq2_process_two_sse3(struct biquad (*bq)[2], float *data0,
-					float *data1, int count)
-{
-	struct biquad *qL = &bq[0][0];
-	struct biquad *rL = &bq[1][0];
-	struct biquad *qR = &bq[0][1];
-	struct biquad *rR = &bq[1][1];
-
-	__m128 x1 = { qL->x1, qR->x1 };
-	__m128 x2 = { qL->x2, qR->x2 };
-	__m128 y1 = { qL->y1, qR->y1 };
-	__m128 y2 = { qL->y2, qR->y2 };
-	__m128 qb0 = { qL->b0, qR->b0 };
-	__m128 qb1 = { qL->b1, qR->b1 };
-	__m128 qb2 = { qL->b2, qR->b2 };
-	__m128 qa1 = { qL->a1, qR->a1 };
-	__m128 qa2 = { qL->a2, qR->a2 };
-
-	__m128 z1 = { rL->y1, rR->y1 };
-	__m128 z2 = { rL->y2, rR->y2 };
-	__m128 rb0 = { rL->b0, rR->b0 };
-	__m128 rb1 = { rL->b1, rR->b1 };
-	__m128 rb2 = { rL->b2, rR->b2 };
-	__m128 ra1 = { rL->a1, rR->a1 };
-	__m128 ra2 = { rL->a2, rR->a2 };
-
-	// clang-format off
-	__asm__ __volatile__(
-		"1:                                     \n"
-		"movss (%[data0]), %%xmm2               \n"
-		"movss (%[data1]), %%xmm1               \n"
-		"unpcklps %%xmm1, %%xmm2                \n"
-		"mulps %[qb2],%[x2]                     \n"
-		"lddqu %[qb0],%%xmm0                    \n"
-		"mulps %[ra2],%[z2]                     \n"
-		"lddqu %[qb1],%%xmm1                    \n"
-		"mulps %%xmm2,%%xmm0                    \n"
-		"mulps %[x1],%%xmm1                     \n"
-		"addps %%xmm1,%%xmm0                    \n"
-		"movaps %[qa1],%%xmm1                   \n"
-		"mulps %[y1],%%xmm1                     \n"
-		"addps %[x2],%%xmm0                     \n"
-		"movaps %[rb1],%[x2]                    \n"
-		"mulps %[y1],%[x2]                      \n"
-		"subps %%xmm1,%%xmm0                    \n"
-		"movaps %[qa2],%%xmm1                   \n"
-		"mulps %[y2],%%xmm1                     \n"
-		"mulps %[rb2],%[y2]                     \n"
-		"subps %%xmm1,%%xmm0                    \n"
-		"movaps %[rb0],%%xmm1                   \n"
-		"mulps %%xmm0,%%xmm1                    \n"
-		"addps %[x2],%%xmm1                     \n"
-		"movaps %[x1],%[x2]                     \n"
-		"movaps %%xmm2,%[x1]                    \n"
-		"addps %[y2],%%xmm1                     \n"
-		"movaps %[ra1],%[y2]                    \n"
-		"mulps %[z1],%[y2]                      \n"
-		"subps %[y2],%%xmm1                     \n"
-		"movaps %[y1],%[y2]                     \n"
-		"movaps %%xmm0,%[y1]                    \n"
-		"subps %[z2],%%xmm1                     \n"
-		"movaps %[z1],%[z2]                     \n"
-		"movaps %%xmm1,%[z1]                    \n"
-		"movss %%xmm1, (%[data0])               \n"
-		"shufps $1, %%xmm1, %%xmm1              \n"
-		"movss %%xmm1, (%[data1])               \n"
-		"add $4, %[data0]                       \n"
-		"add $4, %[data1]                       \n"
-		"sub $1, %[count]                       \n"
-		"jnz 1b                                 \n"
-		: /* output */
-		  [data0]"+r"(data0),
-		  [data1]"+r"(data1),
-		  [count]"+r"(count),
-		  [x1]"+x"(x1),
-		  [x2]"+x"(x2),
-		  [y1]"+x"(y1),
-		  [y2]"+x"(y2),
-		  [z1]"+x"(z1),
-		  [z2]"+x"(z2)
-		: /* input */
-		  [qb0]"m"(qb0),
-		  [qb1]"m"(qb1),
-		  [qb2]"m"(qb2),
-		  [qa1]"x"(qa1),
-		  [qa2]"x"(qa2),
-		  [rb0]"x"(rb0),
-		  [rb1]"x"(rb1),
-		  [rb2]"x"(rb2),
-		  [ra1]"x"(ra1),
-		  [ra2]"x"(ra2)
-		: /* clobber */
-		  "xmm0", "xmm1", "xmm2", "memory", "cc");
-	// clang-format on
-
-	qL->x1 = x1[0];
-	qL->x2 = x2[0];
-	qL->y1 = y1[0];
-	qL->y2 = y2[0];
-	rL->y1 = z1[0];
-	rL->y2 = z2[0];
-	qR->x1 = x1[1];
-	qR->x2 = x2[1];
-	qR->y1 = y1[1];
-	qR->y2 = y2[1];
-	rR->y1 = z1[1];
-	rR->y2 = z2[1];
-}
-#endif
-
-void eq2_process(struct eq2 *eq2, float *data0, float *data1, int count)
-{
-	int i;
-	int n;
-	if (!count)
-		return;
-	n = eq2->n[0];
-	if (eq2->n[1] > n)
-		n = eq2->n[1];
-	for (i = 0; i < n; i += 2) {
-		if (i + 1 == n) {
-			eq2_process_one(&eq2->biquad[i], data0, data1, count);
-		} else {
-#if defined(__ARM_NEON__)
-			eq2_process_two_neon(&eq2->biquad[i], data0, data1,
-					     count);
-#elif defined(__SSE3__) && defined(__x86_64__)
-			eq2_process_two_sse3(&eq2->biquad[i], data0, data1,
-					     count);
-#else
-			eq2_process_one(&eq2->biquad[i], data0, data1, count);
-			eq2_process_one(&eq2->biquad[i + 1], data0, data1,
-					count);
-#endif
-		}
-	}
-}
diff --git a/cras/src/dsp/eq2.h b/cras/src/dsp/eq2.h
deleted file mode 100644
index dfa9a1d..0000000
--- a/cras/src/dsp/eq2.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef EQ2_H_
-#define EQ2_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* "eq2" is a two channel version of the "eq" filter. It processes two channels
- * of data at once to increase performance. */
-
-#include "biquad.h"
-
-/* Maximum number of biquad filters an EQ2 can have per channel */
-#define MAX_BIQUADS_PER_EQ2 10
-
-struct eq2;
-
-/* Create an EQ2. */
-struct eq2 *eq2_new();
-
-/* Free an EQ2. */
-void eq2_free(struct eq2 *eq2);
-
-/* Append a biquad filter to an EQ2. An EQ2 can have at most MAX_BIQUADS_PER_EQ2
- * biquad filters per channel.
- * Args:
- *    eq2 - The EQ2 we want to use.
- *    channel - 0 or 1. The channel we want to append the filter to.
- *    type - The type of the biquad filter we want to append.
- *    frequency - The value should be in the range [0, 1]. It is relative to
- *        half of the sampling rate.
- *    Q, gain - The meaning depends on the type of the filter. See Web Audio
- *        API for details.
- * Returns:
- *    0 if success. -1 if the eq has no room for more biquads.
- */
-int eq2_append_biquad(struct eq2 *eq2, int channel, enum biquad_type type,
-		      float freq, float Q, float gain);
-
-/* Append a biquad filter to an EQ2. An EQ2 can have at most MAX_BIQUADS_PER_EQ2
- * biquad filters. This is similar to eq2_append_biquad(), but it specifies the
- * biquad coefficients directly.
- * Args:
- *    eq2 - The EQ2 we want to use.
- *    channel - 0 or 1. The channel we want to append the filter to.
- *    biquad - The parameters for the biquad filter.
- * Returns:
- *    0 if success. -1 if the eq has no room for more biquads.
- */
-int eq2_append_biquad_direct(struct eq2 *eq2, int channel,
-			     const struct biquad *biquad);
-
-/* Process a buffer of audio data through the EQ2.
- * Args:
- *    eq2 - The EQ2 we want to use.
- *    data0 - The array of channel 0 audio samples.
- *    data1 - The array of channel 1 audio samples.
- *    count - The number of elements in each of the data array to process.
- */
-void eq2_process(struct eq2 *eq2, float *data0, float *data1, int count);
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif /* EQ2_H_ */
diff --git a/cras/src/dsp/tests/cmpraw.c b/cras/src/dsp/tests/cmpraw.c
deleted file mode 100644
index 911f19d..0000000
--- a/cras/src/dsp/tests/cmpraw.c
+++ /dev/null
@@ -1,58 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <math.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include "raw.h"
-
-/* Compare the difference between two raw files */
-
-static inline double max(double a, double b)
-{
-	return (a > b) ? a : b;
-}
-
-int main(int argc, char **argv)
-{
-	size_t frame1, frame2;
-	float *data1, *data2;
-	size_t i, n, changed;
-	double diff = 0;
-	double maxdiff = 0;
-
-	if (argc != 3) {
-		fprintf(stderr, "usage: cmpraw 1.raw 2.raw\n");
-		exit(1);
-	}
-
-	data1 = read_raw(argv[1], &frame1);
-	data2 = read_raw(argv[2], &frame2);
-
-	if (frame1 != frame2) {
-		fprintf(stderr, "mismatch size (%zu vs %zu)\n", frame1, frame2);
-		exit(1);
-	}
-
-	n = frame1 * 2;
-	changed = 0;
-	for (i = 0; i < n; i++) {
-		if (data1[i] != data2[i]) {
-			changed++;
-			diff += fabs(data1[i] - data2[i]);
-			maxdiff = max(fabs(data1[i] - data2[i]), maxdiff);
-		}
-	}
-	printf("avg diff = %g, max diff = %g, changed = %.3f%%\n", diff / n,
-	       maxdiff * 32768, changed * 100.0f / n);
-
-	free(data1);
-	free(data2);
-	return 0;
-}
diff --git a/cras/src/dsp/tests/crossover2_test.c b/cras/src/dsp/tests/crossover2_test.c
deleted file mode 100644
index f313d38..0000000
--- a/cras/src/dsp/tests/crossover2_test.c
+++ /dev/null
@@ -1,89 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <assert.h>
-#include <time.h>
-#include <memory.h>
-
-#include "crossover2.h"
-#include "dsp_test_util.h"
-#include "dsp_util.h"
-#include "raw.h"
-
-#ifndef min
-#define min(a, b)                                                              \
-	({                                                                     \
-		__typeof__(a) _a = (a);                                        \
-		__typeof__(b) _b = (b);                                        \
-		_a < _b ? _a : _b;                                             \
-	})
-#endif
-
-static double tp_diff(struct timespec *tp2, struct timespec *tp1)
-{
-	return (tp2->tv_sec - tp1->tv_sec) +
-	       (tp2->tv_nsec - tp1->tv_nsec) * 1e-9;
-}
-
-void process(struct crossover2 *xo2, int count, float *data0L, float *data0R,
-	     float *data1L, float *data1R, float *data2L, float *data2R)
-{
-	int start;
-	for (start = 0; start < count; start += 2048)
-		crossover2_process(xo2, min(2048, count - start),
-				   data0L + start, data0R + start,
-				   data1L + start, data1R + start,
-				   data2L + start, data2R + start);
-}
-
-int main(int argc, char **argv)
-{
-	size_t frames;
-	float *data0, *data1, *data2;
-	double NQ = 44100 / 2;
-	struct timespec tp1, tp2;
-	struct crossover2 xo2;
-
-	if (argc != 3 && argc != 6) {
-		printf("Usage: crossover2_test input.raw output.raw "
-		       "[low.raw mid.raw high.raw]\n");
-		return 1;
-	}
-
-	dsp_enable_flush_denormal_to_zero();
-	dsp_util_clear_fp_exceptions();
-
-	data0 = read_raw(argv[1], &frames);
-	data1 = (float *)malloc(sizeof(float) * frames * 2);
-	data2 = (float *)malloc(sizeof(float) * frames * 2);
-
-	crossover2_init(&xo2, 400 / NQ, 4000 / NQ);
-	clock_gettime(CLOCK_THREAD_CPUTIME_ID, &tp1);
-	process(&xo2, frames, data0, data0 + frames, data1, data1 + frames,
-		data2, data2 + frames);
-	clock_gettime(CLOCK_THREAD_CPUTIME_ID, &tp2);
-	printf("processing takes %g seconds for %zu samples\n",
-	       tp_diff(&tp2, &tp1), frames * 2);
-
-	if (argc == 6) {
-		write_raw(argv[3], data0, frames);
-		write_raw(argv[4], data1, frames);
-		write_raw(argv[5], data2, frames);
-	}
-
-	int i;
-	for (i = 0; i < frames * 2; i++)
-		data0[i] += data1[i] + data2[i];
-	write_raw(argv[2], data0, frames);
-
-	free(data0);
-	free(data1);
-	free(data2);
-
-	dsp_util_print_fp_exceptions();
-	return 0;
-}
diff --git a/cras/src/dsp/tests/crossover_test.c b/cras/src/dsp/tests/crossover_test.c
deleted file mode 100644
index 267438d..0000000
--- a/cras/src/dsp/tests/crossover_test.c
+++ /dev/null
@@ -1,93 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <assert.h>
-#include <time.h>
-#include <memory.h>
-
-#include "crossover.h"
-#include "dsp_test_util.h"
-#include "dsp_util.h"
-#include "raw.h"
-
-#ifndef min
-#define min(a, b)                                                              \
-	({                                                                     \
-		__typeof__(a) _a = (a);                                        \
-		__typeof__(b) _b = (b);                                        \
-		_a < _b ? _a : _b;                                             \
-	})
-#endif
-
-static double tp_diff(struct timespec *tp2, struct timespec *tp1)
-{
-	return (tp2->tv_sec - tp1->tv_sec) +
-	       (tp2->tv_nsec - tp1->tv_nsec) * 1e-9;
-}
-
-void process(struct crossover *xo, int count, float *data0, float *data1,
-	     float *data2)
-{
-	int start;
-	for (start = 0; start < count; start += 2048)
-		crossover_process(xo, min(2048, count - start), data0 + start,
-				  data1 + start, data2 + start);
-}
-
-int main(int argc, char **argv)
-{
-	size_t frames;
-	float *data0, *data1, *data2;
-	double NQ = 44100 / 2;
-	struct timespec tp1, tp2;
-	struct crossover xo;
-
-	if (argc != 3 && argc != 6) {
-		printf("Usage: crossover_test input.raw output.raw "
-		       "[low.raw mid.raw high.raw]\n");
-		return 1;
-	}
-
-	dsp_enable_flush_denormal_to_zero();
-	dsp_util_clear_fp_exceptions();
-
-	data0 = read_raw(argv[1], &frames);
-	data1 = (float *)malloc(sizeof(float) * frames * 2);
-	data2 = (float *)malloc(sizeof(float) * frames * 2);
-
-	crossover_init(&xo, 400 / NQ, 4000 / NQ);
-	clock_gettime(CLOCK_THREAD_CPUTIME_ID, &tp1);
-	process(&xo, frames, data0, data1, data2);
-	clock_gettime(CLOCK_THREAD_CPUTIME_ID, &tp2);
-	printf("processing takes %g seconds for %zu samples\n",
-	       tp_diff(&tp2, &tp1), frames);
-
-	crossover_init(&xo, 400 / NQ, 4000 / NQ);
-	clock_gettime(CLOCK_THREAD_CPUTIME_ID, &tp1);
-	process(&xo, frames, data0 + frames, data1 + frames, data2 + frames);
-	clock_gettime(CLOCK_THREAD_CPUTIME_ID, &tp2);
-	printf("processing takes %g seconds for %zu samples\n",
-	       tp_diff(&tp2, &tp1), frames);
-
-	if (argc == 6) {
-		write_raw(argv[3], data0, frames);
-		write_raw(argv[4], data1, frames);
-		write_raw(argv[5], data2, frames);
-	}
-
-	int i;
-	for (i = 0; i < frames * 2; i++)
-		data0[i] += data1[i] + data2[i];
-	write_raw(argv[2], data0, frames);
-
-	free(data0);
-	free(data1);
-	free(data2);
-
-	dsp_util_print_fp_exceptions();
-	return 0;
-}
diff --git a/cras/src/dsp/tests/dcblock_test.c b/cras/src/dsp/tests/dcblock_test.c
deleted file mode 100644
index 7beaa9f..0000000
--- a/cras/src/dsp/tests/dcblock_test.c
+++ /dev/null
@@ -1,79 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <time.h>
-
-#include "dsp_test_util.h"
-#include "dsp_util.h"
-#include "dcblock.h"
-#include "raw.h"
-
-#ifndef min
-#define min(a, b)                                                              \
-	({                                                                     \
-		__typeof__(a) _a = (a);                                        \
-		__typeof__(b) _b = (b);                                        \
-		_a < _b ? _a : _b;                                             \
-	})
-#endif
-
-static double tp_diff(struct timespec *tp2, struct timespec *tp1)
-{
-	return (tp2->tv_sec - tp1->tv_sec) +
-	       (tp2->tv_nsec - tp1->tv_nsec) * 1e-9;
-}
-
-/* Processes a buffer of data chunk by chunk using the filter */
-static void process(struct dcblock *dcblock, float *data, int count)
-{
-	int start;
-	for (start = 0; start < count; start += 128)
-		dcblock_process(dcblock, data + start, min(128, count - start));
-}
-
-/* Runs the filters on an input file */
-static void test_file(const char *input_filename, const char *output_filename)
-{
-	size_t frames;
-	struct timespec tp1, tp2;
-	struct dcblock *dcblockl;
-	struct dcblock *dcblockr;
-
-	float *data = read_raw(input_filename, &frames);
-
-	dcblockl = dcblock_new(0.995, 48000);
-	dcblockr = dcblock_new(0.995, 48000);
-	clock_gettime(CLOCK_THREAD_CPUTIME_ID, &tp1);
-	process(dcblockl, data, frames);
-	process(dcblockr, data + frames, frames);
-	clock_gettime(CLOCK_THREAD_CPUTIME_ID, &tp2);
-	printf("processing takes %g seconds for %zu samples\n",
-	       tp_diff(&tp2, &tp1), frames);
-	dcblock_free(dcblockl);
-	dcblock_free(dcblockr);
-
-	write_raw(output_filename, data, frames);
-	free(data);
-}
-
-int main(int argc, char **argv)
-{
-	dsp_enable_flush_denormal_to_zero();
-	if (dsp_util_has_denormal())
-		printf("denormal still supported?\n");
-	else
-		printf("denormal disabled\n");
-	dsp_util_clear_fp_exceptions();
-
-	if (argc == 3)
-		test_file(argv[1], argv[2]);
-	else
-		printf("Usage: dcblock_test input.raw output.raw\n");
-
-	dsp_util_print_fp_exceptions();
-	return 0;
-}
diff --git a/cras/src/dsp/tests/drc_test.c b/cras/src/dsp/tests/drc_test.c
deleted file mode 100644
index 17ccbcd..0000000
--- a/cras/src/dsp/tests/drc_test.c
+++ /dev/null
@@ -1,100 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-#include <stdio.h>
-#include <stdlib.h>
-#include <time.h>
-
-#include "dsp_test_util.h"
-#include "dsp_util.h"
-#include "drc.h"
-#include "raw.h"
-
-#ifndef min
-#define min(a, b)                                                              \
-	({                                                                     \
-		__typeof__(a) _a = (a);                                        \
-		__typeof__(b) _b = (b);                                        \
-		_a < _b ? _a : _b;                                             \
-	})
-#endif
-
-static double tp_diff(struct timespec *tp2, struct timespec *tp1)
-{
-	return (tp2->tv_sec - tp1->tv_sec) +
-	       (tp2->tv_nsec - tp1->tv_nsec) * 1e-9;
-}
-
-static void process(struct drc *drc, float *buf, size_t frames)
-{
-	struct timespec tp1, tp2;
-	int start;
-	float *data[2];
-	int chunk;
-	clock_gettime(CLOCK_THREAD_CPUTIME_ID, &tp1);
-	for (start = 0; start < frames;) {
-		data[0] = buf + start;
-		data[1] = buf + start + frames;
-		chunk = min(DRC_PROCESS_MAX_FRAMES, frames - start);
-		drc_process(drc, data, chunk);
-		start += chunk;
-	}
-	clock_gettime(CLOCK_THREAD_CPUTIME_ID, &tp2);
-	printf("drc processing takes %g seconds for %zu samples\n",
-	       tp_diff(&tp2, &tp1), frames * 2);
-}
-
-int main(int argc, char **argv)
-{
-	double NQ = 44100 / 2; /* nyquist frequency */
-	struct drc *drc;
-	size_t frames;
-	float *buf;
-
-	if (argc != 3) {
-		printf("Usage: drc_test input.raw output.raw\n");
-		return 1;
-	}
-
-	dsp_enable_flush_denormal_to_zero();
-	dsp_util_clear_fp_exceptions();
-	drc = drc_new(44100);
-
-	drc->emphasis_disabled = 0;
-	drc_set_param(drc, 0, PARAM_CROSSOVER_LOWER_FREQ, 0);
-	drc_set_param(drc, 0, PARAM_ENABLED, 1);
-	drc_set_param(drc, 0, PARAM_THRESHOLD, -29);
-	drc_set_param(drc, 0, PARAM_KNEE, 3);
-	drc_set_param(drc, 0, PARAM_RATIO, 6.677);
-	drc_set_param(drc, 0, PARAM_ATTACK, 0.02);
-	drc_set_param(drc, 0, PARAM_RELEASE, 0.2);
-	drc_set_param(drc, 0, PARAM_POST_GAIN, -7);
-
-	drc_set_param(drc, 1, PARAM_CROSSOVER_LOWER_FREQ, 200 / NQ);
-	drc_set_param(drc, 1, PARAM_ENABLED, 1);
-	drc_set_param(drc, 1, PARAM_THRESHOLD, -32);
-	drc_set_param(drc, 1, PARAM_KNEE, 23);
-	drc_set_param(drc, 1, PARAM_RATIO, 12);
-	drc_set_param(drc, 1, PARAM_ATTACK, 0.02);
-	drc_set_param(drc, 1, PARAM_RELEASE, 0.2);
-	drc_set_param(drc, 1, PARAM_POST_GAIN, 0.7);
-
-	drc_set_param(drc, 2, PARAM_CROSSOVER_LOWER_FREQ, 1200 / NQ);
-	drc_set_param(drc, 2, PARAM_ENABLED, 1);
-	drc_set_param(drc, 2, PARAM_THRESHOLD, -24);
-	drc_set_param(drc, 2, PARAM_KNEE, 30);
-	drc_set_param(drc, 2, PARAM_RATIO, 1);
-	drc_set_param(drc, 2, PARAM_ATTACK, 0.001);
-	drc_set_param(drc, 2, PARAM_RELEASE, 1);
-	drc_set_param(drc, 2, PARAM_POST_GAIN, 0);
-
-	drc_init(drc);
-	buf = read_raw(argv[1], &frames);
-	process(drc, buf, frames);
-	write_raw(argv[2], buf, frames);
-	drc_free(drc);
-	free(buf);
-	dsp_util_print_fp_exceptions();
-	return 0;
-}
diff --git a/cras/src/dsp/tests/dsp_test_util.c b/cras/src/dsp/tests/dsp_test_util.c
deleted file mode 100644
index e52a481..0000000
--- a/cras/src/dsp/tests/dsp_test_util.c
+++ /dev/null
@@ -1,37 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <fenv.h>
-#include <float.h>
-#include <stdio.h>
-#include "dsp_test_util.h"
-
-int dsp_util_has_denormal()
-{
-	float x = 1;
-	while (x >= FLT_MIN)
-		x /= 2;
-	return x > 0;
-}
-
-void dsp_util_clear_fp_exceptions()
-{
-	feclearexcept(FE_ALL_EXCEPT);
-}
-
-void dsp_util_print_fp_exceptions()
-{
-	int excepts = fetestexcept(FE_ALL_EXCEPT);
-	printf("floating-point exceptions: ");
-	if (excepts & FE_DIVBYZERO)
-		printf("FE_DIVBYZERO ");
-	if (excepts & FE_INVALID)
-		printf("FE_INVALID ");
-	if (excepts & FE_OVERFLOW)
-		printf("FE_OVERFLOW ");
-	if (excepts & FE_UNDERFLOW)
-		printf("FE_UNDERFLOW ");
-	printf("\n");
-}
diff --git a/cras/src/dsp/tests/dsp_test_util.h b/cras/src/dsp/tests/dsp_test_util.h
deleted file mode 100644
index eb97815..0000000
--- a/cras/src/dsp/tests/dsp_test_util.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef DSP_TEST_UTIL_H_
-#define DSP_TEST_UTIL_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Tests if the system supports denormal numbers. Returns 1 if so, 0
- * otherwise.*/
-int dsp_util_has_denormal();
-
-/* Clears floating point exceptions. For debugging only. */
-void dsp_util_clear_fp_exceptions();
-
-/* Prints floating point exceptions to stdout. For debugging only. */
-void dsp_util_print_fp_exceptions();
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif /* DSP_TEST_UTIL_H_ */
diff --git a/cras/src/dsp/tests/dsp_util_test.c b/cras/src/dsp/tests/dsp_util_test.c
deleted file mode 100644
index 44f7257..0000000
--- a/cras/src/dsp/tests/dsp_util_test.c
+++ /dev/null
@@ -1,389 +0,0 @@
-/* Copyright 2016 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <math.h> /* for abs() */
-#include <stdio.h> /* for printf() */
-#include <string.h> /* for memset() */
-#include <stdint.h> /* for uint64 definition */
-#include <stdlib.h> /* for exit() definition */
-#include <time.h> /* for clock_gettime */
-
-#include "../drc_math.h"
-#include "../dsp_util.h"
-
-/* Constant for converting time to milliseconds. */
-#define BILLION 1000000000LL
-/* Number of iterations for performance testing. */
-#define ITERATIONS 400000
-
-#if defined(__aarch64__)
-int16_t float_to_short(float a)
-{
-	int32_t ret;
-	asm volatile("fcvtas %s[ret], %s[a]\n"
-		     "sqxtn %h[ret], %s[ret]\n"
-		     : [ret] "=w"(ret)
-		     : [a] "w"(a)
-		     :);
-	return (int16_t)(ret);
-}
-#else
-int16_t float_to_short(float a)
-{
-	a += (a >= 0) ? 0.5f : -0.5f;
-	return (int16_t)(max(-32768, min(32767, a)));
-}
-#endif
-
-void dsp_util_deinterleave_reference(int16_t *input, float *const *output,
-				     int channels, int frames)
-{
-	float *output_ptr[channels];
-	int i, j;
-
-	for (i = 0; i < channels; i++)
-		output_ptr[i] = output[i];
-
-	for (i = 0; i < frames; i++)
-		for (j = 0; j < channels; j++)
-			*(output_ptr[j]++) = *input++ / 32768.0f;
-}
-
-void dsp_util_interleave_reference(float *const *input, int16_t *output,
-				   int channels, int frames)
-{
-	float *input_ptr[channels];
-	int i, j;
-
-	for (i = 0; i < channels; i++)
-		input_ptr[i] = input[i];
-
-	for (i = 0; i < frames; i++)
-		for (j = 0; j < channels; j++) {
-			float f = *(input_ptr[j]++) * 32768.0f;
-			*output++ = float_to_short(f);
-		}
-}
-
-/* Use fixed size allocation to avoid performance fluctuation of allocation. */
-#define MAXSAMPLES 4096
-#define MINSAMPLES 256
-/* PAD buffer to check for overflows. */
-#define PAD 4096
-
-void TestRounding(float in, int16_t expected, int samples)
-{
-	int i;
-	int max_diff;
-	int d;
-
-	short *in_shorts = (short *)malloc(MAXSAMPLES * 2 * 2 + PAD);
-	float *out_floats_left_c = (float *)malloc(MAXSAMPLES * 4 + PAD);
-	float *out_floats_right_c = (float *)malloc(MAXSAMPLES * 4 + PAD);
-	float *out_floats_left_opt = (float *)malloc(MAXSAMPLES * 4 + PAD);
-	float *out_floats_right_opt = (float *)malloc(MAXSAMPLES * 4 + PAD);
-	short *out_shorts_c = (short *)malloc(MAXSAMPLES * 2 * 2 + PAD);
-	short *out_shorts_opt = (short *)malloc(MAXSAMPLES * 2 * 2 + PAD);
-
-	memset(in_shorts, 0xfb, MAXSAMPLES * 2 * 2 + PAD);
-	memset(out_floats_left_c, 0xfb, MAXSAMPLES * 4 + PAD);
-	memset(out_floats_right_c, 0xfb, MAXSAMPLES * 4 + PAD);
-	memset(out_floats_left_opt, 0xfb, MAXSAMPLES * 4 + PAD);
-	memset(out_floats_right_opt, 0xfb, MAXSAMPLES * 4 + PAD);
-	memset(out_shorts_c, 0xfb, MAXSAMPLES * 2 * 2 + PAD);
-	memset(out_shorts_opt, 0xfb, MAXSAMPLES * 2 * 2 + PAD);
-
-	float *out_floats_ptr_c[2];
-	float *out_floats_ptr_opt[2];
-
-	out_floats_ptr_c[0] = out_floats_left_c;
-	out_floats_ptr_c[1] = out_floats_right_c;
-	out_floats_ptr_opt[0] = out_floats_left_opt;
-	out_floats_ptr_opt[1] = out_floats_right_opt;
-
-	for (i = 0; i < MAXSAMPLES; ++i) {
-		out_floats_left_c[i] = in;
-		out_floats_right_c[i] = in;
-	}
-
-	/*  reference C interleave */
-	dsp_util_interleave_reference(out_floats_ptr_c, out_shorts_c, 2,
-				      samples);
-
-	/* measure optimized interleave */
-	for (i = 0; i < ITERATIONS; ++i) {
-		dsp_util_interleave(out_floats_ptr_c, (uint8_t *)out_shorts_opt,
-				    2, SND_PCM_FORMAT_S16_LE, samples);
-	}
-
-	max_diff = 0;
-	for (i = 0; i < (MAXSAMPLES * 2 + PAD / 2); ++i) {
-		d = abs(out_shorts_c[i] - out_shorts_opt[i]);
-		if (d > max_diff) {
-			max_diff = d;
-		}
-	}
-	printf("test interleave compare %6d, %10f %13f %6d %6d %6d %s\n",
-	       max_diff, in, in * 32768.0f, out_shorts_c[0], out_shorts_opt[0],
-	       expected,
-	       max_diff == 0 ? "PASS" :
-			       (out_shorts_opt[0] == expected ?
-					"EXPECTED DIFFERENCE" :
-					"UNEXPECTED DIFFERENCE"));
-
-	/* measure reference C deinterleave */
-	dsp_util_deinterleave_reference(in_shorts, out_floats_ptr_c, 2,
-					samples);
-
-	/* measure optimized deinterleave */
-	dsp_util_deinterleave((uint8_t *)in_shorts, out_floats_ptr_opt, 2,
-			      SND_PCM_FORMAT_S16_LE, samples);
-
-	d = memcmp(out_floats_ptr_c[0], out_floats_ptr_opt[0], samples * 4);
-	if (d)
-		printf("left compare %d, %f %f\n", d, out_floats_ptr_c[0][0],
-		       out_floats_ptr_opt[0][0]);
-	d = memcmp(out_floats_ptr_c[1], out_floats_ptr_opt[1], samples * 4);
-	if (d)
-		printf("right compare %d, %f %f\n", d, out_floats_ptr_c[1][0],
-		       out_floats_ptr_opt[1][0]);
-
-	free(in_shorts);
-	free(out_floats_left_c);
-	free(out_floats_right_c);
-	free(out_floats_left_opt);
-	free(out_floats_right_opt);
-	free(out_shorts_c);
-	free(out_shorts_opt);
-}
-
-int main(int argc, char **argv)
-{
-	float e = 0.000000001f;
-	int samples = 16;
-
-	dsp_enable_flush_denormal_to_zero();
-
-	// Print headings for TestRounding output.
-	printf("test interleave compare maxdif,     float,   float * 32k      "
-	       "C   SIMD expect pass\n");
-
-	// test clamping
-	TestRounding(1.0f, 32767, samples);
-	TestRounding(-1.0f, -32768, samples);
-	TestRounding(1.1f, 32767, samples);
-	TestRounding(-1.1f, -32768, samples);
-	TestRounding(2000000000.f / 32768.f, 32767, samples);
-	TestRounding(-2000000000.f / 32768.f, -32768, samples);
-
-	/* Infinity produces zero on arm64. */
-#if defined(__aarch64__)
-#define EXPECTED_INF_RESULT 0
-#define EXPECTED_NEGINF_RESULT 0
-#elif defined(__i386__) || defined(__x86_64__)
-#define EXPECTED_INF_RESULT -32768
-#define EXPECTED_NEGINF_RESULT 0
-#else
-#define EXPECTED_INF_RESULT 32767
-#define EXPECTED_NEGINF_RESULT -32768
-#endif
-
-	TestRounding(5000000000.f / 32768.f, EXPECTED_INF_RESULT, samples);
-	TestRounding(-5000000000.f / 32768.f, EXPECTED_NEGINF_RESULT, samples);
-
-	// test infinity
-	union ieee754_float inf;
-	inf.ieee.negative = 0;
-	inf.ieee.exponent = 0xfe;
-	inf.ieee.mantissa = 0x7fffff;
-	TestRounding(inf.f, EXPECTED_INF_RESULT, samples); // expect fail
-	inf.ieee.negative = 1;
-	inf.ieee.exponent = 0xfe;
-	inf.ieee.mantissa = 0x7fffff;
-	TestRounding(inf.f, EXPECTED_NEGINF_RESULT, samples); // expect fail
-
-	// test rounding
-	TestRounding(0.25f, 8192, samples);
-	TestRounding(-0.25f, -8192, samples);
-	TestRounding(0.50f, 16384, samples);
-	TestRounding(-0.50f, -16384, samples);
-	TestRounding(1.0f / 32768.0f, 1, samples);
-	TestRounding(-1.0f / 32768.0f, -1, samples);
-	TestRounding(1.0f / 32768.0f + e, 1, samples);
-	TestRounding(-1.0f / 32768.0f - e, -1, samples);
-	TestRounding(1.0f / 32768.0f - e, 1, samples);
-	TestRounding(-1.0f / 32768.0f + e, -1, samples);
-
-	/* Rounding on 'tie' is different for Intel. */
-#if defined(__i386__) || defined(__x86_64__)
-	TestRounding(0.5f / 32768.0f, 0, samples); /* Expect round to even */
-	TestRounding(-0.5f / 32768.0f, 0, samples);
-#else
-	TestRounding(0.5f / 32768.0f, 1, samples); /* Expect round away */
-	TestRounding(-0.5f / 32768.0f, -1, samples);
-#endif
-
-	TestRounding(0.5f / 32768.0f + e, 1, samples);
-	TestRounding(-0.5f / 32768.0f - e, 1, samples);
-	TestRounding(0.5f / 32768.0f - e, 0, samples);
-	TestRounding(-0.5f / 32768.0f + e, 0, samples);
-
-	TestRounding(1.5f / 32768.0f, 2, samples);
-	TestRounding(-1.5f / 32768.0f, -2, samples);
-	TestRounding(1.5f / 32768.0f + e, 2, samples);
-	TestRounding(-1.5f / 32768.0f - e, -2, samples);
-	TestRounding(1.5f / 32768.0f - e, 1, samples);
-	TestRounding(-1.5f / 32768.0f + e, -1, samples);
-
-	/* Test denormals */
-	union ieee754_float denorm;
-	denorm.ieee.negative = 0;
-	denorm.ieee.exponent = 0;
-	denorm.ieee.mantissa = 1;
-	TestRounding(denorm.f, 0, samples);
-	denorm.ieee.negative = 1;
-	denorm.ieee.exponent = 0;
-	denorm.ieee.mantissa = 1;
-	TestRounding(denorm.f, 0, samples);
-
-	/* Test NaNs. Caveat Results vary by implementation. */
-#if defined(__i386__) || defined(__x86_64__)
-#define EXPECTED_NAN_RESULT -32768
-#else
-#define EXPECTED_NAN_RESULT 0
-#endif
-	union ieee754_float nan; /* Quiet NaN */
-	nan.ieee.negative = 0;
-	nan.ieee.exponent = 0xff;
-	nan.ieee.mantissa = 0x400001;
-	TestRounding(nan.f, EXPECTED_NAN_RESULT, samples);
-	nan.ieee.negative = 0;
-	nan.ieee.exponent = 0xff;
-	nan.ieee.mantissa = 0x000001; /* Signalling NaN */
-	TestRounding(nan.f, EXPECTED_NAN_RESULT, samples);
-
-	/* Test Performance */
-	uint64_t diff;
-	struct timespec start, end;
-	int i;
-	int d;
-
-	short *in_shorts = (short *)malloc(MAXSAMPLES * 2 * 2 + PAD);
-	float *out_floats_left_c = (float *)malloc(MAXSAMPLES * 4 + PAD);
-	float *out_floats_right_c = (float *)malloc(MAXSAMPLES * 4 + PAD);
-	float *out_floats_left_opt = (float *)malloc(MAXSAMPLES * 4 + PAD);
-	float *out_floats_right_opt = (float *)malloc(MAXSAMPLES * 4 + PAD);
-	short *out_shorts_c = (short *)malloc(MAXSAMPLES * 2 * 2 + PAD);
-	short *out_shorts_opt = (short *)malloc(MAXSAMPLES * 2 * 2 + PAD);
-
-	memset(in_shorts, 0x11, MAXSAMPLES * 2 * 2 + PAD);
-	memset(out_floats_left_c, 0x22, MAXSAMPLES * 4 + PAD);
-	memset(out_floats_right_c, 0x33, MAXSAMPLES * 4 + PAD);
-	memset(out_floats_left_opt, 0x44, MAXSAMPLES * 4 + PAD);
-	memset(out_floats_right_opt, 0x55, MAXSAMPLES * 4 + PAD);
-	memset(out_shorts_c, 0x66, MAXSAMPLES * 2 * 2 + PAD);
-	memset(out_shorts_opt, 0x66, MAXSAMPLES * 2 * 2 + PAD);
-
-	float *out_floats_ptr_c[2];
-	float *out_floats_ptr_opt[2];
-
-	out_floats_ptr_c[0] = out_floats_left_c;
-	out_floats_ptr_c[1] = out_floats_right_c;
-	out_floats_ptr_opt[0] = out_floats_left_opt;
-	out_floats_ptr_opt[1] = out_floats_right_opt;
-
-	/* Benchmark dsp_util_interleave */
-	for (samples = MAXSAMPLES; samples >= MINSAMPLES; samples /= 2) {
-		/* measure original C interleave */
-		clock_gettime(CLOCK_MONOTONIC, &start); /* mark start time */
-		for (i = 0; i < ITERATIONS; ++i) {
-			dsp_util_interleave_reference(out_floats_ptr_c,
-						      out_shorts_c, 2, samples);
-		}
-		clock_gettime(CLOCK_MONOTONIC, &end); /* mark the end time */
-		diff = (BILLION * (end.tv_sec - start.tv_sec) + end.tv_nsec -
-			start.tv_nsec) /
-		       1000000;
-		printf("interleave   ORIG size = %6d, elapsed time = %llu ms\n",
-		       samples, (long long unsigned int)diff);
-
-		/* measure optimized interleave */
-		clock_gettime(CLOCK_MONOTONIC, &start); /* mark start time */
-		for (i = 0; i < ITERATIONS; ++i) {
-			dsp_util_interleave(out_floats_ptr_c,
-					    (uint8_t *)out_shorts_opt, 2,
-					    SND_PCM_FORMAT_S16_LE, samples);
-		}
-		clock_gettime(CLOCK_MONOTONIC, &end); /* mark the end time */
-		diff = (BILLION * (end.tv_sec - start.tv_sec) + end.tv_nsec -
-			start.tv_nsec) /
-		       1000000;
-		printf("interleave   SIMD size = %6d, elapsed time = %llu ms\n",
-		       samples, (long long unsigned int)diff);
-
-		/* Test C and SIMD output match */
-		d = memcmp(out_shorts_c, out_shorts_opt,
-			   MAXSAMPLES * 2 * 2 + PAD);
-		if (d)
-			printf("interleave compare %d, %d %d, %d %d\n", d,
-			       out_shorts_c[0], out_shorts_c[1],
-			       out_shorts_opt[0], out_shorts_opt[1]);
-	}
-
-	/* Benchmark dsp_util_deinterleave */
-	for (samples = MAXSAMPLES; samples >= MINSAMPLES; samples /= 2) {
-		/* Measure original C deinterleave */
-		clock_gettime(CLOCK_MONOTONIC, &start); /* mark start time */
-		for (i = 0; i < ITERATIONS; ++i) {
-			dsp_util_deinterleave_reference(
-				in_shorts, out_floats_ptr_c, 2, samples);
-		}
-		clock_gettime(CLOCK_MONOTONIC, &end); /* mark the end time */
-		diff = (BILLION * (end.tv_sec - start.tv_sec) + end.tv_nsec -
-			start.tv_nsec) /
-		       1000000;
-		printf("deinterleave ORIG size = %6d, "
-		       "elapsed time = %llu ms\n",
-		       samples, (long long unsigned int)diff);
-
-		/* Measure optimized deinterleave */
-		clock_gettime(CLOCK_MONOTONIC, &start); /* mark start time */
-		for (i = 0; i < ITERATIONS; ++i) {
-			dsp_util_deinterleave((uint8_t *)in_shorts,
-					      out_floats_ptr_opt, 2,
-					      SND_PCM_FORMAT_S16_LE, samples);
-		}
-		clock_gettime(CLOCK_MONOTONIC, &end); /* mark the end time */
-		diff = (BILLION * (end.tv_sec - start.tv_sec) + end.tv_nsec -
-			start.tv_nsec) /
-		       1000000;
-		printf("deinterleave SIMD size = %6d, elapsed time = %llu ms\n",
-		       samples, (long long unsigned int)diff);
-
-		/* Test C and SIMD output match */
-		d = memcmp(out_floats_ptr_c[0], out_floats_ptr_opt[0],
-			   samples * 4);
-		if (d)
-			printf("left compare %d, %f %f\n", d,
-			       out_floats_ptr_c[0][0],
-			       out_floats_ptr_opt[0][0]);
-		d = memcmp(out_floats_ptr_c[1], out_floats_ptr_opt[1],
-			   samples * 4);
-		if (d)
-			printf("right compare %d, %f %f\n", d,
-			       out_floats_ptr_c[1][0],
-			       out_floats_ptr_opt[1][0]);
-	}
-
-	free(in_shorts);
-	free(out_floats_left_c);
-	free(out_floats_right_c);
-	free(out_floats_left_opt);
-	free(out_floats_right_opt);
-	free(out_shorts_c);
-	free(out_shorts_opt);
-
-	return 0;
-}
diff --git a/cras/src/dsp/tests/eq2_test.c b/cras/src/dsp/tests/eq2_test.c
deleted file mode 100644
index 36ce80b..0000000
--- a/cras/src/dsp/tests/eq2_test.c
+++ /dev/null
@@ -1,95 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <time.h>
-
-#include "dsp_test_util.h"
-#include "dsp_util.h"
-#include "eq2.h"
-#include "raw.h"
-
-#ifndef min
-#define min(a, b)                                                              \
-	({                                                                     \
-		__typeof__(a) _a = (a);                                        \
-		__typeof__(b) _b = (b);                                        \
-		_a < _b ? _a : _b;                                             \
-	})
-#endif
-
-static double tp_diff(struct timespec *tp2, struct timespec *tp1)
-{
-	return (tp2->tv_sec - tp1->tv_sec) +
-	       (tp2->tv_nsec - tp1->tv_nsec) * 1e-9;
-}
-
-/* Processes a buffer of data chunk by chunk using eq2 */
-static void process(struct eq2 *eq2, float *data0, float *data1, int count)
-{
-	int start;
-	for (start = 0; start < count; start += 2048)
-		eq2_process(eq2, data0 + start, data1 + start,
-			    min(2048, count - start));
-}
-
-/* Runs the filters on an input file */
-static void test_file(const char *input_filename, const char *output_filename)
-{
-	size_t frames;
-	int i;
-	double NQ = 44100 / 2; /* nyquist frequency */
-	struct timespec tp1, tp2;
-	struct eq2 *eq2;
-
-	float *data = read_raw(input_filename, &frames);
-
-	/* Set some data to 0 to test for denormals. */
-	for (i = frames / 10; i < frames; i++)
-		data[i] = 0.0;
-
-	/* eq chain */
-	eq2 = eq2_new();
-	eq2_append_biquad(eq2, 0, BQ_PEAKING, 380 / NQ, 3, -10);
-	eq2_append_biquad(eq2, 0, BQ_PEAKING, 720 / NQ, 3, -12);
-	eq2_append_biquad(eq2, 0, BQ_PEAKING, 1705 / NQ, 3, -8);
-	eq2_append_biquad(eq2, 0, BQ_HIGHPASS, 218 / NQ, 0.7, -10.2);
-	eq2_append_biquad(eq2, 0, BQ_PEAKING, 580 / NQ, 6, -8);
-	eq2_append_biquad(eq2, 0, BQ_HIGHSHELF, 8000 / NQ, 3, 2);
-	eq2_append_biquad(eq2, 1, BQ_PEAKING, 450 / NQ, 3, -12);
-	eq2_append_biquad(eq2, 1, BQ_PEAKING, 721 / NQ, 3, -12);
-	eq2_append_biquad(eq2, 1, BQ_PEAKING, 1800 / NQ, 8, -10.2);
-	eq2_append_biquad(eq2, 1, BQ_PEAKING, 580 / NQ, 6, -8);
-	eq2_append_biquad(eq2, 1, BQ_HIGHPASS, 250 / NQ, 0.6578, 0);
-	eq2_append_biquad(eq2, 1, BQ_HIGHSHELF, 8000 / NQ, 0, 2);
-	clock_gettime(CLOCK_THREAD_CPUTIME_ID, &tp1);
-	process(eq2, data, data + frames, frames);
-	clock_gettime(CLOCK_THREAD_CPUTIME_ID, &tp2);
-	printf("processing takes %g seconds for %zu samples\n",
-	       tp_diff(&tp2, &tp1), frames * 2);
-	eq2_free(eq2);
-
-	write_raw(output_filename, data, frames);
-	free(data);
-}
-
-int main(int argc, char **argv)
-{
-	dsp_enable_flush_denormal_to_zero();
-	if (dsp_util_has_denormal())
-		printf("denormal still supported?\n");
-	else
-		printf("denormal disabled\n");
-	dsp_util_clear_fp_exceptions();
-
-	if (argc == 3)
-		test_file(argv[1], argv[2]);
-	else
-		printf("Usage: eq2_test [input.raw output.raw]\n");
-
-	dsp_util_print_fp_exceptions();
-	return 0;
-}
diff --git a/cras/src/dsp/tests/eq_test.c b/cras/src/dsp/tests/eq_test.c
deleted file mode 100644
index 4adcecf..0000000
--- a/cras/src/dsp/tests/eq_test.c
+++ /dev/null
@@ -1,140 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <time.h>
-
-#include "dsp_test_util.h"
-#include "dsp_util.h"
-#include "eq.h"
-#include "raw.h"
-
-#ifndef min
-#define min(a, b)                                                              \
-	({                                                                     \
-		__typeof__(a) _a = (a);                                        \
-		__typeof__(b) _b = (b);                                        \
-		_a < _b ? _a : _b;                                             \
-	})
-#endif
-
-static double tp_diff(struct timespec *tp2, struct timespec *tp1)
-{
-	return (tp2->tv_sec - tp1->tv_sec) +
-	       (tp2->tv_nsec - tp1->tv_nsec) * 1e-9;
-}
-
-/* Generates impulse response */
-static void test_ir()
-{
-	int N = 32768;
-	float *data;
-	struct eq *eq;
-	double NQ = 44100 / 2; /* nyquist frequency */
-	struct timespec tp1, tp2;
-	int i;
-	FILE *ir;
-
-	data = calloc(1, sizeof(float) * N);
-	data[0] = 1;
-
-	eq = eq_new();
-	eq_append_biquad(eq, BQ_PEAKING, 380 / NQ, 3, -10);
-	eq_append_biquad(eq, BQ_PEAKING, 720 / NQ, 3, -12);
-	eq_append_biquad(eq, BQ_PEAKING, 1705 / NQ, 3, -8);
-	eq_append_biquad(eq, BQ_HIGHPASS, 218 / NQ, 0.7, -10.2);
-	eq_append_biquad(eq, BQ_PEAKING, 580 / NQ, 6, -8);
-	eq_append_biquad(eq, BQ_HIGHSHELF, 8000 / NQ, 3, 2);
-
-	clock_gettime(CLOCK_THREAD_CPUTIME_ID, &tp1);
-	eq_process(eq, data, N);
-	clock_gettime(CLOCK_THREAD_CPUTIME_ID, &tp2);
-	printf("processing takes %g seconds\n", tp_diff(&tp2, &tp1));
-	eq_free(eq);
-
-	ir = fopen("ir.dat", "w");
-	for (i = 0; i < N; i++)
-		fprintf(ir, "%g\n", data[i]);
-	fclose(ir);
-	free(data);
-}
-
-/* Processes a buffer of data chunk by chunk using eq */
-static void process(struct eq *eq, float *data, int count)
-{
-	int start;
-	for (start = 0; start < count; start += 2048)
-		eq_process(eq, data + start, min(2048, count - start));
-}
-
-/* Runs the filters on an input file */
-static void test_file(const char *input_filename, const char *output_filename)
-{
-	size_t frames;
-	int i;
-	double NQ = 44100 / 2; /* nyquist frequency */
-	struct timespec tp1, tp2;
-	struct eq *eq;
-
-	float *data = read_raw(input_filename, &frames);
-
-	/* Set some data to 0 to test for denormals. */
-	for (i = frames / 10; i < frames; i++)
-		data[i] = 0.0;
-
-	/* Left eq chain */
-	eq = eq_new();
-	eq_append_biquad(eq, BQ_PEAKING, 380 / NQ, 3, -10);
-	eq_append_biquad(eq, BQ_PEAKING, 720 / NQ, 3, -12);
-	eq_append_biquad(eq, BQ_PEAKING, 1705 / NQ, 3, -8);
-	eq_append_biquad(eq, BQ_HIGHPASS, 218 / NQ, 0.7, -10.2);
-	eq_append_biquad(eq, BQ_PEAKING, 580 / NQ, 6, -8);
-	eq_append_biquad(eq, BQ_HIGHSHELF, 8000 / NQ, 3, 2);
-	clock_gettime(CLOCK_THREAD_CPUTIME_ID, &tp1);
-	process(eq, data, frames);
-	clock_gettime(CLOCK_THREAD_CPUTIME_ID, &tp2);
-	printf("processing takes %g seconds for %zu samples\n",
-	       tp_diff(&tp2, &tp1), frames);
-	eq_free(eq);
-
-	/* Right eq chain */
-	eq = eq_new();
-	eq_append_biquad(eq, BQ_PEAKING, 450 / NQ, 3, -12);
-	eq_append_biquad(eq, BQ_PEAKING, 721 / NQ, 3, -12);
-	eq_append_biquad(eq, BQ_PEAKING, 1800 / NQ, 8, -10.2);
-	eq_append_biquad(eq, BQ_PEAKING, 580 / NQ, 6, -8);
-	eq_append_biquad(eq, BQ_HIGHPASS, 250 / NQ, 0.6578, 0);
-	eq_append_biquad(eq, BQ_HIGHSHELF, 8000 / NQ, 0, 2);
-	clock_gettime(CLOCK_THREAD_CPUTIME_ID, &tp1);
-	process(eq, data + frames, frames);
-	clock_gettime(CLOCK_THREAD_CPUTIME_ID, &tp2);
-	printf("processing takes %g seconds for %zu samples\n",
-	       tp_diff(&tp2, &tp1), frames);
-	eq_free(eq);
-
-	write_raw(output_filename, data, frames);
-	free(data);
-}
-
-int main(int argc, char **argv)
-{
-	dsp_enable_flush_denormal_to_zero();
-	if (dsp_util_has_denormal())
-		printf("denormal still supported?\n");
-	else
-		printf("denormal disabled\n");
-	dsp_util_clear_fp_exceptions();
-
-	if (argc == 1)
-		test_ir();
-	else if (argc == 3)
-		test_file(argv[1], argv[2]);
-	else
-		printf("Usage: eq_test [input.raw output.raw]\n");
-
-	dsp_util_print_fp_exceptions();
-	return 0;
-}
diff --git a/cras/src/dsp/tests/plot_fftl.m b/cras/src/dsp/tests/plot_fftl.m
deleted file mode 100644
index bffc0b8..0000000
--- a/cras/src/dsp/tests/plot_fftl.m
+++ /dev/null
@@ -1,40 +0,0 @@
-% Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-% Use of this source code is governed by a BSD-style license that can be
-% found in the LICENSE file.
-%
-% This is an octave script.
-% It reads impulse response from "ir.dat" and plots frequency response.
-% Both x-axis and y-axis is in log scale.
-h=load("ir.dat");
-N=columns(h);
-K=rows(h)/2;
-NQ=44100/2;
-% This tries to match the labels in the audio tuning UI.
-xticks=[22050, 11025, 5513, 2756, 1378, 689, 345, 172, 86, 43, 21];
-xticklabels={"22050Hz", "11025Hz", "5513Hz", "2756Hz", "1378Hz", \
-"689Hz", "345Hz", "172Hz", "86Hz", "43Hz", "21Hz"};
-yticks=[18,12,6,0,-6,-12,-18,-24];
-yticklabels={"18dB","12dB","6dB","0dB","-6dB","-12dB","-18dB","-24dB"};
-xyrange=[21,22050,-24,18];
-xrange=[21,22050];
-
-for i=1:N
-  figure(i);
-  title('fftl');
-  fr = fft(h(:,i))(1:K);
-  subplot(2, 1, 1);
-  semilogx(NQ*(1:K)/K, 20*log10(abs(fr)));
-  xlabel('Frequency'), ylabel('Magnitude'), grid;
-  set (gca, "xtick", xticks);
-  set (gca, "xticklabel", xticklabels);
-  set (gca, "ytick", yticks);
-  set (gca, "yticklabel", yticklabels);
-  axis(xyrange);
-  subplot(2, 1, 2);
-  semilogx(NQ*(1:K)/K,180/pi*unwrap(angle(fr)));
-  xlabel('Frequency'), ylabel('Phase (degrees)'), grid;
-  set (gca, "xtick", xticks);
-  set (gca, "xticklabel", xticklabels);
-  axis(xrange);
-end
-pause
diff --git a/cras/src/dsp/tests/raw.c b/cras/src/dsp/tests/raw.c
deleted file mode 100644
index d75e28f..0000000
--- a/cras/src/dsp/tests/raw.c
+++ /dev/null
@@ -1,93 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <fcntl.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <unistd.h>
-
-float *read_raw(const char *filename, size_t *frames)
-{
-	struct stat st;
-	int16_t *buf;
-	size_t f, n;
-	int fd;
-	float *data;
-	int i;
-
-	if (stat(filename, &st) < 0) {
-		fprintf(stderr, "cannot stat file %s\n", filename);
-		return NULL;
-	}
-
-	fd = open(filename, O_RDONLY);
-	if (fd < 0) {
-		fprintf(stderr, "cannot open file %s\n", filename);
-		return NULL;
-	}
-
-	f = st.st_size / 4;
-	n = f * 4;
-	buf = (int16_t *)malloc(n);
-	if (read(fd, buf, n) != n) {
-		fprintf(stderr, "short read %zu\n", n);
-		free(buf);
-		return NULL;
-	}
-	close(fd);
-
-	/* deinterleave and convert to float */
-	data = (float *)malloc(sizeof(float) * f * 2);
-	for (i = 0; i < f; i++) {
-		data[i] = buf[2 * i] / 32768.0f;
-		data[i + f] = buf[2 * i + 1] / 32768.0f;
-	}
-	free(buf);
-	*frames = f;
-	return data;
-}
-
-static int16_t f2s16(float f)
-{
-	int i;
-	f *= 32768;
-	i = (int)((f > 0) ? (f + 0.5f) : (f - 0.5f));
-	if (i < -32768)
-		i = -32768;
-	else if (i > 32767)
-		i = 32767;
-	return (int16_t)i;
-}
-
-int write_raw(const char *filename, float *input, size_t frames)
-{
-	int16_t *buf;
-	int rc = -1;
-	int n = frames * 4;
-	int i;
-
-	buf = (int16_t *)malloc(n);
-	for (i = 0; i < frames; i++) {
-		buf[2 * i] = f2s16(input[i]);
-		buf[2 * i + 1] = f2s16(input[i + frames]);
-	}
-
-	int fd = open(filename, O_WRONLY | O_CREAT, 0644);
-	if (fd < 0) {
-		fprintf(stderr, "cannot open file %s\n", filename);
-		goto quit;
-	}
-	if (write(fd, buf, n) != n) {
-		fprintf(stderr, "short write file %s\n", filename);
-		goto quit;
-	}
-	rc = 0;
-quit:
-	close(fd);
-	free(buf);
-	return rc;
-}
diff --git a/cras/src/dsp/tests/raw.h b/cras/src/dsp/tests/raw.h
deleted file mode 100644
index a0a30ab..0000000
--- a/cras/src/dsp/tests/raw.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef RAW_H_
-#define RAW_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <stddef.h>
-
-/* Reads a raw file to a float buffer.
- * Args:
- *    filename - The name of the raw file.
- *    frames - Returns the number of frames read.
- * Returns:
- *    The float buffer allocated by malloc(), or NULL if reading fails. The
- *    first half of the buffer contains left channel data, and the second half
- *    contains the right channel data.
- * The raw file is assumed to have two channel 16 bit signed integer samples in
- * native endian. The raw file can be created by:
- *    sox input.wav output.raw
- * The raw file can be played by:
- *    play -r 44100 -s -b 16 -c 2 test.raw
- */
-float *read_raw(const char *filename, size_t *frames);
-
-/* Writes a float buffer to a raw file.
- * Args:
- *    filename - The name of the raw file.
- *    buf - The float buffer containing the samples.
- *    frames - The number of frames in the float buffer.
- * Returns:
- *    0 if success. -1 if writing fails.
- * The format of the float buffer is the same as described in read_raw().
- */
-void write_raw(const char *filename, float *buf, size_t frames);
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif /* RAW_H_ */
diff --git a/cras/src/fuzz/.clang-format b/cras/src/fuzz/.clang-format
deleted file mode 100644
index 3f19e61..0000000
--- a/cras/src/fuzz/.clang-format
+++ /dev/null
@@ -1 +0,0 @@
-BasedOnStyle: Chromium
diff --git a/cras/src/fuzz/Dockerfile b/cras/src/fuzz/Dockerfile
deleted file mode 100644
index caffa99..0000000
--- a/cras/src/fuzz/Dockerfile
+++ /dev/null
@@ -1,13 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-#
-# Defines a docker image that can build cras fuzzers.
-#
-FROM gcr.io/oss-fuzz-base/base-builder
-LABEL maintainer="dgreid@chromium.org"
-
-COPY . "${SRC}/adhd"
-COPY cras/src/fuzz/build.sh "${SRC}/build.sh"
-RUN "${SRC}/adhd/cras/install_deps.sh"
-RUN mkdir -p /etc/cras && cp "${SRC}/adhd/cras-config/dsp.ini.sample" /etc/cras
diff --git a/cras/src/fuzz/README.md b/cras/src/fuzz/README.md
deleted file mode 100644
index 0d235ce..0000000
--- a/cras/src/fuzz/README.md
+++ /dev/null
@@ -1,44 +0,0 @@
-# OSS-Fuzz for CRAS
-
-This directory contains source code and build scripts for coverage-guided
-fuzzers.
-
-Detailed instructions are available at: https://github.com/google/oss-fuzz/blob/master/docs/
-
-## Quick start
-
-### Sudoless Docker
-```
-sudo adduser $USER docker
-```
-### Sync to the latest base-builder
-```
-docker pull gcr.io/oss-fuzz-base/base-builder
-```
-
-### Build a container from the adhd directory
-```
-docker build -t ossfuzz/cras -f cras/src/fuzz/Dockerfile .
-```
-Add `--no-cache` if you want a complete rebuild.
-
-### Build fuzzers
-```
-docker run --cap-add=SYS_PTRACE -ti --rm -v /tmp/fuzzers:/out ossfuzz/cras
-```
-
-### Look in /tmp/fuzzers to see the executables. Run them like so:
-```
-docker run --cap-add=SYS_PTRACE -ti -v $(pwd)/cras/src/fuzz/corpus:/corpus \
-    -v /tmp/fuzzers:/out ossfuzz/cras /out/rclient_message \
-    /corpus -runs=100
-```
-
-### Debug in docker
-
-Go into docker console by
-```
-docker run --cap-add=SYS_PTRACE -ti -v $(pwd)/cras/src/fuzz/corpus:/corpus \
-    -v /tmp/fuzzers:/out ossfuzz/cras /bin/bash
-```
-and start debugging.
diff --git a/cras/src/fuzz/build.sh b/cras/src/fuzz/build.sh
deleted file mode 100755
index 44413a7..0000000
--- a/cras/src/fuzz/build.sh
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/bin/bash -eux
-
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-#
-# Builds fuzzers from within a container into ${OUT} directory.
-# Expects "${SRC}/adhd" to contain an adhd checkout.
-
-cd "${SRC}/adhd/cras"
-./git_prepare.sh
-
-FUZZER_LDFLAGS="${FUZZER_LDFLAGS} ${LIB_FUZZING_ENGINE}"
-./configure --enable-fuzzer
-
-# Compile fuzzers
-make -j$(nproc)
-
-# Copy fuzzers and dependencies to "${OUT}" directory
-cp "${SRC}/adhd/cras/src/cras_rclient_message_fuzzer" "${OUT}/rclient_message"
-zip -j "${OUT}/rclient_message_corpus.zip" ./src/fuzz/corpus/*
-
-cp "${SRC}/adhd/cras/src/cras_hfp_slc_fuzzer" "${OUT}/cras_hfp_slc"
-cp "${SRC}/adhd/cras/src/fuzz/cras_hfp_slc.dict" "${OUT}/cras_hfp_slc.dict"
diff --git a/cras/src/fuzz/corpus/06051efd871be7eb2b4baed61c3ba53fe0b27833 b/cras/src/fuzz/corpus/06051efd871be7eb2b4baed61c3ba53fe0b27833
deleted file mode 100644
index 09605ec..0000000
--- a/cras/src/fuzz/corpus/06051efd871be7eb2b4baed61c3ba53fe0b27833
+++ /dev/null
Binary files differ
diff --git a/cras/src/fuzz/corpus/06e2b48cb549540ab62c0a62a1480f3de7807896 b/cras/src/fuzz/corpus/06e2b48cb549540ab62c0a62a1480f3de7807896
deleted file mode 100644
index fd0149b..0000000
--- a/cras/src/fuzz/corpus/06e2b48cb549540ab62c0a62a1480f3de7807896
+++ /dev/null
Binary files differ
diff --git a/cras/src/fuzz/corpus/1cea528aa30177cb48d9b279b7d1f115b5a60c01 b/cras/src/fuzz/corpus/1cea528aa30177cb48d9b279b7d1f115b5a60c01
deleted file mode 100644
index ffd27be..0000000
--- a/cras/src/fuzz/corpus/1cea528aa30177cb48d9b279b7d1f115b5a60c01
+++ /dev/null
Binary files differ
diff --git a/cras/src/fuzz/corpus/348b671615268f526f174ed2f89d887a26ee8b7a b/cras/src/fuzz/corpus/348b671615268f526f174ed2f89d887a26ee8b7a
deleted file mode 100644
index 0b7a92f..0000000
--- a/cras/src/fuzz/corpus/348b671615268f526f174ed2f89d887a26ee8b7a
+++ /dev/null
Binary files differ
diff --git a/cras/src/fuzz/corpus/756692a278ad08a8f3a9e198b1436620c53247e9 b/cras/src/fuzz/corpus/756692a278ad08a8f3a9e198b1436620c53247e9
deleted file mode 100644
index c768e08..0000000
--- a/cras/src/fuzz/corpus/756692a278ad08a8f3a9e198b1436620c53247e9
+++ /dev/null
Binary files differ
diff --git a/cras/src/fuzz/corpus/90c740f0e2e83b050ba7ccc2b963f2cb6bf23bc1 b/cras/src/fuzz/corpus/90c740f0e2e83b050ba7ccc2b963f2cb6bf23bc1
deleted file mode 100644
index 05718e1..0000000
--- a/cras/src/fuzz/corpus/90c740f0e2e83b050ba7ccc2b963f2cb6bf23bc1
+++ /dev/null
Binary files differ
diff --git a/cras/src/fuzz/corpus/9448261a4711bdb5e62490e57f78a9a8d99cfd90 b/cras/src/fuzz/corpus/9448261a4711bdb5e62490e57f78a9a8d99cfd90
deleted file mode 100644
index 6eaf65c..0000000
--- a/cras/src/fuzz/corpus/9448261a4711bdb5e62490e57f78a9a8d99cfd90
+++ /dev/null
Binary files differ
diff --git a/cras/src/fuzz/corpus/b148b3ca1a089964a122b42170eb39e41461e8de b/cras/src/fuzz/corpus/b148b3ca1a089964a122b42170eb39e41461e8de
deleted file mode 100644
index 12f9ff6..0000000
--- a/cras/src/fuzz/corpus/b148b3ca1a089964a122b42170eb39e41461e8de
+++ /dev/null
Binary files differ
diff --git a/cras/src/fuzz/corpus/c66fae687ac462af608f9f22ea1b9493b66fe844 b/cras/src/fuzz/corpus/c66fae687ac462af608f9f22ea1b9493b66fe844
deleted file mode 100644
index 74c5e05..0000000
--- a/cras/src/fuzz/corpus/c66fae687ac462af608f9f22ea1b9493b66fe844
+++ /dev/null
Binary files differ
diff --git a/cras/src/fuzz/corpus/da39a3ee5e6b4b0d3255bfef95601890afd80709 b/cras/src/fuzz/corpus/da39a3ee5e6b4b0d3255bfef95601890afd80709
deleted file mode 100644
index e69de29..0000000
--- a/cras/src/fuzz/corpus/da39a3ee5e6b4b0d3255bfef95601890afd80709
+++ /dev/null
diff --git a/cras/src/fuzz/corpus/da6b17d11511d4c4eb14933aa404715e753e2c02 b/cras/src/fuzz/corpus/da6b17d11511d4c4eb14933aa404715e753e2c02
deleted file mode 100644
index 99ceca0..0000000
--- a/cras/src/fuzz/corpus/da6b17d11511d4c4eb14933aa404715e753e2c02
+++ /dev/null
Binary files differ
diff --git a/cras/src/fuzz/corpus/e578774a32e52e17461c30848f554f78c3ffda66 b/cras/src/fuzz/corpus/e578774a32e52e17461c30848f554f78c3ffda66
deleted file mode 100644
index 6bfd3e0..0000000
--- a/cras/src/fuzz/corpus/e578774a32e52e17461c30848f554f78c3ffda66
+++ /dev/null
Binary files differ
diff --git a/cras/src/fuzz/corpus/e85fb46a837d5a798d371573b41fd60e1e1486ed b/cras/src/fuzz/corpus/e85fb46a837d5a798d371573b41fd60e1e1486ed
deleted file mode 100644
index ed467b1..0000000
--- a/cras/src/fuzz/corpus/e85fb46a837d5a798d371573b41fd60e1e1486ed
+++ /dev/null
Binary files differ
diff --git a/cras/src/fuzz/cras_hfp_slc.cc b/cras/src/fuzz/cras_hfp_slc.cc
deleted file mode 100644
index 4a76ea4..0000000
--- a/cras/src/fuzz/cras_hfp_slc.cc
+++ /dev/null
@@ -1,66 +0,0 @@
-/* Copyright 2020 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <assert.h>
-#include <fuzzer/FuzzedDataProvider.h>
-#include <stddef.h>
-#include <stdint.h>
-
-extern "C" {
-#include "cras_bt_device.h"
-#include "cras_bt_log.h"
-#include "cras_hfp_slc.h"
-#include "cras_iodev_list.h"
-#include "cras_mix.h"
-#include "cras_observer.h"
-#include "cras_shm.h"
-#include "cras_system_state.h"
-
-struct cras_bt_event_log* btlog;
-}
-
-int disconnect_cb(struct hfp_slc_handle*) {
-  return 0;
-}
-
-extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
-  FuzzedDataProvider data_provider(data, size);
-  bool is_hsp = data_provider.ConsumeIntegralInRange(0, 1);
-  int ag_supported_features = data_provider.ConsumeIntegral<int>();
-  std::string command = data_provider.ConsumeRemainingBytesAsString();
-  int fd = open("/dev/null", O_RDWR);
-
-  struct cras_bt_device* bt_dev = cras_bt_device_create(NULL, "");
-  struct hfp_slc_handle* handle = hfp_slc_create(
-      fd, is_hsp, ag_supported_features, bt_dev, NULL, &disconnect_cb);
-  if (!handle)
-    return 0;
-
-  handle_at_command_for_test(handle, command.c_str());
-
-  hfp_slc_destroy(handle);
-  cras_bt_device_remove(bt_dev);
-  return 0;
-}
-
-extern "C" int LLVMFuzzerInitialize(int* argc, char*** argv) {
-  char* shm_name;
-  if (asprintf(&shm_name, "/cras-%d", getpid()) < 0)
-    exit(-ENOMEM);
-  struct cras_server_state* exp_state =
-      (struct cras_server_state*)calloc(1, sizeof(*exp_state));
-  if (!exp_state)
-    exit(-1);
-  int rw_shm_fd = open("/dev/null", O_RDWR);
-  int ro_shm_fd = open("/dev/null", O_RDONLY);
-  cras_system_state_init("/tmp", shm_name, rw_shm_fd, ro_shm_fd, exp_state,
-                         sizeof(*exp_state));
-  free(shm_name);
-  cras_observer_server_init();
-  cras_mix_init(0);
-  cras_iodev_list_init();
-  btlog = cras_bt_event_log_init();
-  return 0;
-}
diff --git a/cras/src/fuzz/cras_hfp_slc.dict b/cras/src/fuzz/cras_hfp_slc.dict
deleted file mode 100644
index cfc4989..0000000
--- a/cras/src/fuzz/cras_hfp_slc.dict
+++ /dev/null
@@ -1,23 +0,0 @@
-"ATA"
-"ATD"
-"AT+BAC"
-"AT+BCS"
-"AT+BIA"
-"AT+BIEV"
-"AT+BIND"
-"AT+BLDN"
-"AT+BRSF"
-"AT+CCWA"
-"AT+CHUP"
-"AT+CIND"
-"AT+CKPD"
-"AT+CLCC"
-"AT+CLIP"
-"AT+CMEE"
-"AT+CMER"
-"AT+CNUM"
-"AT+COPS"
-"AT+IPHONEACCEV"
-"AT+VG"
-"AT+VTS"
-"AT+XAPL"
diff --git a/cras/src/fuzz/rclient_message.cc b/cras/src/fuzz/rclient_message.cc
deleted file mode 100644
index eacf9da..0000000
--- a/cras/src/fuzz/rclient_message.cc
+++ /dev/null
@@ -1,68 +0,0 @@
-/* Copyright 2017 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <assert.h>
-#include <fuzzer/FuzzedDataProvider.h>
-#include <stddef.h>
-#include <stdint.h>
-
-extern "C" {
-#include "cras_apm_list.h"
-#include "cras_bt_log.h"
-#include "cras_dsp.h"
-#include "cras_iodev_list.h"
-#include "cras_mix.h"
-#include "cras_observer.h"
-#include "cras_rclient.h"
-#include "cras_shm.h"
-#include "cras_system_state.h"
-
-struct cras_bt_event_log* btlog;
-}
-
-extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
-  cras_rclient* client = cras_rclient_create(0, 0, CRAS_CONTROL);
-  if (size < 300) {
-    /* Feeds input data directly if the given bytes is too short. */
-    cras_rclient_buffer_from_client(client, data, size, NULL, 0);
-  } else {
-    FuzzedDataProvider data_provider(data, size);
-    int fds[1] = {0};
-    int num_fds = data_provider.ConsumeIntegralInRange(0, 1);
-    std::vector<uint8_t> msg = data_provider.ConsumeRemainingBytes<uint8_t>();
-    cras_rclient_buffer_from_client(client, msg.data(), msg.size(), fds,
-                                    num_fds);
-  }
-  cras_rclient_destroy(client);
-
-  return 0;
-}
-
-extern "C" int LLVMFuzzerInitialize(int* argc, char*** argv) {
-  char* shm_name;
-  if (asprintf(&shm_name, "/cras-%d", getpid()) < 0)
-    exit(-ENOMEM);
-  struct cras_server_state* exp_state =
-      (struct cras_server_state*)calloc(1, sizeof(*exp_state));
-  if (!exp_state)
-    exit(-1);
-  int rw_shm_fd = open("/dev/null", O_RDWR);
-  int ro_shm_fd = open("/dev/null", O_RDONLY);
-  cras_system_state_init("/tmp", shm_name, rw_shm_fd, ro_shm_fd, exp_state,
-                         sizeof(*exp_state));
-  free(shm_name);
-
-  cras_observer_server_init();
-  cras_mix_init(0);
-  cras_apm_list_init("/etc/cras");
-  cras_iodev_list_init();
-  /* For cros fuzz, emerge adhd with USE=fuzzer will copy dsp.ini.sample to
-   * etc/cras. For OSS-Fuzz the Dockerfile will be responsible for copying the
-   * file. This shouldn't crash CRAS even if the dsp file does not exist. */
-  cras_dsp_init("/etc/cras/dsp.ini.sample");
-  /* Initializes btlog for CRAS_SERVER_DUMP_BT path with CRAS_DBUS defined. */
-  btlog = cras_bt_event_log_init();
-  return 0;
-}
diff --git a/cras/src/libcras/cras_client.c b/cras/src/libcras/cras_client.c
deleted file mode 100644
index 8420db1..0000000
--- a/cras/src/libcras/cras_client.c
+++ /dev/null
@@ -1,4249 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-/*
- * Basic playback flow:
- *  cras_client_create - Create new structure and set to defaults.
- *  cras_client_connect - Connect client to server - sets up server_fd to
- *    communicate with the audio server.  After the client connects, the server
- *    will send back a message containing the client id.
- *  cras_client_add_stream - Add a playback or capture stream. Creates a
- *    client_stream struct and send a file descriptor to server. That file
- *    descriptor and aud_fd are a pair created from socketpair().
- *  client_connected - The server will send a connected message to indicate that
- *    the client should start receiving audio events from aud_fd. This message
- *    also specifies the shared memory region to use to share audio samples.
- *    This region will be shmat'd.
- *  running - Once the connections are established, the client will listen for
- *    requests on aud_fd and fill the shm region with the requested number of
- *    samples. This happens in the aud_cb specified in the stream parameters.
- */
-
-#ifndef _GNU_SOURCE
-#define _GNU_SOURCE /* For ppoll() */
-#endif
-
-#include <errno.h>
-#include <fcntl.h>
-#include <limits.h>
-#include <poll.h>
-#include <pthread.h>
-#include <stdbool.h>
-#include <stdint.h>
-#include <sys/eventfd.h>
-#include <sys/ipc.h>
-#include <sys/mman.h>
-#include <sys/param.h>
-#include <sys/signal.h>
-#include <sys/socket.h>
-#include <sys/timerfd.h>
-#include <sys/types.h>
-#include <sys/un.h>
-#include <syslog.h>
-#include <unistd.h>
-
-#include "cras_client.h"
-#include "cras_config.h"
-#include "cras_file_wait.h"
-#include "cras_messages.h"
-#include "cras_observer_ops.h"
-#include "cras_shm.h"
-#include "cras_types.h"
-#include "cras_util.h"
-#include "utlist.h"
-
-static const size_t MAX_CMD_MSG_LEN = 256;
-static const size_t SERVER_SHUTDOWN_TIMEOUT_US = 500000;
-static const size_t SERVER_CONNECT_TIMEOUT_MS = 1000;
-static const size_t HOTWORD_FRAME_RATE = 16000;
-static const size_t HOTWORD_BLOCK_SIZE = 320;
-
-/* Commands sent from the user to the running client. */
-enum { CLIENT_STOP,
-       CLIENT_ADD_STREAM,
-       CLIENT_REMOVE_STREAM,
-       CLIENT_SET_STREAM_VOLUME_SCALER,
-       CLIENT_SERVER_CONNECT,
-       CLIENT_SERVER_CONNECT_ASYNC,
-};
-
-struct command_msg {
-	unsigned len;
-	unsigned msg_id;
-	cras_stream_id_t stream_id;
-};
-
-struct set_stream_volume_command_message {
-	struct command_msg header;
-	float volume_scaler;
-};
-
-/* Adds a stream to the client.
- *  stream - The stream to add.
- *  stream_id_out - Filled with the stream id of the new stream.
- *  dev_idx - Index of the device to attach the newly created stream.
- *      NO_DEVICE means not to pin the stream to a device.
- */
-struct add_stream_command_message {
-	struct command_msg header;
-	struct client_stream *stream;
-	cras_stream_id_t *stream_id_out;
-	uint32_t dev_idx;
-};
-
-/* Commands send from a running stream to the client. */
-enum { CLIENT_STREAM_EOF,
-};
-
-struct stream_msg {
-	unsigned msg_id;
-	cras_stream_id_t stream_id;
-};
-
-enum CRAS_THREAD_STATE {
-	CRAS_THREAD_STOP,
-	/* Isn't (shouldn't be) running. */
-	CRAS_THREAD_WARMUP,
-	/* Is started, but not fully functional: waiting
-	 * for resources to be ready for example. */
-	CRAS_THREAD_RUNNING,
-	/* Is running and fully functional. */
-};
-
-/* Manage information for a thread. */
-struct thread_state {
-	pthread_t tid;
-	enum CRAS_THREAD_STATE state;
-};
-
-/* Parameters used when setting up a capture or playback stream. See comment
- * above cras_client_stream_params_create or libcras_stream_params_set in the
- * header for descriptions. */
-struct cras_stream_params {
-	enum CRAS_STREAM_DIRECTION direction;
-	size_t buffer_frames;
-	size_t cb_threshold;
-	enum CRAS_STREAM_TYPE stream_type;
-	enum CRAS_CLIENT_TYPE client_type;
-	uint32_t flags;
-	uint64_t effects;
-	void *user_data;
-	cras_playback_cb_t aud_cb;
-	cras_unified_cb_t unified_cb;
-	cras_error_cb_t err_cb;
-	struct cras_audio_format format;
-	libcras_stream_cb_t stream_cb;
-};
-
-/* Represents an attached audio stream.
- * id - Unique stream identifier.
- * aud_fd - After server connects audio messages come in here.
- * direction - playback, capture, or loopback (see CRAS_STREAM_DIRECTION).
- * flags - Currently only used for CRAS_INPUT_STREAM_FLAG.
- * volume_scaler - Amount to scale the stream by, 0.0 to 1.0. Client could
- *    change this scaler value before stream actually connected, so we need
- *    to cache it until shm is prepared and apply it.
- * tid - Thread id of the audio thread spawned for this stream.
- * running - Audio thread runs while this is non-zero.
- * wake_fds - Pipe to wake the audio thread.
- * client - The client this stream is attached to.
- * config - Audio stream configuration.
- * shm - Shared memory used to exchange audio samples with the server.
- * prev, next - Form a linked list of streams attached to a client.
- */
-struct client_stream {
-	cras_stream_id_t id;
-	int aud_fd; /* audio messages from server come in here. */
-	enum CRAS_STREAM_DIRECTION direction;
-	uint32_t flags;
-	float volume_scaler;
-	struct thread_state thread;
-	int wake_fds[2]; /* Pipe to wake the thread */
-	struct cras_client *client;
-	struct cras_stream_params *config;
-	struct cras_audio_shm *shm;
-	struct client_stream *prev, *next;
-};
-
-/* State of the socket. */
-typedef enum cras_socket_state {
-	CRAS_SOCKET_STATE_DISCONNECTED,
-	/* Not connected. Also used to cleanup the current connection
-	 * before restarting the connection attempt. */
-	CRAS_SOCKET_STATE_WAIT_FOR_SOCKET,
-	/* Waiting for the socket file to exist. Socket file existence
-	 * is monitored using cras_file_wait. */
-	CRAS_SOCKET_STATE_WAIT_FOR_WRITABLE,
-	/* Waiting for the socket to have something at the other end. */
-	CRAS_SOCKET_STATE_FIRST_MESSAGE,
-	/* Waiting for the first messages from the server and set our
-	 * client ID. */
-	CRAS_SOCKET_STATE_CONNECTED,
-	/* The socket is connected and working. */
-	CRAS_SOCKET_STATE_ERROR_DELAY,
-	/* There was an error during one of the above states. Sleep for
-	 * a bit before continuing. If this state could not be initiated
-	 * then we move to the DISCONNECTED state and notify via the
-	 * connection callback. */
-} cras_socket_state_t;
-
-/* Represents a client used to communicate with the audio server.
- * id - Unique identifier for this client, negative until connected.
- * server_fd - Incoming messages from server.
- * server_fd_state - State of the server's socket.
- * server_event_fd - Eventfd to wait on until a connection is established.
- * stream_fds - Pipe for attached streams.
- * command_fds - Pipe for user commands to thread.
- * command_reply_fds - Pipe for acking/nacking command messages from thread.
- * sock_file - Server communication socket file.
- * sock_file_wait - Structure used to monitor existence of the socket file.
- * sock_file_exists - Set to true when the socket file exists.
- * running - The client thread will run while this is non zero.
- * next_stream_id - ID to give the next stream.
- * stream_start_cond - Condition used during stream startup.
- * stream_start_lock - Lock used during stream startup.
- * tid - Thread ID of the client thread started by "cras_client_run_thread".
- * last_command_result - Passes back the result of the last user command.
- * streams - Linked list of streams attached to this client.
- * server_state - RO shared memory region holding server state.
- * atlog_ro - RO shared memory region holding audio thread log.
- * debug_info_callback - Function to call when debug info is received.
- * atlog_access_callback - Function to call when atlog RO fd is received.
- * get_hotword_models_cb_t - Function to call when hotword models info is ready.
- * server_connection_cb - Function to called when a connection state changes.
- * server_connection_user_arg - User argument for server_connection_cb.
- * thread_priority_cb - Function to call for setting audio thread priority.
- * observer_ops - Functions to call when system state changes.
- * observer_context - Context passed to client in state change callbacks.
- */
-struct cras_client {
-	int id;
-	int server_fd;
-	cras_socket_state_t server_fd_state;
-	int server_event_fd;
-	int stream_fds[2];
-	int command_fds[2];
-	int command_reply_fds[2];
-	const char *sock_file;
-	struct cras_file_wait *sock_file_wait;
-	bool sock_file_exists;
-	struct thread_state thread;
-	cras_stream_id_t next_stream_id;
-	pthread_cond_t stream_start_cond;
-	pthread_mutex_t stream_start_lock;
-	int last_command_result;
-	struct client_stream *streams;
-	const struct cras_server_state *server_state;
-	struct audio_thread_event_log *atlog_ro;
-	void (*debug_info_callback)(struct cras_client *);
-	void (*atlog_access_callback)(struct cras_client *);
-	get_hotword_models_cb_t get_hotword_models_cb;
-	cras_connection_status_cb_t server_connection_cb;
-	void *server_connection_user_arg;
-	cras_thread_priority_cb_t thread_priority_cb;
-	struct cras_observer_ops observer_ops;
-	void *observer_context;
-};
-
-/*
- * Holds the client pointer plus internal book keeping.
- *
- * client - The client
- * server_state_rwlock - lock to make the client's server_state thread-safe.
- */
-struct client_int {
-	struct cras_client client;
-	pthread_rwlock_t server_state_rwlock;
-};
-
-#define to_client_int(cptr)                                                    \
-	((struct client_int *)((char *)cptr -                                  \
-			       offsetof(struct client_int, client)))
-
-/*
- * Holds the hotword stream format, params, and ID used when waiting for a
- * hotword. The structure is created by cras_client_enable_hotword_callback and
- * destroyed by cras_client_disable_hotword_callback.
- */
-struct cras_hotword_handle {
-	struct cras_audio_format *format;
-	struct cras_stream_params *params;
-	cras_stream_id_t stream_id;
-	cras_hotword_trigger_cb_t trigger_cb;
-	cras_hotword_error_cb_t err_cb;
-	void *user_data;
-};
-
-struct cras_stream_cb_data {
-	cras_stream_id_t stream_id;
-	enum CRAS_STREAM_DIRECTION direction;
-	uint8_t *buf;
-	unsigned int frames;
-	struct timespec sample_ts;
-	void *user_arg;
-};
-
-int stream_cb_get_stream_id(struct cras_stream_cb_data *data,
-			    cras_stream_id_t *id)
-{
-	*id = data->stream_id;
-	return 0;
-}
-
-int stream_cb_get_buf(struct cras_stream_cb_data *data, uint8_t **buf)
-{
-	*buf = data->buf;
-	return 0;
-}
-
-int stream_cb_get_frames(struct cras_stream_cb_data *data, unsigned int *frames)
-{
-	*frames = data->frames;
-	return 0;
-}
-
-int stream_cb_get_latency(struct cras_stream_cb_data *data,
-			  struct timespec *latency)
-{
-	if (data->direction == CRAS_STREAM_INPUT)
-		cras_client_calc_capture_latency(&data->sample_ts, latency);
-	else
-		cras_client_calc_playback_latency(&data->sample_ts, latency);
-	return 0;
-}
-
-int stream_cb_get_user_arg(struct cras_stream_cb_data *data, void **user_arg)
-{
-	*user_arg = data->user_arg;
-	return 0;
-}
-
-struct libcras_stream_cb_data *
-libcras_stream_cb_data_create(cras_stream_id_t stream_id,
-			      enum CRAS_STREAM_DIRECTION direction,
-			      uint8_t *buf, unsigned int frames,
-			      struct timespec sample_ts, void *user_arg)
-{
-	struct libcras_stream_cb_data *data =
-		(struct libcras_stream_cb_data *)calloc(
-			1, sizeof(struct libcras_stream_cb_data));
-	if (!data) {
-		syslog(LOG_ERR, "cras_client: calloc: %s", strerror(errno));
-		return NULL;
-	}
-	data->data_ = (struct cras_stream_cb_data *)calloc(
-		1, sizeof(struct cras_stream_cb_data));
-	if (!data->data_) {
-		syslog(LOG_ERR, "cras_client: calloc: %s", strerror(errno));
-		free(data);
-		return NULL;
-	}
-	data->api_version = CRAS_API_VERSION;
-	data->get_stream_id = stream_cb_get_stream_id;
-	data->get_buf = stream_cb_get_buf;
-	data->get_frames = stream_cb_get_frames;
-	data->get_latency = stream_cb_get_latency;
-	data->get_user_arg = stream_cb_get_user_arg;
-	data->data_->stream_id = stream_id;
-	data->data_->direction = direction;
-	data->data_->buf = buf;
-	data->data_->frames = frames;
-	data->data_->sample_ts = sample_ts;
-	data->data_->user_arg = user_arg;
-	return data;
-}
-
-void libcras_stream_cb_data_destroy(struct libcras_stream_cb_data *data)
-{
-	if (data)
-		free(data->data_);
-	free(data);
-}
-
-/*
- * Local Helpers
- */
-
-static int client_thread_rm_stream(struct cras_client *client,
-				   cras_stream_id_t stream_id);
-static int handle_message_from_server(struct cras_client *client);
-static int reregister_notifications(struct cras_client *client);
-
-static struct libcras_node_info *
-libcras_node_info_create(struct cras_iodev_info *iodev,
-			 struct cras_ionode_info *ionode);
-
-/*
- * Unlock the server_state_rwlock if lock_rc is 0.
- *
- * Args:
- *    client - The CRAS client pointer.
- *    lock_rc - The result of server_state_rdlock or
- *              server_state_wrlock.
- */
-static void server_state_unlock(const struct cras_client *client, int lock_rc)
-{
-	struct client_int *client_int;
-
-	if (!client)
-		return;
-	client_int = to_client_int(client);
-	if (lock_rc == 0)
-		pthread_rwlock_unlock(&client_int->server_state_rwlock);
-}
-
-/*
- * Lock the server_state_rwlock for reading.
- *
- * Also checks that the server_state pointer is valid.
- *
- * Args:
- *    client - The CRAS client pointer.
- * Returns:
- *    0 for success, positive error code on error.
- *    Returns EINVAL if the server state pointer is NULL.
- */
-static int server_state_rdlock(const struct cras_client *client)
-{
-	struct client_int *client_int;
-	int lock_rc;
-
-	if (!client)
-		return EINVAL;
-	client_int = to_client_int(client);
-	lock_rc = pthread_rwlock_rdlock(&client_int->server_state_rwlock);
-	if (lock_rc != 0)
-		return lock_rc;
-	if (!client->server_state) {
-		pthread_rwlock_unlock(&client_int->server_state_rwlock);
-		return EINVAL;
-	}
-	return 0;
-}
-
-/*
- * Lock the server_state_rwlock for writing.
- *
- * Args:
- *    client - The CRAS client pointer.
- * Returns:
- *    0 for success, positive error code on error.
- */
-static int server_state_wrlock(const struct cras_client *client)
-{
-	struct client_int *client_int;
-
-	if (!client)
-		return EINVAL;
-	client_int = to_client_int(client);
-	return pthread_rwlock_wrlock(&client_int->server_state_rwlock);
-}
-
-/* Get the stream pointer from a stream id. */
-static struct client_stream *stream_from_id(const struct cras_client *client,
-					    unsigned int id)
-{
-	struct client_stream *out;
-
-	DL_SEARCH_SCALAR(client->streams, out, id, id);
-	return out;
-}
-
-/*
- * Fill a pollfd structure with the current server fd and events.
- */
-void server_fill_pollfd(const struct cras_client *client,
-			struct pollfd *poll_fd)
-{
-	int events = 0;
-
-	poll_fd->fd = client->server_fd;
-	switch (client->server_fd_state) {
-	case CRAS_SOCKET_STATE_DISCONNECTED:
-		break;
-	case CRAS_SOCKET_STATE_WAIT_FOR_SOCKET:
-	case CRAS_SOCKET_STATE_FIRST_MESSAGE:
-	case CRAS_SOCKET_STATE_CONNECTED:
-	case CRAS_SOCKET_STATE_ERROR_DELAY:
-		events = POLLIN;
-		break;
-	case CRAS_SOCKET_STATE_WAIT_FOR_WRITABLE:
-		events = POLLOUT;
-		break;
-	}
-	poll_fd->events = events;
-	poll_fd->revents = 0;
-}
-
-/*
- * Change the server_fd_state.
- */
-static void server_fd_move_to_state(struct cras_client *client,
-				    cras_socket_state_t state)
-{
-	if (state == client->server_fd_state)
-		return;
-
-	client->server_fd_state = state;
-}
-
-/*
- * Action to take when in state ERROR_DELAY.
- *
- * In this state we want to sleep for a few seconds before retrying the
- * connection to the audio server.
- *
- * If server_fd is negative: create a timer and setup server_fd with the
- * timer's fd. If server_fd is not negative and there is input, then assume
- * that the timer has expired, and restart the connection by moving to
- * WAIT_FOR_SOCKET state.
- */
-static int error_delay_next_action(struct cras_client *client, int poll_revents)
-{
-	int rc;
-	struct itimerspec timeout;
-
-	if (client->server_fd == -1) {
-		client->server_fd = timerfd_create(CLOCK_MONOTONIC,
-						   TFD_NONBLOCK | TFD_CLOEXEC);
-		if (client->server_fd == -1) {
-			rc = -errno;
-			syslog(LOG_ERR,
-			       "cras_client: Could not create timerfd: %s",
-			       strerror(-rc));
-			return rc;
-		}
-
-		/* Setup a relative timeout of 2 seconds. */
-		memset(&timeout, 0, sizeof(timeout));
-		timeout.it_value.tv_sec = 2;
-		rc = timerfd_settime(client->server_fd, 0, &timeout, NULL);
-		if (rc != 0) {
-			rc = -errno;
-			syslog(LOG_ERR,
-			       "cras_client: Could not set timeout: %s",
-			       strerror(-rc));
-			return rc;
-		}
-		return 0;
-	} else if ((poll_revents & POLLIN) == 0) {
-		return 0;
-	}
-
-	/* Move to the next state: close the timer fd first. */
-	close(client->server_fd);
-	client->server_fd = -1;
-	server_fd_move_to_state(client, CRAS_SOCKET_STATE_WAIT_FOR_SOCKET);
-	return 0;
-}
-
-/*
- * Action to take when in WAIT_FOR_SOCKET state.
- *
- * In this state we are waiting for the socket file to exist. The existence of
- * the socket file is continually monitored using the cras_file_wait structure
- * and a separate fd. When the sock_file_exists boolean is modified, the state
- * machine is invoked.
- *
- * If the socket file exists, then we move to the WAIT_FOR_WRITABLE state.
- */
-static void wait_for_socket_next_action(struct cras_client *client)
-{
-	if (client->sock_file_exists)
-		server_fd_move_to_state(client,
-					CRAS_SOCKET_STATE_WAIT_FOR_WRITABLE);
-}
-
-/*
- * Action to take when in WAIT_FOR_WRITABLE state.
- *
- * In this state we are initiating a connection the server and waiting for the
- * server to ready for incoming messages.
- *
- * Create the socket to the server, and wait while a connect request results in
- * -EINPROGRESS. Otherwise, we assume that the socket file will be deleted by
- * the server and the server_fd_state will be changed in
- * sock_file_wait_dispatch().
- */
-static int wait_for_writable_next_action(struct cras_client *client,
-					 int poll_revents)
-{
-	int rc;
-	struct sockaddr_un address;
-
-	if (client->server_fd == -1) {
-		client->server_fd = socket(PF_UNIX, SOCK_SEQPACKET, 0);
-		if (client->server_fd < 0) {
-			rc = -errno;
-			syslog(LOG_ERR, "cras_client: server socket failed: %s",
-			       strerror(-rc));
-			return rc;
-		}
-	} else if ((poll_revents & POLLOUT) == 0) {
-		return 0;
-	}
-
-	/* We make the file descriptor non-blocking when we do connect(), so we
-	 * don't block indefinitely. */
-	cras_make_fd_nonblocking(client->server_fd);
-
-	memset(&address, 0, sizeof(struct sockaddr_un));
-	address.sun_family = AF_UNIX;
-	strcpy(address.sun_path, client->sock_file);
-	rc = connect(client->server_fd, (struct sockaddr *)&address,
-		     sizeof(struct sockaddr_un));
-	if (rc != 0) {
-		rc = -errno;
-		/* For -EINPROGRESS, we wait for POLLOUT on the server_fd.
-		 * Otherwise CRAS is not running and we assume that the socket
-		 * file will be deleted and recreated. Notification of that will
-		 * happen via the sock_file_wait_dispatch(). */
-		if (rc == -ECONNREFUSED) {
-			/* CRAS is not running, don't log this error and just
-			 * stay in this state waiting sock_file_wait_dispatch()
-			 * to move the state machine. */
-			close(client->server_fd);
-			client->server_fd = -1;
-		} else if (rc != -EINPROGRESS) {
-			syslog(LOG_ERR,
-			       "cras_client: server connect failed: %s",
-			       strerror(-rc));
-			return rc;
-		}
-		return 0;
-	}
-
-	cras_make_fd_blocking(client->server_fd);
-	server_fd_move_to_state(client, CRAS_SOCKET_STATE_FIRST_MESSAGE);
-	return 0;
-}
-
-/*
- * Action to take when transitioning to the CONNECTED state.
- */
-static int connect_transition_action(struct cras_client *client)
-{
-	eventfd_t event_value;
-	int rc;
-
-	rc = reregister_notifications(client);
-	if (rc < 0)
-		return rc;
-
-	server_fd_move_to_state(client, CRAS_SOCKET_STATE_CONNECTED);
-	/* Notify anyone waiting on this state change that we're
-	 * connected. */
-	eventfd_read(client->server_event_fd, &event_value);
-	eventfd_write(client->server_event_fd, 1);
-	if (client->server_connection_cb)
-		client->server_connection_cb(
-			client, CRAS_CONN_STATUS_CONNECTED,
-			client->server_connection_user_arg);
-	return 0;
-}
-
-/*
- * Action to take when in the FIRST_MESSAGE state.
- *
- * We are waiting for the first message from the server. When our client ID has
- * been set, then we can move to the CONNECTED state.
- */
-static int first_message_next_action(struct cras_client *client,
-				     int poll_revents)
-{
-	int rc;
-
-	if (client->server_fd < 0)
-		return -EINVAL;
-
-	if ((poll_revents & POLLIN) == 0)
-		return 0;
-
-	rc = handle_message_from_server(client);
-	if (rc < 0) {
-		syslog(LOG_ERR, "handle first message: %s", strerror(-rc));
-	} else if (client->id >= 0) {
-		rc = connect_transition_action(client);
-	} else {
-		syslog(LOG_ERR, "did not get ID after first message!");
-		rc = -EINVAL;
-	}
-	return rc;
-}
-
-/*
- * Play nice and shutdown the server socket.
- */
-static inline int shutdown_and_close_socket(int sockfd)
-{
-	int rc;
-	uint8_t buffer[CRAS_CLIENT_MAX_MSG_SIZE];
-	struct timeval tv;
-
-	tv.tv_sec = 0;
-	tv.tv_usec = SERVER_SHUTDOWN_TIMEOUT_US;
-	setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(tv));
-
-	rc = shutdown(sockfd, SHUT_WR);
-	if (rc < 0)
-		return rc;
-	/* Wait until the socket is closed by the peer. */
-	for (;;) {
-		rc = recv(sockfd, buffer, sizeof(buffer), 0);
-		if (rc <= 0)
-			break;
-	}
-	return close(sockfd);
-}
-
-/*
- * Action to take when disconnecting from the server.
- *
- * Clean up the server socket, and the server_state pointer. Move to the next
- * logical state.
- */
-static void disconnect_transition_action(struct cras_client *client, bool force)
-{
-	eventfd_t event_value;
-	cras_socket_state_t old_state = client->server_fd_state;
-	struct client_stream *s;
-	int lock_rc;
-
-	/* Stop all playing streams.
-	 * TODO(muirj): Pause and resume streams. */
-	DL_FOREACH (client->streams, s) {
-		s->config->err_cb(client, s->id, -ENOTCONN,
-				  s->config->user_data);
-		client_thread_rm_stream(client, s->id);
-	}
-
-	/* Clean up the server_state pointer. */
-	lock_rc = server_state_wrlock(client);
-	if (client->server_state) {
-		munmap((void *)client->server_state,
-		       sizeof(*client->server_state));
-		client->server_state = NULL;
-	}
-	server_state_unlock(client, lock_rc);
-
-	/* Our ID is unknown now. */
-	client->id = -1;
-
-	/* Clean up the server fd. */
-	if (client->server_fd >= 0) {
-		if (!force)
-			shutdown_and_close_socket(client->server_fd);
-		else
-			close(client->server_fd);
-		client->server_fd = -1;
-	}
-
-	/* Reset the server_event_fd value to 0 (and cause subsequent threads
-	 * waiting on the connection to wait). */
-	eventfd_read(client->server_event_fd, &event_value);
-
-	switch (old_state) {
-	case CRAS_SOCKET_STATE_DISCONNECTED:
-		/* Do nothing: already disconnected. */
-		break;
-	case CRAS_SOCKET_STATE_ERROR_DELAY:
-		/* We're disconnected and there was a failure to setup
-		 * automatic reconnection, so call the server error
-		 * callback now. */
-		server_fd_move_to_state(client, CRAS_SOCKET_STATE_DISCONNECTED);
-		if (client->server_connection_cb)
-			client->server_connection_cb(
-				client, CRAS_CONN_STATUS_FAILED,
-				client->server_connection_user_arg);
-		break;
-	case CRAS_SOCKET_STATE_WAIT_FOR_SOCKET:
-	case CRAS_SOCKET_STATE_WAIT_FOR_WRITABLE:
-	case CRAS_SOCKET_STATE_FIRST_MESSAGE:
-		/* We are running this state transition while a connection is
-		 * in progress for an error case. When there is no error, we
-		 * come into this function in the DISCONNECTED state. */
-		server_fd_move_to_state(client, CRAS_SOCKET_STATE_ERROR_DELAY);
-		break;
-	case CRAS_SOCKET_STATE_CONNECTED:
-		/* Disconnected from CRAS (for an error), wait for the socket
-		 * file to be (re)created. */
-		server_fd_move_to_state(client,
-					CRAS_SOCKET_STATE_WAIT_FOR_SOCKET);
-		/* Notify the caller that we aren't connected anymore. */
-		if (client->server_connection_cb)
-			client->server_connection_cb(
-				client, CRAS_CONN_STATUS_DISCONNECTED,
-				client->server_connection_user_arg);
-		break;
-	}
-}
-
-static int server_fd_dispatch(struct cras_client *client, int poll_revents)
-{
-	int rc = 0;
-	cras_socket_state_t old_state;
-
-	if ((poll_revents & POLLHUP) != 0) {
-		/* Error or disconnect: cleanup and make a state change now. */
-		disconnect_transition_action(client, true);
-	}
-	old_state = client->server_fd_state;
-
-	switch (client->server_fd_state) {
-	case CRAS_SOCKET_STATE_DISCONNECTED:
-		/* Assume that we've taken the necessary actions. */
-		return -ENOTCONN;
-	case CRAS_SOCKET_STATE_ERROR_DELAY:
-		rc = error_delay_next_action(client, poll_revents);
-		break;
-	case CRAS_SOCKET_STATE_WAIT_FOR_SOCKET:
-		wait_for_socket_next_action(client);
-		break;
-	case CRAS_SOCKET_STATE_WAIT_FOR_WRITABLE:
-		rc = wait_for_writable_next_action(client, poll_revents);
-		break;
-	case CRAS_SOCKET_STATE_FIRST_MESSAGE:
-		rc = first_message_next_action(client, poll_revents);
-		break;
-	case CRAS_SOCKET_STATE_CONNECTED:
-		if ((poll_revents & POLLIN) != 0)
-			rc = handle_message_from_server(client);
-		break;
-	}
-
-	if (rc != 0) {
-		/* If there is an error, then start-over. */
-		rc = server_fd_dispatch(client, POLLHUP);
-	} else if (old_state != client->server_fd_state) {
-		/* There was a state change, process the new state now. */
-		rc = server_fd_dispatch(client, 0);
-	}
-	return rc;
-}
-
-/*
- * Start connecting to the server if we aren't already.
- */
-static int server_connect(struct cras_client *client)
-{
-	if (client->server_fd_state != CRAS_SOCKET_STATE_DISCONNECTED)
-		return 0;
-	/* Start waiting for the server socket to exist. */
-	server_fd_move_to_state(client, CRAS_SOCKET_STATE_WAIT_FOR_SOCKET);
-	return server_fd_dispatch(client, 0);
-}
-
-/*
- * Disconnect from the server if we haven't already.
- */
-static void server_disconnect(struct cras_client *client)
-{
-	if (client->server_fd_state == CRAS_SOCKET_STATE_DISCONNECTED)
-		return;
-	/* Set the disconnected state first so that the disconnect
-	 * transition doesn't move the server state to ERROR_DELAY. */
-	server_fd_move_to_state(client, CRAS_SOCKET_STATE_DISCONNECTED);
-	disconnect_transition_action(client, false);
-}
-
-/*
- * Called when something happens to the socket file.
- */
-static void sock_file_wait_callback(void *context, cras_file_wait_event_t event,
-				    const char *filename)
-{
-	struct cras_client *client = (struct cras_client *)context;
-	switch (event) {
-	case CRAS_FILE_WAIT_EVENT_CREATED:
-		client->sock_file_exists = 1;
-		switch (client->server_fd_state) {
-		case CRAS_SOCKET_STATE_DISCONNECTED:
-		case CRAS_SOCKET_STATE_ERROR_DELAY:
-		case CRAS_SOCKET_STATE_FIRST_MESSAGE:
-		case CRAS_SOCKET_STATE_CONNECTED:
-			break;
-		case CRAS_SOCKET_STATE_WAIT_FOR_SOCKET:
-		case CRAS_SOCKET_STATE_WAIT_FOR_WRITABLE:
-			/* The socket file exists. Tell the server state
-			 * machine. */
-			server_fd_dispatch(client, 0);
-			break;
-		}
-		break;
-	case CRAS_FILE_WAIT_EVENT_DELETED:
-		client->sock_file_exists = 0;
-		switch (client->server_fd_state) {
-		case CRAS_SOCKET_STATE_DISCONNECTED:
-			break;
-		case CRAS_SOCKET_STATE_WAIT_FOR_SOCKET:
-		case CRAS_SOCKET_STATE_WAIT_FOR_WRITABLE:
-		case CRAS_SOCKET_STATE_ERROR_DELAY:
-		case CRAS_SOCKET_STATE_FIRST_MESSAGE:
-		case CRAS_SOCKET_STATE_CONNECTED:
-			/* Restart the connection process. */
-			server_disconnect(client);
-			server_connect(client);
-			break;
-		}
-		break;
-	case CRAS_FILE_WAIT_EVENT_NONE:
-		break;
-	}
-}
-
-/*
- * Service the sock_file_wait's fd.
- *
- * If the socket file is deleted, then cause a disconnect from the server.
- * Otherwise, start a reconnect depending on the server_fd_state.
- */
-static int sock_file_wait_dispatch(struct cras_client *client, int poll_revents)
-{
-	int rc;
-
-	if ((poll_revents & POLLIN) == 0)
-		return 0;
-
-	rc = cras_file_wait_dispatch(client->sock_file_wait);
-	if (rc == -EAGAIN || rc == -EWOULDBLOCK)
-		rc = 0;
-	else if (rc != 0)
-		syslog(LOG_ERR, "cras_file_wait_dispatch: %s", strerror(-rc));
-	return rc;
-}
-
-/*
- * Waits until we have heard back from the server so that we know we are
- * connected.
- *
- * The connected success/failure message is always the first message the server
- * sends. Return non zero if client is connected to the server. A return code
- * of zero means that the client is not connected to the server.
- */
-static int check_server_connected_wait(struct cras_client *client,
-				       struct timespec *timeout)
-{
-	int rc = 0;
-	struct pollfd poll_fd;
-
-	poll_fd.fd = client->server_event_fd;
-	poll_fd.events = POLLIN;
-	poll_fd.revents = 0;
-
-	/* The server_event_fd is only read and written by the functions
-	 * that connect to the server. When a connection is established the
-	 * eventfd has a value of 1 and cras_poll will return immediately
-	 * with 1. When there is no connection to the server, then this
-	 * function waits until the timeout has expired or a non-zero value
-	 * is written to the server_event_fd. */
-	while (rc == 0)
-		rc = cras_poll(&poll_fd, 1, timeout, NULL);
-	return rc > 0;
-}
-
-/* Returns non-zero if the thread is running (not stopped). */
-static inline int thread_is_running(struct thread_state *thread)
-{
-	return thread->state != CRAS_THREAD_STOP;
-}
-
-/*
- * Opens the server socket and connects to it.
- * Args:
- *    client - Client pointer created with cras_client_create().
- *    timeout - Connection timeout.
- * Returns:
- *    0 for success, negative error code on failure.
- */
-static int connect_to_server(struct cras_client *client,
-			     struct timespec *timeout, bool use_command_thread)
-{
-	int rc;
-	struct pollfd poll_fd[2];
-	struct timespec connected_timeout;
-
-	if (!client)
-		return -EINVAL;
-
-	if (thread_is_running(&client->thread) && use_command_thread) {
-		rc = cras_client_connect_async(client);
-		if (rc == 0) {
-			rc = check_server_connected_wait(client, timeout);
-			return rc ? 0 : -ESHUTDOWN;
-		}
-	}
-
-	connected_timeout.tv_sec = 0;
-	connected_timeout.tv_nsec = 0;
-	if (check_server_connected_wait(client, &connected_timeout))
-		return 0;
-
-	poll_fd[0].fd = cras_file_wait_get_fd(client->sock_file_wait);
-	poll_fd[0].events = POLLIN;
-
-	rc = server_connect(client);
-	while (rc == 0) {
-		// Wait until we've connected or until there is a timeout.
-		// Meanwhile handle incoming actions on our fds.
-
-		server_fill_pollfd(client, &(poll_fd[1]));
-		rc = cras_poll(poll_fd, 2, timeout, NULL);
-		if (rc <= 0)
-			continue;
-
-		if (poll_fd[0].revents) {
-			rc = sock_file_wait_dispatch(client,
-						     poll_fd[0].revents);
-			continue;
-		}
-
-		if (poll_fd[1].revents) {
-			rc = server_fd_dispatch(client, poll_fd[1].revents);
-			if (rc == 0 && client->server_fd_state ==
-					       CRAS_SOCKET_STATE_CONNECTED)
-				break;
-		}
-	}
-
-	if (rc != 0)
-		syslog(LOG_ERR, "cras_client: Connect server failed: %s",
-		       strerror(-rc));
-
-	return rc;
-}
-
-static int connect_to_server_wait_retry(struct cras_client *client,
-					int timeout_ms, bool use_command_thread)
-{
-	struct timespec timeout_value;
-	struct timespec *timeout;
-
-	if (timeout_ms < 0) {
-		timeout = NULL;
-	} else {
-		timeout = &timeout_value;
-		ms_to_timespec(timeout_ms, timeout);
-	}
-
-	/* If connected, wait for the first message from the server
-	 * indicating it's ready. */
-	return connect_to_server(client, timeout, use_command_thread);
-}
-
-/*
- * Tries to connect to the server.  Waits for the initial message from the
- * server.  This will happen near instantaneously if the server is already
- * running.
- */
-static int connect_to_server_wait(struct cras_client *client,
-				  bool use_command_thread)
-{
-	return connect_to_server_wait_retry(client, SERVER_CONNECT_TIMEOUT_MS,
-					    use_command_thread);
-}
-
-/*
- * Audio thread.
- */
-
-/* Sends a message from the stream to the client to indicate an error.
- * If the running stream encounters an error, then it must tell the client
- * to stop running it.
- */
-static int send_stream_message(const struct client_stream *stream,
-			       unsigned msg_id)
-{
-	int res;
-	struct stream_msg msg;
-
-	msg.stream_id = stream->id;
-	msg.msg_id = msg_id;
-	res = write(stream->client->stream_fds[1], &msg, sizeof(msg));
-	if (res != sizeof(msg))
-		return -EPIPE;
-
-	return 0;
-}
-
-/* Blocks until there is data to be read from the read_fd or until woken by an
- * incoming "poke" on wake_fd. Up to "len" bytes are read into "buf". */
-static int read_with_wake_fd(int wake_fd, int read_fd, uint8_t *buf, size_t len)
-{
-	struct pollfd pollfds[2];
-	int nread = 0;
-	int nfds = 1;
-	int rc;
-	char tmp;
-
-	pollfds[0].fd = wake_fd;
-	pollfds[0].events = POLLIN;
-	if (read_fd >= 0) {
-		nfds++;
-		pollfds[1].fd = read_fd;
-		pollfds[1].events = POLLIN;
-	}
-
-	rc = poll(pollfds, nfds, -1);
-	if (rc < 0)
-		return rc;
-	if (read_fd >= 0 && pollfds[1].revents & POLLIN) {
-		nread = read(read_fd, buf, len);
-		if (nread != (int)len)
-			return -EIO;
-	}
-	if (pollfds[0].revents & POLLIN) {
-		rc = read(wake_fd, &tmp, 1);
-		if (rc < 0)
-			return rc;
-	}
-
-	return nread;
-}
-/* Check the availability and configures a capture buffer.
- * Args:
- *     stream - The input stream to configure buffer for.
- *     captured_frames - To be filled with the pointer to the beginning of
- *         captured buffer.
- *     num_frames - Number of captured frames.
- * Returns:
- *     Number of frames available in captured_frames.
- */
-static unsigned int config_capture_buf(struct client_stream *stream,
-				       uint8_t **captured_frames,
-				       unsigned int num_frames)
-{
-	/* Always return the beginning of the read buffer because Chrome expects
-	 * so. */
-	*captured_frames = cras_shm_get_read_buffer_base(stream->shm);
-
-	/* Don't ask for more frames than the client desires. */
-	if (stream->flags & BULK_AUDIO_OK)
-		num_frames = MIN(num_frames, stream->config->buffer_frames);
-	else
-		num_frames = MIN(num_frames, stream->config->cb_threshold);
-
-	/* If shm readable frames is less than client requests, that means
-	 * overrun has happened in server side. Don't send partial corrupted
-	 * buffer to client. */
-	if (cras_shm_get_curr_read_frames(stream->shm) < num_frames)
-		return 0;
-
-	return num_frames;
-}
-
-static void complete_capture_read_current(struct client_stream *stream,
-					  unsigned int num_frames)
-{
-	cras_shm_buffer_read_current(stream->shm, num_frames);
-}
-
-static int send_capture_reply(struct client_stream *stream, unsigned int frames,
-			      int err)
-{
-	struct audio_message aud_msg;
-	int rc;
-
-	if (!cras_stream_uses_input_hw(stream->direction))
-		return 0;
-
-	aud_msg.id = AUDIO_MESSAGE_DATA_CAPTURED;
-	aud_msg.frames = frames;
-	aud_msg.error = err;
-
-	rc = write(stream->aud_fd, &aud_msg, sizeof(aud_msg));
-	if (rc != sizeof(aud_msg))
-		return -EPIPE;
-
-	return 0;
-}
-
-/* For capture streams this handles the message signalling that data is ready to
- * be passed to the user of this stream.  Calls the audio callback with the new
- * samples, and mark them as read.
- * Args:
- *    stream - The stream the message was received for.
- *    num_frames - The number of captured frames.
- * Returns:
- *    0, unless there is a fatal error or the client declares enod of file.
- */
-static int handle_capture_data_ready(struct client_stream *stream,
-				     unsigned int num_frames)
-{
-	int frames;
-	struct cras_stream_params *config;
-	uint8_t *captured_frames;
-	struct timespec ts;
-	int rc = 0;
-	struct libcras_stream_cb_data *data;
-
-	config = stream->config;
-	/* If this message is for an output stream, log error and drop it. */
-	if (!cras_stream_has_input(stream->direction)) {
-		syslog(LOG_ERR, "cras_client: Play data to input\n");
-		return 0;
-	}
-
-	num_frames = config_capture_buf(stream, &captured_frames, num_frames);
-	if (num_frames == 0)
-		return 0;
-
-	cras_timespec_to_timespec(&ts, &stream->shm->header->ts);
-
-	if (config->stream_cb) {
-		data = libcras_stream_cb_data_create(
-			stream->id, stream->direction, captured_frames,
-			num_frames, ts, config->user_data);
-		if (!data)
-			return -errno;
-		frames = config->stream_cb(data);
-		libcras_stream_cb_data_destroy(data);
-		data = NULL;
-	} else if (config->unified_cb) {
-		frames = config->unified_cb(stream->client, stream->id,
-					    captured_frames, NULL, num_frames,
-					    &ts, NULL, config->user_data);
-	} else {
-		frames = config->aud_cb(stream->client, stream->id,
-					captured_frames, num_frames, &ts,
-					config->user_data);
-	}
-	if (frames < 0) {
-		send_stream_message(stream, CLIENT_STREAM_EOF);
-		rc = frames;
-		goto reply_captured;
-	}
-	if (frames == 0)
-		return 0;
-
-	complete_capture_read_current(stream, frames);
-reply_captured:
-	return send_capture_reply(stream, frames, rc);
-}
-
-/* Notifies the server that "frames" samples have been written. */
-static int send_playback_reply(struct client_stream *stream,
-			       unsigned int frames, int error)
-{
-	struct audio_message aud_msg;
-	int rc;
-
-	if (!cras_stream_uses_output_hw(stream->direction))
-		return 0;
-
-	aud_msg.id = AUDIO_MESSAGE_DATA_READY;
-	aud_msg.frames = frames;
-	aud_msg.error = error;
-
-	rc = write(stream->aud_fd, &aud_msg, sizeof(aud_msg));
-	if (rc != sizeof(aud_msg))
-		return -EPIPE;
-
-	return 0;
-}
-
-/* For playback streams when current buffer is empty, this handles the request
- * for more samples by calling the audio callback for the thread, and signaling
- * the server that the samples have been written. */
-static int handle_playback_request(struct client_stream *stream,
-				   unsigned int num_frames)
-{
-	uint8_t *buf;
-	int frames;
-	int rc = 0;
-	struct cras_stream_params *config;
-	struct cras_audio_shm *shm = stream->shm;
-	struct timespec ts;
-	struct libcras_stream_cb_data *data;
-
-	config = stream->config;
-
-	/* If this message is for an input stream, log error and drop it. */
-	if (stream->direction != CRAS_STREAM_OUTPUT) {
-		syslog(LOG_ERR, "cras_client: Record data from output\n");
-		return 0;
-	}
-
-	buf = cras_shm_get_write_buffer_base(shm);
-
-	/* Limit the amount of frames to the configured amount. */
-	num_frames = MIN(num_frames, config->cb_threshold);
-
-	cras_timespec_to_timespec(&ts, &shm->header->ts);
-
-	/* Get samples from the user */
-	if (config->stream_cb) {
-		data = libcras_stream_cb_data_create(stream->id,
-						     stream->direction, buf,
-						     num_frames, ts,
-						     config->user_data);
-		if (!data)
-			return -errno;
-		frames = config->stream_cb(data);
-		libcras_stream_cb_data_destroy(data);
-		data = NULL;
-	} else if (config->unified_cb) {
-		frames = config->unified_cb(stream->client, stream->id, NULL,
-					    buf, num_frames, NULL, &ts,
-					    config->user_data);
-	} else {
-		frames = config->aud_cb(stream->client, stream->id, buf,
-					num_frames, &ts, config->user_data);
-	}
-	if (frames < 0) {
-		send_stream_message(stream, CLIENT_STREAM_EOF);
-		rc = frames;
-		goto reply_written;
-	}
-
-	cras_shm_buffer_written_start(shm, frames);
-
-reply_written:
-	/* Signal server that data is ready, or that an error has occurred. */
-	rc = send_playback_reply(stream, frames, rc);
-	return rc;
-}
-
-static void audio_thread_set_priority(struct client_stream *stream)
-{
-	/* Use provided callback to set priority if available. */
-	if (stream->client->thread_priority_cb) {
-		stream->client->thread_priority_cb(stream->client);
-		return;
-	}
-
-	/* Try to get RT scheduling, if that fails try to set the nice value. */
-	if (cras_set_rt_scheduling(CRAS_CLIENT_RT_THREAD_PRIORITY) ||
-	    cras_set_thread_priority(CRAS_CLIENT_RT_THREAD_PRIORITY))
-		cras_set_nice_level(CRAS_CLIENT_NICENESS_LEVEL);
-}
-
-/* Listens to the audio socket for messages from the server indicating that
- * the stream needs to be serviced.  One of these runs per stream. */
-static void *audio_thread(void *arg)
-{
-	struct client_stream *stream = (struct client_stream *)arg;
-	int thread_terminated = 0;
-	struct audio_message aud_msg;
-	int aud_fd;
-	int num_read;
-
-	if (arg == NULL)
-		return (void *)-EIO;
-
-	audio_thread_set_priority(stream);
-
-	/* Notify the control thread that we've started. */
-	pthread_mutex_lock(&stream->client->stream_start_lock);
-	pthread_cond_broadcast(&stream->client->stream_start_cond);
-	pthread_mutex_unlock(&stream->client->stream_start_lock);
-
-	while (thread_is_running(&stream->thread) && !thread_terminated) {
-		/* While we are warming up, aud_fd may not be valid and some
-		 * shared memory resources may not yet be available. */
-		aud_fd = (stream->thread.state == CRAS_THREAD_WARMUP) ?
-				 -1 :
-				 stream->aud_fd;
-		num_read =
-			read_with_wake_fd(stream->wake_fds[0], aud_fd,
-					  (uint8_t *)&aud_msg, sizeof(aud_msg));
-		if (num_read < 0)
-			return (void *)-EIO;
-		if (num_read == 0)
-			continue;
-
-		switch (aud_msg.id) {
-		case AUDIO_MESSAGE_DATA_READY:
-			thread_terminated = handle_capture_data_ready(
-				stream, aud_msg.frames);
-			break;
-		case AUDIO_MESSAGE_REQUEST_DATA:
-			thread_terminated =
-				handle_playback_request(stream, aud_msg.frames);
-			break;
-		default:
-			break;
-		}
-	}
-
-	return NULL;
-}
-
-/* Pokes the audio thread so that it can notice if it has been terminated. */
-static int wake_aud_thread(struct client_stream *stream)
-{
-	int rc;
-
-	rc = write(stream->wake_fds[1], &rc, 1);
-	if (rc != 1)
-		return rc;
-	return 0;
-}
-
-/* Stop the audio thread for the given stream.
- * Args:
- *    stream - Stream for which to stop the audio thread.
- *    join - When non-zero, attempt to join the audio thread (wait for it to
- *           complete).
- */
-static void stop_aud_thread(struct client_stream *stream, int join)
-{
-	if (thread_is_running(&stream->thread)) {
-		stream->thread.state = CRAS_THREAD_STOP;
-		wake_aud_thread(stream);
-		if (join)
-			pthread_join(stream->thread.tid, NULL);
-	}
-
-	if (stream->wake_fds[0] >= 0) {
-		close(stream->wake_fds[0]);
-		close(stream->wake_fds[1]);
-		stream->wake_fds[0] = -1;
-	}
-}
-
-/* Start the audio thread for this stream.
- * Returns when the thread has started and is waiting.
- * Args:
- *    stream - The stream that needs an audio thread.
- * Returns:
- *    0 for success, or a negative error code.
- */
-static int start_aud_thread(struct client_stream *stream)
-{
-	int rc;
-	struct timespec future;
-
-	rc = pipe(stream->wake_fds);
-	if (rc < 0) {
-		rc = -errno;
-		syslog(LOG_ERR, "cras_client: pipe: %s", strerror(-rc));
-		return rc;
-	}
-
-	stream->thread.state = CRAS_THREAD_WARMUP;
-
-	pthread_mutex_lock(&stream->client->stream_start_lock);
-	rc = pthread_create(&stream->thread.tid, NULL, audio_thread, stream);
-	if (rc) {
-		pthread_mutex_unlock(&stream->client->stream_start_lock);
-		syslog(LOG_ERR, "cras_client: Couldn't create audio stream: %s",
-		       strerror(rc));
-		stream->thread.state = CRAS_THREAD_STOP;
-		stop_aud_thread(stream, 0);
-		return -rc;
-	}
-
-	clock_gettime(CLOCK_REALTIME, &future);
-	future.tv_sec += 2; /* Wait up to two seconds. */
-	rc = pthread_cond_timedwait(&stream->client->stream_start_cond,
-				    &stream->client->stream_start_lock,
-				    &future);
-	pthread_mutex_unlock(&stream->client->stream_start_lock);
-	if (rc != 0) {
-		/* Something is very wrong: try to cancel the thread and don't
-		 * wait for it. */
-		syslog(LOG_ERR, "cras_client: Client thread not responding: %s",
-		       strerror(rc));
-		stop_aud_thread(stream, 0);
-		return -rc;
-	}
-	return 0;
-}
-
-/*
- * Client thread.
- */
-
-/* Gets the update_count of the server state shm region. */
-static inline unsigned
-begin_server_state_read(const struct cras_server_state *state)
-{
-	unsigned count;
-
-	/* Version will be odd when the server is writing. */
-	while ((count = *(volatile unsigned *)&state->update_count) & 1)
-		sched_yield();
-	__sync_synchronize();
-	return count;
-}
-
-/* Checks if the update count of the server state shm region has changed from
- * count.  Returns 0 if the count still matches.
- */
-static inline int end_server_state_read(const struct cras_server_state *state,
-					unsigned count)
-{
-	__sync_synchronize();
-	if (count != *(volatile unsigned *)&state->update_count)
-		return -EAGAIN;
-	return 0;
-}
-
-/* Release shm areas if references to them are held. */
-static void free_shm(struct client_stream *stream)
-{
-	cras_audio_shm_destroy(stream->shm);
-	stream->shm = NULL;
-}
-
-/* Handles the stream connected message from the server.  Check if we need a
- * format converter, configure the shared memory region, and start the audio
- * thread that will handle requests from the server. */
-static int stream_connected(struct client_stream *stream,
-			    const struct cras_client_stream_connected *msg,
-			    const int stream_fds[2], const unsigned int num_fds)
-{
-	int rc, samples_prot;
-	unsigned int i;
-	struct cras_shm_info header_info, samples_info;
-
-	if (msg->err || num_fds != 2) {
-		syslog(LOG_ERR, "cras_client: Error setting up stream %d\n",
-		       msg->err);
-		rc = msg->err;
-		goto err_ret;
-	}
-
-	rc = cras_shm_info_init_with_fd(stream_fds[0], cras_shm_header_size(),
-					&header_info);
-	if (rc < 0)
-		goto err_ret;
-
-	rc = cras_shm_info_init_with_fd(stream_fds[1], msg->samples_shm_size,
-					&samples_info);
-	if (rc < 0) {
-		cras_shm_info_cleanup(&header_info);
-		goto err_ret;
-	}
-
-	if (stream->direction == CRAS_STREAM_OUTPUT)
-		samples_prot = PROT_WRITE;
-	else
-		samples_prot = PROT_READ;
-
-	rc = cras_audio_shm_create(&header_info, &samples_info, samples_prot,
-				   &stream->shm);
-	if (rc < 0) {
-		syslog(LOG_ERR, "cras_client: Error configuring shm");
-		goto err_ret;
-	}
-	cras_shm_copy_shared_config(stream->shm);
-	cras_shm_set_volume_scaler(stream->shm, stream->volume_scaler);
-
-	stream->thread.state = CRAS_THREAD_RUNNING;
-	wake_aud_thread(stream);
-
-	close(stream_fds[0]);
-	close(stream_fds[1]);
-	return 0;
-err_ret:
-	stop_aud_thread(stream, 1);
-	for (i = 0; i < num_fds; i++)
-		close(stream_fds[i]);
-	free_shm(stream);
-	return rc;
-}
-
-static int send_connect_message(struct cras_client *client,
-				struct client_stream *stream, uint32_t dev_idx)
-{
-	int rc;
-	struct cras_connect_message serv_msg;
-	int sock[2] = { -1, -1 };
-
-	/* Create a socket pair for the server to notify of audio events. */
-	rc = socketpair(AF_UNIX, SOCK_STREAM, 0, sock);
-	if (rc != 0) {
-		rc = -errno;
-		syslog(LOG_ERR, "cras_client: socketpair: %s", strerror(-rc));
-		goto fail;
-	}
-
-	cras_fill_connect_message(&serv_msg, stream->config->direction,
-				  stream->id, stream->config->stream_type,
-				  stream->config->client_type,
-				  stream->config->buffer_frames,
-				  stream->config->cb_threshold, stream->flags,
-				  stream->config->effects,
-				  stream->config->format, dev_idx);
-
-	rc = cras_send_with_fds(client->server_fd, &serv_msg, sizeof(serv_msg),
-				&sock[1], 1);
-	if (rc != sizeof(serv_msg)) {
-		rc = EIO;
-		syslog(LOG_ERR,
-		       "cras_client: add_stream: Send server message failed.");
-		goto fail;
-	}
-
-	stream->aud_fd = sock[0];
-	close(sock[1]);
-	return 0;
-
-fail:
-	if (sock[0] != -1)
-		close(sock[0]);
-	if (sock[1] != -1)
-		close(sock[1]);
-	return rc;
-}
-
-/* Adds a stream to a running client.  Checks to make sure that the client is
- * attached, waits if it isn't.  The stream is prepared on the  main thread and
- * passed here. */
-static int client_thread_add_stream(struct cras_client *client,
-				    struct client_stream *stream,
-				    cras_stream_id_t *stream_id_out,
-				    uint32_t dev_idx)
-{
-	int rc;
-	cras_stream_id_t new_id;
-	struct client_stream *out;
-
-	if ((stream->flags & HOTWORD_STREAM) == HOTWORD_STREAM) {
-		int hotword_idx;
-		hotword_idx = cras_client_get_first_dev_type_idx(
-			client, CRAS_NODE_TYPE_HOTWORD, CRAS_STREAM_INPUT);
-
-		/* Find the hotword device index. */
-		if (dev_idx == NO_DEVICE) {
-			if (hotword_idx < 0) {
-				syslog(LOG_ERR,
-				       "cras_client: add_stream: No hotword dev");
-				return hotword_idx;
-			} else {
-				dev_idx = (uint32_t)hotword_idx;
-			}
-		}
-		/* A known Use case for client to pin hotword stream on a not
-		 * hotword device is to use internal mic for Assistant to work
-		 * on board without usable DSP hotwording. We assume there will
-		 * be only one hotword device exists. */
-		else if (dev_idx != (uint32_t)hotword_idx) {
-			/* Unmask the flag to fallback to normal pinned stream
-			 * on specified device. */
-			stream->flags &= ~HOTWORD_STREAM;
-		}
-	}
-
-	/* Find an available stream id. */
-	do {
-		new_id = cras_get_stream_id(client->id, client->next_stream_id);
-		client->next_stream_id++;
-		DL_SEARCH_SCALAR(client->streams, out, id, new_id);
-	} while (out != NULL);
-
-	stream->id = new_id;
-	*stream_id_out = new_id;
-	stream->client = client;
-
-	/* Start the audio thread. */
-	rc = start_aud_thread(stream);
-	if (rc != 0)
-		return rc;
-
-	/* Start the thread associated with this stream. */
-	/* send a message to the server asking that the stream be started. */
-	rc = send_connect_message(client, stream, dev_idx);
-	if (rc != 0) {
-		stop_aud_thread(stream, 1);
-		return rc;
-	}
-
-	/* Add the stream to the linked list */
-	DL_APPEND(client->streams, stream);
-
-	return 0;
-}
-
-/* Removes a stream from a running client from within the running client's
- * context. */
-static int client_thread_rm_stream(struct cras_client *client,
-				   cras_stream_id_t stream_id)
-{
-	struct cras_disconnect_stream_message msg;
-	struct client_stream *stream = stream_from_id(client, stream_id);
-	int rc;
-
-	if (stream == NULL)
-		return 0;
-
-	/* Tell server to remove. */
-	if (client->server_fd_state == CRAS_SOCKET_STATE_CONNECTED) {
-		cras_fill_disconnect_stream_message(&msg, stream_id);
-		rc = write(client->server_fd, &msg, sizeof(msg));
-		if (rc < 0)
-			syslog(LOG_ERR,
-			       "cras_client: error removing stream from server\n");
-	}
-
-	/* And shut down locally. */
-	stop_aud_thread(stream, 1);
-
-	free_shm(stream);
-
-	DL_DELETE(client->streams, stream);
-	if (stream->aud_fd >= 0)
-		close(stream->aud_fd);
-
-	free(stream->config);
-	free(stream);
-
-	return 0;
-}
-
-/* Sets the volume scaling factor for a playback or capture stream. */
-static int client_thread_set_stream_volume(struct cras_client *client,
-					   cras_stream_id_t stream_id,
-					   float volume_scaler)
-{
-	struct client_stream *stream;
-
-	stream = stream_from_id(client, stream_id);
-	if (stream == NULL || volume_scaler > 1.0 || volume_scaler < 0.0)
-		return -EINVAL;
-
-	stream->volume_scaler = volume_scaler;
-	if (stream->shm)
-		cras_shm_set_volume_scaler(stream->shm, volume_scaler);
-
-	return 0;
-}
-
-/* Attach to the shm region containing the audio thread log. */
-static void attach_atlog_shm(struct cras_client *client, int fd)
-{
-	client->atlog_ro = (struct audio_thread_event_log *)mmap(
-		NULL, sizeof(*client->atlog_ro), PROT_READ, MAP_SHARED, fd, 0);
-	close(fd);
-}
-
-/* Attach to the shm region containing the server state. */
-static int client_attach_shm(struct cras_client *client, int shm_fd)
-{
-	int lock_rc;
-	int rc;
-
-	lock_rc = server_state_wrlock(client);
-	if (client->server_state) {
-		rc = -EBUSY;
-		goto error;
-	}
-
-	client->server_state = (struct cras_server_state *)mmap(
-		NULL, sizeof(*client->server_state), PROT_READ, MAP_SHARED,
-		shm_fd, 0);
-	rc = -errno;
-	close(shm_fd);
-	if (client->server_state == (struct cras_server_state *)-1) {
-		syslog(LOG_ERR,
-		       "cras_client: mmap failed to map shm for client: %s",
-		       strerror(-rc));
-		goto error;
-	}
-
-	if (client->server_state->state_version != CRAS_SERVER_STATE_VERSION) {
-		munmap((void *)client->server_state,
-		       sizeof(*client->server_state));
-		client->server_state = NULL;
-		rc = -EINVAL;
-		syslog(LOG_ERR, "cras_client: Unknown server_state version.");
-	} else {
-		rc = 0;
-	}
-
-error:
-	server_state_unlock(client, lock_rc);
-	return rc;
-}
-
-static void cras_client_get_hotword_models_ready(struct cras_client *client,
-						 const char *hotword_models)
-{
-	if (!client->get_hotword_models_cb)
-		return;
-	client->get_hotword_models_cb(client, hotword_models);
-	client->get_hotword_models_cb = NULL;
-}
-
-/* Handles messages from the cras server. */
-static int handle_message_from_server(struct cras_client *client)
-{
-	uint8_t buf[CRAS_CLIENT_MAX_MSG_SIZE];
-	struct cras_client_message *msg;
-	int rc = 0;
-	int nread;
-	int server_fds[2];
-	unsigned int num_fds = 2;
-
-	msg = (struct cras_client_message *)buf;
-	nread = cras_recv_with_fds(client->server_fd, buf, sizeof(buf),
-				   server_fds, &num_fds);
-	if (nread < (int)sizeof(msg->length) || (int)msg->length != nread)
-		return -EIO;
-
-	switch (msg->id) {
-	case CRAS_CLIENT_CONNECTED: {
-		struct cras_client_connected *cmsg =
-			(struct cras_client_connected *)msg;
-		if (num_fds != 1)
-			return -EINVAL;
-		rc = client_attach_shm(client, server_fds[0]);
-		if (rc)
-			return rc;
-		client->id = cmsg->client_id;
-
-		break;
-	}
-	case CRAS_CLIENT_STREAM_CONNECTED: {
-		struct cras_client_stream_connected *cmsg =
-			(struct cras_client_stream_connected *)msg;
-		struct client_stream *stream =
-			stream_from_id(client, cmsg->stream_id);
-		if (stream == NULL) {
-			if (num_fds != 2) {
-				syslog(LOG_ERR,
-				       "cras_client: Error receiving "
-				       "stream 0x%x connected message",
-				       cmsg->stream_id);
-				return -EINVAL;
-			}
-
-			/*
-			 * Usually, the fds should be closed in stream_connected
-			 * callback. However, sometimes a stream is removed
-			 * before it is connected.
-			 */
-			close(server_fds[0]);
-			close(server_fds[1]);
-			break;
-		}
-		rc = stream_connected(stream, cmsg, server_fds, num_fds);
-		if (rc < 0)
-			stream->config->err_cb(stream->client, stream->id, rc,
-					       stream->config->user_data);
-		break;
-	}
-	case CRAS_CLIENT_AUDIO_DEBUG_INFO_READY:
-		if (client->debug_info_callback)
-			client->debug_info_callback(client);
-		client->debug_info_callback = NULL;
-		break;
-	case CRAS_CLIENT_ATLOG_FD_READY:
-		if (num_fds != 1 || server_fds[0] < 0)
-			return -EINVAL;
-		attach_atlog_shm(client, server_fds[0]);
-		if (client->atlog_access_callback)
-			client->atlog_access_callback(client);
-		client->atlog_access_callback = NULL;
-		break;
-	case CRAS_CLIENT_GET_HOTWORD_MODELS_READY: {
-		struct cras_client_get_hotword_models_ready *cmsg =
-			(struct cras_client_get_hotword_models_ready *)msg;
-		cras_client_get_hotword_models_ready(
-			client, (const char *)cmsg->hotword_models);
-		break;
-	}
-	case CRAS_CLIENT_OUTPUT_VOLUME_CHANGED: {
-		struct cras_client_volume_changed *cmsg =
-			(struct cras_client_volume_changed *)msg;
-		if (client->observer_ops.output_volume_changed)
-			client->observer_ops.output_volume_changed(
-				client->observer_context, cmsg->volume);
-		break;
-	}
-	case CRAS_CLIENT_OUTPUT_MUTE_CHANGED: {
-		struct cras_client_mute_changed *cmsg =
-			(struct cras_client_mute_changed *)msg;
-		if (client->observer_ops.output_mute_changed)
-			client->observer_ops.output_mute_changed(
-				client->observer_context, cmsg->muted,
-				cmsg->user_muted, cmsg->mute_locked);
-		break;
-	}
-	case CRAS_CLIENT_CAPTURE_GAIN_CHANGED: {
-		struct cras_client_volume_changed *cmsg =
-			(struct cras_client_volume_changed *)msg;
-		if (client->observer_ops.capture_gain_changed)
-			client->observer_ops.capture_gain_changed(
-				client->observer_context, cmsg->volume);
-		break;
-	}
-	case CRAS_CLIENT_CAPTURE_MUTE_CHANGED: {
-		struct cras_client_mute_changed *cmsg =
-			(struct cras_client_mute_changed *)msg;
-		if (client->observer_ops.capture_mute_changed)
-			client->observer_ops.capture_mute_changed(
-				client->observer_context, cmsg->muted,
-				cmsg->mute_locked);
-		break;
-	}
-	case CRAS_CLIENT_NODES_CHANGED: {
-		if (client->observer_ops.nodes_changed)
-			client->observer_ops.nodes_changed(
-				client->observer_context);
-		break;
-	}
-	case CRAS_CLIENT_ACTIVE_NODE_CHANGED: {
-		struct cras_client_active_node_changed *cmsg =
-			(struct cras_client_active_node_changed *)msg;
-		enum CRAS_STREAM_DIRECTION direction =
-			(enum CRAS_STREAM_DIRECTION)cmsg->direction;
-		if (client->observer_ops.active_node_changed)
-			client->observer_ops.active_node_changed(
-				client->observer_context, direction,
-				cmsg->node_id);
-		break;
-	}
-	case CRAS_CLIENT_OUTPUT_NODE_VOLUME_CHANGED: {
-		struct cras_client_node_value_changed *cmsg =
-			(struct cras_client_node_value_changed *)msg;
-		if (client->observer_ops.output_node_volume_changed)
-			client->observer_ops.output_node_volume_changed(
-				client->observer_context, cmsg->node_id,
-				cmsg->value);
-		break;
-	}
-	case CRAS_CLIENT_NODE_LEFT_RIGHT_SWAPPED_CHANGED: {
-		struct cras_client_node_value_changed *cmsg =
-			(struct cras_client_node_value_changed *)msg;
-		if (client->observer_ops.node_left_right_swapped_changed)
-			client->observer_ops.node_left_right_swapped_changed(
-				client->observer_context, cmsg->node_id,
-				cmsg->value);
-		break;
-	}
-	case CRAS_CLIENT_INPUT_NODE_GAIN_CHANGED: {
-		struct cras_client_node_value_changed *cmsg =
-			(struct cras_client_node_value_changed *)msg;
-		if (client->observer_ops.input_node_gain_changed)
-			client->observer_ops.input_node_gain_changed(
-				client->observer_context, cmsg->node_id,
-				cmsg->value);
-		break;
-	}
-	case CRAS_CLIENT_NUM_ACTIVE_STREAMS_CHANGED: {
-		struct cras_client_num_active_streams_changed *cmsg =
-			(struct cras_client_num_active_streams_changed *)msg;
-		enum CRAS_STREAM_DIRECTION direction =
-			(enum CRAS_STREAM_DIRECTION)cmsg->direction;
-		if (client->observer_ops.num_active_streams_changed)
-			client->observer_ops.num_active_streams_changed(
-				client->observer_context, direction,
-				cmsg->num_active_streams);
-		break;
-	}
-	default:
-		break;
-	}
-
-	return 0;
-}
-
-/* Handles messages from streams to this client. */
-static int handle_stream_message(struct cras_client *client, int poll_revents)
-{
-	struct stream_msg msg;
-	int rc;
-
-	if ((poll_revents & POLLIN) == 0)
-		return 0;
-
-	rc = read(client->stream_fds[0], &msg, sizeof(msg));
-	if (rc < 0)
-		syslog(LOG_ERR, "cras_client: Stream read failed %d\n", errno);
-	/* The only reason a stream sends a message is if it needs to be
-	 * removed. An error on read would mean the same thing so regardless of
-	 * what gets us here, just remove the stream */
-	client_thread_rm_stream(client, msg.stream_id);
-	return 0;
-}
-
-/* Handles messages from users to this client. */
-static int handle_command_message(struct cras_client *client, int poll_revents)
-{
-	uint8_t buf[MAX_CMD_MSG_LEN];
-	struct command_msg *msg = (struct command_msg *)buf;
-	int rc, to_read;
-
-	if ((poll_revents & POLLIN) == 0)
-		return 0;
-
-	rc = read(client->command_fds[0], buf, sizeof(msg->len));
-	if (rc != sizeof(msg->len) || msg->len > MAX_CMD_MSG_LEN) {
-		rc = -EIO;
-		goto cmd_msg_complete;
-	}
-	to_read = msg->len - rc;
-	rc = read(client->command_fds[0], &buf[0] + rc, to_read);
-	if (rc != to_read) {
-		rc = -EIO;
-		goto cmd_msg_complete;
-	}
-
-	switch (msg->msg_id) {
-	case CLIENT_STOP: {
-		struct client_stream *s;
-
-		/* Stop all playing streams */
-		DL_FOREACH (client->streams, s)
-			client_thread_rm_stream(client, s->id);
-
-		/* And stop this client */
-		client->thread.state = CRAS_THREAD_STOP;
-		rc = 0;
-		break;
-	}
-	case CLIENT_ADD_STREAM: {
-		struct add_stream_command_message *add_msg =
-			(struct add_stream_command_message *)msg;
-		rc = client_thread_add_stream(client, add_msg->stream,
-					      add_msg->stream_id_out,
-					      add_msg->dev_idx);
-		break;
-	}
-	case CLIENT_REMOVE_STREAM:
-		rc = client_thread_rm_stream(client, msg->stream_id);
-		break;
-	case CLIENT_SET_STREAM_VOLUME_SCALER: {
-		struct set_stream_volume_command_message *vol_msg =
-			(struct set_stream_volume_command_message *)msg;
-		rc = client_thread_set_stream_volume(client,
-						     vol_msg->header.stream_id,
-						     vol_msg->volume_scaler);
-		break;
-	}
-	case CLIENT_SERVER_CONNECT:
-		rc = connect_to_server_wait(client, false);
-		break;
-	case CLIENT_SERVER_CONNECT_ASYNC:
-		rc = server_connect(client);
-		break;
-	default:
-		assert(0);
-		break;
-	}
-
-cmd_msg_complete:
-	/* Wake the waiting main thread with the result of the command. */
-	if (write(client->command_reply_fds[1], &rc, sizeof(rc)) != sizeof(rc))
-		return -EIO;
-	return rc;
-}
-
-/*  This thread handles non audio sample communication with the audio server.
- *  The client program will call fucntions below to send messages to this thread
- *  to add or remove streams or change parameters.
- */
-static void *client_thread(void *arg)
-{
-	struct cras_client *client = (struct cras_client *)arg;
-	struct pollfd pollfds[4];
-	int (*cbs[4])(struct cras_client * client, int poll_revents);
-	unsigned int num_pollfds, i;
-	int rc;
-
-	if (arg == NULL)
-		return (void *)-EINVAL;
-
-	while (thread_is_running(&client->thread)) {
-		num_pollfds = 0;
-
-		rc = cras_file_wait_get_fd(client->sock_file_wait);
-		if (rc >= 0) {
-			cbs[num_pollfds] = sock_file_wait_dispatch;
-			pollfds[num_pollfds].fd = rc;
-			pollfds[num_pollfds].events = POLLIN;
-			pollfds[num_pollfds].revents = 0;
-			num_pollfds++;
-		} else
-			syslog(LOG_ERR, "file wait fd: %d", rc);
-		if (client->server_fd >= 0) {
-			cbs[num_pollfds] = server_fd_dispatch;
-			server_fill_pollfd(client, &(pollfds[num_pollfds]));
-			num_pollfds++;
-		}
-		if (client->command_fds[0] >= 0) {
-			cbs[num_pollfds] = handle_command_message;
-			pollfds[num_pollfds].fd = client->command_fds[0];
-			pollfds[num_pollfds].events = POLLIN;
-			pollfds[num_pollfds].revents = 0;
-			num_pollfds++;
-		}
-		if (client->stream_fds[0] >= 0) {
-			cbs[num_pollfds] = handle_stream_message;
-			pollfds[num_pollfds].fd = client->stream_fds[0];
-			pollfds[num_pollfds].events = POLLIN;
-			pollfds[num_pollfds].revents = 0;
-			num_pollfds++;
-		}
-
-		rc = poll(pollfds, num_pollfds, -1);
-		if (rc <= 0)
-			continue;
-
-		for (i = 0; i < num_pollfds; i++) {
-			/* Only do one at a time, since some messages may
-			 * result in change to other fds. */
-			if (pollfds[i].revents) {
-				cbs[i](client, pollfds[i].revents);
-				break;
-			}
-		}
-	}
-
-	/* close the command reply pipe. */
-	close(client->command_reply_fds[1]);
-	client->command_reply_fds[1] = -1;
-
-	return NULL;
-}
-
-/* Sends a message to the client thread to complete an action requested by the
- * user.  Then waits for the action to complete and returns the result. */
-static int send_command_message(struct cras_client *client,
-				struct command_msg *msg)
-{
-	int rc, cmd_res;
-	if (client == NULL || !thread_is_running(&client->thread))
-		return -EINVAL;
-
-	rc = write(client->command_fds[1], msg, msg->len);
-	if (rc != (int)msg->len)
-		return -EPIPE;
-
-	/* Wait for command to complete. */
-	rc = read(client->command_reply_fds[0], &cmd_res, sizeof(cmd_res));
-	if (rc != sizeof(cmd_res))
-		return -EPIPE;
-	return cmd_res;
-}
-
-/* Send a simple message to the client thread that holds no data. */
-static int send_simple_cmd_msg(struct cras_client *client,
-			       cras_stream_id_t stream_id, unsigned msg_id)
-{
-	struct command_msg msg;
-
-	msg.len = sizeof(msg);
-	msg.stream_id = stream_id;
-	msg.msg_id = msg_id;
-
-	return send_command_message(client, &msg);
-}
-
-/* Sends the set volume message to the client thread. */
-static int send_stream_volume_command_msg(struct cras_client *client,
-					  cras_stream_id_t stream_id,
-					  float volume_scaler)
-{
-	struct set_stream_volume_command_message msg;
-
-	msg.header.len = sizeof(msg);
-	msg.header.stream_id = stream_id;
-	msg.header.msg_id = CLIENT_SET_STREAM_VOLUME_SCALER;
-	msg.volume_scaler = volume_scaler;
-
-	return send_command_message(client, &msg.header);
-}
-
-/* Sends a message back to the client and returns the error code. */
-static int write_message_to_server(struct cras_client *client,
-				   const struct cras_server_message *msg)
-{
-	ssize_t write_rc = -EPIPE;
-
-	if (client->server_fd_state == CRAS_SOCKET_STATE_CONNECTED ||
-	    client->server_fd_state == CRAS_SOCKET_STATE_FIRST_MESSAGE) {
-		write_rc = write(client->server_fd, msg, msg->length);
-		if (write_rc < 0)
-			write_rc = -errno;
-	}
-
-	if (write_rc != (ssize_t)msg->length &&
-	    client->server_fd_state != CRAS_SOCKET_STATE_FIRST_MESSAGE)
-		return -EPIPE;
-
-	if (write_rc < 0)
-		return write_rc;
-	else if (write_rc != (ssize_t)msg->length)
-		return -EIO;
-	else
-		return 0;
-}
-
-/* Fills server socket file to connect by client's connection type. */
-static int fill_socket_file(struct cras_client *client,
-			    enum CRAS_CONNECTION_TYPE conn_type)
-{
-	int rc;
-
-	client->sock_file =
-		(const char *)calloc(CRAS_MAX_SOCKET_PATH_SIZE, sizeof(char));
-	if (client->sock_file == NULL)
-		return -ENOMEM;
-
-	rc = cras_fill_socket_path(conn_type, (char *)client->sock_file);
-	if (rc < 0) {
-		free((void *)client->sock_file);
-		return rc;
-	}
-	return 0;
-}
-
-/*
- * Exported Client Interface
- */
-
-int cras_client_create_with_type(struct cras_client **client,
-				 enum CRAS_CONNECTION_TYPE conn_type)
-{
-	int rc;
-	struct client_int *client_int;
-	pthread_condattr_t cond_attr;
-
-	if (!cras_validate_connection_type(conn_type)) {
-		syslog(LOG_ERR, "Input connection type is not supported.\n");
-		return -EINVAL;
-	}
-
-	/* Ignore SIGPIPE while using this API. */
-	signal(SIGPIPE, SIG_IGN);
-
-	client_int = (struct client_int *)calloc(1, sizeof(*client_int));
-	if (!client_int)
-		return -ENOMEM;
-	*client = &client_int->client;
-	(*client)->server_fd = -1;
-	(*client)->id = -1;
-
-	rc = pthread_rwlock_init(&client_int->server_state_rwlock, NULL);
-	if (rc != 0) {
-		syslog(LOG_ERR, "cras_client: Could not init state rwlock.");
-		rc = -rc;
-		goto free_client;
-	}
-
-	rc = pthread_mutex_init(&(*client)->stream_start_lock, NULL);
-	if (rc != 0) {
-		syslog(LOG_ERR, "cras_client: Could not init start lock.");
-		rc = -rc;
-		goto free_rwlock;
-	}
-
-	pthread_condattr_init(&cond_attr);
-	pthread_condattr_setclock(&cond_attr, CLOCK_MONOTONIC);
-	rc = pthread_cond_init(&(*client)->stream_start_cond, &cond_attr);
-	pthread_condattr_destroy(&cond_attr);
-	if (rc != 0) {
-		syslog(LOG_ERR, "cras_client: Could not init start cond.");
-		rc = -rc;
-		goto free_lock;
-	}
-
-	(*client)->server_event_fd = eventfd(0, EFD_CLOEXEC | EFD_NONBLOCK);
-	if ((*client)->server_event_fd < 0) {
-		syslog(LOG_ERR, "cras_client: Could not setup server eventfd.");
-		rc = -errno;
-		goto free_cond;
-	}
-
-	rc = fill_socket_file((*client), conn_type);
-	if (rc < 0) {
-		goto free_server_event_fd;
-	}
-
-	rc = cras_file_wait_create((*client)->sock_file,
-				   CRAS_FILE_WAIT_FLAG_NONE,
-				   sock_file_wait_callback, *client,
-				   &(*client)->sock_file_wait);
-	if (rc < 0 && rc != -ENOENT) {
-		syslog(LOG_ERR,
-		       "cras_client: Could not setup watch for '%s': %s",
-		       (*client)->sock_file, strerror(-rc));
-		goto free_error;
-	}
-	(*client)->sock_file_exists = (rc == 0);
-
-	/* Pipes used by the main thread and the client thread to send commands
-	 * and replies. */
-	rc = pipe((*client)->command_fds);
-	if (rc < 0)
-		goto free_error;
-	/* Pipe used to communicate between the client thread and the audio
-	 * thread. */
-	rc = pipe((*client)->stream_fds);
-	if (rc < 0) {
-		close((*client)->command_fds[0]);
-		close((*client)->command_fds[1]);
-		goto free_error;
-	}
-	(*client)->command_reply_fds[0] = -1;
-	(*client)->command_reply_fds[1] = -1;
-
-	return 0;
-free_error:
-	cras_file_wait_destroy((*client)->sock_file_wait);
-	free((void *)(*client)->sock_file);
-free_server_event_fd:
-	if ((*client)->server_event_fd >= 0)
-		close((*client)->server_event_fd);
-free_cond:
-	pthread_cond_destroy(&(*client)->stream_start_cond);
-free_lock:
-	pthread_mutex_destroy(&(*client)->stream_start_lock);
-free_rwlock:
-	pthread_rwlock_destroy(&client_int->server_state_rwlock);
-free_client:
-	*client = NULL;
-	free(client_int);
-	return rc;
-}
-
-int cras_client_create(struct cras_client **client)
-{
-	return cras_client_create_with_type(client, CRAS_CONTROL);
-}
-
-void cras_client_destroy(struct cras_client *client)
-{
-	struct client_int *client_int;
-	if (client == NULL)
-		return;
-	client_int = to_client_int(client);
-	client->server_connection_cb = NULL;
-	cras_client_stop(client);
-	server_disconnect(client);
-	close(client->server_event_fd);
-	close(client->command_fds[0]);
-	close(client->command_fds[1]);
-	close(client->stream_fds[0]);
-	close(client->stream_fds[1]);
-	cras_file_wait_destroy(client->sock_file_wait);
-	pthread_rwlock_destroy(&client_int->server_state_rwlock);
-	free((void *)client->sock_file);
-	free(client_int);
-}
-
-int cras_client_connect(struct cras_client *client)
-{
-	return connect_to_server(client, NULL, true);
-}
-
-int cras_client_connect_timeout(struct cras_client *client,
-				unsigned int timeout_ms)
-{
-	return connect_to_server_wait_retry(client, timeout_ms, true);
-}
-
-int cras_client_connected_wait(struct cras_client *client)
-{
-	return send_simple_cmd_msg(client, 0, CLIENT_SERVER_CONNECT);
-}
-
-int cras_client_connect_async(struct cras_client *client)
-{
-	return send_simple_cmd_msg(client, 0, CLIENT_SERVER_CONNECT_ASYNC);
-}
-
-struct cras_stream_params *cras_client_stream_params_create(
-	enum CRAS_STREAM_DIRECTION direction, size_t buffer_frames,
-	size_t cb_threshold, size_t unused, enum CRAS_STREAM_TYPE stream_type,
-	uint32_t flags, void *user_data, cras_playback_cb_t aud_cb,
-	cras_error_cb_t err_cb, struct cras_audio_format *format)
-{
-	struct cras_stream_params *params;
-
-	params = (struct cras_stream_params *)malloc(sizeof(*params));
-	if (params == NULL)
-		return NULL;
-
-	params->direction = direction;
-	params->buffer_frames = buffer_frames;
-	params->cb_threshold = cb_threshold;
-	params->effects = 0;
-	params->stream_type = stream_type;
-	params->client_type = CRAS_CLIENT_TYPE_UNKNOWN;
-	params->flags = flags;
-	params->user_data = user_data;
-	params->aud_cb = aud_cb;
-	params->unified_cb = 0;
-	params->stream_cb = 0;
-	params->err_cb = err_cb;
-	memcpy(&(params->format), format, sizeof(*format));
-	return params;
-}
-
-void cras_client_stream_params_set_client_type(
-	struct cras_stream_params *params, enum CRAS_CLIENT_TYPE client_type)
-{
-	params->client_type = client_type;
-}
-
-void cras_client_stream_params_enable_aec(struct cras_stream_params *params)
-{
-	params->effects |= APM_ECHO_CANCELLATION;
-}
-
-void cras_client_stream_params_disable_aec(struct cras_stream_params *params)
-{
-	params->effects &= ~APM_ECHO_CANCELLATION;
-}
-
-void cras_client_stream_params_enable_ns(struct cras_stream_params *params)
-{
-	params->effects |= APM_NOISE_SUPRESSION;
-}
-
-void cras_client_stream_params_disable_ns(struct cras_stream_params *params)
-{
-	params->effects &= ~APM_NOISE_SUPRESSION;
-}
-
-void cras_client_stream_params_enable_agc(struct cras_stream_params *params)
-{
-	params->effects |= APM_GAIN_CONTROL;
-}
-
-void cras_client_stream_params_disable_agc(struct cras_stream_params *params)
-{
-	params->effects &= ~APM_GAIN_CONTROL;
-}
-
-void cras_client_stream_params_enable_vad(struct cras_stream_params *params)
-{
-	params->effects |= APM_VOICE_DETECTION;
-}
-
-void cras_client_stream_params_disable_vad(struct cras_stream_params *params)
-{
-	params->effects &= ~APM_VOICE_DETECTION;
-}
-
-struct cras_stream_params *cras_client_unified_params_create(
-	enum CRAS_STREAM_DIRECTION direction, unsigned int block_size,
-	enum CRAS_STREAM_TYPE stream_type, uint32_t flags, void *user_data,
-	cras_unified_cb_t unified_cb, cras_error_cb_t err_cb,
-	struct cras_audio_format *format)
-{
-	struct cras_stream_params *params;
-
-	params = (struct cras_stream_params *)malloc(sizeof(*params));
-	if (params == NULL)
-		return NULL;
-
-	params->direction = direction;
-	params->buffer_frames = block_size * 2;
-	params->cb_threshold = block_size;
-	params->stream_type = stream_type;
-	params->client_type = CRAS_CLIENT_TYPE_UNKNOWN;
-	params->flags = flags;
-	params->effects = 0;
-	params->user_data = user_data;
-	params->aud_cb = 0;
-	params->unified_cb = unified_cb;
-	params->stream_cb = 0;
-	params->err_cb = err_cb;
-	memcpy(&(params->format), format, sizeof(*format));
-
-	return params;
-}
-
-void cras_client_stream_params_destroy(struct cras_stream_params *params)
-{
-	free(params);
-}
-
-static inline int cras_client_send_add_stream_command_message(
-	struct cras_client *client, uint32_t dev_idx,
-	cras_stream_id_t *stream_id_out, struct cras_stream_params *config)
-{
-	struct add_stream_command_message cmd_msg;
-	struct client_stream *stream;
-	int rc = 0;
-
-	if (client == NULL || config == NULL || stream_id_out == NULL)
-		return -EINVAL;
-
-	if (config->stream_cb == NULL && config->aud_cb == NULL &&
-	    config->unified_cb == NULL)
-		return -EINVAL;
-
-	if (config->err_cb == NULL)
-		return -EINVAL;
-
-	stream = (struct client_stream *)calloc(1, sizeof(*stream));
-	if (stream == NULL) {
-		rc = -ENOMEM;
-		goto add_failed;
-	}
-	stream->config =
-		(struct cras_stream_params *)malloc(sizeof(*(stream->config)));
-	if (stream->config == NULL) {
-		rc = -ENOMEM;
-		goto add_failed;
-	}
-	memcpy(stream->config, config, sizeof(*config));
-	stream->aud_fd = -1;
-	stream->wake_fds[0] = -1;
-	stream->wake_fds[1] = -1;
-	stream->direction = config->direction;
-	stream->flags = config->flags;
-
-	/* Caller might not set this volume scaler after stream created,
-	 * so always initialize it to 1.0f */
-	stream->volume_scaler = 1.0f;
-
-	cmd_msg.header.len = sizeof(cmd_msg);
-	cmd_msg.header.msg_id = CLIENT_ADD_STREAM;
-	cmd_msg.header.stream_id = stream->id;
-	cmd_msg.stream = stream;
-	cmd_msg.stream_id_out = stream_id_out;
-	cmd_msg.dev_idx = dev_idx;
-	rc = send_command_message(client, &cmd_msg.header);
-	if (rc < 0) {
-		syslog(LOG_ERR,
-		       "cras_client: adding stream failed in thread %d", rc);
-		goto add_failed;
-	}
-
-	return 0;
-
-add_failed:
-	if (stream) {
-		if (stream->config)
-			free(stream->config);
-		free(stream);
-	}
-	return rc;
-}
-
-int cras_client_add_stream(struct cras_client *client,
-			   cras_stream_id_t *stream_id_out,
-			   struct cras_stream_params *config)
-{
-	return cras_client_send_add_stream_command_message(
-		client, NO_DEVICE, stream_id_out, config);
-}
-
-int cras_client_add_pinned_stream(struct cras_client *client, uint32_t dev_idx,
-				  cras_stream_id_t *stream_id_out,
-				  struct cras_stream_params *config)
-{
-	return cras_client_send_add_stream_command_message(
-		client, dev_idx, stream_id_out, config);
-}
-
-int cras_client_rm_stream(struct cras_client *client,
-			  cras_stream_id_t stream_id)
-{
-	if (client == NULL)
-		return -EINVAL;
-
-	return send_simple_cmd_msg(client, stream_id, CLIENT_REMOVE_STREAM);
-}
-
-int cras_client_set_stream_volume(struct cras_client *client,
-				  cras_stream_id_t stream_id,
-				  float volume_scaler)
-{
-	if (client == NULL)
-		return -EINVAL;
-
-	return send_stream_volume_command_msg(client, stream_id, volume_scaler);
-}
-
-int cras_client_set_system_volume(struct cras_client *client, size_t volume)
-{
-	struct cras_set_system_volume msg;
-
-	if (client == NULL)
-		return -EINVAL;
-
-	cras_fill_set_system_volume(&msg, volume);
-	return write_message_to_server(client, &msg.header);
-}
-
-int cras_client_set_system_mute(struct cras_client *client, int mute)
-{
-	struct cras_set_system_mute msg;
-
-	if (client == NULL)
-		return -EINVAL;
-
-	cras_fill_set_system_mute(&msg, mute);
-	return write_message_to_server(client, &msg.header);
-}
-
-int cras_client_set_user_mute(struct cras_client *client, int mute)
-{
-	struct cras_set_system_mute msg;
-
-	if (client == NULL)
-		return -EINVAL;
-
-	cras_fill_set_user_mute(&msg, mute);
-	return write_message_to_server(client, &msg.header);
-}
-
-int cras_client_set_system_mute_locked(struct cras_client *client, int locked)
-{
-	struct cras_set_system_mute msg;
-
-	if (client == NULL)
-		return -EINVAL;
-
-	cras_fill_set_system_mute_locked(&msg, locked);
-	return write_message_to_server(client, &msg.header);
-}
-
-int cras_client_set_system_capture_mute(struct cras_client *client, int mute)
-{
-	struct cras_set_system_mute msg;
-
-	if (client == NULL)
-		return -EINVAL;
-
-	cras_fill_set_system_capture_mute(&msg, mute);
-	return write_message_to_server(client, &msg.header);
-}
-
-int cras_client_set_system_capture_mute_locked(struct cras_client *client,
-					       int locked)
-{
-	struct cras_set_system_mute msg;
-
-	if (client == NULL)
-		return -EINVAL;
-
-	cras_fill_set_system_capture_mute_locked(&msg, locked);
-	return write_message_to_server(client, &msg.header);
-}
-
-size_t cras_client_get_system_volume(const struct cras_client *client)
-{
-	size_t volume;
-	int lock_rc;
-
-	lock_rc = server_state_rdlock(client);
-	if (lock_rc)
-		return 0;
-
-	volume = client->server_state->volume;
-	server_state_unlock(client, lock_rc);
-	return volume;
-}
-
-long cras_client_get_system_capture_gain(const struct cras_client *client)
-{
-	long gain;
-	int lock_rc;
-
-	lock_rc = server_state_rdlock(client);
-	if (lock_rc)
-		return 0;
-
-	gain = client->server_state->capture_gain;
-	server_state_unlock(client, lock_rc);
-	return gain;
-}
-
-int cras_client_get_system_muted(const struct cras_client *client)
-{
-	int muted;
-	int lock_rc;
-
-	lock_rc = server_state_rdlock(client);
-	if (lock_rc)
-		return 0;
-
-	muted = client->server_state->mute;
-	server_state_unlock(client, lock_rc);
-	return muted;
-}
-
-int cras_client_get_user_muted(const struct cras_client *client)
-{
-	int muted;
-	int lock_rc;
-
-	lock_rc = server_state_rdlock(client);
-	if (lock_rc)
-		return 0;
-
-	muted = client->server_state->user_mute;
-	server_state_unlock(client, lock_rc);
-	return muted;
-}
-
-int cras_client_get_system_capture_muted(const struct cras_client *client)
-{
-	int muted;
-	int lock_rc;
-
-	lock_rc = server_state_rdlock(client);
-	if (lock_rc)
-		return 0;
-
-	muted = client->server_state->capture_mute;
-	server_state_unlock(client, lock_rc);
-	return muted;
-}
-
-long cras_client_get_system_min_volume(const struct cras_client *client)
-{
-	long min_volume;
-	int lock_rc;
-
-	lock_rc = server_state_rdlock(client);
-	if (lock_rc)
-		return 0;
-
-	min_volume = client->server_state->min_volume_dBFS;
-	server_state_unlock(client, lock_rc);
-	return min_volume;
-}
-
-long cras_client_get_system_max_volume(const struct cras_client *client)
-{
-	long max_volume;
-	int lock_rc;
-
-	lock_rc = server_state_rdlock(client);
-	if (lock_rc)
-		return 0;
-
-	max_volume = client->server_state->max_volume_dBFS;
-	server_state_unlock(client, lock_rc);
-	return max_volume;
-}
-
-int cras_client_get_default_output_buffer_size(struct cras_client *client)
-{
-	int default_output_buffer_size;
-	int lock_rc;
-
-	lock_rc = server_state_rdlock(client);
-	if (lock_rc)
-		return -EINVAL;
-
-	default_output_buffer_size =
-		client->server_state->default_output_buffer_size;
-	server_state_unlock(client, lock_rc);
-	return default_output_buffer_size;
-}
-
-const struct audio_debug_info *
-cras_client_get_audio_debug_info(const struct cras_client *client)
-{
-	const struct audio_debug_info *debug_info;
-	int lock_rc;
-
-	lock_rc = server_state_rdlock(client);
-	if (lock_rc)
-		return 0;
-
-	debug_info = &client->server_state->audio_debug_info;
-	server_state_unlock(client, lock_rc);
-	return debug_info;
-}
-
-const struct main_thread_debug_info *
-cras_client_get_main_thread_debug_info(const struct cras_client *client)
-{
-	const struct main_thread_debug_info *debug_info;
-	int lock_rc;
-
-	lock_rc = server_state_rdlock(client);
-	if (lock_rc)
-		return 0;
-
-	debug_info = &client->server_state->main_thread_debug_info;
-	server_state_unlock(client, lock_rc);
-	return debug_info;
-}
-
-const struct cras_bt_debug_info *
-cras_client_get_bt_debug_info(const struct cras_client *client)
-{
-	const struct cras_bt_debug_info *debug_info;
-	int lock_rc;
-
-	lock_rc = server_state_rdlock(client);
-	if (lock_rc)
-		return 0;
-
-	debug_info = &client->server_state->bt_debug_info;
-	server_state_unlock(client, lock_rc);
-	return debug_info;
-}
-
-const struct cras_audio_thread_snapshot_buffer *
-cras_client_get_audio_thread_snapshot_buffer(const struct cras_client *client)
-{
-	const struct cras_audio_thread_snapshot_buffer *snapshot_buffer;
-	int lock_rc;
-
-	lock_rc = server_state_rdlock(client);
-	if (lock_rc)
-		return 0;
-
-	snapshot_buffer = &client->server_state->snapshot_buffer;
-	server_state_unlock(client, lock_rc);
-	return snapshot_buffer;
-}
-
-unsigned cras_client_get_num_active_streams(const struct cras_client *client,
-					    struct timespec *ts)
-{
-	unsigned num_streams, version, i;
-	int lock_rc;
-
-	lock_rc = server_state_rdlock(client);
-	if (lock_rc)
-		return 0;
-
-read_active_streams_again:
-	version = begin_server_state_read(client->server_state);
-	num_streams = 0;
-	for (i = 0; i < CRAS_NUM_DIRECTIONS; i++)
-		num_streams += client->server_state->num_active_streams[i];
-	if (ts) {
-		if (num_streams)
-			clock_gettime(CLOCK_MONOTONIC_RAW, ts);
-		else
-			cras_timespec_to_timespec(
-				ts,
-				&client->server_state->last_active_stream_time);
-	}
-	if (end_server_state_read(client->server_state, version))
-		goto read_active_streams_again;
-
-	server_state_unlock(client, lock_rc);
-	return num_streams;
-}
-
-int cras_client_run_thread(struct cras_client *client)
-{
-	int rc;
-
-	if (client == NULL)
-		return -EINVAL;
-	if (thread_is_running(&client->thread))
-		return 0;
-
-	assert(client->command_reply_fds[0] == -1 &&
-	       client->command_reply_fds[1] == -1);
-
-	if (pipe(client->command_reply_fds) < 0)
-		return -EIO;
-	client->thread.state = CRAS_THREAD_RUNNING;
-	rc = pthread_create(&client->thread.tid, NULL, client_thread, client);
-	if (rc) {
-		client->thread.state = CRAS_THREAD_STOP;
-		return -rc;
-	}
-
-	return 0;
-}
-
-int cras_client_stop(struct cras_client *client)
-{
-	if (client == NULL)
-		return -EINVAL;
-	if (!thread_is_running(&client->thread))
-		return 0;
-
-	send_simple_cmd_msg(client, 0, CLIENT_STOP);
-	pthread_join(client->thread.tid, NULL);
-
-	/* The other end of the reply pipe is closed by the client thread, just
-	 * clost the read end here. */
-	close(client->command_reply_fds[0]);
-	client->command_reply_fds[0] = -1;
-
-	return 0;
-}
-
-void cras_client_set_connection_status_cb(
-	struct cras_client *client, cras_connection_status_cb_t connection_cb,
-	void *user_arg)
-{
-	client->server_connection_cb = connection_cb;
-	client->server_connection_user_arg = user_arg;
-}
-
-void cras_client_set_thread_priority_cb(struct cras_client *client,
-					cras_thread_priority_cb_t cb)
-{
-	client->thread_priority_cb = cb;
-}
-
-int cras_client_get_output_devices(const struct cras_client *client,
-				   struct cras_iodev_info *devs,
-				   struct cras_ionode_info *nodes,
-				   size_t *num_devs, size_t *num_nodes)
-{
-	const struct cras_server_state *state;
-	unsigned avail_devs, avail_nodes, version;
-	int lock_rc;
-
-	lock_rc = server_state_rdlock(client);
-	if (lock_rc)
-		return -EINVAL;
-	state = client->server_state;
-
-read_outputs_again:
-	version = begin_server_state_read(state);
-	avail_devs = MIN(*num_devs, state->num_output_devs);
-	memcpy(devs, state->output_devs, avail_devs * sizeof(*devs));
-	avail_nodes = MIN(*num_nodes, state->num_output_nodes);
-	memcpy(nodes, state->output_nodes, avail_nodes * sizeof(*nodes));
-	if (end_server_state_read(state, version))
-		goto read_outputs_again;
-	server_state_unlock(client, lock_rc);
-
-	*num_devs = avail_devs;
-	*num_nodes = avail_nodes;
-
-	return 0;
-}
-
-int cras_client_get_input_devices(const struct cras_client *client,
-				  struct cras_iodev_info *devs,
-				  struct cras_ionode_info *nodes,
-				  size_t *num_devs, size_t *num_nodes)
-{
-	const struct cras_server_state *state;
-	unsigned avail_devs, avail_nodes, version;
-	int lock_rc;
-
-	lock_rc = server_state_rdlock(client);
-	if (!client)
-		return -EINVAL;
-	state = client->server_state;
-
-read_inputs_again:
-	version = begin_server_state_read(state);
-	avail_devs = MIN(*num_devs, state->num_input_devs);
-	memcpy(devs, state->input_devs, avail_devs * sizeof(*devs));
-	avail_nodes = MIN(*num_nodes, state->num_input_nodes);
-	memcpy(nodes, state->input_nodes, avail_nodes * sizeof(*nodes));
-	if (end_server_state_read(state, version))
-		goto read_inputs_again;
-	server_state_unlock(client, lock_rc);
-
-	*num_devs = avail_devs;
-	*num_nodes = avail_nodes;
-
-	return 0;
-}
-
-int cras_client_get_attached_clients(const struct cras_client *client,
-				     struct cras_attached_client_info *clients,
-				     size_t max_clients)
-{
-	const struct cras_server_state *state;
-	unsigned num, version;
-	int lock_rc;
-
-	lock_rc = server_state_rdlock(client);
-	if (lock_rc)
-		return -EINVAL;
-	state = client->server_state;
-
-read_clients_again:
-	version = begin_server_state_read(state);
-	num = MIN(max_clients, state->num_attached_clients);
-	memcpy(clients, state->client_info, num * sizeof(*clients));
-	if (end_server_state_read(state, version))
-		goto read_clients_again;
-	server_state_unlock(client, lock_rc);
-
-	return num;
-}
-
-/* Find an output ionode on an iodev with the matching name.
- *
- * Args:
- *    dev_name - The prefix of the iodev name.
- *    node_name - The prefix of the ionode name.
- *    dev_info - The information about the iodev will be returned here.
- *    node_info - The information about the ionode will be returned here.
- * Returns:
- *    0 if successful, -1 if the node cannot be found.
- */
-static int cras_client_find_output_node(const struct cras_client *client,
-					const char *dev_name,
-					const char *node_name,
-					struct cras_iodev_info *dev_info,
-					struct cras_ionode_info *node_info)
-{
-	size_t ndevs, nnodes;
-	struct cras_iodev_info *devs = NULL;
-	struct cras_ionode_info *nodes = NULL;
-	int rc = -1;
-	unsigned i, j;
-
-	if (!client || !dev_name || !node_name)
-		goto quit;
-
-	devs = (struct cras_iodev_info *)malloc(CRAS_MAX_IODEVS *
-						sizeof(*devs));
-	if (!devs)
-		goto quit;
-
-	nodes = (struct cras_ionode_info *)malloc(CRAS_MAX_IONODES *
-						  sizeof(*nodes));
-	if (!nodes)
-		goto quit;
-
-	ndevs = CRAS_MAX_IODEVS;
-	nnodes = CRAS_MAX_IONODES;
-	rc = cras_client_get_output_devices(client, devs, nodes, &ndevs,
-					    &nnodes);
-	if (rc < 0)
-		goto quit;
-
-	for (i = 0; i < ndevs; i++)
-		if (!strncmp(dev_name, devs[i].name, strlen(dev_name)))
-			goto found_dev;
-	rc = -1;
-	goto quit;
-
-found_dev:
-	for (j = 0; j < nnodes; j++)
-		if (nodes[j].iodev_idx == devs[i].idx &&
-		    !strncmp(node_name, nodes[j].name, strlen(node_name)))
-			goto found_node;
-	rc = -1;
-	goto quit;
-
-found_node:
-	*dev_info = devs[i];
-	*node_info = nodes[j];
-	rc = 0;
-
-quit:
-	free(devs);
-	free(nodes);
-	return rc;
-}
-
-int cras_client_get_node_by_id(const struct cras_client *client, int input,
-			       const cras_node_id_t node_id,
-			       struct cras_ionode_info *node_info)
-{
-	size_t ndevs, nnodes;
-	struct cras_iodev_info *devs = NULL;
-	struct cras_ionode_info *nodes = NULL;
-	int rc = -EINVAL;
-	unsigned i;
-
-	if (!client || !node_info) {
-		rc = -EINVAL;
-		goto quit;
-	}
-
-	devs = (struct cras_iodev_info *)malloc(CRAS_MAX_IODEVS *
-						sizeof(*devs));
-	if (!devs) {
-		rc = -ENOMEM;
-		goto quit;
-	}
-
-	nodes = (struct cras_ionode_info *)malloc(CRAS_MAX_IONODES *
-						  sizeof(*nodes));
-	if (!nodes) {
-		rc = -ENOMEM;
-		goto quit;
-	}
-
-	ndevs = CRAS_MAX_IODEVS;
-	nnodes = CRAS_MAX_IONODES;
-	if (input)
-		rc = cras_client_get_input_devices(client, devs, nodes, &ndevs,
-						   &nnodes);
-	else
-		rc = cras_client_get_output_devices(client, devs, nodes, &ndevs,
-						    &nnodes);
-	if (rc < 0)
-		goto quit;
-
-	rc = -ENOENT;
-	for (i = 0; i < nnodes; i++) {
-		if (node_id == cras_make_node_id(nodes[i].iodev_idx,
-						 nodes[i].ionode_idx)) {
-			memcpy(node_info, &nodes[i], sizeof(*node_info));
-			rc = 0;
-			break;
-		}
-	}
-
-quit:
-	free(devs);
-	free(nodes);
-	return rc;
-}
-
-int cras_client_output_dev_plugged(const struct cras_client *client,
-				   const char *name)
-{
-	struct cras_iodev_info dev_info;
-	struct cras_ionode_info node_info = { 0 };
-
-	if (cras_client_find_output_node(client, name, "Front Headphone Jack",
-					 &dev_info, &node_info) < 0)
-		return 0;
-
-	return node_info.plugged;
-}
-
-int cras_client_set_node_attr(struct cras_client *client,
-			      cras_node_id_t node_id, enum ionode_attr attr,
-			      int value)
-{
-	struct cras_set_node_attr msg;
-
-	if (client == NULL)
-		return -EINVAL;
-
-	cras_fill_set_node_attr(&msg, node_id, attr, value);
-	return write_message_to_server(client, &msg.header);
-}
-
-int cras_client_select_node(struct cras_client *client,
-			    enum CRAS_STREAM_DIRECTION direction,
-			    cras_node_id_t node_id)
-{
-	struct cras_select_node msg;
-
-	if (client == NULL)
-		return -EINVAL;
-
-	cras_fill_select_node(&msg, direction, node_id);
-	return write_message_to_server(client, &msg.header);
-}
-
-int cras_client_add_active_node(struct cras_client *client,
-				enum CRAS_STREAM_DIRECTION direction,
-				cras_node_id_t node_id)
-{
-	struct cras_add_active_node msg;
-
-	if (client == NULL)
-		return -EINVAL;
-
-	cras_fill_add_active_node(&msg, direction, node_id);
-	return write_message_to_server(client, &msg.header);
-}
-
-int cras_client_rm_active_node(struct cras_client *client,
-			       enum CRAS_STREAM_DIRECTION direction,
-			       cras_node_id_t node_id)
-{
-	struct cras_rm_active_node msg;
-
-	if (client == NULL)
-		return -EINVAL;
-
-	cras_fill_rm_active_node(&msg, direction, node_id);
-	return write_message_to_server(client, &msg.header);
-}
-
-int cras_client_format_bytes_per_frame(struct cras_audio_format *fmt)
-{
-	if (fmt == NULL)
-		return -EINVAL;
-
-	return cras_get_format_bytes(fmt);
-}
-
-int cras_client_calc_playback_latency(const struct timespec *sample_time,
-				      struct timespec *delay)
-{
-	struct timespec now;
-
-	if (delay == NULL)
-		return -EINVAL;
-
-	clock_gettime(CLOCK_MONOTONIC_RAW, &now);
-
-	/* for output return time until sample is played (t - now) */
-	subtract_timespecs(sample_time, &now, delay);
-	return 0;
-}
-
-int cras_client_calc_capture_latency(const struct timespec *sample_time,
-				     struct timespec *delay)
-{
-	struct timespec now;
-
-	if (delay == NULL)
-		return -EINVAL;
-
-	clock_gettime(CLOCK_MONOTONIC_RAW, &now);
-
-	/* For input want time since sample read (now - t) */
-	subtract_timespecs(&now, sample_time, delay);
-	return 0;
-}
-
-int cras_client_reload_dsp(struct cras_client *client)
-{
-	struct cras_reload_dsp msg;
-
-	if (client == NULL)
-		return -EINVAL;
-
-	cras_fill_reload_dsp(&msg);
-	return write_message_to_server(client, &msg.header);
-}
-
-int cras_client_dump_dsp_info(struct cras_client *client)
-{
-	struct cras_dump_dsp_info msg;
-
-	if (client == NULL)
-		return -EINVAL;
-
-	cras_fill_dump_dsp_info(&msg);
-	return write_message_to_server(client, &msg.header);
-}
-
-int cras_client_update_audio_debug_info(
-	struct cras_client *client, void (*debug_info_cb)(struct cras_client *))
-{
-	struct cras_dump_audio_thread msg;
-
-	if (client == NULL)
-		return -EINVAL;
-
-	if (client->debug_info_callback != NULL)
-		return -EINVAL;
-	client->debug_info_callback = debug_info_cb;
-
-	cras_fill_dump_audio_thread(&msg);
-	return write_message_to_server(client, &msg.header);
-}
-
-int cras_client_get_atlog_access(struct cras_client *client,
-				 void (*atlog_access_cb)(struct cras_client *))
-{
-	struct cras_get_atlog_fd msg;
-
-	if (client == NULL)
-		return -EINVAL;
-
-	if (client->atlog_access_callback != NULL)
-		return -EINVAL;
-	client->atlog_access_callback = atlog_access_cb;
-
-	cras_fill_get_atlog_fd(&msg);
-	return write_message_to_server(client, &msg.header);
-}
-
-int cras_client_read_atlog(struct cras_client *client, uint64_t *read_idx,
-			   uint64_t *missing,
-			   struct audio_thread_event_log *buf)
-{
-	struct audio_thread_event_log log;
-	uint64_t i, sync_write_pos, len = 0;
-	struct timespec timestamp, last_timestamp;
-
-	if (!client->atlog_ro)
-		return -EINVAL;
-
-	sync_write_pos = client->atlog_ro->sync_write_pos;
-	__sync_synchronize();
-	memcpy(&log, client->atlog_ro, sizeof(log));
-
-	if (sync_write_pos <= *read_idx)
-		return 0;
-
-	*missing = 0;
-	for (i = sync_write_pos - 1; i >= *read_idx; --i) {
-		uint64_t pos = i % log.len;
-		timestamp.tv_sec = log.log[pos].tag_sec & 0x00ffffff;
-		timestamp.tv_nsec = log.log[pos].nsec;
-
-		if (i != sync_write_pos - 1 &&
-		    timespec_after(&timestamp, &last_timestamp)) {
-			if (*read_idx)
-				*missing = i - *read_idx + 1;
-			*read_idx = i + 1;
-			break;
-		}
-		last_timestamp = timestamp;
-
-		if (!i)
-			break;
-	}
-
-	/* Copies the continuous part of log. */
-	if ((sync_write_pos - 1) % log.len < *read_idx % log.len) {
-		len = log.len - *read_idx % log.len;
-		memcpy(buf->log, &log.log[*read_idx % log.len],
-		       sizeof(struct audio_thread_event) * len);
-		memcpy(&buf->log[len], log.log,
-		       sizeof(struct audio_thread_event) *
-			       ((sync_write_pos - 1) % log.len + 1));
-		len = sync_write_pos - *read_idx;
-	} else {
-		len = sync_write_pos - *read_idx;
-		memcpy(buf->log, &log.log[*read_idx % log.len],
-		       sizeof(struct audio_thread_event) * len);
-	}
-
-	*read_idx = sync_write_pos;
-	return len;
-}
-
-int cras_client_update_main_thread_debug_info(
-	struct cras_client *client, void (*debug_info_cb)(struct cras_client *))
-{
-	struct cras_dump_main msg;
-
-	if (client == NULL)
-		return -EINVAL;
-	if (client->debug_info_callback != NULL)
-		return -EINVAL;
-	client->debug_info_callback = debug_info_cb;
-	cras_fill_dump_main(&msg);
-	return write_message_to_server(client, &msg.header);
-}
-
-int cras_client_update_bt_debug_info(
-	struct cras_client *client, void (*debug_info_cb)(struct cras_client *))
-{
-	struct cras_dump_bt msg;
-
-	if (client == NULL)
-		return -EINVAL;
-
-	if (client->debug_info_callback != NULL)
-		return -EINVAL;
-	client->debug_info_callback = debug_info_cb;
-
-	cras_fill_dump_bt(&msg);
-	return write_message_to_server(client, &msg.header);
-}
-
-int cras_client_update_audio_thread_snapshots(
-	struct cras_client *client, void (*debug_info_cb)(struct cras_client *))
-{
-	struct cras_dump_snapshots msg;
-
-	if (client == NULL)
-		return -EINVAL;
-
-	if (client->debug_info_callback != NULL)
-		return -EINVAL;
-	client->debug_info_callback = debug_info_cb;
-
-	cras_fill_dump_snapshots(&msg);
-	return write_message_to_server(client, &msg.header);
-}
-
-int cras_client_get_max_supported_channels(const struct cras_client *client,
-					   cras_node_id_t node_id,
-					   uint32_t *max_channels)
-{
-	size_t ndevs, nnodes;
-	struct cras_iodev_info *devs = NULL;
-	struct cras_ionode_info *nodes = NULL;
-	int rc = -EINVAL;
-	unsigned i;
-
-	if (!client) {
-		rc = -EINVAL;
-		goto quit;
-	}
-
-	devs = (struct cras_iodev_info *)malloc(CRAS_MAX_IODEVS *
-						sizeof(*devs));
-	if (!devs) {
-		rc = -ENOMEM;
-		goto quit;
-	}
-
-	nodes = (struct cras_ionode_info *)malloc(CRAS_MAX_IONODES *
-						  sizeof(*nodes));
-	if (!nodes) {
-		rc = -ENOMEM;
-		goto quit;
-	}
-
-	ndevs = CRAS_MAX_IODEVS;
-	nnodes = CRAS_MAX_IONODES;
-	rc = cras_client_get_output_devices(client, devs, nodes, &ndevs,
-					    &nnodes);
-	if (rc < 0)
-		goto quit;
-
-	rc = -ENOENT;
-	uint32_t iodev_idx;
-	for (i = 0; i < nnodes; i++) {
-		if (node_id == cras_make_node_id(nodes[i].iodev_idx,
-						 nodes[i].ionode_idx)) {
-			iodev_idx = nodes[i].iodev_idx;
-			rc = 0;
-			break;
-		}
-	}
-
-	if (rc < 0)
-		goto quit;
-
-	rc = -ENOENT;
-	for (i = 0; i < ndevs; i++) {
-		if (iodev_idx == devs[i].idx) {
-			*max_channels = devs[i].max_supported_channels;
-			rc = 0;
-			break;
-		}
-	}
-
-quit:
-	free(devs);
-	free(nodes);
-	return rc;
-}
-
-int cras_client_set_node_volume(struct cras_client *client,
-				cras_node_id_t node_id, uint8_t volume)
-{
-	struct cras_set_node_attr msg;
-
-	if (client == NULL)
-		return -EINVAL;
-
-	cras_fill_set_node_attr(&msg, node_id, IONODE_ATTR_VOLUME, volume);
-	return write_message_to_server(client, &msg.header);
-}
-
-int cras_client_swap_node_left_right(struct cras_client *client,
-				     cras_node_id_t node_id, int enable)
-{
-	struct cras_set_node_attr msg;
-
-	if (client == NULL)
-		return -EINVAL;
-
-	cras_fill_set_node_attr(&msg, node_id, IONODE_ATTR_SWAP_LEFT_RIGHT,
-				enable);
-	return write_message_to_server(client, &msg.header);
-}
-
-int cras_client_set_node_capture_gain(struct cras_client *client,
-				      cras_node_id_t node_id, long gain)
-{
-	struct cras_set_node_attr msg;
-
-	if (client == NULL)
-		return -EINVAL;
-	if (gain > INT_MAX || gain < INT_MIN)
-		return -EINVAL;
-
-	cras_fill_set_node_attr(&msg, node_id, IONODE_ATTR_CAPTURE_GAIN, gain);
-	return write_message_to_server(client, &msg.header);
-}
-
-int cras_client_add_test_iodev(struct cras_client *client,
-			       enum TEST_IODEV_TYPE type)
-{
-	struct cras_add_test_dev msg;
-
-	cras_fill_add_test_dev(&msg, type);
-	return write_message_to_server(client, &msg.header);
-}
-
-int cras_client_test_iodev_command(struct cras_client *client,
-				   unsigned int iodev_idx,
-				   enum CRAS_TEST_IODEV_CMD command,
-				   unsigned int data_len, const uint8_t *data)
-{
-	struct cras_test_dev_command *msg;
-	int rc;
-
-	msg = (struct cras_test_dev_command *)malloc(sizeof(*msg) + data_len);
-	cras_fill_test_dev_command(msg, iodev_idx, command, data_len, data);
-	rc = write_message_to_server(client, &msg->header);
-	free(msg);
-	return rc;
-}
-
-int cras_client_config_global_remix(struct cras_client *client,
-				    unsigned num_channels, float *coefficient)
-{
-	struct cras_config_global_remix *msg;
-	int rc;
-	size_t nchan = (size_t)num_channels;
-
-	msg = (struct cras_config_global_remix *)malloc(
-		sizeof(*msg) + nchan * nchan * sizeof(*coefficient));
-	cras_fill_config_global_remix_command(msg, num_channels, coefficient,
-					      num_channels * num_channels);
-	rc = write_message_to_server(client, &msg->header);
-	free(msg);
-	return rc;
-}
-
-int cras_client_get_first_node_type_idx(const struct cras_client *client,
-					enum CRAS_NODE_TYPE type,
-					enum CRAS_STREAM_DIRECTION direction,
-					cras_node_id_t *node_id)
-{
-	const struct cras_server_state *state;
-	unsigned int version;
-	unsigned int i;
-	const struct cras_ionode_info *node_list;
-	unsigned int num_nodes;
-	int lock_rc;
-
-	lock_rc = server_state_rdlock(client);
-	if (lock_rc)
-		return -EINVAL;
-	state = client->server_state;
-
-read_nodes_again:
-	version = begin_server_state_read(state);
-	if (direction == CRAS_STREAM_OUTPUT) {
-		node_list = state->output_nodes;
-		num_nodes = state->num_output_nodes;
-	} else {
-		node_list = state->input_nodes;
-		num_nodes = state->num_input_nodes;
-	}
-	for (i = 0; i < num_nodes; i++) {
-		if ((enum CRAS_NODE_TYPE)node_list[i].type_enum == type) {
-			*node_id = cras_make_node_id(node_list[i].iodev_idx,
-						     node_list[i].ionode_idx);
-			server_state_unlock(client, lock_rc);
-			return 0;
-		}
-	}
-	if (end_server_state_read(state, version))
-		goto read_nodes_again;
-	server_state_unlock(client, lock_rc);
-
-	return -ENODEV;
-}
-
-int cras_client_get_first_dev_type_idx(const struct cras_client *client,
-				       enum CRAS_NODE_TYPE type,
-				       enum CRAS_STREAM_DIRECTION direction)
-{
-	cras_node_id_t node_id;
-	int rc;
-
-	rc = cras_client_get_first_node_type_idx(client, type, direction,
-						 &node_id);
-	if (rc)
-		return rc;
-
-	return dev_index_of(node_id);
-}
-
-int cras_client_set_suspend(struct cras_client *client, int suspend)
-{
-	struct cras_server_message msg;
-
-	cras_fill_suspend_message(&msg, suspend);
-	return write_message_to_server(client, &msg);
-}
-
-int cras_client_get_hotword_models(struct cras_client *client,
-				   cras_node_id_t node_id,
-				   get_hotword_models_cb_t cb)
-{
-	struct cras_get_hotword_models msg;
-
-	if (!client)
-		return -EINVAL;
-	client->get_hotword_models_cb = cb;
-
-	cras_fill_get_hotword_models_message(&msg, node_id);
-	return write_message_to_server(client, &msg.header);
-}
-
-int cras_client_set_hotword_model(struct cras_client *client,
-				  cras_node_id_t node_id,
-				  const char *model_name)
-{
-	struct cras_set_hotword_model msg;
-
-	cras_fill_set_hotword_model_message(&msg, node_id, model_name);
-	return write_message_to_server(client, &msg.header);
-}
-
-int cras_client_set_aec_dump(struct cras_client *client,
-			     cras_stream_id_t stream_id, int start, int fd)
-{
-	struct cras_set_aec_dump msg;
-
-	cras_fill_set_aec_dump_message(&msg, stream_id, start);
-
-	if (fd != -1)
-		return cras_send_with_fds(client->server_fd, &msg, sizeof(msg),
-					  &fd, 1);
-	else
-		return write_message_to_server(client, &msg.header);
-}
-
-int cras_client_reload_aec_config(struct cras_client *client)
-{
-	struct cras_reload_aec_config msg;
-
-	cras_fill_reload_aec_config(&msg);
-	return write_message_to_server(client, &msg.header);
-}
-
-int cras_client_get_aec_supported(struct cras_client *client)
-{
-	int aec_supported;
-	int lock_rc;
-
-	lock_rc = server_state_rdlock(client);
-	if (lock_rc)
-		return 0;
-
-	aec_supported = client->server_state->aec_supported;
-	server_state_unlock(client, lock_rc);
-	return aec_supported;
-}
-
-int cras_client_get_aec_group_id(struct cras_client *client)
-{
-	int aec_group_id;
-	int lock_rc;
-
-	lock_rc = server_state_rdlock(client);
-	if (lock_rc)
-		return -1;
-
-	aec_group_id = client->server_state->aec_group_id;
-	server_state_unlock(client, lock_rc);
-	return aec_group_id;
-}
-
-int cras_client_set_bt_wbs_enabled(struct cras_client *client, bool enabled)
-{
-	struct cras_set_bt_wbs_enabled msg;
-
-	cras_fill_set_bt_wbs_enabled(&msg, enabled);
-	return write_message_to_server(client, &msg.header);
-}
-
-void cras_client_set_state_change_callback_context(struct cras_client *client,
-						   void *context)
-{
-	if (!client)
-		return;
-	client->observer_context = context;
-}
-
-static int cras_send_register_notification(struct cras_client *client,
-					   enum CRAS_CLIENT_MESSAGE_ID msg_id,
-					   int do_register)
-{
-	struct cras_register_notification msg;
-	int rc;
-
-	/* This library automatically re-registers notifications when
-	 * reconnecting, so we can ignore message send failure due to no
-	 * connection. */
-	cras_fill_register_notification_message(&msg, msg_id, do_register);
-	rc = write_message_to_server(client, &msg.header);
-	if (rc == -EPIPE)
-		rc = 0;
-	return rc;
-}
-
-int cras_client_set_output_volume_changed_callback(
-	struct cras_client *client,
-	cras_client_output_volume_changed_callback cb)
-{
-	if (!client)
-		return -EINVAL;
-	client->observer_ops.output_volume_changed = cb;
-	return cras_send_register_notification(
-		client, CRAS_CLIENT_OUTPUT_VOLUME_CHANGED, cb != NULL);
-}
-
-int cras_client_set_output_mute_changed_callback(
-	struct cras_client *client, cras_client_output_mute_changed_callback cb)
-{
-	if (!client)
-		return -EINVAL;
-	client->observer_ops.output_mute_changed = cb;
-	return cras_send_register_notification(
-		client, CRAS_CLIENT_OUTPUT_MUTE_CHANGED, cb != NULL);
-}
-
-int cras_client_set_capture_gain_changed_callback(
-	struct cras_client *client,
-	cras_client_capture_gain_changed_callback cb)
-{
-	if (!client)
-		return -EINVAL;
-	client->observer_ops.capture_gain_changed = cb;
-	return cras_send_register_notification(
-		client, CRAS_CLIENT_CAPTURE_GAIN_CHANGED, cb != NULL);
-}
-
-int cras_client_set_capture_mute_changed_callback(
-	struct cras_client *client,
-	cras_client_capture_mute_changed_callback cb)
-{
-	if (!client)
-		return -EINVAL;
-	client->observer_ops.capture_mute_changed = cb;
-	return cras_send_register_notification(
-		client, CRAS_CLIENT_CAPTURE_MUTE_CHANGED, cb != NULL);
-}
-
-int cras_client_set_nodes_changed_callback(
-	struct cras_client *client, cras_client_nodes_changed_callback cb)
-{
-	if (!client)
-		return -EINVAL;
-	client->observer_ops.nodes_changed = cb;
-	return cras_send_register_notification(
-		client, CRAS_CLIENT_NODES_CHANGED, cb != NULL);
-}
-
-int cras_client_set_active_node_changed_callback(
-	struct cras_client *client, cras_client_active_node_changed_callback cb)
-{
-	if (!client)
-		return -EINVAL;
-	client->observer_ops.active_node_changed = cb;
-	return cras_send_register_notification(
-		client, CRAS_CLIENT_ACTIVE_NODE_CHANGED, cb != NULL);
-}
-
-int cras_client_set_output_node_volume_changed_callback(
-	struct cras_client *client,
-	cras_client_output_node_volume_changed_callback cb)
-{
-	if (!client)
-		return -EINVAL;
-	client->observer_ops.output_node_volume_changed = cb;
-	return cras_send_register_notification(
-		client, CRAS_CLIENT_OUTPUT_NODE_VOLUME_CHANGED, cb != NULL);
-}
-
-int cras_client_set_node_left_right_swapped_changed_callback(
-	struct cras_client *client,
-	cras_client_node_left_right_swapped_changed_callback cb)
-{
-	if (!client)
-		return -EINVAL;
-	client->observer_ops.node_left_right_swapped_changed = cb;
-	return cras_send_register_notification(
-		client, CRAS_CLIENT_NODE_LEFT_RIGHT_SWAPPED_CHANGED,
-		cb != NULL);
-}
-
-int cras_client_set_input_node_gain_changed_callback(
-	struct cras_client *client,
-	cras_client_input_node_gain_changed_callback cb)
-{
-	if (!client)
-		return -EINVAL;
-	client->observer_ops.input_node_gain_changed = cb;
-	return cras_send_register_notification(
-		client, CRAS_CLIENT_INPUT_NODE_GAIN_CHANGED, cb != NULL);
-}
-
-int cras_client_set_num_active_streams_changed_callback(
-	struct cras_client *client,
-	cras_client_num_active_streams_changed_callback cb)
-{
-	if (!client)
-		return -EINVAL;
-	client->observer_ops.num_active_streams_changed = cb;
-	return cras_send_register_notification(
-		client, CRAS_CLIENT_NUM_ACTIVE_STREAMS_CHANGED, cb != NULL);
-}
-
-static int reregister_notifications(struct cras_client *client)
-{
-	int rc;
-
-	if (client->observer_ops.output_volume_changed) {
-		rc = cras_client_set_output_volume_changed_callback(
-			client, client->observer_ops.output_volume_changed);
-		if (rc != 0)
-			return rc;
-	}
-	if (client->observer_ops.output_mute_changed) {
-		rc = cras_client_set_output_mute_changed_callback(
-			client, client->observer_ops.output_mute_changed);
-		if (rc != 0)
-			return rc;
-	}
-	if (client->observer_ops.capture_gain_changed) {
-		rc = cras_client_set_capture_gain_changed_callback(
-			client, client->observer_ops.capture_gain_changed);
-		if (rc != 0)
-			return rc;
-	}
-	if (client->observer_ops.capture_mute_changed) {
-		rc = cras_client_set_capture_mute_changed_callback(
-			client, client->observer_ops.capture_mute_changed);
-		if (rc != 0)
-			return rc;
-	}
-	if (client->observer_ops.nodes_changed) {
-		rc = cras_client_set_nodes_changed_callback(
-			client, client->observer_ops.nodes_changed);
-		if (rc != 0)
-			return rc;
-	}
-	if (client->observer_ops.active_node_changed) {
-		rc = cras_client_set_active_node_changed_callback(
-			client, client->observer_ops.active_node_changed);
-		if (rc != 0)
-			return rc;
-	}
-	if (client->observer_ops.output_node_volume_changed) {
-		rc = cras_client_set_output_node_volume_changed_callback(
-			client,
-			client->observer_ops.output_node_volume_changed);
-		if (rc != 0)
-			return rc;
-	}
-	if (client->observer_ops.node_left_right_swapped_changed) {
-		rc = cras_client_set_node_left_right_swapped_changed_callback(
-			client,
-			client->observer_ops.node_left_right_swapped_changed);
-		if (rc != 0)
-			return rc;
-	}
-	if (client->observer_ops.input_node_gain_changed) {
-		rc = cras_client_set_input_node_gain_changed_callback(
-			client, client->observer_ops.input_node_gain_changed);
-		if (rc != 0)
-			return rc;
-	}
-	if (client->observer_ops.num_active_streams_changed) {
-		rc = cras_client_set_num_active_streams_changed_callback(
-			client,
-			client->observer_ops.num_active_streams_changed);
-		if (rc != 0)
-			return rc;
-	}
-	return 0;
-}
-
-static int hotword_read_cb(struct cras_client *client,
-			   cras_stream_id_t stream_id,
-			   uint8_t *captured_samples, uint8_t *playback_samples,
-			   unsigned int frames,
-			   const struct timespec *captured_time,
-			   const struct timespec *playback_time, void *user_arg)
-{
-	struct cras_hotword_handle *handle;
-
-	handle = (struct cras_hotword_handle *)user_arg;
-	if (handle->trigger_cb)
-		handle->trigger_cb(client, handle, handle->user_data);
-
-	return 0;
-}
-
-static int hotword_err_cb(struct cras_client *client,
-			  cras_stream_id_t stream_id, int error, void *user_arg)
-{
-	struct cras_hotword_handle *handle;
-
-	handle = (struct cras_hotword_handle *)user_arg;
-	if (handle->err_cb)
-		handle->err_cb(client, handle, error, handle->user_data);
-
-	return 0;
-}
-
-int cras_client_enable_hotword_callback(struct cras_client *client,
-					void *user_data,
-					cras_hotword_trigger_cb_t trigger_cb,
-					cras_hotword_error_cb_t err_cb,
-					struct cras_hotword_handle **handle_out)
-{
-	struct cras_hotword_handle *handle;
-	int ret = 0;
-
-	if (!client)
-		return -EINVAL;
-
-	handle = (struct cras_hotword_handle *)calloc(1, sizeof(*handle));
-	if (!handle)
-		return -ENOMEM;
-
-	handle->format = cras_audio_format_create(SND_PCM_FORMAT_S16_LE,
-						  HOTWORD_FRAME_RATE, 1);
-	if (!handle->format) {
-		ret = -ENOMEM;
-		goto cleanup;
-	}
-
-	handle->params = cras_client_unified_params_create(
-		CRAS_STREAM_INPUT, HOTWORD_BLOCK_SIZE, CRAS_STREAM_TYPE_DEFAULT,
-		HOTWORD_STREAM | TRIGGER_ONLY, (void *)handle, hotword_read_cb,
-		hotword_err_cb, handle->format);
-	if (!handle->params) {
-		ret = -ENOMEM;
-		goto cleanup_format;
-	}
-
-	handle->trigger_cb = trigger_cb;
-	handle->err_cb = err_cb;
-	handle->user_data = user_data;
-
-	ret = cras_client_add_stream(client, &handle->stream_id,
-				     handle->params);
-	if (ret)
-		goto cleanup_params;
-
-	*handle_out = handle;
-	return 0;
-
-cleanup_params:
-	cras_client_stream_params_destroy(handle->params);
-cleanup_format:
-	cras_audio_format_destroy(handle->format);
-cleanup:
-	free(handle);
-	return ret;
-}
-
-int cras_client_disable_hotword_callback(struct cras_client *client,
-					 struct cras_hotword_handle *handle)
-{
-	if (!client || !handle)
-		return -EINVAL;
-
-	cras_client_rm_stream(client, handle->stream_id);
-	cras_audio_format_destroy(handle->format);
-	cras_client_stream_params_destroy(handle->params);
-	free(handle);
-	return 0;
-}
-
-int get_nodes(struct cras_client *client, enum CRAS_STREAM_DIRECTION direction,
-	      struct libcras_node_info ***nodes, size_t *num)
-{
-	struct cras_iodev_info iodevs[CRAS_MAX_IODEVS];
-	struct cras_ionode_info ionodes[CRAS_MAX_IONODES];
-	size_t num_devs = CRAS_MAX_IODEVS, num_nodes = CRAS_MAX_IONODES;
-	int rc, i, j;
-
-	*num = 0;
-	if (direction == CRAS_STREAM_INPUT) {
-		rc = cras_client_get_input_devices(client, iodevs, ionodes,
-						   &num_devs, &num_nodes);
-	} else {
-		rc = cras_client_get_output_devices(client, iodevs, ionodes,
-						    &num_devs, &num_nodes);
-	}
-
-	if (rc < 0) {
-		syslog(LOG_ERR, "Failed to get devices: %d", rc);
-		return rc;
-	}
-
-	*nodes = (struct libcras_node_info **)calloc(
-		num_nodes, sizeof(struct libcras_node_info *));
-
-	for (i = 0; i < num_devs; i++) {
-		for (j = 0; j < num_nodes; j++) {
-			if (iodevs[i].idx != ionodes[j].iodev_idx)
-				continue;
-			(*nodes)[*num] = libcras_node_info_create(&iodevs[i],
-								  &ionodes[j]);
-			if ((*nodes)[*num] == NULL) {
-				rc = -errno;
-				goto clean;
-			}
-			(*num)++;
-		}
-	}
-	return 0;
-clean:
-	for (i = 0; i < *num; i++)
-		libcras_node_info_destroy((*nodes)[i]);
-	free(*nodes);
-	*nodes = NULL;
-	*num = 0;
-	return rc;
-}
-
-int get_default_output_buffer_size(struct cras_client *client, int *size)
-{
-	int rc = cras_client_get_default_output_buffer_size(client);
-	if (rc < 0)
-		return rc;
-	*size = rc;
-	return 0;
-}
-
-int get_aec_group_id(struct cras_client *client, int *id)
-{
-	int rc = cras_client_get_aec_group_id(client);
-	if (rc < 0)
-		return rc;
-	*id = rc;
-	return 0;
-}
-
-int get_aec_supported(struct cras_client *client, int *supported)
-{
-	*supported = cras_client_get_aec_supported(client);
-	return 0;
-}
-
-int get_system_muted(struct cras_client *client, int *muted)
-{
-	*muted = cras_client_get_system_muted(client);
-	return 0;
-}
-
-int get_loopback_dev_idx(struct cras_client *client, int *idx)
-{
-	int rc = cras_client_get_first_dev_type_idx(
-		client, CRAS_NODE_TYPE_POST_MIX_PRE_DSP, CRAS_STREAM_INPUT);
-	if (rc < 0)
-		return rc;
-	*idx = rc;
-	return 0;
-}
-
-struct libcras_client *libcras_client_create()
-{
-	struct libcras_client *client = (struct libcras_client *)calloc(
-		1, sizeof(struct libcras_client));
-	if (!client) {
-		syslog(LOG_ERR, "cras_client: calloc failed");
-		return NULL;
-	}
-	if (cras_client_create(&client->client_)) {
-		libcras_client_destroy(client);
-		return NULL;
-	}
-	client->api_version = CRAS_API_VERSION;
-	client->connect = cras_client_connect;
-	client->connect_timeout = cras_client_connect_timeout;
-	client->connected_wait = cras_client_connected_wait;
-	client->run_thread = cras_client_run_thread;
-	client->stop = cras_client_stop;
-	client->add_pinned_stream = cras_client_add_pinned_stream;
-	client->rm_stream = cras_client_rm_stream;
-	client->set_stream_volume = cras_client_set_stream_volume;
-	client->get_nodes = get_nodes;
-	client->get_default_output_buffer_size = get_default_output_buffer_size;
-	client->get_aec_group_id = get_aec_group_id;
-	client->get_aec_supported = get_aec_supported;
-	client->get_system_muted = get_system_muted;
-	client->set_system_mute = cras_client_set_system_mute;
-	client->get_loopback_dev_idx = get_loopback_dev_idx;
-	return client;
-}
-
-void libcras_client_destroy(struct libcras_client *client)
-{
-	cras_client_destroy(client->client_);
-	free(client);
-}
-
-int stream_params_set(struct cras_stream_params *params,
-		      enum CRAS_STREAM_DIRECTION direction,
-		      size_t buffer_frames, size_t cb_threshold,
-		      enum CRAS_STREAM_TYPE stream_type,
-		      enum CRAS_CLIENT_TYPE client_type, uint32_t flags,
-		      void *user_data, libcras_stream_cb_t stream_cb,
-		      cras_error_cb_t err_cb, size_t rate,
-		      snd_pcm_format_t format, size_t num_channels)
-{
-	params->direction = direction;
-	params->buffer_frames = buffer_frames;
-	params->cb_threshold = cb_threshold;
-	params->stream_type = stream_type;
-	params->client_type = client_type;
-	params->flags = flags;
-	params->user_data = user_data;
-	params->stream_cb = stream_cb;
-	params->err_cb = err_cb;
-	params->format.frame_rate = rate;
-	params->format.format = format;
-	params->format.num_channels = num_channels;
-	return 0;
-}
-
-int stream_params_set_channel_layout(struct cras_stream_params *params,
-				     int length, const int8_t *layout)
-{
-	if (length != CRAS_CH_MAX)
-		return -EINVAL;
-	return cras_audio_format_set_channel_layout(&params->format, layout);
-}
-
-struct libcras_stream_params *libcras_stream_params_create()
-{
-	struct libcras_stream_params *params =
-		(struct libcras_stream_params *)calloc(
-			1, sizeof(struct libcras_stream_params));
-	if (!params) {
-		syslog(LOG_ERR, "cras_client: calloc failed");
-		return NULL;
-	}
-	params->params_ = (struct cras_stream_params *)calloc(
-		1, sizeof(struct cras_stream_params));
-	if (params->params_ == NULL) {
-		syslog(LOG_ERR, "cras_client: calloc failed");
-		free(params->params_);
-		return NULL;
-	}
-	params->api_version = CRAS_API_VERSION;
-	params->set = stream_params_set;
-	params->set_channel_layout = stream_params_set_channel_layout;
-	params->enable_aec = cras_client_stream_params_enable_aec;
-	return params;
-}
-
-void libcras_stream_params_destroy(struct libcras_stream_params *params)
-{
-	free(params->params_);
-	free(params);
-}
-
-struct cras_node_info {
-	uint64_t id;
-	uint32_t dev_idx;
-	uint32_t node_idx;
-	uint32_t max_supported_channels;
-	bool plugged;
-	bool active;
-	char type[CRAS_NODE_TYPE_BUFFER_SIZE];
-	char node_name[CRAS_NODE_NAME_BUFFER_SIZE];
-	char dev_name[CRAS_IODEV_NAME_BUFFER_SIZE];
-};
-
-int cras_node_info_get_id(struct cras_node_info *node, uint64_t *id)
-{
-	(*id) = node->id;
-	return 0;
-}
-
-int cras_node_info_get_dev_idx(struct cras_node_info *node, uint32_t *dev_idx)
-{
-	(*dev_idx) = node->dev_idx;
-	return 0;
-}
-
-int cras_node_info_get_node_idx(struct cras_node_info *node, uint32_t *node_idx)
-{
-	(*node_idx) = node->node_idx;
-	return 0;
-}
-
-int cras_node_info_get_max_supported_channels(struct cras_node_info *node,
-					      uint32_t *max_supported_channels)
-{
-	(*max_supported_channels) = node->max_supported_channels;
-	return 0;
-}
-
-int cras_node_info_is_plugged(struct cras_node_info *node, bool *is_plugged)
-{
-	(*is_plugged) = node->plugged;
-	return 0;
-}
-
-int cras_node_info_is_active(struct cras_node_info *node, bool *is_active)
-{
-	(*is_active) = node->active;
-	return 0;
-}
-
-int cras_node_info_get_type(struct cras_node_info *node, char **type)
-{
-	(*type) = node->type;
-	return 0;
-}
-
-int cras_node_info_get_node_name(struct cras_node_info *node, char **node_name)
-{
-	(*node_name) = node->node_name;
-	return 0;
-}
-
-int cras_node_info_get_dev_name(struct cras_node_info *node, char **dev_name)
-{
-	(*dev_name) = node->dev_name;
-	return 0;
-}
-
-struct libcras_node_info *
-libcras_node_info_create(struct cras_iodev_info *iodev,
-			 struct cras_ionode_info *ionode)
-{
-	struct libcras_node_info *node = (struct libcras_node_info *)calloc(
-		1, sizeof(struct libcras_node_info));
-	if (!node) {
-		syslog(LOG_ERR, "cras_client: calloc failed");
-		return NULL;
-	}
-	node->node_ = (struct cras_node_info *)calloc(
-		1, sizeof(struct cras_node_info));
-	if (node->node_ == NULL) {
-		syslog(LOG_ERR, "cras_client: calloc failed");
-		free(node);
-		return NULL;
-	}
-	node->api_version = CRAS_API_VERSION;
-	node->node_->id =
-		cras_make_node_id(ionode->iodev_idx, ionode->ionode_idx);
-	node->node_->dev_idx = ionode->iodev_idx;
-	node->node_->node_idx = ionode->ionode_idx;
-	node->node_->max_supported_channels = iodev->max_supported_channels;
-	node->node_->plugged = ionode->plugged;
-	node->node_->active = ionode->active;
-	strncpy(node->node_->type, ionode->type, CRAS_NODE_TYPE_BUFFER_SIZE);
-	node->node_->type[CRAS_NODE_TYPE_BUFFER_SIZE - 1] = '\0';
-	strncpy(node->node_->node_name, ionode->name,
-		CRAS_NODE_NAME_BUFFER_SIZE);
-	node->node_->node_name[CRAS_NODE_NAME_BUFFER_SIZE - 1] = '\0';
-	strncpy(node->node_->dev_name, iodev->name,
-		CRAS_IODEV_NAME_BUFFER_SIZE);
-	node->node_->dev_name[CRAS_IODEV_NAME_BUFFER_SIZE - 1] = '\0';
-	node->get_id = cras_node_info_get_id;
-	node->get_dev_idx = cras_node_info_get_dev_idx;
-	node->get_node_idx = cras_node_info_get_node_idx;
-	node->get_max_supported_channels =
-		cras_node_info_get_max_supported_channels;
-	node->is_plugged = cras_node_info_is_plugged;
-	node->is_active = cras_node_info_is_active;
-	node->get_type = cras_node_info_get_type;
-	node->get_node_name = cras_node_info_get_node_name;
-	node->get_dev_name = cras_node_info_get_dev_name;
-	return node;
-}
-
-void libcras_node_info_destroy(struct libcras_node_info *node)
-{
-	free(node->node_);
-	free(node);
-}
-
-void libcras_node_info_array_destroy(struct libcras_node_info **nodes,
-				     size_t num)
-{
-	int i;
-	for (i = 0; i < num; i++)
-		libcras_node_info_destroy(nodes[i]);
-	free(nodes);
-}
diff --git a/cras/src/libcras/cras_client.h b/cras/src/libcras/cras_client.h
deleted file mode 100644
index f26a081..0000000
--- a/cras/src/libcras/cras_client.h
+++ /dev/null
@@ -1,2008 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- *
- * This API creates multiple threads, one for control, and a thread per audio
- * stream. The control thread is used to receive messages and notifications
- * from the audio server, and manage the per-stream threads. API calls below
- * may send messages to the control thread, or directly to the server. It is
- * required that the control thread is running in order to support audio
- * streams and notifications from the server.
- *
- * The API has multiple initialization sequences, but some of those can block
- * while waiting for a response from the server.
- *
- * The following is the non-blocking API initialization sequence:
- *	cras_client_create()
- *      cras_client_set_connection_status_cb()                       (optional)
- *      cras_client_run_thread()
- *      cras_client_connect_async()
- *
- * The connection callback is executed asynchronously from the control thread
- * when the connection has been established. The connection callback should be
- * used to turn on or off interactions with any API call that communicates with
- * the audio server or starts/stops audio streams. The above is implemented by
- * cras_helper_create_connect_async().
- *
- * The following alternative (deprecated) initialization sequence can ensure
- * that the connection is established synchronously.
- *
- * Just connect to the server (no control thread):
- *      cras_client_create()
- *      cras_client_set_server_connection_cb()                       (optional)
- *   one of:
- *      cras_client_connect()                                  (blocks forever)
- *   or
- *      cras_client_connect_timeout()                      (blocks for timeout)
- *
- * For API calls below that require the control thread to be running:
- *      cras_client_run_thread();
- *      cras_client_connected_wait();                     (blocks up to 1 sec.)
- *
- * The above minus setting the connection callback is implemented within
- * cras_helper_create_connect().
- */
-
-#ifndef CRAS_CLIENT_H_
-#define CRAS_CLIENT_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <stdbool.h>
-#include <stdint.h>
-#include <sys/select.h>
-
-#include "cras_iodev_info.h"
-#include "cras_types.h"
-#include "cras_util.h"
-
-struct cras_client;
-struct cras_hotword_handle;
-struct cras_stream_params;
-
-/* Callback for audio received or transmitted.
- * Args (All pointer will be valid - except user_arg, that's up to the user):
- *    client: The client requesting service.
- *    stream_id - Unique identifier for the stream needing data read/written.
- *    samples - Read or write samples to/form here.
- *    frames - Maximum number of frames to read or write.
- *    sample_time - Playback time for the first sample read/written.
- *    user_arg - Value passed to add_stream;
- * Return:
- *    Returns the number of frames read or written on success, or a negative
- *    number if there is a stream-fatal error. Returns EOF when the end of the
- *    stream is reached.
- */
-typedef int (*cras_playback_cb_t)(struct cras_client *client,
-				  cras_stream_id_t stream_id, uint8_t *samples,
-				  size_t frames,
-				  const struct timespec *sample_time,
-				  void *user_arg);
-
-/* Callback for audio received and/or transmitted.
- * Args (All pointer will be valid - except user_arg, that's up to the user):
- *    client: The client requesting service.
- *    stream_id - Unique identifier for the stream needing data read/written.
- *    captured_samples - Read samples form here.
- *    playback_samples - Read or write samples to here.
- *    frames - Maximum number of frames to read or write.
- *    captured_time - Time the first sample was read.
- *    playback_time - Playback time for the first sample written.
- *    user_arg - Value passed to add_stream;
- * Return:
- *    Returns the number of frames read or written on success, or a negative
- *    number if there is a stream-fatal error. Returns EOF when the end of the
- *    stream is reached.
- */
-typedef int (*cras_unified_cb_t)(struct cras_client *client,
-				 cras_stream_id_t stream_id,
-				 uint8_t *captured_samples,
-				 uint8_t *playback_samples, unsigned int frames,
-				 const struct timespec *captured_time,
-				 const struct timespec *playback_time,
-				 void *user_arg);
-
-/* Callback for handling stream errors.
- * Args:
- *    client - The client created with cras_client_create().
- *    stream_id - The ID for this stream.
- *    error - The error code,
- *    user_arg - The argument defined in cras_client_*_params_create().
- */
-typedef int (*cras_error_cb_t)(struct cras_client *client,
-			       cras_stream_id_t stream_id, int error,
-			       void *user_arg);
-
-/* Server connection status. */
-typedef enum cras_connection_status {
-	CRAS_CONN_STATUS_FAILED,
-	/* Resource allocation problem. Free resources, and retry the
-	 * connection with cras_client_connect_async(), or (blocking)
-	 * cras_client_connect(). Do not call cras_client_connect(),
-	 * cras_client_connect_timeout(), or cras_client_destroy()
-	 * from the callback. */
-	CRAS_CONN_STATUS_DISCONNECTED,
-	/* The control thread is attempting to reconnect to the
-	 * server in the background. Any attempt to access the
-	 * server will fail or block (see
-	 * cras_client_set_server_message_blocking(). */
-	CRAS_CONN_STATUS_CONNECTED,
-	/* Connection is established. All state change callbacks
-	 * have been re-registered, but audio streams must be
-	 * restarted, and node state data must be updated. */
-} cras_connection_status_t;
-
-/* Callback for handling server connection status.
- *
- * See also cras_client_set_connection_status_cb(). Do not call
- * cras_client_connect(), cras_client_connect_timeout(), or
- * cras_client_destroy() from this callback.
- *
- * Args:
- *    client - The client created with cras_client_create().
- *    status - The status of the connection to the server.
- *    user_arg - The argument defined in
- *               cras_client_set_connection_status_cb().
- */
-typedef void (*cras_connection_status_cb_t)(struct cras_client *client,
-					    cras_connection_status_t status,
-					    void *user_arg);
-
-/* Callback for setting thread priority. */
-typedef void (*cras_thread_priority_cb_t)(struct cras_client *client);
-
-/* Callback for handling get hotword models reply. */
-typedef void (*get_hotword_models_cb_t)(struct cras_client *client,
-					const char *hotword_models);
-
-/* Callback to wait for a hotword trigger. */
-typedef void (*cras_hotword_trigger_cb_t)(struct cras_client *client,
-					  struct cras_hotword_handle *handle,
-					  void *user_data);
-
-/* Callback for handling hotword errors. */
-typedef int (*cras_hotword_error_cb_t)(struct cras_client *client,
-				       struct cras_hotword_handle *handle,
-				       int error, void *user_data);
-
-/*
- * Client handling.
- */
-
-/* Creates a new client.
- * Args:
- *    client - Filled with a pointer to the new client.
- * Returns:
- *    0 on success (*client is filled with a valid cras_client pointer).
- *    Negative error code on failure(*client will be NULL).
- */
-int cras_client_create(struct cras_client **client);
-
-/* Creates a new client with given connection type.
- * Args:
- *     client - Filled with a pointer to the new client.
- *     conn_type - enum CRAS_CONNECTION_TYPE
- *
- * Returns:
- *     0 on success (*client is filled with a valid cras_client pointer).
- *     Negative error code on failure(*client will be NULL).
- */
-int cras_client_create_with_type(struct cras_client **client,
-				 enum CRAS_CONNECTION_TYPE conn_type);
-
-/* Destroys a client.
- * Args:
- *    client - returned from "cras_client_create".
- */
-void cras_client_destroy(struct cras_client *client);
-
-/* Connects a client to the running server.
- * Waits forever (until interrupted or connected).
- * Args:
- *    client - pointer returned from "cras_client_create".
- * Returns:
- *    0 on success, or a negative error code on failure (from errno.h).
- */
-int cras_client_connect(struct cras_client *client);
-
-/* Connects a client to the running server, retries until timeout.
- * Args:
- *    client - pointer returned from "cras_client_create".
- *    timeout_ms - timeout in milliseconds or negative to wait forever.
- * Returns:
- *    0 on success, or a negative error code on failure (from errno.h).
- */
-int cras_client_connect_timeout(struct cras_client *client,
-				unsigned int timeout_ms);
-
-/* Begins running the client control thread.
- *
- * Required for stream operations and other operations noted below.
- *
- * Args:
- *    client - the client to start (from cras_client_create).
- * Returns:
- *    0 on success or if the thread is already running, -EINVAL if the client
- *    pointer is NULL, or the negative result of pthread_create().
- */
-int cras_client_run_thread(struct cras_client *client);
-
-/* Stops running a client.
- * This function is executed automatically by cras_client_destroy().
- * Args:
- *    client - the client to stop (from cras_client_create).
- * Returns:
- *    0 on success or if the thread was already stopped, -EINVAL if the client
- *    isn't valid.
- */
-int cras_client_stop(struct cras_client *client);
-
-/* Wait up to 1 second for the client thread to complete the server connection.
- *
- * After cras_client_run_thread() is executed, this function can be used to
- * ensure that the connection has been established with the server and ensure
- * that any information about the server is up to date. If
- * cras_client_run_thread() has not yet been executed, or cras_client_stop()
- * was executed and thread isn't running, then this function returns -EINVAL.
- *
- * Args:
- *    client - pointer returned from "cras_client_create".
- * Returns:
- *    0 on success, or a negative error code on failure (from errno.h).
- */
-int cras_client_connected_wait(struct cras_client *client);
-
-/* Ask the client control thread to connect to the audio server.
- *
- * After cras_client_run_thread() is executed, this function can be used
- * to ask the control thread to connect to the audio server asynchronously.
- * The callback set with cras_client_set_connection_status_cb() will be
- * executed when the connection is established.
- *
- * Args:
- *    client - The client from cras_client_create().
- * Returns:
- *    0 on success, or a negative error code on failure (from errno.h).
- *    -EINVAL if the client pointer is invalid or the control thread is
- *    not running.
- */
-int cras_client_connect_async(struct cras_client *client);
-
-/* Sets server connection status callback.
- *
- * See cras_connection_status_t for a description of the connection states
- * and appropriate user action.
- *
- * Args:
- *    client - The client from cras_client_create.
- *    connection_cb - The callback function to register.
- *    user_arg - Pointer that will be passed to the callback.
- */
-void cras_client_set_connection_status_cb(
-	struct cras_client *client, cras_connection_status_cb_t connection_cb,
-	void *user_arg);
-
-/* Sets callback for setting thread priority.
- * Args:
- *    client - The client from cras_client_create.
- *    cb - The thread priority callback.
- */
-void cras_client_set_thread_priority_cb(struct cras_client *client,
-					cras_thread_priority_cb_t cb);
-
-/* Returns the current list of output devices.
- *
- * Requires that the connection to the server has been established.
- *
- * Data is copied and thus can become out of date. This call must be
- * re-executed to get updates.
- *
- * Args:
- *    client - The client from cras_client_create.
- *    devs - Array that will be filled with device info.
- *    nodes - Array that will be filled with node info.
- *    *num_devs - Maximum number of devices to put in the array.
- *    *num_nodes - Maximum number of nodes to put in the array.
- * Returns:
- *    0 on success, -EINVAL if the client isn't valid or isn't running.
- *    *num_devs is set to the actual number of devices info filled.
- *    *num_nodes is set to the actual number of nodes info filled.
- */
-int cras_client_get_output_devices(const struct cras_client *client,
-				   struct cras_iodev_info *devs,
-				   struct cras_ionode_info *nodes,
-				   size_t *num_devs, size_t *num_nodes);
-
-/* Returns the current list of input devices.
- *
- * Requires that the connection to the server has been established.
- *
- * Data is copied and thus can become out of date. This call must be
- * re-executed to get updates.
- *
- * Args:
- *    client - The client from cras_client_create.
- *    devs - Array that will be filled with device info.
- *    nodes - Array that will be filled with node info.
- *    *num_devs - Maximum number of devices to put in the array.
- *    *num_nodes - Maximum number of nodes to put in the array.
- * Returns:
- *    0 on success, -EINVAL if the client isn't valid or isn't running.
- *    *num_devs is set to the actual number of devices info filled.
- *    *num_nodes is set to the actual number of nodes info filled.
- */
-int cras_client_get_input_devices(const struct cras_client *client,
-				  struct cras_iodev_info *devs,
-				  struct cras_ionode_info *nodes,
-				  size_t *num_devs, size_t *num_nodes);
-
-/* Returns the current list of clients attached to the server.
- *
- * Requires that the connection to the server has been established.
- *
- * Data is copied and thus can become out of date. This call must be
- * re-executed to get updates.
- *
- * Args:
- *    client - This client (from cras_client_create).
- *    clients - Array that will be filled with a list of attached clients.
- *    max_clients - Maximum number of clients to put in the array.
- * Returns:
- *    The number of attached clients.  This may be more that max_clients passed
- *    in, this indicates that all of the clients wouldn't fit in the provided
- *    array.
- */
-int cras_client_get_attached_clients(const struct cras_client *client,
-				     struct cras_attached_client_info *clients,
-				     size_t max_clients);
-
-/* Find a node info with the matching node id.
- *
- * Requires that the connection to the server has been established.
- *
- * Data is copied and thus can become out of date. This call must be
- * re-executed to get updates.
- *
- * Args:
- *    client - This client (from cras_client_create).
- *    input - Non-zero for input nodes, zero for output nodes.
- *    node_id - The node id to look for.
- *    node_info - The information about the ionode will be returned here.
- * Returns:
- *    0 if successful, negative on error; -ENOENT if the node cannot be found.
- */
-int cras_client_get_node_by_id(const struct cras_client *client, int input,
-			       const cras_node_id_t node_id,
-			       struct cras_ionode_info *node_info);
-
-/* Checks if the output device with the given name is currently plugged in.
- *
- * For internal devices this checks that jack state, for USB devices this will
- * always be true if they are present. The name parameter can be the complete
- * name or any unique prefix of the name. If the name is not unique the first
- * matching name will be checked.
- *
- * Requires that the connection to the server has been established.
- *
- * Data is copied and thus can become out of date. This call must be
- * re-executed to get updates.
- *
- * Args:
- *    client - The client from cras_client_create.
- *    name - Name of the device to check.
- * Returns:
- *    1 if the device exists and is plugged, 0 otherwise.
- */
-int cras_client_output_dev_plugged(const struct cras_client *client,
-				   const char *name);
-
-/* Set the value of an attribute of an ionode.
- *
- * Args:
- *    client - The client from cras_client_create.
- *    node_id - The id of the ionode.
- *    attr - the attribute we want to change.
- *    value - the value we want to set.
- * Returns:
- *    Returns 0 for success, negative on error (from errno.h).
- */
-int cras_client_set_node_attr(struct cras_client *client,
-			      cras_node_id_t node_id, enum ionode_attr attr,
-			      int value);
-
-/* Select the preferred node for playback/capture.
- *
- * Args:
- *    client - The client from cras_client_create.
- *    direction - The direction of the ionode.
- *    node_id - The id of the ionode. If node_id is the special value 0, then
- *        the preference is cleared and cras will choose automatically.
- */
-int cras_client_select_node(struct cras_client *client,
-			    enum CRAS_STREAM_DIRECTION direction,
-			    cras_node_id_t node_id);
-
-/* Adds an active node for playback/capture.
- *
- * Args:
- *    client - The client from cras_client_create.
- *    direction - The direction of the ionode.
- *    node_id - The id of the ionode. If there's no node matching given
- *        id, nothing will happen in CRAS.
- */
-int cras_client_add_active_node(struct cras_client *client,
-				enum CRAS_STREAM_DIRECTION direction,
-				cras_node_id_t node_id);
-
-/* Removes an active node for playback/capture.
- *
- * Args:
- *    client - The client from cras_client_create.
- *    direction - The direction of the ionode.
- *    node_id - The id of the ionode. If there's no node matching given
- *        id, nothing will happen in CRAS.
- */
-int cras_client_rm_active_node(struct cras_client *client,
-			       enum CRAS_STREAM_DIRECTION direction,
-			       cras_node_id_t node_id);
-
-/* Asks the server to reload dsp plugin configuration from the ini file.
- *
- * Args:
- *    client - The client from cras_client_create.
- * Returns:
- *    0 on success, -EINVAL if the client isn't valid or isn't running.
- */
-int cras_client_reload_dsp(struct cras_client *client);
-
-/* Asks the server to dump current dsp information to syslog.
- *
- * Args:
- *    client - The client from cras_client_create.
- * Returns:
- *    0 on success, -EINVAL if the client isn't valid or isn't running.
- */
-int cras_client_dump_dsp_info(struct cras_client *client);
-
-/* Asks the server to dump current audio thread information.
- *
- * Args:
- *    client - The client from cras_client_create.
- *    cb - A function to call when the data is received.
- * Returns:
- *    0 on success, -EINVAL if the client isn't valid or isn't running.
- */
-int cras_client_update_audio_debug_info(struct cras_client *client,
-					void (*cb)(struct cras_client *));
-
-/* Asks the server to dump current main thread information.
- * Args:
- *    client - The client from cras_client_create.
- *    cb - A function to call when the data is received.
- * Returns:
- *    0 on success, -EINVAL if the client isn't valid or isn't running.
- */
-int cras_client_update_main_thread_debug_info(struct cras_client *client,
-					      void (*cb)(struct cras_client *));
-
-/* Asks the server to dump bluetooth debug information.
- * Args:
- *    client - The client from cras_client_create.
- *    cb - Function to call when debug info is ready.
- * Returns:
- *    0 on success, -EINVAL if the client isn't valid or isn't running.
- */
-int cras_client_update_bt_debug_info(struct cras_client *client,
-				     void (*cb)(struct cras_client *));
-
-/* Gets read-only access to audio thread log. Should be called once before
-   calling cras_client_read_atlog.
- * Args:
- *    client - The client from cras_client_create.
- *    atlog_access_cb - Function to call after getting atlog access.
- * Returns:
- *    0 on success, -EINVAL if the client or atlog_access_cb isn't valid.
- */
-int cras_client_get_atlog_access(struct cras_client *client,
-				 void (*atlog_access_cb)(struct cras_client *));
-
-/* Reads continuous audio thread log into 'buf', starting from 'read_idx'-th log
- * till the latest. The number of missing logs within the range will be stored
- * in 'missing'. Requires calling cras_client_get_atlog_access() beforehand
- * to get access to audio thread log.
- * Args:
- *    client - The client from cras_client_create.
- *    read_idx - The log number to start reading with.
- *    missing - The pointer to store the number of missing logs.
- *    buf - The buffer to which continuous logs will be copied.
- * Returns:
- *    The number of logs copied. < 0 if failed to read audio thread log.
- */
-int cras_client_read_atlog(struct cras_client *client, uint64_t *read_idx,
-			   uint64_t *missing,
-			   struct audio_thread_event_log *buf);
-
-/* Asks the server to dump current audio thread snapshots.
- *
- * Args:
- *    client - The client from cras_client_create.
- *    cb - A function to call when the data is received.
- * Returns:
- *    0 on success, -EINVAL if the client isn't valid or isn't running.
- */
-int cras_client_update_audio_thread_snapshots(struct cras_client *client,
-					      void (*cb)(struct cras_client *));
-
-/* Gets the max supported channel count of the output device from node_id.
- * Args:
- *    client - The client from cras_client_create.
- *    node_id - ID of the node.
- *    max_channels - Out parameter will be filled with the max supported channel
- *        count.
- * Returns:
- *    0 on success, or negative error code on failure.
- */
-int cras_client_get_max_supported_channels(const struct cras_client *client,
-					   cras_node_id_t node_id,
-					   uint32_t *max_channels);
-
-/*
- * Stream handling.
- */
-
-/* Setup stream configuration parameters.
- * Args:
- *    direction - playback(CRAS_STREAM_OUTPUT) or capture(CRAS_STREAM_INPUT).
- *    buffer_frames - total number of audio frames to buffer (dictates latency).
- *    cb_threshold - For playback, call back for more data when the buffer
- *        reaches this level. For capture, this is ignored (Audio callback will
- *        be called when buffer_frames have been captured).
- *    unused - No longer used.
- *    stream_type - media or talk (currently only support "default").
- *    flags - Currently only used for CRAS_INPUT_STREAM_FLAG.
- *    user_data - Pointer that will be passed to the callback.
- *    aud_cb - Called when audio is needed(playback) or ready(capture). Allowed
- *        return EOF to indicate that the stream should terminate.
- *    err_cb - Called when there is an error with the stream.
- *    format - The format of the audio stream.  Specifies bits per sample,
- *        number of channels, and sample rate.
- */
-struct cras_stream_params *cras_client_stream_params_create(
-	enum CRAS_STREAM_DIRECTION direction, size_t buffer_frames,
-	size_t cb_threshold, size_t unused, enum CRAS_STREAM_TYPE stream_type,
-	uint32_t flags, void *user_data, cras_playback_cb_t aud_cb,
-	cras_error_cb_t err_cb, struct cras_audio_format *format);
-
-/* Functions to set the client type on given stream parameter.
- * Args:
- *    params - Stream configuration parameters.
- *    client_type - A client type.
- */
-void cras_client_stream_params_set_client_type(
-	struct cras_stream_params *params, enum CRAS_CLIENT_TYPE client_type);
-
-/* Functions to enable or disable specific effect on given stream parameter.
- * Args:
- *    params - Stream configuration parameters.
- */
-void cras_client_stream_params_enable_aec(struct cras_stream_params *params);
-void cras_client_stream_params_disable_aec(struct cras_stream_params *params);
-void cras_client_stream_params_enable_ns(struct cras_stream_params *params);
-void cras_client_stream_params_disable_ns(struct cras_stream_params *params);
-void cras_client_stream_params_enable_agc(struct cras_stream_params *params);
-void cras_client_stream_params_disable_agc(struct cras_stream_params *params);
-void cras_client_stream_params_enable_vad(struct cras_stream_params *params);
-void cras_client_stream_params_disable_vad(struct cras_stream_params *params);
-
-/* Setup stream configuration parameters. DEPRECATED.
- * TODO(crbug.com/972928): remove this
- * Use cras_client_stream_params_create instead.
- * Args:
- *    direction - playback(CRAS_STREAM_OUTPUT) or capture(CRAS_STREAM_INPUT) or
- *        loopback(CRAS_STREAM_POST_MIX_PRE_DSP).
- *    block_size - The number of frames per callback(dictates latency).
- *    stream_type - media or talk (currently only support "default").
- *    flags - None currently used.
- *    user_data - Pointer that will be passed to the callback.
- *    unified_cb - Called to request audio data or to notify the client when
- *                 captured audio is available. Though this is a unified_cb,
- *                 only one direction will be used for a stream, depending
- *                 on the 'direction' parameter.
- *    err_cb - Called when there is an error with the stream.
- *    format - The format of the audio stream.  Specifies bits per sample,
- *        number of channels, and sample rate.
- */
-struct cras_stream_params *cras_client_unified_params_create(
-	enum CRAS_STREAM_DIRECTION direction, unsigned int block_size,
-	enum CRAS_STREAM_TYPE stream_type, uint32_t flags, void *user_data,
-	cras_unified_cb_t unified_cb, cras_error_cb_t err_cb,
-	struct cras_audio_format *format);
-
-/* Destroy stream params created with cras_client_stream_params_create. */
-void cras_client_stream_params_destroy(struct cras_stream_params *params);
-
-/* Creates a new stream and return the stream id or < 0 on error.
- *
- * Requires execution of cras_client_run_thread(), and an active connection
- * to the audio server.
- *
- * Args:
- *    client - The client to add the stream to (from cras_client_create).
- *    stream_id_out - On success will be filled with the new stream id.
- *        Guaranteed to be set before any callbacks are made.
- *    config - The cras_stream_params struct specifying the parameters for the
- *        stream.
- * Returns:
- *    0 on success, negative error code on failure (from errno.h).
- */
-int cras_client_add_stream(struct cras_client *client,
-			   cras_stream_id_t *stream_id_out,
-			   struct cras_stream_params *config);
-
-/* Creates a pinned stream and return the stream id or < 0 on error.
- *
- * Requires execution of cras_client_run_thread(), and an active connection
- * to the audio server.
- *
- * Args:
- *    client - The client to add the stream to (from cras_client_create).
- *    dev_idx - Index of the device to attach the newly created stream.
- *    stream_id_out - On success will be filled with the new stream id.
- *        Guaranteed to be set before any callbacks are made.
- *    config - The cras_stream_params struct specifying the parameters for the
- *        stream.
- * Returns:
- *    0 on success, negative error code on failure (from errno.h).
- */
-int cras_client_add_pinned_stream(struct cras_client *client, uint32_t dev_idx,
-				  cras_stream_id_t *stream_id_out,
-				  struct cras_stream_params *config);
-
-/* Removes a currently playing/capturing stream.
- *
- * Requires execution of cras_client_run_thread().
- *
- * Args:
- *    client - Client to remove the stream (returned from cras_client_create).
- *    stream_id - ID returned from cras_client_add_stream to identify the stream
-          to remove.
- * Returns:
- *    0 on success negative error code on failure (from errno.h).
- */
-int cras_client_rm_stream(struct cras_client *client,
-			  cras_stream_id_t stream_id);
-
-/* Sets the volume scaling factor for the given stream.
- *
- * Requires execution of cras_client_run_thread().
- *
- * Args:
- *    client - Client owning the stream.
- *    stream_id - ID returned from cras_client_add_stream.
- *    volume_scaler - 0.0-1.0 the new value to scale this stream by.
- */
-int cras_client_set_stream_volume(struct cras_client *client,
-				  cras_stream_id_t stream_id,
-				  float volume_scaler);
-
-/*
- * System level functions.
- */
-
-/* Sets the volume of the system.
- *
- * Volume here ranges from 0 to 100, and will be translated to dB based on the
- * output-specific volume curve.
- *
- * Args:
- *    client - The client from cras_client_create.
- *    volume - 0-100 the new volume index.
- * Returns:
- *    0 for success, -EPIPE if there is an I/O error talking to the server, or
- *    -EINVAL if 'client' is invalid.
- */
-int cras_client_set_system_volume(struct cras_client *client, size_t volume);
-
-/* Sets the mute state of the system.
- *
- * Args:
- *    client - The client from cras_client_create.
- *    mute - 0 is un-mute, 1 is muted.
- * Returns:
- *    0 for success, -EPIPE if there is an I/O error talking to the server, or
- *    -EINVAL if 'client' is invalid.
- */
-int cras_client_set_system_mute(struct cras_client *client, int mute);
-
-/* Sets the user mute state of the system.
- *
- * This is used for mutes caused by user interaction. Like the mute key.
- *
- * Args:
- *    client - The client from cras_client_create.
- *    mute - 0 is un-mute, 1 is muted.
- * Returns:
- *    0 for success, -EPIPE if there is an I/O error talking to the server, or
- *    -EINVAL if 'client' is invalid.
- */
-int cras_client_set_user_mute(struct cras_client *client, int mute);
-
-/* Sets the mute locked state of the system.
- *
- * Changing mute state is impossible when this flag is set to locked.
- *
- * Args:
- *    client - The client from cras_client_create.
- *    locked - 0 is un-locked, 1 is locked.
- * Returns:
- *    0 for success, -EPIPE if there is an I/O error talking to the server, or
- *    -EINVAL if 'client' is invalid.
- */
-int cras_client_set_system_mute_locked(struct cras_client *client, int locked);
-
-/* Sets the capture mute state of the system.
- *
- * Recordings will be muted when this is set.
- *
- * Args:
- *    client - The client from cras_client_create.
- *    mute - 0 is un-mute, 1 is muted.
- * Returns:
- *    0 for success, -EPIPE if there is an I/O error talking to the server, or
- *    -EINVAL if 'client' is invalid.
- */
-int cras_client_set_system_capture_mute(struct cras_client *client, int mute);
-
-/* Sets the capture mute locked state of the system.
- *
- * Changing mute state is impossible when this flag is set to locked.
- *
- * Args:
- *    client - The client from cras_client_create.
- *    locked - 0 is un-locked, 1 is locked.
- * Returns:
- *    0 for success, -EPIPE if there is an I/O error talking to the server, or
- *    -EINVAL if 'client' is invalid.
- */
-int cras_client_set_system_capture_mute_locked(struct cras_client *client,
-					       int locked);
-
-/* Gets the current system volume.
- *
- * Requires that the connection to the server has been established.
- *
- * Args:
- *    client - The client from cras_client_create.
- * Returns:
- *    The current system volume between 0 and 100.
- */
-size_t cras_client_get_system_volume(const struct cras_client *client);
-
-/* Gets the current system mute state.
- *
- * Requires that the connection to the server has been established.
- *
- * Args:
- *    client - The client from cras_client_create.
- * Returns:
- *    0 if not muted, 1 if it is.
- */
-int cras_client_get_system_muted(const struct cras_client *client);
-
-/* Gets the current user mute state.
- *
- * Requires that the connection to the server has been established.
- *
- * Args:
- *    client - The client from cras_client_create.
- * Returns:
- *    0 if not muted, 1 if it is.
- */
-int cras_client_get_user_muted(const struct cras_client *client);
-
-/* Gets the current system capture mute state.
- *
- * Requires that the connection to the server has been established.
- *
- * Args:
- *    client - The client from cras_client_create.
- * Returns:
- *    0 if capture is not muted, 1 if it is.
- */
-int cras_client_get_system_capture_muted(const struct cras_client *client);
-
-/* Gets the current minimum system volume.
- * Args:
- *    client - The client from cras_client_create.
- * Returns:
- *    The minimum value for the current output device in dBFS * 100.  This is
- *    the level of attenuation at volume == 1.
- */
-long cras_client_get_system_min_volume(const struct cras_client *client);
-
-/* Gets the current maximum system volume.
- * Args:
- *    client - The client from cras_client_create.
- * Returns:
- *    The maximum value for the current output device in dBFS * 100.  This is
- *    the level of attenuation at volume == 100.
- */
-long cras_client_get_system_max_volume(const struct cras_client *client);
-
-/* Gets the default output buffer size.
- * Args:
- *    client - The client from cras_client_create.
- * Returns:
- *    Default output buffer size in frames. A negative error on failure.
- */
-int cras_client_get_default_output_buffer_size(struct cras_client *client);
-
-/* Gets audio debug info.
- *
- * Requires that the connection to the server has been established.
- * Access to the resulting pointer is not thread-safe.
- *
- * Args:
- *    client - The client from cras_client_create.
- * Returns:
- *    A pointer to the debug info.  This info is only updated when requested by
- *    calling cras_client_update_audio_debug_info.
- */
-const struct audio_debug_info *
-cras_client_get_audio_debug_info(const struct cras_client *client);
-
-/* Gets bluetooth debug info.
- *
- * Requires that the connection to the server has been established.
- *
- * Args:
- *    client - The client from cras_client_create.
- * Returns:
- *    A pointer to the debug info. This info is updated and requested by
- *    calling cras_client_update_bt_debug_info.
- */
-const struct cras_bt_debug_info *
-cras_client_get_bt_debug_info(const struct cras_client *client);
-
-/* Gets main thread debug info.
- * Args:
- *    client - The client from cras_client_create.
- * Returns:
- *    A pointer to the debug info. This info is updated and requested by
- *    calling cras_client_update_main_thread_debug_info.
- */
-const struct main_thread_debug_info *
-cras_client_get_main_thread_debug_info(const struct cras_client *client);
-
-/* Gets audio thread snapshot buffer.
- *
- * Requires that the connection to the server has been established.
- * Access to the resulting pointer is not thread-safe.
- *
- * Args:
- *    client - The client from cras_client_create.
- * Returns:
- *    A pointer to the snapshot buffer.  This info is only updated when
- *    requested by calling cras_client_update_audio_thread_snapshots.
- */
-const struct cras_audio_thread_snapshot_buffer *
-cras_client_get_audio_thread_snapshot_buffer(const struct cras_client *client);
-
-/* Gets the number of streams currently attached to the server.
- *
- * This is the total number of capture and playback streams. If the ts argument
- * is not null, then it will be filled with the last time audio was played or
- * recorded. ts will be set to the current time if streams are currently
- * active.
- *
- * Requires that the connection to the server has been established.
- *
- * Args:
- *    client - The client from cras_client_create.
- *    ts - Filled with the timestamp of the last stream.
- * Returns:
- *    The number of active streams.
- */
-unsigned cras_client_get_num_active_streams(const struct cras_client *client,
-					    struct timespec *ts);
-
-/*
- * Utility functions.
- */
-
-/* Returns the number of bytes in an audio frame for a stream.
- * Args:
- *    format - The format of the audio stream.  Specifies bits per sample,
- *        number of channels, and sample rate.
- * Returns:
- *   Positive number of bytes in a frame, or a negative error code if fmt is
- *   NULL.
- */
-int cras_client_format_bytes_per_frame(struct cras_audio_format *fmt);
-
-/* For playback streams, calculates the latency of the next sample written.
- * Only valid when called from the audio callback function for the stream
- * (aud_cb).
- * Args:
- *    sample_time - The sample time stamp passed in to aud_cb.
- *    delay - Out parameter will be filled with the latency.
- * Returns:
- *    0 on success, -EINVAL if delay is NULL.
- */
-int cras_client_calc_playback_latency(const struct timespec *sample_time,
-				      struct timespec *delay);
-
-/* For capture returns the latency of the next frame to be read from the buffer
- * (based on when it was captured).  Only valid when called from the audio
- * callback function for the stream (aud_cb).
- * Args:
- *    sample_time - The sample time stamp passed in to aud_cb.
- *    delay - Out parameter will be filled with the latency.
- * Returns:
- *    0 on success, -EINVAL if delay is NULL.
- */
-int cras_client_calc_capture_latency(const struct timespec *sample_time,
-				     struct timespec *delay);
-
-/* Set the volume of the given output node. Only for output nodes.
- *
- * Args:
- *    client - The client from cras_client_create.
- *    node_id - ID of the node.
- *    volume - New value for node volume.
- */
-int cras_client_set_node_volume(struct cras_client *client,
-				cras_node_id_t node_id, uint8_t volume);
-
-/* Swap the left and right channel of the given node.
- *
- * Args:
- *    client - The client from cras_client_create.
- *    node_id - ID of the node.
- *    enable - 1 to enable swap mode, 0 to disable.
- */
-int cras_client_swap_node_left_right(struct cras_client *client,
-				     cras_node_id_t node_id, int enable);
-
-/* Set the capture gain of the given input node.  Only for input nodes.
- *
- * Args:
- *    client - The client from cras_client_create.
- *    node_id - ID of the node.
- *    gain - New capture gain for the node, in range (0, 100) which will
- *        linearly maps to (-4000, 4000) 100*dBFS.
- */
-int cras_client_set_node_capture_gain(struct cras_client *client,
-				      cras_node_id_t node_id, long gain);
-
-/* Add a test iodev to the iodev list.
- *
- * Args:
- *    client - The client from cras_client_create.
- *    type - The type of test iodev, see cras_types.h
- */
-int cras_client_add_test_iodev(struct cras_client *client,
-			       enum TEST_IODEV_TYPE type);
-
-/* Send a test command to a test iodev.
- *
- * Args:
- *    client - The client from cras_client_create.
- *    iodev_idx - The index of the test iodev.
- *    command - The command to send.
- *    data_len - Length of command data.
- *    data - Command data.
- */
-int cras_client_test_iodev_command(struct cras_client *client,
-				   unsigned int iodev_idx,
-				   enum CRAS_TEST_IODEV_CMD command,
-				   unsigned int data_len, const uint8_t *data);
-
-/* Finds the first node of the given type.
- *
- * This is used for finding a special hotword node.
- *
- * Requires that the connection to the server has been established.
- *
- * Args:
- *    client - The client from cras_client_create.
- *    type - The type of device to find.
- *    direction - Search input or output devices.
- *    node_id - The found node on success.
- * Returns:
- *    0 on success, a negative error on failure.
- */
-int cras_client_get_first_node_type_idx(const struct cras_client *client,
-					enum CRAS_NODE_TYPE type,
-					enum CRAS_STREAM_DIRECTION direction,
-					cras_node_id_t *node_id);
-
-/* Finds the first device that contains a node of the given type.
- *
- * This is used for finding a special hotword device.
- *
- * Requires that the connection to the server has been established.
- *
- * Args:
- *    client - The client from cras_client_create.
- *    type - The type of device to find.
- *    direction - Search input or output devices.
- * Returns the device index of a negative error on failure.
- */
-int cras_client_get_first_dev_type_idx(const struct cras_client *client,
-				       enum CRAS_NODE_TYPE type,
-				       enum CRAS_STREAM_DIRECTION direction);
-
-/* Sets the suspend state of audio playback and capture.
- *
- * Set this before putting the system into suspend.
- *
- * Args:
- *    client - The client from cras_client_create.
- *    suspend - Suspend the system if non-zero, otherwise resume.
- */
-int cras_client_set_suspend(struct cras_client *client, int suspend);
-
-/* Configures the global converter for output remixing.
- *
- * Args:
- *    client - The client from cras_client_create.
- *    num_channels - Number of output channels.
- *    coefficient - Float array representing |num_channels| * |num_channels|
- *        matrix. Channels of mixed PCM output will be remixed by
- *        multiplying this matrix.
- */
-int cras_client_config_global_remix(struct cras_client *client,
-				    unsigned num_channels, float *coefficient);
-
-/* Gets the set of supported hotword language models on a node. The supported
- * models may differ on different nodes.
- *
- * Args:
- *    client - The client from cras_client_create.
- *    node_id - ID of a hotword input node (CRAS_NODE_TYPE_HOTWORD).
- *    cb - The function to be called when hotword models are ready.
- * Returns:
- *    0 on success.
- */
-int cras_client_get_hotword_models(struct cras_client *client,
-				   cras_node_id_t node_id,
-				   get_hotword_models_cb_t cb);
-
-/* Sets the hotword language model on a node. If there are existing streams on
- * the hotword input node when this function is called, they need to be closed
- * then re-opend for the model change to take effect.
- * Args:
- *    client - The client from cras_client_create.
- *    node_id - ID of a hotword input node (CRAS_NODE_TYPE_HOTWORD).
- *    model_name - Name of the model to use, e.g. "en_us".
- * Returns:
- *    0 on success.
- *    -EINVAL if client or node_id is invalid.
- *    -ENOENT if the specified model is not found.
- */
-int cras_client_set_hotword_model(struct cras_client *client,
-				  cras_node_id_t node_id,
-				  const char *model_name);
-
-/*
- * Creates a hotword stream and waits for the hotword to trigger.
- *
- * Args:
- *    client - The client to add the stream to (from cras_client_create).
- *    user_data - Pointer that will be passed to the callback.
- *    trigger_cb - Called when a hotword is triggered.
- *    err_cb - Called when there is an error with the stream.
- *    handle_out - On success will be filled with a cras_hotword_handle.
- * Returns:
- *    0 on success, negative error code on failure (from errno.h).
- */
-int cras_client_enable_hotword_callback(
-	struct cras_client *client, void *user_data,
-	cras_hotword_trigger_cb_t trigger_cb, cras_hotword_error_cb_t err_cb,
-	struct cras_hotword_handle **handle_out);
-
-/*
- * Closes a hotword stream that was created by cras_client_wait_for_hotword.
- *
- * Args:
- *    client - Client to remove the stream (returned from cras_client_create).
- *    handle - cras_hotword_handle returned from cras_client_wait_for_hotword.
- * Returns:
- *    0 on success negative error code on failure (from errno.h).
- */
-int cras_client_disable_hotword_callback(struct cras_client *client,
-					 struct cras_hotword_handle *handle);
-
-/* Starts or stops the aec dump task on server side.
- * Args:
- *    client - The client from cras_client_create.
- *    stream_id - The id of the input stream running with aec effect.
- *    start - True to start APM debugging, otherwise to stop it.
- *    fd - File descriptor of the file to store aec dump result.
- */
-int cras_client_set_aec_dump(struct cras_client *client,
-			     cras_stream_id_t stream_id, int start, int fd);
-/*
- * Reloads the aec.ini config file on server side.
- */
-int cras_client_reload_aec_config(struct cras_client *client);
-
-/*
- * Returns if AEC is supported.
- */
-int cras_client_get_aec_supported(struct cras_client *client);
-
-/*
- * Returns the AEC group ID if available.
- */
-int cras_client_get_aec_group_id(struct cras_client *client);
-
-/*
- * Sets the flag to enable bluetooth wideband speech in server.
- */
-int cras_client_set_bt_wbs_enabled(struct cras_client *client, bool enabled);
-
-/* Set the context pointer for system state change callbacks.
- * Args:
- *    client - The client from cras_client_create.
- *    context - The context pointer passed to all callbacks.
- */
-void cras_client_set_state_change_callback_context(struct cras_client *client,
-						   void *context);
-
-/* Output volume change callback.
- *
- * Args:
- *    context - Context pointer set with
- *              cras_client_set_state_change_callback_context().
- *    volume - The system output volume, ranging from 0 to 100.
- */
-typedef void (*cras_client_output_volume_changed_callback)(void *context,
-							   int32_t volume);
-
-/* Output mute change callback.
- *
- * Args:
- *    context - Context pointer set with
- *              cras_client_set_state_change_callback_context().
- *    muted - Non-zero when the audio is muted, zero otherwise.
- *    user_muted - Non-zero when the audio has been muted by the
- *                 user, zero otherwise.
- *    mute_locked - Non-zero when the mute funcion is locked,
- *                  zero otherwise.
- */
-typedef void (*cras_client_output_mute_changed_callback)(void *context,
-							 int muted,
-							 int user_muted,
-							 int mute_locked);
-
-/* Capture gain change callback.
- *
- * Args:
- *    context - Context pointer set with
- *              cras_client_set_state_change_callback_context().
- *    gain - The system capture gain, in centi-decibels.
- */
-typedef void (*cras_client_capture_gain_changed_callback)(void *context,
-							  int32_t gain);
-
-/* Capture mute change callback.
- *
- * Args:
- *    context - Context pointer set with
- *              cras_client_set_state_change_callback_context().
- *    muted - Non-zero when the audio is muted, zero otherwise.
- *    mute_locked - Non-zero when the mute funcion is locked,
- *                  zero otherwise.
- */
-typedef void (*cras_client_capture_mute_changed_callback)(void *context,
-							  int muted,
-							  int mute_locked);
-
-/* Nodes change callback.
- *
- * Args:
- *    context - Context pointer set with
- *              cras_client_set_state_change_callback_context().
- */
-typedef void (*cras_client_nodes_changed_callback)(void *context);
-
-/* Active node change callback.
- *
- * Args:
- *    context - Context pointer set with
- *              cras_client_set_state_change_callback_context().
- *    direction - Indicates the direction of the selected node.
- *    node_id - The ID of the selected node. Special device ID values
- *              defined by CRAS_SPECIAL_DEVICE will be used when no other
- *              device or node is selected or between selections.
- */
-typedef void (*cras_client_active_node_changed_callback)(
-	void *context, enum CRAS_STREAM_DIRECTION direction,
-	cras_node_id_t node_id);
-
-/* Output node volume change callback.
- *
- * Args:
- *    context - Context pointer set with
- *              cras_client_set_state_change_callback_context().
- *    node_id - The ID of the output node.
- *    volume - The volume for this node with range 0 to 100.
- */
-typedef void (*cras_client_output_node_volume_changed_callback)(
-	void *context, cras_node_id_t node_id, int32_t volume);
-
-/* Node left right swapped change callback.
- *
- * Args:
- *    context - Context pointer set with
- *              cras_client_set_state_change_callback_context().
- *    node_id - The ID of the node.
- *    swapped - Non-zero if the node is left-right swapped, zero otherwise.
- */
-typedef void (*cras_client_node_left_right_swapped_changed_callback)(
-	void *context, cras_node_id_t node_id, int swapped);
-
-/* Input node gain change callback.
- * Args:
- *    context - Context pointer set with
- *              cras_client_set_state_change_callback_context().
- *    node_id - The ID of the input node.
- *    gain - The gain for this node in centi-decibels.
- */
-typedef void (*cras_client_input_node_gain_changed_callback)(
-	void *context, cras_node_id_t node_id, int32_t gain);
-
-/* Number of active streams change callback.
- *
- * Args:
- *    context - Context pointer set with
- *              cras_client_set_state_change_callback_context().
- *    direction - Indicates the direction of the stream's node.
- *    num_active_streams - The number of active streams.
- */
-typedef void (*cras_client_num_active_streams_changed_callback)(
-	void *context, enum CRAS_STREAM_DIRECTION direction,
-	uint32_t num_active_streams);
-
-/* Set system state information callbacks.
- * NOTE: These callbacks are executed from the client control thread.
- * Each state change callback is given the context pointer set with
- * cras_client_set_state_change_callback_context(). The context pointer is
- * NULL by default.
- * Args:
- *    client - The client from cras_client_create.
- *    cb - The callback, or NULL to disable the call-back.
- * Returns:
- *    0 for success or negative errno error code on error.
- */
-int cras_client_set_output_volume_changed_callback(
-	struct cras_client *client,
-	cras_client_output_volume_changed_callback cb);
-int cras_client_set_output_mute_changed_callback(
-	struct cras_client *client,
-	cras_client_output_mute_changed_callback cb);
-int cras_client_set_capture_gain_changed_callback(
-	struct cras_client *client,
-	cras_client_capture_gain_changed_callback cb);
-int cras_client_set_capture_mute_changed_callback(
-	struct cras_client *client,
-	cras_client_capture_mute_changed_callback cb);
-int cras_client_set_nodes_changed_callback(
-	struct cras_client *client, cras_client_nodes_changed_callback cb);
-int cras_client_set_active_node_changed_callback(
-	struct cras_client *client,
-	cras_client_active_node_changed_callback cb);
-int cras_client_set_output_node_volume_changed_callback(
-	struct cras_client *client,
-	cras_client_output_node_volume_changed_callback cb);
-int cras_client_set_node_left_right_swapped_changed_callback(
-	struct cras_client *client,
-	cras_client_node_left_right_swapped_changed_callback cb);
-int cras_client_set_input_node_gain_changed_callback(
-	struct cras_client *client,
-	cras_client_input_node_gain_changed_callback cb);
-int cras_client_set_num_active_streams_changed_callback(
-	struct cras_client *client,
-	cras_client_num_active_streams_changed_callback cb);
-
-/*
- * The functions below prefixed with libcras wrap the original CRAS library
- * They provide an interface that maps the pointers to the functions above.
- * Please add a new function instead of modifying the existing function.
- * Here are some rules about how to add a new function:
- * 1. Increase the CRAS_API_VERSION by 1.
- * 2. Write a new function in cras_client.c.
- * 3. Append the corresponding pointer to the structure. Remeber DO NOT change
- *    the order of functions in the structs.
- * 4. Assign the pointer to the new function in cras_client.c.
- * 5. Create the inline function in cras_client.h, which is used by clients.
- *    Remember to add DISABLE_CFI_ICALL on the inline function.
- * 6. Add CHECK_VERSION in the inline function. If the api_version is smaller
- *    than the supported version, this inline function will return -ENOSYS.
- */
-
-#define CRAS_API_VERSION 1
-#define CHECK_VERSION(object, version)                                         \
-	if (object->api_version < version) {                                   \
-		return -ENOSYS;                                                \
-	}
-
-/*
- * The inline functions use the indirect function call. Therefore, they are
- * incompatible with CFI-icall.
- */
-#define DISABLE_CFI_ICALL __attribute__((no_sanitize("cfi-icall")))
-
-struct libcras_node_info {
-	int api_version;
-	struct cras_node_info *node_;
-	int (*get_id)(struct cras_node_info *node, uint64_t *id);
-	int (*get_dev_idx)(struct cras_node_info *node, uint32_t *dev_idx);
-	int (*get_node_idx)(struct cras_node_info *node, uint32_t *node_idx);
-	int (*get_max_supported_channels)(struct cras_node_info *node,
-					  uint32_t *max_supported_channels);
-	int (*is_plugged)(struct cras_node_info *node, bool *plugged);
-	int (*is_active)(struct cras_node_info *node, bool *active);
-	int (*get_type)(struct cras_node_info *node, char **name);
-	int (*get_node_name)(struct cras_node_info *node, char **name);
-	int (*get_dev_name)(struct cras_node_info *node, char **name);
-};
-
-struct libcras_client {
-	int api_version;
-	struct cras_client *client_;
-	int (*connect)(struct cras_client *client);
-	int (*connect_timeout)(struct cras_client *client,
-			       unsigned int timeout_ms);
-	int (*connected_wait)(struct cras_client *client);
-	int (*run_thread)(struct cras_client *client);
-	int (*stop)(struct cras_client *client);
-	int (*add_pinned_stream)(struct cras_client *client, uint32_t dev_idx,
-				 cras_stream_id_t *stream_id_out,
-				 struct cras_stream_params *config);
-	int (*rm_stream)(struct cras_client *client,
-			 cras_stream_id_t stream_id);
-	int (*set_stream_volume)(struct cras_client *client,
-				 cras_stream_id_t stream_id,
-				 float volume_scaler);
-	int (*get_nodes)(struct cras_client *client,
-			 enum CRAS_STREAM_DIRECTION direction,
-			 struct libcras_node_info ***nodes, size_t *num);
-	int (*get_default_output_buffer_size)(struct cras_client *client,
-					      int *size);
-	int (*get_aec_group_id)(struct cras_client *client, int *id);
-	int (*get_aec_supported)(struct cras_client *client, int *supported);
-	int (*get_system_muted)(struct cras_client *client, int *muted);
-	int (*set_system_mute)(struct cras_client *client, int mute);
-	int (*get_loopback_dev_idx)(struct cras_client *client, int *idx);
-};
-
-struct cras_stream_cb_data;
-struct libcras_stream_cb_data {
-	int api_version;
-	struct cras_stream_cb_data *data_;
-	int (*get_stream_id)(struct cras_stream_cb_data *data,
-			     cras_stream_id_t *id);
-	int (*get_buf)(struct cras_stream_cb_data *data, uint8_t **buf);
-	int (*get_frames)(struct cras_stream_cb_data *data,
-			  unsigned int *frames);
-	int (*get_latency)(struct cras_stream_cb_data *data,
-			   struct timespec *latency);
-	int (*get_user_arg)(struct cras_stream_cb_data *data, void **user_arg);
-};
-typedef int (*libcras_stream_cb_t)(struct libcras_stream_cb_data *data);
-
-struct libcras_stream_params {
-	int api_version;
-	struct cras_stream_params *params_;
-	int (*set)(struct cras_stream_params *params,
-		   enum CRAS_STREAM_DIRECTION direction, size_t buffer_frames,
-		   size_t cb_threshold, enum CRAS_STREAM_TYPE stream_type,
-		   enum CRAS_CLIENT_TYPE client_type, uint32_t flags,
-		   void *user_data, libcras_stream_cb_t stream_cb,
-		   cras_error_cb_t err_cb, size_t rate, snd_pcm_format_t format,
-		   size_t num_channels);
-	int (*set_channel_layout)(struct cras_stream_params *params, int length,
-				  const int8_t *layout);
-	void (*enable_aec)(struct cras_stream_params *params);
-};
-
-/*
- * Creates a new client.
- * Returns:
- *    If success, return a valid libcras_client pointer. Otherwise, return
- *    NULL.
- */
-struct libcras_client *libcras_client_create();
-
-/*
- * Destroys a client.
- * Args:
- *    client - pointer returned from "libcras_client_create".
- */
-void libcras_client_destroy(struct libcras_client *client);
-
-/*
- * Connects a client to the running server.
- * Waits forever (until interrupted or connected).
- * Args:
- *    client - pointer returned from "libcras_client_create".
- * Returns:
- *    0 on success, or a negative error code on failure (from errno.h).
- */
-DISABLE_CFI_ICALL
-inline int libcras_client_connect(struct libcras_client *client)
-{
-	return client->connect(client->client_);
-}
-
-/*
- * Connects a client to the running server, retries until timeout.
- * Args:
- *    client - pointer returned from "libcras_client_create".
- *    timeout_ms - timeout in milliseconds or negative to wait forever.
- * Returns:
- *    0 on success, or a negative error code on failure (from errno.h).
- */
-DISABLE_CFI_ICALL
-inline int libcras_client_connect_timeout(struct libcras_client *client,
-					  unsigned int timeout_ms)
-{
-	return client->connect_timeout(client->client_, timeout_ms);
-}
-
-/*
- * Wait up to 1 second for the client thread to complete the server connection.
- *
- * After libcras_client_run_thread() is executed, this function can be
- * used to ensure that the connection has been established with the server and
- * ensure that any information about the server is up to date. If
- * libcras_client_run_thread() has not yet been executed, or
- * libcras_client_stop() was executed and thread isn't running, then this
- * function returns -EINVAL.
- *
- * Args:
- *    client - pointer returned from "libcras_client_create".
- * Returns:
- *    0 on success, or a negative error code on failure (from errno.h).
- */
-DISABLE_CFI_ICALL
-inline int libcras_client_connected_wait(struct libcras_client *client)
-{
-	return client->connected_wait(client->client_);
-}
-
-/*
- * Begins running the client control thread.
- *
- * Required for stream operations and other operations noted below.
- *
- * Args:
- *    client - pointer returned from "libcras_client_create".
- * Returns:
- *    0 on success, or a negative error code on failure (from errno.h).
- */
-DISABLE_CFI_ICALL
-inline int libcras_client_run_thread(struct libcras_client *client)
-{
-	return client->run_thread(client->client_);
-}
-
-/*
- * Stops running a client.
- * This function is executed automatically by cras_client_destroy().
- * Args:
- *    client - pointer returned from "libcras_client_create".
- * Returns:
- *    0 on success or if the thread was already stopped, -EINVAL if the client
- *    isn't valid.
- */
-DISABLE_CFI_ICALL
-inline int libcras_client_stop(struct libcras_client *client)
-{
-	return client->stop(client->client_);
-}
-
-/*
- * Creates a pinned stream and return the stream id or < 0 on error.
- *
- * Requires execution of libcras_client_run_thread(), and an active
- * connection to the audio server.
- *
- * Args:
- *    client - pointer returned from "libcras_client_create".
- *    dev_idx - Index of the device to attach the newly created stream.
- *    stream_id_out - On success will be filled with the new stream id.
- *        Guaranteed to be set before any callbacks are made.
- *    params - The pointer specifying the parameters for the stream.
- *        (returned from libcras_stream_params_create)
- * Returns:
- *    0 on success, negative error code on failure (from errno.h).
- */
-DISABLE_CFI_ICALL
-inline int libcras_client_add_pinned_stream(
-	struct libcras_client *client, uint32_t dev_idx,
-	cras_stream_id_t *stream_id_out, struct libcras_stream_params *params)
-{
-	return client->add_pinned_stream(client->client_, dev_idx,
-					 stream_id_out, params->params_);
-}
-
-/*
- * Removes a currently playing/capturing stream.
- *
- * Requires execution of libcras_client_run_thread().
- *
- * Args:
- *    client - pointer returned from "libcras_client_create".
- *    stream_id - ID returned from libcras_client_add_stream to identify
- *        the stream to remove.
- * Returns:
- *    0 on success negative error code on failure (from errno.h).
- */
-DISABLE_CFI_ICALL
-inline int libcras_client_rm_stream(struct libcras_client *client,
-				    cras_stream_id_t stream_id)
-{
-	return client->rm_stream(client->client_, stream_id);
-}
-
-/*
- * Sets the volume scaling factor for the given stream.
- *
- * Requires execution of cras_client_run_thread().
- *
- * Args:
- *    client - pointer returned from "libcras_client_create".
- *    stream_id - ID returned from libcras_client_add_stream.
- *    volume_scaler - 0.0-1.0 the new value to scale this stream by.
- * Returns:
- *    0 on success negative error code on failure (from errno.h).
- */
-DISABLE_CFI_ICALL
-inline int libcras_client_set_stream_volume(struct libcras_client *client,
-					    cras_stream_id_t stream_id,
-					    float volume_scaler)
-{
-	return client->set_stream_volume(client->client_, stream_id,
-					 volume_scaler);
-}
-
-/*
- * Gets the current list of audio nodes.
- *
- * Args:
- *    client - Pointer returned from "libcras_client_create".
- *    direction - Input or output.
- *    nodes - Array that will be filled with libcras_node_info pointers.
- *    num - Pointer to store the size of the array.
- * Returns:
- *    0 on success negative error code on failure (from errno.h).
- *    Remember to call libcras_node_info_array_destroy to free the array.
- */
-DISABLE_CFI_ICALL
-inline int libcras_client_get_nodes(struct libcras_client *client,
-				    enum CRAS_STREAM_DIRECTION direction,
-				    struct libcras_node_info ***nodes,
-				    size_t *num)
-{
-	return client->get_nodes(client->client_, direction, nodes, num);
-}
-
-/*
- * Gets the default output buffer size.
- * Args:
- *    client - Pointer returned from "libcras_client_create".
- *    size - The pointer to save the result.
- * Returns:
- *    0 on success negative error code on failure (from errno.h).
- */
-DISABLE_CFI_ICALL
-inline int
-libcras_client_get_default_output_buffer_size(struct libcras_client *client,
-					      int *size)
-{
-	return client->get_default_output_buffer_size(client->client_, size);
-}
-
-/*
- * Gets the AEC group ID.
- * Args:
- *    client - Pointer returned from "libcras_client_create".
- *    id - The pointer to save the result.
- * Returns:
- *    0 on success negative error code on failure (from errno.h).
- */
-DISABLE_CFI_ICALL
-inline int libcras_client_get_aec_group_id(struct libcras_client *client,
-					   int *id)
-{
-	return client->get_aec_group_id(client->client_, id);
-}
-
-/*
- * Gets whether AEC is supported.
- * Args:
- *    client - Pointer returned from "libcras_client_create".
- *    supported - The pointer to save the result.
- * Returns:
- *    0 on success negative error code on failure (from errno.h).
- */
-DISABLE_CFI_ICALL
-inline int libcras_client_get_aec_supported(struct libcras_client *client,
-					    int *supported)
-{
-	return client->get_aec_supported(client->client_, supported);
-}
-
-/*
- * Gets whether the system is muted.
- * Args:
- *    client - Pointer returned from "libcras_client_create".
- *    muted - The pointer to save the result.
- * Returns:
- *    0 on success negative error code on failure (from errno.h).
- */
-DISABLE_CFI_ICALL
-inline int libcras_client_get_system_muted(struct libcras_client *client,
-					   int *muted)
-{
-	return client->get_aec_group_id(client->client_, muted);
-}
-
-/*
- * Mutes or unmutes the system.
- * Args:
- *    client - Pointer returned from "libcras_client_create".
- *    mute - 1 is to mute and 0 is to unmute.
- * Returns:
- *    0 on success negative error code on failure (from errno.h).
- */
-DISABLE_CFI_ICALL
-inline int libcras_client_set_system_mute(struct libcras_client *client,
-					  int mute)
-{
-	return client->set_system_mute(client->client_, mute);
-}
-
-/*
- * Gets the index of the loopback device.
- * Args:
- *    client - Pointer returned from "libcras_client_create".
- *    idx - The pointer to save the result.
- * Returns:
- *    0 on success negative error code on failure (from errno.h).
- */
-DISABLE_CFI_ICALL
-inline int libcras_client_get_loopback_dev_idx(struct libcras_client *client,
-					       int *idx)
-{
-	return client->get_loopback_dev_idx(client->client_, idx);
-}
-
-/*
- * Creates a new struct to save stream params.
- * Returns:
- *    If success, return a valid libcras_stream_params pointer. Otherwise,
- *    return NULL.
- */
-struct libcras_stream_params *libcras_stream_params_create();
-
-/*
- * Destroys a stream params instance.
- * Args:
- *    params - The pointer returned from libcras_stream_params_create.
- */
-void libcras_stream_params_destroy(struct libcras_stream_params *params);
-
-/*
- * Setup stream configuration parameters.
- * Args:
- *    params - The pointer returned from libcras_stream_params_create.
- *    direction - Playback(CRAS_STREAM_OUTPUT) or capture(CRAS_STREAM_INPUT).
- *    buffer_frames - total number of audio frames to buffer (dictates latency).
- *    cb_threshold - For playback, call back for more data when the buffer
- *        reaches this level. For capture, this is ignored (Audio callback will
- *        be called when buffer_frames have been captured).
- *    stream_type - Media or talk (currently only support "default").
- *    client_type - The client type, like Chrome or CrOSVM.
- *    flags - Currently only used for CRAS_INPUT_STREAM_FLAG.
- *    user_data - Pointer that will be passed to the callback.
- *    stream_cb - The audio callback. Called when audio is needed(playback) or
- *        ready(capture).
- *    err_cb - Called when there is an error with the stream.
- *    rate - The sample rate of the audio stream.
- *    format - The format of the audio stream.
- *    num_channels - The number of channels of the audio stream.
- * Returns:
- *    0 on success negative error code on failure (from errno.h).
- */
-DISABLE_CFI_ICALL
-inline int libcras_stream_params_set(
-	struct libcras_stream_params *params,
-	enum CRAS_STREAM_DIRECTION direction, size_t buffer_frames,
-	size_t cb_threshold, enum CRAS_STREAM_TYPE stream_type,
-	enum CRAS_CLIENT_TYPE client_type, uint32_t flags, void *user_data,
-	libcras_stream_cb_t stream_cb, cras_error_cb_t err_cb, size_t rate,
-	snd_pcm_format_t format, size_t num_channels)
-{
-	return params->set(params->params_, direction, buffer_frames,
-			   cb_threshold, stream_type, client_type, flags,
-			   user_data, stream_cb, err_cb, rate, format,
-			   num_channels);
-}
-
-/*
- * Sets channel layout on given stream parameter.
- * Args:
- *    params - The pointer returned from libcras_stream_params_create.
- *    length - The length of the array.
- *    layout - An integer array representing the position of each channel in
- *    enum CRAS_CHANNEL.
- * Returns:
- *    0 on success negative error code on failure (from errno.h).
- */
-DISABLE_CFI_ICALL
-inline int
-libcras_stream_params_set_channel_layout(struct libcras_stream_params *params,
-					 int length, const int8_t *layout)
-{
-	return params->set_channel_layout(params->params_, length, layout);
-}
-
-/*
- * Enables AEC on given stream parameter.
- * Args:
- *    params - The pointer returned from libcras_stream_params_create.
- * Returns:
- *    0 on success negative error code on failure (from errno.h).
- */
-DISABLE_CFI_ICALL
-inline int
-libcras_stream_params_enable_aec(struct libcras_stream_params *params)
-{
-	params->enable_aec(params->params_);
-	return 0;
-}
-
-/*
- * Gets stream id from the callback data.
- * Args:
- *    data - The pointer passed to the callback function.
- *    id - The pointer to save the stream id.
- * Returns:
- *    0 on success negative error code on failure (from errno.h).
- */
-DISABLE_CFI_ICALL
-inline int
-libcras_stream_cb_data_get_stream_id(struct libcras_stream_cb_data *data,
-				     cras_stream_id_t *id)
-{
-	return data->get_stream_id(data->data_, id);
-}
-
-/*
- * Gets stream buf from the callback data.
- * Args:
- *    data - The pointer passed to the callback function.
- *    buf - The pointer to save the stream buffer.
- * Returns:
- *    0 on success negative error code on failure (from errno.h).
- */
-DISABLE_CFI_ICALL
-inline int libcras_stream_cb_data_get_buf(struct libcras_stream_cb_data *data,
-					  uint8_t **buf)
-{
-	return data->get_buf(data->data_, buf);
-}
-
-/*
- * Gets how many frames to read or play from the callback data.
- * Args:
- *    data - The pointer passed to the callback function.
- *    frames - The pointer to save the number of frames.
- * Returns:
- *    0 on success negative error code on failure (from errno.h).
- */
-DISABLE_CFI_ICALL
-inline int
-libcras_stream_cb_data_get_frames(struct libcras_stream_cb_data *data,
-				  unsigned int *frames)
-{
-	return data->get_frames(data->data_, frames);
-}
-
-/*
- * Gets the latency from the callback data.
- * Args:
- *    data - The pointer passed to the callback function.
- *    frames - The timespec pointer to save the latency.
- * Returns:
- *    0 on success negative error code on failure (from errno.h).
- */
-DISABLE_CFI_ICALL
-inline int
-libcras_stream_cb_data_get_latency(struct libcras_stream_cb_data *data,
-				   struct timespec *latency)
-{
-	return data->get_latency(data->data_, latency);
-}
-
-/*
- * Gets the user data from the callback data.
- * Args:
- *    data - The pointer passed to the callback function.
- *    frames - The pointer to save the user data.
- * Returns:
- *    0 on success negative error code on failure (from errno.h).
- */
-DISABLE_CFI_ICALL
-inline int
-libcras_stream_cb_data_get_usr_arg(struct libcras_stream_cb_data *data,
-				   void **user_arg)
-{
-	return data->get_user_arg(data->data_, user_arg);
-}
-
-/*
- * Destroys a node info instance.
- * Args:
- *    node - The libcras_node_info pointer to destroy.
- */
-void libcras_node_info_destroy(struct libcras_node_info *node);
-
-/*
- * Destroys a node info array.
- * Args:
- *    nodes - The libcras_node_info pointer array to destroy.
- *    num - The size of the array.
- */
-void libcras_node_info_array_destroy(struct libcras_node_info **nodes,
-				     size_t num);
-
-/*
- * Gets ID from the node info pointer.
- * Args:
- *    node - The node info pointer. (Returned from libcras_client_get_nodes)
- *    id - The pointer to save ID.
- * Returns:
- *    0 on success negative error code on failure (from errno.h).
- */
-DISABLE_CFI_ICALL
-inline int libcras_node_info_get_id(struct libcras_node_info *node,
-				    uint64_t *id)
-{
-	return node->get_id(node->node_, id);
-}
-
-/*
- * Gets device index from the node info pointer.
- * Args:
- *    node - The node info pointer. (Returned from libcras_client_get_nodes)
- *    dev_idx - The pointer to the device index.
- * Returns:
- *    0 on success negative error code on failure (from errno.h).
- */
-DISABLE_CFI_ICALL
-inline int libcras_node_info_get_dev_idx(struct libcras_node_info *node,
-					 uint32_t *dev_idx)
-{
-	return node->get_dev_idx(node->node_, dev_idx);
-}
-
-/*
- * Gets node index from the node info pointer.
- * Args:
- *    node - The node info pointer. (Returned from libcras_client_get_nodes)
- *    node_idx - The pointer to save the node index.
- * Returns:
- *    0 on success negative error code on failure (from errno.h).
- */
-DISABLE_CFI_ICALL
-inline int libcras_node_info_get_node_idx(struct libcras_node_info *node,
-					  uint32_t *node_idx)
-{
-	return node->get_node_idx(node->node_, node_idx);
-}
-
-/*
- * Gets the max supported channels from the node info pointer.
- * Args:
- *    node - The node info pointer. (Returned from libcras_client_get_nodes)
- *    max_supported_channels - The pointer to save the result.
- * Returns:
- *    0 on success negative error code on failure (from errno.h).
- */
-DISABLE_CFI_ICALL
-inline int
-libcras_node_info_get_max_supported_channels(struct libcras_node_info *node,
-					     uint32_t *max_supported_channels)
-{
-	return node->get_max_supported_channels(node->node_,
-						max_supported_channels);
-}
-
-/*
- * Gets whether the node is plugged from the node info pointer.
- * Args:
- *    node - The node info pointer. (Returned from libcras_client_get_nodes)
- *    plugged - The pointer to save the result.
- * Returns:
- *    0 on success negative error code on failure (from errno.h).
- */
-DISABLE_CFI_ICALL
-inline int libcras_node_info_is_plugged(struct libcras_node_info *node,
-					bool *plugged)
-{
-	return node->is_plugged(node->node_, plugged);
-}
-
-/*
- * Gets whether the node is active from the node info pointer.
- * Args:
- *    node - The node info pointer. (Returned from libcras_client_get_nodes)
- *    active - The pointer to save the result.
- * Returns:
- *    0 on success negative error code on failure (from errno.h).
- */
-DISABLE_CFI_ICALL
-inline int libcras_node_info_is_active(struct libcras_node_info *node,
-				       bool *active)
-{
-	return node->is_active(node->node_, active);
-}
-
-/*
- * Gets device type from the node info pointer.
- * Args:
- *    node - The node info pointer. (Returned from libcras_client_get_nodes)
- *    type - The pointer to save the device type.
- * Returns:
- *    0 on success negative error code on failure (from errno.h).
- */
-DISABLE_CFI_ICALL
-inline int libcras_node_info_get_type(struct libcras_node_info *node,
-				      char **type)
-{
-	return node->get_type(node->node_, type);
-}
-
-/*
- * Gets device name from the node info pointer.
- * Args:
- *    node - The node info pointer. (Returned from libcras_client_get_nodes)
- *    name - The pointer to save the device name.
- * Returns:
- *    0 on success negative error code on failure (from errno.h).
- */
-DISABLE_CFI_ICALL
-inline int libcras_node_info_get_node_name(struct libcras_node_info *node,
-					   char **name)
-{
-	return node->get_node_name(node->node_, name);
-}
-
-/*
- * Gets node name from the node info pointer.
- * Args:
- *    node - The node info pointer. (Returned from libcras_client_get_nodes)
- *    name - The pointer to save the node name.
- * Returns:
- *    0 on success negative error code on failure (from errno.h).
- */
-DISABLE_CFI_ICALL
-inline int libcras_node_info_get_dev_name(struct libcras_node_info *node,
-					  char **name)
-{
-	return node->get_dev_name(node->node_, name);
-}
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* CRAS_CLIENT_H_ */
diff --git a/cras/src/libcras/cras_helpers.c b/cras/src/libcras/cras_helpers.c
deleted file mode 100644
index a2120ea..0000000
--- a/cras/src/libcras/cras_helpers.c
+++ /dev/null
@@ -1,159 +0,0 @@
-/* Copyright 2015 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <errno.h>
-#include <stdint.h>
-#include <sys/param.h>
-
-#include "cras_client.h"
-#include "cras_util.h"
-
-struct buffer_data {
-	const uint8_t *buffer;
-	unsigned int offset;
-	unsigned int frame_bytes;
-	unsigned int len;
-};
-
-static int
-play_buffer_callback(struct cras_client *client, cras_stream_id_t stream_id,
-		     uint8_t *captured_samples, uint8_t *playback_samples,
-		     unsigned int frames, const struct timespec *captured_time,
-		     const struct timespec *playback_time, void *user_arg)
-{
-	struct buffer_data *data = (struct buffer_data *)user_arg;
-	int to_copy = data->len - data->offset;
-
-	if (to_copy <= 0) {
-		free(user_arg);
-		return EOF;
-	}
-
-	to_copy = MIN(to_copy, frames * data->frame_bytes);
-
-	memcpy(playback_samples, data->buffer + data->offset, to_copy);
-
-	data->offset += to_copy;
-
-	return to_copy / data->frame_bytes;
-}
-
-static int play_buffer_error(struct cras_client *client,
-			     cras_stream_id_t stream_id, int error,
-			     void *user_arg)
-{
-	free(user_arg);
-	return 0;
-}
-
-int cras_helper_create_connect_async(struct cras_client **client,
-				     cras_connection_status_cb_t connection_cb,
-				     void *user_arg)
-{
-	int rc;
-
-	rc = cras_client_create(client);
-	if (rc < 0)
-		return rc;
-
-	cras_client_set_connection_status_cb(*client, connection_cb, user_arg);
-
-	rc = cras_client_run_thread(*client);
-	if (rc < 0)
-		goto client_start_error;
-
-	rc = cras_client_connect_async(*client);
-	if (rc < 0)
-		goto client_start_error;
-
-	return 0;
-
-client_start_error:
-	cras_client_destroy(*client);
-	return rc;
-}
-
-int cras_helper_create_connect(struct cras_client **client)
-{
-	int rc;
-
-	rc = cras_client_create(client);
-	if (rc < 0)
-		return rc;
-
-	rc = cras_client_connect(*client);
-	if (rc < 0)
-		goto client_start_error;
-
-	rc = cras_client_run_thread(*client);
-	if (rc < 0)
-		goto client_start_error;
-
-	rc = cras_client_connected_wait(*client);
-	if (rc < 0)
-		goto client_start_error;
-
-	return 0;
-
-client_start_error:
-	cras_client_destroy(*client);
-	return rc;
-}
-
-int cras_helper_add_stream_simple(
-	struct cras_client *client, enum CRAS_STREAM_DIRECTION direction,
-	void *user_data, cras_unified_cb_t unified_cb, cras_error_cb_t err_cb,
-	snd_pcm_format_t format, unsigned int frame_rate,
-	unsigned int num_channels, int dev_idx, cras_stream_id_t *stream_id_out)
-{
-	struct cras_audio_format *aud_format;
-	struct cras_stream_params *params;
-	int rc;
-
-	aud_format = cras_audio_format_create(format, frame_rate, num_channels);
-	if (!aud_format)
-		return -ENOMEM;
-
-	params = cras_client_unified_params_create(CRAS_STREAM_OUTPUT, 2048,
-						   CRAS_STREAM_TYPE_DEFAULT, 0,
-						   user_data, unified_cb,
-						   err_cb, aud_format);
-	if (!params) {
-		rc = -ENOMEM;
-		goto done_add_stream;
-	}
-
-	if (dev_idx < 0)
-		dev_idx = NO_DEVICE;
-	rc = cras_client_add_pinned_stream(client, dev_idx, stream_id_out,
-					   params);
-
-done_add_stream:
-	cras_audio_format_destroy(aud_format);
-	cras_client_stream_params_destroy(params);
-	return rc;
-}
-
-int cras_helper_play_buffer(struct cras_client *client, const void *buffer,
-			    unsigned int frames, snd_pcm_format_t format,
-			    unsigned int frame_rate, unsigned int num_channels,
-			    int dev_idx)
-{
-	struct buffer_data *data;
-	cras_stream_id_t stream_id;
-
-	data = malloc(sizeof(*data));
-
-	data->buffer = buffer;
-	data->frame_bytes = num_channels * PCM_FORMAT_WIDTH(format) / 8;
-	data->offset = 0;
-	data->len = frames * data->frame_bytes;
-
-	return cras_helper_add_stream_simple(client, CRAS_STREAM_OUTPUT, data,
-					     play_buffer_callback,
-					     play_buffer_error, format,
-					     frame_rate, num_channels, dev_idx,
-					     &stream_id);
-}
diff --git a/cras/src/libcras/cras_helpers.h b/cras/src/libcras/cras_helpers.h
deleted file mode 100644
index 604b266..0000000
--- a/cras/src/libcras/cras_helpers.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/* Copyright 2015 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-#ifndef _CRAS_HELPERS_H
-#define _CRAS_HELPERS_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Creates and connects a client to the running server asynchronously.
- *
- * When the connection has been established the connection_cb is executed
- * with the appropriate state. See cras_connection_status_cb_t for more
- * information.
- *
- * Args:
- *    client - Filled with a pointer to the new client.
- *    connection_cb - The connection status callback function.
- *    user_arg - Argument passed to the connection status callback.
- * Returns:
- *    0 on success, or a negative error code on failure (from errno.h).
- */
-int cras_helper_create_connect_async(struct cras_client **client,
-				     cras_connection_status_cb_t connection_cb,
-				     void *user_arg);
-
-/* Creates and connects a client to the running server.
- *
- * Waits forever (or interrupt) for the server to be available.
- *
- * Args:
- *    client - Filled with a pointer to the new client.
- * Returns:
- *    0 on success, or a negative error code on failure (from errno.h).
- */
-int cras_helper_create_connect(struct cras_client **client);
-
-/* Adds a stream with the given parameters, no flags and a buffer size of 2048
- * Note that the unified_cb parameter is being phased out.
- * TODO(crbug.com/972928): convert this from unified_cb.
- * Args:
- *    client - The client to add the stream to (from cras_client_create).
- *    direction - playback(CRAS_STREAM_OUTPUT) or capture(CRAS_STREAM_INPUT) or
- *        loopback(CRAS_STREAM_POST_MIX_PRE_DSP).
- *    user_data - Pointer that will be passed to the callback.
- *    unified_cb - Called to request audio data or to notify the client when
- *                 captured audio is available. Though this is a unified_cb,
- *                 only one direction will be used for a stream, depending
- *                 on the 'direction' parameter.
- *    err_cb - Called when there is an error with the stream.
- *    format - The type of the samples, ex. S16_LE.
- *    frame_rate - Sample rate.
- *    num_channels - Number of channels in the stream, should be 1 or 2 when
- *        using this API, for > 2 channel streams see cras_client.h.
- *    dev_idx - Set this to a negative number to play to the default device, if
- *        positive it is the index of the device to pin the stream to.
- *    stream_id_out - On success will be filled with the new stream id.
- *        Guaranteed to be set before any callbacks are made.
- * Returns:
- *    0 on success, negative error code on failure (from errno.h).
- */
-int cras_helper_add_stream_simple(struct cras_client *client,
-				  enum CRAS_STREAM_DIRECTION direction,
-				  void *user_data, cras_unified_cb_t unified_cb,
-				  cras_error_cb_t err_cb,
-				  snd_pcm_format_t format,
-				  unsigned int frame_rate,
-				  unsigned int num_channels, int dev_idx,
-				  cras_stream_id_t *stream_id_out);
-
-/* Plays the given buffer at a default latency.
- * Args:
- *    client - The client to add the stream to (from cras_client_create).
- *    buffer - The audio samples.
- *    num_frames - The size of the buffer in number of samples.
- *    format - The type of the samples, ex. S16_LE.
- *    frame_rate - Sample rate.
- *    num_channels - Number of channels in the stream.
- *    dev_idx - Set this to a negative number to play to the default device, if
- *        positive it is the index of the device to pin the stream to.
- * Returns:
- *    0 on success, negative error code on failure (from errno.h).
- */
-int cras_helper_play_buffer(struct cras_client *client, const void *buffer,
-			    unsigned int num_frames, snd_pcm_format_t format,
-			    unsigned int frame_rate, unsigned int num_channels,
-			    int dev_idx);
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif /* _CRAS_HELPERS_H */
diff --git a/cras/src/plc/cras_plc.c b/cras/src/plc/cras_plc.c
deleted file mode 100644
index 74c3568..0000000
--- a/cras/src/plc/cras_plc.c
+++ /dev/null
@@ -1,285 +0,0 @@
-/* Copyright 2019 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <float.h>
-#include <math.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdio.h>
-
-#include "cras_plc.h"
-
-#define MSBC_SAMPLE_SIZE 2 /* 2 bytes*/
-#define MSBC_PKT_LEN 57 /* Packet length without the header */
-#define MSBC_FS 120 /* Frame Size */
-#define MSBC_CODE_SIZE 240 /* MSBC_SAMPLE_SIZE * MSBC_FS */
-
-#define PLC_WL 256 /* 16ms - Window Length for pattern matching */
-#define PLC_TL 64 /* 4ms - Template Length for matching */
-#define PLC_HL (PLC_WL + MSBC_FS - 1) /* Length of History buffer required */
-#define PLC_SBCRL 36 /* SBC Reconvergence sample Length */
-#define PLC_OLAL 16 /* OverLap-Add Length */
-
-#define PLC_WINDOW_SIZE 5
-#define PLC_PL_THRESHOLD 2
-
-/* The pre-computed zero input bit stream of mSBC codec, per HFP 1.7 spec.
- * This mSBC frame will be decoded into all-zero input PCM. */
-static const uint8_t msbc_zero_frame[] = {
-	0xad, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, 0x00, 0x77, 0x6d, 0xb6, 0xdd,
-	0xdb, 0x6d, 0xb7, 0x76, 0xdb, 0x6d, 0xdd, 0xb6, 0xdb, 0x77, 0x6d, 0xb6,
-	0xdd, 0xdb, 0x6d, 0xb7, 0x76, 0xdb, 0x6d, 0xdd, 0xb6, 0xdb, 0x77, 0x6d,
-	0xb6, 0xdd, 0xdb, 0x6d, 0xb7, 0x76, 0xdb, 0x6d, 0xdd, 0xb6, 0xdb, 0x77,
-	0x6d, 0xb6, 0xdd, 0xdb, 0x6d, 0xb7, 0x76, 0xdb, 0x6c
-};
-
-/* Raised Cosine table for OLA */
-static const float rcos[PLC_OLAL] = { 0.99148655f, 0.96623611f, 0.92510857f,
-				      0.86950446f, 0.80131732f, 0.72286918f,
-				      0.63683150f, 0.54613418f, 0.45386582f,
-				      0.36316850f, 0.27713082f, 0.19868268f,
-				      0.13049554f, 0.07489143f, 0.03376389f,
-				      0.00851345f };
-
-/* This structure tracks the packet loss information for last PLC_WINDOW_SIZE
- * of packets:
- *    loss_hist - The packet loss history of receiving packets. 1 means lost.
- *    ptr - The index of the to be updated packet loss status.
- *    count - The count of lost packets in the window.
- */
-struct packet_window {
-	uint8_t loss_hist[PLC_WINDOW_SIZE];
-	unsigned int ptr;
-	unsigned int count;
-};
-
-/* The PLC is specifically designed for mSBC. The algorithm searches the
- * history of receiving samples to find the best match samples and constructs
- * substitutions for the lost samples. The selection is based on pattern
- * matching a template, composed of a length of samples preceding to the lost
- * samples. It then uses the following samples after the best match as the
- * replacement samples and applies Overlap-Add to reduce the audible
- * distortion.
- *
- * This structure holds related info needed to conduct the PLC algorithm.
- * Members:
- *    hist - The history buffer for receiving samples, we also use it to
- *           buffer the processed replacement samples.
- *    best_lag - The index of the best substitution samples in sample history.
- *    handled_bad_frames - Number of bad frames handled since the last good
- *                         frame.
- *    zero_frame - A buffer used for storing the samples from decoding the
- *                 mSBC zero frame packet.
- *    pl_window - A window monitoring how many packets are bad within the recent
- *                PLC_WINDOW_SIZE of packets. This is used to determine if we
- *                want to disable the PLC temporarily.
- */
-struct cras_msbc_plc {
-	int16_t hist[PLC_HL + MSBC_FS + PLC_SBCRL + PLC_OLAL];
-	unsigned int best_lag;
-	int handled_bad_frames;
-	int16_t zero_frame[MSBC_FS];
-	struct packet_window *pl_window;
-};
-
-struct cras_msbc_plc *cras_msbc_plc_create()
-{
-	struct cras_msbc_plc *plc =
-		(struct cras_msbc_plc *)calloc(1, sizeof(*plc));
-	plc->pl_window =
-		(struct packet_window *)calloc(1, sizeof(*plc->pl_window));
-	return plc;
-}
-
-void cras_msbc_plc_destroy(struct cras_msbc_plc *plc)
-{
-	free(plc->pl_window);
-	free(plc);
-}
-
-static int16_t f_to_s16(float input)
-{
-	return input > INT16_MAX ?
-		       INT16_MAX :
-		       input < INT16_MIN ? INT16_MIN : (int16_t)input;
-}
-
-void overlap_add(int16_t *output, float scaler_d, const int16_t *desc,
-		 float scaler_a, const int16_t *asc)
-{
-	for (int i = 0; i < PLC_OLAL; i++) {
-		output[i] =
-			f_to_s16(scaler_d * desc[i] * rcos[i] +
-				 scaler_a * asc[i] * rcos[PLC_OLAL - 1 - i]);
-	}
-}
-
-void update_plc_state(struct packet_window *w, uint8_t is_packet_loss)
-{
-	uint8_t *curr = &w->loss_hist[w->ptr];
-	if (is_packet_loss != *curr) {
-		w->count += (is_packet_loss - *curr);
-		*curr = is_packet_loss;
-	}
-	w->ptr = (w->ptr + 1) % PLC_WINDOW_SIZE;
-}
-
-int possibly_pause_plc(struct packet_window *w)
-{
-	/* The packet loss count comes from a time window and we use it as an
-	 * indicator of our confidence of the PLC algorithm. It is known to
-	 * generate poorer and robotic feeling sounds, when the majority of
-	 * samples in the PLC history buffer are from the concealment results.
-	 */
-	return w->count >= PLC_PL_THRESHOLD;
-}
-
-int cras_msbc_plc_handle_good_frames(struct cras_msbc_plc *state,
-				     const uint8_t *input, uint8_t *output)
-{
-	int16_t *frame_head, *input_samples, *output_samples;
-	if (state->handled_bad_frames == 0) {
-		/* If there was no packet concealment before this good frame,
-		 * we just simply copy the input to output without reconverge.
-		 */
-		memmove(output, input, MSBC_FS * MSBC_SAMPLE_SIZE);
-	} else {
-		frame_head = &state->hist[PLC_HL];
-		input_samples = (int16_t *)input;
-		output_samples = (int16_t *)output;
-
-		/* For the first good frame after packet loss, we need to
-		 * conceal the received samples to have it reconverge with the
-		 * true output.
-		 */
-		memcpy(output_samples, frame_head,
-		       PLC_SBCRL * MSBC_SAMPLE_SIZE);
-		overlap_add(&output_samples[PLC_SBCRL], 1.0,
-			    &frame_head[PLC_SBCRL], 1.0,
-			    &input_samples[PLC_SBCRL]);
-		memmove(&output_samples[PLC_SBCRL + PLC_OLAL],
-			&input_samples[PLC_SBCRL + PLC_OLAL],
-			(MSBC_FS - PLC_SBCRL - PLC_OLAL) * MSBC_SAMPLE_SIZE);
-		state->handled_bad_frames = 0;
-	}
-
-	/* Shift the history and update the good frame to the end of it. */
-	memmove(state->hist, &state->hist[MSBC_FS],
-		(PLC_HL - MSBC_FS) * MSBC_SAMPLE_SIZE);
-	memcpy(&state->hist[PLC_HL - MSBC_FS], output,
-	       MSBC_FS * MSBC_SAMPLE_SIZE);
-	update_plc_state(state->pl_window, 0);
-	return MSBC_CODE_SIZE;
-}
-
-float cross_correlation(int16_t *x, int16_t *y)
-{
-	float sum = 0, x2 = 0, y2 = 0;
-
-	for (int i = 0; i < PLC_TL; i++) {
-		sum += ((float)x[i]) * y[i];
-		x2 += ((float)x[i]) * x[i];
-		y2 += ((float)y[i]) * y[i];
-	}
-	return sum / sqrtf(x2 * y2);
-}
-
-int pattern_match(int16_t *hist)
-{
-	int best = 0;
-	float cn, max_cn = FLT_MIN;
-
-	for (int i = 0; i < PLC_WL; i++) {
-		cn = cross_correlation(&hist[PLC_HL - PLC_TL], &hist[i]);
-		if (cn > max_cn) {
-			best = i;
-			max_cn = cn;
-		}
-	}
-	return best;
-}
-
-float amplitude_match(int16_t *x, int16_t *y)
-{
-	uint32_t sum_x = 0, sum_y = 0;
-	float scaler;
-	for (int i = 0; i < MSBC_FS; i++) {
-		sum_x += abs(x[i]);
-		sum_y += abs(y[i]);
-	}
-
-	if (sum_y == 0)
-		return 1.2f;
-
-	scaler = (float)sum_x / sum_y;
-	return scaler > 1.2f ? 1.2f : scaler < 0.75f ? 0.75f : scaler;
-}
-
-int cras_msbc_plc_handle_bad_frames(struct cras_msbc_plc *state,
-				    struct cras_audio_codec *codec,
-				    uint8_t *output)
-{
-	float scaler;
-	int16_t *best_match_hist;
-	int16_t *frame_head = &state->hist[PLC_HL];
-	size_t pcm_decoded = 0;
-
-	/* mSBC codec is stateful, the history of signal would contribute to the
-	 * decode result state->zero_frame.
-	 */
-	codec->decode(codec, msbc_zero_frame, MSBC_PKT_LEN, state->zero_frame,
-		      MSBC_FS, &pcm_decoded);
-
-	/* The PLC algorithm is more likely to generate bad results that sound
-	 * robotic after severe packet losses happened. Only applying it when
-	 * we are confident.
-	 */
-	if (!possibly_pause_plc(state->pl_window)) {
-		if (state->handled_bad_frames == 0) {
-			/* Finds the best matching samples and amplitude */
-			state->best_lag = pattern_match(state->hist) + PLC_TL;
-			best_match_hist = &state->hist[state->best_lag];
-			scaler = amplitude_match(&state->hist[PLC_HL - MSBC_FS],
-						 best_match_hist);
-
-			/* Constructs the substitution samples */
-			overlap_add(frame_head, 1.0, state->zero_frame, scaler,
-				    best_match_hist);
-			for (int i = PLC_OLAL; i < MSBC_FS; i++)
-				state->hist[PLC_HL + i] =
-					f_to_s16(scaler * best_match_hist[i]);
-			overlap_add(&frame_head[MSBC_FS], scaler,
-				    &best_match_hist[MSBC_FS], 1.0,
-				    &best_match_hist[MSBC_FS]);
-
-			memmove(&frame_head[MSBC_FS + PLC_OLAL],
-				&best_match_hist[MSBC_FS + PLC_OLAL],
-				PLC_SBCRL * MSBC_SAMPLE_SIZE);
-		} else {
-			memmove(frame_head, &state->hist[state->best_lag],
-				(MSBC_FS + PLC_SBCRL + PLC_OLAL) *
-					MSBC_SAMPLE_SIZE);
-		}
-		state->handled_bad_frames++;
-	} else {
-		/* This is a case similar to receiving a good frame with all
-		 * zeros, we set handled_bad_frames to zero to prevent the
-		 * following good frame from being concealed to reconverge with
-		 * the zero frames we fill in. The concealment result sounds
-		 * more artificial and weird than simply writing zeros and
-		 * following samples.
-		 */
-		memmove(frame_head, state->zero_frame, MSBC_CODE_SIZE);
-		memset(frame_head + MSBC_CODE_SIZE, 0,
-		       (PLC_SBCRL + PLC_OLAL) * MSBC_SAMPLE_SIZE);
-		state->handled_bad_frames = 0;
-	}
-
-	memcpy(output, frame_head, MSBC_CODE_SIZE);
-	memmove(state->hist, &state->hist[MSBC_FS],
-		(PLC_HL + PLC_SBCRL + PLC_OLAL) * MSBC_SAMPLE_SIZE);
-	update_plc_state(state->pl_window, 1);
-	return MSBC_CODE_SIZE;
-}
diff --git a/cras/src/plc/cras_plc.h b/cras/src/plc/cras_plc.h
deleted file mode 100644
index ccde8bb..0000000
--- a/cras/src/plc/cras_plc.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/* Copyright 2019 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <stdint.h>
-
-#include "cras_audio_codec.h"
-
-/* PLC library provides helper functions to mask the effects of lost or
- * disrupted packets. It currentyl only supports the mSBC codec.
- *
- * This struct contains informations needed for applying the PLC algorithm.
- */
-struct cras_msbc_plc;
-
-/* Creates a plc component for mSBC codec, which is used for wideband speech
- * mode of HFP
- */
-struct cras_msbc_plc *cras_msbc_plc_create();
-
-/* Destroys a mSBC PLC.
- * Args:
- *    plc - The PLC to destroy.
- */
-void cras_msbc_plc_destroy(struct cras_msbc_plc *plc);
-
-/* Conceals the packet loss by writing the substitution samples to the ouput
- * buffer provided by the caller. The samples will be generated based on the
- * informations recorded in the PLC struct passed in.
- * Args:
- *    plc - The PLC you use.
- *    codec - The mSBC codec.
- *    output - Pointer to the output buffer.
- * Returns:
- *    The number of bytes written to the output buffer.
- */
-int cras_msbc_plc_handle_bad_frames(struct cras_msbc_plc *plc,
-				    struct cras_audio_codec *codec,
-				    uint8_t *output);
-
-/* Updates informations needed and potentially processes the input samples to
- * help it to reconverge after a frame loss.
- *
- * The memory space input and output pointers point to can be overlapping.
- * Args:
- *   plc - The PLC you use.
- *   input - Pointer to the true input.
- *   output - Pointer to the output buffer.
- * Returns:
- *    The number of bytes written to the output buffer.
- */
-int cras_msbc_plc_handle_good_frames(struct cras_msbc_plc *plc,
-				     const uint8_t *input, uint8_t *output);
diff --git a/cras/src/plc/cras_plc_test.c b/cras/src/plc/cras_plc_test.c
deleted file mode 100644
index 4b7a6a7..0000000
--- a/cras/src/plc/cras_plc_test.c
+++ /dev/null
@@ -1,223 +0,0 @@
-/* Copyright 2019 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <errno.h>
-#include <getopt.h>
-#include <math.h>
-#include <stdbool.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/param.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <unistd.h>
-
-#include "cras_sbc_codec.h"
-#include "cras_plc.h"
-
-#define MSBC_CODE_SIZE 240
-#define MSBC_PKT_FRAME_LEN 57
-#define RND_SEED 7
-
-static const uint8_t msbc_zero_frame[] = {
-	0xad, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, 0x00, 0x77, 0x6d, 0xb6, 0xdd,
-	0xdb, 0x6d, 0xb7, 0x76, 0xdb, 0x6d, 0xdd, 0xb6, 0xdb, 0x77, 0x6d, 0xb6,
-	0xdd, 0xdb, 0x6d, 0xb7, 0x76, 0xdb, 0x6d, 0xdd, 0xb6, 0xdb, 0x77, 0x6d,
-	0xb6, 0xdd, 0xdb, 0x6d, 0xb7, 0x76, 0xdb, 0x6d, 0xdd, 0xb6, 0xdb, 0x77,
-	0x6d, 0xb6, 0xdd, 0xdb, 0x6d, 0xb7, 0x76, 0xdb, 0x6c
-};
-
-bool *generate_pl_seq(int input_file_size, float pl_percent)
-{
-	unsigned pk_count, pl_count;
-	bool *seq;
-
-	pk_count = input_file_size / MSBC_CODE_SIZE;
-	pl_count = pk_count * (pl_percent / 100.0);
-	seq = (bool *)calloc(pk_count, sizeof(*seq));
-	srand(RND_SEED);
-	while (pl_count > 0) {
-		bool *missed = &seq[rand() % pk_count];
-		if (!*missed) {
-			*missed = true;
-			pl_count--;
-		}
-	}
-	return seq;
-}
-
-/* pl_hex is expected to be consecutive bytes(two chars) in hex format.*/
-bool *parse_pl_hex(int input_file_size, const char *pl_hex)
-{
-	char tmp[3];
-	uint8_t val = 0;
-	int i, pl_hex_len, seq_len;
-	bool *seq;
-
-	pl_hex_len = strlen(pl_hex);
-	seq_len = MAX(1 + input_file_size / MSBC_CODE_SIZE, pl_hex_len * 4);
-	seq = (bool *)calloc(seq_len, sizeof(*seq));
-
-	for (i = 0; i < seq_len; i++) {
-		/* If sequence is longer then the provided pl_hex, leave the
-		 * rest to all zeros. */
-		if (i > pl_hex_len * 4)
-			break;
-		if (i % 8 == 0) {
-			memcpy(tmp, pl_hex + i / 4, 2);
-			tmp[2] = '\0';
-			val = strtol(tmp, NULL, 16);
-		}
-		seq[i] = val & 1U;
-		val >>= 1;
-	}
-	printf("pl_hex string maps to %ld ms, total sequence size %f ms\n",
-	       strlen(pl_hex) * 30, seq_len * 7.5f);
-	return seq;
-}
-
-void plc_experiment(const char *input_filename, bool *pl_seq, bool with_plc)
-{
-	char output_filename[255];
-	int input_fd, output_fd, rc;
-	struct cras_audio_codec *msbc_input = cras_msbc_codec_create();
-	struct cras_audio_codec *msbc_output = cras_msbc_codec_create();
-	struct cras_msbc_plc *plc = cras_msbc_plc_create();
-	uint8_t buffer[MSBC_CODE_SIZE], packet_buffer[MSBC_PKT_FRAME_LEN];
-	size_t encoded, decoded;
-	unsigned count = 0;
-
-	input_fd = open(input_filename, O_RDONLY);
-	if (input_fd == -1) {
-		fprintf(stderr, "Cannout open input file %s\n", input_filename);
-		return;
-	}
-
-	if (with_plc)
-		sprintf(output_filename, "output_with_plc.raw");
-	else
-		sprintf(output_filename, "output_with_zero.raw");
-
-	output_fd = open(output_filename, O_CREAT | O_RDWR | O_TRUNC, 0644);
-	if (output_fd == -1) {
-		fprintf(stderr, "Cannot open output file %s\n",
-			output_filename);
-		return;
-	}
-
-	while (1) {
-		rc = read(input_fd, buffer, MSBC_CODE_SIZE);
-		if (rc < 0) {
-			fprintf(stderr, "Cannot read file %s", input_filename);
-			return;
-		} else if (rc == 0 || rc < MSBC_CODE_SIZE)
-			break;
-
-		msbc_input->encode(msbc_input, buffer, MSBC_CODE_SIZE,
-				   packet_buffer, MSBC_PKT_FRAME_LEN, &encoded);
-
-		if (pl_seq[count]) {
-			if (with_plc) {
-				cras_msbc_plc_handle_bad_frames(
-					plc, msbc_output, buffer);
-				decoded = MSBC_CODE_SIZE;
-			} else
-				msbc_output->decode(msbc_output,
-						    msbc_zero_frame,
-						    MSBC_PKT_FRAME_LEN, buffer,
-						    MSBC_CODE_SIZE, &decoded);
-		} else {
-			msbc_output->decode(msbc_output, packet_buffer,
-					    MSBC_PKT_FRAME_LEN, buffer,
-					    MSBC_CODE_SIZE, &decoded);
-			cras_msbc_plc_handle_good_frames(plc, buffer, buffer);
-		}
-
-		count++;
-		rc = write(output_fd, buffer, decoded);
-		if (rc < 0) {
-			fprintf(stderr, "Cannot write file %s\n",
-				output_filename);
-			return;
-		}
-	}
-}
-
-static void show_usage()
-{
-	printf("This test only supports reading/writing raw audio with format:\n"
-	       "\t16000 sample rate, mono channel, S16_LE\n");
-	printf("--help - Print this usage.\n");
-	printf("--input_file - path to an audio file.\n");
-	printf("--pattern - Hex string representing consecutive packets'"
-	       "status.\n");
-	printf("--random - Percentage of packet loss.\n");
-}
-
-int main(int argc, char **argv)
-{
-	int fd;
-	struct stat st;
-	float pl_percent;
-	int pl_percent_set = 0;
-	int option_character;
-	int option_index = 0;
-	const char *input_file = NULL;
-	const char *pl_hex = NULL;
-	bool *pl_seq = NULL;
-	static struct option long_options[] = {
-		{ "help", no_argument, NULL, 'h' },
-		{ "input", required_argument, NULL, 'i' },
-		{ "pattern", required_argument, NULL, 'p' },
-		{ "random", required_argument, NULL, 'r' },
-		{ NULL, 0, NULL, 0 },
-	};
-
-	while (true) {
-		option_character = getopt_long(argc, argv, "i:r:p:h",
-					       long_options, &option_index);
-		if (option_character == -1)
-			break;
-		switch (option_character) {
-		case 'h':
-			show_usage();
-			break;
-		case 'i':
-			input_file = optarg;
-			break;
-		case 'p':
-			pl_hex = optarg;
-			break;
-		case 'r':
-			pl_percent = atof(optarg);
-			pl_percent_set = 1;
-			break;
-		default:
-			break;
-		}
-	}
-
-	if ((!pl_percent_set && !pl_hex) || !input_file) {
-		show_usage();
-		return 1;
-	}
-
-	fd = open(input_file, O_RDONLY);
-	if (fd == -1) {
-		fprintf(stderr, "Cannout open input file %s\n", input_file);
-		return 1;
-	}
-	fstat(fd, &st);
-	close(fd);
-	if (pl_percent_set)
-		pl_seq = generate_pl_seq(st.st_size, pl_percent);
-	else if (pl_hex)
-		pl_seq = parse_pl_hex(st.st_size, pl_hex);
-
-	plc_experiment(input_file, pl_seq, true);
-	plc_experiment(input_file, pl_seq, false);
-}
diff --git a/cras/src/plc/parse_sco.py b/cras/src/plc/parse_sco.py
deleted file mode 100755
index c50df15..0000000
--- a/cras/src/plc/parse_sco.py
+++ /dev/null
@@ -1,107 +0,0 @@
-# -*- coding: utf-8 -*-
-# Copyright 2020 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""
-A script to extract raw SCO RX packets from btsnoop.
-Use 'btmon -S' to dump SCO traffic from btsnoop file.
-Trim the btsnoop output to just the SCO traffic period.
-Then execute 'python parse-sco.py <btsnoop-output>'
-"""
-
-import atexit
-import binascii
-import os
-import re
-import sys
-
-
-class SCOParser:
-  """
-  Parser for grepping SCO packets
-  """
-
-  def __init__(self):
-    # On old releases, +CIEV: 4,1 indicates the start point of call session
-    # c 31 0d 0a 9a     ..+CIEV: 4,1..
-    self.call_start_re = re.compile(r'.*?\+CIEV:\s4,(\d).*?')
-
-    # > SCO Data RX: Handle 257 flags 0x00 dlen 60           #13826 [hci0] 650.388305
-    #         00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
-    #         00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
-    #         00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
-    #         00 00 00 00 00 00 00 00 00 00 00 00
-    self.sco_rx_re = re.compile(r'.*?SCO\sData\sRX.*?flags\s0x(\d+).*?')
-    self.sco_f = None
-    self.output_idx = 0
-    self.pk_count = 0
-    self.pl_count = 0
-
-    atexit.register(self._cleanup)
-
-  def _cleanup(self):
-    if self.sco_f is not None:
-      print(
-          "Current file contains %d packets (%d with erroneous status flag)" %
-          (self.pk_count, self.pl_count))
-      self.pk_count = 0
-      self.pl_count = 0
-      self.sco_f.close()
-
-  def _new_session(self):
-    if self.sco_f is not None:
-      close(self.sco_f)
-
-    new_file = "sco_file_%d" % self.output_idx
-    print("Record to %s" % new_file)
-    self.sco_f = open(new_file, 'wb')
-    self.output_idx += 1
-
-    return self.sco_f
-
-  def parse(self, filename):
-    if not os.path.exists(filename):
-      print("%s doesn't exist" % filename)
-      return
-
-    print("Start parsing %s" % filename)
-    parse_rx_data = 0
-    with open(filename, "r") as f:
-      for line in f.readlines():
-        if parse_rx_data > 0:
-          self.sco_f.write(binascii.unhexlify(''.join(line[:56].split())))
-          parse_rx_data = (parse_rx_data + 1) % 5
-
-        # Start a new session and output following SCO data to a new file
-        match = self.call_start_re.search(line)
-        if match and (1 == int(match.group(1))):
-          self._new_session()
-          continue
-
-        match = self.sco_rx_re.search(line)
-        if match:
-          if self.sco_f is None:
-            self._new_session()
-
-          self.pk_count += 1
-
-          status_flag = int(match.group(1))
-          hdr = ['01', str(status_flag) + '1', '3c']
-          if status_flag != 0:
-            self.pl_count += 1
-
-          self.sco_f.write(binascii.unhexlify(''.join(hdr)))
-          parse_rx_data = 1
-
-
-def main(argv):
-  if len(argv) < 1:
-    print("parse_sco.py [btsnoop.txt]")
-    return
-
-  p = SCOParser()
-  p.parse(argv[0])
-
-
-if __name__ == "__main__":
-  main(sys.argv[1:])
diff --git a/cras/src/server/audio_thread.c b/cras/src/server/audio_thread.c
deleted file mode 100644
index 48bb0dc..0000000
--- a/cras/src/server/audio_thread.c
+++ /dev/null
@@ -1,1314 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef _GNU_SOURCE
-#define _GNU_SOURCE /* for ppoll and asprintf*/
-#endif
-
-#include <pthread.h>
-#include <poll.h>
-#include <stdbool.h>
-#include <stdio.h>
-#include <sys/param.h>
-#include <syslog.h>
-
-#include "audio_thread_log.h"
-#include "cras_audio_thread_monitor.h"
-#include "cras_config.h"
-#include "cras_device_monitor.h"
-#include "cras_fmt_conv.h"
-#include "cras_iodev.h"
-#include "cras_rstream.h"
-#include "cras_server_metrics.h"
-#include "cras_system_state.h"
-#include "cras_types.h"
-#include "cras_util.h"
-#include "dev_stream.h"
-#include "audio_thread.h"
-#include "utlist.h"
-
-#define MIN_PROCESS_TIME_US 500 /* 0.5ms - min amount of time to mix/src. */
-#define SLEEP_FUZZ_FRAMES 10 /* # to consider "close enough" to sleep frames. */
-#define MIN_READ_WAIT_US 2000 /* 2ms */
-/*
- * # to check whether a busyloop event happens
- */
-#define MAX_CONTINUOUS_ZERO_SLEEP_COUNT 2
-
-/*
- * If the number of continuous zero sleep is equal to this limit, the value
- * will be recorded immediately. It can ensure all busyloop will be recorded
- * even if the busyloop does not stop.
- */
-#define MAX_CONTINUOUS_ZERO_SLEEP_METRIC_LIMIT 1000
-
-/* Messages that can be sent from the main context to the audio thread. */
-enum AUDIO_THREAD_COMMAND {
-	AUDIO_THREAD_ADD_OPEN_DEV,
-	AUDIO_THREAD_RM_OPEN_DEV,
-	AUDIO_THREAD_IS_DEV_OPEN,
-	AUDIO_THREAD_ADD_STREAM,
-	AUDIO_THREAD_DISCONNECT_STREAM,
-	AUDIO_THREAD_STOP,
-	AUDIO_THREAD_DUMP_THREAD_INFO,
-	AUDIO_THREAD_DRAIN_STREAM,
-	AUDIO_THREAD_CONFIG_GLOBAL_REMIX,
-	AUDIO_THREAD_DEV_START_RAMP,
-	AUDIO_THREAD_REMOVE_CALLBACK,
-	AUDIO_THREAD_AEC_DUMP,
-};
-
-struct audio_thread_msg {
-	size_t length;
-	enum AUDIO_THREAD_COMMAND id;
-};
-
-struct audio_thread_config_global_remix {
-	struct audio_thread_msg header;
-	struct cras_fmt_conv *fmt_conv;
-};
-
-struct audio_thread_open_device_msg {
-	struct audio_thread_msg header;
-	struct cras_iodev *dev;
-};
-
-struct audio_thread_rm_device_msg {
-	struct audio_thread_msg header;
-	enum CRAS_STREAM_DIRECTION dir;
-	unsigned dev_idx;
-};
-
-struct audio_thread_rm_callback_msg {
-	struct audio_thread_msg header;
-	int fd;
-};
-
-struct audio_thread_add_rm_stream_msg {
-	struct audio_thread_msg header;
-	struct cras_rstream *stream;
-	struct cras_iodev **devs;
-	unsigned int num_devs;
-};
-
-struct audio_thread_dump_debug_info_msg {
-	struct audio_thread_msg header;
-	struct audio_debug_info *info;
-};
-
-struct audio_thread_dev_start_ramp_msg {
-	struct audio_thread_msg header;
-	unsigned int dev_idx;
-	enum CRAS_IODEV_RAMP_REQUEST request;
-};
-
-struct audio_thread_aec_dump_msg {
-	struct audio_thread_msg header;
-	cras_stream_id_t stream_id;
-	unsigned int start; /* */
-	int fd;
-};
-
-/* Audio thread logging. If atlog is successfully created from cras_shm_setup,
- * then the fds should have valid value. Or audio thread will fallback to use
- * calloc to create atlog and leave the fds as -1.
- */
-struct audio_thread_event_log *atlog;
-char *atlog_name;
-int atlog_rw_shm_fd;
-int atlog_ro_shm_fd;
-
-static struct iodev_callback_list *iodev_callbacks;
-
-struct iodev_callback_list {
-	int fd;
-	int events;
-	enum AUDIO_THREAD_EVENTS_CB_TRIGGER trigger;
-	thread_callback cb;
-	void *cb_data;
-	struct pollfd *pollfd;
-	struct iodev_callback_list *prev, *next;
-};
-
-void audio_thread_add_events_callback(int fd, thread_callback cb, void *data,
-				      int events)
-{
-	struct iodev_callback_list *iodev_cb;
-
-	/* Don't add iodev_cb twice */
-	DL_FOREACH (iodev_callbacks, iodev_cb)
-		if (iodev_cb->fd == fd && iodev_cb->cb_data == data)
-			return;
-
-	iodev_cb = (struct iodev_callback_list *)calloc(1, sizeof(*iodev_cb));
-	iodev_cb->fd = fd;
-	iodev_cb->cb = cb;
-	iodev_cb->cb_data = data;
-	iodev_cb->trigger = TRIGGER_POLL;
-	iodev_cb->events = events;
-
-	DL_APPEND(iodev_callbacks, iodev_cb);
-}
-
-void audio_thread_rm_callback(int fd)
-{
-	struct iodev_callback_list *iodev_cb;
-
-	DL_FOREACH (iodev_callbacks, iodev_cb) {
-		if (iodev_cb->fd == fd) {
-			DL_DELETE(iodev_callbacks, iodev_cb);
-			free(iodev_cb);
-			return;
-		}
-	}
-}
-
-void audio_thread_config_events_callback(
-	int fd, enum AUDIO_THREAD_EVENTS_CB_TRIGGER trigger)
-{
-	struct iodev_callback_list *iodev_cb;
-
-	DL_FOREACH (iodev_callbacks, iodev_cb) {
-		if (iodev_cb->fd == fd) {
-			iodev_cb->trigger = trigger;
-			return;
-		}
-	}
-}
-
-/* Sends a response (error code) from the audio thread to the main thread.
- * Indicates that the last message sent to the audio thread has been handled
- * with an error code of rc.
- * Args:
- *    thread - thread responding to command.
- *    rc - Result code to send back to the main thread.
- * Returns:
- *    The number of bytes written to the main thread.
- */
-static int audio_thread_send_response(struct audio_thread *thread, int rc)
-{
-	return write(thread->to_main_fds[1], &rc, sizeof(rc));
-}
-
-/* Reads from a file descriptor until all bytes are read.
- *
- * Args:
- *    fd - file descriptor to read
- *    buf - the buffer to be written.
- *    count - the number of bytes to read from fd
- * Returns:
- *    |count| on success, negative error code on failure.
- */
-static int read_until_finished(int fd, void *buf, size_t count)
-{
-	int nread, count_left = count;
-
-	while (count_left > 0) {
-		nread = read(fd, (uint8_t *)buf + count - count_left,
-			     count_left);
-		if (nread < 0) {
-			if (errno == EINTR)
-				continue;
-			else
-				return nread;
-		} else if (nread == 0) {
-			syslog(LOG_ERR, "Pipe has been closed.");
-			return -EPIPE;
-		}
-		count_left -= nread;
-	}
-	return count;
-}
-
-/* Reads a command from the main thread.  Called from the playback/capture
- * thread.  This will read the next available command from the main thread and
- * put it in buf.
- * Args:
- *    thread - thread reading the command.
- *    buf - Message is stored here on return.
- *    max_len - maximum length of message to put into buf.
- * Returns:
- *    0 on success, negative error code on failure.
- */
-static int audio_thread_read_command(struct audio_thread *thread, uint8_t *buf,
-				     size_t max_len)
-{
-	int to_read, nread, rc;
-	struct audio_thread_msg *msg = (struct audio_thread_msg *)buf;
-
-	/* Get the length of the message first */
-	nread = read_until_finished(thread->to_thread_fds[0], buf,
-				    sizeof(msg->length));
-	if (nread < 0)
-		return nread;
-
-	if (msg->length > max_len)
-		return -ENOMEM;
-
-	to_read = msg->length - sizeof(msg->length);
-	rc = read_until_finished(thread->to_thread_fds[0],
-				 &buf[0] + sizeof(msg->length), to_read);
-	if (rc < 0)
-		return rc;
-	return 0;
-}
-
-/* Builds an initial buffer to avoid an underrun. Adds min_level of latency. */
-static void fill_odevs_zeros_min_level(struct cras_iodev *odev)
-{
-	cras_iodev_fill_odev_zeros(odev, odev->min_buffer_level);
-}
-
-/* Handles messages from main thread to add a new active device. */
-static int thread_add_open_dev(struct audio_thread *thread,
-			       struct cras_iodev *iodev)
-{
-	struct open_dev *adev;
-
-	DL_SEARCH_SCALAR(thread->open_devs[iodev->direction], adev, dev, iodev);
-	if (adev)
-		return -EEXIST;
-
-	adev = (struct open_dev *)calloc(1, sizeof(*adev));
-	adev->dev = iodev;
-
-	/*
-	 * Start output devices by padding the output. This avoids a burst of
-	 * audio callbacks when the stream starts
-	 */
-	if (iodev->direction == CRAS_STREAM_OUTPUT)
-		fill_odevs_zeros_min_level(iodev);
-
-	ATLOG(atlog, AUDIO_THREAD_DEV_ADDED, iodev->info.idx, 0, 0);
-
-	DL_APPEND(thread->open_devs[iodev->direction], adev);
-
-	return 0;
-}
-
-/* Handles messages from the main thread to remove an active device. */
-static int thread_rm_open_dev(struct audio_thread *thread,
-			      enum CRAS_STREAM_DIRECTION dir,
-			      unsigned int dev_idx)
-{
-	struct open_dev *adev =
-		dev_io_find_open_dev(thread->open_devs[dir], dev_idx);
-	if (!adev)
-		return -EINVAL;
-
-	dev_io_rm_open_dev(&thread->open_devs[dir], adev);
-	return 0;
-}
-
-/*
- * Handles message from the main thread to check if an iodev is in the
- * open dev list.
- */
-static int thread_is_dev_open(struct audio_thread *thread,
-			      struct cras_iodev *iodev)
-{
-	struct open_dev *adev = dev_io_find_open_dev(
-		thread->open_devs[iodev->direction], iodev->info.idx);
-	return !!adev;
-}
-
-/*
- * Handles messages from the main thread to start ramping on a device.
- * Start ramping in audio thread and set mute/unmute
- * state on device. This should only be done when
- * device is running with valid streams.
- *
- * 1. Mute -> Unmute: Set device unmute state after
- *                    ramping is started.
- * 2. Unmute -> Mute: Set device mute state after
- *                    ramping is done.
- *
- * The above transition will be handled by cras_iodev_start_ramp.
- */
-static int thread_dev_start_ramp(struct audio_thread *thread,
-				 unsigned int dev_idx,
-				 enum CRAS_IODEV_RAMP_REQUEST request)
-{
-	/* Do nothing if device wasn't already in the active dev list. */
-	struct cras_iodev *iodev;
-	struct open_dev *adev = dev_io_find_open_dev(
-		thread->open_devs[CRAS_STREAM_OUTPUT], dev_idx);
-	if (!adev)
-		return -EINVAL;
-	iodev = adev->dev;
-
-	/*
-	 * Checks if a device should start ramping for mute/unmute change.
-	 * Device must meet all the conditions:
-	 *
-	 * - Device has ramp support.
-	 * - Device is in normal run state, that is, it must be running with valid
-	 *   streams.
-	 * - Device volume, which considers both system volume and adjusted active
-	 *   node volume, is not zero. If device volume is zero, all the samples are
-	 *   suppressed to zero and there is no need to ramp.
-	 */
-	if (iodev->ramp &&
-	    cras_iodev_state(iodev) == CRAS_IODEV_STATE_NORMAL_RUN &&
-	    !cras_iodev_is_zero_volume(iodev))
-		return cras_iodev_start_ramp(iodev, request);
-	else
-		return cras_device_monitor_set_device_mute_state(
-			iodev->info.idx);
-}
-
-/* Return non-zero if the stream is attached to any device. */
-static int thread_find_stream(struct audio_thread *thread,
-			      struct cras_rstream *rstream)
-{
-	struct open_dev *open_dev;
-	struct dev_stream *s;
-
-	DL_FOREACH (thread->open_devs[rstream->direction], open_dev) {
-		DL_FOREACH (open_dev->dev->streams, s) {
-			if (s->stream == rstream)
-				return 1;
-		}
-	}
-	return 0;
-}
-
-/* Handles the disconnect_stream message from the main thread. */
-static int thread_disconnect_stream(struct audio_thread *thread,
-				    struct cras_rstream *stream,
-				    struct cras_iodev *dev)
-{
-	int rc;
-
-	if (!thread_find_stream(thread, stream))
-		return 0;
-
-	rc = dev_io_remove_stream(&thread->open_devs[stream->direction], stream,
-				  dev);
-
-	return rc;
-}
-
-/* Initiates draining of a stream or returns the status of a draining stream.
- * If the stream has completed draining the thread forfeits ownership and must
- * never reference it again.  Returns the number of milliseconds it will take to
- * finish draining, a minimum of one ms if any samples remain.
- */
-static int thread_drain_stream_ms_remaining(struct audio_thread *thread,
-					    struct cras_rstream *rstream)
-{
-	int fr_in_buff;
-	struct cras_audio_shm *shm;
-
-	if (rstream->direction != CRAS_STREAM_OUTPUT)
-		return 0;
-
-	shm = cras_rstream_shm(rstream);
-	fr_in_buff = cras_shm_get_frames(shm);
-
-	if (fr_in_buff <= 0)
-		return 0;
-
-	cras_rstream_set_is_draining(rstream, 1);
-
-	return 1 + cras_frames_to_ms(fr_in_buff, rstream->format.frame_rate);
-}
-
-/* Handles a request to begin draining and return the amount of time left to
- * draing a stream.
- */
-static int thread_drain_stream(struct audio_thread *thread,
-			       struct cras_rstream *rstream)
-{
-	int ms_left;
-
-	if (!thread_find_stream(thread, rstream))
-		return 0;
-
-	ms_left = thread_drain_stream_ms_remaining(thread, rstream);
-	if (ms_left == 0)
-		dev_io_remove_stream(&thread->open_devs[rstream->direction],
-				     rstream, NULL);
-
-	return ms_left;
-}
-
-/* Handles the add_stream message from the main thread. */
-static int thread_add_stream(struct audio_thread *thread,
-			     struct cras_rstream *stream,
-			     struct cras_iodev **iodevs,
-			     unsigned int num_iodevs)
-{
-	int rc;
-
-	rc = dev_io_append_stream(&thread->open_devs[CRAS_STREAM_OUTPUT],
-				  &thread->open_devs[CRAS_STREAM_INPUT], stream,
-				  iodevs, num_iodevs);
-	if (rc < 0)
-		return rc;
-
-	return 0;
-}
-
-/* Starts or stops aec dump task. */
-static int thread_set_aec_dump(struct audio_thread *thread,
-			       cras_stream_id_t stream_id, unsigned int start,
-			       int fd)
-{
-	struct open_dev *idev_list = thread->open_devs[CRAS_STREAM_INPUT];
-	struct open_dev *adev;
-	struct dev_stream *stream;
-
-	DL_FOREACH (idev_list, adev) {
-		if (!cras_iodev_is_open(adev->dev))
-			continue;
-
-		DL_FOREACH (adev->dev->streams, stream) {
-			if ((stream->stream->apm_list == NULL) ||
-			    (stream->stream->stream_id != stream_id))
-				continue;
-
-			cras_apm_list_set_aec_dump(stream->stream->apm_list,
-						   adev->dev, start, fd);
-		}
-	}
-	return 0;
-}
-
-/* Stop the playback thread */
-static void terminate_pb_thread()
-{
-	pthread_exit(0);
-}
-
-static void append_dev_dump_info(struct audio_dev_debug_info *di,
-				 struct open_dev *adev)
-{
-	struct cras_audio_format *fmt = adev->dev->format;
-	struct timespec now, time_since;
-	strncpy(di->dev_name, adev->dev->info.name, sizeof(di->dev_name));
-	di->buffer_size = adev->dev->buffer_size;
-	di->min_buffer_level = adev->dev->min_buffer_level;
-	di->min_cb_level = adev->dev->min_cb_level;
-	di->max_cb_level = adev->dev->max_cb_level;
-	di->direction = adev->dev->direction;
-	di->num_underruns = cras_iodev_get_num_underruns(adev->dev);
-	di->num_severe_underruns =
-		cras_iodev_get_num_severe_underruns(adev->dev);
-	di->highest_hw_level = adev->dev->highest_hw_level;
-	di->software_gain_scaler = (adev->dev->direction == CRAS_STREAM_INPUT) ?
-					   adev->dev->software_gain_scaler :
-					   0.0f;
-
-	clock_gettime(CLOCK_MONOTONIC_RAW, &now);
-	subtract_timespecs(&now, &adev->dev->open_ts, &time_since);
-	di->runtime_sec = time_since.tv_sec;
-	di->runtime_nsec = time_since.tv_nsec;
-	di->longest_wake_sec = adev->longest_wake.tv_sec;
-	di->longest_wake_nsec = adev->longest_wake.tv_nsec;
-
-	if (fmt) {
-		di->frame_rate = fmt->frame_rate;
-		di->num_channels = fmt->num_channels;
-		di->est_rate_ratio = cras_iodev_get_est_rate_ratio(adev->dev);
-	} else {
-		di->frame_rate = 0;
-		di->num_channels = 0;
-		di->est_rate_ratio = 0;
-	}
-}
-
-/* Put stream info for the given stream into the info struct. */
-static void append_stream_dump_info(struct audio_debug_info *info,
-				    struct dev_stream *stream,
-				    unsigned int dev_idx, int index)
-{
-	struct audio_stream_debug_info *si;
-	struct timespec now, time_since;
-
-	si = &info->streams[index];
-
-	si->stream_id = stream->stream->stream_id;
-	si->dev_idx = dev_idx;
-	si->direction = stream->stream->direction;
-	si->stream_type = stream->stream->stream_type;
-	si->client_type = stream->stream->client_type;
-	si->buffer_frames = stream->stream->buffer_frames;
-	si->cb_threshold = stream->stream->cb_threshold;
-	si->frame_rate = stream->stream->format.frame_rate;
-	si->num_channels = stream->stream->format.num_channels;
-	memcpy(si->channel_layout, stream->stream->format.channel_layout,
-	       sizeof(si->channel_layout));
-	si->longest_fetch_sec = stream->stream->longest_fetch_interval.tv_sec;
-	si->longest_fetch_nsec = stream->stream->longest_fetch_interval.tv_nsec;
-	si->num_overruns = cras_shm_num_overruns(stream->stream->shm);
-	si->effects = cras_apm_list_get_effects(stream->stream->apm_list);
-	si->pinned_dev_idx = stream->stream->pinned_dev_idx;
-	si->is_pinned = stream->stream->is_pinned;
-	si->num_missed_cb = stream->stream->num_missed_cb;
-	si->stream_volume = cras_rstream_get_volume_scaler(stream->stream);
-
-	clock_gettime(CLOCK_MONOTONIC_RAW, &now);
-	subtract_timespecs(&now, &stream->stream->start_ts, &time_since);
-	si->runtime_sec = time_since.tv_sec;
-	si->runtime_nsec = time_since.tv_nsec;
-}
-
-/* Handle a message sent from main thread to the audio thread.
- * Returns:
- *    Error code when reading or sending message fails.
- */
-static int handle_audio_thread_message(struct audio_thread *thread)
-{
-	uint8_t buf[256];
-	struct audio_thread_msg *msg = (struct audio_thread_msg *)buf;
-	int ret = 0;
-	int err;
-
-	err = audio_thread_read_command(thread, buf, 256);
-	if (err < 0)
-		return err;
-
-	ATLOG(atlog, AUDIO_THREAD_PB_MSG, msg->id, 0, 0);
-
-	switch (msg->id) {
-	case AUDIO_THREAD_ADD_STREAM: {
-		struct audio_thread_add_rm_stream_msg *amsg;
-		amsg = (struct audio_thread_add_rm_stream_msg *)msg;
-		ATLOG(atlog, AUDIO_THREAD_WRITE_STREAMS_WAIT,
-		      amsg->stream->stream_id, 0, 0);
-		ret = thread_add_stream(thread, amsg->stream, amsg->devs,
-					amsg->num_devs);
-		break;
-	}
-	case AUDIO_THREAD_DISCONNECT_STREAM: {
-		struct audio_thread_add_rm_stream_msg *rmsg;
-
-		rmsg = (struct audio_thread_add_rm_stream_msg *)msg;
-
-		ret = thread_disconnect_stream(thread, rmsg->stream,
-					       rmsg->devs[0]);
-		break;
-	}
-	case AUDIO_THREAD_ADD_OPEN_DEV: {
-		struct audio_thread_open_device_msg *rmsg;
-
-		rmsg = (struct audio_thread_open_device_msg *)msg;
-		ret = thread_add_open_dev(thread, rmsg->dev);
-		break;
-	}
-	case AUDIO_THREAD_RM_OPEN_DEV: {
-		struct audio_thread_rm_device_msg *rmsg;
-
-		rmsg = (struct audio_thread_rm_device_msg *)msg;
-		ret = thread_rm_open_dev(thread, rmsg->dir, rmsg->dev_idx);
-		break;
-	}
-	case AUDIO_THREAD_IS_DEV_OPEN: {
-		struct audio_thread_open_device_msg *rmsg;
-
-		rmsg = (struct audio_thread_open_device_msg *)msg;
-		ret = thread_is_dev_open(thread, rmsg->dev);
-		break;
-	}
-	case AUDIO_THREAD_STOP:
-		ret = 0;
-		err = audio_thread_send_response(thread, ret);
-		if (err < 0)
-			return err;
-		terminate_pb_thread();
-		break;
-	case AUDIO_THREAD_DUMP_THREAD_INFO: {
-		struct dev_stream *curr;
-		struct open_dev *adev;
-		struct audio_thread_dump_debug_info_msg *dmsg;
-		struct audio_debug_info *info;
-		unsigned int num_streams = 0;
-		unsigned int num_devs = 0;
-
-		ret = 0;
-		dmsg = (struct audio_thread_dump_debug_info_msg *)msg;
-		info = dmsg->info;
-
-		/* Go through all open devices. */
-		DL_FOREACH (thread->open_devs[CRAS_STREAM_OUTPUT], adev) {
-			append_dev_dump_info(&info->devs[num_devs], adev);
-			if (++num_devs == MAX_DEBUG_DEVS)
-				break;
-			DL_FOREACH (adev->dev->streams, curr) {
-				if (num_streams == MAX_DEBUG_STREAMS)
-					break;
-				append_stream_dump_info(info, curr,
-							adev->dev->info.idx,
-							num_streams++);
-			}
-		}
-		DL_FOREACH (thread->open_devs[CRAS_STREAM_INPUT], adev) {
-			if (num_devs == MAX_DEBUG_DEVS)
-				break;
-			append_dev_dump_info(&info->devs[num_devs], adev);
-			DL_FOREACH (adev->dev->streams, curr) {
-				if (num_streams == MAX_DEBUG_STREAMS)
-					break;
-				append_stream_dump_info(info, curr,
-							adev->dev->info.idx,
-							num_streams++);
-			}
-			++num_devs;
-		}
-		info->num_devs = num_devs;
-
-		info->num_streams = num_streams;
-
-		memcpy(&info->log, atlog, sizeof(info->log));
-		break;
-	}
-	case AUDIO_THREAD_DRAIN_STREAM: {
-		struct audio_thread_add_rm_stream_msg *rmsg;
-
-		rmsg = (struct audio_thread_add_rm_stream_msg *)msg;
-		ret = thread_drain_stream(thread, rmsg->stream);
-		break;
-	}
-	case AUDIO_THREAD_REMOVE_CALLBACK: {
-		struct audio_thread_rm_callback_msg *rmsg;
-
-		rmsg = (struct audio_thread_rm_callback_msg *)msg;
-		audio_thread_rm_callback(rmsg->fd);
-		break;
-	}
-	case AUDIO_THREAD_CONFIG_GLOBAL_REMIX: {
-		struct audio_thread_config_global_remix *rmsg;
-		void *rsp;
-
-		/* Respond the pointer to the old remix converter, so it can be
-		 * freed later in main thread. */
-		rsp = (void *)thread->remix_converter;
-
-		rmsg = (struct audio_thread_config_global_remix *)msg;
-		thread->remix_converter = rmsg->fmt_conv;
-
-		return write(thread->to_main_fds[1], &rsp, sizeof(rsp));
-	}
-	case AUDIO_THREAD_DEV_START_RAMP: {
-		struct audio_thread_dev_start_ramp_msg *rmsg;
-
-		rmsg = (struct audio_thread_dev_start_ramp_msg *)msg;
-		ret = thread_dev_start_ramp(thread, rmsg->dev_idx,
-					    rmsg->request);
-		break;
-	}
-	case AUDIO_THREAD_AEC_DUMP: {
-		struct audio_thread_aec_dump_msg *rmsg;
-		rmsg = (struct audio_thread_aec_dump_msg *)msg;
-		ret = thread_set_aec_dump(thread, rmsg->stream_id, rmsg->start,
-					  rmsg->fd);
-		break;
-	}
-	default:
-		ret = -EINVAL;
-		break;
-	}
-
-	err = audio_thread_send_response(thread, ret);
-	if (err < 0)
-		return err;
-	return 0;
-}
-
-/* Returns the number of active streams plus the number of active devices. */
-static int fill_next_sleep_interval(struct audio_thread *thread,
-				    struct timespec *ts)
-{
-	struct timespec min_ts;
-	struct timespec now;
-	int ret;
-
-	ts->tv_sec = 0;
-	ts->tv_nsec = 0;
-	/* Limit the sleep time to 20 seconds. */
-	min_ts.tv_sec = 20;
-	min_ts.tv_nsec = 0;
-	clock_gettime(CLOCK_MONOTONIC_RAW, &now);
-	add_timespecs(&min_ts, &now);
-	ret = dev_io_next_output_wake(&thread->open_devs[CRAS_STREAM_OUTPUT],
-				      &min_ts);
-	ret += dev_io_next_input_wake(&thread->open_devs[CRAS_STREAM_INPUT],
-				      &min_ts);
-	if (timespec_after(&min_ts, &now))
-		subtract_timespecs(&min_ts, &now, ts);
-
-	return ret;
-}
-
-static struct pollfd *add_pollfd(struct audio_thread *thread, int fd,
-				 int events)
-{
-	thread->pollfds[thread->num_pollfds].fd = fd;
-	thread->pollfds[thread->num_pollfds].events = events;
-	thread->num_pollfds++;
-	if (thread->num_pollfds >= thread->pollfds_size) {
-		thread->pollfds_size *= 2;
-		thread->pollfds = (struct pollfd *)realloc(
-			thread->pollfds,
-			sizeof(*thread->pollfds) * thread->pollfds_size);
-		return NULL;
-	}
-
-	return &thread->pollfds[thread->num_pollfds - 1];
-}
-
-static int continuous_zero_sleep_count = 0;
-static unsigned busyloop_count = 0;
-
-/*
- * Logs the number of busyloop during one audio thread running state
- * (wait_ts != NULL).
- */
-static void log_busyloop(struct timespec *wait_ts)
-{
-	static struct timespec start_time;
-	static bool started = false;
-	struct timespec diff, now;
-
-	/* If wait_ts is NULL, there is no stream running. */
-	if (wait_ts && !started) {
-		started = true;
-		busyloop_count = 0;
-		clock_gettime(CLOCK_MONOTONIC_RAW, &start_time);
-	} else if (!wait_ts && started) {
-		started = false;
-		clock_gettime(CLOCK_MONOTONIC_RAW, &now);
-		subtract_timespecs(&now, &start_time, &diff);
-		cras_server_metrics_busyloop(&diff, busyloop_count);
-	}
-}
-
-static void check_busyloop(struct timespec *wait_ts)
-{
-	if (wait_ts->tv_sec == 0 && wait_ts->tv_nsec == 0) {
-		continuous_zero_sleep_count++;
-		if (continuous_zero_sleep_count ==
-		    MAX_CONTINUOUS_ZERO_SLEEP_COUNT) {
-			busyloop_count++;
-			cras_audio_thread_event_busyloop();
-		}
-		if (continuous_zero_sleep_count ==
-		    MAX_CONTINUOUS_ZERO_SLEEP_METRIC_LIMIT)
-			cras_server_metrics_busyloop_length(
-				continuous_zero_sleep_count);
-
-	} else {
-		if (continuous_zero_sleep_count >=
-			    MAX_CONTINUOUS_ZERO_SLEEP_COUNT &&
-		    continuous_zero_sleep_count <
-			    MAX_CONTINUOUS_ZERO_SLEEP_METRIC_LIMIT)
-			cras_server_metrics_busyloop_length(
-				continuous_zero_sleep_count);
-		continuous_zero_sleep_count = 0;
-	}
-}
-
-/* For playback, fill the audio buffer when needed, for capture, pull out
- * samples when they are ready.
- * This thread will attempt to run at a high priority to allow for low latency
- * streams.  This thread sleeps while the device plays back or captures audio,
- * it will wake up as little as it can while avoiding xruns.  It can also be
- * woken by sending it a message using the "audio_thread_post_message" function.
- */
-static void *audio_io_thread(void *arg)
-{
-	struct audio_thread *thread = (struct audio_thread *)arg;
-	struct open_dev *adev;
-	struct dev_stream *curr;
-	struct timespec ts;
-	int msg_fd;
-	int rc;
-
-	msg_fd = thread->to_thread_fds[0];
-
-	/* Attempt to get realtime scheduling */
-	if (cras_set_rt_scheduling(CRAS_SERVER_RT_THREAD_PRIORITY) == 0)
-		cras_set_thread_priority(CRAS_SERVER_RT_THREAD_PRIORITY);
-
-	thread->pollfds[0].fd = msg_fd;
-	thread->pollfds[0].events = POLLIN;
-
-	while (1) {
-		struct timespec *wait_ts;
-		struct iodev_callback_list *iodev_cb;
-		int non_empty;
-
-		wait_ts = NULL;
-		thread->num_pollfds = 1;
-
-		/* device opened */
-		dev_io_run(&thread->open_devs[CRAS_STREAM_OUTPUT],
-			   &thread->open_devs[CRAS_STREAM_INPUT],
-			   thread->remix_converter);
-
-		non_empty = dev_io_check_non_empty_state_transition(
-			thread->open_devs[CRAS_STREAM_OUTPUT]);
-
-		if (fill_next_sleep_interval(thread, &ts))
-			wait_ts = &ts;
-
-	restart_poll_loop:
-		thread->num_pollfds = 1;
-
-		DL_FOREACH (iodev_callbacks, iodev_cb) {
-			if (iodev_cb->trigger != TRIGGER_POLL) {
-				iodev_cb->pollfd = NULL;
-				continue;
-			}
-			iodev_cb->pollfd = add_pollfd(thread, iodev_cb->fd,
-						      iodev_cb->events);
-			if (!iodev_cb->pollfd)
-				goto restart_poll_loop;
-		}
-
-		/* TODO(dgreid) - once per rstream not per dev_stream */
-		DL_FOREACH (thread->open_devs[CRAS_STREAM_OUTPUT], adev) {
-			DL_FOREACH (adev->dev->streams, curr) {
-				int fd = dev_stream_poll_stream_fd(curr);
-				if (fd < 0)
-					continue;
-				if (!add_pollfd(thread, fd, POLLIN))
-					goto restart_poll_loop;
-			}
-		}
-		DL_FOREACH (thread->open_devs[CRAS_STREAM_INPUT], adev) {
-			DL_FOREACH (adev->dev->streams, curr) {
-				int fd = dev_stream_poll_stream_fd(curr);
-				if (fd < 0)
-					continue;
-				if (!add_pollfd(thread, fd, POLLIN))
-					goto restart_poll_loop;
-			}
-		}
-
-		log_busyloop(wait_ts);
-
-		ATLOG(atlog, AUDIO_THREAD_SLEEP, wait_ts ? wait_ts->tv_sec : 0,
-		      wait_ts ? wait_ts->tv_nsec : 0, non_empty);
-		if (wait_ts)
-			check_busyloop(wait_ts);
-
-		/* Sync atlog with shared memory. */
-		__sync_synchronize();
-		atlog->sync_write_pos = atlog->write_pos;
-
-		rc = ppoll(thread->pollfds, thread->num_pollfds, wait_ts, NULL);
-		ATLOG(atlog, AUDIO_THREAD_WAKE, rc, 0, 0);
-
-		/* Handle callbacks registered by TRIGGER_WAKEUP */
-		DL_FOREACH (iodev_callbacks, iodev_cb) {
-			if (iodev_cb->trigger == TRIGGER_WAKEUP) {
-				ATLOG(atlog, AUDIO_THREAD_IODEV_CB, 0, 0, 0);
-				iodev_cb->cb(iodev_cb->cb_data, 0);
-			}
-		}
-
-		/* If there's no pollfd ready to handle. */
-		if (rc <= 0)
-			continue;
-
-		if (thread->pollfds[0].revents & POLLIN) {
-			rc = handle_audio_thread_message(thread);
-			if (rc < 0)
-				syslog(LOG_ERR, "handle message %d", rc);
-		}
-
-		DL_FOREACH (iodev_callbacks, iodev_cb) {
-			if (iodev_cb->pollfd &&
-			    iodev_cb->pollfd->revents & iodev_cb->events) {
-				ATLOG(atlog, AUDIO_THREAD_IODEV_CB,
-				      iodev_cb->pollfd->revents,
-				      iodev_cb->events, 0);
-				iodev_cb->cb(iodev_cb->cb_data,
-					     iodev_cb->pollfd->revents);
-			}
-		}
-	}
-
-	return NULL;
-}
-
-/* Write a message to the playback thread and wait for an ack, This keeps these
- * operations synchronous for the main server thread.  For instance when the
- * RM_STREAM message is sent, the stream can be deleted after the function
- * returns.  Making this synchronous also allows the thread to return an error
- * code that can be handled by the caller.
- * Args:
- *    thread - thread to receive message.
- *    msg - The message to send.
- * Returns:
- *    A return code from the message handler in the thread.
- */
-static int audio_thread_post_message(struct audio_thread *thread,
-				     struct audio_thread_msg *msg)
-{
-	int err, rsp;
-
-	err = write(thread->to_thread_fds[1], msg, msg->length);
-	if (err < 0) {
-		syslog(LOG_ERR, "Failed to post message to thread.");
-		return err;
-	}
-	/* Synchronous action, wait for response. */
-	err = read_until_finished(thread->to_main_fds[0], &rsp, sizeof(rsp));
-	if (err < 0) {
-		syslog(LOG_ERR, "Failed to read reply from thread.");
-		return err;
-	}
-
-	return rsp;
-}
-
-static void init_open_device_msg(struct audio_thread_open_device_msg *msg,
-				 enum AUDIO_THREAD_COMMAND id,
-				 struct cras_iodev *dev)
-{
-	memset(msg, 0, sizeof(*msg));
-	msg->header.id = id;
-	msg->header.length = sizeof(*msg);
-	msg->dev = dev;
-}
-
-static void init_rm_device_msg(struct audio_thread_rm_device_msg *msg,
-			       enum CRAS_STREAM_DIRECTION dir,
-			       unsigned int dev_idx)
-{
-	memset(msg, 0, sizeof(*msg));
-	msg->header.id = AUDIO_THREAD_RM_OPEN_DEV;
-	msg->header.length = sizeof(*msg);
-	msg->dir = dir;
-	msg->dev_idx = dev_idx;
-}
-
-static void init_add_rm_stream_msg(struct audio_thread_add_rm_stream_msg *msg,
-				   enum AUDIO_THREAD_COMMAND id,
-				   struct cras_rstream *stream,
-				   struct cras_iodev **devs,
-				   unsigned int num_devs)
-{
-	memset(msg, 0, sizeof(*msg));
-	msg->header.id = id;
-	msg->header.length = sizeof(*msg);
-	msg->stream = stream;
-	msg->devs = devs;
-	msg->num_devs = num_devs;
-}
-
-static void
-init_dump_debug_info_msg(struct audio_thread_dump_debug_info_msg *msg,
-			 struct audio_debug_info *info)
-{
-	memset(msg, 0, sizeof(*msg));
-	msg->header.id = AUDIO_THREAD_DUMP_THREAD_INFO;
-	msg->header.length = sizeof(*msg);
-	msg->info = info;
-}
-
-static void
-init_config_global_remix_msg(struct audio_thread_config_global_remix *msg)
-{
-	memset(msg, 0, sizeof(*msg));
-	msg->header.id = AUDIO_THREAD_CONFIG_GLOBAL_REMIX;
-	msg->header.length = sizeof(*msg);
-}
-
-static void
-init_device_start_ramp_msg(struct audio_thread_dev_start_ramp_msg *msg,
-			   enum AUDIO_THREAD_COMMAND id, unsigned int dev_idx,
-			   enum CRAS_IODEV_RAMP_REQUEST request)
-{
-	memset(msg, 0, sizeof(*msg));
-	msg->header.id = id;
-	msg->header.length = sizeof(*msg);
-	msg->dev_idx = dev_idx;
-	msg->request = request;
-}
-
-/* Exported Interface */
-
-int audio_thread_event_log_shm_fd()
-{
-	return atlog_ro_shm_fd;
-}
-
-int audio_thread_add_stream(struct audio_thread *thread,
-			    struct cras_rstream *stream,
-			    struct cras_iodev **devs, unsigned int num_devs)
-{
-	struct audio_thread_add_rm_stream_msg msg;
-
-	assert(thread && stream);
-
-	if (!thread->started)
-		return -EINVAL;
-
-	init_add_rm_stream_msg(&msg, AUDIO_THREAD_ADD_STREAM, stream, devs,
-			       num_devs);
-	return audio_thread_post_message(thread, &msg.header);
-}
-
-int audio_thread_disconnect_stream(struct audio_thread *thread,
-				   struct cras_rstream *stream,
-				   struct cras_iodev *dev)
-{
-	struct audio_thread_add_rm_stream_msg msg;
-
-	assert(thread && stream);
-
-	init_add_rm_stream_msg(&msg, AUDIO_THREAD_DISCONNECT_STREAM, stream,
-			       &dev, 0);
-	return audio_thread_post_message(thread, &msg.header);
-}
-
-int audio_thread_drain_stream(struct audio_thread *thread,
-			      struct cras_rstream *stream)
-{
-	struct audio_thread_add_rm_stream_msg msg;
-
-	assert(thread && stream);
-
-	init_add_rm_stream_msg(&msg, AUDIO_THREAD_DRAIN_STREAM, stream, NULL,
-			       0);
-	return audio_thread_post_message(thread, &msg.header);
-}
-
-int audio_thread_dump_thread_info(struct audio_thread *thread,
-				  struct audio_debug_info *info)
-{
-	struct audio_thread_dump_debug_info_msg msg;
-
-	init_dump_debug_info_msg(&msg, info);
-	return audio_thread_post_message(thread, &msg.header);
-}
-
-int audio_thread_set_aec_dump(struct audio_thread *thread,
-			      cras_stream_id_t stream_id, unsigned int start,
-			      int fd)
-{
-	struct audio_thread_aec_dump_msg msg;
-
-	memset(&msg, 0, sizeof(msg));
-	msg.header.id = AUDIO_THREAD_AEC_DUMP;
-	msg.header.length = sizeof(msg);
-	msg.stream_id = stream_id;
-	msg.start = start;
-	msg.fd = fd;
-	return audio_thread_post_message(thread, &msg.header);
-}
-
-int audio_thread_rm_callback_sync(struct audio_thread *thread, int fd)
-{
-	struct audio_thread_rm_callback_msg msg;
-
-	memset(&msg, 0, sizeof(msg));
-	msg.header.id = AUDIO_THREAD_REMOVE_CALLBACK;
-	msg.header.length = sizeof(msg);
-	msg.fd = fd;
-
-	return audio_thread_post_message(thread, &msg.header);
-}
-
-int audio_thread_config_global_remix(struct audio_thread *thread,
-				     unsigned int num_channels,
-				     const float *coefficient)
-{
-	int err;
-	int identity_remix = 1;
-	unsigned int i, j;
-	struct audio_thread_config_global_remix msg;
-	void *rsp;
-
-	init_config_global_remix_msg(&msg);
-
-	/* Check if the coefficients represent an identity matrix for remix
-	 * conversion, which means no remix at all. If so then leave the
-	 * converter as NULL. */
-	for (i = 0; i < num_channels; i++) {
-		if (coefficient[i * num_channels + i] != 1.0f) {
-			identity_remix = 0;
-			break;
-		}
-		for (j = i + 1; j < num_channels; j++) {
-			if (coefficient[i * num_channels + j] != 0 ||
-			    coefficient[j * num_channels + i] != 0) {
-				identity_remix = 0;
-				break;
-			}
-		}
-	}
-
-	if (!identity_remix) {
-		msg.fmt_conv = cras_channel_remix_conv_create(num_channels,
-							      coefficient);
-		if (NULL == msg.fmt_conv)
-			return -ENOMEM;
-	}
-
-	err = write(thread->to_thread_fds[1], &msg, msg.header.length);
-	if (err < 0) {
-		syslog(LOG_ERR, "Failed to post message to thread.");
-		return err;
-	}
-	/* Synchronous action, wait for response. */
-	err = read_until_finished(thread->to_main_fds[0], &rsp, sizeof(rsp));
-	if (err < 0) {
-		syslog(LOG_ERR, "Failed to read reply from thread.");
-		return err;
-	}
-
-	if (rsp)
-		cras_fmt_conv_destroy((struct cras_fmt_conv **)&rsp);
-	return 0;
-}
-
-struct audio_thread *audio_thread_create()
-{
-	int rc;
-	struct audio_thread *thread;
-
-	thread = (struct audio_thread *)calloc(1, sizeof(*thread));
-	if (!thread)
-		return NULL;
-
-	thread->to_thread_fds[0] = -1;
-	thread->to_thread_fds[1] = -1;
-	thread->to_main_fds[0] = -1;
-	thread->to_main_fds[1] = -1;
-
-	/* Two way pipes for communication with the device's audio thread. */
-	rc = pipe(thread->to_thread_fds);
-	if (rc < 0) {
-		syslog(LOG_ERR, "Failed to pipe");
-		free(thread);
-		return NULL;
-	}
-	rc = pipe(thread->to_main_fds);
-	if (rc < 0) {
-		syslog(LOG_ERR, "Failed to pipe");
-		free(thread);
-		return NULL;
-	}
-
-	if (asprintf(&atlog_name, "/ATlog-%d", getpid()) < 0) {
-		syslog(LOG_ERR, "Failed to generate ATlog name.");
-		exit(-1);
-	}
-
-	atlog = audio_thread_event_log_init(atlog_name);
-
-	thread->pollfds_size = 32;
-	thread->pollfds = (struct pollfd *)malloc(sizeof(*thread->pollfds) *
-						  thread->pollfds_size);
-
-	return thread;
-}
-
-int audio_thread_add_open_dev(struct audio_thread *thread,
-			      struct cras_iodev *dev)
-{
-	struct audio_thread_open_device_msg msg;
-
-	assert(thread && dev);
-
-	if (!thread->started)
-		return -EINVAL;
-
-	init_open_device_msg(&msg, AUDIO_THREAD_ADD_OPEN_DEV, dev);
-	return audio_thread_post_message(thread, &msg.header);
-}
-
-int audio_thread_rm_open_dev(struct audio_thread *thread,
-			     enum CRAS_STREAM_DIRECTION dir,
-			     unsigned int dev_idx)
-{
-	struct audio_thread_rm_device_msg msg;
-
-	assert(thread);
-	if (!thread->started)
-		return -EINVAL;
-
-	init_rm_device_msg(&msg, dir, dev_idx);
-	return audio_thread_post_message(thread, &msg.header);
-}
-
-int audio_thread_is_dev_open(struct audio_thread *thread,
-			     struct cras_iodev *dev)
-{
-	struct audio_thread_open_device_msg msg;
-
-	if (!dev)
-		return 0;
-
-	init_open_device_msg(&msg, AUDIO_THREAD_IS_DEV_OPEN, dev);
-	return audio_thread_post_message(thread, &msg.header);
-}
-
-int audio_thread_dev_start_ramp(struct audio_thread *thread,
-				unsigned int dev_idx,
-				enum CRAS_IODEV_RAMP_REQUEST request)
-{
-	struct audio_thread_dev_start_ramp_msg msg;
-
-	assert(thread);
-
-	if (!thread->started)
-		return -EINVAL;
-
-	init_device_start_ramp_msg(&msg, AUDIO_THREAD_DEV_START_RAMP, dev_idx,
-				   request);
-	return audio_thread_post_message(thread, &msg.header);
-}
-
-int audio_thread_start(struct audio_thread *thread)
-{
-	int rc;
-
-	rc = pthread_create(&thread->tid, NULL, audio_io_thread, thread);
-	if (rc) {
-		syslog(LOG_ERR, "Failed pthread_create");
-		return rc;
-	}
-
-	thread->started = 1;
-
-	return 0;
-}
-
-void audio_thread_destroy(struct audio_thread *thread)
-{
-	if (thread->started) {
-		struct audio_thread_msg msg;
-
-		msg.id = AUDIO_THREAD_STOP;
-		msg.length = sizeof(msg);
-		audio_thread_post_message(thread, &msg);
-		pthread_join(thread->tid, NULL);
-	}
-
-	free(thread->pollfds);
-
-	audio_thread_event_log_deinit(atlog, atlog_name);
-	free(atlog_name);
-
-	if (thread->to_thread_fds[0] != -1) {
-		close(thread->to_thread_fds[0]);
-		close(thread->to_thread_fds[1]);
-	}
-	if (thread->to_main_fds[0] != -1) {
-		close(thread->to_main_fds[0]);
-		close(thread->to_main_fds[1]);
-	}
-
-	if (thread->remix_converter)
-		cras_fmt_conv_destroy(&thread->remix_converter);
-
-	free(thread);
-}
diff --git a/cras/src/server/audio_thread.h b/cras/src/server/audio_thread.h
deleted file mode 100644
index 34b4786..0000000
--- a/cras/src/server/audio_thread.h
+++ /dev/null
@@ -1,222 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef AUDIO_THREAD_H_
-#define AUDIO_THREAD_H_
-
-#include <pthread.h>
-#include <stdint.h>
-
-#include "cras_iodev.h"
-#include "cras_types.h"
-#include "dev_io.h"
-
-struct buffer_share;
-struct cras_fmt_conv;
-struct cras_iodev;
-struct cras_rstream;
-struct dev_stream;
-
-/* Hold communication pipes and pthread info for the thread used to play or
- * record audio.
- *    to_thread_fds - Send a message from main to running thread.
- *    to_main_fds - Send a synchronous response to main from running thread.
- *    tid - Thread ID of the running playback/capture thread.
- *    started - Non-zero if the thread has started successfully.
- *    suspended - Non-zero if the thread is suspended.
- *    open_devs - Lists of open input and output devices.
- *    pollfds - What FDs wake up this thread.
- *    pollfds_size - Number of available poll fds.
- *    num_pollfds - Number of currently registered poll fds.
- *    remix_converter - Format converter used to remix output channels.
- */
-struct audio_thread {
-	int to_thread_fds[2];
-	int to_main_fds[2];
-	pthread_t tid;
-	int started;
-	int suspended;
-	struct open_dev *open_devs[CRAS_NUM_DIRECTIONS];
-	struct pollfd *pollfds;
-	size_t pollfds_size;
-	size_t num_pollfds;
-	struct cras_fmt_conv *remix_converter;
-};
-
-/*
- * Enum to specify how a registered event callback be triggered.
- * TRIGGER_NONE - Callback will not be triggered.
- * TRIGGER_POLL - Triggered by poll given fd and revent.
- * TRIGGER_WAKEUP - Triggered everytime when audio thread wakes up.
- */
-enum AUDIO_THREAD_EVENTS_CB_TRIGGER {
-	TRIGGER_NONE,
-	TRIGGER_POLL,
-	TRIGGER_WAKEUP,
-};
-
-/* Callback function to be handled in main loop in audio thread.
- * Args:
- *    data - The data for callback function.
- *    revent - The returned event from ppoll().
- */
-typedef int (*thread_callback)(void *data, int revent);
-
-/* Creates an audio thread.
- * Returns:
- *    A pointer to the newly created audio thread.  It must be freed by calling
- *    audio_thread_destroy().  Returns NULL on error.
- */
-struct audio_thread *audio_thread_create();
-
-/* Adds an open device.
- * Args:
- *    thread - The thread to add open device to.
- *    dev - The open device to add.
- */
-int audio_thread_add_open_dev(struct audio_thread *thread,
-			      struct cras_iodev *dev);
-
-/* Removes an open device.
- * Args:
- *    thread - The thread to remove open device from.
- *    dev - The open device to remove.
- */
-int audio_thread_rm_open_dev(struct audio_thread *thread,
-			     enum CRAS_STREAM_DIRECTION dir,
-			     unsigned int dev_idx);
-
-/* Checks if dev is open and used by audio thread.
- * Args:
- *    thread - The thread accessing open devs.
- *    dev - The device to check if it has already been open.
- */
-int audio_thread_is_dev_open(struct audio_thread *thread,
-			     struct cras_iodev *dev);
-
-/* Adds a thread_callback to audio thread for requested events. By default
- * the callback trigger is set to TRIGGER_POLL.
- * Args:
- *    fd - The file descriptor to be polled for the callback.
- *      The callback will be called when any of requested events matched.
- *    cb - The callback function.
- *    data - The data for the callback function.
- *    events - The requested events to ppoll().
- */
-void audio_thread_add_events_callback(int fd, thread_callback cb, void *data,
-				      int events);
-
-/* Removes an thread_callback from audio thread.
- * Args:
- *    fd - The file descriptor of the previous added callback.
- */
-void audio_thread_rm_callback(int fd);
-
-/* Removes a thread_callback from main thread.
- * Args:
- *     thread - The thread to remove callback from.
- *     fd - The file descriptor of the previous added callback.
- */
-int audio_thread_rm_callback_sync(struct audio_thread *thread, int fd);
-
-/* Configures the callback associated with fd when it should be triggerred.
- * Args:
- *    fd - The file descriptor associate to the callback.
- *    trigger - Specifies how the callback should be triggered.
- */
-void audio_thread_config_events_callback(
-	int fd, enum AUDIO_THREAD_EVENTS_CB_TRIGGER trigger);
-
-/* Starts a thread created with audio_thread_create.
- * Args:
- *    thread - The thread to start.
- * Returns:
- *    0 on success, return code from pthread_crate on failure.
- */
-int audio_thread_start(struct audio_thread *thread);
-
-/* Frees an audio thread created with audio_thread_create(). */
-void audio_thread_destroy(struct audio_thread *thread);
-
-/* Returns the shm fd for the ATlog. */
-int audio_thread_event_log_shm_fd();
-
-/* Add a stream to the thread. After this call, the ownership of the stream will
- * be passed to the audio thread. Audio thread is responsible to release the
- * stream's resources.
- * Args:
- *    thread - a pointer to the audio thread.
- *    stream - the new stream to add.
- *    devs - an array of devices to attach stream.
- *    num_devs - number of devices in the array pointed by devs
- * Returns:
- *    zero on success, negative error from the AUDIO_THREAD enum above when an
- *    the thread can't be added.
- */
-int audio_thread_add_stream(struct audio_thread *thread,
-			    struct cras_rstream *stream,
-			    struct cras_iodev **devs, unsigned int num_devs);
-
-/* Begin draining a stream and check the draining status.
- * Args:
- *    thread - a pointer to the audio thread.
- *    stream - the stream to drain/remove.
- * Returns:
- *    zero if the stream is drained and can be deleted.  If the stream is not
- *    completely drained, then the number of milliseconds until is is drained
- *    are returned.
- */
-int audio_thread_drain_stream(struct audio_thread *thread,
-			      struct cras_rstream *stream);
-
-/* Disconnect a stream from the client.
- * Args:
- *    thread - a pointer to the audio thread.
- *    stream - the stream to be disconnected.
- *    iodev - the device to disconnect from.
- * Returns:
- *    0 on success, negative if error.
- */
-int audio_thread_disconnect_stream(struct audio_thread *thread,
-				   struct cras_rstream *stream,
-				   struct cras_iodev *iodev);
-
-/* Dumps information about all active streams to syslog. */
-int audio_thread_dump_thread_info(struct audio_thread *thread,
-				  struct audio_debug_info *info);
-
-/* Starts or stops the aec dump task.
- * Args:
- *    thread - pointer to the audio thread.
- *    stream_id - id of the target stream for aec dump.
- *    start - True to start the aec dump, false to stop.
- *    fd - File to store aec dump result.
- */
-int audio_thread_set_aec_dump(struct audio_thread *thread,
-			      cras_stream_id_t stream_id, unsigned int start,
-			      int fd);
-
-/* Configures the global converter for output remixing. Called by main
- * thread. */
-int audio_thread_config_global_remix(struct audio_thread *thread,
-				     unsigned int num_channels,
-				     const float *coefficient);
-
-/* Start ramping on a device.
- *
- * Ramping is started/updated in audio thread. This function lets the main
- * thread request that the audio thread start ramping.
- *
- * Args:
- *   thread - a pointer to the audio thread.
- *   dev_idx - Index of the the device to start ramping.
- *   request - Check the docstrings of CRAS_IODEV_RAMP_REQUEST.
- * Returns:
- *    0 on success, negative if error.
- */
-int audio_thread_dev_start_ramp(struct audio_thread *thread,
-				unsigned int dev_idx,
-				enum CRAS_IODEV_RAMP_REQUEST request);
-#endif /* AUDIO_THREAD_H_ */
diff --git a/cras/src/server/audio_thread_log.h b/cras/src/server/audio_thread_log.h
deleted file mode 100644
index ee5d159..0000000
--- a/cras/src/server/audio_thread_log.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/* Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- *
- * The blow logging funcitons must only be called from the audio thread.
- */
-
-#ifndef AUDIO_THREAD_LOG_H_
-#define AUDIO_THREAD_LOG_H_
-
-#include <sys/mman.h>
-#include <pthread.h>
-#include <stdint.h>
-#include <syslog.h>
-
-#include "cras_types.h"
-#include "cras_shm.h"
-
-#define AUDIO_THREAD_LOGGING 1
-
-#if (AUDIO_THREAD_LOGGING)
-#define ATLOG(log, event, data1, data2, data3)                                 \
-	audio_thread_event_log_data(log, event, data1, data2, data3);
-#else
-#define ATLOG(log, event, data1, data2, data3)
-#endif
-
-extern struct audio_thread_event_log *atlog;
-extern int atlog_rw_shm_fd;
-extern int atlog_ro_shm_fd;
-
-static inline struct audio_thread_event_log *
-audio_thread_event_log_init(char *name)
-{
-	struct audio_thread_event_log *log;
-
-	atlog_ro_shm_fd = -1;
-	atlog_rw_shm_fd = -1;
-
-	log = (struct audio_thread_event_log *)cras_shm_setup(
-		name, sizeof(*log), &atlog_rw_shm_fd, &atlog_ro_shm_fd);
-	/* Fallback to calloc if device shared memory resource is empty and
-	 * cras_shm_setup fails.
-	 */
-	if (log == NULL) {
-		syslog(LOG_ERR, "Failed to create atlog by cras_shm_setup");
-		log = (struct audio_thread_event_log *)calloc(
-			1, sizeof(struct audio_thread_event_log));
-	}
-	log->len = AUDIO_THREAD_EVENT_LOG_SIZE;
-
-	return log;
-}
-
-static inline void
-audio_thread_event_log_deinit(struct audio_thread_event_log *log, char *name)
-{
-	if (log) {
-		if (atlog_rw_shm_fd >= 0) {
-			munmap(log, sizeof(*log));
-			cras_shm_close_unlink(name, atlog_rw_shm_fd);
-		} else {
-			free(log);
-		}
-
-		if (atlog_ro_shm_fd >= 0)
-			close(atlog_ro_shm_fd);
-	}
-}
-
-/* Log a tag and the current time, Uses two words, the first is split
- * 8 bits for tag and 24 for seconds, second word is micro seconds.
- */
-static inline void
-audio_thread_event_log_data(struct audio_thread_event_log *log,
-			    enum AUDIO_THREAD_LOG_EVENTS event, uint32_t data1,
-			    uint32_t data2, uint32_t data3)
-{
-	struct timespec now;
-	uint64_t pos_mod_len = log->write_pos % AUDIO_THREAD_EVENT_LOG_SIZE;
-	clock_gettime(CLOCK_MONOTONIC_RAW, &now);
-
-	log->log[pos_mod_len].tag_sec =
-		(event << 24) | (now.tv_sec & 0x00ffffff);
-	log->log[pos_mod_len].nsec = now.tv_nsec;
-	log->log[pos_mod_len].data1 = data1;
-	log->log[pos_mod_len].data2 = data2;
-	log->log[pos_mod_len].data3 = data3;
-
-	log->write_pos++;
-}
-
-#endif /* AUDIO_THREAD_LOG_H_ */
diff --git a/cras/src/server/buffer_share.c b/cras/src/server/buffer_share.c
deleted file mode 100644
index 5d106f0..0000000
--- a/cras/src/server/buffer_share.c
+++ /dev/null
@@ -1,171 +0,0 @@
-/* Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <stdlib.h>
-#include <sys/param.h>
-
-#include "cras_types.h"
-#include "buffer_share.h"
-
-static inline struct id_offset *find_unused(const struct buffer_share *mix)
-{
-	unsigned int i;
-
-	for (i = 0; i < mix->id_sz; i++) {
-		if (!mix->wr_idx[i].used)
-			return &mix->wr_idx[i];
-	}
-
-	return NULL;
-}
-
-static inline struct id_offset *find_id(const struct buffer_share *mix,
-					unsigned int id)
-{
-	unsigned int i;
-
-	for (i = 0; i < mix->id_sz; i++) {
-		if (mix->wr_idx[i].used && id == mix->wr_idx[i].id)
-			return &mix->wr_idx[i];
-	}
-
-	return NULL;
-}
-
-static void alloc_more_ids(struct buffer_share *mix)
-{
-	unsigned int new_size = mix->id_sz * 2;
-	unsigned int i;
-
-	mix->wr_idx = (struct id_offset *)realloc(
-		mix->wr_idx, sizeof(mix->wr_idx[0]) * new_size);
-
-	for (i = mix->id_sz; i < new_size; i++)
-		mix->wr_idx[i].used = 0;
-
-	mix->id_sz = new_size;
-}
-
-struct buffer_share *buffer_share_create(unsigned int buf_sz)
-{
-	struct buffer_share *mix;
-
-	mix = (struct buffer_share *)calloc(1, sizeof(*mix));
-	mix->id_sz = INITIAL_ID_SIZE;
-	mix->wr_idx =
-		(struct id_offset *)calloc(mix->id_sz, sizeof(mix->wr_idx[0]));
-	mix->buf_sz = buf_sz;
-
-	return mix;
-}
-
-void buffer_share_destroy(struct buffer_share *mix)
-{
-	if (!mix)
-		return;
-	free(mix->wr_idx);
-	free(mix);
-}
-
-int buffer_share_add_id(struct buffer_share *mix, unsigned int id, void *data)
-{
-	struct id_offset *o;
-
-	o = find_id(mix, id);
-	if (o)
-		return -EEXIST;
-
-	o = find_unused(mix);
-	if (!o)
-		alloc_more_ids(mix);
-
-	o = find_unused(mix);
-	o->used = 1;
-	o->id = id;
-	o->offset = 0;
-	o->data = data;
-
-	return 0;
-}
-
-int buffer_share_rm_id(struct buffer_share *mix, unsigned int id)
-{
-	struct id_offset *o;
-
-	o = find_id(mix, id);
-	if (!o)
-		return -ENOENT;
-	o->used = 0;
-	o->data = NULL;
-
-	return 0;
-}
-
-int buffer_share_offset_update(struct buffer_share *mix, unsigned int id,
-			       unsigned int delta)
-{
-	unsigned int i;
-
-	for (i = 0; i < mix->id_sz; i++) {
-		if (id != mix->wr_idx[i].id)
-			continue;
-
-		mix->wr_idx[i].offset += delta;
-		break;
-	}
-
-	return 0;
-}
-
-unsigned int buffer_share_get_new_write_point(struct buffer_share *mix)
-{
-	unsigned int min_written = mix->buf_sz + 1;
-	unsigned int i;
-
-	for (i = 0; i < mix->id_sz; i++) {
-		struct id_offset *o = &mix->wr_idx[i];
-
-		if (!o->used)
-			continue;
-
-		min_written = MIN(min_written, o->offset);
-	}
-	for (i = 0; i < mix->id_sz; i++) {
-		struct id_offset *o = &mix->wr_idx[i];
-		o->offset -= min_written;
-	}
-
-	if (min_written > mix->buf_sz)
-		return 0;
-
-	return min_written;
-}
-
-static struct id_offset *get_id_offset(const struct buffer_share *mix,
-				       unsigned int id)
-{
-	unsigned int i;
-	struct id_offset *o;
-
-	for (i = 0; i < mix->id_sz; i++) {
-		o = &mix->wr_idx[i];
-		if (o->used && o->id == id)
-			return o;
-	}
-	return NULL;
-}
-
-unsigned int buffer_share_id_offset(const struct buffer_share *mix,
-				    unsigned int id)
-{
-	struct id_offset *o = get_id_offset(mix, id);
-	return o ? o->offset : 0;
-}
-
-void *buffer_share_get_data(const struct buffer_share *mix, unsigned int id)
-{
-	struct id_offset *o = get_id_offset(mix, id);
-	return o ? o->data : NULL;
-}
diff --git a/cras/src/server/buffer_share.h b/cras/src/server/buffer_share.h
deleted file mode 100644
index c61c7a0..0000000
--- a/cras/src/server/buffer_share.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/* Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef BUFFER_SHARE_H_
-#define BUFFER_SHARE_H_
-
-#define INITIAL_ID_SIZE 3
-
-struct id_offset {
-	unsigned int used;
-	unsigned int id;
-	unsigned int offset;
-	void *data;
-};
-
-struct buffer_share {
-	unsigned int buf_sz;
-	unsigned int id_sz;
-	struct id_offset *wr_idx;
-};
-
-/*
- * Creates a buffer share object.  This object is used to manage the read or
- * write offsets of several users in one shared buffer.
- */
-struct buffer_share *buffer_share_create(unsigned int buf_sz);
-
-/* Destroys a buffer_share returned from buffer_share_create. */
-void buffer_share_destroy(struct buffer_share *mix);
-
-/* Adds an ID that shares the buffer. */
-int buffer_share_add_id(struct buffer_share *mix, unsigned int id, void *data);
-
-/* Removes an ID that shares the buffer. */
-int buffer_share_rm_id(struct buffer_share *mix, unsigned int id);
-
-/* Updates the offset of the given user into the shared buffer. */
-int buffer_share_offset_update(struct buffer_share *mix, unsigned int id,
-			       unsigned int frames);
-
-/*
- * Updates the write point to the minimum offset from all users.
- * Returns the number of minimum number of frames written.
- */
-unsigned int buffer_share_get_new_write_point(struct buffer_share *mix);
-
-/*
- * The amount by which the user given by id is ahead of the current write
- * point.
- */
-unsigned int buffer_share_id_offset(const struct buffer_share *mix,
-				    unsigned int id);
-
-/*
- * Gets the data pointer for given id.
- */
-void *buffer_share_get_data(const struct buffer_share *mix, unsigned int id);
-
-#endif /* BUFFER_SHARE_H_ */
diff --git a/cras/src/server/config/cras_board_config.c b/cras/src/server/config/cras_board_config.c
deleted file mode 100644
index e36ea3c..0000000
--- a/cras/src/server/config/cras_board_config.c
+++ /dev/null
@@ -1,97 +0,0 @@
-/* Copyright 2017 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <errno.h>
-#include <syslog.h>
-
-#include "cras_board_config.h"
-#include "iniparser_wrapper.h"
-
-static const int32_t DEFAULT_OUTPUT_BUFFER_SIZE = 512;
-static const int32_t AEC_SUPPORTED_DEFAULT = 0;
-static const int32_t AEC_GROUP_ID_DEFAULT = -1;
-static const int32_t BLUETOOTH_WBS_ENABLED_INI_DEFAULT = 1;
-static const int32_t BLUETOOTH_DEPRIORITIZE_WBS_MIC_INI_DEFAULT = 0;
-static const int32_t HOTWORD_PAUSE_AT_SUSPEND_DEFAULT = 0;
-
-#define CONFIG_NAME "board.ini"
-#define DEFAULT_OUTPUT_BUF_SIZE_INI_KEY "output:default_output_buffer_size"
-#define AEC_SUPPORTED_INI_KEY "processing:aec_supported"
-#define AEC_GROUP_ID_INI_KEY "processing:group_id"
-#define BLUETOOTH_WBS_ENABLED_INI_KEY "bluetooth:wbs_enabled"
-#define BLUETOOTH_DEPRIORITIZE_WBS_MIC_INI_KEY "bluetooth:deprioritize_wbs_mic"
-#define UCM_IGNORE_SUFFIX_KEY "ucm:ignore_suffix"
-#define HOTWORD_PAUSE_AT_SUSPEND "hotword:pause_at_suspend"
-
-void cras_board_config_get(const char *config_path,
-			   struct cras_board_config *board_config)
-{
-	char ini_name[MAX_INI_NAME_LENGTH + 1];
-	char ini_key[MAX_INI_KEY_LENGTH + 1];
-	const char *ptr;
-	dictionary *ini;
-
-	board_config->default_output_buffer_size = DEFAULT_OUTPUT_BUFFER_SIZE;
-	board_config->aec_supported = AEC_SUPPORTED_DEFAULT;
-	board_config->aec_group_id = AEC_GROUP_ID_DEFAULT;
-	board_config->ucm_ignore_suffix = NULL;
-	board_config->bt_wbs_enabled = BLUETOOTH_WBS_ENABLED_INI_DEFAULT;
-	board_config->deprioritize_bt_wbs_mic =
-		BLUETOOTH_DEPRIORITIZE_WBS_MIC_INI_DEFAULT;
-	if (config_path == NULL)
-		return;
-
-	snprintf(ini_name, MAX_INI_NAME_LENGTH, "%s/%s", config_path,
-		 CONFIG_NAME);
-	ini_name[MAX_INI_NAME_LENGTH] = '\0';
-	ini = iniparser_load_wrapper(ini_name);
-	if (ini == NULL) {
-		syslog(LOG_DEBUG, "No ini file %s", ini_name);
-		return;
-	}
-
-	snprintf(ini_key, MAX_INI_KEY_LENGTH, DEFAULT_OUTPUT_BUF_SIZE_INI_KEY);
-	ini_key[MAX_INI_KEY_LENGTH] = 0;
-	board_config->default_output_buffer_size =
-		iniparser_getint(ini, ini_key, DEFAULT_OUTPUT_BUFFER_SIZE);
-
-	snprintf(ini_key, MAX_INI_KEY_LENGTH, AEC_SUPPORTED_INI_KEY);
-	ini_key[MAX_INI_KEY_LENGTH] = 0;
-	board_config->aec_supported =
-		iniparser_getint(ini, ini_key, AEC_SUPPORTED_DEFAULT);
-
-	snprintf(ini_key, MAX_INI_KEY_LENGTH, AEC_GROUP_ID_INI_KEY);
-	ini_key[MAX_INI_KEY_LENGTH] = 0;
-	board_config->aec_group_id =
-		iniparser_getint(ini, ini_key, AEC_GROUP_ID_DEFAULT);
-
-	snprintf(ini_key, MAX_INI_KEY_LENGTH, BLUETOOTH_WBS_ENABLED_INI_KEY);
-	ini_key[MAX_INI_KEY_LENGTH] = 0;
-	board_config->bt_wbs_enabled = iniparser_getint(
-		ini, ini_key, BLUETOOTH_WBS_ENABLED_INI_DEFAULT);
-
-	snprintf(ini_key, MAX_INI_KEY_LENGTH,
-		 BLUETOOTH_DEPRIORITIZE_WBS_MIC_INI_KEY);
-	ini_key[MAX_INI_KEY_LENGTH] = 0;
-	board_config->deprioritize_bt_wbs_mic = iniparser_getint(
-		ini, ini_key, BLUETOOTH_DEPRIORITIZE_WBS_MIC_INI_DEFAULT);
-
-	snprintf(ini_key, MAX_INI_KEY_LENGTH, UCM_IGNORE_SUFFIX_KEY);
-	ini_key[MAX_INI_KEY_LENGTH] = 0;
-	ptr = iniparser_getstring(ini, ini_key, "");
-	if (ptr) {
-		board_config->ucm_ignore_suffix = strdup(ptr);
-		if (!board_config->ucm_ignore_suffix)
-			syslog(LOG_ERR, "Failed to call strdup: %d", errno);
-	}
-
-	snprintf(ini_key, MAX_INI_KEY_LENGTH, HOTWORD_PAUSE_AT_SUSPEND);
-	ini_key[MAX_INI_KEY_LENGTH] = 0;
-	board_config->hotword_pause_at_suspend = iniparser_getint(
-		ini, ini_key, HOTWORD_PAUSE_AT_SUSPEND_DEFAULT);
-
-	iniparser_freedict(ini);
-	syslog(LOG_DEBUG, "Loaded ini file %s", ini_name);
-}
diff --git a/cras/src/server/config/cras_board_config.h b/cras/src/server/config/cras_board_config.h
deleted file mode 100644
index d4bd849..0000000
--- a/cras/src/server/config/cras_board_config.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/* Copyright 2017 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_BOARD_CONFIG_H_
-#define CRAS_BOARD_CONFIG_H_
-
-#include <stdint.h>
-
-struct cras_board_config {
-	int32_t default_output_buffer_size;
-	int32_t aec_supported;
-	int32_t aec_group_id;
-	int32_t bt_wbs_enabled;
-	int32_t deprioritize_bt_wbs_mic;
-	char *ucm_ignore_suffix;
-	int32_t hotword_pause_at_suspend;
-};
-
-/* Gets a configuration based on the config file specified.
- * Args:
- *    config_path - Path containing the config files.
- *    board_config - The returned configs.
- */
-void cras_board_config_get(const char *config_path,
-			   struct cras_board_config *board_config);
-
-#endif /* CRAS_BOARD_CONFIG_H_ */
diff --git a/cras/src/server/config/cras_card_config.c b/cras/src/server/config/cras_card_config.c
deleted file mode 100644
index ae36565..0000000
--- a/cras/src/server/config/cras_card_config.c
+++ /dev/null
@@ -1,110 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <syslog.h>
-
-#include "cras_util.h"
-#include "cras_volume_curve.h"
-#include "iniparser_wrapper.h"
-#include "utlist.h"
-
-struct cras_card_config {
-	dictionary *ini;
-};
-
-static struct cras_volume_curve *
-create_simple_step_curve(const struct cras_card_config *card_config,
-			 const char *control_name)
-{
-	char ini_key[MAX_INI_KEY_LENGTH + 1];
-	int max_volume;
-	int volume_step;
-
-	snprintf(ini_key, MAX_INI_KEY_LENGTH, "%s:max_volume", control_name);
-	ini_key[MAX_INI_KEY_LENGTH] = 0;
-	max_volume = iniparser_getint(card_config->ini, ini_key, 0);
-	snprintf(ini_key, MAX_INI_KEY_LENGTH, "%s:volume_step", control_name);
-	ini_key[MAX_INI_KEY_LENGTH] = 0;
-	volume_step = iniparser_getint(card_config->ini, ini_key, 300);
-	syslog(LOG_INFO, "Configure curve found for %s.", control_name);
-	return cras_volume_curve_create_simple_step(max_volume, volume_step);
-}
-
-static struct cras_volume_curve *
-create_explicit_curve(const struct cras_card_config *card_config,
-		      const char *control_name)
-{
-	unsigned int i;
-	char ini_key[MAX_INI_KEY_LENGTH + 1];
-	long dB_values[101];
-
-	for (i = 0; i < 101; i++) {
-		snprintf(ini_key, MAX_INI_KEY_LENGTH, "%s:dB_at_%u",
-			 control_name, i);
-		ini_key[MAX_INI_KEY_LENGTH] = 0;
-		dB_values[i] = iniparser_getint(card_config->ini, ini_key, 0);
-	}
-	syslog(LOG_INFO, "Explicit volume curve found for %s.", control_name);
-	return cras_volume_curve_create_explicit(dB_values);
-}
-
-/*
- * Exported interface.
- */
-
-struct cras_card_config *cras_card_config_create(const char *config_path,
-						 const char *card_name)
-{
-	struct cras_card_config *card_config = NULL;
-	char ini_name[MAX_INI_NAME_LENGTH + 1];
-	dictionary *ini;
-
-	snprintf(ini_name, MAX_INI_NAME_LENGTH, "%s/%s", config_path,
-		 card_name);
-	ini_name[MAX_INI_NAME_LENGTH] = '\0';
-	ini = iniparser_load_wrapper(ini_name);
-	if (ini == NULL) {
-		syslog(LOG_DEBUG, "No ini file %s", ini_name);
-		return NULL;
-	}
-
-	card_config = calloc(1, sizeof(*card_config));
-	if (card_config == NULL) {
-		iniparser_freedict(ini);
-		return NULL;
-	}
-
-	card_config->ini = ini;
-	syslog(LOG_DEBUG, "Loaded ini file %s", ini_name);
-	return card_config;
-}
-
-void cras_card_config_destroy(struct cras_card_config *card_config)
-{
-	assert(card_config);
-	iniparser_freedict(card_config->ini);
-	free(card_config);
-}
-
-struct cras_volume_curve *cras_card_config_get_volume_curve_for_control(
-	const struct cras_card_config *card_config, const char *control_name)
-{
-	char ini_key[MAX_INI_KEY_LENGTH + 1];
-	const char *curve_type;
-
-	if (card_config == NULL || control_name == NULL)
-		return NULL;
-
-	snprintf(ini_key, MAX_INI_KEY_LENGTH, "%s:volume_curve", control_name);
-	ini_key[MAX_INI_KEY_LENGTH] = 0;
-	curve_type = iniparser_getstring(card_config->ini, ini_key, NULL);
-
-	if (curve_type && strcmp(curve_type, "simple_step") == 0)
-		return create_simple_step_curve(card_config, control_name);
-	if (curve_type && strcmp(curve_type, "explicit") == 0)
-		return create_explicit_curve(card_config, control_name);
-	syslog(LOG_DEBUG, "No configure curve found for %s.", control_name);
-	return NULL;
-}
diff --git a/cras/src/server/config/cras_card_config.h b/cras/src/server/config/cras_card_config.h
deleted file mode 100644
index 22ddc39..0000000
--- a/cras/src/server/config/cras_card_config.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_CARD_CONFIG_H_
-#define CRAS_CARD_CONFIG_H_
-
-struct cras_card_config;
-struct cras_volume_curve;
-
-/* Creates a configuration based on the config file specified.
- * Args:
- *    config_path - Path containing the config files.
- *    card_name - Name of the card to load a configuration for.
- * Returns:
- *    A pointer to the created config on success, NULL on failure.
- */
-struct cras_card_config *cras_card_config_create(const char *config_path,
-						 const char *card_name);
-
-/* Destroys a configuration returned by cras_card_config_create().
- * Args:
- *    card_config - Card configuration returned by cras_card_config_create()
- */
-void cras_card_config_destroy(struct cras_card_config *card_config);
-
-/* Returns the apporpriate volume curve to use for the control given by name.
- * Args:
- *    card_config - Card configuration returned by cras_card_config_create()
- * Returns:
- *    The specialized curve for the control if there is one, otherwise NULL.
- */
-struct cras_volume_curve *cras_card_config_get_volume_curve_for_control(
-	const struct cras_card_config *card_config, const char *control_name);
-
-#endif /* CRAS_CARD_CONFIG_H_ */
diff --git a/cras/src/server/config/cras_device_blocklist.c b/cras/src/server/config/cras_device_blocklist.c
deleted file mode 100644
index d418fb8..0000000
--- a/cras/src/server/config/cras_device_blocklist.c
+++ /dev/null
@@ -1,56 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include "cras_device_blocklist.h"
-#include "iniparser_wrapper.h"
-#include "utlist.h"
-
-struct cras_device_blocklist {
-	dictionary *ini;
-};
-
-/*
- * Exported Interface
- */
-
-struct cras_device_blocklist *
-cras_device_blocklist_create(const char *config_path)
-{
-	struct cras_device_blocklist *blocklist;
-	char ini_name[MAX_INI_NAME_LENGTH + 1];
-
-	blocklist = calloc(1, sizeof(*blocklist));
-	if (!blocklist)
-		return NULL;
-
-	snprintf(ini_name, MAX_INI_NAME_LENGTH, "%s/%s", config_path,
-		 "device_blocklist");
-	ini_name[MAX_INI_NAME_LENGTH] = '\0';
-	blocklist->ini = iniparser_load_wrapper(ini_name);
-
-	return blocklist;
-}
-
-void cras_device_blocklist_destroy(struct cras_device_blocklist *blocklist)
-{
-	if (blocklist && blocklist->ini)
-		iniparser_freedict(blocklist->ini);
-	free(blocklist);
-}
-
-int cras_device_blocklist_check(struct cras_device_blocklist *blocklist,
-				unsigned vendor_id, unsigned product_id,
-				unsigned desc_checksum, unsigned device_index)
-{
-	char ini_key[MAX_INI_KEY_LENGTH + 1];
-
-	if (!blocklist)
-		return 0;
-
-	snprintf(ini_key, MAX_INI_KEY_LENGTH, "USB_Outputs:%04x_%04x_%08x_%u",
-		 vendor_id, product_id, desc_checksum, device_index);
-	ini_key[MAX_INI_KEY_LENGTH] = 0;
-	return iniparser_getboolean(blocklist->ini, ini_key, 0);
-}
diff --git a/cras/src/server/config/cras_device_blocklist.h b/cras/src/server/config/cras_device_blocklist.h
deleted file mode 100644
index d0f750b..0000000
--- a/cras/src/server/config/cras_device_blocklist.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-/*
- * Keeps a list of playback devices that should be ignored for a card.  This is
- * useful for devices that present non-functional alsa devices.  For instance
- * some mics show a phantom playback device.
- */
-#ifndef CRAS_DEVICE_BLOCKLIST_H_
-#define CRAS_DEVICE_BLOCKLIST_H_
-
-#include <stdint.h>
-
-#include "cras_types.h"
-
-struct cras_device_blocklist;
-
-/* Creates a blocklist of devices that should never be added to the system.
- * Args:
- *    config_path - Path containing the config files.
- * Returns:
- *    A pointer to the created blocklist on success, NULL on failure.
- */
-struct cras_device_blocklist *
-cras_device_blocklist_create(const char *config_path);
-
-/* Destroys a blocklist returned by cras_device_blocklist_create().
- * Args:
- *    blocklist - Blocklist returned by cras_device_blocklist_create()
- */
-void cras_device_blocklist_destroy(struct cras_device_blocklist *blocklist);
-
-/* Checks if a playback device on a USB card is blocklisted.
- * Args:
- *    blocklist - Blocklist returned by cras_device_blocklist_create()
- *    vendor_id - USB vendor ID.
- *    product_id - USB product ID.
- *    device_index - Index of the alsa device in the card.
- * Returns:
- *  1 if the device is blocklisted, 0 otherwise.
- */
-int cras_device_blocklist_check(struct cras_device_blocklist *blocklist,
-				unsigned vendor_id, unsigned product_id,
-				unsigned desc_checksum, unsigned device_index);
-
-#endif /* CRAS_CARD_DEVICE_BLOCKLIST_H_ */
diff --git a/cras/src/server/cras.c b/cras/src/server/cras.c
deleted file mode 100644
index 8d23907..0000000
--- a/cras/src/server/cras.c
+++ /dev/null
@@ -1,146 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#define _GNU_SOURCE /* for asprintf */
-#include <getopt.h>
-#include <signal.h>
-#include <stdio.h>
-#include <syslog.h>
-
-#include "cras_alsa_plugin_io.h"
-#include "cras_apm_list.h"
-#include "cras_config.h"
-#include "cras_iodev_list.h"
-#include "cras_server.h"
-#include "cras_shm.h"
-#include "cras_system_state.h"
-#include "cras_dsp.h"
-
-static struct option long_options[] = {
-	{ "dsp_config", required_argument, 0, 'd' },
-	{ "syslog_mask", required_argument, 0, 'l' },
-	{ "device_config_dir", required_argument, 0, 'c' },
-	{ "disable_profile", required_argument, 0, 'D' },
-	{ "internal_ucm_suffix", required_argument, 0, 'u' },
-	{ 0, 0, 0, 0 }
-};
-
-/* Ignores sigpipe, we'll notice when a read/write fails. */
-static void set_signals()
-{
-	signal(SIGPIPE, SIG_IGN);
-	signal(SIGCHLD, SIG_IGN);
-}
-
-/* Entry point for the server. */
-int main(int argc, char **argv)
-{
-	int c, option_index;
-	int log_mask = LOG_WARNING;
-	const char default_dsp_config[] = CRAS_CONFIG_FILE_DIR "/dsp.ini";
-	const char *dsp_config = default_dsp_config;
-	const char *device_config_dir = CRAS_CONFIG_FILE_DIR;
-	const char *internal_ucm_suffix = NULL;
-	unsigned int profile_disable_mask = 0;
-
-	set_signals();
-
-	while (1) {
-		c = getopt_long(argc, argv, "", long_options, &option_index);
-		if (c == -1)
-			break;
-
-		switch (c) {
-		/* To keep this code simple we ask the (technical)
-		   user to pass one of integer values defined in
-		   syslog.h - this is a development feature after
-		   all. While there is no formal standard for the
-		   integer values there is an informal standard:
-		   http://tools.ietf.org/html/rfc5424#page-11 */
-		case 'l':
-			log_mask = atoi(optarg);
-			break;
-
-		case 'c':
-			device_config_dir = optarg;
-			break;
-
-		case 'd':
-			dsp_config = optarg;
-			break;
-		/* --disable_profile option takes list of profile names separated by ',' */
-		case 'D':
-			while ((optarg != NULL) && (*optarg != 0)) {
-				if (strncmp(optarg, "hfp", 3) == 0) {
-					profile_disable_mask |=
-						CRAS_SERVER_PROFILE_MASK_HFP;
-				}
-				if (strncmp(optarg, "hsp", 3) == 0) {
-					profile_disable_mask |=
-						CRAS_SERVER_PROFILE_MASK_HSP;
-				}
-				if (strncmp(optarg, "a2dp", 4) == 0) {
-					profile_disable_mask |=
-						CRAS_SERVER_PROFILE_MASK_A2DP;
-				}
-				optarg = strchr(optarg, ',');
-				if (optarg != NULL) {
-					optarg++;
-				}
-			}
-			break;
-		case 'u':
-			if (*optarg != 0)
-				internal_ucm_suffix = optarg;
-			break;
-		default:
-			break;
-		}
-	}
-
-	switch (log_mask) {
-	case LOG_EMERG:
-	case LOG_ALERT:
-	case LOG_CRIT:
-	case LOG_ERR:
-	case LOG_WARNING:
-	case LOG_NOTICE:
-	case LOG_INFO:
-	case LOG_DEBUG:
-		break;
-	default:
-		fprintf(stderr,
-			"Unsupported syslog priority value: %d; using LOG_ERR=%d\n",
-			log_mask, LOG_ERR);
-		log_mask = LOG_ERR;
-		break;
-	}
-	setlogmask(LOG_UPTO(log_mask));
-
-	/* Initialize system. */
-	cras_server_init();
-	char *shm_name;
-	if (asprintf(&shm_name, "/cras-%d", getpid()) < 0)
-		exit(-1);
-	int rw_shm_fd;
-	int ro_shm_fd;
-	struct cras_server_state *exp_state =
-		(struct cras_server_state *)cras_shm_setup(
-			shm_name, sizeof(*exp_state), &rw_shm_fd, &ro_shm_fd);
-	if (!exp_state)
-		exit(-1);
-	cras_system_state_init(device_config_dir, shm_name, rw_shm_fd,
-			       ro_shm_fd, exp_state, sizeof(*exp_state));
-	free(shm_name);
-	if (internal_ucm_suffix)
-		cras_system_state_set_internal_ucm_suffix(internal_ucm_suffix);
-	cras_dsp_init(dsp_config);
-	cras_apm_list_init(device_config_dir);
-	cras_iodev_list_init();
-	cras_alsa_plugin_io_init(device_config_dir);
-
-	/* Start the server. */
-	return cras_server_run(profile_disable_mask);
-}
diff --git a/cras/src/server/cras_a2dp_endpoint.c b/cras/src/server/cras_a2dp_endpoint.c
deleted file mode 100644
index 4cda169..0000000
--- a/cras/src/server/cras_a2dp_endpoint.c
+++ /dev/null
@@ -1,226 +0,0 @@
-/* Copyright (c) 2013 The Chromium Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <errno.h>
-#include <stdint.h>
-#include <syslog.h>
-
-#include "a2dp-codecs.h"
-#include "cras_a2dp_endpoint.h"
-#include "cras_a2dp_iodev.h"
-#include "cras_iodev.h"
-#include "cras_bt_constants.h"
-#include "cras_bt_endpoint.h"
-#include "cras_bt_log.h"
-#include "cras_system_state.h"
-#include "cras_util.h"
-
-#define A2DP_SOURCE_ENDPOINT_PATH "/org/chromium/Cras/Bluetooth/A2DPSource"
-#define A2DP_SINK_ENDPOINT_PATH "/org/chromium/Cras/Bluetooth/A2DPSink"
-
-/* Pointers for the only connected a2dp device. */
-static struct a2dp {
-	struct cras_iodev *iodev;
-	struct cras_bt_device *device;
-} connected_a2dp;
-
-static int cras_a2dp_get_capabilities(struct cras_bt_endpoint *endpoint,
-				      void *capabilities, int *len)
-{
-	a2dp_sbc_t *sbc_caps = capabilities;
-
-	if (*len < sizeof(*sbc_caps))
-		return -ENOSPC;
-
-	*len = sizeof(*sbc_caps);
-
-	/* Return all capabilities. */
-	sbc_caps->channel_mode =
-		SBC_CHANNEL_MODE_MONO | SBC_CHANNEL_MODE_DUAL_CHANNEL |
-		SBC_CHANNEL_MODE_STEREO | SBC_CHANNEL_MODE_JOINT_STEREO;
-	sbc_caps->frequency = SBC_SAMPLING_FREQ_16000 |
-			      SBC_SAMPLING_FREQ_32000 |
-			      SBC_SAMPLING_FREQ_44100 | SBC_SAMPLING_FREQ_48000;
-	sbc_caps->allocation_method =
-		SBC_ALLOCATION_SNR | SBC_ALLOCATION_LOUDNESS;
-	sbc_caps->subbands = SBC_SUBBANDS_4 | SBC_SUBBANDS_8;
-	sbc_caps->block_length = SBC_BLOCK_LENGTH_4 | SBC_BLOCK_LENGTH_8 |
-				 SBC_BLOCK_LENGTH_12 | SBC_BLOCK_LENGTH_16;
-	sbc_caps->min_bitpool = MIN_BITPOOL;
-	sbc_caps->max_bitpool = MAX_BITPOOL;
-
-	return 0;
-}
-
-static int cras_a2dp_select_configuration(struct cras_bt_endpoint *endpoint,
-					  void *capabilities, int len,
-					  void *configuration)
-{
-	a2dp_sbc_t *sbc_caps = capabilities;
-	a2dp_sbc_t *sbc_config = configuration;
-
-	/* Pick the highest configuration. */
-	if (sbc_caps->channel_mode & SBC_CHANNEL_MODE_JOINT_STEREO) {
-		sbc_config->channel_mode = SBC_CHANNEL_MODE_JOINT_STEREO;
-	} else if (sbc_caps->channel_mode & SBC_CHANNEL_MODE_STEREO) {
-		sbc_config->channel_mode = SBC_CHANNEL_MODE_STEREO;
-	} else if (sbc_caps->channel_mode & SBC_CHANNEL_MODE_DUAL_CHANNEL) {
-		sbc_config->channel_mode = SBC_CHANNEL_MODE_DUAL_CHANNEL;
-	} else if (sbc_caps->channel_mode & SBC_CHANNEL_MODE_MONO) {
-		sbc_config->channel_mode = SBC_CHANNEL_MODE_MONO;
-	} else {
-		syslog(LOG_WARNING, "No supported channel modes.");
-		return -ENOSYS;
-	}
-
-	if (sbc_caps->frequency & SBC_SAMPLING_FREQ_48000) {
-		sbc_config->frequency = SBC_SAMPLING_FREQ_48000;
-	} else if (sbc_caps->frequency & SBC_SAMPLING_FREQ_44100) {
-		sbc_config->frequency = SBC_SAMPLING_FREQ_44100;
-	} else if (sbc_caps->frequency & SBC_SAMPLING_FREQ_32000) {
-		sbc_config->frequency = SBC_SAMPLING_FREQ_32000;
-	} else if (sbc_caps->frequency & SBC_SAMPLING_FREQ_16000) {
-		sbc_config->frequency = SBC_SAMPLING_FREQ_16000;
-	} else {
-		syslog(LOG_WARNING, "No supported sampling frequencies.");
-		return -ENOSYS;
-	}
-
-	if (sbc_caps->allocation_method & SBC_ALLOCATION_LOUDNESS) {
-		sbc_config->allocation_method = SBC_ALLOCATION_LOUDNESS;
-	} else if (sbc_caps->allocation_method & SBC_ALLOCATION_SNR) {
-		sbc_config->allocation_method = SBC_ALLOCATION_SNR;
-	} else {
-		syslog(LOG_WARNING, "No supported allocation method.");
-		return -ENOSYS;
-	}
-
-	if (sbc_caps->subbands & SBC_SUBBANDS_8) {
-		sbc_config->subbands = SBC_SUBBANDS_8;
-	} else if (sbc_caps->subbands & SBC_SUBBANDS_4) {
-		sbc_config->subbands = SBC_SUBBANDS_4;
-	} else {
-		syslog(LOG_WARNING, "No supported subbands.");
-		return -ENOSYS;
-	}
-
-	if (sbc_caps->block_length & SBC_BLOCK_LENGTH_16) {
-		sbc_config->block_length = SBC_BLOCK_LENGTH_16;
-	} else if (sbc_caps->block_length & SBC_BLOCK_LENGTH_12) {
-		sbc_config->block_length = SBC_BLOCK_LENGTH_12;
-	} else if (sbc_caps->block_length & SBC_BLOCK_LENGTH_8) {
-		sbc_config->block_length = SBC_BLOCK_LENGTH_8;
-	} else if (sbc_caps->block_length & SBC_BLOCK_LENGTH_4) {
-		sbc_config->block_length = SBC_BLOCK_LENGTH_4;
-	} else {
-		syslog(LOG_WARNING, "No supported block length.");
-		return -ENOSYS;
-	}
-
-	sbc_config->min_bitpool =
-		(sbc_caps->min_bitpool > MIN_BITPOOL ? sbc_caps->min_bitpool :
-						       MIN_BITPOOL);
-	sbc_config->max_bitpool =
-		(sbc_caps->max_bitpool < MAX_BITPOOL ? sbc_caps->max_bitpool :
-						       MAX_BITPOOL);
-
-	return 0;
-}
-
-static void cras_a2dp_set_configuration(struct cras_bt_endpoint *endpoint,
-					struct cras_bt_transport *transport)
-{
-	struct cras_bt_device *device;
-
-	device = cras_bt_transport_device(transport);
-	cras_bt_device_a2dp_configured(device);
-}
-
-static void cras_a2dp_suspend(struct cras_bt_endpoint *endpoint,
-			      struct cras_bt_transport *transport)
-{
-	struct cras_bt_device *device = cras_bt_transport_device(transport);
-
-	BTLOG(btlog, BT_A2DP_SUSPENDED, 0, 0);
-	cras_a2dp_suspend_connected_device(device);
-	cras_bt_device_notify_profile_dropped(device,
-					      CRAS_BT_DEVICE_PROFILE_A2DP_SINK);
-}
-
-static void a2dp_transport_state_changed(struct cras_bt_endpoint *endpoint,
-					 struct cras_bt_transport *transport)
-{
-	if (connected_a2dp.iodev && transport) {
-		/* When pending message is received in bluez, try to aquire
-		 * the transport. */
-		if (cras_bt_transport_fd(transport) != -1 &&
-		    cras_bt_transport_state(transport) ==
-			    CRAS_BT_TRANSPORT_STATE_PENDING)
-			cras_bt_transport_try_acquire(transport);
-	}
-}
-
-static struct cras_bt_endpoint cras_a2dp_endpoint = {
-	/* BlueZ connects the device A2DP Sink to our A2DP Source endpoint,
-	 * and the device A2DP Source to our A2DP Sink. It's best if you don't
-	 * think about it too hard.
-	 */
-	.object_path = A2DP_SOURCE_ENDPOINT_PATH,
-	.uuid = A2DP_SOURCE_UUID,
-	.codec = A2DP_CODEC_SBC,
-
-	.get_capabilities = cras_a2dp_get_capabilities,
-	.select_configuration = cras_a2dp_select_configuration,
-	.set_configuration = cras_a2dp_set_configuration,
-	.suspend = cras_a2dp_suspend,
-	.transport_state_changed = a2dp_transport_state_changed
-};
-
-int cras_a2dp_endpoint_create(DBusConnection *conn)
-{
-	return cras_bt_endpoint_add(conn, &cras_a2dp_endpoint);
-}
-
-void cras_a2dp_start(struct cras_bt_device *device)
-{
-	struct cras_bt_transport *transport = cras_a2dp_endpoint.transport;
-
-	BTLOG(btlog, BT_A2DP_START, 0, 0);
-
-	if (!transport || device != cras_bt_transport_device(transport)) {
-		syslog(LOG_ERR, "Device and active transport not match.");
-		return;
-	}
-
-	if (connected_a2dp.iodev) {
-		syslog(LOG_WARNING,
-		       "Replacing existing endpoint configuration");
-		a2dp_iodev_destroy(connected_a2dp.iodev);
-	}
-
-	connected_a2dp.iodev = a2dp_iodev_create(transport);
-	connected_a2dp.device = cras_bt_transport_device(transport);
-
-	if (!connected_a2dp.iodev)
-		syslog(LOG_WARNING, "Failed to create a2dp iodev");
-}
-
-struct cras_bt_device *cras_a2dp_connected_device()
-{
-	return connected_a2dp.device;
-}
-
-void cras_a2dp_suspend_connected_device(struct cras_bt_device *device)
-{
-	if (connected_a2dp.device != device)
-		return;
-
-	if (connected_a2dp.iodev) {
-		syslog(LOG_INFO, "Destroying iodev for A2DP device");
-		a2dp_iodev_destroy(connected_a2dp.iodev);
-		connected_a2dp.iodev = NULL;
-		connected_a2dp.device = NULL;
-	}
-}
diff --git a/cras/src/server/cras_a2dp_endpoint.h b/cras/src/server/cras_a2dp_endpoint.h
deleted file mode 100644
index 1ebd00d..0000000
--- a/cras/src/server/cras_a2dp_endpoint.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/* Copyright (c) 2013 The Chromium Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_A2DP_ENDPOINT_H_
-#define CRAS_A2DP_ENDPOINT_H_
-
-#include <dbus/dbus.h>
-
-struct cras_iodev;
-
-int cras_a2dp_endpoint_create(DBusConnection *conn);
-
-/* Gets the connected a2dp device, NULL is returned when there's none. */
-struct cras_bt_device *cras_a2dp_connected_device();
-
-/* Suspends the connected a2dp device, the purpose is to remove a2dp iodev
- * to release a2dp audio before sending dbus message to disconnect a2dp
- * device. */
-void cras_a2dp_suspend_connected_device(struct cras_bt_device *device);
-
-/* Starts A2DP output by creating the cras_iodev. */
-void cras_a2dp_start(struct cras_bt_device *device);
-
-#endif /* CRAS_A2DP_ENDPOINT_H_ */
diff --git a/cras/src/server/cras_a2dp_info.c b/cras/src/server/cras_a2dp_info.c
deleted file mode 100644
index b2db384..0000000
--- a/cras/src/server/cras_a2dp_info.c
+++ /dev/null
@@ -1,187 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <netinet/in.h>
-#include <sbc/sbc.h>
-#include <syslog.h>
-
-#include "cras_a2dp_info.h"
-#include "cras_sbc_codec.h"
-#include "cras_types.h"
-#include "rtp.h"
-
-int init_a2dp(struct a2dp_info *a2dp, a2dp_sbc_t *sbc)
-{
-	uint8_t frequency = 0, mode = 0, subbands = 0, allocation, blocks = 0,
-		bitpool;
-
-	if (sbc->frequency & SBC_SAMPLING_FREQ_48000)
-		frequency = SBC_FREQ_48000;
-	else if (sbc->frequency & SBC_SAMPLING_FREQ_44100)
-		frequency = SBC_FREQ_44100;
-	else if (sbc->frequency & SBC_SAMPLING_FREQ_32000)
-		frequency = SBC_FREQ_32000;
-	else if (sbc->frequency & SBC_SAMPLING_FREQ_16000)
-		frequency = SBC_FREQ_16000;
-
-	if (sbc->channel_mode & SBC_CHANNEL_MODE_JOINT_STEREO)
-		mode = SBC_MODE_JOINT_STEREO;
-	else if (sbc->channel_mode & SBC_CHANNEL_MODE_STEREO)
-		mode = SBC_MODE_STEREO;
-	else if (sbc->channel_mode & SBC_CHANNEL_MODE_DUAL_CHANNEL)
-		mode = SBC_MODE_DUAL_CHANNEL;
-	else if (sbc->channel_mode & SBC_CHANNEL_MODE_MONO)
-		mode = SBC_MODE_MONO;
-
-	if (sbc->allocation_method & SBC_ALLOCATION_LOUDNESS)
-		allocation = SBC_AM_LOUDNESS;
-	else
-		allocation = SBC_AM_SNR;
-
-	switch (sbc->subbands) {
-	case SBC_SUBBANDS_4:
-		subbands = SBC_SB_4;
-		break;
-	case SBC_SUBBANDS_8:
-		subbands = SBC_SB_8;
-		break;
-	}
-
-	switch (sbc->block_length) {
-	case SBC_BLOCK_LENGTH_4:
-		blocks = SBC_BLK_4;
-		break;
-	case SBC_BLOCK_LENGTH_8:
-		blocks = SBC_BLK_8;
-		break;
-	case SBC_BLOCK_LENGTH_12:
-		blocks = SBC_BLK_12;
-		break;
-	case SBC_BLOCK_LENGTH_16:
-		blocks = SBC_BLK_16;
-		break;
-	}
-
-	bitpool = sbc->max_bitpool;
-
-	a2dp->codec = cras_sbc_codec_create(frequency, mode, subbands,
-					    allocation, blocks, bitpool);
-	if (!a2dp->codec)
-		return -1;
-
-	/* SBC info */
-	a2dp->codesize = cras_sbc_get_codesize(a2dp->codec);
-	a2dp->frame_length = cras_sbc_get_frame_length(a2dp->codec);
-
-	a2dp->a2dp_buf_used =
-		sizeof(struct rtp_header) + sizeof(struct rtp_payload);
-	a2dp->frame_count = 0;
-	a2dp->seq_num = 0;
-	a2dp->samples = 0;
-
-	return 0;
-}
-
-void destroy_a2dp(struct a2dp_info *a2dp)
-{
-	cras_sbc_codec_destroy(a2dp->codec);
-}
-
-int a2dp_codesize(struct a2dp_info *a2dp)
-{
-	return a2dp->codesize;
-}
-
-int a2dp_block_size(struct a2dp_info *a2dp, int a2dp_bytes)
-{
-	return a2dp_bytes / a2dp->frame_length * a2dp->codesize;
-}
-
-int a2dp_queued_frames(const struct a2dp_info *a2dp)
-{
-	return a2dp->samples;
-}
-
-void a2dp_reset(struct a2dp_info *a2dp)
-{
-	a2dp->a2dp_buf_used =
-		sizeof(struct rtp_header) + sizeof(struct rtp_payload);
-	a2dp->samples = 0;
-	a2dp->seq_num = 0;
-	a2dp->frame_count = 0;
-}
-
-static int avdtp_write(int stream_fd, struct a2dp_info *a2dp)
-{
-	int err, samples;
-	struct rtp_header *header;
-	struct rtp_payload *payload;
-
-	header = (struct rtp_header *)a2dp->a2dp_buf;
-	payload = (struct rtp_payload *)(a2dp->a2dp_buf + sizeof(*header));
-	memset(a2dp->a2dp_buf, 0, sizeof(*header) + sizeof(*payload));
-
-	payload->frame_count = a2dp->frame_count;
-	header->v = 2;
-	header->pt = 1;
-	header->sequence_number = htons(a2dp->seq_num);
-	header->timestamp = htonl(a2dp->nsamples);
-	header->ssrc = htonl(1);
-
-	err = send(stream_fd, a2dp->a2dp_buf, a2dp->a2dp_buf_used,
-		   MSG_DONTWAIT);
-	if (err < 0)
-		return -errno;
-
-	/* Returns the number of samples in frame. */
-	samples = a2dp->samples;
-
-	/* Reset some data */
-	a2dp->a2dp_buf_used = sizeof(*header) + sizeof(*payload);
-	a2dp->frame_count = 0;
-	a2dp->samples = 0;
-	a2dp->seq_num++;
-
-	return samples;
-}
-
-int a2dp_encode(struct a2dp_info *a2dp, const void *pcm_buf, int pcm_buf_size,
-		int format_bytes, size_t link_mtu)
-{
-	int processed;
-	size_t out_encoded;
-
-	if (link_mtu > A2DP_BUF_SIZE_BYTES)
-		link_mtu = A2DP_BUF_SIZE_BYTES;
-	if (link_mtu == a2dp->a2dp_buf_used)
-		return 0;
-
-	processed = a2dp->codec->encode(a2dp->codec, pcm_buf, pcm_buf_size,
-					a2dp->a2dp_buf + a2dp->a2dp_buf_used,
-					link_mtu - a2dp->a2dp_buf_used,
-					&out_encoded);
-	if (processed < 0) {
-		syslog(LOG_ERR, "a2dp encode error %d", processed);
-		return processed;
-	}
-
-	if (a2dp->codesize > 0)
-		a2dp->frame_count += processed / a2dp->codesize;
-	a2dp->a2dp_buf_used += out_encoded;
-
-	a2dp->samples += processed / format_bytes;
-	a2dp->nsamples += processed / format_bytes;
-
-	return processed;
-}
-
-int a2dp_write(struct a2dp_info *a2dp, int stream_fd, size_t link_mtu)
-{
-	/* Do avdtp write when the max number of SBC frames is reached. */
-	if (a2dp->a2dp_buf_used + a2dp->frame_length > link_mtu)
-		return avdtp_write(stream_fd, a2dp);
-
-	return 0;
-}
diff --git a/cras/src/server/cras_a2dp_info.h b/cras/src/server/cras_a2dp_info.h
deleted file mode 100644
index b33911e..0000000
--- a/cras/src/server/cras_a2dp_info.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_A2DP_INFO_H_
-#define CRAS_A2DP_INFO_H_
-
-#include "a2dp-codecs.h"
-
-#define A2DP_BUF_SIZE_BYTES 2048
-
-/* Represents the codec and encoded state of a2dp iodev.
- * Members:
- *    codec - The codec used to encode PCM buffer to a2dp buffer.
- *    a2dp_buf - The buffer to hold encoded frames.
- *    codesize - Size of a SBC frame in bytes.
- *    frame_length - Size of an encoded SBC frame in bytes.
- *    frame_count - Queued SBC frame count currently in a2dp buffer.
- *    seq_num - Sequence number in rtp header.
- *    samples - Queued PCM frame count currently in a2dp buffer.
- *    nsamples - Cumulative number of encoded PCM frames.
- *    a2dp_buf_used - Used a2dp buffer counter in bytes.
- */
-struct a2dp_info {
-	struct cras_audio_codec *codec;
-	uint8_t a2dp_buf[A2DP_BUF_SIZE_BYTES];
-	int codesize;
-	int frame_length;
-	int frame_count;
-	uint16_t seq_num;
-	int samples;
-	int nsamples;
-	size_t a2dp_buf_used;
-};
-
-/*
- * Set up codec for given sbc capability.
- */
-int init_a2dp(struct a2dp_info *a2dp, a2dp_sbc_t *sbc);
-
-/*
- * Destroys an a2dp_info.
- */
-void destroy_a2dp(struct a2dp_info *a2dp);
-
-/*
- * Gets the codesize of the SBC codec.
- */
-int a2dp_codesize(struct a2dp_info *a2dp);
-
-/*
- * Gets original size of a2dp encoded bytes.
- */
-int a2dp_block_size(struct a2dp_info *a2dp, int encoded_bytes);
-
-/*
- * Gets the number of queued frames in a2dp_info.
- */
-int a2dp_queued_frames(const struct a2dp_info *a2dp);
-
-/*
- * Empty all queued samples in a2dp_info.
- */
-void a2dp_reset(struct a2dp_info *a2dp);
-
-/*
- * Encodes samples using the codec for this a2dp instance, returns the number of
- * pcm bytes processed.
- * Args:
- *    a2dp: The a2dp info object.
- *    pcm_buf: The buffer of pcm samples.
- *    pcm_buf_size: Size of the pcm buffer.
- *    format_bytes: Number of bytes per sample.
- *    link_mtu: The maximum transmit unit.
- */
-int a2dp_encode(struct a2dp_info *a2dp, const void *pcm_buf, int pcm_buf_size,
-		int format_bytes, size_t link_mtu);
-
-/*
- * Writes samples using a2dp, returns number of frames written.
- * Args:
- *    a2dp: The a2dp info object.
- *    stream_fd: The file descriptor to send stream to.
- *    link_mtu: The maximum transmit unit.
- */
-int a2dp_write(struct a2dp_info *a2dp, int stream_fd, size_t link_mtu);
-
-#endif /* CRAS_A2DP_INFO_H_ */
diff --git a/cras/src/server/cras_a2dp_iodev.c b/cras/src/server/cras_a2dp_iodev.c
deleted file mode 100644
index b8a606e..0000000
--- a/cras/src/server/cras_a2dp_iodev.c
+++ /dev/null
@@ -1,709 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <stdint.h>
-#include <sys/ioctl.h>
-#include <sys/param.h>
-#include <linux/sockios.h>
-#include <sys/socket.h>
-#include <sys/time.h>
-#include <syslog.h>
-#include <time.h>
-
-#include "audio_thread.h"
-#include "audio_thread_log.h"
-#include "byte_buffer.h"
-#include "cras_iodev_list.h"
-#include "cras_a2dp_endpoint.h"
-#include "cras_a2dp_info.h"
-#include "cras_a2dp_iodev.h"
-#include "cras_audio_area.h"
-#include "cras_audio_thread_monitor.h"
-#include "cras_bt_device.h"
-#include "cras_iodev.h"
-#include "cras_util.h"
-#include "rtp.h"
-#include "utlist.h"
-
-#define PCM_BUF_MAX_SIZE_FRAMES (4096 * 4)
-#define PCM_BUF_MAX_SIZE_BYTES (PCM_BUF_MAX_SIZE_FRAMES * 4)
-
-/* Threshold for reasonable a2dp throttle log in audio dump. */
-static const struct timespec throttle_log_threshold = {
-	0, 20000000 /* 20ms */
-};
-
-/* Threshold for severe a2dp throttle event. */
-static const struct timespec throttle_event_threshold = {
-	2, 0 /* 2s */
-};
-
-/* Child of cras_iodev to handle bluetooth A2DP streaming.
- * Members:
- *    base - The cras_iodev structure "base class"
- *    a2dp - The codec and encoded state of a2dp_io.
- *    transport - The transport object for bluez media API.
- *    sock_depth_frames - Socket depth in frames of the a2dp socket.
- *    pcm_buf - Buffer to hold pcm samples before encode.
- *    destroyed - Flag to note if this a2dp_io is about to destroy.
- *    next_flush_time - The time when it is okay for next flush call.
- *    flush_period - The time period between two a2dp packet writes.
- *    write_block - How many frames of audio samples are transferred in one
- *        a2dp packet write.
- */
-struct a2dp_io {
-	struct cras_iodev base;
-	struct a2dp_info a2dp;
-	struct cras_bt_transport *transport;
-	unsigned sock_depth_frames;
-	struct byte_buffer *pcm_buf;
-	int destroyed;
-	struct timespec next_flush_time;
-	struct timespec flush_period;
-	unsigned int write_block;
-};
-
-static int encode_and_flush(const struct cras_iodev *iodev);
-
-static int update_supported_formats(struct cras_iodev *iodev)
-{
-	struct a2dp_io *a2dpio = (struct a2dp_io *)iodev;
-	size_t rate = 0;
-	size_t channel;
-	a2dp_sbc_t a2dp;
-
-	cras_bt_transport_configuration(a2dpio->transport, &a2dp, sizeof(a2dp));
-
-	channel = (a2dp.channel_mode == SBC_CHANNEL_MODE_MONO) ? 1 : 2;
-
-	if (a2dp.frequency & SBC_SAMPLING_FREQ_48000)
-		rate = 48000;
-	else if (a2dp.frequency & SBC_SAMPLING_FREQ_44100)
-		rate = 44100;
-	else if (a2dp.frequency & SBC_SAMPLING_FREQ_32000)
-		rate = 32000;
-	else if (a2dp.frequency & SBC_SAMPLING_FREQ_16000)
-		rate = 16000;
-
-	free(iodev->supported_rates);
-	iodev->supported_rates = (size_t *)malloc(2 * sizeof(rate));
-	iodev->supported_rates[0] = rate;
-	iodev->supported_rates[1] = 0;
-
-	free(iodev->supported_channel_counts);
-	iodev->supported_channel_counts = (size_t *)malloc(2 * sizeof(channel));
-	iodev->supported_channel_counts[0] = channel;
-	iodev->supported_channel_counts[1] = 0;
-
-	free(iodev->supported_formats);
-	iodev->supported_formats =
-		(snd_pcm_format_t *)malloc(2 * sizeof(snd_pcm_format_t));
-	iodev->supported_formats[0] = SND_PCM_FORMAT_S16_LE;
-	iodev->supported_formats[1] = (snd_pcm_format_t)0;
-
-	return 0;
-}
-
-static unsigned int bt_local_queued_frames(const struct cras_iodev *iodev)
-{
-	struct a2dp_io *a2dpio = (struct a2dp_io *)iodev;
-	return a2dp_queued_frames(&a2dpio->a2dp) +
-	       buf_queued(a2dpio->pcm_buf) /
-		       cras_get_format_bytes(iodev->format);
-}
-
-static int frames_queued(const struct cras_iodev *iodev,
-			 struct timespec *tstamp)
-{
-	int local_queued_frames = bt_local_queued_frames(iodev);
-	clock_gettime(CLOCK_MONOTONIC_RAW, tstamp);
-	return MIN(iodev->buffer_size, local_queued_frames);
-}
-
-/*
- * Utility function to fill zero frames until buffer level reaches
- * target_level. This is useful to allocate just enough data to write
- * to controller, while not introducing extra latency.
- */
-static int fill_zeros_to_target_level(struct cras_iodev *iodev,
-				      unsigned int target_level)
-{
-	unsigned int local_queued_frames = bt_local_queued_frames(iodev);
-
-	if (local_queued_frames < target_level)
-		return cras_iodev_fill_odev_zeros(
-			iodev, target_level - local_queued_frames);
-	return 0;
-}
-
-/*
- * dev_io_playback_write() has the logic to detect underrun scenario
- * and calls into this underrun ops, by comparing buffer level with
- * number of frames just written. Note that it's not correct 100% of
- * the time in a2dp case, because we lose track of samples once they're
- * flushed to socket.
- */
-static int output_underrun(struct cras_iodev *iodev)
-{
-	unsigned int local_queued_frames = bt_local_queued_frames(iodev);
-
-	/*
-	 * Examples to help understand the check:
-	 *
-	 * [False-positive underrun]
-	 * Assume min_buffer_level = 1000, written 900, and flushes
-	 * 800 of data. Audio thread sees 1000 + 900 - 800 = 1100 of
-	 * data left. This is merely 100(< 900) above min_buffer_level
-	 * so audio_thread thinks it underruns, but actually not.
-	 *
-	 * [True underrun]
-	 * min_buffer_level = 1000, written 200, and flushes 800 of
-	 * data. Now that buffer runs lower than min_buffer_level so
-	 * it's indeed an underrun.
-	 */
-	if (local_queued_frames > iodev->min_buffer_level)
-		return 0;
-
-	return cras_iodev_fill_odev_zeros(iodev, iodev->min_cb_level);
-}
-
-/*
- * This will be called multiple times when a2dpio is in no_stream state
- * frames_to_play_in_sleep ops determins how regular this will be called.
- */
-static int enter_no_stream(struct a2dp_io *a2dpio)
-{
-	struct cras_iodev *odev = &a2dpio->base;
-	int rc;
-	/*
-         * Setting target level to 3 times of min_buffer_level.
-         * We want hw_level to stay bewteen 1-2 times of min_buffer_level on
-	 * top of the underrun threshold(i.e one min_cb_level).
-         */
-	rc = fill_zeros_to_target_level(odev, 3 * odev->min_buffer_level);
-	if (rc)
-		syslog(LOG_ERR, "Error in A2DP enter_no_stream");
-	return encode_and_flush(odev);
-}
-
-/*
- * This is called when stream data is available to write. Prepare audio
- * data to one min_buffer_level. Don't flush it now because stream data is
- * coming right up which will trigger next flush at appropriate time.
- */
-static int leave_no_stream(struct a2dp_io *a2dpio)
-{
-	struct cras_iodev *odev = &a2dpio->base;
-
-	/*
-	 * Since stream data is ready, just make sure hw_level doesn't underrun
-	 * after one flush. Hence setting the target level to 2 times of
-	 * min_buffer_level.
-         */
-	return fill_zeros_to_target_level(odev, 2 * odev->min_buffer_level);
-}
-
-/*
- * Makes sure there's enough data(zero frames) to flush when no stream presents.
- * Note that the underrun condition is when real buffer level goes below
- * min_buffer_level, so we want to keep data at a reasonable higher level on top
- * of that.
- */
-static int no_stream(struct cras_iodev *odev, int enable)
-{
-	struct a2dp_io *a2dpio = (struct a2dp_io *)odev;
-
-	if (enable)
-		return enter_no_stream(a2dpio);
-	else
-		return leave_no_stream(a2dpio);
-}
-
-/* Encode as much PCM data as we can until the buffer level of a2dp_info
- * reaches MTU.
- * Returns:
- *    0 for success, otherwise negative error code.
- */
-static int encode_a2dp_packet(struct a2dp_io *a2dpio)
-{
-	int processed;
-	size_t format_bytes = cras_get_format_bytes(a2dpio->base.format);
-
-	while (buf_queued(a2dpio->pcm_buf)) {
-		processed = a2dp_encode(
-			&a2dpio->a2dp, buf_read_pointer(a2dpio->pcm_buf),
-			buf_readable(a2dpio->pcm_buf), format_bytes,
-			cras_bt_transport_write_mtu(a2dpio->transport));
-		if (processed == -ENOSPC || processed == 0)
-			break;
-		if (processed < 0)
-			return processed;
-
-		buf_increment_read(a2dpio->pcm_buf, processed);
-	}
-	return 0;
-}
-
-/*
- * To be called when a2dp socket becomes writable.
- */
-static int a2dp_socket_write_cb(void *arg, int revent)
-{
-	struct cras_iodev *iodev = (struct cras_iodev *)arg;
-	return encode_and_flush(iodev);
-}
-
-static int configure_dev(struct cras_iodev *iodev)
-{
-	struct a2dp_io *a2dpio = (struct a2dp_io *)iodev;
-	int sock_depth;
-	int err;
-	socklen_t optlen;
-	int a2dp_payload_length;
-
-	err = cras_bt_transport_acquire(a2dpio->transport);
-	if (err < 0) {
-		syslog(LOG_ERR, "transport_acquire failed");
-		return err;
-	}
-
-	/* Apply the node's volume after transport is acquired. Doing this
-	 * is necessary because the volume can not sync to hardware until
-	 * it is opened. */
-	iodev->set_volume(iodev);
-
-	/* Assert format is set before opening device. */
-	if (iodev->format == NULL)
-		return -EINVAL;
-	iodev->format->format = SND_PCM_FORMAT_S16_LE;
-	cras_iodev_init_audio_area(iodev, iodev->format->num_channels);
-
-	a2dpio->pcm_buf = byte_buffer_create(PCM_BUF_MAX_SIZE_BYTES);
-	if (!a2dpio->pcm_buf)
-		return -ENOMEM;
-
-	/* Set up the socket to hold two MTUs full of data before returning
-	 * EAGAIN.  This will allow the write to be throttled when a reasonable
-	 * amount of data is queued. */
-	sock_depth = 2 * cras_bt_transport_write_mtu(a2dpio->transport);
-	setsockopt(cras_bt_transport_fd(a2dpio->transport), SOL_SOCKET,
-		   SO_SNDBUF, &sock_depth, sizeof(sock_depth));
-	optlen = sizeof(sock_depth);
-	getsockopt(cras_bt_transport_fd(a2dpio->transport), SOL_SOCKET,
-		   SO_SNDBUF, &sock_depth, &optlen);
-	a2dpio->sock_depth_frames = a2dp_block_size(&a2dpio->a2dp, sock_depth) /
-				    cras_get_format_bytes(iodev->format);
-	/*
-	 * Per avdtp_write, subtract the room for packet header first.
-	 * Calculate how many frames are encapsulated in one a2dp packet, and
-	 * the corresponding time period between two packets.
-	 */
-	a2dp_payload_length = cras_bt_transport_write_mtu(a2dpio->transport) -
-			      sizeof(struct rtp_header) -
-			      sizeof(struct rtp_payload);
-	a2dpio->write_block =
-		a2dp_block_size(&a2dpio->a2dp, a2dp_payload_length) /
-		cras_get_format_bytes(iodev->format);
-	cras_frames_to_time(a2dpio->write_block, iodev->format->frame_rate,
-			    &a2dpio->flush_period);
-
-	/* PCM buffer size plus one encoded a2dp packet. */
-	iodev->buffer_size = PCM_BUF_MAX_SIZE_FRAMES + a2dpio->write_block;
-
-	/*
-	 * Buffer level less than one write_block can't be send over a2dp
-	 * packet. Configure min_buffer_level to this value so when stream
-	 * underruns, audio thread can take action to fill some zeros.
-	 */
-	iodev->min_buffer_level = a2dpio->write_block;
-
-	audio_thread_add_events_callback(
-		cras_bt_transport_fd(a2dpio->transport), a2dp_socket_write_cb,
-		iodev, POLLOUT | POLLERR | POLLHUP);
-	audio_thread_config_events_callback(
-		cras_bt_transport_fd(a2dpio->transport), TRIGGER_NONE);
-	return 0;
-}
-
-static int start(const struct cras_iodev *iodev)
-{
-	struct a2dp_io *a2dpio = (struct a2dp_io *)iodev;
-
-	/*
-	 * This is called when iodev in open state, at the moment when
-	 * output sample is ready. Initialize the next_flush_time for
-	 * following flush calls.
-	 */
-	clock_gettime(CLOCK_MONOTONIC_RAW, &a2dpio->next_flush_time);
-
-	return 0;
-}
-
-static int close_dev(struct cras_iodev *iodev)
-{
-	int err;
-	struct a2dp_io *a2dpio = (struct a2dp_io *)iodev;
-	struct cras_bt_device *device;
-
-	if (!a2dpio->transport)
-		return 0;
-
-	/* Remove audio thread callback and sync before releasing
-	 * the transport. */
-	audio_thread_rm_callback_sync(cras_iodev_list_get_audio_thread(),
-				      cras_bt_transport_fd(a2dpio->transport));
-
-	err = cras_bt_transport_release(a2dpio->transport, !a2dpio->destroyed);
-	if (err < 0)
-		syslog(LOG_ERR, "transport_release failed");
-
-	device = cras_bt_transport_device(a2dpio->transport);
-	if (device)
-		cras_bt_device_cancel_suspend(device);
-	a2dp_reset(&a2dpio->a2dp);
-	byte_buffer_destroy(&a2dpio->pcm_buf);
-	cras_iodev_free_format(iodev);
-	cras_iodev_free_audio_area(iodev);
-	return 0;
-}
-
-static unsigned int frames_to_play_in_sleep(struct cras_iodev *iodev,
-					    unsigned int *hw_level,
-					    struct timespec *hw_tstamp)
-{
-	struct a2dp_io *a2dpio = (struct a2dp_io *)iodev;
-	int frames_until;
-
-	*hw_level = frames_queued(iodev, hw_tstamp);
-	if (*hw_level < a2dpio->write_block)
-		*hw_level = 0;
-	else
-		*hw_level -= a2dpio->write_block;
-
-	frames_until = cras_frames_until_time(&a2dpio->next_flush_time,
-					      iodev->format->frame_rate);
-	if (frames_until > 0)
-		return frames_until;
-
-	/* If time has passed next_flush_time, for example when socket write
-	 * throttles, sleep a moderate of time so that audio thread doesn't
-	 * busy wake up. */
-	return a2dpio->write_block;
-}
-
-/* Encodes PCM data to a2dp frames and try to flush it to the socket.
- * Returns:
- *    0 when the flush succeeded, -1 when error occurred.
- */
-static int encode_and_flush(const struct cras_iodev *iodev)
-{
-	int err;
-	size_t format_bytes;
-	int written = 0;
-	unsigned int queued_frames;
-	struct a2dp_io *a2dpio;
-	struct cras_bt_device *device;
-	struct timespec now, ts;
-	static const struct timespec flush_wake_fuzz_ts = {
-		0, 1000000 /* 1ms */
-	};
-
-	a2dpio = (struct a2dp_io *)iodev;
-	format_bytes = cras_get_format_bytes(iodev->format);
-	device = cras_bt_transport_device(a2dpio->transport);
-
-	/* If bt device has been destroyed, this a2dp iodev will soon be
-	 * destroyed as well. */
-	if (device == NULL)
-		return -EINVAL;
-
-	ATLOG(atlog, AUDIO_THREAD_A2DP_FLUSH, iodev->state,
-	      a2dpio->next_flush_time.tv_sec, a2dpio->next_flush_time.tv_nsec);
-
-	/* Only allow data to be flushed after start() ops is called. */
-	if ((iodev->state != CRAS_IODEV_STATE_NORMAL_RUN) &&
-	    (iodev->state != CRAS_IODEV_STATE_NO_STREAM_RUN))
-		return 0;
-
-	err = encode_a2dp_packet(a2dpio);
-	if (err < 0)
-		return err;
-
-do_flush:
-	/* If flush gets called before targeted next flush time, do nothing. */
-	clock_gettime(CLOCK_MONOTONIC_RAW, &now);
-	add_timespecs(&now, &flush_wake_fuzz_ts);
-	if (!timespec_after(&now, &a2dpio->next_flush_time)) {
-		if (iodev->buffer_size == bt_local_queued_frames(iodev)) {
-			/*
-			 * If buffer is full, audio thread will no longer call
-			 * into get/put buffer in subsequent wake-ups. In that
-			 * case set the registered callback to be triggered at
-			 * next audio thread wake up.
-			 */
-			audio_thread_config_events_callback(
-				cras_bt_transport_fd(a2dpio->transport),
-				TRIGGER_WAKEUP);
-			cras_audio_thread_event_a2dp_overrun();
-			syslog(LOG_WARNING, "Buffer overrun in A2DP iodev");
-		}
-		return 0;
-	}
-
-	/* If the A2DP write schedule miss exceeds a small threshold, log it for
-	 * debug purpose. */
-	subtract_timespecs(&now, &a2dpio->next_flush_time, &ts);
-	if (timespec_after(&ts, &throttle_log_threshold))
-		ATLOG(atlog, AUDIO_THREAD_A2DP_THROTTLE_TIME, ts.tv_sec,
-		      ts.tv_nsec, bt_local_queued_frames(iodev));
-
-	/* Log an event if the A2DP write schedule miss exceeds a large threshold
-	 * that we consider it as something severe. */
-	if (timespec_after(&ts, &throttle_event_threshold))
-		cras_audio_thread_event_a2dp_throttle();
-
-	written = a2dp_write(&a2dpio->a2dp,
-			     cras_bt_transport_fd(a2dpio->transport),
-			     cras_bt_transport_write_mtu(a2dpio->transport));
-	ATLOG(atlog, AUDIO_THREAD_A2DP_WRITE, written,
-	      a2dp_queued_frames(&a2dpio->a2dp), 0);
-	if (written == -EAGAIN) {
-		/* If EAGAIN error lasts longer than 5 seconds, suspend the
-		 * a2dp connection. */
-		cras_bt_device_schedule_suspend(device, 5000,
-						A2DP_LONG_TX_FAILURE);
-		audio_thread_config_events_callback(
-			cras_bt_transport_fd(a2dpio->transport), TRIGGER_POLL);
-		return 0;
-	} else if (written < 0) {
-		/* Suspend a2dp immediately when receives error other than
-		 * EAGAIN. */
-		cras_bt_device_cancel_suspend(device);
-		cras_bt_device_schedule_suspend(device, 0, A2DP_TX_FATAL_ERROR);
-		/* Stop polling the socket in audio thread. Main thread will
-		 * close this iodev soon. */
-		audio_thread_config_events_callback(
-			cras_bt_transport_fd(a2dpio->transport), TRIGGER_NONE);
-		return written;
-	}
-
-	/* Update the next flush time if one block successfully been written. */
-	if (written)
-		add_timespecs(&a2dpio->next_flush_time, &a2dpio->flush_period);
-
-	/* a2dp_write no longer return -EAGAIN when reaches here, disable
-	 * the polling write callback. */
-	audio_thread_config_events_callback(
-		cras_bt_transport_fd(a2dpio->transport), TRIGGER_NONE);
-
-	/* Data succcessfully written to a2dp socket, cancel any scheduled
-	 * suspend timer. */
-	cras_bt_device_cancel_suspend(device);
-
-	/* If it looks okay to write more and we do have queued data, try
-	 * encode more. But avoid the case when PCM buffer level is too close
-	 * to min_buffer_level so that another A2DP write could causes underrun.
-	 */
-	queued_frames = buf_queued(a2dpio->pcm_buf) / format_bytes;
-	if (written &&
-	    (iodev->min_buffer_level + a2dpio->write_block < queued_frames)) {
-		err = encode_a2dp_packet(a2dpio);
-		if (err < 0)
-			return err;
-		goto do_flush;
-	}
-
-	return 0;
-}
-
-static int delay_frames(const struct cras_iodev *iodev)
-{
-	const struct a2dp_io *a2dpio = (struct a2dp_io *)iodev;
-	struct timespec tstamp;
-
-	/* The number of frames in the pcm buffer plus two mtu packets */
-	return frames_queued(iodev, &tstamp) + a2dpio->sock_depth_frames;
-}
-
-static int get_buffer(struct cras_iodev *iodev, struct cras_audio_area **area,
-		      unsigned *frames)
-{
-	size_t format_bytes;
-	struct a2dp_io *a2dpio;
-
-	a2dpio = (struct a2dp_io *)iodev;
-
-	format_bytes = cras_get_format_bytes(iodev->format);
-
-	if (iodev->direction != CRAS_STREAM_OUTPUT)
-		return 0;
-
-	*frames = MIN(*frames, buf_writable(a2dpio->pcm_buf) / format_bytes);
-	iodev->area->frames = *frames;
-	cras_audio_area_config_buf_pointers(iodev->area, iodev->format,
-					    buf_write_pointer(a2dpio->pcm_buf));
-	*area = iodev->area;
-	return 0;
-}
-
-static int put_buffer(struct cras_iodev *iodev, unsigned nwritten)
-{
-	size_t written_bytes;
-	size_t format_bytes;
-	struct a2dp_io *a2dpio = (struct a2dp_io *)iodev;
-
-	format_bytes = cras_get_format_bytes(iodev->format);
-	written_bytes = nwritten * format_bytes;
-
-	if (written_bytes > buf_writable(a2dpio->pcm_buf))
-		return -EINVAL;
-
-	buf_increment_write(a2dpio->pcm_buf, written_bytes);
-
-	return encode_and_flush(iodev);
-}
-
-static int flush_buffer(struct cras_iodev *iodev)
-{
-	return 0;
-}
-
-static void set_volume(struct cras_iodev *iodev)
-{
-	size_t volume;
-	struct a2dp_io *a2dpio = (struct a2dp_io *)iodev;
-	struct cras_bt_device *device =
-		cras_bt_transport_device(a2dpio->transport);
-
-	if (!cras_bt_device_get_use_hardware_volume(device))
-		return;
-
-	volume = iodev->active_node->volume * 127 / 100;
-
-	if (a2dpio->transport)
-		cras_bt_transport_set_volume(a2dpio->transport, volume);
-}
-
-static void update_active_node(struct cras_iodev *iodev, unsigned node_idx,
-			       unsigned dev_enabled)
-{
-}
-
-void free_resources(struct a2dp_io *a2dpio)
-{
-	struct cras_ionode *node;
-
-	node = a2dpio->base.active_node;
-	if (node) {
-		cras_iodev_rm_node(&a2dpio->base, node);
-		free(node);
-	}
-	free(a2dpio->base.supported_channel_counts);
-	free(a2dpio->base.supported_rates);
-	free(a2dpio->base.supported_formats);
-	destroy_a2dp(&a2dpio->a2dp);
-}
-
-struct cras_iodev *a2dp_iodev_create(struct cras_bt_transport *transport)
-{
-	int err;
-	struct a2dp_io *a2dpio;
-	struct cras_iodev *iodev;
-	struct cras_ionode *node;
-	a2dp_sbc_t a2dp;
-	struct cras_bt_device *device;
-	const char *name;
-
-	a2dpio = (struct a2dp_io *)calloc(1, sizeof(*a2dpio));
-	if (!a2dpio)
-		goto error;
-
-	a2dpio->transport = transport;
-	cras_bt_transport_configuration(a2dpio->transport, &a2dp, sizeof(a2dp));
-	err = init_a2dp(&a2dpio->a2dp, &a2dp);
-	if (err) {
-		syslog(LOG_ERR, "Fail to init a2dp");
-		goto error;
-	}
-
-	iodev = &a2dpio->base;
-
-	/* A2DP only does output now */
-	iodev->direction = CRAS_STREAM_OUTPUT;
-
-	/* Set iodev's name by bluetooth device's readable name, if
-	 * the readable name is not available, use address instead.
-	 */
-	device = cras_bt_transport_device(transport);
-	name = cras_bt_device_name(device);
-	if (!name)
-		name = cras_bt_transport_object_path(a2dpio->transport);
-
-	snprintf(iodev->info.name, sizeof(iodev->info.name), "%s", name);
-	iodev->info.name[ARRAY_SIZE(iodev->info.name) - 1] = '\0';
-	iodev->info.stable_id = cras_bt_device_get_stable_id(device);
-
-	iodev->configure_dev = configure_dev;
-	iodev->frames_queued = frames_queued;
-	iodev->delay_frames = delay_frames;
-	iodev->get_buffer = get_buffer;
-	iodev->put_buffer = put_buffer;
-	iodev->flush_buffer = flush_buffer;
-	iodev->no_stream = no_stream;
-	iodev->output_underrun = output_underrun;
-	iodev->close_dev = close_dev;
-	iodev->update_supported_formats = update_supported_formats;
-	iodev->update_active_node = update_active_node;
-	iodev->set_volume = set_volume;
-	iodev->start = start;
-	iodev->frames_to_play_in_sleep = frames_to_play_in_sleep;
-
-	/* Create an empty ionode */
-	node = (struct cras_ionode *)calloc(1, sizeof(*node));
-	node->dev = iodev;
-	strcpy(node->name, iodev->info.name);
-	node->plugged = 1;
-	node->type = CRAS_NODE_TYPE_BLUETOOTH;
-	node->volume = 100;
-	gettimeofday(&node->plugged_time, NULL);
-
-	/* Prepare active node before append, so bt_io can extract correct
-	 * info from A2DP iodev and node. */
-	cras_iodev_add_node(iodev, node);
-	cras_iodev_set_active_node(iodev, node);
-	cras_bt_device_append_iodev(
-		device, iodev, cras_bt_transport_profile(a2dpio->transport));
-
-	/* Record max supported channels into cras_iodev_info. */
-	iodev->info.max_supported_channels =
-		(a2dp.channel_mode == SBC_CHANNEL_MODE_MONO) ? 1 : 2;
-
-	ewma_power_disable(&iodev->ewma);
-
-	return iodev;
-error:
-	if (a2dpio) {
-		free_resources(a2dpio);
-		free(a2dpio);
-	}
-	return NULL;
-}
-
-void a2dp_iodev_destroy(struct cras_iodev *iodev)
-{
-	struct a2dp_io *a2dpio = (struct a2dp_io *)iodev;
-	struct cras_bt_device *device;
-
-	a2dpio->destroyed = 1;
-	device = cras_bt_transport_device(a2dpio->transport);
-
-	/* A2DP does output only */
-	cras_bt_device_rm_iodev(device, iodev);
-
-	/* Free resources when device successfully removed. */
-	free_resources(a2dpio);
-	cras_iodev_free_resources(iodev);
-	free(a2dpio);
-}
diff --git a/cras/src/server/cras_a2dp_iodev.h b/cras/src/server/cras_a2dp_iodev.h
deleted file mode 100644
index d4e489d..0000000
--- a/cras/src/server/cras_a2dp_iodev.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_A2DP_IODEV_H_
-#define CRAS_A2DP_IODEV_H_
-
-#include "cras_bt_transport.h"
-
-struct cras_iodev;
-
-/*
- * Creates an a2dp iodev from transport object.
- * Args:
- *    transport - The transport to create a2dp iodev for
- */
-struct cras_iodev *a2dp_iodev_create(struct cras_bt_transport *transport);
-
-/*
- * Destroys a2dp iodev.
- */
-void a2dp_iodev_destroy(struct cras_iodev *iodev);
-
-#endif /* CRS_A2DP_IODEV_H_ */
diff --git a/cras/src/server/cras_alert.c b/cras/src/server/cras_alert.c
deleted file mode 100644
index 9950ec1..0000000
--- a/cras/src/server/cras_alert.c
+++ /dev/null
@@ -1,184 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <errno.h>
-#include <stddef.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "cras_alert.h"
-#include "utlist.h"
-
-/* A list of callbacks for an alert */
-struct cras_alert_cb_list {
-	cras_alert_cb callback;
-	void *arg;
-	struct cras_alert_cb_list *prev, *next;
-};
-
-/* A list of data args to callbacks. Variable-length structure. */
-struct cras_alert_data {
-	struct cras_alert_data *prev, *next;
-	/* This field must be the last in this structure. */
-	char buf[];
-};
-
-struct cras_alert {
-	int pending;
-	unsigned int flags;
-	cras_alert_prepare prepare;
-	struct cras_alert_cb_list *callbacks;
-	struct cras_alert_data *data;
-	struct cras_alert *prev, *next;
-};
-
-/* A list of all alerts in the system */
-static struct cras_alert *all_alerts;
-/* If there is any alert pending. */
-static int has_alert_pending;
-
-struct cras_alert *cras_alert_create(cras_alert_prepare prepare,
-				     unsigned int flags)
-{
-	struct cras_alert *alert;
-	alert = calloc(1, sizeof(*alert));
-	if (!alert)
-		return NULL;
-	alert->prepare = prepare;
-	alert->flags = flags;
-	DL_APPEND(all_alerts, alert);
-	return alert;
-}
-
-int cras_alert_add_callback(struct cras_alert *alert, cras_alert_cb cb,
-			    void *arg)
-{
-	struct cras_alert_cb_list *alert_cb;
-
-	if (cb == NULL)
-		return -EINVAL;
-
-	DL_FOREACH (alert->callbacks, alert_cb)
-		if (alert_cb->callback == cb && alert_cb->arg == arg)
-			return -EEXIST;
-
-	alert_cb = calloc(1, sizeof(*alert_cb));
-	if (alert_cb == NULL)
-		return -ENOMEM;
-	alert_cb->callback = cb;
-	alert_cb->arg = arg;
-	DL_APPEND(alert->callbacks, alert_cb);
-	return 0;
-}
-
-int cras_alert_rm_callback(struct cras_alert *alert, cras_alert_cb cb,
-			   void *arg)
-{
-	struct cras_alert_cb_list *alert_cb;
-
-	DL_FOREACH (alert->callbacks, alert_cb)
-		if (alert_cb->callback == cb && alert_cb->arg == arg) {
-			DL_DELETE(alert->callbacks, alert_cb);
-			free(alert_cb);
-			return 0;
-		}
-	return -ENOENT;
-}
-
-/* Checks if the alert is pending, and invoke the prepare function and callbacks
- * if so. */
-static void cras_alert_process(struct cras_alert *alert)
-{
-	struct cras_alert_cb_list *cb;
-	struct cras_alert_data *data;
-
-	if (!alert->pending)
-		return;
-
-	alert->pending = 0;
-	if (alert->prepare)
-		alert->prepare(alert);
-
-	if (!alert->data) {
-		DL_FOREACH (alert->callbacks, cb)
-			cb->callback(cb->arg, NULL);
-	}
-
-	/* Have data arguments, pass each to the callbacks. */
-	DL_FOREACH (alert->data, data) {
-		DL_FOREACH (alert->callbacks, cb)
-			cb->callback(cb->arg, (void *)data->buf);
-		DL_DELETE(alert->data, data);
-		free(data);
-	}
-}
-
-void cras_alert_pending(struct cras_alert *alert)
-{
-	alert->pending = 1;
-	has_alert_pending = 1;
-}
-
-void cras_alert_pending_data(struct cras_alert *alert, void *data,
-			     size_t data_size)
-{
-	struct cras_alert_data *d;
-
-	alert->pending = 1;
-	has_alert_pending = 1;
-	d = calloc(1, offsetof(struct cras_alert_data, buf) + data_size);
-	memcpy(d->buf, data, data_size);
-
-	if (!(alert->flags & CRAS_ALERT_FLAG_KEEP_ALL_DATA) && alert->data) {
-		/* There will never be more than one item in the list. */
-		free(alert->data);
-		alert->data = NULL;
-	}
-
-	/* Even when there is only one item, it is important to use DL_APPEND
-	 * here so that d's next and prev pointers are setup correctly. */
-	DL_APPEND(alert->data, d);
-}
-
-void cras_alert_process_all_pending_alerts()
-{
-	struct cras_alert *alert;
-
-	while (has_alert_pending) {
-		has_alert_pending = 0;
-		DL_FOREACH (all_alerts, alert)
-			cras_alert_process(alert);
-	}
-}
-
-void cras_alert_destroy(struct cras_alert *alert)
-{
-	struct cras_alert_cb_list *cb;
-	struct cras_alert_data *data;
-
-	if (!alert)
-		return;
-
-	DL_FOREACH (alert->callbacks, cb) {
-		DL_DELETE(alert->callbacks, cb);
-		free(cb);
-	}
-
-	DL_FOREACH (alert->data, data) {
-		DL_DELETE(alert->data, data);
-		free(data);
-	}
-
-	alert->callbacks = NULL;
-	DL_DELETE(all_alerts, alert);
-	free(alert);
-}
-
-void cras_alert_destroy_all()
-{
-	struct cras_alert *alert;
-	DL_FOREACH (all_alerts, alert)
-		cras_alert_destroy(alert);
-}
diff --git a/cras/src/server/cras_alert.h b/cras/src/server/cras_alert.h
deleted file mode 100644
index 7149a0b..0000000
--- a/cras/src/server/cras_alert.h
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef _CRAS_ALERT_H
-#define _CRAS_ALERT_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* The alert facility provides a way to signal the clients when a system state
- * changes.
- *
- * First the clients registers callbacks to an alert. Each time the system state
- * changes, we mark the associated alert as "pending". At the end of the event
- * loop, we invoke the callbacks for the pending alerts.
- *
- * We do this delayed callback to collapses multiple callbacks into one (for
- * example, if there are multiple nodes added at the same time, we will only
- * fire the "nodes changed" signal once).
- *
- * There is an optional "prepare" function which can be provided when creating
- * an alert. It is called before we invoke the callbacks. This gives the owner
- * of each alert a chance to update the system to a consistent state before
- * signalling the clients.
- *
- * The alert functions should only be used from the main thread.
- */
-
-struct cras_alert;
-
-/* Callback functions to be notified when settings change. arg is a user
- * provided argument that will be passed back, data is extra info about the
- * signal if available.
- */
-typedef void (*cras_alert_cb)(void *arg, void *data);
-typedef void (*cras_alert_prepare)(struct cras_alert *alert);
-
-/* Flags for alerts. */
-enum CRAS_ALERT_FLAGS {
-	/* By default, alerts will only keep the last copy of the data
-	 * specified in cras_alert_pending_data as an optimization - then
-	 * the callback is executed once with the latest value, rather than
-	 * for every value. In some cases, it is important to send the data
-	 * with every change. Use this flag to enable that behavior. */
-	CRAS_ALERT_FLAG_KEEP_ALL_DATA = 1 << 0,
-};
-
-/* Creates an alert.
- * Args:
- *    prepare - A function which will be called before calling the callbacks.
- *        The prepare function should update the system state in the shared
- *        memory to be consistent. It can be NULL if not needed.
- *    flags - 0 for defauts, or ORed values from enum CRAS_ALERT_FLAGS.
- * Returns:
- *    A pointer to the alert, NULL if out of memory.
- */
-struct cras_alert *cras_alert_create(cras_alert_prepare prepare,
-				     unsigned int flags);
-
-/* Adds a callback to the alert.
- * Args:
- *    alert - A pointer to the alert.
- *    cb - The callback.
- *    arg - will be passed to the callback when it is called.
- * Returns:
- *    0 on success or negative error code on failure.
- */
-int cras_alert_add_callback(struct cras_alert *alert, cras_alert_cb cb,
-			    void *arg);
-
-/* Removes a callback from the alert. It removes the callback if cb and arg
- * match a previously registered entry.
- * Args:
- *    alert - A pointer to the alert.
- *    cb - The callback.
- *    arg - will be passed to the callback when it is called.
- * Returns:
- *    0 on success or negative error code on failure.
- */
-int cras_alert_rm_callback(struct cras_alert *alert, cras_alert_cb cb,
-			   void *arg);
-
-/* Marks an alert as pending. We don't call the callbacks immediately when an
- * alert becomes pending, but will do that when
- * cras_alert_process_all_pending_alerts() is called.
- * Args:
- *    alert - A pointer to the alert.
- */
-void cras_alert_pending(struct cras_alert *alert);
-
-/* Marks an alert as pending. We don't call the callbacks immediately when an
- * alert becomes pending, but will do that when
- * cras_alert_process_all_pending_alerts() is called.
- * By default only the last data value supplied here is provided as an
- * argument to the callback. To have the callback executed with every
- * data value, call cras_alert_keep_all_data() (see above).
- * Args:
- *    alert - A pointer to the alert.
- *    data - A pointer to data that is copied and passed to the callback.
- *    data_size - Size of the data.
- */
-void cras_alert_pending_data(struct cras_alert *alert, void *data,
-			     size_t data_size);
-
-/* Processes all alerts that are pending.
- *
- * For all pending alerts, its prepare function will be called, then the
- * callbacks will be called. If any alert becomes pending during the callbacks,
- * the process will start again until no alert is pending.
- */
-void cras_alert_process_all_pending_alerts();
-
-/* Frees the resources used by an alert.
- * Args:
- *    alert - A pointer to the alert.
- */
-void cras_alert_destroy(struct cras_alert *alert);
-
-/* Frees the resources used by all alerts in the system. */
-void cras_alert_destroy_all();
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif /* _CRAS_ALERT_H */
diff --git a/cras/src/server/cras_alsa_card.c b/cras/src/server/cras_alsa_card.c
deleted file mode 100644
index 362e6a6..0000000
--- a/cras/src/server/cras_alsa_card.c
+++ /dev/null
@@ -1,641 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef _GNU_SOURCE
-#define _GNU_SOURCE /* For asprintf */
-#endif
-
-#include <alsa/asoundlib.h>
-#include <syslog.h>
-
-#include "cras_alsa_card.h"
-#include "cras_alsa_io.h"
-#include "cras_alsa_mixer.h"
-#include "cras_alsa_ucm.h"
-#include "cras_device_blocklist.h"
-#include "cras_card_config.h"
-#include "cras_config.h"
-#include "cras_iodev.h"
-#include "cras_iodev_list.h"
-#include "cras_system_state.h"
-#include "cras_types.h"
-#include "cras_util.h"
-#include "utlist.h"
-
-#define MAX_ALSA_CARDS 32 /* Alsa limit on number of cards. */
-#define MAX_ALSA_CARD_NAME_LENGTH 6 /* Alsa card name "hw:XX" + 1 for null. */
-#define MAX_ALSA_PCM_NAME_LENGTH 9 /* Alsa pcm name "hw:XX,YY" + 1 for null. */
-#define MAX_COUPLED_OUTPUT_SIZE 4
-
-struct iodev_list_node {
-	struct cras_iodev *iodev;
-	enum CRAS_STREAM_DIRECTION direction;
-	struct iodev_list_node *prev, *next;
-};
-
-/* Keeps an fd that is registered with system state.  A list of fds must be
- * kept so that they can be removed when the card is destroyed. */
-struct hctl_poll_fd {
-	int fd;
-	struct hctl_poll_fd *prev, *next;
-};
-
-/* Holds information about each sound card on the system.
- * name - of the form hw:XX.
- * card_index - 0 based index, value of "XX" in the name.
- * iodevs - Input and output devices for this card.
- * mixer - Controls the mixer controls for this card.
- * ucm - CRAS use case manager if available.
- * hctl - ALSA high-level control interface.
- * hctl_poll_fds - List of fds registered with cras_system_state.
- * config - Config info for this card, can be NULL if none found.
- */
-struct cras_alsa_card {
-	char name[MAX_ALSA_CARD_NAME_LENGTH];
-	size_t card_index;
-	struct iodev_list_node *iodevs;
-	struct cras_alsa_mixer *mixer;
-	struct cras_use_case_mgr *ucm;
-	snd_hctl_t *hctl;
-	struct hctl_poll_fd *hctl_poll_fds;
-	struct cras_card_config *config;
-};
-
-/* Creates an iodev for the given device.
- * Args:
- *    alsa_card - the alsa_card the device will be added to.
- *    info - Information about the card type and priority.
- *    card_name - The name of the card.
- *    dev_name - The name of the device.
- *    dev_id - The id string of the device.
- *    device_index - 0 based index, value of "YY" in "hw:XX,YY".
- *    direction - Input or output.
- * Returns:
- *    Pointer to the created iodev, or NULL on error.
- *    other negative error code otherwise.
- */
-struct cras_iodev *create_iodev_for_device(
-	struct cras_alsa_card *alsa_card, struct cras_alsa_card_info *info,
-	const char *card_name, const char *dev_name, const char *dev_id,
-	unsigned device_index, enum CRAS_STREAM_DIRECTION direction)
-{
-	struct iodev_list_node *new_dev;
-	struct iodev_list_node *node;
-	int first = 1;
-	char pcm_name[MAX_ALSA_PCM_NAME_LENGTH];
-
-	/* Find whether this is the first device in this direction, and
-	 * avoid duplicate device indexes. */
-	DL_FOREACH (alsa_card->iodevs, node) {
-		if (node->direction != direction)
-			continue;
-		first = 0;
-		if (alsa_iodev_index(node->iodev) == device_index) {
-			syslog(LOG_DEBUG,
-			       "Skipping duplicate device for %s:%s:%s [%u]",
-			       card_name, dev_name, dev_id, device_index);
-			return node->iodev;
-		}
-	}
-
-	new_dev = calloc(1, sizeof(*new_dev));
-	if (new_dev == NULL)
-		return NULL;
-
-	/* Append device index to card namem, ex: 'hw:0', for the PCM name of
-	 * target iodev. */
-	snprintf(pcm_name, MAX_ALSA_PCM_NAME_LENGTH, "%s,%u", alsa_card->name,
-		 device_index);
-
-	new_dev->direction = direction;
-	new_dev->iodev =
-		alsa_iodev_create(info->card_index, card_name, device_index,
-				  pcm_name, dev_name, dev_id, info->card_type,
-				  first, alsa_card->mixer, alsa_card->config,
-				  alsa_card->ucm, alsa_card->hctl, direction,
-				  info->usb_vendor_id, info->usb_product_id,
-				  info->usb_serial_number);
-	if (new_dev->iodev == NULL) {
-		syslog(LOG_ERR, "Couldn't create alsa_iodev for %s", pcm_name);
-		free(new_dev);
-		return NULL;
-	}
-
-	syslog(LOG_DEBUG, "New %s device %s",
-	       direction == CRAS_STREAM_OUTPUT ? "playback" : "capture",
-	       pcm_name);
-
-	DL_APPEND(alsa_card->iodevs, new_dev);
-	return new_dev->iodev;
-}
-
-/* Returns non-zero if this card has hctl jacks.
- */
-static int card_has_hctl_jack(struct cras_alsa_card *alsa_card)
-{
-	struct iodev_list_node *node;
-
-	/* Find the first device that has an hctl jack. */
-	DL_FOREACH (alsa_card->iodevs, node) {
-		if (alsa_iodev_has_hctl_jacks(node->iodev))
-			return 1;
-	}
-	return 0;
-}
-
-/* Check if a device should be ignored for this card. Returns non-zero if the
- * device is in the blocklist and should be ignored.
- */
-static int should_ignore_dev(struct cras_alsa_card_info *info,
-			     struct cras_device_blocklist *blocklist,
-			     size_t device_index)
-{
-	if (info->card_type == ALSA_CARD_TYPE_USB)
-		return cras_device_blocklist_check(
-			blocklist, info->usb_vendor_id, info->usb_product_id,
-			info->usb_desc_checksum, device_index);
-	return 0;
-}
-
-/* Filters an array of mixer control names. Keep a name if it is
- * specified in the ucm config. */
-static struct mixer_name *filter_controls(struct cras_use_case_mgr *ucm,
-					  struct mixer_name *controls)
-{
-	struct mixer_name *control;
-	DL_FOREACH (controls, control) {
-		char *dev = ucm_get_dev_for_mixer(ucm, control->name,
-						  CRAS_STREAM_OUTPUT);
-		if (!dev)
-			DL_DELETE(controls, control);
-		else
-			free(dev);
-	}
-	return controls;
-}
-
-/* Handles notifications from alsa controls.  Called by main thread when a poll
- * fd provided by alsa signals there is an event available. */
-static void alsa_control_event_pending(void *arg, int revent)
-{
-	struct cras_alsa_card *card;
-
-	card = (struct cras_alsa_card *)arg;
-	if (card == NULL) {
-		syslog(LOG_ERR, "Invalid card from control event.");
-		return;
-	}
-
-	/* handle_events will trigger the callback registered with each control
-	 * that has changed. */
-	snd_hctl_handle_events(card->hctl);
-}
-
-static int
-add_controls_and_iodevs_by_matching(struct cras_alsa_card_info *info,
-				    struct cras_device_blocklist *blocklist,
-				    struct cras_alsa_card *alsa_card,
-				    const char *card_name, snd_ctl_t *handle)
-{
-	struct mixer_name *coupled_controls = NULL;
-	int dev_idx;
-	snd_pcm_info_t *dev_info;
-	struct mixer_name *extra_controls = NULL;
-	int rc = 0;
-
-	snd_pcm_info_alloca(&dev_info);
-
-	if (alsa_card->ucm) {
-		char *extra_main_volume;
-
-		/* Filter the extra output mixer names */
-		extra_controls = filter_controls(
-			alsa_card->ucm,
-			mixer_name_add(extra_controls, "IEC958",
-				       CRAS_STREAM_OUTPUT, MIXER_NAME_VOLUME));
-
-		/* Get the extra main volume control. */
-		extra_main_volume =
-			ucm_get_flag(alsa_card->ucm, "ExtraMainVolume");
-		if (extra_main_volume) {
-			extra_controls = mixer_name_add(extra_controls,
-							extra_main_volume,
-							CRAS_STREAM_OUTPUT,
-							MIXER_NAME_MAIN_VOLUME);
-			free(extra_main_volume);
-		}
-		mixer_name_dump(extra_controls, "extra controls");
-
-		/* Check if coupled controls has been specified for speaker. */
-		coupled_controls =
-			ucm_get_coupled_mixer_names(alsa_card->ucm, "Speaker");
-		mixer_name_dump(coupled_controls, "coupled controls");
-	}
-
-	/* Add controls to mixer by name matching. */
-	rc = cras_alsa_mixer_add_controls_by_name_matching(
-		alsa_card->mixer, extra_controls, coupled_controls);
-	if (rc) {
-		syslog(LOG_ERR, "Fail adding controls to mixer for %s.",
-		       alsa_card->name);
-		goto error;
-	}
-
-	/* Go through every device. */
-	dev_idx = -1;
-	while (1) {
-		rc = snd_ctl_pcm_next_device(handle, &dev_idx);
-		if (rc < 0)
-			goto error;
-		if (dev_idx < 0)
-			break;
-
-		snd_pcm_info_set_device(dev_info, dev_idx);
-		snd_pcm_info_set_subdevice(dev_info, 0);
-
-		/* Check for playback devices. */
-		snd_pcm_info_set_stream(dev_info, SND_PCM_STREAM_PLAYBACK);
-		if (snd_ctl_pcm_info(handle, dev_info) == 0 &&
-		    !should_ignore_dev(info, blocklist, dev_idx)) {
-			struct cras_iodev *iodev = create_iodev_for_device(
-				alsa_card, info, card_name,
-				snd_pcm_info_get_name(dev_info),
-				snd_pcm_info_get_id(dev_info), dev_idx,
-				CRAS_STREAM_OUTPUT);
-			if (iodev) {
-				rc = alsa_iodev_legacy_complete_init(iodev);
-				if (rc < 0)
-					goto error;
-			}
-		}
-
-		/* Check for capture devices. */
-		snd_pcm_info_set_stream(dev_info, SND_PCM_STREAM_CAPTURE);
-		if (snd_ctl_pcm_info(handle, dev_info) == 0) {
-			struct cras_iodev *iodev = create_iodev_for_device(
-				alsa_card, info, card_name,
-				snd_pcm_info_get_name(dev_info),
-				snd_pcm_info_get_id(dev_info), dev_idx,
-				CRAS_STREAM_INPUT);
-			if (iodev) {
-				rc = alsa_iodev_legacy_complete_init(iodev);
-				if (rc < 0)
-					goto error;
-			}
-		}
-	}
-error:
-	mixer_name_free(coupled_controls);
-	mixer_name_free(extra_controls);
-	return rc;
-}
-
-static int add_controls_and_iodevs_with_ucm(struct cras_alsa_card_info *info,
-					    struct cras_alsa_card *alsa_card,
-					    const char *card_name,
-					    snd_ctl_t *handle)
-{
-	snd_pcm_info_t *dev_info;
-	struct mixer_name *main_volume_control_names;
-	struct iodev_list_node *node;
-	int rc = 0;
-	struct ucm_section *section;
-	struct ucm_section *ucm_sections;
-
-	snd_pcm_info_alloca(&dev_info);
-
-	main_volume_control_names = ucm_get_main_volume_names(alsa_card->ucm);
-	if (main_volume_control_names) {
-		rc = cras_alsa_mixer_add_main_volume_control_by_name(
-			alsa_card->mixer, main_volume_control_names);
-		if (rc) {
-			syslog(LOG_ERR,
-			       "Failed adding main volume controls to"
-			       " mixer for '%s'.'",
-			       card_name);
-			goto cleanup_names;
-		}
-	}
-
-	/* Get info on the devices specified in the UCM config. */
-	ucm_sections = ucm_get_sections(alsa_card->ucm);
-	if (!ucm_sections) {
-		syslog(LOG_ERR,
-		       "Could not retrieve any UCM SectionDevice"
-		       " info for '%s'.",
-		       card_name);
-		rc = -ENOENT;
-		goto cleanup_names;
-	}
-
-	/* Create all of the controls first. */
-	DL_FOREACH (ucm_sections, section) {
-		rc = cras_alsa_mixer_add_controls_in_section(alsa_card->mixer,
-							     section);
-		if (rc) {
-			syslog(LOG_ERR,
-			       "Failed adding controls to"
-			       " mixer for '%s:%s'",
-			       card_name, section->name);
-			goto cleanup;
-		}
-	}
-
-	/* Create all of the devices. */
-	DL_FOREACH (ucm_sections, section) {
-		/* If a UCM section specifies certain device as dependency
-		 * then don't create an alsa iodev for it, just append it
-		 * as node later. */
-		if (section->dependent_dev_idx != -1)
-			continue;
-		snd_pcm_info_set_device(dev_info, section->dev_idx);
-		snd_pcm_info_set_subdevice(dev_info, 0);
-		if (section->dir == CRAS_STREAM_OUTPUT)
-			snd_pcm_info_set_stream(dev_info,
-						SND_PCM_STREAM_PLAYBACK);
-		else if (section->dir == CRAS_STREAM_INPUT)
-			snd_pcm_info_set_stream(dev_info,
-						SND_PCM_STREAM_CAPTURE);
-		else {
-			syslog(LOG_ERR, "Unexpected direction: %d",
-			       section->dir);
-			rc = -EINVAL;
-			goto cleanup;
-		}
-
-		if (snd_ctl_pcm_info(handle, dev_info)) {
-			syslog(LOG_ERR, "Could not get info for device: %s",
-			       section->name);
-			continue;
-		}
-
-		create_iodev_for_device(alsa_card, info, card_name,
-					snd_pcm_info_get_name(dev_info),
-					snd_pcm_info_get_id(dev_info),
-					section->dev_idx, section->dir);
-	}
-
-	/* Setup jacks and controls for the devices. If a SectionDevice is
-	 * dependent on another SectionDevice, it'll be added as a node to
-	 * a existing ALSA iodev. */
-	DL_FOREACH (ucm_sections, section) {
-		DL_FOREACH (alsa_card->iodevs, node) {
-			if (node->direction != section->dir)
-				continue;
-			if (alsa_iodev_index(node->iodev) == section->dev_idx)
-				break;
-			if (alsa_iodev_index(node->iodev) ==
-			    section->dependent_dev_idx)
-				break;
-		}
-		if (node) {
-			rc = alsa_iodev_ucm_add_nodes_and_jacks(node->iodev,
-								section);
-			if (rc < 0)
-				goto cleanup;
-		}
-	}
-
-	DL_FOREACH (alsa_card->iodevs, node) {
-		alsa_iodev_ucm_complete_init(node->iodev);
-	}
-
-cleanup:
-	ucm_section_free_list(ucm_sections);
-cleanup_names:
-	mixer_name_free(main_volume_control_names);
-	return rc;
-}
-
-static void configure_echo_reference_dev(struct cras_alsa_card *alsa_card)
-{
-	struct iodev_list_node *dev_node, *echo_ref_node;
-	const char *echo_ref_name;
-
-	if (!alsa_card->ucm)
-		return;
-
-	DL_FOREACH (alsa_card->iodevs, dev_node) {
-		if (!dev_node->iodev->nodes)
-			continue;
-
-		echo_ref_name = ucm_get_echo_reference_dev_name_for_dev(
-			alsa_card->ucm, dev_node->iodev->nodes->name);
-		if (!echo_ref_name)
-			continue;
-		DL_FOREACH (alsa_card->iodevs, echo_ref_node) {
-			if (echo_ref_node->iodev->nodes == NULL)
-				continue;
-			if (!strcmp(echo_ref_name,
-				    echo_ref_node->iodev->nodes->name))
-				break;
-		}
-		if (echo_ref_node)
-			dev_node->iodev->echo_reference_dev =
-				echo_ref_node->iodev;
-		else
-			syslog(LOG_ERR,
-			       "Echo ref dev %s doesn't exist on card %s",
-			       echo_ref_name, alsa_card->name);
-		free((void *)echo_ref_name);
-	}
-}
-
-/*
- * Exported Interface.
- */
-
-struct cras_alsa_card *cras_alsa_card_create(
-	struct cras_alsa_card_info *info, const char *device_config_dir,
-	struct cras_device_blocklist *blocklist, const char *ucm_suffix)
-{
-	snd_ctl_t *handle = NULL;
-	int rc, n;
-	snd_ctl_card_info_t *card_info;
-	const char *card_name;
-	struct cras_alsa_card *alsa_card;
-
-	if (info->card_index >= MAX_ALSA_CARDS) {
-		syslog(LOG_ERR, "Invalid alsa card index %u", info->card_index);
-		return NULL;
-	}
-
-	snd_ctl_card_info_alloca(&card_info);
-
-	alsa_card = calloc(1, sizeof(*alsa_card));
-	if (alsa_card == NULL)
-		return NULL;
-	alsa_card->card_index = info->card_index;
-
-	snprintf(alsa_card->name, MAX_ALSA_CARD_NAME_LENGTH, "hw:%u",
-		 info->card_index);
-
-	rc = snd_ctl_open(&handle, alsa_card->name, 0);
-	if (rc < 0) {
-		syslog(LOG_ERR, "Fail opening control %s.", alsa_card->name);
-		goto error_bail;
-	}
-
-	rc = snd_ctl_card_info(handle, card_info);
-	if (rc < 0) {
-		syslog(LOG_ERR, "Error getting card info.");
-		goto error_bail;
-	}
-
-	card_name = snd_ctl_card_info_get_name(card_info);
-	if (card_name == NULL) {
-		syslog(LOG_ERR, "Error getting card name.");
-		goto error_bail;
-	}
-
-	if (info->card_type != ALSA_CARD_TYPE_INTERNAL ||
-	    cras_system_check_ignore_ucm_suffix(card_name))
-		ucm_suffix = NULL;
-
-	/* Read config file for this card if it exists. */
-	alsa_card->config =
-		cras_card_config_create(device_config_dir, card_name);
-	if (alsa_card->config == NULL)
-		syslog(LOG_DEBUG, "No config file for %s", alsa_card->name);
-
-	/* Create a use case manager if a configuration is available. */
-	if (ucm_suffix) {
-		char *ucm_name;
-		if (asprintf(&ucm_name, "%s.%s", card_name, ucm_suffix) == -1) {
-			syslog(LOG_ERR, "Error creating ucm name");
-			goto error_bail;
-		}
-		alsa_card->ucm = ucm_create(ucm_name);
-		syslog(LOG_INFO, "Card %s (%s) has UCM: %s", alsa_card->name,
-		       ucm_name, alsa_card->ucm ? "yes" : "no");
-		free(ucm_name);
-	} else {
-		alsa_card->ucm = ucm_create(card_name);
-		syslog(LOG_INFO, "Card %s (%s) has UCM: %s", alsa_card->name,
-		       card_name, alsa_card->ucm ? "yes" : "no");
-	}
-
-	if (info->card_type == ALSA_CARD_TYPE_INTERNAL && !alsa_card->ucm)
-		syslog(LOG_ERR, "No ucm config on internal card %s", card_name);
-
-	rc = snd_hctl_open(&alsa_card->hctl, alsa_card->name, SND_CTL_NONBLOCK);
-	if (rc < 0) {
-		syslog(LOG_DEBUG, "failed to get hctl for %s", alsa_card->name);
-		alsa_card->hctl = NULL;
-	} else {
-		rc = snd_hctl_nonblock(alsa_card->hctl, 1);
-		if (rc < 0) {
-			syslog(LOG_ERR, "failed to nonblock hctl for %s",
-			       alsa_card->name);
-			goto error_bail;
-		}
-
-		rc = snd_hctl_load(alsa_card->hctl);
-		if (rc < 0) {
-			syslog(LOG_ERR, "failed to load hctl for %s",
-			       alsa_card->name);
-			goto error_bail;
-		}
-	}
-
-	/* Create one mixer per card. */
-	alsa_card->mixer = cras_alsa_mixer_create(alsa_card->name);
-
-	if (alsa_card->mixer == NULL) {
-		syslog(LOG_ERR, "Fail opening mixer for %s.", alsa_card->name);
-		goto error_bail;
-	}
-
-	if (alsa_card->ucm && ucm_has_fully_specified_ucm_flag(alsa_card->ucm))
-		rc = add_controls_and_iodevs_with_ucm(info, alsa_card,
-						      card_name, handle);
-	else
-		rc = add_controls_and_iodevs_by_matching(
-			info, blocklist, alsa_card, card_name, handle);
-	if (rc)
-		goto error_bail;
-
-	configure_echo_reference_dev(alsa_card);
-
-	n = alsa_card->hctl ? snd_hctl_poll_descriptors_count(alsa_card->hctl) :
-			      0;
-	if (n != 0 && card_has_hctl_jack(alsa_card)) {
-		struct hctl_poll_fd *registered_fd;
-		struct pollfd *pollfds;
-		int i;
-
-		pollfds = malloc(n * sizeof(*pollfds));
-		if (pollfds == NULL) {
-			rc = -ENOMEM;
-			goto error_bail;
-		}
-
-		n = snd_hctl_poll_descriptors(alsa_card->hctl, pollfds, n);
-		for (i = 0; i < n; i++) {
-			registered_fd = calloc(1, sizeof(*registered_fd));
-			if (registered_fd == NULL) {
-				free(pollfds);
-				rc = -ENOMEM;
-				goto error_bail;
-			}
-			registered_fd->fd = pollfds[i].fd;
-			DL_APPEND(alsa_card->hctl_poll_fds, registered_fd);
-			rc = cras_system_add_select_fd(
-				registered_fd->fd, alsa_control_event_pending,
-				alsa_card, POLLIN);
-			if (rc < 0) {
-				DL_DELETE(alsa_card->hctl_poll_fds,
-					  registered_fd);
-				free(pollfds);
-				goto error_bail;
-			}
-		}
-		free(pollfds);
-	}
-
-	snd_ctl_close(handle);
-	return alsa_card;
-
-error_bail:
-	if (handle != NULL)
-		snd_ctl_close(handle);
-	cras_alsa_card_destroy(alsa_card);
-	return NULL;
-}
-
-void cras_alsa_card_destroy(struct cras_alsa_card *alsa_card)
-{
-	struct iodev_list_node *curr;
-	struct hctl_poll_fd *poll_fd;
-
-	if (alsa_card == NULL)
-		return;
-
-	DL_FOREACH (alsa_card->iodevs, curr) {
-		alsa_iodev_destroy(curr->iodev);
-		DL_DELETE(alsa_card->iodevs, curr);
-		free(curr);
-	}
-	DL_FOREACH (alsa_card->hctl_poll_fds, poll_fd) {
-		cras_system_rm_select_fd(poll_fd->fd);
-		DL_DELETE(alsa_card->hctl_poll_fds, poll_fd);
-		free(poll_fd);
-	}
-	if (alsa_card->hctl)
-		snd_hctl_close(alsa_card->hctl);
-	if (alsa_card->ucm)
-		ucm_destroy(alsa_card->ucm);
-	if (alsa_card->mixer)
-		cras_alsa_mixer_destroy(alsa_card->mixer);
-	if (alsa_card->config)
-		cras_card_config_destroy(alsa_card->config);
-	free(alsa_card);
-}
-
-size_t cras_alsa_card_get_index(const struct cras_alsa_card *alsa_card)
-{
-	assert(alsa_card);
-	return alsa_card->card_index;
-}
diff --git a/cras/src/server/cras_alsa_card.h b/cras/src/server/cras_alsa_card.h
deleted file mode 100644
index a63bf90..0000000
--- a/cras/src/server/cras_alsa_card.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef _CRAS_ALSA_CARD_H
-#define _CRAS_ALSA_CARD_H
-
-#include "cras_types.h"
-
-/* cras_alsa_card represents an alsa sound card.  It adds all the devices for
- * this card to the system when it is created, and removes them when it is
- * destroyed.  It will create an alsa_mixer object that can control the volume
- * and mute settings for the card.
- */
-
-struct cras_alsa_card;
-struct cras_device_blocklist;
-
-/* Creates a cras_alsa_card instance for the given alsa device.  Enumerates the
- * devices for the card and adds them to the system as possible playback or
- * capture endpoints.
- * Args:
- *    card_info - Contains the card index, type, and priority.
- *    device_config_dir - The directory of device configs which contains the
- *                        volume curves.
- *    blocklist - List of devices that should be ignored.
- *    ucm_suffix - The ucm config name is formed as <card-name>.<suffix>
- * Returns:
- *    A pointer to the newly created cras_alsa_card which must later be freed
- *    by calling cras_alsa_card_destroy or NULL on error.
- */
-struct cras_alsa_card *cras_alsa_card_create(
-	struct cras_alsa_card_info *info, const char *device_config_dir,
-	struct cras_device_blocklist *blocklist, const char *ucm_suffix);
-
-/* Destroys a cras_alsa_card that was returned from cras_alsa_card_create.
- * Args:
- *    alsa_card - The cras_alsa_card pointer returned from
- *        cras_alsa_card_create.
- */
-void cras_alsa_card_destroy(struct cras_alsa_card *alsa_card);
-
-/* Returns the alsa card index for the given card.
- * Args:
- *    alsa_card - The cras_alsa_card pointer returned from
- *        cras_alsa_card_create.
- */
-size_t cras_alsa_card_get_index(const struct cras_alsa_card *alsa_card);
-
-#endif /* _CRAS_ALSA_CARD_H */
diff --git a/cras/src/server/cras_alsa_helpers.c b/cras/src/server/cras_alsa_helpers.c
deleted file mode 100644
index 6cdc165..0000000
--- a/cras/src/server/cras_alsa_helpers.c
+++ /dev/null
@@ -1,799 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <alsa/asoundlib.h>
-#include <limits.h>
-#include <stdlib.h>
-#include <syslog.h>
-
-#include "cras_alsa_helpers.h"
-#include "cras_audio_format.h"
-#include "cras_util.h"
-
-/* Macro to convert between snd_pcm_chmap_position(defined in
- * alsa-lib since 1.0.27) and CRAS_CHANNEL, values of which are
- * of the same order but shifted by 3.
- */
-#define CH_TO_ALSA(ch) ((ch) + (3))
-#define CH_TO_CRAS(ch) ((ch) - (3))
-
-/* Assert the channel is defined in CRAS_CHANNELS. */
-#define ALSA_CH_VALID(ch) ((ch >= SND_CHMAP_FL) && (ch <= SND_CHMAP_FRC))
-
-/* Time difference between two consecutive underrun logs. */
-#define UNDERRUN_LOG_TIME_SECS 30
-
-/* Limit the number of channels supported for devices: b/158509536 */
-#define TEMP_CHANNEL_LIMIT 20
-
-/* Chances to give mmap_begin to work. */
-static const size_t MAX_MMAP_BEGIN_ATTEMPTS = 3;
-/* Time to sleep between resume attempts. */
-static const size_t ALSA_SUSPENDED_SLEEP_TIME_US = 250000;
-
-/* What rates should we check for on this dev?
- * Listed in order of preference. 0 terminalted. */
-static const size_t test_sample_rates[] = {
-	44100, 48000, 32000, 96000, 22050, 16000, 8000, 4000, 192000, 0,
-};
-
-/* What channel counts shoud be checked on this dev?
- * Listed in order of preference. 0 terminalted. */
-static const size_t test_channel_counts[] = { 10, 6, 4, 2, 1, 8, 0 };
-
-static const snd_pcm_format_t test_formats[] = {
-	SND_PCM_FORMAT_S16_LE, SND_PCM_FORMAT_S24_LE, SND_PCM_FORMAT_S32_LE,
-	SND_PCM_FORMAT_S24_3LE, (snd_pcm_format_t)0
-};
-
-/* Looks up the list of channel map for the one can exactly matches
- * the layout specified in fmt.
- */
-static snd_pcm_chmap_query_t *
-cras_chmap_caps_match(snd_pcm_chmap_query_t **chmaps,
-		      struct cras_audio_format *fmt)
-{
-	size_t ch, i;
-	int idx, matches;
-	snd_pcm_chmap_query_t **chmap;
-
-	/* Search for channel map that already matches the order */
-	for (chmap = chmaps; *chmap; chmap++) {
-		if ((*chmap)->map.channels != fmt->num_channels)
-			continue;
-
-		matches = 1;
-		for (ch = 0; ch < CRAS_CH_MAX; ch++) {
-			idx = fmt->channel_layout[ch];
-			if (idx == -1)
-				continue;
-			if ((unsigned)idx >= (*chmap)->map.channels)
-				continue;
-			if ((*chmap)->map.pos[idx] != CH_TO_ALSA(ch)) {
-				matches = 0;
-				break;
-			}
-		}
-		if (matches)
-			return *chmap;
-	}
-
-	/* Search for channel map that can arbitrarily swap order */
-	for (chmap = chmaps; *chmap; chmap++) {
-		if ((*chmap)->type == SND_CHMAP_TYPE_FIXED ||
-		    (*chmap)->map.channels != fmt->num_channels)
-			continue;
-
-		matches = 1;
-		for (ch = 0; ch < CRAS_CH_MAX; ch++) {
-			idx = fmt->channel_layout[ch];
-			if (idx == -1)
-				continue;
-			int found = 0;
-			for (i = 0; i < fmt->num_channels; i++) {
-				if ((*chmap)->map.pos[i] == CH_TO_ALSA(ch)) {
-					found = 1;
-					break;
-				}
-			}
-			if (found == 0) {
-				matches = 0;
-				break;
-			}
-		}
-		if (matches && (*chmap)->type == SND_CHMAP_TYPE_VAR)
-			return *chmap;
-
-		/* Check if channel map is a match by arbitrarily swap
-		 * pair order */
-		matches = 1;
-		for (i = 0; i < fmt->num_channels; i += 2) {
-			ch = CH_TO_CRAS((*chmap)->map.pos[i]);
-			if (fmt->channel_layout[ch] & 0x01) {
-				matches = 0;
-				break;
-			}
-
-			if (fmt->channel_layout[ch] + 1 !=
-			    fmt->channel_layout[CH_TO_CRAS(
-				    (*chmap)->map.pos[i + 1])]) {
-				matches = 0;
-				break;
-			}
-		}
-		if (matches)
-			return *chmap;
-	}
-
-	return NULL;
-}
-
-/* When the exact match does not exist, select the best valid
- * channel map which can be supported by means of channel conversion
- * matrix.
- */
-static snd_pcm_chmap_query_t *
-cras_chmap_caps_conv_matrix(snd_pcm_chmap_query_t **chmaps,
-			    struct cras_audio_format *fmt)
-{
-	float **conv_mtx;
-	size_t i;
-	snd_pcm_chmap_query_t **chmap;
-	struct cras_audio_format *conv_fmt;
-
-	conv_fmt = cras_audio_format_create(fmt->format, fmt->frame_rate,
-					    fmt->num_channels);
-
-	for (chmap = chmaps; *chmap; chmap++) {
-		if ((*chmap)->map.channels != fmt->num_channels)
-			continue;
-		for (i = 0; i < CRAS_CH_MAX; i++)
-			conv_fmt->channel_layout[i] = -1;
-		for (i = 0; i < conv_fmt->num_channels; i++) {
-			if (!ALSA_CH_VALID((*chmap)->map.pos[i]))
-				continue;
-			conv_fmt->channel_layout[CH_TO_CRAS(
-				(*chmap)->map.pos[i])] = i;
-		}
-
-		/* Examine channel map by test creating a conversion matrix
-		 * for each candidate. Once a non-null matrix is created,
-		 * that channel map is considered supported and select it as
-		 * the best match one.
-		 */
-		conv_mtx = cras_channel_conv_matrix_create(fmt, conv_fmt);
-		if (conv_mtx) {
-			cras_channel_conv_matrix_destroy(
-				conv_mtx, conv_fmt->num_channels);
-			cras_audio_format_destroy(conv_fmt);
-			return *chmap;
-		}
-	}
-
-	cras_audio_format_destroy(conv_fmt);
-	return NULL;
-}
-
-/* Finds the best channel map for given format and list of channel
- * map capability.
- */
-static snd_pcm_chmap_query_t *
-cras_chmap_caps_best(snd_pcm_t *handle, snd_pcm_chmap_query_t **chmaps,
-		     struct cras_audio_format *fmt)
-{
-	snd_pcm_chmap_query_t **chmap;
-	snd_pcm_chmap_query_t *match;
-
-	match = cras_chmap_caps_match(chmaps, fmt);
-	if (match)
-		return match;
-
-	match = cras_chmap_caps_conv_matrix(chmaps, fmt);
-	if (match)
-		return match;
-
-	/* For capture stream, choose the first chmap matching channel
-	 * count. Channel positions reported in this chmap will be used
-	 * to fill correspond channels into client stream.
-	 */
-	if (snd_pcm_stream(handle) == SND_PCM_STREAM_CAPTURE)
-		for (chmap = chmaps; *chmap; chmap++)
-			if ((*chmap)->map.channels == fmt->num_channels)
-				return *chmap;
-	return NULL;
-}
-
-int cras_alsa_pcm_open(snd_pcm_t **handle, const char *dev,
-		       snd_pcm_stream_t stream)
-{
-	int rc;
-	int retries = 3;
-	static const unsigned int OPEN_RETRY_DELAY_US = 100000;
-
-retry_open:
-	rc = snd_pcm_open(handle, dev, stream,
-			  SND_PCM_NONBLOCK | SND_PCM_NO_AUTO_RESAMPLE |
-				  SND_PCM_NO_AUTO_CHANNELS |
-				  SND_PCM_NO_AUTO_FORMAT);
-	if (rc == -EBUSY && --retries) {
-		usleep(OPEN_RETRY_DELAY_US);
-		goto retry_open;
-	}
-
-	return rc;
-}
-
-int cras_alsa_pcm_close(snd_pcm_t *handle)
-{
-	return snd_pcm_close(handle);
-}
-
-int cras_alsa_pcm_start(snd_pcm_t *handle)
-{
-	return snd_pcm_start(handle);
-}
-
-int cras_alsa_pcm_drain(snd_pcm_t *handle)
-{
-	return snd_pcm_drain(handle);
-}
-
-int cras_alsa_resume_appl_ptr(snd_pcm_t *handle, snd_pcm_uframes_t ahead)
-{
-	int rc;
-	snd_pcm_uframes_t period_frames, buffer_frames;
-	snd_pcm_sframes_t to_move, avail_frames;
-	rc = snd_pcm_avail(handle);
-	if (rc == -EPIPE || rc == -ESTRPIPE) {
-		cras_alsa_attempt_resume(handle);
-		avail_frames = 0;
-	} else if (rc < 0) {
-		syslog(LOG_ERR, "Fail to get avail frames: %s",
-		       snd_strerror(rc));
-		return rc;
-	} else {
-		avail_frames = rc;
-	}
-
-	rc = snd_pcm_get_params(handle, &buffer_frames, &period_frames);
-	if (rc < 0) {
-		syslog(LOG_ERR, "Fail to get buffer size: %s",
-		       snd_strerror(rc));
-		return rc;
-	}
-
-	to_move = avail_frames - buffer_frames + ahead;
-	if (to_move > 0) {
-		rc = snd_pcm_forward(handle, to_move);
-	} else if (to_move < 0) {
-		rc = snd_pcm_rewind(handle, -to_move);
-	} else {
-		return 0;
-	}
-
-	if (rc < 0) {
-		syslog(LOG_ERR, "Fail to resume appl_ptr: %s",
-		       snd_strerror(rc));
-		return rc;
-	}
-	return 0;
-}
-
-int cras_alsa_set_channel_map(snd_pcm_t *handle, struct cras_audio_format *fmt)
-{
-	size_t i, ch;
-	snd_pcm_chmap_query_t **chmaps;
-	snd_pcm_chmap_query_t *match;
-
-	if (fmt->num_channels <= 2)
-		return 0;
-
-	chmaps = snd_pcm_query_chmaps(handle);
-	if (chmaps == NULL) {
-		syslog(LOG_WARNING, "No chmap queried! Skip chmap set");
-		goto done;
-	}
-
-	match = cras_chmap_caps_best(handle, chmaps, fmt);
-	if (!match) {
-		syslog(LOG_ERR, "Unable to find the best channel map");
-		goto done;
-	}
-
-	/* A channel map could match the layout after channels
-	 * pair/arbitrary swapped. Modified the channel positions
-	 * before set to HW.
-	 */
-	for (i = 0; i < fmt->num_channels; i++) {
-		for (ch = 0; ch < CRAS_CH_MAX; ch++)
-			if (fmt->channel_layout[ch] == (int)i)
-				break;
-		if (ch != CRAS_CH_MAX)
-			match->map.pos[i] = CH_TO_ALSA(ch);
-	}
-	if (snd_pcm_set_chmap(handle, &match->map) != 0)
-		syslog(LOG_ERR, "Unable to set channel map");
-
-done:
-	snd_pcm_free_chmaps(chmaps);
-	return 0;
-}
-
-int cras_alsa_get_channel_map(snd_pcm_t *handle, struct cras_audio_format *fmt)
-{
-	snd_pcm_chmap_query_t **chmaps;
-	snd_pcm_chmap_query_t *match;
-	int rc = 0;
-	size_t i;
-
-	chmaps = snd_pcm_query_chmaps(handle);
-	if (chmaps == NULL) {
-		rc = -EINVAL;
-		goto done;
-	}
-
-	match = cras_chmap_caps_best(handle, chmaps, fmt);
-	if (!match) {
-		syslog(LOG_ERR, "Unable to find the best channel map");
-		rc = -1;
-		goto done;
-	}
-
-	/* Fill back the selected channel map so channel converter can
-	 * handle it. */
-	for (i = 0; i < CRAS_CH_MAX; i++)
-		fmt->channel_layout[i] = -1;
-	for (i = 0; i < fmt->num_channels; i++) {
-		if (!ALSA_CH_VALID(match->map.pos[i]))
-			continue;
-		fmt->channel_layout[CH_TO_CRAS(match->map.pos[i])] = i;
-	}
-
-	/* Handle the special channel map {SND_CHMAP_MONO} */
-	if (match->map.channels == 1 && match->map.pos[0] == SND_CHMAP_MONO)
-		fmt->channel_layout[CRAS_CH_FC] = 0;
-
-done:
-	snd_pcm_free_chmaps(chmaps);
-	return rc;
-}
-
-int cras_alsa_fill_properties(snd_pcm_t *handle, size_t **rates,
-			      size_t **channel_counts,
-			      snd_pcm_format_t **formats)
-{
-	int rc;
-	size_t i, num_found;
-	snd_pcm_hw_params_t *params;
-
-	snd_pcm_hw_params_alloca(&params);
-
-	rc = snd_pcm_hw_params_any(handle, params);
-	if (rc < 0) {
-		syslog(LOG_ERR, "snd_pcm_hw_params_any: %s", snd_strerror(rc));
-		return rc;
-	}
-
-	*rates = (size_t *)malloc(sizeof(test_sample_rates));
-	if (*rates == NULL)
-		return -ENOMEM;
-	*channel_counts = (size_t *)malloc(sizeof(test_channel_counts));
-	if (*channel_counts == NULL) {
-		free(*rates);
-		return -ENOMEM;
-	}
-	*formats = (snd_pcm_format_t *)malloc(sizeof(test_formats));
-	if (*formats == NULL) {
-		free(*channel_counts);
-		free(*rates);
-		return -ENOMEM;
-	}
-
-	num_found = 0;
-	for (i = 0; test_sample_rates[i] != 0; i++) {
-		rc = snd_pcm_hw_params_test_rate(handle, params,
-						 test_sample_rates[i], 0);
-		if (rc == 0)
-			(*rates)[num_found++] = test_sample_rates[i];
-	}
-	(*rates)[num_found] = 0;
-	if (num_found == 0) {
-		syslog(LOG_WARNING, "No valid sample rates.");
-		return -EINVAL;
-	}
-
-	num_found = 0;
-	for (i = 0; test_channel_counts[i] != 0; i++) {
-		rc = snd_pcm_hw_params_test_channels(handle, params,
-						     test_channel_counts[i]);
-		if (rc == 0)
-			(*channel_counts)[num_found++] = test_channel_counts[i];
-	}
-	(*channel_counts)[num_found] = 0;
-	if (num_found == 0) {
-		// Pull the max channel count and use that.
-		unsigned int max_channels = 0;
-		rc = snd_pcm_hw_params_get_channels_max(params, &max_channels);
-		if (rc < 0) {
-			syslog(LOG_WARNING, "No valid channel counts found.");
-			return -EINVAL;
-		} else if (max_channels > TEMP_CHANNEL_LIMIT) {
-			syslog(LOG_WARNING, "Can't support so many channels.");
-			return -EINVAL;
-		} else {
-			(*channel_counts)[0] = (size_t)max_channels;
-			(*channel_counts)[1] = 0;
-		}
-	}
-
-	num_found = 0;
-	for (i = 0; test_formats[i] != 0; i++) {
-		rc = snd_pcm_hw_params_test_format(handle, params,
-						   test_formats[i]);
-		if (rc == 0)
-			(*formats)[num_found++] = test_formats[i];
-	}
-	(*formats)[num_found] = (snd_pcm_format_t)0;
-	if (num_found == 0) {
-		syslog(LOG_WARNING, "No valid sample formats.");
-		return -EINVAL;
-	}
-
-	return 0;
-}
-
-int cras_alsa_set_hwparams(snd_pcm_t *handle, struct cras_audio_format *format,
-			   snd_pcm_uframes_t *buffer_frames, int period_wakeup,
-			   unsigned int dma_period_time)
-{
-	unsigned int rate, ret_rate;
-	int err;
-	snd_pcm_hw_params_t *hwparams;
-
-	rate = format->frame_rate;
-	snd_pcm_hw_params_alloca(&hwparams);
-
-	err = snd_pcm_hw_params_any(handle, hwparams);
-	if (err < 0) {
-		syslog(LOG_ERR, "hw_params_any failed %s\n", snd_strerror(err));
-		return err;
-	}
-	/* Disable hardware resampling. */
-	err = snd_pcm_hw_params_set_rate_resample(handle, hwparams, 0);
-	if (err < 0) {
-		syslog(LOG_ERR, "Disabling resampling %s\n", snd_strerror(err));
-		return err;
-	}
-	/* Always interleaved. */
-	err = snd_pcm_hw_params_set_access(handle, hwparams,
-					   SND_PCM_ACCESS_MMAP_INTERLEAVED);
-	if (err < 0) {
-		syslog(LOG_ERR, "Setting interleaved %s\n", snd_strerror(err));
-		return err;
-	}
-	/* If period_wakeup flag is not set, try to disable ALSA wakeups,
-	 * we'll keep a timer. */
-	if (!period_wakeup &&
-	    snd_pcm_hw_params_can_disable_period_wakeup(hwparams)) {
-		err = snd_pcm_hw_params_set_period_wakeup(handle, hwparams, 0);
-		if (err < 0)
-			syslog(LOG_WARNING, "disabling wakeups %s\n",
-			       snd_strerror(err));
-	}
-	/* Setup the period time so that the hardware pulls the right amount
-	 * of data at the right time. */
-	if (dma_period_time) {
-		int dir = 0;
-		unsigned int original = dma_period_time;
-
-		err = snd_pcm_hw_params_set_period_time_near(
-			handle, hwparams, &dma_period_time, &dir);
-		if (err < 0) {
-			syslog(LOG_ERR, "could not set period time: %s",
-			       snd_strerror(err));
-			return err;
-		} else if (original != dma_period_time) {
-			syslog(LOG_DEBUG, "period time set to: %u",
-			       dma_period_time);
-		}
-	}
-	/* Set the sample format. */
-	err = snd_pcm_hw_params_set_format(handle, hwparams, format->format);
-	if (err < 0) {
-		syslog(LOG_ERR, "set format %s\n", snd_strerror(err));
-		return err;
-	}
-	/* Set the stream rate. */
-	ret_rate = rate;
-	err = snd_pcm_hw_params_set_rate_near(handle, hwparams, &ret_rate, 0);
-	if (err < 0) {
-		syslog(LOG_ERR, "set_rate_near %iHz %s\n", rate,
-		       snd_strerror(err));
-		return err;
-	}
-	if (ret_rate != rate) {
-		syslog(LOG_ERR, "tried for %iHz, settled for %iHz)\n", rate,
-		       ret_rate);
-		return -EINVAL;
-	}
-	/* Set the count of channels. */
-	err = snd_pcm_hw_params_set_channels(handle, hwparams,
-					     format->num_channels);
-	if (err < 0) {
-		syslog(LOG_ERR, "set_channels %s\n", snd_strerror(err));
-		return err;
-	}
-
-	/* Make sure buffer frames is even, or snd_pcm_hw_params will
-	 * return invalid argument error. */
-	err = snd_pcm_hw_params_get_buffer_size_max(hwparams, buffer_frames);
-	if (err < 0)
-		syslog(LOG_WARNING, "get buffer max %s\n", snd_strerror(err));
-
-	*buffer_frames &= ~0x01;
-	err = snd_pcm_hw_params_set_buffer_size_max(handle, hwparams,
-						    buffer_frames);
-	if (err < 0) {
-		syslog(LOG_ERR, "set_buffer_size_max %s", snd_strerror(err));
-		return err;
-	}
-
-	syslog(LOG_DEBUG, "buffer size set to %u\n",
-	       (unsigned int)*buffer_frames);
-
-	/* Finally, write the parameters to the device. */
-	err = snd_pcm_hw_params(handle, hwparams);
-	if (err < 0) {
-		syslog(LOG_ERR,
-		       "hw_params: %s: rate: %u, ret_rate: %u, "
-		       "channel: %zu, format: %u\n",
-		       snd_strerror(err), rate, ret_rate, format->num_channels,
-		       format->format);
-		return err;
-	}
-	return 0;
-}
-
-int cras_alsa_set_swparams(snd_pcm_t *handle)
-{
-	int err;
-	snd_pcm_sw_params_t *swparams;
-	snd_pcm_uframes_t boundary;
-
-	snd_pcm_sw_params_alloca(&swparams);
-
-	err = snd_pcm_sw_params_current(handle, swparams);
-	if (err < 0) {
-		syslog(LOG_ERR, "sw_params_current: %s\n", snd_strerror(err));
-		return err;
-	}
-	err = snd_pcm_sw_params_get_boundary(swparams, &boundary);
-	if (err < 0) {
-		syslog(LOG_ERR, "get_boundary: %s\n", snd_strerror(err));
-		return err;
-	}
-	err = snd_pcm_sw_params_set_stop_threshold(handle, swparams, boundary);
-	if (err < 0) {
-		syslog(LOG_ERR, "set_stop_threshold: %s\n", snd_strerror(err));
-		return err;
-	}
-	/* Don't auto start. */
-	err = snd_pcm_sw_params_set_start_threshold(handle, swparams, LONG_MAX);
-	if (err < 0) {
-		syslog(LOG_ERR, "set_stop_threshold: %s\n", snd_strerror(err));
-		return err;
-	}
-
-	/* Disable period events. */
-	err = snd_pcm_sw_params_set_period_event(handle, swparams, 0);
-	if (err < 0) {
-		syslog(LOG_ERR, "set_period_event: %s\n", snd_strerror(err));
-		return err;
-	}
-
-	err = snd_pcm_sw_params(handle, swparams);
-
-	if (err < 0) {
-		syslog(LOG_ERR, "sw_params: %s\n", snd_strerror(err));
-		return err;
-	}
-	return 0;
-}
-
-int cras_alsa_get_avail_frames(snd_pcm_t *handle, snd_pcm_uframes_t buf_size,
-			       snd_pcm_uframes_t severe_underrun_frames,
-			       const char *dev_name, snd_pcm_uframes_t *avail,
-			       struct timespec *tstamp)
-{
-	snd_pcm_sframes_t frames;
-	int rc = 0;
-	static struct timespec tstamp_last_underrun_log = { .tv_sec = 0,
-							    .tv_nsec = 0 };
-
-	/* Use snd_pcm_avail still to ensure that the hardware pointer is
-	 * up to date. Otherwise, we could use the deprecated snd_pcm_hwsync().
-	 * IMO this is a deficiency in the ALSA API.
-	 */
-	frames = snd_pcm_avail(handle);
-	if (frames >= 0)
-		rc = snd_pcm_htimestamp(handle, avail, tstamp);
-	else
-		rc = frames;
-	if (rc == -EPIPE || rc == -ESTRPIPE) {
-		cras_alsa_attempt_resume(handle);
-		rc = 0;
-		goto error;
-	} else if (rc < 0) {
-		syslog(LOG_ERR, "pcm_avail error %s, %s\n", dev_name,
-		       snd_strerror(rc));
-		goto error;
-	} else if (frames > (snd_pcm_sframes_t)buf_size) {
-		struct timespec tstamp_now;
-		clock_gettime(CLOCK_MONOTONIC_RAW, &tstamp_now);
-		/* Limit the log rate. */
-		if ((tstamp_now.tv_sec - tstamp_last_underrun_log.tv_sec) >
-		    UNDERRUN_LOG_TIME_SECS) {
-			syslog(LOG_ERR,
-			       "pcm_avail returned frames larger than buf_size: "
-			       "%s: %ld > %lu\n",
-			       dev_name, frames, buf_size);
-			tstamp_last_underrun_log.tv_sec = tstamp_now.tv_sec;
-			tstamp_last_underrun_log.tv_nsec = tstamp_now.tv_nsec;
-		}
-		if ((frames - (snd_pcm_sframes_t)buf_size) >
-		    (snd_pcm_sframes_t)severe_underrun_frames) {
-			rc = -EPIPE;
-			goto error;
-		} else {
-			frames = buf_size;
-		}
-	}
-	*avail = frames;
-	return 0;
-
-error:
-	*avail = 0;
-	tstamp->tv_sec = 0;
-	tstamp->tv_nsec = 0;
-	return rc;
-}
-
-int cras_alsa_get_delay_frames(snd_pcm_t *handle, snd_pcm_uframes_t buf_size,
-			       snd_pcm_sframes_t *delay)
-{
-	int rc;
-
-	rc = snd_pcm_delay(handle, delay);
-	if (rc < 0)
-		return rc;
-	if (*delay > (snd_pcm_sframes_t)buf_size)
-		*delay = buf_size;
-	if (*delay < 0)
-		*delay = 0;
-	return 0;
-}
-
-/*
- * Attempts to resume a PCM.
- * Note that this path does not get executed for default playback/capture
- * stream. Default playback/capture stream are removed from the device
- * upon suspend, and re-attached to the device after resume.
- * The only stream that lives across suspend resume is hotword stream.
- */
-int cras_alsa_attempt_resume(snd_pcm_t *handle)
-{
-	int rc;
-
-	syslog(LOG_INFO, "System suspended.");
-	while ((rc = snd_pcm_resume(handle)) == -EAGAIN)
-		usleep(ALSA_SUSPENDED_SLEEP_TIME_US);
-	if (rc < 0) {
-		/*
-		 * Some devices do not support snd_pcm_resume, that is
-		 * acceptable.
-		 */
-		syslog(LOG_INFO, "System suspended, failed to resume %s.",
-		       snd_strerror(rc));
-		rc = snd_pcm_prepare(handle);
-		if (rc < 0) {
-			syslog(LOG_ERR, "Suspended, failed to prepare: %s.",
-			       snd_strerror(rc));
-		}
-		/*
-		 * CRAS does not use auto-start (start_threshold = 0), so start
-		 * PCM after it is prepared. This is only for hotword stream.
-		 */
-		rc = snd_pcm_start(handle);
-		if (rc < 0) {
-			syslog(LOG_ERR, "Suspended, failed to start: %s.",
-			       snd_strerror(rc));
-		}
-	}
-	return rc;
-}
-
-int cras_alsa_mmap_get_whole_buffer(snd_pcm_t *handle, uint8_t **dst)
-{
-	snd_pcm_uframes_t offset;
-	/* The purpose of calling cras_alsa_mmap_begin is to get the base
-	 * address of the buffer. The requested and retrieved frames are not
-	 * meaningful here.
-	 * However, we need to set a non-zero requested frames to get a
-	 * non-zero retrieved frames. This is to avoid the error checking in
-	 * snd_pcm_mmap_begin, where it judges retrieved frames being 0 as a
-	 * failure.
-	 */
-	snd_pcm_uframes_t frames = 1;
-
-	return cras_alsa_mmap_begin(handle, 0, dst, &offset, &frames);
-}
-
-int cras_alsa_mmap_begin(snd_pcm_t *handle, unsigned int format_bytes,
-			 uint8_t **dst, snd_pcm_uframes_t *offset,
-			 snd_pcm_uframes_t *frames)
-{
-	int rc;
-	unsigned int attempts = 0;
-	const snd_pcm_channel_area_t *my_areas;
-
-	while (attempts++ < MAX_MMAP_BEGIN_ATTEMPTS) {
-		rc = snd_pcm_mmap_begin(handle, &my_areas, offset, frames);
-		if (rc == -ESTRPIPE) {
-			/* First handle suspend/resume. */
-			rc = cras_alsa_attempt_resume(handle);
-			if (rc < 0)
-				return rc;
-			continue; /* Recovered from suspend, try again. */
-		} else if (rc < 0) {
-			/* If we can recover, continue and try again. */
-			if (snd_pcm_recover(handle, rc, 0) == 0)
-				continue;
-			syslog(LOG_INFO, "recover failed begin: %s\n",
-			       snd_strerror(rc));
-			return rc;
-		}
-		/* Available frames could be zero right after input pcm handle
-		 * resumed. As for output pcm handle, some error has occurred
-		 * when mmap_begin return zero frames, return -EIO for that
-		 * case.
-		 */
-		if (snd_pcm_stream(handle) == SND_PCM_STREAM_PLAYBACK &&
-		    *frames == 0) {
-			syslog(LOG_INFO, "mmap_begin set frames to 0.");
-			return -EIO;
-		}
-		*dst = (uint8_t *)my_areas[0].addr + (*offset) * format_bytes;
-		return 0;
-	}
-	return -EIO;
-}
-
-int cras_alsa_mmap_commit(snd_pcm_t *handle, snd_pcm_uframes_t offset,
-			  snd_pcm_uframes_t frames)
-{
-	int rc;
-	snd_pcm_sframes_t res;
-
-	res = snd_pcm_mmap_commit(handle, offset, frames);
-	if (res != (snd_pcm_sframes_t)frames) {
-		res = res >= 0 ? (int)-EPIPE : res;
-		if (res == -ESTRPIPE) {
-			/* First handle suspend/resume. */
-			rc = cras_alsa_attempt_resume(handle);
-			if (rc < 0)
-				return rc;
-		} else {
-			/* If we can recover, continue and try again. */
-			rc = snd_pcm_recover(handle, res, 0);
-			if (rc < 0) {
-				syslog(LOG_ERR,
-				       "mmap_commit: pcm_recover failed: %s\n",
-				       snd_strerror(rc));
-				return rc;
-			}
-		}
-	}
-	return 0;
-}
diff --git a/cras/src/server/cras_alsa_helpers.h b/cras/src/server/cras_alsa_helpers.h
deleted file mode 100644
index 01a42ae..0000000
--- a/cras/src/server/cras_alsa_helpers.h
+++ /dev/null
@@ -1,227 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-/*
- * Alsa Helpers - Keeps the interface to alsa localized to this file.
- */
-
-#ifndef _CRAS_ALSA_HELPERS_H
-#define _CRAS_ALSA_HELPERS_H
-
-#include <alsa/asoundlib.h>
-#include <stdint.h>
-#include <stdlib.h>
-
-struct cras_audio_format;
-
-/* Sets the channel layout from given format to the pcm handle.
- * Args:
- *    handle - Pointer to the opened pcm to set channel map to.
- *    fmt - The format containing the channel layout info.
- * Returns:
- *    0 if a matched channel map is set to HW, -1 otherwise.
- */
-int cras_alsa_set_channel_map(snd_pcm_t *handle, struct cras_audio_format *fmt);
-
-/*  Gets the supported channel mapping of the pcm handle which matches
- *  the channel layout in the format.
- *  Args:
- *     handle - Pointer to the opened pcm to get channel map info.
- *     fmt - The format to fill channel layout into.
- *  Returns:
- *     0 if an exactly matched channel map is found, -1 otherwise.
- */
-int cras_alsa_get_channel_map(snd_pcm_t *handle, struct cras_audio_format *fmt);
-
-/* Opens an alsa device, thin wrapper to snd_pcm_open.
- * Args:
- *    handle - Filled with a pointer to the opened pcm.
- *    dev - Path to the alsa device to test.
- *    stream - Alsa stream type, input or output.
- * Returns:
- *    See docs for snd_pcm_open.
- */
-int cras_alsa_pcm_open(snd_pcm_t **handle, const char *dev,
-		       snd_pcm_stream_t stream);
-
-/* Closes an alsa device, thin wrapper to snd_pcm_close.
- * Args:
- *    handle - Filled with a pointer to the opened pcm.
- * Returns:
- *    See docs for snd_pcm_close.
- */
-int cras_alsa_pcm_close(snd_pcm_t *handle);
-
-/* Starts an alsa device, thin wrapper to snd_pcm_start.
- * Args:
- *    handle - Filled with a pointer to the opened pcm.
- * Returns:
- *    See docs for snd_pcm_start.
- */
-int cras_alsa_pcm_start(snd_pcm_t *handle);
-
-/* Drains an alsa device, thin wrapper to snd_pcm_drain.
- * Args:
- *    handle - Filled with a pointer to the opened pcm.
- * Returns:
- *    See docs for snd_pcm_drain.
- */
-int cras_alsa_pcm_drain(snd_pcm_t *handle);
-
-/* Forward/rewind appl_ptr so it becomes ahead of hw_ptr by fuzz samples.
- * After moving appl_ptr, device can play the new samples as quick as possible.
- *    avail = buffer_frames - appl_ptr + hw_ptr
- * => hw_ptr - appl_ptr = avail - buffer_frames.
- * The difference between hw_ptr and app_ptr can be inferred from snd_pcm_avail.
- * So the amount of frames to forward appl_ptr is
- * avail - buffer_frames + fuzz.
- * When hw_ptr is wrapped around boundary, this value may be negative. Use
- * snd_pcm_rewind to move appl_ptr backward.
- *
- * Case 1: avail - buffer_frames + fuzz > 0
- *
- * -------|----------|-----------------------------------
- *      app_ptr     hw_ptr
- *        |------------->| forward target
- *
- * Case 2: avail - buffer_frames + fuzz < 0
- *
- * -------|----------|-----------------------------------
- *      hw_ptr      app_ptr
- *           |<------| rewind target
- *
- * Args:
- *    handle - Filled with a pointer to the opened pcm.
- *    ahead - Number of frames appl_ptr should be ahead of hw_ptr.
- * Returns:
- *    0 on success. A negative error code on failure.
- */
-int cras_alsa_resume_appl_ptr(snd_pcm_t *handle, snd_pcm_uframes_t ahead);
-
-/* Probes properties of the alsa device.
- * Args:
- *    handle - The open PCM to configure.
- *    rates - Pointer that will be set to the arrary of valid samples rates.
- *            Must be freed by the caller.
- *    channel_counts - Pointer that will be set to the array of valid channel
- *                     counts.  Must be freed by the caller.
- *    formats - Pointer that will be set to the arrary of valid PCM formats.
- *              Must be freed by the caller.
- * Returns:
- *   0 on success.  On failure an error code from alsa or -ENOMEM.
- */
-int cras_alsa_fill_properties(snd_pcm_t *handle, size_t **rates,
-			      size_t **channel_counts,
-			      snd_pcm_format_t **formats);
-
-/* Sets up the hwparams to alsa.
- * Args:
- *    handle - The open PCM to configure.
- *    format - The audio format desired for playback/capture.
- *    buffer_frames - Number of frames in the ALSA buffer.
- *    period_wakeup - Flag to determine if period_wakeup is required
- *                      0 - disable, 1 - enable
- *    dma_period_time - If non-zero, set the dma period time to this value
- *                      (in microseconds).
- * Returns:
- *    0 on success, negative error on failure.
- */
-int cras_alsa_set_hwparams(snd_pcm_t *handle, struct cras_audio_format *format,
-			   snd_pcm_uframes_t *buffer_frames, int period_wakeup,
-			   unsigned int dma_period_time);
-
-/* Sets up the swparams to alsa.
- * Args:
- *    handle - The open PCM to configure.
- * Returns:
- *    0 on success, negative error on failure.
- */
-int cras_alsa_set_swparams(snd_pcm_t *handle);
-
-/* Get the number of used frames in the alsa buffer.
- *
- * When underrun is not severe, this function masks the underrun situation
- * and set avail as 0. When underrun is severe, returns -EPIPE so caller
- * can handle it.
- * Args:
- *    handle[in] - The open PCM to configure.
- *    buf_size[in] - Number of frames in the ALSA buffer.
- *    severe_underrun_frames[in] - Number of frames as the threshold for severe
- *                                 underrun.
- *    dev_name[in] - Device name for logging.
- *    avail[out] - Filled with the number of frames available in the buffer.
- *    tstamp[out] - Filled with the hardware timestamp for the available frames.
- *                  This value is {0, 0} when the device hasn't actually started
- *                  reading or writing frames.
- * Returns:
- *    0 on success, negative error on failure. -EPIPE if severe underrun
- *    happens.
- */
-int cras_alsa_get_avail_frames(snd_pcm_t *handle, snd_pcm_uframes_t buf_size,
-			       snd_pcm_uframes_t severe_underrun_frames,
-			       const char *dev_name, snd_pcm_uframes_t *avail,
-			       struct timespec *tstamp);
-
-/* Get the current alsa delay, make sure it's no bigger than the buffer size.
- * Args:
- *    handle - The open PCM to configure.
- *    buf_size - Number of frames in the ALSA buffer.
- *    delay - Filled with the number of delay frames.
- * Returns:
- *    0 on success, negative error on failure.
- */
-int cras_alsa_get_delay_frames(snd_pcm_t *handle, snd_pcm_uframes_t buf_size,
-			       snd_pcm_sframes_t *delay);
-
-/* Wrapper for snd_pcm_mmap_begin where only buffer is concerned.
- * Offset and frames from cras_alsa_mmap_begin are neglected.
- * Args:
- *    handle - The open PCM to configure.
- *    dst - Pointer set to the area for reading/writing the audio.
- * Returns:
- *    zero on success, negative error code for fatal errors.
- */
-int cras_alsa_mmap_get_whole_buffer(snd_pcm_t *handle, uint8_t **dst);
-
-/* Wrapper for snd_pcm_mmap_begin
- * Args:
- *    handle - The open PCM to configure.
- *    format_bytes - Number of bytes in a single frame.
- *    dst - Pointer set to the area for reading/writing the audio.
- *    offset - Filled with the offset to pass back to commit.
- *    frames - Passed with the max number of frames to request. Filled with the
- *        max number to use.
- * Returns:
- *    zero on success, negative error code for fatal
- *    errors.
- */
-int cras_alsa_mmap_begin(snd_pcm_t *handle, unsigned int format_bytes,
-			 uint8_t **dst, snd_pcm_uframes_t *offset,
-			 snd_pcm_uframes_t *frames);
-
-/* Wrapper for snd_pcm_mmap_commit
- * Args:
- *    handle - The open PCM to configure.
- *    offset - offset from call to mmap_begin.
- *    frames - # of frames written/read.
- * Returns:
- *    zero on success, negative error code for fatal
- *    errors.
- */
-int cras_alsa_mmap_commit(snd_pcm_t *handle, snd_pcm_uframes_t offset,
-			  snd_pcm_uframes_t frames);
-
-/* When the stream is suspended, due to a system suspend, loop until we can
- * resume it. Won't actually loop very much because the system will be
- * suspended.
- * Args:
- *    handle - The open PCM to configure.
- * Returns:
- *    zero on success, negative error code for fatal
- *    errors.
- */
-int cras_alsa_attempt_resume(snd_pcm_t *handle);
-
-#endif /* _CRAS_ALSA_HELPERS_H */
diff --git a/cras/src/server/cras_alsa_io.c b/cras/src/server/cras_alsa_io.c
deleted file mode 100644
index 275a681..0000000
--- a/cras/src/server/cras_alsa_io.c
+++ /dev/null
@@ -1,2473 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <alsa/asoundlib.h>
-#include <errno.h>
-#include <limits.h>
-#include <stdio.h>
-#include <sys/param.h>
-#include <sys/select.h>
-#include <sys/socket.h>
-#include <sys/time.h>
-#include <syslog.h>
-#include <time.h>
-
-#include "audio_thread.h"
-#include "cras_alsa_helpers.h"
-#include "cras_alsa_io.h"
-#include "cras_alsa_jack.h"
-#include "cras_alsa_mixer.h"
-#include "cras_alsa_ucm.h"
-#include "cras_audio_area.h"
-#include "cras_config.h"
-#include "cras_utf8.h"
-#include "cras_hotword_handler.h"
-#include "cras_iodev.h"
-#include "cras_iodev_list.h"
-#include "cras_messages.h"
-#include "cras_ramp.h"
-#include "cras_rclient.h"
-#include "cras_shm.h"
-#include "cras_system_state.h"
-#include "cras_types.h"
-#include "cras_util.h"
-#include "cras_volume_curve.h"
-#include "sfh.h"
-#include "softvol_curve.h"
-#include "utlist.h"
-
-#define HOTWORD_DEV "Wake on Voice"
-#define DEFAULT "(default)"
-#define HDMI "HDMI"
-#define INTERNAL_MICROPHONE "Internal Mic"
-#define INTERNAL_SPEAKER "Speaker"
-#define KEYBOARD_MIC "Keyboard Mic"
-#define HEADPHONE "Headphone"
-#define MIC "Mic"
-#define USB "USB"
-#define LOOPBACK_CAPTURE "Loopback Capture"
-#define LOOPBACK_PLAYBACK "Loopback Playback"
-
-/*
- * For USB, pad the output buffer.  This avoids a situation where there isn't a
- * complete URB's worth of audio ready to be transmitted when it is requested.
- * The URB interval does track directly to the audio clock, making it hard to
- * predict the exact interval.
- */
-#define USB_EXTRA_BUFFER_FRAMES 768
-
-/*
- * When snd_pcm_avail returns a value that is greater than buffer size,
- * we know there is an underrun. If the number of underrun samples
- * (avail - buffer_size) is greater than SEVERE_UNDERRUN_MS * rate,
- * it is a severe underrun. Main thread should disable and then enable
- * device to recover it from underrun.
- */
-#define SEVERE_UNDERRUN_MS 5000
-
-/*
- * When entering no stream state, audio thread needs to fill extra zeros in
- * order to play remaining valid frames. The value indicates how many
- * time will be filled.
- */
-static const struct timespec no_stream_fill_zeros_duration = {
-	0, 50 * 1000 * 1000 /* 50 msec. */
-};
-
-/*
- * This extends cras_ionode to include alsa-specific information.
- * Members:
- *    mixer_output - From cras_alsa_mixer.
- *    pcm_name - PCM name for snd_pcm_open.
- *    volume_curve - Volume curve for this node.
- *    jack - The jack associated with the node.
- */
-struct alsa_output_node {
-	struct cras_ionode base;
-	struct mixer_control *mixer_output;
-	const char *pcm_name;
-	struct cras_volume_curve *volume_curve;
-	const struct cras_alsa_jack *jack;
-};
-
-struct alsa_input_node {
-	struct cras_ionode base;
-	struct mixer_control *mixer_input;
-	const char *pcm_name;
-	const struct cras_alsa_jack *jack;
-	int8_t *channel_layout;
-};
-
-/*
- * Child of cras_iodev, alsa_io handles ALSA interaction for sound devices.
- * base - The cras_iodev structure "base class".
- * pcm_name - The PCM name passed to snd_pcm_open() (e.g. "hw:0,0").
- * dev_name - value from snd_pcm_info_get_name
- * dev_id - value from snd_pcm_info_get_id
- * device_index - ALSA index of device, Y in "hw:X:Y".
- * next_ionode_index - The index we will give to the next ionode. Each ionode
- *     have a unique index within the iodev.
- * card_type - the type of the card this iodev belongs.
- * is_first - true if this is the first iodev on the card.
- * fully_specified - true if this device and it's nodes were fully specified.
- *     That is, don't automatically create nodes for it.
- * handle - Handle to the opened ALSA device.
- * num_severe_underruns - Number of times we have run out of data badly.
-                          Unlike num_underruns which records for the duration
-                          where device is opened, num_severe_underruns records
-                          since device is created. When severe underrun occurs
-                          a possible action is to close/open device.
- * alsa_stream - Playback or capture type.
- * mixer - Alsa mixer used to control volume and mute of the device.
- * config - Card config for this alsa device.
- * jack_list - List of alsa jack controls for this device.
- * ucm - CRAS use case manager, if configuration is found.
- * mmap_offset - offset returned from mmap_begin.
- * poll_fd - Descriptor used to block until data is ready.
- * dma_period_set_microsecs - If non-zero, the value to apply to the dma_period.
- * free_running - true if device is playing zeros in the buffer without
- *                user filling meaningful data. The device buffer is filled
- *                with zeros. In this state, appl_ptr remains the same
- *                while hw_ptr keeps running ahead.
- * filled_zeros_for_draining - The number of zeros filled for draining.
- * severe_underrun_frames - The threshold for severe underrun.
- * default_volume_curve - Default volume curve that converts from an index
- *                        to dBFS.
- * has_dependent_dev - true if this iodev has dependent device.
- */
-struct alsa_io {
-	struct cras_iodev base;
-	char *pcm_name;
-	char *dev_name;
-	char *dev_id;
-	uint32_t device_index;
-	uint32_t next_ionode_index;
-	enum CRAS_ALSA_CARD_TYPE card_type;
-	int is_first;
-	int fully_specified;
-	snd_pcm_t *handle;
-	unsigned int num_severe_underruns;
-	snd_pcm_stream_t alsa_stream;
-	struct cras_alsa_mixer *mixer;
-	const struct cras_card_config *config;
-	struct cras_alsa_jack_list *jack_list;
-	struct cras_use_case_mgr *ucm;
-	snd_pcm_uframes_t mmap_offset;
-	int poll_fd;
-	unsigned int dma_period_set_microsecs;
-	int free_running;
-	unsigned int filled_zeros_for_draining;
-	snd_pcm_uframes_t severe_underrun_frames;
-	struct cras_volume_curve *default_volume_curve;
-	int hwparams_set;
-	int has_dependent_dev;
-};
-
-static void init_device_settings(struct alsa_io *aio);
-
-static int alsa_iodev_set_active_node(struct cras_iodev *iodev,
-				      struct cras_ionode *ionode,
-				      unsigned dev_enabled);
-
-static int get_fixed_rate(struct alsa_io *aio);
-
-static int update_supported_formats(struct cras_iodev *iodev);
-
-/*
- * Defines the default values of nodes.
- */
-static const struct {
-	const char *name;
-	enum CRAS_NODE_TYPE type;
-	enum CRAS_NODE_POSITION position;
-} node_defaults[] = {
-	{
-		.name = DEFAULT,
-		.type = CRAS_NODE_TYPE_UNKNOWN,
-		.position = NODE_POSITION_INTERNAL,
-	},
-	{
-		.name = INTERNAL_SPEAKER,
-		.type = CRAS_NODE_TYPE_INTERNAL_SPEAKER,
-		.position = NODE_POSITION_INTERNAL,
-	},
-	{
-		.name = INTERNAL_MICROPHONE,
-		.type = CRAS_NODE_TYPE_MIC,
-		.position = NODE_POSITION_INTERNAL,
-	},
-	{
-		.name = KEYBOARD_MIC,
-		.type = CRAS_NODE_TYPE_MIC,
-		.position = NODE_POSITION_KEYBOARD,
-	},
-	{
-		.name = HDMI,
-		.type = CRAS_NODE_TYPE_HDMI,
-		.position = NODE_POSITION_EXTERNAL,
-	},
-	{
-		.name = "IEC958",
-		.type = CRAS_NODE_TYPE_HDMI,
-		.position = NODE_POSITION_EXTERNAL,
-	},
-	{
-		.name = "Headphone",
-		.type = CRAS_NODE_TYPE_HEADPHONE,
-		.position = NODE_POSITION_EXTERNAL,
-	},
-	{
-		.name = "Front Headphone",
-		.type = CRAS_NODE_TYPE_HEADPHONE,
-		.position = NODE_POSITION_EXTERNAL,
-	},
-	{
-		.name = "Front Mic",
-		.type = CRAS_NODE_TYPE_MIC,
-		.position = NODE_POSITION_FRONT,
-	},
-	{
-		.name = "Rear Mic",
-		.type = CRAS_NODE_TYPE_MIC,
-		.position = NODE_POSITION_REAR,
-	},
-	{
-		.name = "Mic",
-		.type = CRAS_NODE_TYPE_MIC,
-		.position = NODE_POSITION_EXTERNAL,
-	},
-	{
-		.name = HOTWORD_DEV,
-		.type = CRAS_NODE_TYPE_HOTWORD,
-		.position = NODE_POSITION_INTERNAL,
-	},
-	{
-		.name = "Haptic",
-		.type = CRAS_NODE_TYPE_HAPTIC,
-		.position = NODE_POSITION_INTERNAL,
-	},
-	{
-		.name = "Rumbler",
-		.type = CRAS_NODE_TYPE_HAPTIC,
-		.position = NODE_POSITION_INTERNAL,
-	},
-	{
-		.name = "Line Out",
-		.type = CRAS_NODE_TYPE_LINEOUT,
-		.position = NODE_POSITION_EXTERNAL,
-	},
-	{
-		.name = "SCO Line In",
-		.type = CRAS_NODE_TYPE_BLUETOOTH,
-		.position = NODE_POSITION_EXTERNAL,
-	},
-	{
-		.name = "SCO Line Out",
-		.type = CRAS_NODE_TYPE_BLUETOOTH,
-		.position = NODE_POSITION_EXTERNAL,
-	},
-	{
-		.name = "Echo Reference",
-		.type = CRAS_NODE_TYPE_ECHO_REFERENCE,
-		.position = NODE_POSITION_INTERNAL,
-	},
-	{
-		.name = LOOPBACK_CAPTURE,
-		.type = CRAS_NODE_TYPE_ALSA_LOOPBACK,
-		.position = NODE_POSITION_INTERNAL,
-	},
-	{
-		.name = LOOPBACK_PLAYBACK,
-		.type = CRAS_NODE_TYPE_ALSA_LOOPBACK,
-		.position = NODE_POSITION_INTERNAL,
-	},
-};
-
-static int set_hwparams(struct cras_iodev *iodev)
-{
-	struct alsa_io *aio = (struct alsa_io *)iodev;
-	int period_wakeup;
-	int rc;
-
-	/* Only need to set hardware params once. */
-	if (aio->hwparams_set)
-		return 0;
-
-	/* If it's a wake on voice device, period_wakeups are required. */
-	period_wakeup = (iodev->active_node->type == CRAS_NODE_TYPE_HOTWORD);
-
-	/* Sets frame rate and channel count to alsa device before
-	 * we test channel mapping. */
-	rc = cras_alsa_set_hwparams(aio->handle, iodev->format,
-				    &iodev->buffer_size, period_wakeup,
-				    aio->dma_period_set_microsecs);
-	if (rc < 0)
-		return rc;
-
-	aio->hwparams_set = 1;
-	return 0;
-}
-
-/*
- * iodev callbacks.
- */
-
-static int frames_queued(const struct cras_iodev *iodev,
-			 struct timespec *tstamp)
-{
-	struct alsa_io *aio = (struct alsa_io *)iodev;
-	int rc;
-	snd_pcm_uframes_t frames;
-
-	rc = cras_alsa_get_avail_frames(aio->handle, aio->base.buffer_size,
-					aio->severe_underrun_frames,
-					iodev->info.name, &frames, tstamp);
-	if (rc < 0) {
-		if (rc == -EPIPE)
-			aio->num_severe_underruns++;
-		return rc;
-	}
-	clock_gettime(CLOCK_MONOTONIC_RAW, tstamp);
-	if (iodev->direction == CRAS_STREAM_INPUT)
-		return (int)frames;
-
-	/* For output, return number of frames that are used. */
-	return iodev->buffer_size - frames;
-}
-
-static int delay_frames(const struct cras_iodev *iodev)
-{
-	struct alsa_io *aio = (struct alsa_io *)iodev;
-	snd_pcm_sframes_t delay;
-	int rc;
-
-	rc = cras_alsa_get_delay_frames(aio->handle, iodev->buffer_size,
-					&delay);
-	if (rc < 0)
-		return rc;
-
-	return (int)delay;
-}
-
-static int close_dev(struct cras_iodev *iodev)
-{
-	struct alsa_io *aio = (struct alsa_io *)iodev;
-
-	/* Removes audio thread callback from main thread. */
-	if (aio->poll_fd >= 0)
-		audio_thread_rm_callback_sync(
-			cras_iodev_list_get_audio_thread(), aio->poll_fd);
-	if (!aio->handle)
-		return 0;
-	cras_alsa_pcm_close(aio->handle);
-	aio->handle = NULL;
-	aio->free_running = 0;
-	aio->filled_zeros_for_draining = 0;
-	aio->hwparams_set = 0;
-	cras_iodev_free_format(&aio->base);
-	cras_iodev_free_audio_area(&aio->base);
-	return 0;
-}
-
-static int empty_hotword_cb(void *arg, int revents)
-{
-	/* Only need this once. */
-	struct alsa_io *aio = (struct alsa_io *)arg;
-	audio_thread_rm_callback(aio->poll_fd);
-	aio->poll_fd = -1;
-	aio->base.input_streaming = 1;
-
-	/* Send hotword triggered signal. */
-	cras_hotword_send_triggered_msg();
-
-	return 0;
-}
-
-static int open_dev(struct cras_iodev *iodev)
-{
-	struct alsa_io *aio = (struct alsa_io *)iodev;
-	snd_pcm_t *handle;
-	int rc;
-	const char *pcm_name = NULL;
-	int enable_noise_cancellation;
-
-	if (aio->base.direction == CRAS_STREAM_OUTPUT) {
-		struct alsa_output_node *aout =
-			(struct alsa_output_node *)aio->base.active_node;
-		pcm_name = aout->pcm_name;
-	} else {
-		struct alsa_input_node *ain =
-			(struct alsa_input_node *)aio->base.active_node;
-		pcm_name = ain->pcm_name;
-	}
-
-	/* For legacy UCM path which doesn't have PlaybackPCM or CapturePCM. */
-	if (pcm_name == NULL)
-		pcm_name = aio->pcm_name;
-
-	rc = cras_alsa_pcm_open(&handle, pcm_name, aio->alsa_stream);
-	if (rc < 0)
-		return rc;
-
-	aio->handle = handle;
-
-	/* Enable or disable noise cancellation if it supports. */
-	if (aio->ucm && iodev->direction == CRAS_STREAM_INPUT &&
-	    ucm_node_noise_cancellation_exists(aio->ucm,
-					       iodev->active_node->name)) {
-		enable_noise_cancellation =
-			cras_system_get_noise_cancellation_enabled();
-		rc = ucm_enable_node_noise_cancellation(
-			aio->ucm, iodev->active_node->name,
-			enable_noise_cancellation);
-		if (rc < 0)
-			return rc;
-	}
-
-	return 0;
-}
-
-static int configure_dev(struct cras_iodev *iodev)
-{
-	struct alsa_io *aio = (struct alsa_io *)iodev;
-	int rc;
-
-	/* This is called after the first stream added so configure for it.
-	 * format must be set before opening the device.
-	 */
-	if (iodev->format == NULL)
-		return -EINVAL;
-	aio->free_running = 0;
-	aio->filled_zeros_for_draining = 0;
-	aio->severe_underrun_frames =
-		SEVERE_UNDERRUN_MS * iodev->format->frame_rate / 1000;
-
-	cras_iodev_init_audio_area(iodev, iodev->format->num_channels);
-
-	syslog(LOG_DEBUG, "Configure alsa device %s rate %zuHz, %zu channels",
-	       aio->pcm_name, iodev->format->frame_rate,
-	       iodev->format->num_channels);
-
-	rc = set_hwparams(iodev);
-	if (rc < 0)
-		return rc;
-
-	/* Set channel map to device */
-	rc = cras_alsa_set_channel_map(aio->handle, iodev->format);
-	if (rc < 0)
-		return rc;
-
-	/* Configure software params. */
-	rc = cras_alsa_set_swparams(aio->handle);
-	if (rc < 0)
-		return rc;
-
-	/* Initialize device settings. */
-	init_device_settings(aio);
-
-	aio->poll_fd = -1;
-	if (iodev->active_node->type == CRAS_NODE_TYPE_HOTWORD) {
-		struct pollfd *ufds;
-		int count, i;
-
-		count = snd_pcm_poll_descriptors_count(aio->handle);
-		if (count <= 0) {
-			syslog(LOG_ERR, "Invalid poll descriptors count\n");
-			return count;
-		}
-
-		ufds = (struct pollfd *)malloc(sizeof(struct pollfd) * count);
-		if (ufds == NULL)
-			return -ENOMEM;
-
-		rc = snd_pcm_poll_descriptors(aio->handle, ufds, count);
-		if (rc < 0) {
-			syslog(LOG_ERR,
-			       "Getting hotword poll descriptors: %s\n",
-			       snd_strerror(rc));
-			free(ufds);
-			return rc;
-		}
-
-		for (i = 0; i < count; i++) {
-			if (ufds[i].events & POLLIN) {
-				aio->poll_fd = ufds[i].fd;
-				break;
-			}
-		}
-		free(ufds);
-
-		if (aio->poll_fd >= 0)
-			audio_thread_add_events_callback(
-				aio->poll_fd, empty_hotword_cb, aio, POLLIN);
-	}
-
-	/* Capture starts right away, playback will wait for samples. */
-	if (aio->alsa_stream == SND_PCM_STREAM_CAPTURE)
-		cras_alsa_pcm_start(aio->handle);
-
-	return 0;
-}
-
-/*
- * Check if ALSA device is opened by checking if handle is valid.
- * Note that to fully open a cras_iodev, ALSA device is opened first, then there
- * are some device init settings to be done in init_device_settings.
- * Therefore, when setting volume/mute/gain in init_device_settings,
- * cras_iodev is not in CRAS_IODEV_STATE_OPEN yet. We need to check if handle
- * is valid when setting those properties, instead of checking
- * cras_iodev_is_open.
- */
-static int has_handle(const struct alsa_io *aio)
-{
-	return !!aio->handle;
-}
-
-static int start(const struct cras_iodev *iodev)
-{
-	struct alsa_io *aio = (struct alsa_io *)iodev;
-	snd_pcm_t *handle = aio->handle;
-	int rc;
-
-	if (snd_pcm_state(handle) == SND_PCM_STATE_RUNNING)
-		return 0;
-
-	if (snd_pcm_state(handle) == SND_PCM_STATE_SUSPENDED) {
-		rc = cras_alsa_attempt_resume(handle);
-		if (rc < 0) {
-			syslog(LOG_ERR, "Resume error: %s", snd_strerror(rc));
-			return rc;
-		}
-		cras_iodev_reset_rate_estimator(iodev);
-	} else {
-		rc = cras_alsa_pcm_start(handle);
-		if (rc < 0) {
-			syslog(LOG_ERR, "Start error: %s", snd_strerror(rc));
-			return rc;
-		}
-	}
-
-	return 0;
-}
-
-static int get_buffer(struct cras_iodev *iodev, struct cras_audio_area **area,
-		      unsigned *frames)
-{
-	struct alsa_io *aio = (struct alsa_io *)iodev;
-	snd_pcm_uframes_t nframes = *frames;
-	uint8_t *dst = NULL;
-	size_t format_bytes;
-	int rc;
-
-	aio->mmap_offset = 0;
-	format_bytes = cras_get_format_bytes(iodev->format);
-
-	rc = cras_alsa_mmap_begin(aio->handle, format_bytes, &dst,
-				  &aio->mmap_offset, &nframes);
-
-	iodev->area->frames = nframes;
-	cras_audio_area_config_buf_pointers(iodev->area, iodev->format, dst);
-
-	*area = iodev->area;
-	*frames = nframes;
-
-	return rc;
-}
-
-static int put_buffer(struct cras_iodev *iodev, unsigned nwritten)
-{
-	struct alsa_io *aio = (struct alsa_io *)iodev;
-
-	return cras_alsa_mmap_commit(aio->handle, aio->mmap_offset, nwritten);
-}
-
-static int flush_buffer(struct cras_iodev *iodev)
-{
-	struct alsa_io *aio = (struct alsa_io *)iodev;
-	snd_pcm_uframes_t nframes;
-
-	if (iodev->direction == CRAS_STREAM_INPUT) {
-		nframes = snd_pcm_avail(aio->handle);
-		nframes = snd_pcm_forwardable(aio->handle);
-		return snd_pcm_forward(aio->handle, nframes);
-	}
-	return 0;
-}
-
-/*
- * Gets the first plugged node in list. This is used as the
- * default node to set as active.
- */
-static struct cras_ionode *first_plugged_node(struct cras_iodev *iodev)
-{
-	struct cras_ionode *n;
-
-	/* When this is called at iodev creation, none of the nodes
-	 * are selected. Just pick the first plugged one and let Chrome
-	 * choose it later. */
-	DL_FOREACH (iodev->nodes, n) {
-		if (n->plugged)
-			return n;
-	}
-	return iodev->nodes;
-}
-
-static void update_active_node(struct cras_iodev *iodev, unsigned node_idx,
-			       unsigned dev_enabled)
-{
-	struct cras_ionode *n;
-
-	/* If a node exists for node_idx, set it as active. */
-	DL_FOREACH (iodev->nodes, n) {
-		if (n->idx == node_idx) {
-			alsa_iodev_set_active_node(iodev, n, dev_enabled);
-			return;
-		}
-	}
-
-	alsa_iodev_set_active_node(iodev, first_plugged_node(iodev),
-				   dev_enabled);
-}
-
-static int update_channel_layout(struct cras_iodev *iodev)
-{
-	struct alsa_io *aio = (struct alsa_io *)iodev;
-	int err = 0;
-
-	/* If the capture channel map is specified in UCM, prefer it over
-	 * what ALSA provides. */
-	if (aio->ucm && (iodev->direction == CRAS_STREAM_INPUT)) {
-		struct alsa_input_node *input =
-			(struct alsa_input_node *)iodev->active_node;
-
-		if (input->channel_layout) {
-			memcpy(iodev->format->channel_layout,
-			       input->channel_layout,
-			       CRAS_CH_MAX * sizeof(*input->channel_layout));
-			return 0;
-		}
-	}
-
-	err = set_hwparams(iodev);
-	if (err < 0)
-		return err;
-
-	return cras_alsa_get_channel_map(aio->handle, iodev->format);
-}
-
-static int set_hotword_model(struct cras_iodev *iodev, const char *model_name)
-{
-	struct alsa_io *aio = (struct alsa_io *)iodev;
-	if (!aio->ucm)
-		return -EINVAL;
-
-	return ucm_set_hotword_model(aio->ucm, model_name);
-}
-
-static char *get_hotword_models(struct cras_iodev *iodev)
-{
-	struct alsa_io *aio = (struct alsa_io *)iodev;
-	if (!aio->ucm)
-		return NULL;
-
-	return ucm_get_hotword_models(aio->ucm);
-}
-
-/*
- * Alsa helper functions.
- */
-
-static struct alsa_output_node *get_active_output(const struct alsa_io *aio)
-{
-	return (struct alsa_output_node *)aio->base.active_node;
-}
-
-static struct alsa_input_node *get_active_input(const struct alsa_io *aio)
-{
-	return (struct alsa_input_node *)aio->base.active_node;
-}
-
-/*
- * Gets the curve for the active output node. If the node doesn't have volume
- * curve specified, return the default volume curve of the parent iodev.
- */
-static const struct cras_volume_curve *
-get_curve_for_output_node(const struct alsa_io *aio,
-			  const struct alsa_output_node *node)
-{
-	if (node && node->volume_curve)
-		return node->volume_curve;
-	return aio->default_volume_curve;
-}
-
-/*
- * Gets the curve for the active output.
- */
-static const struct cras_volume_curve *
-get_curve_for_active_output(const struct alsa_io *aio)
-{
-	struct alsa_output_node *node = get_active_output(aio);
-	return get_curve_for_output_node(aio, node);
-}
-
-/*
- * Informs the system of the volume limits for this device.
- */
-static void set_alsa_volume_limits(struct alsa_io *aio)
-{
-	const struct cras_volume_curve *curve;
-
-	/* Only set the limits if the dev is active. */
-	if (!has_handle(aio))
-		return;
-
-	curve = get_curve_for_active_output(aio);
-	cras_system_set_volume_limits(curve->get_dBFS(curve, 1), /* min */
-				      curve->get_dBFS(curve,
-						      CRAS_MAX_SYSTEM_VOLUME));
-}
-
-/*
- * Sets the volume of the playback device to the specified level. Receives a
- * volume index from the system settings, ranging from 0 to 100, converts it to
- * dB using the volume curve, and sends the dB value to alsa.
- */
-static void set_alsa_volume(struct cras_iodev *iodev)
-{
-	const struct alsa_io *aio = (const struct alsa_io *)iodev;
-	const struct cras_volume_curve *curve;
-	size_t volume;
-	struct alsa_output_node *aout;
-
-	assert(aio);
-	if (aio->mixer == NULL)
-		return;
-
-	/* Only set the volume if the dev is active. */
-	if (!has_handle(aio))
-		return;
-
-	volume = cras_system_get_volume();
-	curve = get_curve_for_active_output(aio);
-	if (curve == NULL)
-		return;
-	aout = get_active_output(aio);
-	if (aout)
-		volume = cras_iodev_adjust_node_volume(&aout->base, volume);
-
-	/* Samples get scaled for devices using software volume, set alsa
-	 * volume to 100. */
-	if (cras_iodev_software_volume_needed(iodev))
-		volume = 100;
-
-	cras_alsa_mixer_set_dBFS(aio->mixer, curve->get_dBFS(curve, volume),
-				 aout ? aout->mixer_output : NULL);
-}
-
-/*
- * Sets the alsa mute control for this iodev.
- */
-static void set_alsa_mute(struct cras_iodev *iodev)
-{
-	const struct alsa_io *aio = (const struct alsa_io *)iodev;
-	struct alsa_output_node *aout;
-
-	if (!has_handle(aio))
-		return;
-
-	aout = get_active_output(aio);
-	cras_alsa_mixer_set_mute(aio->mixer, cras_system_get_mute(),
-				 aout ? aout->mixer_output : NULL);
-}
-
-/*
- * Sets the capture gain to the current system input gain level, given in dBFS.
- * Set mute based on the system mute state.  This gain can be positive or
- * negative and might be adjusted often if an app is running an AGC.
- */
-static void set_alsa_capture_gain(struct cras_iodev *iodev)
-{
-	const struct alsa_io *aio = (const struct alsa_io *)iodev;
-	struct alsa_input_node *ain;
-	long min_capture_gain, max_capture_gain, gain;
-	assert(aio);
-	if (aio->mixer == NULL)
-		return;
-
-	/* Only set the volume if the dev is active. */
-	if (!has_handle(aio))
-		return;
-
-	ain = get_active_input(aio);
-
-	cras_alsa_mixer_set_capture_mute(aio->mixer,
-					 cras_system_get_capture_mute(),
-					 ain ? ain->mixer_input : NULL);
-
-	/* For USB device without UCM config, not change a gain control. */
-	if (ain && ain->base.type == CRAS_NODE_TYPE_USB && !aio->ucm)
-		return;
-
-	/* Set hardware gain to 0dB if software gain is needed. */
-	if (cras_iodev_software_volume_needed(iodev))
-		gain = 0;
-	else {
-		min_capture_gain = cras_alsa_mixer_get_minimum_capture_gain(
-			aio->mixer, ain ? ain->mixer_input : NULL);
-		max_capture_gain = cras_alsa_mixer_get_maximum_capture_gain(
-			aio->mixer, ain ? ain->mixer_input : NULL);
-		gain = MAX(iodev->active_node->capture_gain, min_capture_gain);
-		gain = MIN(gain, max_capture_gain);
-	}
-
-	cras_alsa_mixer_set_capture_dBFS(aio->mixer, gain,
-					 ain ? ain->mixer_input : NULL);
-}
-
-/*
- * Swaps the left and right channels of the given node.
- */
-static int set_alsa_node_swapped(struct cras_iodev *iodev,
-				 struct cras_ionode *node, int enable)
-{
-	const struct alsa_io *aio = (const struct alsa_io *)iodev;
-	assert(aio);
-	return ucm_enable_swap_mode(aio->ucm, node->name, enable);
-}
-
-/*
- * Initializes the device settings according to system volume, mute, gain
- * settings.
- * Updates system capture gain limits based on current active device/node.
- */
-static void init_device_settings(struct alsa_io *aio)
-{
-	/* Register for volume/mute callback and set initial volume/mute for
-	 * the device. */
-	if (aio->base.direction == CRAS_STREAM_OUTPUT) {
-		set_alsa_volume_limits(aio);
-		set_alsa_volume(&aio->base);
-		set_alsa_mute(&aio->base);
-	} else {
-		set_alsa_capture_gain(&aio->base);
-	}
-}
-
-/*
- * Functions run in the main server context.
- */
-
-/*
- * Frees resources used by the alsa iodev.
- * Args:
- *    iodev - the iodev to free the resources from.
- */
-static void free_alsa_iodev_resources(struct alsa_io *aio)
-{
-	struct cras_ionode *node;
-	struct alsa_output_node *aout;
-	struct alsa_input_node *ain;
-
-	free(aio->base.supported_rates);
-	free(aio->base.supported_channel_counts);
-	free(aio->base.supported_formats);
-
-	DL_FOREACH (aio->base.nodes, node) {
-		if (aio->base.direction == CRAS_STREAM_OUTPUT) {
-			aout = (struct alsa_output_node *)node;
-			cras_volume_curve_destroy(aout->volume_curve);
-			free((void *)aout->pcm_name);
-		} else {
-			ain = (struct alsa_input_node *)node;
-			free((void *)ain->pcm_name);
-		}
-		cras_iodev_rm_node(&aio->base, node);
-		free(node->softvol_scalers);
-		free((void *)node->dsp_name);
-		free(node);
-	}
-
-	cras_iodev_free_resources(&aio->base);
-	free(aio->pcm_name);
-	if (aio->dev_id)
-		free(aio->dev_id);
-	if (aio->dev_name)
-		free(aio->dev_name);
-}
-
-/*
- * Returns true if this is the first internal device.
- */
-static int first_internal_device(struct alsa_io *aio)
-{
-	return aio->is_first && aio->card_type == ALSA_CARD_TYPE_INTERNAL;
-}
-
-/*
- * Returns true if there is already a node created with the given name.
- */
-static int has_node(struct alsa_io *aio, const char *name)
-{
-	struct cras_ionode *node;
-
-	DL_FOREACH (aio->base.nodes, node)
-		if (!strcmp(node->name, name))
-			return 1;
-
-	return 0;
-}
-
-/*
- * Returns true if string s ends with the given suffix.
- */
-int endswith(const char *s, const char *suffix)
-{
-	size_t n = strlen(s);
-	size_t m = strlen(suffix);
-	return n >= m && !strcmp(s + (n - m), suffix);
-}
-
-#ifdef CRAS_DBUS
-/*
- * Drop the node name and replace it with node type.
- */
-static void drop_node_name(struct cras_ionode *node)
-{
-	if (node->type == CRAS_NODE_TYPE_USB)
-		strcpy(node->name, USB);
-	else if (node->type == CRAS_NODE_TYPE_HDMI)
-		strcpy(node->name, HDMI);
-	else {
-		/* Only HDMI or USB node might have invalid name to drop */
-		syslog(LOG_ERR,
-		       "Unexpectedly drop node name for "
-		       "node: %s, type: %d",
-		       node->name, node->type);
-		strcpy(node->name, DEFAULT);
-	}
-}
-#endif
-
-/*
- * Sets the initial plugged state and type of a node based on its
- * name. Chrome will assign priority to nodes base on node type.
- */
-static void set_node_initial_state(struct cras_ionode *node,
-				   enum CRAS_ALSA_CARD_TYPE card_type)
-{
-	unsigned i;
-
-	node->volume = 100;
-	node->type = CRAS_NODE_TYPE_UNKNOWN;
-	/* Go through the known names */
-	for (i = 0; i < ARRAY_SIZE(node_defaults); i++)
-		if (!strncmp(node->name, node_defaults[i].name,
-			     strlen(node_defaults[i].name))) {
-			node->position = node_defaults[i].position;
-			node->plugged =
-				(node->position != NODE_POSITION_EXTERNAL);
-			node->type = node_defaults[i].type;
-			if (node->plugged)
-				gettimeofday(&node->plugged_time, NULL);
-			break;
-		}
-
-	/*
-	 * If we didn't find a matching name above, but the node is a jack node,
-	 * and there is no "HDMI" in the node name, then this must be a 3.5mm
-	 * headphone/mic.
-	 * Set its type and name to headphone/mic. The name is important because
-	 * it associates the UCM section to the node so the properties like
-	 * default node gain can be obtained.
-	 * This matches node names like "DAISY-I2S Mic Jack".
-	 * If HDMI is in the node name, set its type to HDMI. This matches node names
-	 * like "Rockchip HDMI Jack".
-	 */
-	if (i == ARRAY_SIZE(node_defaults)) {
-		if (endswith(node->name, "Jack") && !strstr(node->name, HDMI)) {
-			if (node->dev->direction == CRAS_STREAM_OUTPUT) {
-				node->type = CRAS_NODE_TYPE_HEADPHONE;
-				strncpy(node->name, HEADPHONE,
-					sizeof(node->name) - 1);
-			} else {
-				node->type = CRAS_NODE_TYPE_MIC;
-				strncpy(node->name, MIC,
-					sizeof(node->name) - 1);
-			}
-		}
-		if (strstr(node->name, HDMI) &&
-		    node->dev->direction == CRAS_STREAM_OUTPUT)
-			node->type = CRAS_NODE_TYPE_HDMI;
-	}
-
-	/* Regardless of the node name of a USB headset (it can be "Speaker"),
-	 * set it's type to usb.
-	 */
-	if (card_type == ALSA_CARD_TYPE_USB) {
-		node->type = CRAS_NODE_TYPE_USB;
-		node->position = NODE_POSITION_EXTERNAL;
-	}
-
-#ifdef CRAS_DBUS
-	if (!is_utf8_string(node->name))
-		drop_node_name(node);
-#endif
-}
-
-static int get_ucm_flag_integer(struct alsa_io *aio, const char *flag_name,
-				int *result)
-{
-	char *value;
-	int i;
-
-	if (!aio->ucm)
-		return -1;
-
-	value = ucm_get_flag(aio->ucm, flag_name);
-	if (!value)
-		return -1;
-
-	i = atoi(value);
-	free(value);
-	*result = i;
-	return 0;
-}
-
-static int auto_unplug_input_node(struct alsa_io *aio)
-{
-	int result;
-	if (get_ucm_flag_integer(aio, "AutoUnplugInputNode", &result))
-		return 0;
-	return result;
-}
-
-static int auto_unplug_output_node(struct alsa_io *aio)
-{
-	int result;
-	if (get_ucm_flag_integer(aio, "AutoUnplugOutputNode", &result))
-		return 0;
-	return result;
-}
-
-static int no_create_default_input_node(struct alsa_io *aio)
-{
-	int result;
-	if (get_ucm_flag_integer(aio, "NoCreateDefaultInputNode", &result))
-		return 0;
-	return result;
-}
-
-static int no_create_default_output_node(struct alsa_io *aio)
-{
-	int result;
-	if (get_ucm_flag_integer(aio, "NoCreateDefaultOutputNode", &result))
-		return 0;
-	return result;
-}
-
-static void
-set_output_node_software_volume_needed(struct alsa_output_node *output,
-				       struct alsa_io *aio)
-{
-	struct cras_alsa_mixer *mixer = aio->mixer;
-	long range = 0;
-
-	if (aio->ucm && ucm_get_disable_software_volume(aio->ucm)) {
-		output->base.software_volume_needed = 0;
-		syslog(LOG_DEBUG, "Disable software volume for %s from ucm.",
-		       output->base.name);
-		return;
-	}
-
-	/* Use software volume for HDMI output and nodes without volume mixer
-	 * control. */
-	if ((output->base.type == CRAS_NODE_TYPE_HDMI) ||
-	    (!cras_alsa_mixer_has_main_volume(mixer) &&
-	     !cras_alsa_mixer_has_volume(output->mixer_output)))
-		output->base.software_volume_needed = 1;
-
-	/* Use software volume if the usb device's volume range is smaller
-	 * than 40dB */
-	if (output->base.type == CRAS_NODE_TYPE_USB) {
-		range += cras_alsa_mixer_get_dB_range(mixer);
-		range += cras_alsa_mixer_get_output_dB_range(
-			output->mixer_output);
-		if (range < 4000)
-			output->base.software_volume_needed = 1;
-	}
-	if (output->base.software_volume_needed)
-		syslog(LOG_DEBUG, "Use software volume for node: %s",
-		       output->base.name);
-}
-
-static void set_input_default_node_gain(struct alsa_input_node *input,
-					struct alsa_io *aio)
-{
-	long gain;
-
-	input->base.capture_gain = DEFAULT_CAPTURE_GAIN;
-	input->base.ui_gain_scaler = 1.0f;
-
-	if (!aio->ucm)
-		return;
-
-	if (ucm_get_default_node_gain(aio->ucm, input->base.name, &gain) == 0)
-		input->base.capture_gain = gain;
-}
-
-static void set_input_node_intrinsic_sensitivity(struct alsa_input_node *input,
-						 struct alsa_io *aio)
-{
-	long sensitivity;
-	int rc;
-
-	input->base.intrinsic_sensitivity = 0;
-
-	if (aio->ucm) {
-		rc = ucm_get_intrinsic_sensitivity(aio->ucm, input->base.name,
-						   &sensitivity);
-		if (rc)
-			return;
-	} else if (input->base.type == CRAS_NODE_TYPE_USB) {
-		/*
-		 * For USB devices without UCM config, trust the default capture gain.
-		 * Set sensitivity to the default dbfs so the capture gain is 0.
-		 */
-		sensitivity = DEFAULT_CAPTURE_VOLUME_DBFS;
-	} else {
-		return;
-	}
-
-	input->base.intrinsic_sensitivity = sensitivity;
-	input->base.capture_gain = DEFAULT_CAPTURE_VOLUME_DBFS - sensitivity;
-	syslog(LOG_INFO,
-	       "Use software gain %ld for %s because IntrinsicSensitivity %ld is"
-	       " specified in UCM",
-	       input->base.capture_gain, input->base.name, sensitivity);
-}
-
-static void check_auto_unplug_output_node(struct alsa_io *aio,
-					  struct cras_ionode *node, int plugged)
-{
-	struct cras_ionode *tmp;
-
-	if (!auto_unplug_output_node(aio))
-		return;
-
-	/* Auto unplug internal speaker if any output node has been created */
-	if (!strcmp(node->name, INTERNAL_SPEAKER) && plugged) {
-		DL_FOREACH (aio->base.nodes, tmp)
-			if (tmp->plugged && (tmp != node))
-				cras_iodev_set_node_plugged(node, 0);
-	} else {
-		DL_FOREACH (aio->base.nodes, tmp) {
-			if (!strcmp(tmp->name, INTERNAL_SPEAKER))
-				cras_iodev_set_node_plugged(tmp, !plugged);
-		}
-	}
-}
-
-/*
- * Callback for listing mixer outputs. The mixer will call this once for each
- * output associated with this device. Most commonly this is used to tell the
- * device it has Headphones and Speakers.
- */
-static struct alsa_output_node *new_output(struct alsa_io *aio,
-					   struct mixer_control *cras_output,
-					   const char *name)
-{
-	struct alsa_output_node *output;
-	syslog(LOG_DEBUG, "New output node for '%s'", name);
-	if (aio == NULL) {
-		syslog(LOG_ERR, "Invalid aio when listing outputs.");
-		return NULL;
-	}
-	output = (struct alsa_output_node *)calloc(1, sizeof(*output));
-	if (output == NULL) {
-		syslog(LOG_ERR, "Out of memory when listing outputs.");
-		return NULL;
-	}
-	output->base.dev = &aio->base;
-	output->base.idx = aio->next_ionode_index++;
-	output->base.stable_id =
-		SuperFastHash(name, strlen(name), aio->base.info.stable_id);
-	if (aio->ucm)
-		output->base.dsp_name =
-			ucm_get_dsp_name_for_dev(aio->ucm, name);
-
-	if (strcmp(name, "SCO Line Out") == 0)
-		output->base.is_sco_pcm = 1;
-	output->mixer_output = cras_output;
-
-	/* Volume curve. */
-	output->volume_curve = cras_card_config_get_volume_curve_for_control(
-		aio->config,
-		name ? name : cras_alsa_mixer_get_control_name(cras_output));
-
-	strncpy(output->base.name, name, sizeof(output->base.name) - 1);
-	set_node_initial_state(&output->base, aio->card_type);
-	set_output_node_software_volume_needed(output, aio);
-
-	cras_iodev_add_node(&aio->base, &output->base);
-
-	check_auto_unplug_output_node(aio, &output->base, output->base.plugged);
-	return output;
-}
-
-static void new_output_by_mixer_control(struct mixer_control *cras_output,
-					void *callback_arg)
-{
-	struct alsa_io *aio = (struct alsa_io *)callback_arg;
-	char node_name[CRAS_IODEV_NAME_BUFFER_SIZE];
-	const char *ctl_name;
-
-	ctl_name = cras_alsa_mixer_get_control_name(cras_output);
-	if (!ctl_name)
-		return;
-
-	if (aio->card_type == ALSA_CARD_TYPE_USB) {
-		if (snprintf(node_name, sizeof(node_name), "%s: %s",
-			     aio->base.info.name, ctl_name) > 0) {
-			new_output(aio, cras_output, node_name);
-		}
-	} else {
-		new_output(aio, cras_output, ctl_name);
-	}
-}
-
-static void check_auto_unplug_input_node(struct alsa_io *aio,
-					 struct cras_ionode *node, int plugged)
-{
-	struct cras_ionode *tmp;
-	if (!auto_unplug_input_node(aio))
-		return;
-
-	/* Auto unplug internal mic if any input node has already
-	 * been created */
-	if (!strcmp(node->name, INTERNAL_MICROPHONE) && plugged) {
-		DL_FOREACH (aio->base.nodes, tmp)
-			if (tmp->plugged && (tmp != node))
-				cras_iodev_set_node_plugged(node, 0);
-	} else {
-		DL_FOREACH (aio->base.nodes, tmp)
-			if (!strcmp(tmp->name, INTERNAL_MICROPHONE))
-				cras_iodev_set_node_plugged(tmp, !plugged);
-	}
-}
-
-static struct alsa_input_node *new_input(struct alsa_io *aio,
-					 struct mixer_control *cras_input,
-					 const char *name)
-{
-	struct cras_iodev *iodev = &aio->base;
-	struct alsa_input_node *input;
-	int err;
-
-	input = (struct alsa_input_node *)calloc(1, sizeof(*input));
-	if (input == NULL) {
-		syslog(LOG_ERR, "Out of memory when listing inputs.");
-		return NULL;
-	}
-	input->base.dev = &aio->base;
-	input->base.idx = aio->next_ionode_index++;
-	input->base.stable_id =
-		SuperFastHash(name, strlen(name), aio->base.info.stable_id);
-	if (strcmp(name, "SCO Line In") == 0)
-		input->base.is_sco_pcm = 1;
-	input->mixer_input = cras_input;
-	strncpy(input->base.name, name, sizeof(input->base.name) - 1);
-	set_node_initial_state(&input->base, aio->card_type);
-	set_input_default_node_gain(input, aio);
-	set_input_node_intrinsic_sensitivity(input, aio);
-
-	if (aio->ucm) {
-		/* Check if channel map is specified in UCM. */
-		input->channel_layout = (int8_t *)malloc(
-			CRAS_CH_MAX * sizeof(*input->channel_layout));
-		err = ucm_get_capture_chmap_for_dev(aio->ucm, name,
-						    input->channel_layout);
-		if (err) {
-			free(input->channel_layout);
-			input->channel_layout = 0;
-		}
-		if (ucm_get_preempt_hotword(aio->ucm, name)) {
-			iodev->pre_open_iodev_hook =
-				cras_iodev_list_suspend_hotword_streams;
-			iodev->post_close_iodev_hook =
-				cras_iodev_list_resume_hotword_stream;
-		}
-
-		input->base.dsp_name = ucm_get_dsp_name_for_dev(aio->ucm, name);
-	}
-
-	cras_iodev_add_node(&aio->base, &input->base);
-	check_auto_unplug_input_node(aio, &input->base, input->base.plugged);
-	return input;
-}
-
-static void new_input_by_mixer_control(struct mixer_control *cras_input,
-				       void *callback_arg)
-{
-	struct alsa_io *aio = (struct alsa_io *)callback_arg;
-	char node_name[CRAS_IODEV_NAME_BUFFER_SIZE];
-	const char *ctl_name = cras_alsa_mixer_get_control_name(cras_input);
-
-	if (aio->card_type == ALSA_CARD_TYPE_USB) {
-		int ret = snprintf(node_name, sizeof(node_name), "%s: %s",
-				   aio->base.info.name, ctl_name);
-		// Truncation is OK, but add a check to make the compiler happy.
-		if (ret == sizeof(node_name))
-			node_name[sizeof(node_name) - 1] = '\0';
-		new_input(aio, cras_input, node_name);
-	} else {
-		new_input(aio, cras_input, ctl_name);
-	}
-}
-
-/*
- * Finds the output node associated with the jack. Returns NULL if not found.
- */
-static struct alsa_output_node *
-get_output_node_from_jack(struct alsa_io *aio,
-			  const struct cras_alsa_jack *jack)
-{
-	struct mixer_control *mixer_output;
-	struct cras_ionode *node = NULL;
-	struct alsa_output_node *aout = NULL;
-
-	/* Search by jack first. */
-	DL_SEARCH_SCALAR_WITH_CAST(aio->base.nodes, node, aout, jack, jack);
-	if (aout)
-		return aout;
-
-	/* Search by mixer control next. */
-	mixer_output = cras_alsa_jack_get_mixer_output(jack);
-	if (mixer_output == NULL)
-		return NULL;
-
-	DL_SEARCH_SCALAR_WITH_CAST(aio->base.nodes, node, aout, mixer_output,
-				   mixer_output);
-	return aout;
-}
-
-static struct alsa_input_node *
-get_input_node_from_jack(struct alsa_io *aio, const struct cras_alsa_jack *jack)
-{
-	struct mixer_control *mixer_input;
-	struct cras_ionode *node = NULL;
-	struct alsa_input_node *ain = NULL;
-
-	mixer_input = cras_alsa_jack_get_mixer_input(jack);
-	if (mixer_input == NULL) {
-		DL_SEARCH_SCALAR_WITH_CAST(aio->base.nodes, node, ain, jack,
-					   jack);
-		return ain;
-	}
-
-	DL_SEARCH_SCALAR_WITH_CAST(aio->base.nodes, node, ain, mixer_input,
-				   mixer_input);
-	return ain;
-}
-
-static const struct cras_alsa_jack *get_jack_from_node(struct cras_ionode *node)
-{
-	const struct cras_alsa_jack *jack = NULL;
-
-	if (node == NULL)
-		return NULL;
-
-	if (node->dev->direction == CRAS_STREAM_OUTPUT)
-		jack = ((struct alsa_output_node *)node)->jack;
-	else if (node->dev->direction == CRAS_STREAM_INPUT)
-		jack = ((struct alsa_input_node *)node)->jack;
-
-	return jack;
-}
-
-/*
- * Returns the dsp name specified in the ucm config. If there is a dsp name
- * specified for the active node, use that. Otherwise NULL should be returned.
- */
-static const char *get_active_dsp_name(struct alsa_io *aio)
-{
-	struct cras_ionode *node = aio->base.active_node;
-
-	if (node == NULL)
-		return NULL;
-
-	return node->dsp_name;
-}
-
-/*
- * Creates volume curve for the node associated with given jack.
- */
-static struct cras_volume_curve *
-create_volume_curve_for_jack(const struct cras_card_config *config,
-			     const struct cras_alsa_jack *jack)
-{
-	struct cras_volume_curve *curve;
-	const char *name;
-
-	/* Use jack's UCM device name as key to get volume curve. */
-	name = cras_alsa_jack_get_ucm_device(jack);
-	curve = cras_card_config_get_volume_curve_for_control(config, name);
-	if (curve)
-		return curve;
-
-	/* Use alsa jack's name as key to get volume curve. */
-	name = cras_alsa_jack_get_name(jack);
-	curve = cras_card_config_get_volume_curve_for_control(config, name);
-	if (curve)
-		return curve;
-
-	return NULL;
-}
-
-/*
- * Updates max_supported_channels value into cras_iodev_info.
- * Note that supported_rates, supported_channel_counts, and supported_formats of
- * iodev will be updated to the latest values after calling.
- */
-static void update_max_supported_channels(struct cras_iodev *iodev)
-{
-	struct alsa_io *aio = (struct alsa_io *)iodev;
-	unsigned int max_channels = 0;
-	size_t i;
-	bool active_node_predicted = false;
-	int rc;
-
-	/*
-	 * max_supported_channels might be wrong in dependent PCM cases. Always
-	 * return 2 for such cases.
-	 */
-	if (aio->has_dependent_dev) {
-		max_channels = 2;
-		goto update_info;
-	}
-
-	if (aio->handle) {
-		syslog(LOG_ERR,
-		       "update_max_supported_channels should not be called "
-		       "while device is opened.");
-		return;
-	}
-
-	/*
-	 * In the case of updating max_supported_channels on changing jack
-	 * plugging status of devices, the active node may not be determined
-	 * yet. Use the first node as the active node for obtaining the value of
-	 * max_supported_channels.
-	 */
-	if (!iodev->active_node) {
-		if (!iodev->nodes)
-			goto update_info;
-		iodev->active_node = iodev->nodes;
-		syslog(LOG_DEBUG,
-		       "Predict ionode %s as active node temporarily.",
-		       iodev->active_node->name);
-		active_node_predicted = true;
-	}
-
-	rc = open_dev(iodev);
-	if (active_node_predicted)
-		iodev->active_node = NULL; // Reset the predicted active_node.
-	if (rc)
-		goto update_info;
-
-	rc = update_supported_formats(iodev);
-	if (rc)
-		goto close_iodev;
-
-	for (i = 0; iodev->supported_channel_counts[i] != 0; i++) {
-		if (iodev->supported_channel_counts[i] > max_channels)
-			max_channels = iodev->supported_channel_counts[i];
-	}
-
-close_iodev:
-	close_dev(iodev);
-
-update_info:
-	iodev->info.max_supported_channels = max_channels;
-}
-
-/*
- * Callback that is called when an output jack is plugged or unplugged.
- */
-static void jack_output_plug_event(const struct cras_alsa_jack *jack,
-				   int plugged, void *arg)
-{
-	struct alsa_io *aio;
-	struct alsa_output_node *node;
-	const char *jack_name;
-
-	if (arg == NULL)
-		return;
-
-	aio = (struct alsa_io *)arg;
-	node = get_output_node_from_jack(aio, jack);
-	jack_name = cras_alsa_jack_get_name(jack);
-	if (!strcmp(jack_name, "Speaker Phantom Jack"))
-		jack_name = INTERNAL_SPEAKER;
-
-	/* If there isn't a node for this jack, create one. */
-	if (node == NULL) {
-		if (aio->fully_specified) {
-			/* When fully specified, can't have new nodes. */
-			syslog(LOG_ERR, "No matching output node for jack %s!",
-			       jack_name);
-			return;
-		}
-		node = new_output(aio, NULL, jack_name);
-		if (node == NULL)
-			return;
-
-		cras_alsa_jack_update_node_type(jack, &(node->base.type));
-	}
-
-	if (!node->jack) {
-		if (aio->fully_specified)
-			syslog(LOG_ERR,
-			       "Jack '%s' was found to match output node '%s'."
-			       " Please fix your UCM configuration to match.",
-			       jack_name, node->base.name);
-
-		/* If we already have the node, associate with the jack. */
-		node->jack = jack;
-		if (node->volume_curve == NULL)
-			node->volume_curve =
-				create_volume_curve_for_jack(aio->config, jack);
-	}
-
-	syslog(LOG_DEBUG, "%s plugged: %d, %s", jack_name, plugged,
-	       cras_alsa_mixer_get_control_name(node->mixer_output));
-
-	cras_alsa_jack_update_monitor_name(jack, node->base.name,
-					   sizeof(node->base.name));
-
-#ifdef CRAS_DBUS
-	/* The name got from jack might be an invalid UTF8 string. */
-	if (!is_utf8_string(node->base.name))
-		drop_node_name(&node->base);
-#endif
-
-	cras_iodev_set_node_plugged(&node->base, plugged);
-
-	check_auto_unplug_output_node(aio, &node->base, plugged);
-
-	/*
-	 * For HDMI plug event cases, update max supported channels according
-	 * to the current active node.
-	 */
-	if (node->base.type == CRAS_NODE_TYPE_HDMI && plugged)
-		update_max_supported_channels(&aio->base);
-}
-
-/*
- * Callback that is called when an input jack is plugged or unplugged.
- */
-static void jack_input_plug_event(const struct cras_alsa_jack *jack,
-				  int plugged, void *arg)
-{
-	struct alsa_io *aio;
-	struct alsa_input_node *node;
-	struct mixer_control *cras_input;
-	const char *jack_name;
-
-	if (arg == NULL)
-		return;
-	aio = (struct alsa_io *)arg;
-	node = get_input_node_from_jack(aio, jack);
-	jack_name = cras_alsa_jack_get_name(jack);
-
-	/* If there isn't a node for this jack, create one. */
-	if (node == NULL) {
-		if (aio->fully_specified) {
-			/* When fully specified, can't have new nodes. */
-			syslog(LOG_ERR, "No matching input node for jack %s!",
-			       jack_name);
-			return;
-		}
-		cras_input = cras_alsa_jack_get_mixer_input(jack);
-		node = new_input(aio, cras_input, jack_name);
-		if (node == NULL)
-			return;
-	}
-
-	syslog(LOG_DEBUG, "%s plugged: %d, %s", jack_name, plugged,
-	       cras_alsa_mixer_get_control_name(node->mixer_input));
-
-	/* If we already have the node, associate with the jack. */
-	if (!node->jack) {
-		if (aio->fully_specified)
-			syslog(LOG_ERR,
-			       "Jack '%s' was found to match input node '%s'."
-			       " Please fix your UCM configuration to match.",
-			       jack_name, node->base.name);
-		node->jack = jack;
-	}
-
-	cras_iodev_set_node_plugged(&node->base, plugged);
-
-	check_auto_unplug_input_node(aio, &node->base, plugged);
-}
-
-/*
- * Sets the name of the given iodev, using the name and index of the card
- * combined with the device index and direction.
- */
-static void set_iodev_name(struct cras_iodev *dev, const char *card_name,
-			   const char *dev_name, size_t card_index,
-			   size_t device_index,
-			   enum CRAS_ALSA_CARD_TYPE card_type, size_t usb_vid,
-			   size_t usb_pid, char *usb_serial_number)
-{
-	snprintf(dev->info.name, sizeof(dev->info.name), "%s: %s:%zu,%zu",
-		 card_name, dev_name, card_index, device_index);
-	dev->info.name[ARRAY_SIZE(dev->info.name) - 1] = '\0';
-	syslog(LOG_DEBUG, "Add device name=%s", dev->info.name);
-
-	dev->info.stable_id =
-		SuperFastHash(card_name, strlen(card_name), strlen(card_name));
-	dev->info.stable_id =
-		SuperFastHash(dev_name, strlen(dev_name), dev->info.stable_id);
-
-	switch (card_type) {
-	case ALSA_CARD_TYPE_INTERNAL:
-		dev->info.stable_id = SuperFastHash((const char *)&device_index,
-						    sizeof(device_index),
-						    dev->info.stable_id);
-		break;
-	case ALSA_CARD_TYPE_USB:
-		dev->info.stable_id =
-			SuperFastHash((const char *)&usb_vid, sizeof(usb_vid),
-				      dev->info.stable_id);
-		dev->info.stable_id =
-			SuperFastHash((const char *)&usb_pid, sizeof(usb_pid),
-				      dev->info.stable_id);
-		dev->info.stable_id = SuperFastHash(usb_serial_number,
-						    strlen(usb_serial_number),
-						    dev->info.stable_id);
-		break;
-	default:
-		break;
-	}
-	syslog(LOG_DEBUG, "Stable ID=%08x", dev->info.stable_id);
-}
-
-static int get_fixed_rate(struct alsa_io *aio)
-{
-	const char *name;
-
-	if (aio->base.direction == CRAS_STREAM_OUTPUT) {
-		struct alsa_output_node *active = get_active_output(aio);
-		if (!active)
-			return -ENOENT;
-		name = active->base.name;
-	} else {
-		struct alsa_input_node *active = get_active_input(aio);
-		if (!active)
-			return -ENOENT;
-		name = active->base.name;
-	}
-
-	return ucm_get_sample_rate_for_dev(aio->ucm, name, aio->base.direction);
-}
-
-static size_t get_fixed_channels(struct alsa_io *aio)
-{
-	const char *name;
-	int rc;
-	size_t channels;
-
-	if (aio->base.direction == CRAS_STREAM_OUTPUT) {
-		struct alsa_output_node *active = get_active_output(aio);
-		if (!active)
-			return -ENOENT;
-		name = active->base.name;
-	} else {
-		struct alsa_input_node *active = get_active_input(aio);
-		if (!active)
-			return -ENOENT;
-		name = active->base.name;
-	}
-
-	rc = ucm_get_channels_for_dev(aio->ucm, name, aio->base.direction,
-				      &channels);
-	return (rc) ? 0 : channels;
-}
-
-/*
- * Updates the supported sample rates and channel counts.
- */
-static int update_supported_formats(struct cras_iodev *iodev)
-{
-	struct alsa_io *aio = (struct alsa_io *)iodev;
-	int err;
-	int fixed_rate;
-	size_t fixed_channels;
-
-	free(iodev->supported_rates);
-	iodev->supported_rates = NULL;
-	free(iodev->supported_channel_counts);
-	iodev->supported_channel_counts = NULL;
-	free(iodev->supported_formats);
-	iodev->supported_formats = NULL;
-
-	err = cras_alsa_fill_properties(aio->handle, &iodev->supported_rates,
-					&iodev->supported_channel_counts,
-					&iodev->supported_formats);
-	if (err)
-		return err;
-
-	if (aio->ucm) {
-		/* Allow UCM to override supplied rates. */
-		fixed_rate = get_fixed_rate(aio);
-		if (fixed_rate > 0) {
-			free(iodev->supported_rates);
-			iodev->supported_rates = (size_t *)malloc(
-				2 * sizeof(iodev->supported_rates[0]));
-			iodev->supported_rates[0] = fixed_rate;
-			iodev->supported_rates[1] = 0;
-		}
-
-		/* Allow UCM to override supported channel counts. */
-		fixed_channels = get_fixed_channels(aio);
-		if (fixed_channels > 0) {
-			free(iodev->supported_channel_counts);
-			iodev->supported_channel_counts = (size_t *)malloc(
-				2 * sizeof(iodev->supported_channel_counts[0]));
-			iodev->supported_channel_counts[0] = fixed_channels;
-			iodev->supported_channel_counts[1] = 0;
-		}
-	}
-	return 0;
-}
-
-/*
- * Builds software volume scalers for output nodes in the device.
- */
-static void build_softvol_scalers(struct alsa_io *aio)
-{
-	struct cras_ionode *ionode;
-
-	DL_FOREACH (aio->base.nodes, ionode) {
-		struct alsa_output_node *aout;
-		const struct cras_volume_curve *curve;
-
-		aout = (struct alsa_output_node *)ionode;
-		curve = get_curve_for_output_node(aio, aout);
-
-		ionode->softvol_scalers = softvol_build_from_curve(curve);
-	}
-}
-
-static void enable_active_ucm(struct alsa_io *aio, int plugged)
-{
-	const struct cras_alsa_jack *jack;
-	const char *name;
-
-	if (aio->base.direction == CRAS_STREAM_OUTPUT) {
-		struct alsa_output_node *active = get_active_output(aio);
-		if (!active)
-			return;
-		name = active->base.name;
-		jack = active->jack;
-	} else {
-		struct alsa_input_node *active = get_active_input(aio);
-		if (!active)
-			return;
-		name = active->base.name;
-		jack = active->jack;
-	}
-
-	if (jack)
-		cras_alsa_jack_enable_ucm(jack, plugged);
-	else if (aio->ucm)
-		ucm_set_enabled(aio->ucm, name, plugged);
-}
-
-static int fill_whole_buffer_with_zeros(struct cras_iodev *iodev)
-{
-	struct alsa_io *aio = (struct alsa_io *)iodev;
-	int rc;
-	uint8_t *dst = NULL;
-	size_t format_bytes;
-
-	/* Fill whole buffer with zeros. */
-	rc = cras_alsa_mmap_get_whole_buffer(aio->handle, &dst);
-
-	if (rc < 0) {
-		syslog(LOG_ERR, "Failed to get whole buffer: %s",
-		       snd_strerror(rc));
-		return rc;
-	}
-
-	format_bytes = cras_get_format_bytes(iodev->format);
-	memset(dst, 0, iodev->buffer_size * format_bytes);
-
-	return 0;
-}
-
-/*
- * Move appl_ptr to min_buffer_level + min_cb_level frames ahead of hw_ptr
- * when resuming from free run.
- */
-static int adjust_appl_ptr_for_leaving_free_run(struct cras_iodev *odev)
-{
-	struct alsa_io *aio = (struct alsa_io *)odev;
-	snd_pcm_uframes_t ahead;
-
-	ahead = odev->min_buffer_level + odev->min_cb_level;
-	return cras_alsa_resume_appl_ptr(aio->handle, ahead);
-}
-
-/*
- * Move appl_ptr to min_buffer_level + min_cb_level * 1.5 frames ahead of
- * hw_ptr when adjusting appl_ptr from underrun.
- */
-static int adjust_appl_ptr_for_underrun(struct cras_iodev *odev)
-{
-	struct alsa_io *aio = (struct alsa_io *)odev;
-	snd_pcm_uframes_t ahead;
-
-	ahead = odev->min_buffer_level + odev->min_cb_level +
-		odev->min_cb_level / 2;
-	return cras_alsa_resume_appl_ptr(aio->handle, ahead);
-}
-
-/* This function is for leaving no-stream state but still not in free run yet.
- * The device may have valid samples remaining. We need to adjust appl_ptr to
- * the correct position, which is MAX(min_cb_level + min_buffer_level,
- * valid_sample) */
-static int adjust_appl_ptr_samples_remaining(struct cras_iodev *odev)
-{
-	struct alsa_io *aio = (struct alsa_io *)odev;
-	int rc;
-	unsigned int real_hw_level, valid_sample, offset;
-	struct timespec hw_tstamp;
-
-	/* Get the amount of valid samples which haven't been played yet.
-	 * The real_hw_level is the real hw_level in device buffer. It doesn't
-	 * subtract min_buffer_level. */
-	valid_sample = 0;
-	rc = odev->frames_queued(odev, &hw_tstamp);
-	if (rc < 0)
-		return rc;
-	real_hw_level = rc;
-
-	/*
-	 * If underrun happened, handle it. Because alsa_output_underrun function
-	 * has already called adjust_appl_ptr, we don't need to call it again.
-	 */
-	if (real_hw_level <= odev->min_buffer_level)
-		return cras_iodev_output_underrun(odev, real_hw_level, 0);
-
-	if (real_hw_level > aio->filled_zeros_for_draining)
-		valid_sample = real_hw_level - aio->filled_zeros_for_draining;
-
-	offset = MAX(odev->min_buffer_level + odev->min_cb_level, valid_sample);
-
-	/* Fill zeros to make sure there are enough zero samples in device buffer.*/
-	if (offset > real_hw_level) {
-		rc = cras_iodev_fill_odev_zeros(odev, offset - real_hw_level);
-		if (rc)
-			return rc;
-	}
-	return cras_alsa_resume_appl_ptr(aio->handle, offset);
-}
-
-static int alsa_output_underrun(struct cras_iodev *odev)
-{
-	int rc;
-
-	/* Fill whole buffer with zeros. This avoids samples left in buffer causing
-	 * noise when device plays them. */
-	rc = fill_whole_buffer_with_zeros(odev);
-	if (rc)
-		return rc;
-	/* Adjust appl_ptr to leave underrun. */
-	return adjust_appl_ptr_for_underrun(odev);
-}
-
-static int possibly_enter_free_run(struct cras_iodev *odev)
-{
-	struct alsa_io *aio = (struct alsa_io *)odev;
-	int rc;
-	unsigned int real_hw_level, fr_to_write;
-	struct timespec hw_tstamp;
-
-	if (aio->free_running)
-		return 0;
-
-	/* Check if all valid samples are played. If all valid samples are played,
-	 * fill whole buffer with zeros. The real_hw_level is the real hw_level in
-	 * device buffer. It doesn't subtract min_buffer_level.*/
-	rc = odev->frames_queued(odev, &hw_tstamp);
-	if (rc < 0)
-		return rc;
-	real_hw_level = rc;
-
-	/* If underrun happened, handle it and enter free run state. */
-	if (real_hw_level <= odev->min_buffer_level) {
-		rc = cras_iodev_output_underrun(odev, real_hw_level, 0);
-		if (rc < 0)
-			return rc;
-		aio->free_running = 1;
-		return 0;
-	}
-
-	if (real_hw_level <= aio->filled_zeros_for_draining ||
-	    real_hw_level == 0) {
-		rc = fill_whole_buffer_with_zeros(odev);
-		if (rc < 0)
-			return rc;
-		aio->free_running = 1;
-		return 0;
-	}
-
-	/* Fill zeros to drain valid samples. */
-	fr_to_write = MIN(cras_time_to_frames(&no_stream_fill_zeros_duration,
-					      odev->format->frame_rate),
-			  odev->buffer_size - real_hw_level);
-	rc = cras_iodev_fill_odev_zeros(odev, fr_to_write);
-	if (rc)
-		return rc;
-	aio->filled_zeros_for_draining += fr_to_write;
-
-	return 0;
-}
-
-static int leave_free_run(struct cras_iodev *odev)
-{
-	struct alsa_io *aio = (struct alsa_io *)odev;
-	int rc;
-
-	/* Restart rate estimation because free run internval should not
-	 * be included. */
-	cras_iodev_reset_rate_estimator(odev);
-
-	if (aio->free_running)
-		rc = adjust_appl_ptr_for_leaving_free_run(odev);
-	else
-		rc = adjust_appl_ptr_samples_remaining(odev);
-	if (rc) {
-		syslog(LOG_ERR, "device %s failed to leave free run, rc = %d",
-		       odev->info.name, rc);
-		return rc;
-	}
-	aio->free_running = 0;
-	aio->filled_zeros_for_draining = 0;
-
-	return 0;
-}
-
-/*
- * Free run state is the optimization of no_stream playback on alsa_io.
- * The whole buffer will be filled with zeros. Device can play these zeros
- * indefinitely. When there is new meaningful sample, appl_ptr should be
- * resumed to some distance ahead of hw_ptr.
- */
-static int no_stream(struct cras_iodev *odev, int enable)
-{
-	if (enable)
-		return possibly_enter_free_run(odev);
-	else
-		return leave_free_run(odev);
-}
-
-static int is_free_running(const struct cras_iodev *odev)
-{
-	struct alsa_io *aio = (struct alsa_io *)odev;
-
-	return aio->free_running;
-}
-
-static unsigned int get_num_severe_underruns(const struct cras_iodev *iodev)
-{
-	const struct alsa_io *aio = (const struct alsa_io *)iodev;
-	return aio->num_severe_underruns;
-}
-
-static void set_default_hotword_model(struct cras_iodev *iodev)
-{
-	const char *default_models[] = { "en_all", "en_us" };
-	cras_node_id_t node_id;
-	unsigned i;
-
-	if (!iodev->active_node ||
-	    iodev->active_node->type != CRAS_NODE_TYPE_HOTWORD)
-		return;
-
-	node_id = cras_make_node_id(iodev->info.idx, iodev->active_node->idx);
-	/* This is a no-op if the default_model is not supported */
-	for (i = 0; i < ARRAY_SIZE(default_models); ++i)
-		if (!cras_iodev_list_set_hotword_model(node_id,
-						       default_models[i]))
-			return;
-}
-
-static int get_valid_frames(struct cras_iodev *odev, struct timespec *tstamp)
-{
-	struct alsa_io *aio = (struct alsa_io *)odev;
-	int rc;
-	unsigned int real_hw_level;
-
-	/*
-	 * Get the amount of valid frames which haven't been played yet.
-	 * The real_hw_level is the real hw_level in device buffer. It doesn't
-	 * subtract min_buffer_level.
-	 */
-	if (aio->free_running) {
-		clock_gettime(CLOCK_MONOTONIC_RAW, tstamp);
-		return 0;
-	}
-
-	rc = odev->frames_queued(odev, tstamp);
-	if (rc < 0)
-		return rc;
-	real_hw_level = rc;
-
-	if (real_hw_level > aio->filled_zeros_for_draining)
-		return real_hw_level - aio->filled_zeros_for_draining;
-
-	return 0;
-}
-
-static int support_noise_cancellation(const struct cras_iodev *iodev)
-{
-	struct alsa_io *aio = (struct alsa_io *)iodev;
-
-	if (!aio->ucm || !iodev->active_node)
-		return 0;
-
-	return ucm_node_noise_cancellation_exists(aio->ucm,
-						  iodev->active_node->name);
-}
-
-/*
- * Exported Interface.
- */
-
-struct cras_iodev *
-alsa_iodev_create(size_t card_index, const char *card_name, size_t device_index,
-		  const char *pcm_name, const char *dev_name,
-		  const char *dev_id, enum CRAS_ALSA_CARD_TYPE card_type,
-		  int is_first, struct cras_alsa_mixer *mixer,
-		  const struct cras_card_config *config,
-		  struct cras_use_case_mgr *ucm, snd_hctl_t *hctl,
-		  enum CRAS_STREAM_DIRECTION direction, size_t usb_vid,
-		  size_t usb_pid, char *usb_serial_number)
-{
-	struct alsa_io *aio;
-	struct cras_iodev *iodev;
-
-	if (direction != CRAS_STREAM_INPUT && direction != CRAS_STREAM_OUTPUT)
-		return NULL;
-
-	aio = (struct alsa_io *)calloc(1, sizeof(*aio));
-	if (!aio)
-		return NULL;
-	iodev = &aio->base;
-	iodev->direction = direction;
-
-	aio->device_index = device_index;
-	aio->card_type = card_type;
-	aio->is_first = is_first;
-	aio->handle = NULL;
-	aio->num_severe_underruns = 0;
-	if (dev_name) {
-		aio->dev_name = strdup(dev_name);
-		if (!aio->dev_name)
-			goto cleanup_iodev;
-	}
-	if (dev_id) {
-		aio->dev_id = strdup(dev_id);
-		if (!aio->dev_id)
-			goto cleanup_iodev;
-	}
-	aio->free_running = 0;
-	aio->filled_zeros_for_draining = 0;
-	aio->has_dependent_dev = 0;
-	aio->pcm_name = strdup(pcm_name);
-	if (aio->pcm_name == NULL)
-		goto cleanup_iodev;
-
-	if (direction == CRAS_STREAM_INPUT) {
-		aio->alsa_stream = SND_PCM_STREAM_CAPTURE;
-		aio->base.set_capture_gain = set_alsa_capture_gain;
-		aio->base.set_capture_mute = set_alsa_capture_gain;
-	} else {
-		aio->alsa_stream = SND_PCM_STREAM_PLAYBACK;
-		aio->base.set_volume = set_alsa_volume;
-		aio->base.set_mute = set_alsa_mute;
-		aio->base.output_underrun = alsa_output_underrun;
-	}
-	iodev->open_dev = open_dev;
-	iodev->configure_dev = configure_dev;
-	iodev->close_dev = close_dev;
-	iodev->update_supported_formats = update_supported_formats;
-	iodev->frames_queued = frames_queued;
-	iodev->delay_frames = delay_frames;
-	iodev->get_buffer = get_buffer;
-	iodev->put_buffer = put_buffer;
-	iodev->flush_buffer = flush_buffer;
-	iodev->start = start;
-	iodev->update_active_node = update_active_node;
-	iodev->update_channel_layout = update_channel_layout;
-	iodev->set_hotword_model = set_hotword_model;
-	iodev->get_hotword_models = get_hotword_models;
-	iodev->no_stream = no_stream;
-	iodev->is_free_running = is_free_running;
-	iodev->get_num_severe_underruns = get_num_severe_underruns;
-	iodev->get_valid_frames = get_valid_frames;
-	iodev->set_swap_mode_for_node = cras_iodev_dsp_set_swap_mode_for_node;
-	iodev->support_noise_cancellation = support_noise_cancellation;
-
-	if (card_type == ALSA_CARD_TYPE_USB)
-		iodev->min_buffer_level = USB_EXTRA_BUFFER_FRAMES;
-
-	iodev->ramp = cras_ramp_create();
-	if (iodev->ramp == NULL)
-		goto cleanup_iodev;
-	iodev->initial_ramp_request = CRAS_IODEV_RAMP_REQUEST_UP_START_PLAYBACK;
-
-	aio->mixer = mixer;
-	aio->config = config;
-	if (direction == CRAS_STREAM_OUTPUT) {
-		aio->default_volume_curve =
-			cras_card_config_get_volume_curve_for_control(
-				config, "Default");
-		if (aio->default_volume_curve == NULL)
-			aio->default_volume_curve =
-				cras_volume_curve_create_default();
-	}
-	aio->ucm = ucm;
-	if (ucm) {
-		unsigned int level;
-		int rc;
-
-		/* Set callback for swap mode if it is supported
-		 * in ucm modifier. */
-		if (ucm_swap_mode_exists(ucm))
-			aio->base.set_swap_mode_for_node =
-				set_alsa_node_swapped;
-
-		rc = ucm_get_min_buffer_level(ucm, &level);
-		if (!rc && direction == CRAS_STREAM_OUTPUT)
-			iodev->min_buffer_level = level;
-	}
-
-	set_iodev_name(iodev, card_name, dev_name, card_index, device_index,
-		       card_type, usb_vid, usb_pid, usb_serial_number);
-
-	aio->jack_list = cras_alsa_jack_list_create(
-		card_index, card_name, device_index, is_first, mixer, ucm, hctl,
-		direction,
-		direction == CRAS_STREAM_OUTPUT ? jack_output_plug_event :
-						  jack_input_plug_event,
-		aio);
-	if (!aio->jack_list)
-		goto cleanup_iodev;
-
-	/* HDMI outputs don't have volume adjustment, do it in software. */
-	if (direction == CRAS_STREAM_OUTPUT && strstr(dev_name, HDMI))
-		iodev->software_volume_needed = 1;
-
-	/* Add this now so that cleanup of the iodev (in case of error or card
-	 * card removal will function as expected. */
-	if (direction == CRAS_STREAM_OUTPUT)
-		cras_iodev_list_add_output(&aio->base);
-	else
-		cras_iodev_list_add_input(&aio->base);
-	return &aio->base;
-
-cleanup_iodev:
-	free_alsa_iodev_resources(aio);
-	free(aio);
-	return NULL;
-}
-
-int alsa_iodev_legacy_complete_init(struct cras_iodev *iodev)
-{
-	struct alsa_io *aio = (struct alsa_io *)iodev;
-	const char *dev_name;
-	const char *dev_id;
-	enum CRAS_STREAM_DIRECTION direction;
-	int err;
-	int is_first;
-	struct cras_alsa_mixer *mixer;
-
-	if (!aio)
-		return -EINVAL;
-	direction = iodev->direction;
-	dev_name = aio->dev_name;
-	dev_id = aio->dev_id;
-	is_first = aio->is_first;
-	mixer = aio->mixer;
-
-	/* Create output nodes for mixer controls, such as Headphone
-	 * and Speaker, only for the first device. */
-	if (direction == CRAS_STREAM_OUTPUT && is_first)
-		cras_alsa_mixer_list_outputs(mixer, new_output_by_mixer_control,
-					     aio);
-	else if (direction == CRAS_STREAM_INPUT && is_first)
-		cras_alsa_mixer_list_inputs(mixer, new_input_by_mixer_control,
-					    aio);
-
-	err = cras_alsa_jack_list_find_jacks_by_name_matching(aio->jack_list);
-	if (err)
-		return err;
-
-	/* Create nodes for jacks that aren't associated with an
-	 * already existing node. Get an initial read of the jacks for
-	 * this device. */
-	cras_alsa_jack_list_report(aio->jack_list);
-
-	/* Make a default node if there is still no node for this
-	 * device, or we still don't have the "Speaker"/"Internal Mic"
-	 * node for the first internal device. Note that the default
-	 * node creation can be supressed by UCM flags for platforms
-	 * which really don't have an internal device. */
-	if ((direction == CRAS_STREAM_OUTPUT) &&
-	    !no_create_default_output_node(aio)) {
-		if (first_internal_device(aio) &&
-		    !has_node(aio, INTERNAL_SPEAKER) && !has_node(aio, HDMI)) {
-			if (strstr(aio->base.info.name, HDMI))
-				new_output(aio, NULL, HDMI);
-			else
-				new_output(aio, NULL, INTERNAL_SPEAKER);
-		} else if (!aio->base.nodes) {
-			new_output(aio, NULL, DEFAULT);
-		}
-	} else if ((direction == CRAS_STREAM_INPUT) &&
-		   !no_create_default_input_node(aio)) {
-		if (first_internal_device(aio) &&
-		    !has_node(aio, INTERNAL_MICROPHONE))
-			new_input(aio, NULL, INTERNAL_MICROPHONE);
-		else if (strstr(dev_name, KEYBOARD_MIC))
-			new_input(aio, NULL, KEYBOARD_MIC);
-		else if (dev_id && strstr(dev_id, HOTWORD_DEV))
-			new_input(aio, NULL, HOTWORD_DEV);
-		else if (!aio->base.nodes)
-			new_input(aio, NULL, DEFAULT);
-	}
-
-	/* Build software volume scalers. */
-	if (direction == CRAS_STREAM_OUTPUT)
-		build_softvol_scalers(aio);
-
-	/* Set the active node as the best node we have now. */
-	alsa_iodev_set_active_node(&aio->base, first_plugged_node(&aio->base),
-				   0);
-
-	/* Set plugged for the first USB device per card when it appears if
-	 * there is no jack reporting plug status. */
-	if (aio->card_type == ALSA_CARD_TYPE_USB && is_first &&
-	    !get_jack_from_node(iodev->active_node))
-		cras_iodev_set_node_plugged(iodev->active_node, 1);
-
-	set_default_hotword_model(iodev);
-
-	/* Record max supported channels into cras_iodev_info. */
-	update_max_supported_channels(iodev);
-
-	return 0;
-}
-
-int alsa_iodev_ucm_add_nodes_and_jacks(struct cras_iodev *iodev,
-				       struct ucm_section *section)
-{
-	struct alsa_io *aio = (struct alsa_io *)iodev;
-	struct mixer_control *control;
-	struct alsa_input_node *input_node = NULL;
-	struct cras_alsa_jack *jack;
-	struct alsa_output_node *output_node = NULL;
-	int rc;
-
-	if (!aio || !section)
-		return -EINVAL;
-
-	/* Allow this section to add as a new node only if the device id
-	 * or dependent device id matches this iodev. */
-	if (((uint32_t)section->dev_idx != aio->device_index) &&
-	    ((uint32_t)section->dependent_dev_idx != aio->device_index))
-		return -EINVAL;
-
-	/* Set flag has_dependent_dev for the case of dependent device. */
-	if (section->dependent_dev_idx != -1)
-		aio->has_dependent_dev = 1;
-
-	/* This iodev is fully specified. Avoid automatic node creation. */
-	aio->fully_specified = 1;
-
-	/* Check here in case the DmaPeriodMicrosecs flag has only been
-	 * specified on one of many device entries with the same PCM. */
-	if (!aio->dma_period_set_microsecs)
-		aio->dma_period_set_microsecs =
-			ucm_get_dma_period_for_dev(aio->ucm, section->name);
-
-	/* Create a node matching this section. If there is a matching
-	 * control use that, otherwise make a node without a control. */
-	control = cras_alsa_mixer_get_control_for_section(aio->mixer, section);
-	if (iodev->direction == CRAS_STREAM_OUTPUT) {
-		output_node = new_output(aio, control, section->name);
-		if (!output_node)
-			return -ENOMEM;
-		output_node->pcm_name = strdup(section->pcm_name);
-	} else if (iodev->direction == CRAS_STREAM_INPUT) {
-		input_node = new_input(aio, control, section->name);
-		if (!input_node)
-			return -ENOMEM;
-		input_node->pcm_name = strdup(section->pcm_name);
-	}
-
-	/* Find any jack controls for this device. */
-	rc = cras_alsa_jack_list_add_jack_for_section(aio->jack_list, section,
-						      &jack);
-	if (rc)
-		return rc;
-
-	/* Associated the jack with the node. */
-	if (jack) {
-		if (output_node) {
-			output_node->jack = jack;
-			if (!output_node->volume_curve)
-				output_node->volume_curve =
-					create_volume_curve_for_jack(
-						aio->config, jack);
-		} else if (input_node) {
-			input_node->jack = jack;
-		}
-	}
-	return 0;
-}
-
-void alsa_iodev_ucm_complete_init(struct cras_iodev *iodev)
-{
-	struct alsa_io *aio = (struct alsa_io *)iodev;
-	struct cras_ionode *node;
-
-	if (!iodev)
-		return;
-
-	/* Get an initial read of the jacks for this device. */
-	cras_alsa_jack_list_report(aio->jack_list);
-
-	/* Build software volume scaler. */
-	if (iodev->direction == CRAS_STREAM_OUTPUT)
-		build_softvol_scalers(aio);
-
-	/* Set the active node as the best node we have now. */
-	alsa_iodev_set_active_node(&aio->base, first_plugged_node(&aio->base),
-				   0);
-
-	/*
-	 * Set plugged for the USB device per card when it appears if
-	 * there is no jack reporting plug status
-	 */
-	if (aio->card_type == ALSA_CARD_TYPE_USB) {
-		DL_FOREACH (iodev->nodes, node) {
-			if (!get_jack_from_node(node))
-				cras_iodev_set_node_plugged(node, 1);
-		}
-	}
-
-	set_default_hotword_model(iodev);
-
-	node = iodev->active_node;
-
-	/* Record max supported channels into cras_iodev_info. */
-	if (node && node->plugged)
-		update_max_supported_channels(iodev);
-}
-
-void alsa_iodev_destroy(struct cras_iodev *iodev)
-{
-	struct alsa_io *aio = (struct alsa_io *)iodev;
-	int rc;
-
-	if (iodev->direction == CRAS_STREAM_INPUT)
-		rc = cras_iodev_list_rm_input(iodev);
-	else
-		rc = cras_iodev_list_rm_output(iodev);
-
-	if (rc == -EBUSY) {
-		syslog(LOG_ERR, "Failed to remove iodev %s", iodev->info.name);
-		return;
-	}
-
-	/* Free resources when device successfully removed. */
-	cras_alsa_jack_list_destroy(aio->jack_list);
-	free_alsa_iodev_resources(aio);
-	cras_volume_curve_destroy(aio->default_volume_curve);
-	free(iodev);
-}
-
-unsigned alsa_iodev_index(struct cras_iodev *iodev)
-{
-	struct alsa_io *aio = (struct alsa_io *)iodev;
-	return aio->device_index;
-}
-
-int alsa_iodev_has_hctl_jacks(struct cras_iodev *iodev)
-{
-	struct alsa_io *aio = (struct alsa_io *)iodev;
-	return cras_alsa_jack_list_has_hctl_jacks(aio->jack_list);
-}
-
-static void alsa_iodev_unmute_node(struct alsa_io *aio,
-				   struct cras_ionode *ionode)
-{
-	struct alsa_output_node *active = (struct alsa_output_node *)ionode;
-	struct mixer_control *mixer = active->mixer_output;
-	struct alsa_output_node *output;
-	struct cras_ionode *node;
-
-	/* If this node is associated with mixer output, unmute the
-	 * active mixer output and mute all others, otherwise just set
-	 * the node as active and set the volume curve. */
-	if (mixer) {
-		/* Unmute the active mixer output, mute all others. */
-		DL_FOREACH (aio->base.nodes, node) {
-			output = (struct alsa_output_node *)node;
-			if (output->mixer_output)
-				cras_alsa_mixer_set_output_active_state(
-					output->mixer_output, node == ionode);
-		}
-	}
-}
-
-static int alsa_iodev_set_active_node(struct cras_iodev *iodev,
-				      struct cras_ionode *ionode,
-				      unsigned dev_enabled)
-{
-	struct alsa_io *aio = (struct alsa_io *)iodev;
-	int rc = 0;
-
-	if (iodev->active_node == ionode)
-		goto skip;
-
-	/* Disable jack ucm before switching node. */
-	enable_active_ucm(aio, 0);
-	if (dev_enabled && (iodev->direction == CRAS_STREAM_OUTPUT))
-		alsa_iodev_unmute_node(aio, ionode);
-
-	cras_iodev_set_active_node(iodev, ionode);
-	aio->base.dsp_name = get_active_dsp_name(aio);
-	cras_iodev_update_dsp(iodev);
-skip:
-	enable_active_ucm(aio, dev_enabled);
-	if (ionode->type == CRAS_NODE_TYPE_HOTWORD) {
-		if (dev_enabled) {
-			rc = ucm_enable_hotword_model(aio->ucm);
-			if (rc < 0)
-				return rc;
-		} else
-			ucm_disable_all_hotword_models(aio->ucm);
-	}
-	/* Setting the volume will also unmute if the system isn't muted. */
-	init_device_settings(aio);
-	return 0;
-}
diff --git a/cras/src/server/cras_alsa_io.h b/cras/src/server/cras_alsa_io.h
deleted file mode 100644
index f8e613d..0000000
--- a/cras/src/server/cras_alsa_io.h
+++ /dev/null
@@ -1,88 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_ALSA_IO_H_
-#define CRAS_ALSA_IO_H_
-
-#include <alsa/asoundlib.h>
-
-#include "cras_card_config.h"
-#include "cras_types.h"
-
-struct cras_alsa_mixer;
-struct cras_ionode;
-struct cras_use_case_mgr;
-struct ucm_section;
-
-/* Initializes an alsa iodev.
- * Args:
- *    card_index - 0 based index, value of "XX" in "hw:XX,YY".
- *    card_name - The name of the card.
- *    device_index - 0 based index, value of "YY" in "hw:XX,YY".
- *    pcm_name - The pcm name passing to snd_pcm_open(), e.g hw:0,0
- *    dev_name - The name of the device.
- *    dev_id - The id string of the device.
- *    card_type - the type of the card this iodev belongs.
- *    is_first - if this is the first iodev on the card.
- *    mixer - The mixer for the alsa device.
- *    config - Card config for this alsa device.
- *    ucm - CRAS use case manager if available.
- *    hctl - high-level control manager if available.
- *    direction - input or output.
- *    usb_vid - vendor ID of USB device.
- *    usb_pid - product ID of USB device.
- *    usb_serial_number - serial number of USB device.
- * Returns:
- *    A pointer to the newly created iodev if successful, NULL otherwise.
- */
-struct cras_iodev *
-alsa_iodev_create(size_t card_index, const char *card_name, size_t device_index,
-		  const char *pcm_name, const char *dev_name,
-		  const char *dev_id, enum CRAS_ALSA_CARD_TYPE card_type,
-		  int is_first, struct cras_alsa_mixer *mixer,
-		  const struct cras_card_config *config,
-		  struct cras_use_case_mgr *ucm, snd_hctl_t *hctl,
-		  enum CRAS_STREAM_DIRECTION direction, size_t usb_vid,
-		  size_t usb_pid, char *usb_serial_number);
-
-/* Complete initializeation of this iodev with the legacy method.
- * Add IO nodes and find jacks for this iodev with magic sauce, then choose
- * the current active node.
- * Args:
- *    iodev - ALSA io device associated with the IO nodes.
- *    section - UCM section information if available (or NULL).
- * Returns:
- *    0 for success, negative error code on error.
- */
-int alsa_iodev_legacy_complete_init(struct cras_iodev *iodev);
-
-/* Add IO nodes and jacks for this iodev using UCM data.
- * Args:
- *    iodev - ALSA io device associated with the given section.
- *    section - UCM section information.
- * Returns:
- *    0 for success, negative error code on error.
- */
-int alsa_iodev_ucm_add_nodes_and_jacks(struct cras_iodev *iodev,
-				       struct ucm_section *section);
-
-/* Complete initialization of this iodev with fully-spec UCM data.
- * After all UCM devices associated with the same iodev have been processed
- * this is called to finish iodev setup.
- * Args:
- *    iodev - ALSA io device.
- */
-void alsa_iodev_ucm_complete_init(struct cras_iodev *iodev);
-
-/* Destroys an alsa_iodev created with alsa_iodev_create. */
-void alsa_iodev_destroy(struct cras_iodev *iodev);
-
-/* Returns the ALSA device index for the given ALSA iodev. */
-unsigned alsa_iodev_index(struct cras_iodev *iodev);
-
-/* Returns whether this IODEV has ALSA hctl jacks. */
-int alsa_iodev_has_hctl_jacks(struct cras_iodev *iodev);
-
-#endif /* CRAS_ALSA_IO_H_ */
diff --git a/cras/src/server/cras_alsa_jack.c b/cras/src/server/cras_alsa_jack.c
deleted file mode 100644
index 6d4d7bf..0000000
--- a/cras/src/server/cras_alsa_jack.c
+++ /dev/null
@@ -1,1243 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <alsa/asoundlib.h>
-#include <linux/input.h>
-#include <regex.h>
-#include <syslog.h>
-
-#include "cras_alsa_jack.h"
-#include "cras_alsa_mixer.h"
-#include "cras_alsa_ucm.h"
-#include "cras_system_state.h"
-#include "cras_gpio_jack.h"
-#include "cras_tm.h"
-#include "cras_util.h"
-#include "edid_utils.h"
-#include "utlist.h"
-
-static const unsigned int DISPLAY_INFO_RETRY_DELAY_MS = 200;
-static const unsigned int DISPLAY_INFO_MAX_RETRIES = 10;
-static const unsigned int DISPLAY_INFO_GPIO_MAX_RETRIES = 25;
-
-/* Constants used to retrieve monitor name from ELD buffer. */
-static const unsigned int ELD_MNL_MASK = 31;
-static const unsigned int ELD_MNL_OFFSET = 4;
-static const unsigned int ELD_MONITOR_NAME_OFFSET = 20;
-
-/* Keeps an fd that is registered with system settings.  A list of fds must be
- * kept so that they can be removed when the jack list is destroyed. */
-struct jack_poll_fd {
-	int fd;
-	struct jack_poll_fd *prev, *next;
-};
-
-/* cras_gpio_jack:  Describes headphone & microphone jack connected to GPIO
- *
- *   On Arm-based systems, the headphone & microphone jacks are
- *   connected to GPIOs which are plumbed through the /dev/input/event
- *   system.  For these jacks, the software is written to open the
- *   corresponding /dev/input/event file and monitor it for 'insert' &
- *   'remove' activity.
- *
- *   fd           : File descriptor corresponding to the /dev/input/event file.
- *
- *   switch_event : Indicates the type of the /dev/input/event file.
- *                  Either SW_HEADPHONE_INSERT, or SW_MICROPHONE_INSERT.
- *
- *   current_state: 0 -> device not plugged in
- *                  1 -> device plugged in
- *   device_name  : Device name extracted from /dev/input/event[0..9]+.
- *                  Allocated on heap; must free.
- */
-struct cras_gpio_jack {
-	int fd;
-	unsigned switch_event;
-	unsigned current_state;
-	char *device_name;
-};
-
-/* Represents a single alsa Jack, e.g. "Headphone Jack" or "Mic Jack".
- *    is_gpio: 1 -> gpio switch (union field: gpio)
- *             0 -> Alsa 'jack' (union field: elem)
- *    elem - alsa hcontrol element for this jack, when is_gpio == 0.
- *    gpio - description of gpio-based jack, when is_gpio != 0.
- *    eld_control - mixer control for ELD info buffer.
- *    jack_list - list of jacks this belongs to.
- *    mixer_output - mixer output control used to control audio to this jack.
- *        This will be null for input jacks.
- *    mixer_input - mixer input control used to control audio to this jack.
- *        This will be null for output jacks.
- *    ucm_device - Name of the ucm device if found, otherwise, NULL.
- *    edid_file - File to read the EDID from (if available, HDMI only).
- *    display_info_timer - Timer used to poll display info for HDMI jacks.
- *    display_info_retries - Number of times to retry reading display info.
- *
- *    mixer_output/mixer_input fields are only used to find the node for this
- *    jack. These are not used for setting volume or mute. There should be a
- *    1:1 map between node and jack. node->jack follows the pointer; jack->node
- *    is done by either searching node->jack pointers or searching the node that
- *    has the same mixer_control as the jack.
- */
-struct cras_alsa_jack {
-	unsigned is_gpio; /* !0 -> 'gpio' valid
-			   *  0 -> 'elem' valid
-			   */
-	union {
-		snd_hctl_elem_t *elem;
-		struct cras_gpio_jack gpio;
-	};
-
-	snd_hctl_elem_t *eld_control;
-	struct cras_alsa_jack_list *jack_list;
-	struct mixer_control *mixer_output;
-	struct mixer_control *mixer_input;
-	char *ucm_device;
-	const char *override_type_name;
-	const char *edid_file;
-	struct cras_timer *display_info_timer;
-	unsigned int display_info_retries;
-	struct cras_alsa_jack *prev, *next;
-};
-
-/* Contains all Jacks for a given device.
- *    hctl - alsa hcontrol for this device's card
- *         - not opened by the jack list.
- *    mixer - cras mixer for the card providing this device.
- *    ucm - CRAS use case manager if available.
- *    card_index - Index ALSA uses to refer to the card.  The X in "hw:X".
- *    card_name - The name of the card.
- *    device_index - Index ALSA uses to refer to the device.  The Y in "hw:X,Y".
- *    is_first_device - whether this device is the first device on the card.
- *    direction - Input or output.
- *    change_callback - function to call when the state of a jack changes.
- *    callback_data - data to pass back to the callback.
- *    jacks - list of jacks for this device.
- */
-struct cras_alsa_jack_list {
-	snd_hctl_t *hctl;
-	struct cras_alsa_mixer *mixer;
-	struct cras_use_case_mgr *ucm;
-	unsigned int card_index;
-	const char *card_name;
-	size_t device_index;
-	int is_first_device;
-	enum CRAS_STREAM_DIRECTION direction;
-	jack_state_change_callback *change_callback;
-	void *callback_data;
-	struct cras_alsa_jack *jacks;
-};
-
-/* Used to contain information needed while looking through GPIO jacks.
- *    jack_list - The current jack_list.
- *    section - An associated UCM section.
- *    result_jack - The resulting jack.
- *    rc - The return code for the operation.
- */
-struct gpio_switch_list_data {
-	struct cras_alsa_jack_list *jack_list;
-	struct ucm_section *section;
-	struct cras_alsa_jack *result_jack;
-	int rc;
-};
-
-/*
- * Local Helpers.
- */
-
-#define BITS_PER_BYTE (8)
-#define BITS_PER_LONG (sizeof(long) * BITS_PER_BYTE)
-#define NBITS(x) ((((x)-1) / BITS_PER_LONG) + 1)
-#define OFF(x) ((x) % BITS_PER_LONG)
-#define BIT(x) (1UL << OFF(x))
-#define LONG(x) ((x) / BITS_PER_LONG)
-#define IS_BIT_SET(bit, array) !!((array[LONG(bit)]) & (1UL << OFF(bit)))
-
-static int sys_input_get_switch_state(int fd, unsigned sw, unsigned *state)
-{
-	unsigned long bits[NBITS(SW_CNT)];
-	const unsigned long switch_no = sw;
-
-	memset(bits, '\0', sizeof(bits));
-	/* If switch event present & supported, get current state. */
-	if (gpio_switch_eviocgbit(fd, bits, sizeof(bits)) < 0)
-		return -EIO;
-
-	if (IS_BIT_SET(switch_no, bits))
-		if (gpio_switch_eviocgsw(fd, bits, sizeof(bits)) >= 0) {
-			*state = IS_BIT_SET(switch_no, bits);
-			return 0;
-		}
-
-	return -1;
-}
-
-static inline struct cras_alsa_jack *cras_alloc_jack(int is_gpio)
-{
-	struct cras_alsa_jack *jack = calloc(1, sizeof(*jack));
-	if (jack == NULL)
-		return NULL;
-	jack->is_gpio = is_gpio;
-	return jack;
-}
-
-static void cras_free_jack(struct cras_alsa_jack *jack, int rm_select_fd)
-{
-	if (!jack)
-		return;
-
-	free(jack->ucm_device);
-	free((void *)jack->edid_file);
-	if (jack->display_info_timer)
-		cras_tm_cancel_timer(cras_system_state_get_tm(),
-				     jack->display_info_timer);
-
-	if (jack->is_gpio) {
-		free(jack->gpio.device_name);
-		if (jack->gpio.fd >= 0) {
-			if (rm_select_fd)
-				cras_system_rm_select_fd(jack->gpio.fd);
-			close(jack->gpio.fd);
-		}
-	}
-
-	/*
-	 * Remove the jack callback set on hctl. Otherwise, snd_hctl_close will
-	 * trigger a callback while iodev might already be destroyed.
-	 */
-	if (!jack->is_gpio && jack->elem)
-		snd_hctl_elem_set_callback(jack->elem, NULL);
-
-	free((void *)jack->override_type_name);
-	free(jack);
-}
-
-/* Gets the current plug state of the jack */
-static int get_jack_current_state(struct cras_alsa_jack *jack)
-{
-	snd_ctl_elem_value_t *elem_value;
-
-	if (jack->is_gpio)
-		return jack->gpio.current_state;
-
-	snd_ctl_elem_value_alloca(&elem_value);
-	snd_hctl_elem_read(jack->elem, elem_value);
-
-	return snd_ctl_elem_value_get_boolean(elem_value, 0);
-}
-
-static int read_jack_edid(const struct cras_alsa_jack *jack, uint8_t *edid)
-{
-	int fd, nread;
-
-	fd = open(jack->edid_file, O_RDONLY);
-	if (fd < 0)
-		return -1;
-
-	nread = read(fd, edid, EEDID_SIZE);
-	close(fd);
-
-	if (nread < EDID_SIZE || !edid_valid(edid))
-		return -1;
-	return 0;
-}
-
-static int check_jack_edid(struct cras_alsa_jack *jack)
-{
-	uint8_t edid[EEDID_SIZE];
-
-	if (read_jack_edid(jack, edid))
-		return -1;
-
-	/* If the jack supports EDID, check that it supports audio, clearing
-	 * the plugged state if it doesn't.
-	 */
-	if (!edid_lpcm_support(edid, edid[EDID_EXT_FLAG]))
-		jack->gpio.current_state = 0;
-	return 0;
-}
-
-static int get_jack_edid_monitor_name(const struct cras_alsa_jack *jack,
-				      char *buf, unsigned int buf_size)
-{
-	uint8_t edid[EEDID_SIZE];
-
-	if (read_jack_edid(jack, edid))
-		return -1;
-
-	return edid_get_monitor_name(edid, buf, buf_size);
-}
-
-/* Checks the ELD control of the jack to see if the ELD buffer
- * is ready to read and report the plug status.
- */
-static int check_jack_eld(struct cras_alsa_jack *jack)
-{
-	snd_ctl_elem_info_t *elem_info;
-	snd_ctl_elem_info_alloca(&elem_info);
-
-	/* Poll ELD control by getting the count of ELD buffer.
-	 * When seeing zero buffer count, retry after a delay until
-	 * it's ready or reached the max number of retries. */
-	if (snd_hctl_elem_info(jack->eld_control, elem_info) != 0)
-		return -1;
-	if (snd_ctl_elem_info_get_count(elem_info) == 0)
-		return -1;
-	return 0;
-}
-
-static void display_info_delay_cb(struct cras_timer *timer, void *arg);
-
-/* Callback function doing following things:
- * 1. Reset timer and update max number of retries.
- * 2. Check all conditions to see if it's okay or needed to
- *    report jack status directly. E.g. jack is unplugged or
- *    EDID is not ready for some reason.
- * 3. Check if max number of retries is reached and decide
- *    to set timer for next callback or report jack state.
- */
-static inline void jack_state_change_cb(struct cras_alsa_jack *jack, int retry)
-{
-	struct cras_tm *tm = cras_system_state_get_tm();
-
-	if (jack->display_info_timer) {
-		cras_tm_cancel_timer(tm, jack->display_info_timer);
-		jack->display_info_timer = NULL;
-	}
-	if (retry) {
-		jack->display_info_retries =
-			jack->is_gpio ? DISPLAY_INFO_GPIO_MAX_RETRIES :
-					DISPLAY_INFO_MAX_RETRIES;
-	}
-
-	if (!get_jack_current_state(jack))
-		goto report_jack_state;
-
-	/* If there is an edid file, check it.  If it is ready continue, if we
-	 * need to try again later, return here as the timer has been armed and
-	 * will check again later.
-	 */
-	if (jack->edid_file == NULL && jack->eld_control == NULL)
-		goto report_jack_state;
-	if (jack->edid_file && (check_jack_edid(jack) == 0))
-		goto report_jack_state;
-	if (jack->eld_control && (check_jack_eld(jack) == 0))
-		goto report_jack_state;
-
-	if (--jack->display_info_retries == 0) {
-		if (jack->is_gpio)
-			jack->gpio.current_state = 0;
-		if (jack->edid_file)
-			syslog(LOG_ERR, "Timeout to read EDID from %s",
-			       jack->edid_file);
-		goto report_jack_state;
-	}
-
-	jack->display_info_timer = cras_tm_create_timer(
-		tm, DISPLAY_INFO_RETRY_DELAY_MS, display_info_delay_cb, jack);
-	return;
-
-report_jack_state:
-	jack->jack_list->change_callback(jack, get_jack_current_state(jack),
-					 jack->jack_list->callback_data);
-}
-
-/* gpio_switch_initial_state
- *
- *   Determines the initial state of a gpio-based switch.
- */
-static void gpio_switch_initial_state(struct cras_alsa_jack *jack)
-{
-	unsigned v;
-	int r = sys_input_get_switch_state(jack->gpio.fd,
-					   jack->gpio.switch_event, &v);
-	jack->gpio.current_state = r == 0 ? v : 0;
-	jack_state_change_cb(jack, 1);
-}
-
-/* Check if the input event is an audio switch event. */
-static inline int is_audio_switch_event(const struct input_event *ev,
-					int sw_code)
-{
-	return (ev->type == EV_SW && ev->code == sw_code);
-}
-
-/* Timer callback to read display info after a hotplug event for an HDMI jack.
- */
-static void display_info_delay_cb(struct cras_timer *timer, void *arg)
-{
-	struct cras_alsa_jack *jack = (struct cras_alsa_jack *)arg;
-
-	jack->display_info_timer = NULL;
-	jack_state_change_cb(jack, 0);
-}
-
-/* gpio_switch_callback
- *
- *   This callback is invoked whenever the associated /dev/input/event
- *   file has data to read.  Perform autoswitching to / from the
- *   associated device when data is available.
- */
-static void gpio_switch_callback(void *arg, int events)
-{
-	struct cras_alsa_jack *jack = arg;
-	int i;
-	int r;
-	struct input_event ev[64];
-
-	r = gpio_switch_read(jack->gpio.fd, ev,
-			     ARRAY_SIZE(ev) * sizeof(struct input_event));
-	if (r < 0)
-		return;
-
-	for (i = 0; i < r / sizeof(struct input_event); ++i)
-		if (is_audio_switch_event(&ev[i], jack->gpio.switch_event)) {
-			jack->gpio.current_state = ev[i].value;
-
-			jack_state_change_cb(jack, 1);
-		}
-}
-
-/* Determines if the GPIO jack should be associated with the device of the
- * jack list. If the device name is not specified in UCM (common case),
- * assume it should be associated with the first input device or the first
- * output device on the card.
- */
-static unsigned int
-gpio_jack_match_device(const struct cras_alsa_jack *jack,
-		       struct cras_alsa_jack_list *jack_list,
-		       enum CRAS_STREAM_DIRECTION direction)
-{
-	int target_dev_idx;
-
-	/* If the device name is not specified in UCM, assume it should be
-	 * associated with device 0. */
-	if (!jack_list->ucm || !jack->ucm_device)
-		return jack_list->is_first_device;
-
-	/* If jack has valid ucm_device, that means this jack has already been
-	 * associated to this card. Next step to match device index on this
-	 * card. */
-	target_dev_idx = ucm_get_alsa_dev_idx_for_dev(
-		jack_list->ucm, jack->ucm_device, direction);
-
-	if (target_dev_idx < 0)
-		return jack_list->is_first_device;
-
-	syslog(LOG_DEBUG,
-	       "Matching GPIO jack, target device idx: %d, "
-	       "current card name: %s, device index: %zu\n",
-	       target_dev_idx, jack_list->card_name, jack_list->device_index);
-
-	return (target_dev_idx == jack_list->device_index);
-}
-
-static int create_jack_for_gpio(struct cras_alsa_jack_list *jack_list,
-				const char *pathname, const char *dev_name,
-				unsigned switch_event,
-				struct cras_alsa_jack **out_jack)
-{
-	struct cras_alsa_jack *jack;
-	unsigned long bits[NBITS(SW_CNT)];
-	const char *card_name = jack_list->card_name;
-	int r;
-
-	if (!out_jack)
-		return -EINVAL;
-	*out_jack = NULL;
-
-	jack = cras_alloc_jack(1);
-	if (jack == NULL)
-		return -ENOMEM;
-
-	jack->gpio.fd = gpio_switch_open(pathname);
-	if (jack->gpio.fd == -1) {
-		r = -EIO;
-		goto error;
-	}
-
-	jack->gpio.switch_event = switch_event;
-	jack->jack_list = jack_list;
-	jack->gpio.device_name = strdup(dev_name);
-	if (!jack->gpio.device_name) {
-		r = -ENOMEM;
-		goto error;
-	}
-
-	if (!strstr(jack->gpio.device_name, card_name) ||
-	    (gpio_switch_eviocgbit(jack->gpio.fd, bits, sizeof(bits)) < 0) ||
-	    !IS_BIT_SET(switch_event, bits)) {
-		r = -EIO;
-		goto error;
-	}
-
-	*out_jack = jack;
-	return 0;
-
-error:
-	/* Not yet registered with system select. */
-	cras_free_jack(jack, 0);
-	return r;
-}
-
-/* Take ownership and finish setup of the jack.
- * Add the jack to the jack_list if everything goes well, or destroy it.
- */
-static int cras_complete_gpio_jack(struct gpio_switch_list_data *data,
-				   struct cras_alsa_jack *jack,
-				   unsigned switch_event)
-{
-	struct cras_alsa_jack_list *jack_list = data->jack_list;
-	int r;
-
-	if (jack->ucm_device) {
-		jack->edid_file = ucm_get_edid_file_for_dev(jack_list->ucm,
-							    jack->ucm_device);
-	}
-
-	r = sys_input_get_switch_state(jack->gpio.fd, switch_event,
-				       &jack->gpio.current_state);
-	if (r < 0) {
-		cras_free_jack(jack, 0);
-		return -EIO;
-	}
-	r = cras_system_add_select_fd(jack->gpio.fd, gpio_switch_callback, jack,
-				      POLLIN);
-	if (r < 0) {
-		/* Not yet registered with system select. */
-		cras_free_jack(jack, 0);
-		return r;
-	}
-
-	DL_APPEND(jack_list->jacks, jack);
-	if (!data->result_jack)
-		data->result_jack = jack;
-	else if (data->section)
-		syslog(LOG_ERR, "More than one jack for SectionDevice '%s'.",
-		       data->section->name);
-	return 0;
-}
-
-/* open_and_monitor_gpio:
- *
- *   Opens a /dev/input/event file associated with a headphone /
- *   microphone jack and watches it for activity.
- *   Returns 0 when a jack has been successfully added.
- */
-static int open_and_monitor_gpio(struct gpio_switch_list_data *data,
-				 const char *pathname, const char *dev_name,
-				 unsigned switch_event)
-{
-	struct cras_alsa_jack *jack;
-	struct cras_alsa_jack_list *jack_list = data->jack_list;
-	enum CRAS_STREAM_DIRECTION direction = jack_list->direction;
-	int r;
-
-	r = create_jack_for_gpio(jack_list, pathname, dev_name, switch_event,
-				 &jack);
-	if (r != 0)
-		return r;
-
-	if (jack_list->ucm)
-		jack->ucm_device = ucm_get_dev_for_jack(
-			jack_list->ucm, jack->gpio.device_name, direction);
-
-	if (!gpio_jack_match_device(jack, jack_list, direction)) {
-		cras_free_jack(jack, 0);
-		return -EIO;
-	}
-
-	if (direction == CRAS_STREAM_OUTPUT &&
-	    (strstr(jack->gpio.device_name, "Headphone") ||
-	     strstr(jack->gpio.device_name, "Headset")))
-		jack->mixer_output = cras_alsa_mixer_get_output_matching_name(
-			jack_list->mixer, "Headphone");
-	else if (direction == CRAS_STREAM_OUTPUT &&
-		 strstr(jack->gpio.device_name, "HDMI"))
-		jack->mixer_output = cras_alsa_mixer_get_output_matching_name(
-			jack_list->mixer, "HDMI");
-
-	if (jack->ucm_device && direction == CRAS_STREAM_INPUT) {
-		char *control_name;
-		control_name = ucm_get_cap_control(jack->jack_list->ucm,
-						   jack->ucm_device);
-		if (control_name)
-			jack->mixer_input =
-				cras_alsa_mixer_get_input_matching_name(
-					jack_list->mixer, control_name);
-	}
-
-	return cras_complete_gpio_jack(data, jack, switch_event);
-}
-
-static int
-open_and_monitor_gpio_with_section(struct gpio_switch_list_data *data,
-				   const char *pathname, unsigned switch_event)
-{
-	struct cras_alsa_jack *jack;
-	struct cras_alsa_jack_list *jack_list = data->jack_list;
-	struct ucm_section *section = data->section;
-	enum CRAS_STREAM_DIRECTION direction = jack_list->direction;
-	int r;
-
-	r = create_jack_for_gpio(jack_list, pathname, section->jack_name,
-				 switch_event, &jack);
-	if (r != 0)
-		return r;
-
-	jack->ucm_device = strdup(section->name);
-	if (!jack->ucm_device) {
-		cras_free_jack(jack, 0);
-		return -ENOMEM;
-	}
-
-	if (direction == CRAS_STREAM_OUTPUT)
-		jack->mixer_output = cras_alsa_mixer_get_control_for_section(
-			jack_list->mixer, section);
-	else if (direction == CRAS_STREAM_INPUT)
-		jack->mixer_input = cras_alsa_mixer_get_control_for_section(
-			jack_list->mixer, section);
-
-	return cras_complete_gpio_jack(data, jack, switch_event);
-}
-
-/* Monitor GPIO switches for this jack_list.
- * Args:
- *    data - Data for GPIO switch search.
- *    dev_path - Device full path.
- *    dev_name - Device name.
- * Returns:
- *    0 for success, or negative on error. Assumes success if no jack is
- *    found, or if the jack could not be accessed.
- */
-static int gpio_switches_monitor_device(struct gpio_switch_list_data *data,
-					const char *dev_path,
-					const char *dev_name)
-{
-	static const int out_switches[] = { SW_HEADPHONE_INSERT,
-					    SW_LINEOUT_INSERT };
-	static const int in_switches[] = { SW_MICROPHONE_INSERT };
-	int sw;
-	const int *switches = out_switches;
-	int num_switches = ARRAY_SIZE(out_switches);
-	int success = 1;
-	int rc = 0;
-
-	if (data->section && data->section->jack_switch >= 0) {
-		switches = &data->section->jack_switch;
-		num_switches = 1;
-	} else if (data->jack_list->direction == CRAS_STREAM_INPUT) {
-		switches = in_switches;
-		num_switches = ARRAY_SIZE(in_switches);
-	}
-
-	/* Assume that -EIO is returned for jacks that we shouldn't
-	 * be looking at, but stop trying if we run into another
-	 * type of error.
-	 */
-	for (sw = 0; (rc == 0 || rc == -EIO) && sw < num_switches; sw++) {
-		if (data->section)
-			rc = open_and_monitor_gpio_with_section(data, dev_path,
-								switches[sw]);
-		else
-			rc = open_and_monitor_gpio(data, dev_path, dev_name,
-						   switches[sw]);
-		if (rc != 0 && rc != -EIO)
-			success = 0;
-	}
-
-	if (success)
-		return 0;
-	return rc;
-}
-
-static int gpio_switch_list_with_section(const char *dev_path,
-					 const char *dev_name, void *arg)
-{
-	struct gpio_switch_list_data *data =
-		(struct gpio_switch_list_data *)arg;
-
-	if (strcmp(dev_name, data->section->jack_name)) {
-		/* No match: continue searching. */
-		return 0;
-	}
-
-	data->rc = gpio_switches_monitor_device(data, dev_path, dev_name);
-	/* Found the only possible match: stop searching. */
-	return 1;
-}
-
-/* Match the given jack name to the given regular expression.
- * Args:
- *    jack_name - The jack's name.
- *    re - Regular expression string.
- * Returns:
- *    Non-zero for success, or 0 for failure.
- */
-static int jack_matches_regex(const char *jack_name, const char *re)
-{
-	regmatch_t m[1];
-	regex_t regex;
-	int rc;
-
-	rc = regcomp(&regex, re, REG_EXTENDED);
-	if (rc != 0) {
-		syslog(LOG_ERR, "Failed to compile regular expression: %s", re);
-		return 0;
-	}
-
-	rc = regexec(&regex, jack_name, ARRAY_SIZE(m), m, 0) == 0;
-	regfree(&regex);
-	return rc;
-}
-
-static int gpio_switch_list_by_matching(const char *dev_path,
-					const char *dev_name, void *arg)
-{
-	struct gpio_switch_list_data *data =
-		(struct gpio_switch_list_data *)arg;
-
-	if (data->jack_list->direction == CRAS_STREAM_INPUT) {
-		if (!jack_matches_regex(dev_name, "^.*Mic Jack$") &&
-		    !jack_matches_regex(dev_name, "^.*Headset Jack$")) {
-			/* Continue searching. */
-			return 0;
-		}
-	} else if (data->jack_list->direction == CRAS_STREAM_OUTPUT) {
-		if (!jack_matches_regex(dev_name, "^.*Headphone Jack$") &&
-		    !jack_matches_regex(dev_name, "^.*Headset Jack$") &&
-		    !jack_matches_regex(dev_name, "^.*HDMI Jack$")) {
-			/* Continue searching. */
-			return 0;
-		}
-	}
-
-	data->rc = gpio_switches_monitor_device(data, dev_path, dev_name);
-	/* Stop searching for failure. */
-	return data->rc;
-}
-
-/* Find ELD control for HDMI/DP gpio jack. */
-static snd_hctl_elem_t *find_eld_control_by_dev_index(snd_hctl_t *hctl,
-						      unsigned int dev_idx)
-{
-	static const char eld_control_name[] = "ELD";
-	snd_ctl_elem_id_t *elem_id;
-
-	snd_ctl_elem_id_alloca(&elem_id);
-	snd_ctl_elem_id_clear(elem_id);
-	snd_ctl_elem_id_set_interface(elem_id, SND_CTL_ELEM_IFACE_PCM);
-	snd_ctl_elem_id_set_device(elem_id, dev_idx);
-	snd_ctl_elem_id_set_name(elem_id, eld_control_name);
-	return snd_hctl_find_elem(hctl, elem_id);
-}
-
-/* For non-gpio jack, check if it's of type hdmi/dp by
- * matching jack name. */
-static int is_jack_hdmi_dp(const char *jack_name)
-{
-	// TODO(hychao): Use the information provided in UCM instead of
-	// name matching.
-	static const char *hdmi_dp = "HDMI";
-	return !!strstr(jack_name, hdmi_dp);
-}
-
-/* Find GPIO jacks for this jack_list.
- * Args:
- *    jack_list - Jack list to add to.
- *    section - UCM section.
- *    result_jack - Filled with a pointer to the resulting cras_alsa_jack.
- * Returns:
- *    0 for success, or negative on error. Assumes success if no jack is
- *    found, or if the jack could not be accessed.
- */
-static int find_gpio_jacks(struct cras_alsa_jack_list *jack_list,
-			   struct ucm_section *section,
-			   struct cras_alsa_jack **result_jack)
-{
-	/* GPIO switches are on Arm-based machines, and are
-	 * only associated with on-board devices.
-	 */
-	struct gpio_switch_list_data data;
-	int rc;
-
-	rc = wait_for_dev_input_access();
-	if (rc != 0) {
-		syslog(LOG_WARNING, "Could not access /dev/input/event0: %s",
-		       strerror(rc));
-		return 0;
-	}
-
-	data.jack_list = jack_list;
-	data.section = section;
-	data.result_jack = NULL;
-	data.rc = 0;
-
-	if (section)
-		gpio_switch_list_for_each(gpio_switch_list_with_section, &data);
-	else
-		gpio_switch_list_for_each(gpio_switch_list_by_matching, &data);
-	if (result_jack) {
-		*result_jack = data.result_jack;
-
-		/* Find ELD control only for HDMI/DP gpio jack. */
-		if (*result_jack &&
-		    is_jack_hdmi_dp((*result_jack)->gpio.device_name))
-			(*result_jack)->eld_control =
-				find_eld_control_by_dev_index(
-					jack_list->hctl,
-					jack_list->device_index);
-	}
-	return data.rc;
-}
-
-/* Callback from alsa when a jack control changes.  This is registered with
- * snd_hctl_elem_set_callback in find_jack_controls and run by calling
- * snd_hctl_handle_events in alsa_control_event_pending below.
- * Args:
- *    elem - The ALSA control element that has changed.
- *    mask - unused.
- */
-static int hctl_jack_cb(snd_hctl_elem_t *elem, unsigned int mask)
-{
-	const char *name;
-	snd_ctl_elem_value_t *elem_value;
-	struct cras_alsa_jack *jack;
-
-	jack = snd_hctl_elem_get_callback_private(elem);
-	if (jack == NULL) {
-		syslog(LOG_ERR, "Invalid jack from control event.");
-		return -EINVAL;
-	}
-
-	snd_ctl_elem_value_alloca(&elem_value);
-	snd_hctl_elem_read(elem, elem_value);
-	name = snd_hctl_elem_get_name(elem);
-
-	syslog(LOG_DEBUG, "Jack %s %s", name,
-	       snd_ctl_elem_value_get_boolean(elem_value, 0) ? "plugged" :
-							       "unplugged");
-	jack_state_change_cb(jack, 1);
-	return 0;
-}
-
-/* Determines the device associated with this jack if any.  If the device cannot
- * be determined (common case), assume device 0. */
-static unsigned int hctl_jack_device_index(const char *name)
-{
-	/* Look for the substring 'pcm=<device number>' in the element name. */
-	static const char pcm_search[] = "pcm=";
-	const char *substr;
-	int device_index;
-
-	substr = strstr(name, pcm_search);
-	if (substr == NULL)
-		return 0;
-	substr += ARRAY_SIZE(pcm_search) - 1;
-	if (*substr == '\0')
-		return 0;
-	device_index = atoi(substr);
-	if (device_index < 0)
-		return 0;
-	return (unsigned int)device_index;
-}
-
-/* Checks if the given control name is in the supplied list of possible jack
- * control base names. */
-static int is_jack_control_in_list(const char *const *list,
-				   unsigned int list_length,
-				   const char *control_name)
-{
-	unsigned int i;
-
-	for (i = 0; i < list_length; i++)
-		if (strncmp(control_name, list[i], strlen(list[i])) == 0)
-			return 1;
-	return 0;
-}
-
-/* Check if the given name is a jack created for the connector control of a
- * input/output terminal entity on a USB Audio Class 2.0 device. */
-static int is_jack_uac2(const char *jack_name,
-			enum CRAS_STREAM_DIRECTION direction)
-{
-	return jack_matches_regex(jack_name, direction == CRAS_STREAM_OUTPUT ?
-						     "^.* - Output Jack$" :
-						     "^.* - Input Jack$");
-}
-
-/* Looks for any JACK controls.  Monitors any found controls for changes and
- * decides to route based on plug/unlpug events. */
-static int find_jack_controls(struct cras_alsa_jack_list *jack_list)
-{
-	snd_hctl_elem_t *elem;
-	struct cras_alsa_jack *jack;
-	const char *name;
-	static const char *const output_jack_base_names[] = {
-		"Headphone Jack",
-		"Front Headphone Jack",
-		"HDMI/DP",
-		"Speaker Phantom Jack",
-	};
-	static const char *const input_jack_base_names[] = {
-		"Mic Jack",
-	};
-	const char *const *jack_names;
-	unsigned int num_jack_names;
-
-	if (!jack_list->hctl) {
-		syslog(LOG_WARNING, "Can't search hctl for jacks.");
-		return 0;
-	}
-
-	if (jack_list->direction == CRAS_STREAM_OUTPUT) {
-		jack_names = output_jack_base_names;
-		num_jack_names = ARRAY_SIZE(output_jack_base_names);
-	} else {
-		jack_names = input_jack_base_names;
-		num_jack_names = ARRAY_SIZE(input_jack_base_names);
-	}
-
-	for (elem = snd_hctl_first_elem(jack_list->hctl); elem != NULL;
-	     elem = snd_hctl_elem_next(elem)) {
-		snd_ctl_elem_iface_t iface;
-
-		iface = snd_hctl_elem_get_interface(elem);
-		if (iface != SND_CTL_ELEM_IFACE_CARD)
-			continue;
-		name = snd_hctl_elem_get_name(elem);
-		if (!is_jack_control_in_list(jack_names, num_jack_names,
-					     name) &&
-		    !is_jack_uac2(name, jack_list->direction))
-			continue;
-		if (hctl_jack_device_index(name) != jack_list->device_index)
-			continue;
-
-		jack = cras_alloc_jack(0);
-		if (jack == NULL)
-			return -ENOMEM;
-		jack->elem = elem;
-		jack->jack_list = jack_list;
-		DL_APPEND(jack_list->jacks, jack);
-
-		snd_hctl_elem_set_callback(elem, hctl_jack_cb);
-		snd_hctl_elem_set_callback_private(elem, jack);
-
-		if (jack_list->direction == CRAS_STREAM_OUTPUT)
-			jack->mixer_output =
-				cras_alsa_mixer_get_output_matching_name(
-					jack_list->mixer, name);
-		if (jack_list->ucm)
-			jack->ucm_device = ucm_get_dev_for_jack(
-				jack_list->ucm, name, jack_list->direction);
-
-		if (jack->ucm_device &&
-		    jack_list->direction == CRAS_STREAM_INPUT) {
-			char *control_name;
-			control_name = ucm_get_cap_control(jack->jack_list->ucm,
-							   jack->ucm_device);
-			if (control_name)
-				jack->mixer_input =
-					cras_alsa_mixer_get_input_matching_name(
-						jack_list->mixer, control_name);
-		}
-
-		if (jack->ucm_device) {
-			jack->override_type_name = ucm_get_override_type_name(
-				jack->jack_list->ucm, jack->ucm_device);
-		}
-	}
-
-	/* Look up ELD controls */
-	DL_FOREACH (jack_list->jacks, jack) {
-		if (jack->is_gpio || jack->eld_control)
-			continue;
-		name = snd_hctl_elem_get_name(jack->elem);
-		if (!is_jack_hdmi_dp(name))
-			continue;
-
-		jack->eld_control = find_eld_control_by_dev_index(
-			jack_list->hctl, jack_list->device_index);
-	}
-
-	return 0;
-}
-
-/*
- * Exported Interface.
- */
-
-int cras_alsa_jack_list_find_jacks_by_name_matching(
-	struct cras_alsa_jack_list *jack_list)
-{
-	int rc;
-
-	rc = find_jack_controls(jack_list);
-	if (rc != 0)
-		return rc;
-
-	return find_gpio_jacks(jack_list, NULL, NULL);
-}
-
-static int find_hctl_jack_for_section(struct cras_alsa_jack_list *jack_list,
-				      struct ucm_section *section,
-				      struct cras_alsa_jack **result_jack)
-{
-	snd_hctl_elem_t *elem;
-	snd_ctl_elem_id_t *elem_id;
-	struct cras_alsa_jack *jack;
-
-	if (!jack_list->hctl) {
-		syslog(LOG_WARNING, "Can't search hctl for jacks.");
-		return -ENODEV;
-	}
-
-	snd_ctl_elem_id_alloca(&elem_id);
-	snd_ctl_elem_id_clear(elem_id);
-	snd_ctl_elem_id_set_interface(elem_id, SND_CTL_ELEM_IFACE_CARD);
-	snd_ctl_elem_id_set_device(elem_id, jack_list->device_index);
-	snd_ctl_elem_id_set_name(elem_id, section->jack_name);
-	elem = snd_hctl_find_elem(jack_list->hctl, elem_id);
-	if (!elem)
-		return -ENOENT;
-
-	syslog(LOG_DEBUG, "Found Jack: %s for %s", section->jack_name,
-	       section->name);
-
-	jack = cras_alloc_jack(0);
-	if (jack == NULL)
-		return -ENOMEM;
-	jack->elem = elem;
-	jack->jack_list = jack_list;
-
-	jack->ucm_device = strdup(section->name);
-	if (!jack->ucm_device) {
-		free(jack);
-		return -ENOMEM;
-	}
-	if (jack_list->direction == CRAS_STREAM_OUTPUT)
-		jack->mixer_output = cras_alsa_mixer_get_control_for_section(
-			jack_list->mixer, section);
-	else if (jack_list->direction == CRAS_STREAM_INPUT)
-		jack->mixer_input = cras_alsa_mixer_get_control_for_section(
-			jack_list->mixer, section);
-
-	snd_hctl_elem_set_callback(elem, hctl_jack_cb);
-	snd_hctl_elem_set_callback_private(elem, jack);
-	DL_APPEND(jack_list->jacks, jack);
-	if (result_jack)
-		*result_jack = jack;
-
-	if (!strcmp(jack->ucm_device, "HDMI") ||
-	    !strcmp(jack->ucm_device, "DP"))
-		return 0;
-
-	/* Look up ELD control. */
-	jack->eld_control = find_eld_control_by_dev_index(
-		jack_list->hctl, jack_list->device_index);
-	return 0;
-}
-
-/*
- * Exported Interface.
- */
-
-int cras_alsa_jack_list_add_jack_for_section(
-	struct cras_alsa_jack_list *jack_list, struct ucm_section *ucm_section,
-	struct cras_alsa_jack **result_jack)
-{
-	if (result_jack)
-		*result_jack = NULL;
-	if (!ucm_section)
-		return -EINVAL;
-
-	if (!ucm_section->jack_name) {
-		/* No jacks defined for this device. */
-		return 0;
-	}
-
-	if (!ucm_section->jack_type) {
-		syslog(LOG_ERR,
-		       "Must specify the JackType for jack '%s' in '%s'.",
-		       ucm_section->jack_name, ucm_section->name);
-		return -EINVAL;
-	}
-
-	if (!strcmp(ucm_section->jack_type, "hctl")) {
-		return find_hctl_jack_for_section(jack_list, ucm_section,
-						  result_jack);
-	} else if (!strcmp(ucm_section->jack_type, "gpio")) {
-		return find_gpio_jacks(jack_list, ucm_section, result_jack);
-	} else {
-		syslog(LOG_ERR, "Invalid JackType '%s' in '%s'.",
-		       ucm_section->jack_type, ucm_section->name);
-		return -EINVAL;
-	}
-}
-
-struct cras_alsa_jack_list *
-cras_alsa_jack_list_create(unsigned int card_index, const char *card_name,
-			   unsigned int device_index, int is_first_device,
-			   struct cras_alsa_mixer *mixer,
-			   struct cras_use_case_mgr *ucm, snd_hctl_t *hctl,
-			   enum CRAS_STREAM_DIRECTION direction,
-			   jack_state_change_callback *cb, void *cb_data)
-{
-	struct cras_alsa_jack_list *jack_list;
-
-	if (direction != CRAS_STREAM_INPUT && direction != CRAS_STREAM_OUTPUT)
-		return NULL;
-
-	jack_list = (struct cras_alsa_jack_list *)calloc(1, sizeof(*jack_list));
-	if (jack_list == NULL)
-		return NULL;
-
-	jack_list->change_callback = cb;
-	jack_list->callback_data = cb_data;
-	jack_list->mixer = mixer;
-	jack_list->ucm = ucm;
-	jack_list->hctl = hctl;
-	jack_list->card_index = card_index;
-	jack_list->card_name = card_name;
-	jack_list->device_index = device_index;
-	jack_list->is_first_device = is_first_device;
-	jack_list->direction = direction;
-
-	return jack_list;
-}
-
-void cras_alsa_jack_list_destroy(struct cras_alsa_jack_list *jack_list)
-{
-	struct cras_alsa_jack *jack;
-
-	if (jack_list == NULL)
-		return;
-	DL_FOREACH (jack_list->jacks, jack) {
-		DL_DELETE(jack_list->jacks, jack);
-		cras_free_jack(jack, 1);
-	}
-	free(jack_list);
-}
-
-int cras_alsa_jack_list_has_hctl_jacks(struct cras_alsa_jack_list *jack_list)
-{
-	struct cras_alsa_jack *jack;
-
-	if (!jack_list)
-		return 0;
-	DL_FOREACH (jack_list->jacks, jack) {
-		if (!jack->is_gpio)
-			return 1;
-	}
-	return 0;
-}
-
-struct mixer_control *
-cras_alsa_jack_get_mixer_output(const struct cras_alsa_jack *jack)
-{
-	if (jack == NULL)
-		return NULL;
-	return jack->mixer_output;
-}
-
-struct mixer_control *
-cras_alsa_jack_get_mixer_input(const struct cras_alsa_jack *jack)
-{
-	return jack ? jack->mixer_input : NULL;
-}
-
-void cras_alsa_jack_list_report(const struct cras_alsa_jack_list *jack_list)
-{
-	struct cras_alsa_jack *jack;
-
-	if (jack_list == NULL)
-		return;
-
-	DL_FOREACH (jack_list->jacks, jack)
-		if (jack->is_gpio)
-			gpio_switch_initial_state(jack);
-		else
-			hctl_jack_cb(jack->elem, 0);
-}
-
-const char *cras_alsa_jack_get_name(const struct cras_alsa_jack *jack)
-{
-	if (jack == NULL)
-		return NULL;
-	if (jack->is_gpio)
-		return jack->gpio.device_name;
-	return snd_hctl_elem_get_name(jack->elem);
-}
-
-const char *cras_alsa_jack_get_ucm_device(const struct cras_alsa_jack *jack)
-{
-	return jack->ucm_device;
-}
-
-void cras_alsa_jack_update_monitor_name(const struct cras_alsa_jack *jack,
-					char *name_buf, unsigned int buf_size)
-{
-	snd_ctl_elem_value_t *elem_value;
-	snd_ctl_elem_info_t *elem_info;
-	const char *buf = NULL;
-	int count;
-	int mnl = 0;
-
-	if (!jack->eld_control) {
-		if (jack->edid_file)
-			get_jack_edid_monitor_name(jack, name_buf, buf_size);
-		return;
-	}
-
-	snd_ctl_elem_info_alloca(&elem_info);
-	if (snd_hctl_elem_info(jack->eld_control, elem_info) < 0)
-		goto fallback_jack_name;
-
-	count = snd_ctl_elem_info_get_count(elem_info);
-	if (count <= ELD_MNL_OFFSET)
-		goto fallback_jack_name;
-
-	snd_ctl_elem_value_alloca(&elem_value);
-	if (snd_hctl_elem_read(jack->eld_control, elem_value) < 0)
-		goto fallback_jack_name;
-
-	buf = (const char *)snd_ctl_elem_value_get_bytes(elem_value);
-	mnl = buf[ELD_MNL_OFFSET] & ELD_MNL_MASK;
-
-	if (count < ELD_MONITOR_NAME_OFFSET + mnl)
-		goto fallback_jack_name;
-
-	/* Note that monitor name string does not contain terminate character.
-	 * Check monitor name length with name buffer size.
-	 */
-	if (mnl >= buf_size)
-		mnl = buf_size - 1;
-	strncpy(name_buf, buf + ELD_MONITOR_NAME_OFFSET, mnl);
-	name_buf[mnl] = '\0';
-
-	return;
-
-fallback_jack_name:
-	buf = cras_alsa_jack_get_name(jack);
-	strncpy(name_buf, buf, buf_size - 1);
-
-	return;
-}
-
-void cras_alsa_jack_update_node_type(const struct cras_alsa_jack *jack,
-				     enum CRAS_NODE_TYPE *type)
-{
-	if (!jack->override_type_name)
-		return;
-	if (!strcmp(jack->override_type_name, "Internal Speaker"))
-		*type = CRAS_NODE_TYPE_INTERNAL_SPEAKER;
-	return;
-}
-
-void cras_alsa_jack_enable_ucm(const struct cras_alsa_jack *jack, int enable)
-{
-	if (jack && jack->ucm_device)
-		ucm_set_enabled(jack->jack_list->ucm, jack->ucm_device, enable);
-}
diff --git a/cras/src/server/cras_alsa_jack.h b/cras/src/server/cras_alsa_jack.h
deleted file mode 100644
index 9f35459..0000000
--- a/cras/src/server/cras_alsa_jack.h
+++ /dev/null
@@ -1,155 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- *
- * Handles finding and monitoring ALSA Jack controls.  These controls represent
- * external jacks and report back when the plugged state of teh hack changes.
- */
-
-#ifndef CRAS_ALSA_JACK_H_
-#define CRAS_ALSA_JACK_H_
-
-#include "cras_types.h"
-#include "cras_alsa_ucm.h"
-
-struct cras_alsa_jack;
-struct cras_alsa_jack_list;
-struct cras_alsa_mixer;
-
-/* Callback type for users of jack_list to define, it will be called when the
- * jack state changes.
- * Args:
- *    jack - The jack that has changed.
- *    plugged - non-zero if the jack is attached.
- *    data - User defined pointer passed to cras_alsa_jack_create.
- */
-typedef void(jack_state_change_callback)(const struct cras_alsa_jack *jack,
-					 int plugged, void *data);
-
-/* Creates a jack list. The jacks can be added later by name matching or
- * fully specified UCM.
- * Args:
- *    card_index - Index ALSA uses to refer to the card.  The X in "hw:X".
- *    card_name - The name of the card (used to find gpio jacks).
- *    device_index - Index ALSA uses to refer to the device.  The Y in "hw:X".
- *    is_first_device - whether this device is the first device on the card.
- *    mixer - The mixer associated with this card, used to find controls that
- *      correspond to jacks.  For instance "Headphone switch" for "Headphone
- *      Jack".
- *    ucm - CRAS use case manager if available.
- *    hctl - ALSA high-level control interface if available.
- *    direction - Input or output, look for mic or headphone jacks.
- *    cb - Function to call when a jack state changes.
- *    cb_data - Passed to the callback when called.
- * Returns:
- *    A pointer to a new jack list on success, NULL if there is a failure.
- */
-struct cras_alsa_jack_list *
-cras_alsa_jack_list_create(unsigned int card_index, const char *card_name,
-			   unsigned int device_index, int is_first_device,
-			   struct cras_alsa_mixer *mixer,
-			   struct cras_use_case_mgr *ucm, snd_hctl_t *hctl,
-			   enum CRAS_STREAM_DIRECTION direction,
-			   jack_state_change_callback *cb, void *cb_data);
-
-/* Finds jacks by name matching.
- * The list holds all the interesting ALSA jacks for this
- * device. These jacks will be for headphones, speakers, HDMI, etc.
- * Args:
- *   jack_list - A pointer to a jack list.
- * Returns:
- *   0 on success. Error code if there is a failure.
- */
-int cras_alsa_jack_list_find_jacks_by_name_matching(
-	struct cras_alsa_jack_list *jack_list);
-
-/* Add the jack defined by the UCM section information.
- * Args:
- *   jack_list - A pointer to a jack list.
- *   ucm_section - UCM section data.
- *   result_jack - Resulting jack that was added.
- * Returns:
- *   0 on success. Error code if there is a failure.
- */
-int cras_alsa_jack_list_add_jack_for_section(
-	struct cras_alsa_jack_list *jack_list, struct ucm_section *ucm_section,
-	struct cras_alsa_jack **result_jack);
-
-/* Destroys a jack list created with cras_alsa_jack_list_create.
- * Args:
- *    jack_list - The list to destroy.
- */
-void cras_alsa_jack_list_destroy(struct cras_alsa_jack_list *jack_list);
-
-/* Returns non-zero if the jack list has hctl jacks.
- * Args:
- *    jack_list - The list check.
- */
-int cras_alsa_jack_list_has_hctl_jacks(struct cras_alsa_jack_list *jack_list);
-
-/* Gets the mixer output associated with the given jack.
- * Args:
- *    jack - The jack to query for a mixer output.
- * Returns:
- *    A pointer to the mixer output if it exists, otherwise NULL.
- */
-struct mixer_control *
-cras_alsa_jack_get_mixer_output(const struct cras_alsa_jack *jack);
-
-/* Gets the mixer input associated with given jack.
- * Args:
- *    jack - The jack to query for a mixer input.
- * Returns:
- *    A pointer to the mixer input if it exists, otherwise NULL.
- */
-struct mixer_control *
-cras_alsa_jack_get_mixer_input(const struct cras_alsa_jack *jack);
-
-/* Query all jacks in the list and report the state to the callback.
- * Args:
- *    jack_list - The jack list to query.
- */
-void cras_alsa_jack_list_report(const struct cras_alsa_jack_list *jack_list);
-
-/* Gets the name of a jack.
- * Args:
- *    jack_list - The jack list to query.
- */
-const char *cras_alsa_jack_get_name(const struct cras_alsa_jack *jack);
-
-/* Gets the ucm device of a jack.
- * Args:
- *    jack - The alsa jack.
- */
-const char *cras_alsa_jack_get_ucm_device(const struct cras_alsa_jack *jack);
-
-void cras_alsa_jack_update_monitor_name(const struct cras_alsa_jack *jack,
-					char *name_buf, unsigned int buf_size);
-
-/* Updates the node type according to override_type_name in jack.
- * Currently this method only supports updating the node type to
- * CRAS_NODE_TYPE_INTERNAL_SPEAKER when override_type_name is
- * "Internal Speaker". This is used in All-In-One device where
- * output is an HDMI device, but it should be internal speaker from
- * user point of view.
- * Args:
- *    jack - The jack to query node type.
- *    type - The node type to be overwritten.
- */
-void cras_alsa_jack_update_node_type(const struct cras_alsa_jack *jack,
-				     enum CRAS_NODE_TYPE *type);
-
-/* Enables the ucm device for this jack if any.
- * Args:
- *    jack - The jack to query for a mixer output.
- */
-void cras_alsa_jack_enable_ucm(const struct cras_alsa_jack *jack, int enable);
-
-/* Find out whether the specified card has a jack with the given name.
- * Args:
- *    card_index - Index ALSA uses to refer to the card.  The X in "hw:X".
- *    jack_name - The name of the jack (for example, "Speaker Phantom Jack").
- */
-int cras_alsa_jack_exists(unsigned int card_index, const char *jack_name);
-
-#endif /* CRAS_ALSA_JACK_H_ */
diff --git a/cras/src/server/cras_alsa_mixer.c b/cras/src/server/cras_alsa_mixer.c
deleted file mode 100644
index 3379d95..0000000
--- a/cras/src/server/cras_alsa_mixer.c
+++ /dev/null
@@ -1,1174 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <alsa/asoundlib.h>
-#include <limits.h>
-#include <stdio.h>
-#include <syslog.h>
-
-#include "cras_alsa_mixer.h"
-#include "cras_alsa_mixer_name.h"
-#include "cras_alsa_ucm.h"
-#include "cras_util.h"
-#include "utlist.h"
-
-#define MIXER_CONTROL_VOLUME_DB_INVALID LONG_MAX
-
-/* Represents an ALSA control element. Each device can have several of these,
- * each potentially having independent volume and mute controls.
- * elem - ALSA mixer element.
- * has_volume - non-zero indicates there is a volume control.
- * has_mute - non-zero indicates there is a mute switch.
- * max_volume_dB - the maximum volume for this control, or
- *                 MIXER_CONTROL_VOLUME_DB_INVALID.
- * min_volume_dB - the minimum volume for this control, or
- *                 MIXER_CONTROL_VOLUME_DB_INVALID.
- */
-struct mixer_control_element {
-	snd_mixer_elem_t *elem;
-	int has_volume;
-	int has_mute;
-	long max_volume_dB;
-	long min_volume_dB;
-	struct mixer_control_element *prev, *next;
-};
-
-/* Represents an ALSA control element related to a specific input/output
- * node such as speakers or headphones. A device can have several of these,
- * each potentially having independent volume and mute controls.
- *
- * Each will have at least one mixer_control_element. For cases where there
- * are separate control elements for left/right channels (for example),
- * additional mixer_control_elements are added.
- *
- * For controls with volume it is assumed that all elements have the same
- * range.
- *
- * name - Name of the control (typicially this is the same as the name of the
- *        mixer_control_element when there is one, or the name of the UCM
- *        parent when there are multiple).
- * dir - Control direction, OUTPUT or INPUT only.
- * elements - The mixer_control_elements that are driven by this control.
- * has_volume - non-zero indicates there is a volume control.
- * has_mute - non-zero indicates there is a mute switch.
- * max_volume_dB - Maximum volume available in the volume control.
- * min_volume_dB - Minimum volume available in the volume control.
- */
-struct mixer_control {
-	const char *name;
-	enum CRAS_STREAM_DIRECTION dir;
-	struct mixer_control_element *elements;
-	int has_volume;
-	int has_mute;
-	long max_volume_dB;
-	long min_volume_dB;
-	struct mixer_control *prev, *next;
-};
-
-/* Holds a reference to the opened mixer and the volume controls.
- * mixer - Pointer to the opened alsa mixer.
- * main_volume_controls - List of volume controls (normally 'Master' and 'PCM').
- * playback_switch - Switch used to mute the device.
- * main_capture_controls - List of capture gain controls (normally 'Capture').
- * capture_switch - Switch used to mute the capture stream.
- * max_volume_dB - Maximum volume available in main volume controls.  The dBFS
- *   value setting will be applied relative to this.
- * min_volume_dB - Minimum volume available in main volume controls.
- */
-struct cras_alsa_mixer {
-	snd_mixer_t *mixer;
-	struct mixer_control *main_volume_controls;
-	struct mixer_control *output_controls;
-	snd_mixer_elem_t *playback_switch;
-	struct mixer_control *main_capture_controls;
-	struct mixer_control *input_controls;
-	snd_mixer_elem_t *capture_switch;
-	long max_volume_dB;
-	long min_volume_dB;
-};
-
-/* Wrapper for snd_mixer_open and helpers.
- * Args:
- *    mixdev - Name of the device to open the mixer for.
- *    mixer - Pointer filled with the opened mixer on success, NULL on failure.
- */
-static void alsa_mixer_open(const char *mixdev, snd_mixer_t **mixer)
-{
-	int rc;
-
-	*mixer = NULL;
-	rc = snd_mixer_open(mixer, 0);
-	if (rc < 0) {
-		syslog(LOG_ERR, "snd_mixer_open: %d: %s", rc, strerror(-rc));
-		return;
-	}
-	rc = snd_mixer_attach(*mixer, mixdev);
-	if (rc < 0) {
-		syslog(LOG_ERR, "snd_mixer_attach: %d: %s", rc, strerror(-rc));
-		goto fail_after_open;
-	}
-	rc = snd_mixer_selem_register(*mixer, NULL, NULL);
-	if (rc < 0) {
-		syslog(LOG_ERR, "snd_mixer_selem_register: %d: %s", rc,
-		       strerror(-rc));
-		goto fail_after_open;
-	}
-	rc = snd_mixer_load(*mixer);
-	if (rc < 0) {
-		syslog(LOG_ERR, "snd_mixer_load: %d: %s", rc, strerror(-rc));
-		goto fail_after_open;
-	}
-	return;
-
-fail_after_open:
-	snd_mixer_close(*mixer);
-	*mixer = NULL;
-}
-
-static struct mixer_control_element *
-mixer_control_element_create(snd_mixer_elem_t *elem,
-			     enum CRAS_STREAM_DIRECTION dir)
-{
-	struct mixer_control_element *c;
-	long min, max;
-
-	if (!elem)
-		return NULL;
-
-	c = (struct mixer_control_element *)calloc(1, sizeof(*c));
-	if (!c) {
-		syslog(LOG_ERR, "No memory for mixer_control_elem.");
-		return NULL;
-	}
-
-	c->elem = elem;
-	c->max_volume_dB = MIXER_CONTROL_VOLUME_DB_INVALID;
-	c->min_volume_dB = MIXER_CONTROL_VOLUME_DB_INVALID;
-
-	if (dir == CRAS_STREAM_OUTPUT) {
-		c->has_mute = snd_mixer_selem_has_playback_switch(elem);
-
-		if (snd_mixer_selem_has_playback_volume(elem) &&
-		    snd_mixer_selem_get_playback_dB_range(elem, &min, &max) ==
-			    0) {
-			c->max_volume_dB = max;
-			c->min_volume_dB = min;
-			c->has_volume = 1;
-		}
-	} else if (dir == CRAS_STREAM_INPUT) {
-		c->has_mute = snd_mixer_selem_has_capture_switch(elem);
-
-		if (snd_mixer_selem_has_capture_volume(elem) &&
-		    snd_mixer_selem_get_capture_dB_range(elem, &min, &max) ==
-			    0) {
-			c->max_volume_dB = max;
-			c->min_volume_dB = min;
-			c->has_volume = 1;
-		}
-	}
-
-	return c;
-}
-
-static void mixer_control_destroy(struct mixer_control *control)
-{
-	struct mixer_control_element *elem;
-
-	if (!control)
-		return;
-
-	DL_FOREACH (control->elements, elem) {
-		DL_DELETE(control->elements, elem);
-		free(elem);
-	}
-	if (control->name)
-		free((void *)control->name);
-	free(control);
-}
-
-static void mixer_control_destroy_list(struct mixer_control *control_list)
-{
-	struct mixer_control *control;
-	if (!control_list)
-		return;
-	DL_FOREACH (control_list, control) {
-		DL_DELETE(control_list, control);
-		mixer_control_destroy(control);
-	}
-}
-
-static int mixer_control_add_element(struct mixer_control *control,
-				     snd_mixer_elem_t *snd_elem)
-{
-	struct mixer_control_element *elem;
-
-	if (!control)
-		return -EINVAL;
-
-	elem = mixer_control_element_create(snd_elem, control->dir);
-	if (!elem)
-		return -ENOMEM;
-
-	DL_APPEND(control->elements, elem);
-
-	if (elem->has_volume) {
-		if (!control->has_volume)
-			control->has_volume = 1;
-
-		/* Assume that all elements have a common volume range, and
-		 * that both min and max values are valid if one of the two
-		 * is valid. */
-		if (control->min_volume_dB == MIXER_CONTROL_VOLUME_DB_INVALID) {
-			control->min_volume_dB = elem->min_volume_dB;
-			control->max_volume_dB = elem->max_volume_dB;
-		} else if (control->min_volume_dB != elem->min_volume_dB ||
-			   control->max_volume_dB != elem->max_volume_dB) {
-			syslog(LOG_WARNING,
-			       "Element '%s' of control '%s' has different"
-			       "volume range: [%ld:%ld] ctrl: [%ld:%ld]",
-			       snd_mixer_selem_get_name(elem->elem),
-			       control->name, elem->min_volume_dB,
-			       elem->max_volume_dB, control->min_volume_dB,
-			       control->max_volume_dB);
-		}
-	}
-
-	if (elem->has_mute && !control->has_mute)
-		control->has_mute = 1;
-	return 0;
-}
-
-static int mixer_control_create(struct mixer_control **control,
-				const char *name, snd_mixer_elem_t *elem,
-				enum CRAS_STREAM_DIRECTION dir)
-{
-	struct mixer_control *c;
-	int rc = 0;
-
-	if (!control)
-		return -EINVAL;
-
-	c = (struct mixer_control *)calloc(1, sizeof(*c));
-	if (!c) {
-		syslog(LOG_ERR, "No memory for mixer_control: %s", name);
-		rc = -ENOMEM;
-		goto error;
-	}
-
-	c->dir = dir;
-	c->min_volume_dB = MIXER_CONTROL_VOLUME_DB_INVALID;
-	c->max_volume_dB = MIXER_CONTROL_VOLUME_DB_INVALID;
-
-	if (!name && elem)
-		name = snd_mixer_selem_get_name(elem);
-	if (!name) {
-		syslog(LOG_ERR, "Control does not have a name.");
-		rc = -EINVAL;
-		goto error;
-	}
-
-	c->name = strdup(name);
-	if (!c->name) {
-		syslog(LOG_ERR, "No memory for control's name: %s", name);
-		rc = -ENOMEM;
-		goto error;
-	}
-
-	if (elem && (rc = mixer_control_add_element(c, elem)))
-		goto error;
-
-	*control = c;
-	return 0;
-
-error:
-	mixer_control_destroy(c);
-	*control = NULL;
-	return rc;
-}
-
-/* Creates a mixer_control by finding mixer element names in simple mixer
- * interface.
- * Args:
- *    control[out] - Storage for resulting pointer to mixer_control.
- *    cmix[in] - Parent alsa mixer.
- *    name[in] - Optional name of the control. Input NULL to take the name of
- *               the first element from mixer_names.
- *    mixer_names[in] - Names of the ASLA mixer control elements. Must not
- *                      be empty.
- *    dir[in] - Control direction: CRAS_STREAM_OUTPUT or CRAS_STREAM_INPUT.
- * Returns:
- *    Returns 0 for success, negative error code otherwise. *control is
- *    initialized to NULL on error, or has a valid pointer for success.
- */
-static int mixer_control_create_by_name(struct mixer_control **control,
-					struct cras_alsa_mixer *cmix,
-					const char *name,
-					struct mixer_name *mixer_names,
-					enum CRAS_STREAM_DIRECTION dir)
-{
-	snd_mixer_selem_id_t *sid;
-	snd_mixer_elem_t *elem;
-	struct mixer_control *c;
-	struct mixer_name *m_name;
-	int rc;
-
-	if (!control)
-		return -EINVAL;
-	*control = NULL;
-	if (!mixer_names)
-		return -EINVAL;
-	if (!name) {
-		/* Assume that we're using the first name in the list of mixer
-		 * names. */
-		name = mixer_names->name;
-	}
-
-	rc = mixer_control_create(&c, name, NULL, dir);
-	if (rc)
-		return rc;
-
-	snd_mixer_selem_id_malloc(&sid);
-
-	DL_FOREACH (mixer_names, m_name) {
-		snd_mixer_selem_id_set_index(sid, 0);
-		snd_mixer_selem_id_set_name(sid, m_name->name);
-		elem = snd_mixer_find_selem(cmix->mixer, sid);
-		if (!elem) {
-			mixer_control_destroy(c);
-			snd_mixer_selem_id_free(sid);
-			syslog(LOG_ERR, "Unable to find simple control %s, 0",
-			       m_name->name);
-			return -ENOENT;
-		}
-		rc = mixer_control_add_element(c, elem);
-		if (rc) {
-			mixer_control_destroy(c);
-			snd_mixer_selem_id_free(sid);
-			return rc;
-		}
-	}
-
-	snd_mixer_selem_id_free(sid);
-	*control = c;
-	return 0;
-}
-
-static int mixer_control_set_dBFS(const struct mixer_control *control,
-				  long to_set)
-{
-	const struct mixer_control_element *elem = NULL;
-	int rc = -EINVAL;
-	if (!control)
-		return rc;
-	DL_FOREACH (control->elements, elem) {
-		if (elem->has_volume) {
-			if (control->dir == CRAS_STREAM_OUTPUT)
-				rc = snd_mixer_selem_set_playback_dB_all(
-					elem->elem, to_set, 1);
-			else if (control->dir == CRAS_STREAM_INPUT)
-				rc = snd_mixer_selem_set_capture_dB_all(
-					elem->elem, to_set, 1);
-			if (rc)
-				break;
-			syslog(LOG_DEBUG, "%s:%s volume set to %ld",
-			       control->name,
-			       snd_mixer_selem_get_name(elem->elem), to_set);
-		}
-	}
-	if (rc && elem) {
-		syslog(LOG_ERR, "Failed to set volume of '%s:%s': %d",
-		       control->name, snd_mixer_selem_get_name(elem->elem), rc);
-	}
-	return rc;
-}
-
-static int mixer_control_get_dBFS(const struct mixer_control *control,
-				  long *to_get)
-{
-	const struct mixer_control_element *elem = NULL;
-	int rc = -EINVAL;
-	if (!control || !to_get)
-		return -EINVAL;
-	DL_FOREACH (control->elements, elem) {
-		if (elem->has_volume) {
-			if (control->dir == CRAS_STREAM_OUTPUT)
-				rc = snd_mixer_selem_get_playback_dB(
-					elem->elem, SND_MIXER_SCHN_FRONT_LEFT,
-					to_get);
-			else if (control->dir == CRAS_STREAM_INPUT)
-				rc = snd_mixer_selem_get_capture_dB(
-					elem->elem, SND_MIXER_SCHN_FRONT_LEFT,
-					to_get);
-			/* Assume all of the elements of this control have
-			 * the same value. */
-			break;
-		}
-	}
-	if (rc && elem) {
-		syslog(LOG_ERR, "Failed to get volume of '%s:%s': %d",
-		       control->name, snd_mixer_selem_get_name(elem->elem), rc);
-	}
-	return rc;
-}
-
-static int mixer_control_set_mute(const struct mixer_control *control,
-				  int muted)
-{
-	const struct mixer_control_element *elem = NULL;
-	int rc = -EINVAL;
-	if (!control)
-		return -EINVAL;
-	DL_FOREACH (control->elements, elem) {
-		if (elem->has_mute) {
-			if (control->dir == CRAS_STREAM_OUTPUT)
-				rc = snd_mixer_selem_set_playback_switch_all(
-					elem->elem, !muted);
-			else if (control->dir == CRAS_STREAM_INPUT)
-				rc = snd_mixer_selem_set_capture_switch_all(
-					elem->elem, !muted);
-			if (rc)
-				break;
-		}
-	}
-	if (rc && elem) {
-		syslog(LOG_ERR, "Failed to mute '%s:%s': %d", control->name,
-		       snd_mixer_selem_get_name(elem->elem), rc);
-	}
-	return rc;
-}
-
-/* Adds the main volume control to the list and grabs the first seen playback
- * switch to use for mute. */
-static int add_main_volume_control(struct cras_alsa_mixer *cmix,
-				   snd_mixer_elem_t *elem)
-{
-	if (snd_mixer_selem_has_playback_volume(elem)) {
-		long range;
-		struct mixer_control *c, *next;
-		int rc = mixer_control_create(&c, NULL, elem,
-					      CRAS_STREAM_OUTPUT);
-		if (rc)
-			return rc;
-
-		if (c->has_volume) {
-			cmix->max_volume_dB += c->max_volume_dB;
-			cmix->min_volume_dB += c->min_volume_dB;
-		}
-
-		range = c->max_volume_dB - c->min_volume_dB;
-		DL_FOREACH (cmix->main_volume_controls, next) {
-			if (range > next->max_volume_dB - next->min_volume_dB)
-				break;
-		}
-
-		syslog(LOG_DEBUG, "Add main volume control %s\n", c->name);
-		DL_INSERT(cmix->main_volume_controls, next, c);
-	}
-
-	/* If cmix doesn't yet have a playback switch and this is a playback
-	 * switch, use it. */
-	if (cmix->playback_switch == NULL &&
-	    snd_mixer_selem_has_playback_switch(elem)) {
-		syslog(LOG_DEBUG, "Using '%s' as playback switch.",
-		       snd_mixer_selem_get_name(elem));
-		cmix->playback_switch = elem;
-	}
-
-	return 0;
-}
-
-/* Adds the main capture control to the list and grabs the first seen capture
- * switch to mute input. */
-static int add_main_capture_control(struct cras_alsa_mixer *cmix,
-				    snd_mixer_elem_t *elem)
-{
-	/* TODO(dgreid) handle index != 0, map to correct input. */
-	if (snd_mixer_selem_get_index(elem) > 0)
-		return 0;
-
-	if (snd_mixer_selem_has_capture_volume(elem)) {
-		struct mixer_control *c;
-		int rc =
-			mixer_control_create(&c, NULL, elem, CRAS_STREAM_INPUT);
-		if (rc)
-			return rc;
-
-		syslog(LOG_DEBUG, "Add main capture control %s\n", c->name);
-		DL_APPEND(cmix->main_capture_controls, c);
-	}
-
-	/* If cmix doesn't yet have a capture switch and this is a capture
-	 * switch, use it. */
-	if (cmix->capture_switch == NULL &&
-	    snd_mixer_selem_has_capture_switch(elem)) {
-		syslog(LOG_DEBUG, "Using '%s' as capture switch.",
-		       snd_mixer_selem_get_name(elem));
-		cmix->capture_switch = elem;
-	}
-
-	return 0;
-}
-
-/* Adds a control to the list. */
-static int add_control_with_name(struct cras_alsa_mixer *cmix,
-				 enum CRAS_STREAM_DIRECTION dir,
-				 snd_mixer_elem_t *elem, const char *name)
-{
-	int index; /* Index part of mixer simple element */
-	struct mixer_control *c;
-	int rc;
-
-	index = snd_mixer_selem_get_index(elem);
-	syslog(LOG_DEBUG, "Add %s control: %s,%d\n",
-	       dir == CRAS_STREAM_OUTPUT ? "output" : "input", name, index);
-
-	rc = mixer_control_create(&c, name, elem, dir);
-	if (rc)
-		return rc;
-
-	if (c->has_volume)
-		syslog(LOG_DEBUG, "Control '%s' volume range: [%ld:%ld]",
-		       c->name, c->min_volume_dB, c->max_volume_dB);
-
-	if (dir == CRAS_STREAM_OUTPUT)
-		DL_APPEND(cmix->output_controls, c);
-	else if (dir == CRAS_STREAM_INPUT)
-		DL_APPEND(cmix->input_controls, c);
-	return 0;
-}
-
-static int add_control(struct cras_alsa_mixer *cmix,
-		       enum CRAS_STREAM_DIRECTION dir, snd_mixer_elem_t *elem)
-{
-	return add_control_with_name(cmix, dir, elem,
-				     snd_mixer_selem_get_name(elem));
-}
-
-static void list_controls(struct mixer_control *control_list,
-			  cras_alsa_mixer_control_callback cb, void *cb_arg)
-{
-	struct mixer_control *control;
-
-	DL_FOREACH (control_list, control)
-		cb(control, cb_arg);
-}
-
-static struct mixer_control *
-get_control_matching_name(struct mixer_control *control_list, const char *name)
-{
-	struct mixer_control *c;
-
-	DL_FOREACH (control_list, c) {
-		if (strstr(name, c->name))
-			return c;
-	}
-	return NULL;
-}
-
-/* Creates a mixer_control with multiple control elements. */
-static int add_control_with_coupled_mixers(struct cras_alsa_mixer *cmix,
-					   enum CRAS_STREAM_DIRECTION dir,
-					   const char *name,
-					   struct mixer_name *coupled_controls)
-{
-	struct mixer_control *c;
-	int rc;
-
-	rc = mixer_control_create_by_name(&c, cmix, name, coupled_controls,
-					  dir);
-	if (rc)
-		return rc;
-	syslog(LOG_DEBUG, "Add %s control: %s\n",
-	       dir == CRAS_STREAM_OUTPUT ? "output" : "input", c->name);
-	mixer_name_dump(coupled_controls, "  elements");
-
-	if (c->has_volume)
-		syslog(LOG_DEBUG, "Control '%s' volume range: [%ld:%ld]",
-		       c->name, c->min_volume_dB, c->max_volume_dB);
-
-	if (dir == CRAS_STREAM_OUTPUT)
-		DL_APPEND(cmix->output_controls, c);
-	else if (dir == CRAS_STREAM_INPUT)
-		DL_APPEND(cmix->input_controls, c);
-	return 0;
-}
-
-static int add_control_by_name(struct cras_alsa_mixer *cmix,
-			       enum CRAS_STREAM_DIRECTION dir, const char *name)
-{
-	struct mixer_control *c;
-	struct mixer_name *m_name;
-	int rc;
-
-	m_name = mixer_name_add(NULL, name, dir, MIXER_NAME_VOLUME);
-	if (!m_name)
-		return -ENOMEM;
-
-	rc = mixer_control_create_by_name(&c, cmix, name, m_name, dir);
-	mixer_name_free(m_name);
-	if (rc)
-		return rc;
-	syslog(LOG_DEBUG, "Add %s control: %s\n",
-	       dir == CRAS_STREAM_OUTPUT ? "output" : "input", c->name);
-
-	if (c->has_volume)
-		syslog(LOG_DEBUG, "Control '%s' volume range: [%ld:%ld]",
-		       c->name, c->min_volume_dB, c->max_volume_dB);
-
-	if (dir == CRAS_STREAM_OUTPUT)
-		DL_APPEND(cmix->output_controls, c);
-	else if (dir == CRAS_STREAM_INPUT)
-		DL_APPEND(cmix->input_controls, c);
-	return 0;
-}
-
-/*
- * Exported interface.
- */
-
-struct cras_alsa_mixer *cras_alsa_mixer_create(const char *card_name)
-{
-	struct cras_alsa_mixer *cmix;
-
-	cmix = (struct cras_alsa_mixer *)calloc(1, sizeof(*cmix));
-	if (cmix == NULL)
-		return NULL;
-
-	syslog(LOG_DEBUG, "Add mixer for device %s", card_name);
-
-	alsa_mixer_open(card_name, &cmix->mixer);
-
-	return cmix;
-}
-
-int cras_alsa_mixer_add_controls_by_name_matching(
-	struct cras_alsa_mixer *cmix, struct mixer_name *extra_controls,
-	struct mixer_name *coupled_controls)
-{
-	/* Names of controls for main system volume. */
-	static const char *const main_volume_names[] = {
-		"Master",
-		"Digital",
-		"PCM",
-	};
-	/* Names of controls for individual outputs. */
-	static const char *const output_names[] = {
-		"Headphone",
-		"Headset",
-		"HDMI",
-		"Speaker",
-	};
-	/* Names of controls for capture gain/attenuation and mute. */
-	static const char *const main_capture_names[] = {
-		"Capture",
-		"Digital Capture",
-	};
-	/* Names of controls for individual inputs. */
-	static const char *const input_names[] = {
-		"Mic",
-		"Microphone",
-	};
-
-	struct mixer_name *default_controls = NULL;
-	snd_mixer_elem_t *elem;
-	int extra_main_volume = 0;
-	snd_mixer_elem_t *other_elem = NULL;
-	long other_dB_range = 0;
-	int rc = 0;
-
-	/* Note that there is no mixer on some cards. This is acceptable. */
-	if (cmix->mixer == NULL) {
-		syslog(LOG_DEBUG, "Couldn't open mixer.");
-		return 0;
-	}
-
-	default_controls =
-		mixer_name_add_array(default_controls, output_names,
-				     ARRAY_SIZE(output_names),
-				     CRAS_STREAM_OUTPUT, MIXER_NAME_VOLUME);
-	default_controls =
-		mixer_name_add_array(default_controls, input_names,
-				     ARRAY_SIZE(input_names), CRAS_STREAM_INPUT,
-				     MIXER_NAME_VOLUME);
-	default_controls =
-		mixer_name_add_array(default_controls, main_volume_names,
-				     ARRAY_SIZE(main_volume_names),
-				     CRAS_STREAM_OUTPUT,
-				     MIXER_NAME_MAIN_VOLUME);
-	default_controls =
-		mixer_name_add_array(default_controls, main_capture_names,
-				     ARRAY_SIZE(main_capture_names),
-				     CRAS_STREAM_INPUT, MIXER_NAME_MAIN_VOLUME);
-	extra_main_volume =
-		mixer_name_find(extra_controls, NULL, CRAS_STREAM_OUTPUT,
-				MIXER_NAME_MAIN_VOLUME) != NULL;
-
-	/* Find volume and mute controls. */
-	for (elem = snd_mixer_first_elem(cmix->mixer); elem != NULL;
-	     elem = snd_mixer_elem_next(elem)) {
-		const char *name;
-		struct mixer_name *control;
-		int found = 0;
-
-		name = snd_mixer_selem_get_name(elem);
-		if (name == NULL)
-			continue;
-
-		/* Find a matching control. */
-		control = mixer_name_find(default_controls, name,
-					  CRAS_STREAM_OUTPUT,
-					  MIXER_NAME_UNDEFINED);
-
-		/* If our extra controls contain a main volume
-		 * entry, and we found a main volume entry, then
-		 * skip it. */
-		if (extra_main_volume && control &&
-		    control->type == MIXER_NAME_MAIN_VOLUME)
-			control = NULL;
-
-		/* If we didn't match any of the defaults, match
-		 * the extras list. */
-		if (!control)
-			control = mixer_name_find(extra_controls, name,
-						  CRAS_STREAM_OUTPUT,
-						  MIXER_NAME_UNDEFINED);
-
-		if (control) {
-			int rc = -1;
-			switch (control->type) {
-			case MIXER_NAME_MAIN_VOLUME:
-				rc = add_main_volume_control(cmix, elem);
-				break;
-			case MIXER_NAME_VOLUME:
-				/* TODO(dgreid) - determine device index. */
-				rc = add_control(cmix, CRAS_STREAM_OUTPUT,
-						 elem);
-				break;
-			case MIXER_NAME_UNDEFINED:
-				rc = -EINVAL;
-				break;
-			}
-			if (rc) {
-				syslog(LOG_ERR,
-				       "Failed to add mixer control '%s'"
-				       " with type '%d'",
-				       control->name, control->type);
-				goto out;
-			}
-			found = 1;
-		}
-
-		/* Find a matching input control. */
-		control = mixer_name_find(default_controls, name,
-					  CRAS_STREAM_INPUT,
-					  MIXER_NAME_UNDEFINED);
-
-		/* If we didn't match any of the defaults, match
-		   the extras list */
-		if (!control)
-			control = mixer_name_find(extra_controls, name,
-						  CRAS_STREAM_INPUT,
-						  MIXER_NAME_UNDEFINED);
-
-		if (control) {
-			int rc = -1;
-			switch (control->type) {
-			case MIXER_NAME_MAIN_VOLUME:
-				rc = add_main_capture_control(cmix, elem);
-				break;
-			case MIXER_NAME_VOLUME:
-				rc = add_control(cmix, CRAS_STREAM_INPUT, elem);
-				break;
-			case MIXER_NAME_UNDEFINED:
-				rc = -EINVAL;
-				break;
-			}
-			if (rc) {
-				syslog(LOG_ERR,
-				       "Failed to add mixer control '%s'"
-				       " with type '%d'",
-				       control->name, control->type);
-				goto out;
-			}
-			found = 1;
-		}
-
-		if (!found && snd_mixer_selem_has_playback_volume(elem)) {
-			/* Temporarily cache one elem whose name is not
-			 * in the list above, but has a playback volume
-			 * control and the largest volume range. */
-			long min, max, range;
-			if (snd_mixer_selem_get_playback_dB_range(elem, &min,
-								  &max) != 0)
-				continue;
-
-			range = max - min;
-			if (other_dB_range < range) {
-				other_dB_range = range;
-				other_elem = elem;
-			}
-		}
-	}
-
-	/* Handle coupled output names for speaker */
-	if (coupled_controls) {
-		rc = add_control_with_coupled_mixers(
-			cmix, CRAS_STREAM_OUTPUT, "Speaker", coupled_controls);
-		if (rc) {
-			syslog(LOG_ERR, "Could not add coupled output");
-			goto out;
-		}
-	}
-
-	/* If there is no volume control and output control found,
-	 * use the volume control which has the largest volume range
-	 * in the mixer as a main volume control. */
-	if (!cmix->main_volume_controls && !cmix->output_controls &&
-	    other_elem) {
-		rc = add_main_volume_control(cmix, other_elem);
-		if (rc) {
-			syslog(LOG_ERR, "Could not add other volume control");
-			goto out;
-		}
-	}
-
-out:
-	mixer_name_free(default_controls);
-	return rc;
-}
-
-int cras_alsa_mixer_add_main_volume_control_by_name(
-	struct cras_alsa_mixer *cmix, struct mixer_name *mixer_names)
-{
-	snd_mixer_elem_t *elem;
-	struct mixer_name *m_name;
-	int rc = 0;
-	snd_mixer_selem_id_t *sid;
-
-	if (!mixer_names)
-		return -EINVAL;
-
-	snd_mixer_selem_id_malloc(&sid);
-
-	DL_FOREACH (mixer_names, m_name) {
-		snd_mixer_selem_id_set_index(sid, 0);
-		snd_mixer_selem_id_set_name(sid, m_name->name);
-		elem = snd_mixer_find_selem(cmix->mixer, sid);
-		if (!elem) {
-			rc = -ENOENT;
-			syslog(LOG_ERR, "Unable to find simple control %s, 0",
-			       m_name->name);
-			break;
-		}
-		rc = add_main_volume_control(cmix, elem);
-		if (rc)
-			break;
-	}
-
-	snd_mixer_selem_id_free(sid);
-	return rc;
-}
-
-int cras_alsa_mixer_add_controls_in_section(struct cras_alsa_mixer *cmix,
-					    struct ucm_section *section)
-{
-	int rc;
-
-	/* Note that there is no mixer on some cards. This is acceptable. */
-	if (cmix->mixer == NULL) {
-		syslog(LOG_DEBUG, "Couldn't open mixer.");
-		return 0;
-	}
-
-	if (!section) {
-		syslog(LOG_ERR, "No UCM SectionDevice specified.");
-		return -EINVAL;
-	}
-
-	/* TODO(muirj) - Extra main volume controls when fully-specified. */
-
-	if (section->mixer_name) {
-		rc = add_control_by_name(cmix, section->dir,
-					 section->mixer_name);
-		if (rc) {
-			syslog(LOG_ERR, "Could not add mixer control '%s': %s",
-			       section->mixer_name, strerror(-rc));
-			return rc;
-		}
-	}
-
-	if (section->coupled) {
-		rc = add_control_with_coupled_mixers(
-			cmix, section->dir, section->name, section->coupled);
-		if (rc) {
-			syslog(LOG_ERR, "Could not add coupled control: %s",
-			       strerror(-rc));
-			return rc;
-		}
-	}
-	return 0;
-}
-
-void cras_alsa_mixer_destroy(struct cras_alsa_mixer *cras_mixer)
-{
-	assert(cras_mixer);
-
-	mixer_control_destroy_list(cras_mixer->main_volume_controls);
-	mixer_control_destroy_list(cras_mixer->main_capture_controls);
-	mixer_control_destroy_list(cras_mixer->output_controls);
-	mixer_control_destroy_list(cras_mixer->input_controls);
-	if (cras_mixer->mixer)
-		snd_mixer_close(cras_mixer->mixer);
-	free(cras_mixer);
-}
-
-int cras_alsa_mixer_has_main_volume(const struct cras_alsa_mixer *cras_mixer)
-{
-	return !!cras_mixer->main_volume_controls;
-}
-
-int cras_alsa_mixer_has_volume(const struct mixer_control *mixer_control)
-{
-	return mixer_control && mixer_control->has_volume;
-}
-
-void cras_alsa_mixer_set_dBFS(struct cras_alsa_mixer *cras_mixer, long dBFS,
-			      struct mixer_control *mixer_output)
-{
-	struct mixer_control *c;
-	long to_set;
-
-	assert(cras_mixer);
-
-	/* dBFS is normally < 0 to specify the attenuation from max. max is the
-	 * combined max of the main controls and the current output.
-	 */
-	to_set = dBFS + cras_mixer->max_volume_dB;
-	if (cras_alsa_mixer_has_volume(mixer_output))
-		to_set += mixer_output->max_volume_dB;
-	/* Go through all the controls, set the volume level for each,
-	 * taking the value closest but greater than the desired volume.  If the
-	 * entire volume can't be set on the current control, move on to the
-	 * next one until we have the exact volume, or gotten as close as we
-	 * can. Once all of the volume is set the rest of the controls should be
-	 * set to 0dB. */
-	DL_FOREACH (cras_mixer->main_volume_controls, c) {
-		long actual_dB;
-
-		if (!c->has_volume)
-			continue;
-		if (mixer_control_set_dBFS(c, to_set) == 0 &&
-		    mixer_control_get_dBFS(c, &actual_dB) == 0)
-			to_set -= actual_dB;
-	}
-	/* Apply the rest to the output-specific control. */
-	if (cras_alsa_mixer_has_volume(mixer_output))
-		mixer_control_set_dBFS(mixer_output, to_set);
-}
-
-long cras_alsa_mixer_get_dB_range(struct cras_alsa_mixer *cras_mixer)
-{
-	if (!cras_mixer)
-		return 0;
-	return cras_mixer->max_volume_dB - cras_mixer->min_volume_dB;
-}
-
-long cras_alsa_mixer_get_output_dB_range(struct mixer_control *mixer_output)
-{
-	if (!cras_alsa_mixer_has_volume(mixer_output))
-		return 0;
-
-	return mixer_output->max_volume_dB - mixer_output->min_volume_dB;
-}
-
-void cras_alsa_mixer_set_capture_dBFS(struct cras_alsa_mixer *cras_mixer,
-				      long dBFS,
-				      struct mixer_control *mixer_input)
-{
-	struct mixer_control *c;
-	long to_set;
-
-	assert(cras_mixer);
-	to_set = dBFS;
-	/* Go through all the controls, set the gain for each, taking the value
-	 * closest but greater than the desired gain.  If the entire gain can't
-	 * be set on the current control, move on to the next one until we have
-	 * the exact gain, or gotten as close as we can. Once all of the gain is
-	 * set the rest of the controls should be set to 0dB. */
-	DL_FOREACH (cras_mixer->main_capture_controls, c) {
-		long actual_dB;
-
-		if (!c->has_volume)
-			continue;
-		if (mixer_control_set_dBFS(c, to_set) == 0 &&
-		    mixer_control_get_dBFS(c, &actual_dB) == 0)
-			to_set -= actual_dB;
-	}
-
-	/* Apply the reset to input specific control */
-	if (cras_alsa_mixer_has_volume(mixer_input))
-		mixer_control_set_dBFS(mixer_input, to_set);
-}
-
-long cras_alsa_mixer_get_minimum_capture_gain(struct cras_alsa_mixer *cmix,
-					      struct mixer_control *mixer_input)
-{
-	struct mixer_control *c;
-	long total_min = 0;
-
-	assert(cmix);
-	DL_FOREACH (cmix->main_capture_controls, c)
-		if (c->has_volume)
-			total_min += c->min_volume_dB;
-	if (mixer_input && mixer_input->has_volume)
-		total_min += mixer_input->min_volume_dB;
-
-	return total_min;
-}
-
-long cras_alsa_mixer_get_maximum_capture_gain(struct cras_alsa_mixer *cmix,
-					      struct mixer_control *mixer_input)
-{
-	struct mixer_control *c;
-	long total_max = 0;
-
-	assert(cmix);
-	DL_FOREACH (cmix->main_capture_controls, c)
-		if (c->has_volume)
-			total_max += c->max_volume_dB;
-
-	if (mixer_input && mixer_input->has_volume)
-		total_max += mixer_input->max_volume_dB;
-
-	return total_max;
-}
-
-void cras_alsa_mixer_set_mute(struct cras_alsa_mixer *cras_mixer, int muted,
-			      struct mixer_control *mixer_output)
-{
-	assert(cras_mixer);
-
-	if (cras_mixer->playback_switch) {
-		snd_mixer_selem_set_playback_switch_all(
-			cras_mixer->playback_switch, !muted);
-	}
-	if (mixer_output && mixer_output->has_mute) {
-		mixer_control_set_mute(mixer_output, muted);
-	}
-}
-
-void cras_alsa_mixer_set_capture_mute(struct cras_alsa_mixer *cras_mixer,
-				      int muted,
-				      struct mixer_control *mixer_input)
-{
-	assert(cras_mixer);
-	if (cras_mixer->capture_switch) {
-		snd_mixer_selem_set_capture_switch_all(
-			cras_mixer->capture_switch, !muted);
-		return;
-	}
-	if (mixer_input && mixer_input->has_mute)
-		mixer_control_set_mute(mixer_input, muted);
-}
-
-void cras_alsa_mixer_list_outputs(struct cras_alsa_mixer *cras_mixer,
-				  cras_alsa_mixer_control_callback cb,
-				  void *cb_arg)
-{
-	assert(cras_mixer);
-	list_controls(cras_mixer->output_controls, cb, cb_arg);
-}
-
-void cras_alsa_mixer_list_inputs(struct cras_alsa_mixer *cras_mixer,
-				 cras_alsa_mixer_control_callback cb,
-				 void *cb_arg)
-{
-	assert(cras_mixer);
-	list_controls(cras_mixer->input_controls, cb, cb_arg);
-}
-
-const char *
-cras_alsa_mixer_get_control_name(const struct mixer_control *control)
-{
-	if (!control)
-		return NULL;
-	return control->name;
-}
-
-struct mixer_control *
-cras_alsa_mixer_get_control_matching_name(struct cras_alsa_mixer *cras_mixer,
-					  enum CRAS_STREAM_DIRECTION dir,
-					  const char *name, int create_missing)
-{
-	struct mixer_control *c;
-
-	assert(cras_mixer);
-	if (!name)
-		return NULL;
-
-	if (dir == CRAS_STREAM_OUTPUT) {
-		c = get_control_matching_name(cras_mixer->output_controls,
-					      name);
-	} else if (dir == CRAS_STREAM_INPUT) {
-		c = get_control_matching_name(cras_mixer->input_controls, name);
-	} else {
-		return NULL;
-	}
-
-	/* TODO: Allowing creation of a new control is a workaround: we
-	 * should pass the input names in ucm config to
-	 * cras_alsa_mixer_create. */
-	if (!c && cras_mixer->mixer && create_missing) {
-		int rc = add_control_by_name(cras_mixer, dir, name);
-		if (rc)
-			return NULL;
-		c = cras_alsa_mixer_get_control_matching_name(cras_mixer, dir,
-							      name, 0);
-	}
-	return c;
-}
-
-struct mixer_control *
-cras_alsa_mixer_get_control_for_section(struct cras_alsa_mixer *cras_mixer,
-					const struct ucm_section *section)
-{
-	assert(cras_mixer && section);
-	if (section->mixer_name) {
-		return cras_alsa_mixer_get_control_matching_name(
-			cras_mixer, section->dir, section->mixer_name, 0);
-	} else if (section->coupled) {
-		return cras_alsa_mixer_get_control_matching_name(
-			cras_mixer, section->dir, section->name, 0);
-	}
-	return NULL;
-}
-
-struct mixer_control *
-cras_alsa_mixer_get_output_matching_name(struct cras_alsa_mixer *cras_mixer,
-					 const char *const name)
-{
-	return cras_alsa_mixer_get_control_matching_name(
-		cras_mixer, CRAS_STREAM_OUTPUT, name, 0);
-}
-
-struct mixer_control *
-cras_alsa_mixer_get_input_matching_name(struct cras_alsa_mixer *cras_mixer,
-					const char *name)
-{
-	/* TODO: Allowing creation of a new control is a workaround: we
-	 * should pass the input names in ucm config to
-	 * cras_alsa_mixer_create. */
-	return cras_alsa_mixer_get_control_matching_name(
-		cras_mixer, CRAS_STREAM_INPUT, name, 1);
-}
-
-int cras_alsa_mixer_set_output_active_state(struct mixer_control *output,
-					    int active)
-{
-	assert(output);
-	if (!output->has_mute)
-		return -1;
-	return mixer_control_set_mute(output, !active);
-}
diff --git a/cras/src/server/cras_alsa_mixer.h b/cras/src/server/cras_alsa_mixer.h
deleted file mode 100644
index 878fbe5..0000000
--- a/cras/src/server/cras_alsa_mixer.h
+++ /dev/null
@@ -1,235 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef _CRAS_ALSA_MIXER_H
-#define _CRAS_ALSA_MIXER_H
-
-#include "cras_types.h"
-
-/* cras_alsa_mixer represents the alsa mixer interface for an alsa card.  It
- * houses the volume and mute controls as well as playback switches for
- * headphones and mic.
- */
-
-struct mixer_control;
-struct cras_alsa_mixer;
-struct cras_volume_curve;
-struct cras_card_config;
-struct mixer_name;
-struct ucm_section;
-
-/* Creates a cras_alsa_mixer instance for the given alsa device.
- * Args:
- *    card_name - Name of the card to open a mixer for.  This is an alsa name of
- *      the form "hw:X" where X ranges from 0 to 31 inclusive.
- * Returns:
- *    A pointer to the newly created cras_alsa_mixer which must later be freed
- *    by calling cras_alsa_mixer_destroy. The control in the mixer is not added
- *    yet.
- */
-struct cras_alsa_mixer *cras_alsa_mixer_create(const char *card_name);
-
-/* Adds controls to a cras_alsa_mixer from the given UCM section.
- * Args:
- *    cmix - A pointer to cras_alsa_mixer.
- *    section - A UCM section.
- * Returns:
- *    0 on success. Negative error code otherwise.
- */
-int cras_alsa_mixer_add_controls_in_section(struct cras_alsa_mixer *cmix,
-					    struct ucm_section *section);
-
-/* Adds main volume controls to a cras_alsa_mixer from the given list of mixer
- * names of main volume controls.
- * Args:
- *    cmix - A pointer to cras_alsa_mixer.
- *    mixer_names - A list of mixer names from the given UCM MainVolumeNames.
- * Returns:
- *    0 on success. Negative error code otherwise.
- */
-int cras_alsa_mixer_add_main_volume_control_by_name(
-	struct cras_alsa_mixer *cmix, struct mixer_name *mixer_names);
-
-/* Adds controls to a cras_alsa_mixer instance by name matching.
- * Args:
- *    cmix - A pointer to cras_alsa_mixer.
- *    extra_controls - A list array of extra mixer control names, always added.
- *    coupled_controls - A list of coupled mixer control names.
- * Returns:
- *    0 on success. Other error code if error happens.
- */
-int cras_alsa_mixer_add_controls_by_name_matching(
-	struct cras_alsa_mixer *cmix, struct mixer_name *extra_controls,
-	struct mixer_name *coupled_controls);
-
-/* Destroys a cras_alsa_mixer that was returned from cras_alsa_mixer_create.
- * Args:
- *    cras_mixer - The cras_alsa_mixer pointer returned from
- *        cras_alsa_mixer_create.
- */
-void cras_alsa_mixer_destroy(struct cras_alsa_mixer *cras_mixer);
-
-/* Returns if the mixer has any main volume control. */
-int cras_alsa_mixer_has_main_volume(const struct cras_alsa_mixer *cras_mixer);
-
-/* Returns if the mixer control supports volume adjust. */
-int cras_alsa_mixer_has_volume(const struct mixer_control *mixer_control);
-
-/* Sets the output volume for the device associated with this mixer.
- * Args:
- *    cras_mixer - The mixer to set the volume on.
- *    dBFS - The volume level as dB * 100.  dB is a normally a negative quantity
- *      specifying how much to attenuate.
- *    mixer_output - The mixer output to set if not all attenuation can be
- *      obtained from the main controls.  Can be null.
- */
-void cras_alsa_mixer_set_dBFS(struct cras_alsa_mixer *cras_mixer, long dBFS,
-			      struct mixer_control *mixer_output);
-
-/* Gets the volume range of the mixer in dB.
- * Args:
- *    cras_mixer - The mixer to get the volume range.
- */
-long cras_alsa_mixer_get_dB_range(struct cras_alsa_mixer *cras_mixer);
-
-/* Gets the volume range of the mixer output in dB.
- * Args:
- *    mixer_output - The mixer output to get the volume range.
- */
-long cras_alsa_mixer_get_output_dB_range(struct mixer_control *mixer_output);
-
-/* Sets the capture gain for the device associated with this mixer.
- * Args:
- *    cras_mixer - The mixer to set the volume on.
- *    dBFS - The capture gain level as dB * 100.  dB can be a positive or a
- *    negative quantity specifying how much gain or attenuation to apply.
- *    mixer_input - The specific mixer control for input node, can be null.
- */
-void cras_alsa_mixer_set_capture_dBFS(struct cras_alsa_mixer *cras_mixer,
-				      long dBFS,
-				      struct mixer_control *mixer_input);
-
-/* Gets the minimum allowed setting for capture gain.
- * Args:
- *    cmix - The mixer to set the capture gain on.
- *    mixer_input - The additional input mixer control, mainly specified
- *      in ucm config. Can be null.
- * Returns:
- *    The minimum allowed capture gain in dBFS * 100.
- */
-long cras_alsa_mixer_get_minimum_capture_gain(
-	struct cras_alsa_mixer *cmix, struct mixer_control *mixer_input);
-
-/* Gets the maximum allowed setting for capture gain.
- * Args:
- *    cmix - The mixer to set the capture gain on.
- *    mixer_input - The additional input mixer control, mainly specified
- *      in ucm config. Can be null.
- * Returns:
- *    The maximum allowed capture gain in dBFS * 100.
- */
-long cras_alsa_mixer_get_maximum_capture_gain(
-	struct cras_alsa_mixer *cmix, struct mixer_control *mixer_input);
-
-/* Sets the playback switch for the device.
- * Args:
- *    cras_mixer - Mixer to set the playback switch.
- *    muted - 1 if muted, 0 if not.
- *    mixer_output - The output specific mixer control to mute/unmute. Pass NULL
- *                   to skip it.
- */
-void cras_alsa_mixer_set_mute(struct cras_alsa_mixer *cras_mixer, int muted,
-			      struct mixer_control *mixer_output);
-
-/* Sets the capture switch for the device.
- * Args:
- *    cras_mixer - Mixer to set the volume in.
- *    muted - 1 if muted, 0 if not.
- *    mixer_input - The mixer input to mute if no card mute.
- */
-void cras_alsa_mixer_set_capture_mute(struct cras_alsa_mixer *cras_mixer,
-				      int muted,
-				      struct mixer_control *mixer_input);
-
-/* Invokes the provided callback once for each output (input).
- * The callback will be provided with a reference to the control
- * that can be queried to see what the control supports.
- * Args:
- *    cras_mixer - Mixer to set the volume in.
- *    cb - Function to call for each output (input).
- *    cb_arg - Argument to pass to cb.
- */
-typedef void (*cras_alsa_mixer_control_callback)(struct mixer_control *control,
-						 void *arg);
-void cras_alsa_mixer_list_outputs(struct cras_alsa_mixer *cras_mixer,
-				  cras_alsa_mixer_control_callback cb,
-				  void *cb_arg);
-
-void cras_alsa_mixer_list_inputs(struct cras_alsa_mixer *cras_mixer,
-				 cras_alsa_mixer_control_callback cb,
-				 void *cb_arg);
-
-/* Gets the name of a given control. */
-const char *
-cras_alsa_mixer_get_control_name(const struct mixer_control *control);
-
-/* Returns the mixer control matching the given direction and name.
- * Args:
- *    cras_mixer - Mixer to search for a control.
- *    dir - Control's direction (OUTPUT or INPUT).
- *    name - Name to search for.
- *    create_missing - When non-zero, attempt to create a new control with
- *		       the given name.
- * Returns:
- *    A pointer to the matching mixer control, or NULL if none found.
- */
-struct mixer_control *
-cras_alsa_mixer_get_control_matching_name(struct cras_alsa_mixer *cras_mixer,
-					  enum CRAS_STREAM_DIRECTION dir,
-					  const char *name, int create_missing);
-
-/* Returns the mixer control associated with the given section.
- * The control is the one that matches 'mixer_name', or if that is not defined
- * then it will be the control matching 'section->name', based on the
- * coupled mixer controls.
- * Args:
- *    cras_mixer - Mixer to search for a control.
- *    section - Associated UCM section.
- * Returns:
- *    A pointer to the associated mixer control, or NULL if none found.
- */
-struct mixer_control *
-cras_alsa_mixer_get_control_for_section(struct cras_alsa_mixer *cras_mixer,
-					const struct ucm_section *section);
-
-/* Finds the output that matches the given string.  Used to match Jacks to Mixer
- * elements.
- * Args:
- *    cras_mixer - Mixer to search for a control.
- *    name - The name to match against the controls.
- * Returns:
- *    A pointer to the output with a mixer control that matches "name".
- */
-struct mixer_control *
-cras_alsa_mixer_get_output_matching_name(struct cras_alsa_mixer *cras_mixer,
-					 const char *name);
-
-/* Finds the mixer control for that matches the control name of input control
- * name specified in ucm config.
- * Args:
- *    cras_mixer - Mixer to search for a control.
- *    name - Name of the control to search for.
- * Returns:
- *    A pointer to the input with a mixer control that matches "name".
- */
-struct mixer_control *
-cras_alsa_mixer_get_input_matching_name(struct cras_alsa_mixer *cras_mixer,
-					const char *name);
-
-/* Sets the given output active or inactive. */
-int cras_alsa_mixer_set_output_active_state(struct mixer_control *output,
-					    int active);
-
-#endif /* _CRAS_ALSA_MIXER_H */
diff --git a/cras/src/server/cras_alsa_mixer_name.c b/cras/src/server/cras_alsa_mixer_name.c
deleted file mode 100644
index 45ef2c5..0000000
--- a/cras/src/server/cras_alsa_mixer_name.c
+++ /dev/null
@@ -1,131 +0,0 @@
-/* Copyright 2016 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <stdlib.h>
-#include <string.h>
-#include <syslog.h>
-
-#include "cras_alsa_mixer_name.h"
-#include "utlist.h"
-
-struct mixer_name *mixer_name_add(struct mixer_name *names, const char *name,
-				  enum CRAS_STREAM_DIRECTION dir,
-				  mixer_name_type type)
-{
-	struct mixer_name *m_name;
-
-	if (!name)
-		return names;
-
-	m_name = (struct mixer_name *)calloc(1, sizeof(struct mixer_name));
-	if (!m_name)
-		return names;
-
-	m_name->name = strdup(name);
-	if (!m_name->name) {
-		free(m_name);
-		return names;
-	}
-	m_name->dir = dir;
-	m_name->type = type;
-
-	DL_APPEND(names, m_name);
-	return names;
-}
-
-struct mixer_name *mixer_name_add_array(struct mixer_name *names,
-					const char *const *name_array,
-					size_t name_array_size,
-					enum CRAS_STREAM_DIRECTION dir,
-					mixer_name_type type)
-{
-	size_t i;
-	for (i = 0; i < name_array_size; i++)
-		names = mixer_name_add(names, name_array[i], dir, type);
-	return names;
-}
-
-void mixer_name_free(struct mixer_name *names)
-{
-	struct mixer_name *m_name;
-	DL_FOREACH (names, m_name) {
-		DL_DELETE(names, m_name);
-		free((void *)m_name->name);
-		free(m_name);
-	}
-}
-
-struct mixer_name *mixer_name_find(struct mixer_name *names, const char *name,
-				   enum CRAS_STREAM_DIRECTION dir,
-				   mixer_name_type type)
-{
-	if (!name && type == MIXER_NAME_UNDEFINED)
-		return NULL;
-
-	struct mixer_name *m_name;
-	DL_FOREACH (names, m_name) {
-		/* Match the direction. */
-		if (dir != m_name->dir)
-			continue;
-		/* Match the type unless the type is UNDEFINED. */
-		if (type != MIXER_NAME_UNDEFINED && type != m_name->type)
-			continue;
-		/* Match the name if it is non-NULL, or return the first
-		 * item with the correct type when the name is not defined. */
-		if ((type != MIXER_NAME_UNDEFINED && !name) ||
-		    (name && !strcmp(m_name->name, name)))
-			return m_name;
-	}
-	return NULL;
-}
-
-static const char *mixer_name_type_str(enum CRAS_STREAM_DIRECTION dir,
-				       mixer_name_type type)
-{
-	switch (dir) {
-	case CRAS_STREAM_OUTPUT:
-		switch (type) {
-		case MIXER_NAME_VOLUME:
-			return "output volume";
-		case MIXER_NAME_MAIN_VOLUME:
-			return "main volume";
-		case MIXER_NAME_UNDEFINED:
-			break;
-		}
-		break;
-	case CRAS_STREAM_INPUT:
-		switch (type) {
-		case MIXER_NAME_VOLUME:
-			return "input volume";
-		case MIXER_NAME_MAIN_VOLUME:
-			return "main capture";
-		case MIXER_NAME_UNDEFINED:
-			break;
-		}
-		break;
-	case CRAS_STREAM_UNDEFINED:
-	case CRAS_STREAM_POST_MIX_PRE_DSP:
-	case CRAS_NUM_DIRECTIONS:
-		break;
-	}
-	return "undefined";
-}
-
-void mixer_name_dump(struct mixer_name *names, const char *message)
-{
-	struct mixer_name *m_name;
-
-	if (!names) {
-		syslog(LOG_DEBUG, "%s: empty", message);
-		return;
-	}
-
-	syslog(LOG_DEBUG, "%s:", message);
-	DL_FOREACH (names, m_name) {
-		const char *type_str =
-			mixer_name_type_str(m_name->dir, m_name->type);
-		syslog(LOG_DEBUG, "    %s %s", m_name->name, type_str);
-	}
-}
diff --git a/cras/src/server/cras_alsa_mixer_name.h b/cras/src/server/cras_alsa_mixer_name.h
deleted file mode 100644
index 67f8e9e..0000000
--- a/cras/src/server/cras_alsa_mixer_name.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/* Copyright 2016 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef _CRAS_ALSA_MIXER_NAME_H
-#define _CRAS_ALSA_MIXER_NAME_H
-
-#include "cras_types.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Type of mixer control. */
-typedef enum mixer_name_type {
-	MIXER_NAME_UNDEFINED,
-	MIXER_NAME_MAIN_VOLUME,
-	MIXER_NAME_VOLUME,
-} mixer_name_type;
-
-/* Represents a list of mixer names found in ALSA. */
-struct mixer_name {
-	const char *name;
-	enum CRAS_STREAM_DIRECTION dir;
-	mixer_name_type type;
-	struct mixer_name *prev, *next;
-};
-
-/* Add a name to the list.
- *
- * Args:
- *    names - A list of controls (may be NULL).
- *    name - The name to add.
- *    dir - The direction for this control.
- *    type - The type control being added.
- *
- * Returns:
- *    Returns the new head of the list (which changes only
- *    when names is NULL).
- */
-struct mixer_name *mixer_name_add(struct mixer_name *names, const char *name,
-				  enum CRAS_STREAM_DIRECTION dir,
-				  mixer_name_type type);
-
-/* Add an array of name to the list.
- *
- * Args:
- *    names - A list of controls (may be NULL).
- *    name_array - The names to add.
- *    name_array_size - The size of name_array.
- *    dir - The direction for these controls.
- *    type - The type controls being added.
- *
- * Returns:
- *    Returns the new head of the list (which changes only
- *    when names is NULL).
- */
-struct mixer_name *mixer_name_add_array(struct mixer_name *names,
-					const char *const *name_array,
-					size_t name_array_size,
-					enum CRAS_STREAM_DIRECTION dir,
-					mixer_name_type type);
-
-/* Frees a list of names.
- *
- * Args:
- *    names - A list of names.
- */
-void mixer_name_free(struct mixer_name *names);
-
-/* Find the mixer_name for the given direction, name, and type.
- *
- * Args:
- *    names - A list of names (may be NULL).
- *    name - The name to find, or NULL to match by type.
-
- *    dir - The direction to match.
- *    type - The type to match, or MIXER_NAME_UNDEFINED to
- *           match by name only.
- *
- * Returns:
- *    Returns a pointer to the matching struct mixer_name or NULL if
- *    not found.
- */
-struct mixer_name *mixer_name_find(struct mixer_name *names, const char *name,
-				   enum CRAS_STREAM_DIRECTION dir,
-				   mixer_name_type type);
-
-/* Dump the list of mixer names to DEBUG logs.
- *
- * Args:
- *    names - A list of names to dump.
- *    message - A message to print beforehand.
- */
-void mixer_name_dump(struct mixer_name *names, const char *message);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _CRAS_ALSA_MIXER_NAME_H */
diff --git a/cras/src/server/cras_alsa_plugin_io.c b/cras/src/server/cras_alsa_plugin_io.c
deleted file mode 100644
index 32c1ae1..0000000
--- a/cras/src/server/cras_alsa_plugin_io.c
+++ /dev/null
@@ -1,265 +0,0 @@
-/* Copyright 2020 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <alsa/asoundlib.h>
-#include <alsa/use-case.h>
-#include <stdio.h>
-#include <sys/select.h>
-#include <syslog.h>
-
-#include "cras_alsa_io.h"
-#include "cras_alsa_jack.h"
-#include "cras_alsa_mixer.h"
-#include "cras_alsa_ucm.h"
-#include "cras_iodev.h"
-#include "cras_system_state.h"
-#include "iniparser_wrapper.h"
-#include "utlist.h"
-
-#define PLUGINS_INI "plugins.ini"
-#define PLUGIN_KEY_CTL "ctl"
-#define PLUGIN_KEY_DIR "dir"
-#define PLUGIN_KEY_PCM "pcm"
-#define PLUGIN_KEY_CARD "card"
-
-#define NULL_USB_VID 0x00
-#define NULL_USB_PID 0x00
-#define NULL_USB_SERIAL_NUMBER "serial-number-not-used"
-
-struct hctl_poll_fd {
-	int fd;
-	struct hctl_poll_fd *prev, *next;
-};
-
-struct alsa_plugin {
-	snd_hctl_t *hctl;
-	struct cras_alsa_mixer *mixer;
-	struct hctl_poll_fd *hctl_poll_fds;
-	struct cras_use_case_mgr *ucm;
-	struct cras_iodev *iodev;
-	struct alsa_plugin *next, *prev;
-};
-
-static struct alsa_plugin *plugins;
-
-static char ini_name[MAX_INI_NAME_LENGTH + 1];
-static char key_name[MAX_INI_NAME_LENGTH + 1];
-static dictionary *plugins_ini = NULL;
-
-static void hctl_event_pending(void *arg, int revents)
-{
-	struct alsa_plugin *plugin;
-
-	plugin = (struct alsa_plugin *)arg;
-	if (plugin->hctl == NULL)
-		return;
-
-	/* handle_events will trigger the callback registered with each control
-	 * that has changed. */
-	snd_hctl_handle_events(plugin->hctl);
-}
-
-/* hctl poll descritpor */
-static void collect_poll_descriptors(struct alsa_plugin *plugin)
-{
-	struct hctl_poll_fd *registered_fd;
-	struct pollfd *pollfds;
-	int i, n, rc;
-
-	n = snd_hctl_poll_descriptors_count(plugin->hctl);
-	if (n == 0) {
-		syslog(LOG_DEBUG, "No hctl descritpor to poll");
-		return;
-	}
-
-	pollfds = malloc(n * sizeof(*pollfds));
-	if (pollfds == NULL)
-		return;
-
-	n = snd_hctl_poll_descriptors(plugin->hctl, pollfds, n);
-	for (i = 0; i < n; i++) {
-		registered_fd = calloc(1, sizeof(*registered_fd));
-		if (registered_fd == NULL) {
-			free(pollfds);
-			return;
-		}
-		registered_fd->fd = pollfds[i].fd;
-		DL_APPEND(plugin->hctl_poll_fds, registered_fd);
-		rc = cras_system_add_select_fd(
-			registered_fd->fd, hctl_event_pending, plugin, POLLIN);
-		if (rc < 0) {
-			DL_DELETE(plugin->hctl_poll_fds, registered_fd);
-			free(pollfds);
-			return;
-		}
-	}
-	free(pollfds);
-}
-
-static void cleanup_poll_descriptors(struct alsa_plugin *plugin)
-{
-	struct hctl_poll_fd *poll_fd;
-	DL_FOREACH (plugin->hctl_poll_fds, poll_fd) {
-		cras_system_rm_select_fd(poll_fd->fd);
-		DL_DELETE(plugin->hctl_poll_fds, poll_fd);
-		free(poll_fd);
-	}
-}
-
-static void destroy_plugin(struct alsa_plugin *plugin);
-
-void alsa_plugin_io_create(enum CRAS_STREAM_DIRECTION direction,
-			   const char *pcm_name, const char *ctl_name,
-			   const char *card_name)
-{
-	struct alsa_plugin *plugin;
-	struct ucm_section *section;
-	struct ucm_section *ucm_sections;
-	int rc;
-
-	plugin = (struct alsa_plugin *)calloc(1, sizeof(*plugin));
-	if (!plugin) {
-		syslog(LOG_ERR, "No memory to create alsa plugin");
-		return;
-	}
-
-	rc = snd_hctl_open(&plugin->hctl, ctl_name, SND_CTL_NONBLOCK);
-	if (rc < 0) {
-		syslog(LOG_ERR, "open hctl fail for plugin %s", ctl_name);
-		goto cleanup;
-	}
-
-	rc = snd_hctl_nonblock(plugin->hctl, 1);
-	if (rc < 0) {
-		syslog(LOG_ERR, "Failed to nonblock hctl for %s", ctl_name);
-		goto cleanup;
-	}
-	rc = snd_hctl_load(plugin->hctl);
-	if (rc < 0) {
-		syslog(LOG_ERR, "Failed to load hctl for %s", ctl_name);
-		goto cleanup;
-	}
-	collect_poll_descriptors(plugin);
-
-	plugin->mixer = cras_alsa_mixer_create(ctl_name);
-
-	plugin->ucm = ucm_create(card_name);
-
-	DL_APPEND(plugins, plugin);
-
-	ucm_sections = ucm_get_sections(plugin->ucm);
-	DL_FOREACH (ucm_sections, section) {
-		rc = cras_alsa_mixer_add_controls_in_section(plugin->mixer,
-							     section);
-		if (rc)
-			syslog(LOG_ERR,
-			       "Failed adding control to plugin,"
-			       "section %s mixer_name %s",
-			       section->name, section->mixer_name);
-	}
-	plugin->iodev = alsa_iodev_create(0, card_name, 0, pcm_name, "", "",
-					  ALSA_CARD_TYPE_USB, 1, /* is first */
-					  plugin->mixer, NULL, plugin->ucm,
-					  plugin->hctl, direction, NULL_USB_VID,
-					  NULL_USB_PID, NULL_USB_SERIAL_NUMBER);
-
-	DL_FOREACH (ucm_sections, section) {
-		if (section->dir != plugin->iodev->direction)
-			continue;
-		section->dev_idx = 0;
-		alsa_iodev_ucm_add_nodes_and_jacks(plugin->iodev, section);
-	}
-
-	alsa_iodev_ucm_complete_init(plugin->iodev);
-
-	return;
-cleanup:
-	if (plugin)
-		destroy_plugin(plugin);
-}
-
-static void destroy_plugin(struct alsa_plugin *plugin)
-{
-	cleanup_poll_descriptors(plugin);
-	if (plugin->hctl)
-		snd_hctl_close(plugin->hctl);
-	if (plugin->iodev)
-		alsa_iodev_destroy(plugin->iodev);
-	if (plugin->mixer)
-		cras_alsa_mixer_destroy(plugin->mixer);
-
-	free(plugin);
-}
-
-void alsa_pluigin_io_destroy_all()
-{
-	struct alsa_plugin *plugin;
-
-	DL_FOREACH (plugins, plugin)
-		destroy_plugin(plugin);
-}
-
-void cras_alsa_plugin_io_init(const char *device_config_dir)
-{
-	int nsec, i;
-	enum CRAS_STREAM_DIRECTION direction;
-	const char *sec_name;
-	const char *tmp, *pcm_name, *ctl_name, *card_name;
-
-	snprintf(ini_name, MAX_INI_NAME_LENGTH, "%s/%s", device_config_dir,
-		 PLUGINS_INI);
-	ini_name[MAX_INI_NAME_LENGTH] = '\0';
-
-	plugins_ini = iniparser_load_wrapper(ini_name);
-	if (!plugins_ini)
-		return;
-
-	nsec = iniparser_getnsec(plugins_ini);
-	for (i = 0; i < nsec; i++) {
-		sec_name = iniparser_getsecname(plugins_ini, i);
-
-		/* Parse dir=output or dir=input */
-		snprintf(key_name, MAX_INI_NAME_LENGTH, "%s:%s", sec_name,
-			 PLUGIN_KEY_DIR);
-		tmp = iniparser_getstring(plugins_ini, key_name, NULL);
-		if (strcmp(tmp, "output") == 0)
-			direction = CRAS_STREAM_OUTPUT;
-		else if (strcmp(tmp, "input") == 0)
-			direction = CRAS_STREAM_INPUT;
-		else
-			continue;
-
-		/* pcm=<plugin-pcm-name> this name will be used with
-		 * snd_pcm_open. */
-		snprintf(key_name, MAX_INI_NAME_LENGTH, "%s:%s", sec_name,
-			 PLUGIN_KEY_PCM);
-		pcm_name = iniparser_getstring(plugins_ini, key_name, NULL);
-		if (!pcm_name)
-			continue;
-
-		/* ctl=<plugin-ctl-name> this name will be used with
-		 * snd_hctl_open. */
-		snprintf(key_name, MAX_INI_NAME_LENGTH, "%s:%s", sec_name,
-			 PLUGIN_KEY_CTL);
-		ctl_name = iniparser_getstring(plugins_ini, key_name, NULL);
-		if (!ctl_name)
-			continue;
-
-		/* card=<card-name> this name will be used with
-		 * snd_use_case_mgr_open. */
-		snprintf(key_name, MAX_INI_NAME_LENGTH, "%s:%s", sec_name,
-			 PLUGIN_KEY_CARD);
-		card_name = iniparser_getstring(plugins_ini, key_name, NULL);
-		if (!card_name)
-			continue;
-
-		syslog(LOG_DEBUG,
-		       "Creating plugin for direction %s, pcm %s, ctl %s, card %s",
-		       direction == CRAS_STREAM_OUTPUT ? "output" : "input",
-		       pcm_name, ctl_name, card_name);
-
-		alsa_plugin_io_create(direction, pcm_name, ctl_name, card_name);
-	}
-}
diff --git a/cras/src/server/cras_alsa_plugin_io.h b/cras/src/server/cras_alsa_plugin_io.h
deleted file mode 100644
index 995f463..0000000
--- a/cras/src/server/cras_alsa_plugin_io.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/* Copyright 2019 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_ALSA_PLUGIN_IO_H_
-#define CRAS_ALSA_PLUGIN_IO_H_
-
-/*
- * Disclaimer:
- * The ALSA plugin path in CRAS is intended to be used for development or
- * testing. CrOS audio team is not responsible for nor provides hot-fix to
- * any breakage if it’s used in production code.
- */
-
-void alsa_pluigin_io_destroy_all();
-
-void cras_alsa_plugin_io_init(const char *device_config_dir);
-
-#endif /* CRAS_ALSA_PLUGIN_IO_H_ */
diff --git a/cras/src/server/cras_alsa_ucm.c b/cras/src/server/cras_alsa_ucm.c
deleted file mode 100644
index 3e46f6a..0000000
--- a/cras/src/server/cras_alsa_ucm.c
+++ /dev/null
@@ -1,1237 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <alsa/asoundlib.h>
-#include <alsa/use-case.h>
-#include <ctype.h>
-#include <string.h>
-#include <syslog.h>
-
-#include "cras_alsa_ucm.h"
-#include "cras_util.h"
-#include "utlist.h"
-
-static const char jack_control_var[] = "JackControl";
-static const char jack_dev_var[] = "JackDev";
-static const char jack_switch_var[] = "JackSwitch";
-static const char edid_var[] = "EDIDFile";
-static const char cap_var[] = "CaptureControl";
-static const char override_type_name_var[] = "OverrideNodeType";
-static const char dsp_name_var[] = "DspName";
-static const char playback_mixer_elem_var[] = "PlaybackMixerElem";
-static const char capture_mixer_elem_var[] = "CaptureMixerElem";
-static const char min_buffer_level_var[] = "MinBufferLevel";
-static const char dma_period_var[] = "DmaPeriodMicrosecs";
-static const char disable_software_volume[] = "DisableSoftwareVolume";
-static const char playback_device_name_var[] = "PlaybackPCM";
-static const char playback_device_rate_var[] = "PlaybackRate";
-static const char playback_channels_var[] = "PlaybackChannels";
-static const char capture_device_name_var[] = "CapturePCM";
-static const char capture_device_rate_var[] = "CaptureRate";
-static const char capture_channel_map_var[] = "CaptureChannelMap";
-static const char capture_channels_var[] = "CaptureChannels";
-static const char coupled_mixers[] = "CoupledMixers";
-static const char dependent_device_name_var[] = "DependentPCM";
-static const char preempt_hotword_var[] = "PreemptHotword";
-static const char echo_reference_dev_name_var[] = "EchoReferenceDev";
-
-/* SectionModifier prefixes and suffixes. */
-static const char hotword_model_prefix[] = "Hotword Model";
-static const char swap_mode_suffix[] = "Swap Mode";
-static const char noise_cancellation_suffix[] = "Noise Cancellation";
-
-/*
- * Set this value in a SectionDevice to specify the intrinsic sensitivity in
- * 0.01 dBFS/Pa. It currently only supports input devices. You should get the
- * value by recording samples without either hardware or software gain. We are
- * still working on building a standard process for measuring it. The value you
- * see now in our UCM is just estimated value. If it is set, CRAS will enable
- * software gain and use the value as a reference for calculating the
- * appropriate software gain to apply to the device to meet our target volume.
- */
-static const char intrinsic_sensitivity_var[] = "IntrinsicSensitivity";
-
-/*
- * Set this value in a SectionDevice to specify the default node gain in
- * 0.01 dB.
- */
-static const char default_node_gain[] = "DefaultNodeGain";
-static const char fully_specified_ucm_var[] = "FullySpecifiedUCM";
-static const char main_volume_names[] = "MainVolumeNames";
-
-/* Use case verbs corresponding to CRAS_STREAM_TYPE. */
-static const char *use_case_verbs[] = {
-	"HiFi",	  "Multimedia", "Voice Call",
-	"Speech", "Pro Audio",	"Accessibility",
-};
-
-static const size_t max_section_name_len = 100;
-
-/* Represents a list of section names found in UCM. */
-struct section_name {
-	const char *name;
-	struct section_name *prev, *next;
-};
-
-struct cras_use_case_mgr {
-	snd_use_case_mgr_t *mgr;
-	char *name;
-	unsigned int avail_use_cases;
-	enum CRAS_STREAM_TYPE use_case;
-	char *hotword_modifier;
-};
-
-static inline const char *uc_verb(struct cras_use_case_mgr *mgr)
-{
-	return use_case_verbs[mgr->use_case];
-}
-
-static int device_enabled(struct cras_use_case_mgr *mgr, const char *dev)
-{
-	const char **list;
-	unsigned int i;
-	int num_devs;
-	int enabled = 0;
-
-	num_devs = snd_use_case_get_list(mgr->mgr, "_enadevs", &list);
-	if (num_devs <= 0)
-		return 0;
-
-	for (i = 0; i < (unsigned int)num_devs; i++)
-		if (!strcmp(dev, list[i])) {
-			enabled = 1;
-			break;
-		}
-
-	snd_use_case_free_list(list, num_devs);
-	return enabled;
-}
-
-static int modifier_enabled(struct cras_use_case_mgr *mgr, const char *mod)
-{
-	const char **list;
-	unsigned int mod_idx;
-	int num_mods;
-
-	num_mods = snd_use_case_get_list(mgr->mgr, "_enamods", &list);
-	if (num_mods <= 0)
-		return 0;
-
-	for (mod_idx = 0; mod_idx < (unsigned int)num_mods; mod_idx++)
-		if (!strcmp(mod, list[mod_idx]))
-			break;
-
-	snd_use_case_free_list(list, num_mods);
-	return (mod_idx < (unsigned int)num_mods);
-}
-
-static int get_var(struct cras_use_case_mgr *mgr, const char *var,
-		   const char *dev, const char *verb, const char **value)
-{
-	char *id;
-	int rc;
-	size_t len = strlen(var) + strlen(dev) + strlen(verb) + 4;
-
-	id = (char *)malloc(len);
-	if (!id)
-		return -ENOMEM;
-	snprintf(id, len, "=%s/%s/%s", var, dev, verb);
-	rc = snd_use_case_get(mgr->mgr, id, value);
-
-	free((void *)id);
-	return rc;
-}
-
-static int get_int(struct cras_use_case_mgr *mgr, const char *var,
-		   const char *dev, const char *verb, int *value)
-{
-	const char *str_value;
-	int rc;
-
-	if (!value)
-		return -EINVAL;
-	rc = get_var(mgr, var, dev, verb, &str_value);
-	if (rc != 0)
-		return rc;
-	*value = atoi(str_value);
-	free((void *)str_value);
-	return 0;
-}
-
-static int ucm_set_modifier_enabled(struct cras_use_case_mgr *mgr,
-				    const char *mod, int enable)
-{
-	return snd_use_case_set(mgr->mgr, enable ? "_enamod" : "_dismod", mod);
-}
-
-static int ucm_str_ends_with_suffix(const char *str, const char *suffix)
-{
-	if (!str || !suffix)
-		return 0;
-	size_t len_str = strlen(str);
-	size_t len_suffix = strlen(suffix);
-	if (len_suffix > len_str)
-		return 0;
-	return strncmp(str + len_str - len_suffix, suffix, len_suffix) == 0;
-}
-
-static int ucm_section_exists_with_name(struct cras_use_case_mgr *mgr,
-					const char *name,
-					const char *identifier)
-{
-	const char **list;
-	unsigned int i;
-	int num_entries;
-	int exist = 0;
-
-	num_entries = snd_use_case_get_list(mgr->mgr, identifier, &list);
-	if (num_entries <= 0)
-		return 0;
-
-	for (i = 0; i < (unsigned int)num_entries; i += 2) {
-		if (!list[i])
-			continue;
-
-		if (strcmp(list[i], name) == 0) {
-			exist = 1;
-			break;
-		}
-	}
-	snd_use_case_free_list(list, num_entries);
-	return exist;
-}
-
-static int ucm_section_exists_with_suffix(struct cras_use_case_mgr *mgr,
-					  const char *suffix,
-					  const char *identifier)
-{
-	const char **list;
-	unsigned int i;
-	int num_entries;
-	int exist = 0;
-
-	num_entries = snd_use_case_get_list(mgr->mgr, identifier, &list);
-	if (num_entries <= 0)
-		return 0;
-
-	for (i = 0; i < (unsigned int)num_entries; i += 2) {
-		if (!list[i])
-			continue;
-
-		if (ucm_str_ends_with_suffix(list[i], suffix)) {
-			exist = 1;
-			break;
-		}
-	}
-	snd_use_case_free_list(list, num_entries);
-	return exist;
-}
-
-static int ucm_mod_exists_with_suffix(struct cras_use_case_mgr *mgr,
-				      const char *suffix)
-{
-	char *identifier;
-	int rc;
-
-	identifier = snd_use_case_identifier("_modifiers/%s", uc_verb(mgr));
-	rc = ucm_section_exists_with_suffix(mgr, suffix, identifier);
-	free(identifier);
-	return rc;
-}
-
-static int ucm_mod_exists_with_name(struct cras_use_case_mgr *mgr,
-				    const char *name)
-{
-	char *identifier;
-	int rc;
-
-	identifier = snd_use_case_identifier("_modifiers/%s", uc_verb(mgr));
-	rc = ucm_section_exists_with_name(mgr, name, identifier);
-	free(identifier);
-	return rc;
-}
-
-/* Get a list of section names whose variable is the matched value. */
-static struct section_name *
-ucm_get_sections_for_var(struct cras_use_case_mgr *mgr, const char *var,
-			 const char *value, const char *identifier,
-			 enum CRAS_STREAM_DIRECTION direction)
-{
-	const char **list;
-	struct section_name *section_names = NULL, *s_name;
-	unsigned int i;
-	int num_entries;
-	int rc;
-
-	num_entries = snd_use_case_get_list(mgr->mgr, identifier, &list);
-	if (num_entries <= 0)
-		return NULL;
-
-	/* snd_use_case_get_list fills list with pairs of device name and
-	 * comment, so device names are in even-indexed elements. */
-	for (i = 0; i < (unsigned int)num_entries; i += 2) {
-		const char *this_value;
-
-		if (!list[i])
-			continue;
-
-		rc = get_var(mgr, var, list[i], uc_verb(mgr), &this_value);
-		if (rc)
-			continue;
-
-		if (!strcmp(value, this_value)) {
-			s_name = (struct section_name *)malloc(
-				sizeof(struct section_name));
-
-			if (!s_name) {
-				syslog(LOG_ERR, "Failed to allocate memory");
-				free((void *)this_value);
-				break;
-			}
-
-			s_name->name = strdup(list[i]);
-			DL_APPEND(section_names, s_name);
-		}
-		free((void *)this_value);
-	}
-
-	snd_use_case_free_list(list, num_entries);
-	return section_names;
-}
-
-static struct section_name *
-ucm_get_devices_for_var(struct cras_use_case_mgr *mgr, const char *var,
-			const char *value, enum CRAS_STREAM_DIRECTION dir)
-{
-	char *identifier;
-	struct section_name *section_names;
-
-	identifier = snd_use_case_identifier("_devices/%s", uc_verb(mgr));
-	section_names =
-		ucm_get_sections_for_var(mgr, var, value, identifier, dir);
-	free(identifier);
-	return section_names;
-}
-
-static const char *ucm_get_value_for_dev(struct cras_use_case_mgr *mgr,
-					 const char *value_var, const char *dev)
-{
-	const char *name = NULL;
-	int rc;
-
-	rc = get_var(mgr, value_var, dev, uc_verb(mgr), &name);
-	if (rc)
-		return NULL;
-
-	return name;
-}
-
-static inline const char *
-ucm_get_playback_device_name_for_dev(struct cras_use_case_mgr *mgr,
-				     const char *dev)
-{
-	return ucm_get_value_for_dev(mgr, playback_device_name_var, dev);
-}
-
-static inline const char *
-ucm_get_capture_device_name_for_dev(struct cras_use_case_mgr *mgr,
-				    const char *dev)
-{
-	return ucm_get_value_for_dev(mgr, capture_device_name_var, dev);
-}
-
-/* Gets the value of DependentPCM property. This is used to structure two
- * SectionDevices under one cras iodev to avoid two PCMs be open at the
- * same time because of restriction in lower layer driver or hardware.
- */
-static inline const char *
-ucm_get_dependent_device_name_for_dev(struct cras_use_case_mgr *mgr,
-				      const char *dev)
-{
-	return ucm_get_value_for_dev(mgr, dependent_device_name_var, dev);
-}
-
-/* Get a list of mixer names specified in a UCM variable separated by ",".
- * E.g. "Left Playback,Right Playback".
- */
-static struct mixer_name *ucm_get_mixer_names(struct cras_use_case_mgr *mgr,
-					      const char *dev, const char *var,
-					      enum CRAS_STREAM_DIRECTION dir,
-					      mixer_name_type type)
-{
-	const char *names_in_string = NULL;
-	int rc;
-	char *tokens, *name;
-	char *laststr = NULL;
-	struct mixer_name *names = NULL;
-
-	rc = get_var(mgr, var, dev, uc_verb(mgr), &names_in_string);
-	if (rc)
-		return NULL;
-
-	tokens = strdup(names_in_string);
-	name = strtok_r(tokens, ",", &laststr);
-	while (name != NULL) {
-		names = mixer_name_add(names, name, dir, type);
-		name = strtok_r(NULL, ",", &laststr);
-	}
-	free((void *)names_in_string);
-	free(tokens);
-	return names;
-}
-
-/* Gets the modifier name of Noise Cancellation for the given node_name. */
-static void ucm_get_node_noise_cancellation_name(const char *node_name,
-						 char *mod_name)
-{
-	size_t len =
-		strlen(node_name) + 1 + strlen(noise_cancellation_suffix) + 1;
-	if (len > max_section_name_len) {
-		syslog(LOG_ERR,
-		       "Length of the given section name is %zu > %zu(max)",
-		       len, max_section_name_len);
-		len = max_section_name_len;
-	}
-	snprintf(mod_name, len, "%s %s", node_name, noise_cancellation_suffix);
-}
-
-/* Exported Interface */
-
-struct cras_use_case_mgr *ucm_create(const char *name)
-{
-	struct cras_use_case_mgr *mgr;
-	int rc;
-	const char **list;
-	int num_verbs, i, j;
-
-	assert_on_compile(ARRAY_SIZE(use_case_verbs) == CRAS_STREAM_NUM_TYPES);
-
-	if (!name)
-		return NULL;
-
-	mgr = (struct cras_use_case_mgr *)malloc(sizeof(*mgr));
-	if (!mgr)
-		return NULL;
-
-	mgr->name = strdup(name);
-	if (!mgr->name)
-		goto cleanup;
-
-	rc = snd_use_case_mgr_open(&mgr->mgr, name);
-	if (rc) {
-		syslog(LOG_WARNING, "Can not open ucm for card %s, rc = %d",
-		       name, rc);
-		goto cleanup;
-	}
-
-	mgr->avail_use_cases = 0;
-	mgr->hotword_modifier = NULL;
-	num_verbs = snd_use_case_get_list(mgr->mgr, "_verbs", &list);
-	for (i = 0; i < num_verbs; i += 2) {
-		for (j = 0; j < CRAS_STREAM_NUM_TYPES; ++j) {
-			if (strcmp(list[i], use_case_verbs[j]) == 0)
-				break;
-		}
-		if (j < CRAS_STREAM_NUM_TYPES)
-			mgr->avail_use_cases |= (1 << j);
-	}
-	if (num_verbs > 0)
-		snd_use_case_free_list(list, num_verbs);
-
-	rc = ucm_set_use_case(mgr, CRAS_STREAM_TYPE_DEFAULT);
-	if (rc)
-		goto cleanup_mgr;
-
-	return mgr;
-
-cleanup_mgr:
-	snd_use_case_mgr_close(mgr->mgr);
-cleanup:
-	free(mgr->name);
-	free(mgr);
-	return NULL;
-}
-
-void ucm_destroy(struct cras_use_case_mgr *mgr)
-{
-	snd_use_case_mgr_close(mgr->mgr);
-	free(mgr->hotword_modifier);
-	free(mgr->name);
-	free(mgr);
-}
-
-int ucm_set_use_case(struct cras_use_case_mgr *mgr,
-		     enum CRAS_STREAM_TYPE use_case)
-{
-	int rc;
-
-	if (mgr->avail_use_cases & (1 << use_case)) {
-		mgr->use_case = use_case;
-	} else {
-		syslog(LOG_ERR, "Unavailable use case %d for card %s", use_case,
-		       mgr->name);
-		return -1;
-	}
-
-	rc = snd_use_case_set(mgr->mgr, "_verb", uc_verb(mgr));
-	if (rc) {
-		syslog(LOG_ERR, "Can not set verb %s for card %s, rc = %d",
-		       uc_verb(mgr), mgr->name, rc);
-		return rc;
-	}
-
-	return 0;
-}
-
-int ucm_swap_mode_exists(struct cras_use_case_mgr *mgr)
-{
-	return ucm_mod_exists_with_suffix(mgr, swap_mode_suffix);
-}
-
-int ucm_enable_swap_mode(struct cras_use_case_mgr *mgr, const char *node_name,
-			 int enable)
-{
-	char *swap_mod = NULL;
-	int rc;
-	size_t len = strlen(node_name) + 1 + strlen(swap_mode_suffix) + 1;
-	swap_mod = (char *)malloc(len);
-	if (!swap_mod)
-		return -ENOMEM;
-	snprintf(swap_mod, len, "%s %s", node_name, swap_mode_suffix);
-	if (!ucm_mod_exists_with_name(mgr, swap_mod)) {
-		syslog(LOG_ERR, "Can not find swap mode modifier %s.",
-		       swap_mod);
-		free((void *)swap_mod);
-		return -EPERM;
-	}
-	if (modifier_enabled(mgr, swap_mod) == !!enable) {
-		free((void *)swap_mod);
-		return 0;
-	}
-	rc = ucm_set_modifier_enabled(mgr, swap_mod, enable);
-	free((void *)swap_mod);
-	return rc;
-}
-
-int ucm_node_noise_cancellation_exists(struct cras_use_case_mgr *mgr,
-				       const char *node_name)
-{
-	char *node_modifier_name = NULL;
-	int exists;
-
-	node_modifier_name = (char *)malloc(max_section_name_len);
-	if (!node_modifier_name)
-		return 0;
-	ucm_get_node_noise_cancellation_name(node_name, node_modifier_name);
-	exists = ucm_mod_exists_with_name(mgr, node_modifier_name);
-	free((void *)node_modifier_name);
-	return exists;
-}
-
-int ucm_enable_node_noise_cancellation(struct cras_use_case_mgr *mgr,
-				       const char *node_name, int enable)
-{
-	char *node_modifier_name = NULL;
-	int rc;
-
-	node_modifier_name = (char *)malloc(max_section_name_len);
-	if (!node_modifier_name)
-		return -ENOMEM;
-	ucm_get_node_noise_cancellation_name(node_name, node_modifier_name);
-	if (!ucm_mod_exists_with_name(mgr, node_modifier_name)) {
-		syslog(LOG_ERR, "Can not find modifier %s.",
-		       node_modifier_name);
-		free((void *)node_modifier_name);
-		return -EPERM;
-	}
-	if (modifier_enabled(mgr, node_modifier_name) == !!enable) {
-		syslog(LOG_DEBUG, "Modifier %s is already %s.",
-		       node_modifier_name, enable ? "enabled" : "disabled");
-		free((void *)node_modifier_name);
-		return 0;
-	}
-
-	syslog(LOG_DEBUG, "UCM %s Modifier %s", enable ? "enable" : "disable",
-	       node_modifier_name);
-	rc = ucm_set_modifier_enabled(mgr, node_modifier_name, enable);
-	free((void *)node_modifier_name);
-	return rc;
-}
-
-int ucm_set_enabled(struct cras_use_case_mgr *mgr, const char *dev, int enable)
-{
-	int rc;
-	if (device_enabled(mgr, dev) == !!enable)
-		return 0;
-	syslog(LOG_DEBUG, "UCM %s %s", enable ? "enable" : "disable", dev);
-	rc = snd_use_case_set(mgr->mgr, enable ? "_enadev" : "_disdev", dev);
-	if (rc && (rc != -ENOENT || ucm_has_fully_specified_ucm_flag(mgr))) {
-		syslog(LOG_ERR, "Can not %s UCM for device %s, rc = %d",
-		       enable ? "enable" : "disable", dev, rc);
-	}
-	return rc;
-}
-
-char *ucm_get_flag(struct cras_use_case_mgr *mgr, const char *flag_name)
-{
-	char *flag_value = NULL;
-	const char *value;
-	int rc;
-
-	/* Set device to empty string since flag is specified in verb section */
-	rc = get_var(mgr, flag_name, "", uc_verb(mgr), &value);
-	if (!rc) {
-		flag_value = strdup(value);
-		free((void *)value);
-	}
-
-	return flag_value;
-}
-
-char *ucm_get_cap_control(struct cras_use_case_mgr *mgr, const char *ucm_dev)
-{
-	char *control_name = NULL;
-	const char *value;
-	int rc;
-
-	rc = get_var(mgr, cap_var, ucm_dev, uc_verb(mgr), &value);
-	if (!rc) {
-		control_name = strdup(value);
-		free((void *)value);
-	}
-
-	return control_name;
-}
-
-inline const char *ucm_get_override_type_name(struct cras_use_case_mgr *mgr,
-					      const char *dev)
-{
-	return ucm_get_value_for_dev(mgr, override_type_name_var, dev);
-}
-
-char *ucm_get_dev_for_jack(struct cras_use_case_mgr *mgr, const char *jack,
-			   enum CRAS_STREAM_DIRECTION direction)
-{
-	struct section_name *section_names, *c;
-	char *ret = NULL;
-
-	section_names =
-		ucm_get_devices_for_var(mgr, jack_dev_var, jack, direction);
-
-	DL_FOREACH (section_names, c) {
-		if (!strcmp(c->name, "Mic")) {
-			/* Skip mic section for output */
-			if (direction == CRAS_STREAM_OUTPUT)
-				continue;
-		} else {
-			/* Only check mic for input. */
-			if (direction == CRAS_STREAM_INPUT)
-				continue;
-		}
-		ret = strdup(c->name);
-		break;
-	}
-
-	DL_FOREACH (section_names, c) {
-		DL_DELETE(section_names, c);
-		free((void *)c->name);
-		free(c);
-	}
-
-	return ret;
-}
-
-char *ucm_get_dev_for_mixer(struct cras_use_case_mgr *mgr, const char *mixer,
-			    enum CRAS_STREAM_DIRECTION dir)
-{
-	struct section_name *section_names = NULL, *c;
-	char *ret = NULL;
-
-	if (dir == CRAS_STREAM_OUTPUT) {
-		section_names = ucm_get_devices_for_var(
-			mgr, playback_mixer_elem_var, mixer, dir);
-	} else if (dir == CRAS_STREAM_INPUT) {
-		section_names = ucm_get_devices_for_var(
-			mgr, capture_mixer_elem_var, mixer, dir);
-	}
-
-	if (section_names)
-		ret = strdup(section_names->name);
-
-	DL_FOREACH (section_names, c) {
-		DL_DELETE(section_names, c);
-		free((void *)c->name);
-		free(c);
-	}
-
-	return ret;
-}
-
-inline const char *ucm_get_edid_file_for_dev(struct cras_use_case_mgr *mgr,
-					     const char *dev)
-{
-	return ucm_get_value_for_dev(mgr, edid_var, dev);
-}
-
-inline const char *ucm_get_dsp_name_for_dev(struct cras_use_case_mgr *mgr,
-					    const char *dev)
-{
-	return ucm_get_value_for_dev(mgr, dsp_name_var, dev);
-}
-
-int ucm_get_min_buffer_level(struct cras_use_case_mgr *mgr, unsigned int *level)
-{
-	int value;
-	int rc;
-
-	rc = get_int(mgr, min_buffer_level_var, "", uc_verb(mgr), &value);
-	if (rc)
-		return -ENOENT;
-	*level = value;
-
-	return 0;
-}
-
-unsigned int ucm_get_disable_software_volume(struct cras_use_case_mgr *mgr)
-{
-	int value;
-	int rc;
-
-	rc = get_int(mgr, disable_software_volume, "", uc_verb(mgr), &value);
-	if (rc)
-		return 0;
-
-	return value;
-}
-
-int ucm_get_default_node_gain(struct cras_use_case_mgr *mgr, const char *dev,
-			      long *gain)
-{
-	int value;
-	int rc;
-
-	rc = get_int(mgr, default_node_gain, dev, uc_verb(mgr), &value);
-	if (rc)
-		return rc;
-	*gain = value;
-	return 0;
-}
-
-int ucm_get_intrinsic_sensitivity(struct cras_use_case_mgr *mgr,
-				  const char *dev, long *sensitivity)
-{
-	int value;
-	int rc;
-
-	rc = get_int(mgr, intrinsic_sensitivity_var, dev, uc_verb(mgr), &value);
-	if (rc)
-		return rc;
-	*sensitivity = value;
-	return 0;
-}
-
-int ucm_get_preempt_hotword(struct cras_use_case_mgr *mgr, const char *dev)
-{
-	int value;
-	int rc;
-
-	rc = get_int(mgr, preempt_hotword_var, dev, uc_verb(mgr), &value);
-	if (rc)
-		return 0;
-	return value;
-}
-
-static int get_device_index_from_target(const char *target_device_name);
-
-int ucm_get_alsa_dev_idx_for_dev(struct cras_use_case_mgr *mgr, const char *dev,
-				 enum CRAS_STREAM_DIRECTION direction)
-{
-	const char *pcm_name = NULL;
-	int dev_idx = -1;
-
-	if (direction == CRAS_STREAM_OUTPUT)
-		pcm_name = ucm_get_playback_device_name_for_dev(mgr, dev);
-	else if (direction == CRAS_STREAM_INPUT)
-		pcm_name = ucm_get_capture_device_name_for_dev(mgr, dev);
-
-	if (pcm_name) {
-		dev_idx = get_device_index_from_target(pcm_name);
-		free((void *)pcm_name);
-	}
-	return dev_idx;
-}
-
-inline const char *
-ucm_get_echo_reference_dev_name_for_dev(struct cras_use_case_mgr *mgr,
-					const char *dev)
-{
-	return ucm_get_value_for_dev(mgr, echo_reference_dev_name_var, dev);
-}
-
-int ucm_get_sample_rate_for_dev(struct cras_use_case_mgr *mgr, const char *dev,
-				enum CRAS_STREAM_DIRECTION direction)
-{
-	int value;
-	int rc;
-	const char *var_name;
-
-	if (direction == CRAS_STREAM_OUTPUT)
-		var_name = playback_device_rate_var;
-	else if (direction == CRAS_STREAM_INPUT)
-		var_name = capture_device_rate_var;
-	else
-		return -EINVAL;
-
-	rc = get_int(mgr, var_name, dev, uc_verb(mgr), &value);
-	if (rc)
-		return rc;
-
-	return value;
-}
-
-int ucm_get_channels_for_dev(struct cras_use_case_mgr *mgr, const char *dev,
-			     enum CRAS_STREAM_DIRECTION direction,
-			     size_t *channels)
-{
-	int value;
-	int rc;
-	const char *var_name;
-
-	if (direction == CRAS_STREAM_OUTPUT)
-		var_name = playback_channels_var;
-	else if (direction == CRAS_STREAM_INPUT)
-		var_name = capture_channels_var;
-	else
-		return -EINVAL;
-
-	rc = get_int(mgr, var_name, dev, uc_verb(mgr), &value);
-	if (rc)
-		return rc;
-	if (value < 0)
-		return -1;
-
-	*channels = (size_t)value;
-	return 0;
-}
-
-int ucm_get_capture_chmap_for_dev(struct cras_use_case_mgr *mgr,
-				  const char *dev, int8_t *channel_layout)
-{
-	const char *var_str;
-	char *tokens, *token;
-	int i, rc;
-
-	rc = get_var(mgr, capture_channel_map_var, dev, uc_verb(mgr), &var_str);
-	if (rc)
-		return rc;
-
-	tokens = strdup(var_str);
-	token = strtok(tokens, " ");
-	for (i = 0; token && (i < CRAS_CH_MAX); i++) {
-		channel_layout[i] = atoi(token);
-		token = strtok(NULL, " ");
-	}
-
-	free((void *)tokens);
-	free((void *)var_str);
-	return (i == CRAS_CH_MAX) ? 0 : -EINVAL;
-}
-
-struct mixer_name *ucm_get_coupled_mixer_names(struct cras_use_case_mgr *mgr,
-					       const char *dev)
-{
-	return ucm_get_mixer_names(mgr, dev, coupled_mixers, CRAS_STREAM_OUTPUT,
-				   MIXER_NAME_VOLUME);
-}
-
-static int get_device_index_from_target(const char *target_device_name)
-{
-	/* Expects a string in the form: hw:card-name,<num> */
-	const char *pos = target_device_name;
-	if (!pos)
-		return -1;
-	while (*pos && *pos != ',')
-		++pos;
-	if (*pos == ',') {
-		++pos;
-		return atoi(pos);
-	}
-	return -1;
-}
-
-static const char *ucm_get_dir_for_device(struct cras_use_case_mgr *mgr,
-					  const char *dev_name,
-					  enum CRAS_STREAM_DIRECTION *dir)
-{
-	const char *pcm_name;
-
-	pcm_name = ucm_get_playback_device_name_for_dev(mgr, dev_name);
-
-	if (pcm_name) {
-		*dir = CRAS_STREAM_OUTPUT;
-		return pcm_name;
-	}
-
-	pcm_name = ucm_get_capture_device_name_for_dev(mgr, dev_name);
-	if (pcm_name) {
-		*dir = CRAS_STREAM_INPUT;
-		return pcm_name;
-	}
-
-	*dir = CRAS_STREAM_UNDEFINED;
-	return NULL;
-}
-
-static int ucm_parse_device_section(struct cras_use_case_mgr *mgr,
-				    const char *dev,
-				    struct ucm_section **sections)
-{
-	enum CRAS_STREAM_DIRECTION dir;
-	int dev_idx = -1;
-	int dependent_dev_idx = -1;
-	const char *jack_name = NULL;
-	const char *jack_type = NULL;
-	const char *jack_dev = NULL;
-	const char *jack_control = NULL;
-	const char *mixer_name = NULL;
-	struct mixer_name *m_name;
-	int rc = 0;
-	const char *pcm_name;
-	const char *dependent_dev_name = NULL;
-	struct ucm_section *dev_sec;
-	const char *dev_name;
-
-	dev_name = strdup(dev);
-	if (!dev_name)
-		return 0;
-
-	pcm_name = ucm_get_dir_for_device(mgr, dev_name, &dir);
-
-	if (pcm_name)
-		dev_idx = get_device_index_from_target(pcm_name);
-
-	if (dir == CRAS_STREAM_UNDEFINED) {
-		syslog(LOG_ERR,
-		       "UCM configuration for device '%s' missing"
-		       " PlaybackPCM or CapturePCM definition.",
-		       dev_name);
-		rc = -EINVAL;
-		goto error_cleanup;
-	}
-
-	dependent_dev_name =
-		ucm_get_dependent_device_name_for_dev(mgr, dev_name);
-	if (dependent_dev_name) {
-		dependent_dev_idx =
-			get_device_index_from_target(dependent_dev_name);
-	}
-
-	jack_dev = ucm_get_jack_dev_for_dev(mgr, dev_name);
-	jack_control = ucm_get_jack_control_for_dev(mgr, dev_name);
-	if (dir == CRAS_STREAM_OUTPUT)
-		mixer_name = ucm_get_playback_mixer_elem_for_dev(mgr, dev_name);
-	else if (dir == CRAS_STREAM_INPUT)
-		mixer_name = ucm_get_capture_mixer_elem_for_dev(mgr, dev_name);
-
-	if (jack_dev) {
-		jack_name = jack_dev;
-		jack_type = "gpio";
-	} else if (jack_control) {
-		jack_name = jack_control;
-		jack_type = "hctl";
-	}
-
-	dev_sec = ucm_section_create(dev_name, pcm_name, dev_idx,
-				     dependent_dev_idx, dir, jack_name,
-				     jack_type);
-
-	if (!dev_sec) {
-		syslog(LOG_ERR, "Failed to allocate memory.");
-		rc = -ENOMEM;
-		goto error_cleanup;
-	}
-
-	dev_sec->jack_switch = ucm_get_jack_switch_for_dev(mgr, dev_name);
-
-	if (mixer_name) {
-		rc = ucm_section_set_mixer_name(dev_sec, mixer_name);
-		if (rc)
-			goto error_cleanup;
-	}
-
-	m_name = ucm_get_mixer_names(mgr, dev_name, coupled_mixers, dir,
-				     MIXER_NAME_VOLUME);
-	ucm_section_concat_coupled(dev_sec, m_name);
-
-	DL_APPEND(*sections, dev_sec);
-	ucm_section_dump(dev_sec);
-error_cleanup:
-	free((void *)dev_name);
-	free((void *)dependent_dev_name);
-	free((void *)jack_dev);
-	free((void *)jack_control);
-	free((void *)mixer_name);
-	free((void *)pcm_name);
-	return rc;
-}
-
-struct ucm_section *ucm_get_sections(struct cras_use_case_mgr *mgr)
-{
-	struct ucm_section *sections = NULL;
-	const char **list;
-	int num_devs;
-	int i;
-	char *identifier;
-
-	/* Find the list of all mixers using the control names defined in
-	 * the header definintion for this function.  */
-	identifier = snd_use_case_identifier("_devices/%s", uc_verb(mgr));
-	num_devs = snd_use_case_get_list(mgr->mgr, identifier, &list);
-	free(identifier);
-
-	/* snd_use_case_get_list fills list with pairs of device name and
-	 * comment, so device names are in even-indexed elements. */
-	for (i = 0; i < num_devs; i += 2) {
-		if (ucm_parse_device_section(mgr, list[i], &sections) < 0) {
-			ucm_section_free_list(sections);
-			sections = NULL;
-			break;
-		}
-	}
-
-	if (num_devs > 0)
-		snd_use_case_free_list(list, num_devs);
-	return sections;
-}
-
-char *ucm_get_hotword_models(struct cras_use_case_mgr *mgr)
-{
-	const char **list;
-	int i, num_entries;
-	int models_len = 0;
-	char *models = NULL;
-	const char *model_name;
-	char *identifier;
-
-	identifier = snd_use_case_identifier("_modifiers/%s", uc_verb(mgr));
-	num_entries = snd_use_case_get_list(mgr->mgr, identifier, &list);
-	free(identifier);
-
-	if (num_entries <= 0)
-		return 0;
-
-	models = (char *)malloc(num_entries *
-				(CRAS_MAX_HOTWORD_MODEL_NAME_SIZE + 1));
-
-	for (i = 0; i < num_entries; i += 2) {
-		if (!list[i])
-			continue;
-
-		if (strncmp(list[i], hotword_model_prefix,
-			    strlen(hotword_model_prefix)))
-			continue;
-
-		model_name = list[i] + strlen(hotword_model_prefix);
-		while (isspace(*model_name))
-			model_name++;
-
-		if (strlen(model_name) > CRAS_MAX_HOTWORD_MODEL_NAME_SIZE) {
-			syslog(LOG_ERR,
-			       "Ignore hotword model %s because the it is"
-			       "too long.",
-			       list[i]);
-			continue;
-		}
-
-		if (models_len != 0)
-			models[models_len++] = ',';
-
-		strcpy(models + models_len, model_name);
-		models_len += strlen(model_name);
-	}
-	models[models_len++] = 0;
-	snd_use_case_free_list(list, num_entries);
-
-	return models;
-}
-
-void ucm_disable_all_hotword_models(struct cras_use_case_mgr *mgr)
-{
-	const char **list;
-	int num_enmods, mod_idx;
-
-	if (!mgr)
-		return;
-
-	/* Disable all currently enabled hotword model modifiers. */
-	num_enmods = snd_use_case_get_list(mgr->mgr, "_enamods", &list);
-	if (num_enmods <= 0)
-		return;
-
-	for (mod_idx = 0; mod_idx < num_enmods; mod_idx++) {
-		if (!strncmp(list[mod_idx], hotword_model_prefix,
-			     strlen(hotword_model_prefix)))
-			ucm_set_modifier_enabled(mgr, list[mod_idx], 0);
-	}
-	snd_use_case_free_list(list, num_enmods);
-}
-
-int ucm_enable_hotword_model(struct cras_use_case_mgr *mgr)
-{
-	if (mgr->hotword_modifier)
-		return ucm_set_modifier_enabled(mgr, mgr->hotword_modifier, 1);
-	return -EINVAL;
-}
-
-static int ucm_is_modifier_enabled(struct cras_use_case_mgr *mgr,
-				   char *modifier, long *value)
-{
-	int rc;
-	char *id;
-	size_t len = strlen(modifier) + 11 + 1;
-
-	id = (char *)malloc(len);
-
-	if (!id)
-		return -ENOMEM;
-
-	snprintf(id, len, "_modstatus/%s", modifier);
-	rc = snd_use_case_geti(mgr->mgr, id, value);
-	free(id);
-	return rc;
-}
-
-int ucm_set_hotword_model(struct cras_use_case_mgr *mgr, const char *model)
-{
-	char *model_mod;
-	long mod_status = 0;
-	size_t model_mod_size =
-		strlen(model) + 1 + strlen(hotword_model_prefix) + 1;
-
-	model_mod = (char *)malloc(model_mod_size);
-
-	if (!model_mod)
-		return -ENOMEM;
-	snprintf(model_mod, model_mod_size, "%s %s", hotword_model_prefix,
-		 model);
-	if (!ucm_mod_exists_with_name(mgr, model_mod)) {
-		free((void *)model_mod);
-		return -EINVAL;
-	}
-
-	/* If check failed, just move on, dont fail incoming model */
-	if (mgr->hotword_modifier)
-		ucm_is_modifier_enabled(mgr, mgr->hotword_modifier,
-					&mod_status);
-
-	ucm_disable_all_hotword_models(mgr);
-	free(mgr->hotword_modifier);
-	mgr->hotword_modifier = model_mod;
-	if (mod_status)
-		return ucm_enable_hotword_model(mgr);
-	return 0;
-}
-
-int ucm_has_fully_specified_ucm_flag(struct cras_use_case_mgr *mgr)
-{
-	char *flag;
-	int ret = 0;
-	flag = ucm_get_flag(mgr, fully_specified_ucm_var);
-	if (!flag)
-		return 0;
-	ret = !strcmp(flag, "1");
-	free(flag);
-	return ret;
-}
-
-inline const char *
-ucm_get_playback_mixer_elem_for_dev(struct cras_use_case_mgr *mgr,
-				    const char *dev)
-{
-	return ucm_get_value_for_dev(mgr, playback_mixer_elem_var, dev);
-}
-
-inline const char *
-ucm_get_capture_mixer_elem_for_dev(struct cras_use_case_mgr *mgr,
-				   const char *dev)
-{
-	return ucm_get_value_for_dev(mgr, capture_mixer_elem_var, dev);
-}
-
-struct mixer_name *ucm_get_main_volume_names(struct cras_use_case_mgr *mgr)
-{
-	return ucm_get_mixer_names(mgr, "", main_volume_names,
-				   CRAS_STREAM_OUTPUT, MIXER_NAME_MAIN_VOLUME);
-}
-
-int ucm_list_section_devices_by_device_name(
-	struct cras_use_case_mgr *mgr, enum CRAS_STREAM_DIRECTION direction,
-	const char *device_name, ucm_list_section_devices_callback cb,
-	void *cb_arg)
-{
-	int listed = 0;
-	struct section_name *section_names, *c;
-	const char *var;
-	char *identifier;
-
-	if (direction == CRAS_STREAM_OUTPUT)
-		var = playback_device_name_var;
-	else if (direction == CRAS_STREAM_INPUT)
-		var = capture_device_name_var;
-	else
-		return 0;
-
-	identifier = snd_use_case_identifier("_devices/%s", uc_verb(mgr));
-	section_names = ucm_get_sections_for_var(mgr, var, device_name,
-						 identifier, direction);
-	free(identifier);
-	if (!section_names)
-		return 0;
-
-	DL_FOREACH (section_names, c) {
-		cb(c->name, cb_arg);
-		listed++;
-	}
-
-	DL_FOREACH (section_names, c) {
-		DL_DELETE(section_names, c);
-		free((void *)c->name);
-		free(c);
-	}
-	return listed;
-}
-
-inline const char *ucm_get_jack_control_for_dev(struct cras_use_case_mgr *mgr,
-						const char *dev)
-{
-	return ucm_get_value_for_dev(mgr, jack_control_var, dev);
-}
-
-inline const char *ucm_get_jack_dev_for_dev(struct cras_use_case_mgr *mgr,
-					    const char *dev)
-{
-	return ucm_get_value_for_dev(mgr, jack_dev_var, dev);
-}
-
-int ucm_get_jack_switch_for_dev(struct cras_use_case_mgr *mgr, const char *dev)
-{
-	int value;
-
-	int rc = get_int(mgr, jack_switch_var, dev, uc_verb(mgr), &value);
-	if (rc || value < 0)
-		return -1;
-	return value;
-}
-
-unsigned int ucm_get_dma_period_for_dev(struct cras_use_case_mgr *mgr,
-					const char *dev)
-{
-	int value;
-
-	int rc = get_int(mgr, dma_period_var, dev, uc_verb(mgr), &value);
-	if (rc || value < 0)
-		return 0;
-	return value;
-}
diff --git a/cras/src/server/cras_alsa_ucm.h b/cras/src/server/cras_alsa_ucm.h
deleted file mode 100644
index 55c3cf6..0000000
--- a/cras/src/server/cras_alsa_ucm.h
+++ /dev/null
@@ -1,512 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef _CRAS_ALSA_UCM_H
-#define _CRAS_ALSA_UCM_H
-
-#include <alsa/asoundlib.h>
-
-#include "cras_alsa_mixer_name.h"
-#include "cras_alsa_ucm_section.h"
-#include "cras_types.h"
-
-struct cras_use_case_mgr;
-
-/* Helpers to access UCM configuration for a card if any is provided.
- * This configuration can specify how to enable or disable certain inputs and
- * outputs on the card.
- */
-
-/* Creates a cras_use_case_mgr instance for the given card name if there is a
- * matching ucm configuration.  It there is a matching UCM config, then it will
- * be configured to the default state.
- *
- * Args:
- *    name - Name of the card to match against the UCM card list.
- * Returns:
- *    A pointer to the use case manager if found, otherwise NULL.  The pointer
- *    must later be freed with ucm_destroy().
- */
-struct cras_use_case_mgr *ucm_create(const char *name);
-
-/* Destroys a cras_use_case_mgr that was returned from ucm_create.
- * Args:
- *    mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
- */
-void ucm_destroy(struct cras_use_case_mgr *mgr);
-
-/* Sets the new use case for the given cras_use_case_mgr.
- * Args:
- *    mgr - The cras_use_case_mgr pointer returned from ucm_create.
- *    use_case - The new use case to be set.
- * Returns:
- *    0 on success or negative error code on failure.
- */
-int ucm_set_use_case(struct cras_use_case_mgr *mgr,
-		     enum CRAS_STREAM_TYPE use_case);
-
-/* Checks if modifier for left right swap mode exists in ucm.
- * Args:
- *    mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
- * Returns:
- *    1 if it exists, 0 otherwise.
- */
-int ucm_swap_mode_exists(struct cras_use_case_mgr *mgr);
-
-/* Enables or disables swap mode for the given node_name. First checks
- * if the modifier is already enabled or disabled.
- * Args:
- *    mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
- *    node_name - The node name.
- *    enable - Enable device if non-zero.
- * Returns:
- *    0 on success or negative error code on failure.
- */
-int ucm_enable_swap_mode(struct cras_use_case_mgr *mgr, const char *node_name,
-			 int enable);
-
-/* Checks if modifier of noise cancellation for given node_name exists in ucm.
- * Args:
- *    mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
- *    node_name - The node name.
- * Returns:
- *    1 if it exists, 0 otherwise.
- */
-int ucm_node_noise_cancellation_exists(struct cras_use_case_mgr *mgr,
-				       const char *node_name);
-
-/* Enables or disables noise cancellation for the given node_name. First checks
- * if the modifier is already enabled or disabled.
- * Args:
- *    mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
- *    node_name - The node name.
- *    enable - Enable device if non-zero.
- * Returns:
- *    0 on success or negative error code on failure.
- */
-int ucm_enable_node_noise_cancellation(struct cras_use_case_mgr *mgr,
-				       const char *node_name, int enable);
-
-/* Enables or disables a UCM device.  First checks if the device is already
- * enabled or disabled.
- * Args:
- *    mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
- *    dev - The ucm device to enable of disable.
- *    enable - Enable device if non-zero.
- * Returns:
- *    0 on success or negative error code on failure.
- */
-int ucm_set_enabled(struct cras_use_case_mgr *mgr, const char *dev, int enable);
-
-/* Gets the value of given flag name.
- * Args:
- *    mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
- *    flag_name - The name of the flag.
- * Returns:
- *    A pointer to the allocated string containing the flag value, or
- *    NULL if the flag is not set.
- */
-char *ucm_get_flag(struct cras_use_case_mgr *mgr, const char *flag_name);
-
-/* Gets the capture control name which associated with given ucm device.
- * Args:
- *    mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
- *    ucm_dev - The ucm device to get capture control for.
- * Returns:
- *    A pointer to the allocated string containing the name of the capture
- *    control, or NULL if no capture control is found.
- */
-char *ucm_get_cap_control(struct cras_use_case_mgr *mgr, const char *ucm_dev);
-
-/* Gets the new node type name which user wants to override the old one for
- * given ucm device.
- * Args:
- *    mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
- *    ucm_dev - The ucm device to override node type.
- * Returns:
- *    A pointer to the allocated string containing the new type name,
- *    or NULL if no override_type_name is found.
- */
-const char *ucm_get_override_type_name(struct cras_use_case_mgr *mgr,
-				       const char *ucm_dev);
-
-/* Gets the name of the ucm device for the given jack name.
- * Args:
- *    mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
- *    jack - The name of the jack to search for.
- *    direction - input or output
- * Rreturns:
- *    A pointer to the allocated string containing the name of the device, or
- *    NULL if no device is found.
- */
-char *ucm_get_dev_for_jack(struct cras_use_case_mgr *mgr, const char *jack,
-			   enum CRAS_STREAM_DIRECTION direction);
-
-/* Gets the name of the ucm device for the given mixer name.
- * Args:
- *    mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
- *    mixer - The name of the mixer control to search for.
- *    dir - input or output
- * Rreturns:
- *    A pointer to the allocated string containing the name of the device, or
- *    NULL if no device is found.
- */
-char *ucm_get_dev_for_mixer(struct cras_use_case_mgr *mgr, const char *mixer,
-			    enum CRAS_STREAM_DIRECTION dir);
-
-/* If there is an EDID file variable specified for dev, return it.  The EDID
- * file will be used for HDMI devices so supported audio formats can be checked.
- * Args:
- *    mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
- *    dev - The device to check for an EDID file.
- * Returns:
- *    A string containing the name of the edid file on Success (Must be freed
- *    later).  NULL if none found.
- */
-const char *ucm_get_edid_file_for_dev(struct cras_use_case_mgr *mgr,
-				      const char *dev);
-
-/* Gets the dsp name which is associated with the given ucm device.
- * Args:
- *    mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
- *    dev - The device to get dsp name for.
- * Returns:
- *    A pointer to the allocated string containing the dsp name, or NULL if no
- *    dsp name is found.
- */
-const char *ucm_get_dsp_name_for_dev(struct cras_use_case_mgr *mgr,
-				     const char *dev);
-
-/* Gets the minimum buffer level for an output.  This level will add latency to
- * all streams playing on the output, but can be used to work around an
- * unreliable dma residue.
- * Args:
- *    mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
- *    level - The pointer to the returned value.
- *
- */
-int ucm_get_min_buffer_level(struct cras_use_case_mgr *mgr,
-			     unsigned int *level);
-
-/* Gets the flag for disabling software volume.
- * Args:
- *    mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
- * Returns:
- *    0 on success, -ENOENT on failure.
- */
-unsigned int ucm_get_disable_software_volume(struct cras_use_case_mgr *mgr);
-
-/* Gets the value for default node gain.
- * Args:
- *    mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
- *    dev - The device to check for default node gain.
- *    gain - The pointer to the returned value.
- * Returns:
- *    0 on success, other error codes on failure.
- */
-int ucm_get_default_node_gain(struct cras_use_case_mgr *mgr, const char *dev,
-			      long *gain);
-
-/* Gets the value for intrinsic sensitivity.
- * Args:
- *    mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
- *    dev - The device to query for intrinsic volume.
- *    sensitivity - The pointer to the returned value.
- * Returns:
- *    0 on success, other error codes on failure.
- */
-int ucm_get_intrinsic_sensitivity(struct cras_use_case_mgr *mgr,
-				  const char *dev, long *sensitivity);
-
-/* Gets the flag if an input device can preempt hotword recording.
- * Args:
- *    mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
- *    dev - The device to check for preempt hotword flag.
- * Returns:
- *    Non-zero value means input can preempt hotword recording, otherwise
- *    return zero.
- */
-int ucm_get_preempt_hotword(struct cras_use_case_mgr *mgr, const char *dev);
-
-/* Gets the ALSA device index on the card for given UCM dev.
- *
- * Args:
- *    mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
- *    dev - The UCM device to check for ALSA device index.
- *    direction - playback(CRAS_STREAM_OUTPUT) or capture(CRAS_STREAM_INPUT).
- * Returns:
- *    Non-negative integer for the ALSA device index on the card, -1 if not
- *    found. The ALSA device index is parsed from the PCM name which is
- *    formatted as "hw:<some-name>,<idx>".
- */
-int ucm_get_alsa_dev_idx_for_dev(struct cras_use_case_mgr *mgr, const char *dev,
-				 enum CRAS_STREAM_DIRECTION direction);
-
-/* Gets the node name of the echo reference device on the card.
- * Args:
- *    mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
- *    dev - The device to check echo reference for.
- * Returns:
- *    String containing the node name of the echo reference to this
- *    dev, caller is responsible to free it later. NULL if echo reference
- *    doesn't exist.
- */
-const char *
-ucm_get_echo_reference_dev_name_for_dev(struct cras_use_case_mgr *mgr,
-					const char *dev);
-
-/* Gets the sample rate at which to run this device.
- *
- * Args:
- *    mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
- *    dev - The device to check for sample rate.
- *    direction - playback(CRAS_STREAM_OUTPUT) or capture(CRAS_STREAM_INPUT).
- * Returns:
- *    The sample rate if specified, or negative error if not.
- */
-int ucm_get_sample_rate_for_dev(struct cras_use_case_mgr *mgr, const char *dev,
-				enum CRAS_STREAM_DIRECTION direction);
-
-/* Gets the channel count at which to run this device.
- *
- * Args:
- *    mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
- *    dev - The device to check for channel count.
- *    direction - playback(CRAS_STREAM_OUTPUT) or capture(CRAS_STREAM_INPUT).
- *    channels - The pointer to the returned channel count.
- * Returns:
- *    0 on success, other error codes on failure.
- */
-int ucm_get_channels_for_dev(struct cras_use_case_mgr *mgr, const char *dev,
-			     enum CRAS_STREAM_DIRECTION direction,
-			     size_t *channels);
-
-/* Gets the capture channel map for this device.
- * Args:
- *    mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
- *    dev - The device to check for capture channel map.
- *    channel_layout - The channel layout to fill.
- */
-int ucm_get_capture_chmap_for_dev(struct cras_use_case_mgr *mgr,
-				  const char *dev, int8_t *channel_layout);
-
-/* Gets the mixer names for the coupled mixer controls of this device
- * on the card.
- *
- * Args:
- *    mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
- *    dev - The device to check for coupled mixer controls.
- * Returns:
- *    A list of cras_alsa_control.
- */
-struct mixer_name *ucm_get_coupled_mixer_names(struct cras_use_case_mgr *mgr,
-					       const char *dev);
-
-/* Gets a list of UCM sections
- *
- * The data includes the represented devices and their controls.
- *
- * Args:
- *    mgr - The cras_use_case_mgr pointer return from alsa_ucm_create.
- *
- * Returns:
- *    A list of ucm_section or NULL. Free it with ucm_section_free_list().
- */
-struct ucm_section *ucm_get_sections(struct cras_use_case_mgr *mgr);
-
-/* Gets the list of supported hotword model names.
- * Args:
- *    mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
- * Returns:
- *    String containing comma separated model names, e.g 'en,fr,zh'. Needs
- *    to be freed by caller.
- */
-char *ucm_get_hotword_models(struct cras_use_case_mgr *mgr);
-
-/* Sets the desired hotword model.
- * Args:
- *    mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
- *    model - locale for model
- * Returns:
- *    0 on success or negative error code on failure.
- */
-int ucm_set_hotword_model(struct cras_use_case_mgr *mgr, const char *model);
-
-/* Enable previously set hotword modifier
- * Args:
- *    mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
- * Returns:
- *    0 on success or negative error code on failure.
- */
-int ucm_enable_hotword_model(struct cras_use_case_mgr *mgr);
-
-/* Disable all hotword model modifiers
- * Args:
- *    mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
- */
-void ucm_disable_all_hotword_models(struct cras_use_case_mgr *mgr);
-
-/* Checks if this card has fully specified UCM config.
- *
- * Args:
- *   mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
- * Returns:
- *   1 if this UCM uses fully specified UCM config. 0 otherwise.
- */
-int ucm_has_fully_specified_ucm_flag(struct cras_use_case_mgr *mgr);
-
-/* Gets the playback mixer name of this device on the card.
- *
- * Args:
- *    mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
- *    dev - The device to check for device name
- * Returns:
- *    A pointer to the allocated string containing the mixer name, or NULL
- *    if no device name is found.
- */
-const char *ucm_get_playback_mixer_elem_for_dev(struct cras_use_case_mgr *mgr,
-						const char *dev);
-
-/* Gets the capture mixer name of this device on the card.
- *
- * Args:
- *    mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
- *    dev - The device to check for device name
- * Returns:
- *    A pointer to the allocated string containing the mixer name, or NULL
- *    if no device name is found.
- */
-const char *ucm_get_capture_mixer_elem_for_dev(struct cras_use_case_mgr *mgr,
-					       const char *dev);
-
-/* Gets the mixer names for the main volume controls on the card.
- *
- * The main volume controls in the list are considered in series.
- * If 3 controls are specified, MainVolumeNames "A,B,C", with dB ranges
- * A=-10dB~0dB, B=-20dB~0dB, C=-30dB~0dB, then applying -35dB overall volume
- * sets A=-10dB, B=-20dB, C=-5dB.
- * The volume control affects all output on this card, e.g.
- * speaker and headphone.
- *
- * Args:
- *    mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
- * Returns:
- *    names - A list of mixer_name.
- */
-struct mixer_name *ucm_get_main_volume_names(struct cras_use_case_mgr *mgr);
-
-/* The callback to be provided with a reference to the section name.
- *
- * Args:
- *    section_name: The name of a SectionDevice in UCM.
- *    arg - Argument to pass to this callback.
- */
-typedef void (*ucm_list_section_devices_callback)(const char *section_name,
-						  void *arg);
-
-/* Invokes the provided callback once for each section with matched device name.
- *
- * Iterate through each SectionDevice in UCM of this card. Invoke callback if
- * "PlaybackPCM" for output or "CapturePCM" for input of the section matches
- * the specified device_name.
- *
- * Args:
- *    mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
- *    device_name - A string for device name of format "card_name:device_index".
- *    cb - Function to call for each section.
- *    cb_arg - Argument to pass to cb.
- * Returns:
- *    Number of sections listed.
- */
-int ucm_list_section_devices_by_device_name(
-	struct cras_use_case_mgr *mgr, enum CRAS_STREAM_DIRECTION direction,
-	const char *device_name, ucm_list_section_devices_callback cb,
-	void *cb_arg);
-
-/* Gets the jack name of this device on the card.
- *
- * Args:
- *    mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
- *    dev - The device to check for jack name.
- * Returns:
- *    A pointer to the allocated string containing the jack name, or NULL
- *    if no jack name is found.
- */
-const char *ucm_get_jack_name_for_dev(struct cras_use_case_mgr *mgr,
-				      const char *dev);
-
-/* Gets the jack type of this device on the card.
- *
- * Args:
- *    mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
- *    dev - The device to check for jack type.
- * Returns:
- *    A pointer to the allocated string containing the jack type, or NULL
- *    if no jack type is found or the found jack type is invalid. The valid
- *    jack types are "hctl" or "gpio".
- */
-const char *ucm_get_jack_type_for_dev(struct cras_use_case_mgr *mgr,
-				      const char *dev);
-
-/* Gets the jack dev of this device on the card.
- *
- * Args:
- *    mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
- *    dev - The device to check for jack name.
- * Returns:
- *    A pointer to the allocated string containing the input jack name, or NULL
- *    if no jack name is found.
- */
-const char *ucm_get_jack_dev_for_dev(struct cras_use_case_mgr *mgr,
-				     const char *dev);
-
-/* Gets the jack control of this device on the card.
- *
- * Args:
- *    mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
- *    dev - The device to check for jack type.
- * Returns:
- *    A pointer to the allocated string containing the alsa jack name, or NULL
- *    if no jack type is found or the found jack type is invalid.
- */
-const char *ucm_get_jack_control_for_dev(struct cras_use_case_mgr *mgr,
-					 const char *dev);
-
-/* Gets the jack switch number for this device.
- * Some sound cards can detect multiple types of connections into the
- * audio jack - for example distinguish between line-out and headphones
- * by measuring the impedance on the other end. In that case we want each
- * jack to have it's own I/O node so that each can have it's own volume
- * settings. This allows us to specify the jack used more exactly.
- * Valid values are defined in /usr/include/linux/input.h.
- * Args:
- *    mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
- *    dev - The device to check.
- * Returns:
- *    A value >= 0 when the switch is defined, or -1 otherwise.
- */
-int ucm_get_jack_switch_for_dev(struct cras_use_case_mgr *mgr, const char *dev);
-
-/* Gets the DMA period time in microseconds for the given device.
- *
- * Args:
- *    mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
- *    dev - The device to check.
- * Returns:
- *    A value > 0, or 0 if no period is defined.
- */
-unsigned int ucm_get_dma_period_for_dev(struct cras_use_case_mgr *mgr,
-					const char *dev);
-
-/* Gets the flag of optimization for no stream state.
- * This flag enables no_stream ops in alsa_io.
- * Args:
- *    mgr - The cras_use_case_mgr pointer returned from alsa_ucm_create.
- * Returns:
- *    1 if the flag is enabled. 0 otherwise.
- */
-unsigned int ucm_get_optimize_no_stream_flag(struct cras_use_case_mgr *mgr);
-
-#endif /* _CRAS_ALSA_UCM_H */
diff --git a/cras/src/server/cras_alsa_ucm_section.c b/cras/src/server/cras_alsa_ucm_section.c
deleted file mode 100644
index d4df8c7..0000000
--- a/cras/src/server/cras_alsa_ucm_section.c
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Copyright 2016 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <stdlib.h>
-#include <string.h>
-#include <syslog.h>
-
-#include "cras_alsa_ucm_section.h"
-#include "cras_alsa_mixer_name.h"
-#include "utlist.h"
-
-static void ucm_section_free(struct ucm_section *section)
-{
-	free((void *)section->name);
-	free((void *)section->pcm_name);
-	free((void *)section->jack_name);
-	free((void *)section->jack_type);
-	free((void *)section->mixer_name);
-	mixer_name_free(section->coupled);
-	free(section);
-}
-
-void ucm_section_free_list(struct ucm_section *sections)
-{
-	struct ucm_section *section;
-	DL_FOREACH (sections, section) {
-		DL_DELETE(sections, section);
-		ucm_section_free(section);
-	}
-}
-
-struct ucm_section *ucm_section_create(const char *name, const char *pcm_name,
-				       int dev_idx, int dependent_dev_idx,
-				       enum CRAS_STREAM_DIRECTION dir,
-				       const char *jack_name,
-				       const char *jack_type)
-{
-	struct ucm_section *section_list = NULL;
-	struct ucm_section *section;
-
-	if (!name)
-		return NULL;
-
-	section = (struct ucm_section *)calloc(1, sizeof(struct ucm_section));
-	if (!section)
-		return NULL;
-
-	section->dev_idx = dev_idx;
-	section->dependent_dev_idx = dependent_dev_idx;
-	section->dir = dir;
-	section->name = strdup(name);
-	if (!section->name)
-		goto error;
-
-	section->pcm_name = strdup(pcm_name);
-	if (!section->pcm_name)
-		goto error;
-
-	if (jack_name) {
-		section->jack_name = strdup(jack_name);
-		if (!section->jack_name)
-			goto error;
-	}
-	if (jack_type) {
-		section->jack_type = strdup(jack_type);
-		if (!section->jack_type)
-			goto error;
-	}
-	/* Default to -1 which means auto-detect. */
-	section->jack_switch = -1;
-
-	/* Make sure to initialize this item as a list. */
-	DL_APPEND(section_list, section);
-	return section_list;
-
-error:
-	ucm_section_free(section);
-	return NULL;
-}
-
-int ucm_section_set_mixer_name(struct ucm_section *section, const char *name)
-{
-	if (!section || !name)
-		return -EINVAL;
-
-	if (section->mixer_name)
-		free((void *)section->mixer_name);
-	section->mixer_name = strdup(name);
-	if (!section->mixer_name)
-		return -ENOMEM;
-	return 0;
-}
-
-int ucm_section_add_coupled(struct ucm_section *section, const char *name,
-			    mixer_name_type type)
-{
-	struct mixer_name *m_name;
-
-	if (!section || !name || type == MIXER_NAME_UNDEFINED)
-		return -EINVAL;
-
-	m_name = mixer_name_add(NULL, name, section->dir, type);
-	if (!m_name)
-		return -ENOMEM;
-	DL_APPEND(section->coupled, m_name);
-	return 0;
-}
-
-int ucm_section_concat_coupled(struct ucm_section *section,
-			       struct mixer_name *coupled)
-{
-	if (!section || !coupled)
-		return -EINVAL;
-	DL_CONCAT(section->coupled, coupled);
-	return 0;
-}
-
-void ucm_section_dump(struct ucm_section *section)
-{
-	syslog(LOG_DEBUG, "section: %s [%d] (%s)", section->name,
-	       section->dev_idx,
-	       section->dir == CRAS_STREAM_OUTPUT ? "output" : "input");
-	syslog(LOG_DEBUG, "  jack: %s %s", section->jack_name,
-	       section->jack_type);
-	syslog(LOG_DEBUG, "  mixer_name: %s", section->mixer_name);
-	mixer_name_dump(section->coupled, "  coupled");
-}
diff --git a/cras/src/server/cras_alsa_ucm_section.h b/cras/src/server/cras_alsa_ucm_section.h
deleted file mode 100644
index 77c5ed8..0000000
--- a/cras/src/server/cras_alsa_ucm_section.h
+++ /dev/null
@@ -1,117 +0,0 @@
-/* Copyright 2016 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef _CRAS_ALSA_UCM_SECTION_H
-#define _CRAS_ALSA_UCM_SECTION_H
-
-#include "cras_types.h"
-#include "cras_alsa_mixer_name.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Represents an ALSA UCM section. */
-struct ucm_section {
-	/* Section name. */
-	const char *name;
-	/* Value of PlaybackPCM or CapturePCM. */
-	const char *pcm_name;
-	/* Device PCM index. */
-	int dev_idx;
-	/* Device PCM index to associate this section to. */
-	int dependent_dev_idx;
-	/* Output or Input. */
-	enum CRAS_STREAM_DIRECTION dir;
-	/* Associated jack's name. */
-	const char *jack_name;
-	/* Associated jack's type. */
-	const char *jack_type;
-	/* Switch number for jack from linux/input.h, or -1. */
-	int jack_switch;
-	/* (Playback/Capture)MixerElem value. */
-	const char *mixer_name;
-	/* CoupledMixers value. */
-	struct mixer_name *coupled;
-	struct ucm_section *prev, *next;
-};
-
-/* Create a single UCM section.
- *
- * Args:
- *    name - Section name (must not be NULL).
- *    pcm_name - PCM name used for snd_pcm_open.
- *    dev_idx - Section's device index (PCM number).
- *    dependent_dev_idx - Another ALSA device index (PCM number) under which
- *        we want to make this section a node.
- *    dir - Device direction: INPUT or OUTPUT.
- *    jack_name - Name of an associated jack (or NULL).
- *    jack_type - Type of the associated jack (or NULL).
- *
- * Returns:
- *    A valid pointer on success, NULL for memory allocation error.
- */
-struct ucm_section *ucm_section_create(const char *name, const char *pcm_name,
-				       int dev_idx, int dependent_dev_idx,
-				       enum CRAS_STREAM_DIRECTION dir,
-				       const char *jack_name,
-				       const char *jack_type);
-
-/* Sets the mixer_name value for the given section.
- *
- * Args:
- *    section - Section to manipulate.
- *    name - The name of the control.
- *
- * Returns:
- *    0 for success, -EINVAL for invalid arguments, or -ENOMEM.
- */
-int ucm_section_set_mixer_name(struct ucm_section *section, const char *name);
-
-/* Add a single coupled control to this section.
- * Control has the same direction as the section.
- *
- * Args:
- *    section - Section to manipulate.
- *    name - Coupled control name to add.
- *    type - The type of control.
- *
- * Returns:
- *    0 for success, -EINVAL for invalid arguments, or -ENOMEM.
- */
-int ucm_section_add_coupled(struct ucm_section *section, const char *name,
-			    mixer_name_type type);
-
-/* Concatenate a list of coupled controls to this section.
- *
- * Args:
- *    section - Section to manipulate.
- *    coupled - Coupled control names to add.
- *
- * Returns:
- *    0 for success, -EINVAL for invalid arguments (NULL args).
- */
-int ucm_section_concat_coupled(struct ucm_section *section,
-			       struct mixer_name *coupled);
-
-/* Frees a list of sections.
- *
- * Args:
- *    sections - List of sections to free.
- */
-void ucm_section_free_list(struct ucm_section *sections);
-
-/* Dump details on this section to syslog(LOG_DEBUG).
- *
- * Args:
- *    section - Section to dump.
- */
-void ucm_section_dump(struct ucm_section *section);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _CRAS_ALSA_MIXER_NAME_H */
diff --git a/cras/src/server/cras_apm_list.c b/cras/src/server/cras_apm_list.c
deleted file mode 100644
index ab89113..0000000
--- a/cras/src/server/cras_apm_list.c
+++ /dev/null
@@ -1,730 +0,0 @@
-/* Copyright 2018 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <inttypes.h>
-#include <string.h>
-#include <syslog.h>
-
-#include <webrtc-apm/webrtc_apm.h>
-
-#include "byte_buffer.h"
-#include "cras_apm_list.h"
-#include "cras_audio_area.h"
-#include "cras_audio_format.h"
-#include "cras_dsp_pipeline.h"
-#include "cras_iodev.h"
-#include "cras_iodev_list.h"
-#include "dsp_util.h"
-#include "dumper.h"
-#include "float_buffer.h"
-#include "iniparser_wrapper.h"
-#include "utlist.h"
-
-#define AEC_CONFIG_NAME "aec.ini"
-#define APM_CONFIG_NAME "apm.ini"
-
-/*
- * Structure holding a WebRTC audio processing module and necessary
- * info to process and transfer input buffer from device to stream.
- *
- * Below chart describes the buffer structure inside APM and how an input buffer
- * flows from a device through the APM to stream. APM processes audio buffers in
- * fixed 10ms width, and that's the main reason we need two copies of the
- * buffer:
- * (1) to cache input buffer from device until 10ms size is filled.
- * (2) to store the interleaved buffer, of 10ms size also, after APM processing.
- *
- *  ________   _______     _______________________________
- *  |      |   |     |     |_____________APM ____________|
- *  |input |-> | DSP |---> ||           |    |          || -> stream 1
- *  |device|   |     | |   || float buf | -> | byte buf ||
- *  |______|   |_____| |   ||___________|    |__________||
- *                     |   |_____________________________|
- *                     |   _______________________________
- *                     |-> |             APM 2           | -> stream 2
- *                     |   |_____________________________|
- *                     |                                       ...
- *                     |
- *                     |------------------------------------> stream N
- *
- * Members:
- *    apm_ptr - An APM instance from libwebrtc_audio_processing
- *    dev_ptr - Pointer to the device this APM is associated with.
- *    buffer - Stores the processed/interleaved data ready for stream to read.
- *    fbuffer - Stores the floating pointer buffer from input device waiting
- *        for APM to process.
- *    dev_fmt - The format used by the iodev this APM attaches to.
- *    fmt - The audio data format configured for this APM.
- *    area - The cras_audio_area used for copying processed data to client
- *        stream.
- *    work_queue - A task queue instance created and destroyed by
- *        libwebrtc_apm.
- *    is_aec_use_case - True if the input and output devices pair is in the
- *        typical AEC use case. This flag decides whether to use settings
- *        tuned specifically for this hardware if exists. Otherwise it uses
- *        the generic settings like run inside browser.
- */
-struct cras_apm {
-	webrtc_apm apm_ptr;
-	void *dev_ptr;
-	struct byte_buffer *buffer;
-	struct float_buffer *fbuffer;
-	struct cras_audio_format dev_fmt;
-	struct cras_audio_format fmt;
-	struct cras_audio_area *area;
-	void *work_queue;
-	bool is_aec_use_case;
-	struct cras_apm *prev, *next;
-};
-
-/*
- * Lists of cras_apm instances created for a stream. A stream may
- * have more than one cras_apm when multiple input devices are
- * enabled. The most common scenario is the silent input iodev be
- * enabled when CRAS switches active input device.
- *
- * Note that cras_apm_list is owned and modified in main thread.
- * Only in synchronized audio thread event this cras_apm_list is safe
- * to access for passing single APM instance between threads.
- */
-struct cras_apm_list {
-	void *stream_ptr;
-	uint64_t effects;
-	struct cras_apm *apms;
-	struct cras_apm_list *prev, *next;
-};
-
-/*
- * Wrappers of APM instances that are active, which means it is associated
- * to a dev/stream pair in audio thread and ready for processing.
- *
- * Members:
- *    apm - The APM for audio data processing.
- *    stream_ptr - Stream pointer from the associated dev/stream pair.
- *    effects - The effecets bit map of APM.
- */
-struct active_apm {
-	struct cras_apm *apm;
-	void *stream_ptr;
-	int effects;
-	struct active_apm *prev, *next;
-} * active_apms;
-
-/*
- * Object used to analyze playback audio from output iodev. It is responsible
- * to get buffer containing latest output data and provide it to the APM
- * instances which want to analyze reverse stream.
- * Member:
- *    ext - The interface implemented to process reverse(output) stream
- *        data in various formats.
- *    fbuf - Middle buffer holding reverse data for APMs to analyze.
- *    odev - Pointer to the output iodev playing audio as the reverse
- *        stream. NULL if there's no playback stream.
- *    dev_rate - The sample rate odev is opened for.
- *    process_reverse - Flag to indicate if there's APM has effect that
- *        needs to process reverse stream.
- */
-struct cras_apm_reverse_module {
-	struct ext_dsp_module ext;
-	struct float_buffer *fbuf;
-	struct cras_iodev *odev;
-	unsigned int dev_rate;
-	unsigned process_reverse;
-};
-
-static struct cras_apm_reverse_module *rmodule = NULL;
-static const char *aec_config_dir = NULL;
-static char ini_name[MAX_INI_NAME_LENGTH + 1];
-static dictionary *aec_ini = NULL;
-static dictionary *apm_ini = NULL;
-
-/* Update the global process reverse flag. Should be called when apms are added
- * or removed. */
-static void update_process_reverse_flag()
-{
-	struct active_apm *active;
-
-	if (!rmodule)
-		return;
-	rmodule->process_reverse = 0;
-	DL_FOREACH (active_apms, active) {
-		rmodule->process_reverse |=
-			!!(active->effects & APM_ECHO_CANCELLATION);
-	}
-}
-
-static void apm_destroy(struct cras_apm **apm)
-{
-	if (*apm == NULL)
-		return;
-	byte_buffer_destroy(&(*apm)->buffer);
-	float_buffer_destroy(&(*apm)->fbuffer);
-	cras_audio_area_destroy((*apm)->area);
-
-	/* Any unfinished AEC dump handle will be closed. */
-	webrtc_apm_destroy((*apm)->apm_ptr);
-	free(*apm);
-	*apm = NULL;
-}
-
-struct cras_apm_list *cras_apm_list_create(void *stream_ptr, uint64_t effects)
-{
-	struct cras_apm_list *list;
-
-	if (effects == 0)
-		return NULL;
-
-	list = (struct cras_apm_list *)calloc(1, sizeof(*list));
-	if (list == NULL) {
-		syslog(LOG_ERR, "No memory in creating apm list");
-		return NULL;
-	}
-	list->stream_ptr = stream_ptr;
-	list->effects = effects;
-	list->apms = NULL;
-
-	return list;
-}
-
-static struct active_apm *get_active_apm(void *stream_ptr, void *dev_ptr)
-{
-	struct active_apm *active;
-
-	DL_FOREACH (active_apms, active) {
-		if ((active->apm->dev_ptr == dev_ptr) &&
-		    (active->stream_ptr == stream_ptr))
-			return active;
-	}
-	return NULL;
-}
-
-struct cras_apm *cras_apm_list_get_active_apm(void *stream_ptr, void *dev_ptr)
-{
-	struct active_apm *active = get_active_apm(stream_ptr, dev_ptr);
-	return active ? active->apm : NULL;
-}
-
-uint64_t cras_apm_list_get_effects(struct cras_apm_list *list)
-{
-	if (list == NULL)
-		return 0;
-	else
-		return list->effects;
-}
-
-void cras_apm_list_remove_apm(struct cras_apm_list *list, void *dev_ptr)
-{
-	struct cras_apm *apm;
-
-	DL_FOREACH (list->apms, apm) {
-		if (apm->dev_ptr == dev_ptr) {
-			DL_DELETE(list->apms, apm);
-			apm_destroy(&apm);
-		}
-	}
-}
-
-/*
- * WebRTC APM handles no more than stereo + keyboard mic channels.
- * Ignore keyboard mic feature for now because that requires processing on
- * mixed buffer from two input devices. Based on that we should modify the best
- * channel layout for APM use.
- * Args:
- *    apm_fmt - Pointer to a format struct already filled with the value of
- *        the open device format. Its content may be modified for APM use.
- */
-static void get_best_channels(struct cras_audio_format *apm_fmt)
-{
-	int ch;
-	int8_t layout[CRAS_CH_MAX];
-
-	/* Using the format from dev_fmt is dangerous because input device
-	 * could have wild configurations like unuse the 1st channel and
-	 * connects 2nd channel to the only mic. Data in the first channel
-	 * is what APM cares about so always construct a new channel layout
-	 * containing subset of original channels that matches either FL, FR,
-	 * or FC.
-	 * TODO(hychao): extend the logic when we have a stream that wants
-	 * to record channels like RR(rear right).
-	 */
-	for (ch = 0; ch < CRAS_CH_MAX; ch++)
-		layout[ch] = -1;
-
-	apm_fmt->num_channels = 0;
-	if (apm_fmt->channel_layout[CRAS_CH_FL] != -1)
-		layout[CRAS_CH_FL] = apm_fmt->num_channels++;
-	if (apm_fmt->channel_layout[CRAS_CH_FR] != -1)
-		layout[CRAS_CH_FR] = apm_fmt->num_channels++;
-	if (apm_fmt->channel_layout[CRAS_CH_FC] != -1)
-		layout[CRAS_CH_FC] = apm_fmt->num_channels++;
-
-	for (ch = 0; ch < CRAS_CH_MAX; ch++)
-		apm_fmt->channel_layout[ch] = layout[ch];
-}
-
-struct cras_apm *cras_apm_list_add_apm(struct cras_apm_list *list,
-				       void *dev_ptr,
-				       const struct cras_audio_format *dev_fmt,
-				       bool is_aec_use_case)
-{
-	struct cras_apm *apm;
-
-	DL_FOREACH (list->apms, apm)
-		if (apm->dev_ptr == dev_ptr)
-			return apm;
-
-	// TODO(hychao): Remove the check when we enable more effects.
-	if (!(list->effects & APM_ECHO_CANCELLATION))
-		return NULL;
-
-	apm = (struct cras_apm *)calloc(1, sizeof(*apm));
-
-	/* Configures APM to the format used by input device. If the channel
-	 * count is larger than stereo, use the standard channel count/layout
-	 * in APM. */
-	apm->dev_fmt = *dev_fmt;
-	apm->fmt = *dev_fmt;
-	get_best_channels(&apm->fmt);
-
-	/* Use tuned settings only when the forward dev(capture) and reverse
-	 * dev(playback) both are in typical AEC use case. */
-	apm->is_aec_use_case = is_aec_use_case;
-	if (rmodule->odev) {
-		apm->is_aec_use_case &=
-			cras_iodev_is_aec_use_case(rmodule->odev->active_node);
-	}
-
-	/* Use the configs tuned specifically for internal device. Otherwise
-	 * just pass NULL so every other settings will be default. */
-	apm->apm_ptr =
-		apm->is_aec_use_case ?
-			webrtc_apm_create(apm->fmt.num_channels,
-					  apm->fmt.frame_rate, aec_ini,
-					  apm_ini) :
-			webrtc_apm_create(apm->fmt.num_channels,
-					  apm->fmt.frame_rate, NULL, NULL);
-	if (apm->apm_ptr == NULL) {
-		syslog(LOG_ERR,
-		       "Fail to create webrtc apm for ch %zu"
-		       " rate %zu effect %" PRIu64,
-		       dev_fmt->num_channels, dev_fmt->frame_rate,
-		       list->effects);
-		free(apm);
-		return NULL;
-	}
-
-	apm->dev_ptr = dev_ptr;
-	apm->work_queue = NULL;
-
-	/* WebRTC APM wants 10 ms equivalence of data to process. */
-	apm->buffer = byte_buffer_create(10 * apm->fmt.frame_rate / 1000 *
-					 cras_get_format_bytes(&apm->fmt));
-	apm->fbuffer = float_buffer_create(10 * apm->fmt.frame_rate / 1000,
-					   apm->fmt.num_channels);
-	apm->area = cras_audio_area_create(apm->fmt.num_channels);
-	cras_audio_area_config_channels(apm->area, &apm->fmt);
-
-	DL_APPEND(list->apms, apm);
-
-	return apm;
-}
-
-void cras_apm_list_start_apm(struct cras_apm_list *list, void *dev_ptr)
-{
-	struct active_apm *active;
-	struct cras_apm *apm;
-
-	if (list == NULL)
-		return;
-
-	/* Check if this apm has already been started. */
-	apm = cras_apm_list_get_active_apm(list->stream_ptr, dev_ptr);
-	if (apm)
-		return;
-
-	DL_SEARCH_SCALAR(list->apms, apm, dev_ptr, dev_ptr);
-	if (apm == NULL)
-		return;
-
-	active = (struct active_apm *)calloc(1, sizeof(*active));
-	if (active == NULL) {
-		syslog(LOG_ERR, "No memory to start apm.");
-		return;
-	}
-	active->apm = apm;
-	active->stream_ptr = list->stream_ptr;
-	active->effects = list->effects;
-	DL_APPEND(active_apms, active);
-
-	update_process_reverse_flag();
-}
-
-void cras_apm_list_stop_apm(struct cras_apm_list *list, void *dev_ptr)
-{
-	struct active_apm *active;
-
-	if (list == NULL)
-		return;
-
-	active = get_active_apm(list->stream_ptr, dev_ptr);
-	if (active) {
-		DL_DELETE(active_apms, active);
-		free(active);
-	}
-
-	update_process_reverse_flag();
-}
-
-int cras_apm_list_destroy(struct cras_apm_list *list)
-{
-	struct cras_apm *apm;
-
-	DL_FOREACH (list->apms, apm) {
-		DL_DELETE(list->apms, apm);
-		apm_destroy(&apm);
-	}
-	free(list);
-
-	return 0;
-}
-
-/*
- * Determines the iodev to be used as the echo reference for APM reverse
- * analysis. If there exists the special purpose "echo reference dev" then
- * use it. Otherwise just use this output iodev.
- */
-static struct cras_iodev *get_echo_reference_target(struct cras_iodev *iodev)
-{
-	return iodev->echo_reference_dev ? iodev->echo_reference_dev : iodev;
-}
-
-/*
- * Updates the first enabled output iodev in the list, determine the echo
- * reference target base on this output iodev, and register rmodule as ext dsp
- * module to this echo reference target.
- * When this echo reference iodev is opened and audio data flows through its
- * dsp pipeline, APMs will anaylize the reverse stream. This is expected to be
- * called in main thread when output devices enable/dsiable state changes.
- */
-static void update_first_output_dev_to_process()
-{
-	struct cras_iodev *echo_ref;
-	struct cras_iodev *iodev =
-		cras_iodev_list_get_first_enabled_iodev(CRAS_STREAM_OUTPUT);
-
-	if (iodev == NULL)
-		return;
-
-	echo_ref = get_echo_reference_target(iodev);
-
-	/* If rmodule is already tracking echo_ref, do nothing. */
-	if (rmodule->odev == echo_ref)
-		return;
-
-	/* Detach from the old iodev that rmodule was tracking. */
-	if (rmodule->odev) {
-		cras_iodev_set_ext_dsp_module(rmodule->odev, NULL);
-		rmodule->odev = NULL;
-	}
-
-	rmodule->odev = echo_ref;
-	cras_iodev_set_ext_dsp_module(echo_ref, &rmodule->ext);
-}
-
-static void handle_device_enabled(struct cras_iodev *iodev, void *cb_data)
-{
-	if (iodev->direction != CRAS_STREAM_OUTPUT)
-		return;
-
-	/* Register to the first enabled output device. */
-	update_first_output_dev_to_process();
-}
-
-static void handle_device_disabled(struct cras_iodev *iodev, void *cb_data)
-{
-	struct cras_iodev *echo_ref;
-
-	if (iodev->direction != CRAS_STREAM_OUTPUT)
-		return;
-
-	echo_ref = get_echo_reference_target(iodev);
-
-	if (rmodule->odev == echo_ref) {
-		cras_iodev_set_ext_dsp_module(echo_ref, NULL);
-		rmodule->odev = NULL;
-	}
-
-	/* Register to the first enabled output device. */
-	update_first_output_dev_to_process();
-}
-
-static int process_reverse(struct float_buffer *fbuf, unsigned int frame_rate)
-{
-	struct active_apm *active;
-	int ret;
-	float *const *wp;
-
-	if (float_buffer_writable(fbuf))
-		return 0;
-
-	wp = float_buffer_write_pointer(fbuf);
-
-	DL_FOREACH (active_apms, active) {
-		if (!(active->effects & APM_ECHO_CANCELLATION))
-			continue;
-
-		ret = webrtc_apm_process_reverse_stream_f(active->apm->apm_ptr,
-							  fbuf->num_channels,
-							  frame_rate, wp);
-		if (ret) {
-			syslog(LOG_ERR, "APM process reverse err");
-			return ret;
-		}
-	}
-	float_buffer_reset(fbuf);
-	return 0;
-}
-
-void reverse_data_run(struct ext_dsp_module *ext, unsigned int nframes)
-{
-	struct cras_apm_reverse_module *rmod =
-		(struct cras_apm_reverse_module *)ext;
-	unsigned int writable;
-	int i, offset = 0;
-	float *const *wp;
-
-	if (!rmod->process_reverse)
-		return;
-
-	while (nframes) {
-		process_reverse(rmod->fbuf, rmod->dev_rate);
-		writable = float_buffer_writable(rmod->fbuf);
-		writable = MIN(nframes, writable);
-		wp = float_buffer_write_pointer(rmod->fbuf);
-		for (i = 0; i < rmod->fbuf->num_channels; i++)
-			memcpy(wp[i], ext->ports[i] + offset,
-			       writable * sizeof(float));
-
-		offset += writable;
-		float_buffer_written(rmod->fbuf, writable);
-		nframes -= writable;
-	}
-}
-
-void reverse_data_configure(struct ext_dsp_module *ext,
-			    unsigned int buffer_size, unsigned int num_channels,
-			    unsigned int rate)
-{
-	struct cras_apm_reverse_module *rmod =
-		(struct cras_apm_reverse_module *)ext;
-	if (rmod->fbuf)
-		float_buffer_destroy(&rmod->fbuf);
-	rmod->fbuf = float_buffer_create(rate / 100, num_channels);
-	rmod->dev_rate = rate;
-}
-
-static void get_aec_ini(const char *config_dir)
-{
-	snprintf(ini_name, MAX_INI_NAME_LENGTH, "%s/%s", config_dir,
-		 AEC_CONFIG_NAME);
-	ini_name[MAX_INI_NAME_LENGTH] = '\0';
-
-	if (aec_ini) {
-		iniparser_freedict(aec_ini);
-		aec_ini = NULL;
-	}
-	aec_ini = iniparser_load_wrapper(ini_name);
-	if (aec_ini == NULL)
-		syslog(LOG_INFO, "No aec ini file %s", ini_name);
-}
-
-static void get_apm_ini(const char *config_dir)
-{
-	snprintf(ini_name, MAX_INI_NAME_LENGTH, "%s/%s", config_dir,
-		 APM_CONFIG_NAME);
-	ini_name[MAX_INI_NAME_LENGTH] = '\0';
-
-	if (apm_ini) {
-		iniparser_freedict(apm_ini);
-		apm_ini = NULL;
-	}
-	apm_ini = iniparser_load_wrapper(ini_name);
-	if (apm_ini == NULL)
-		syslog(LOG_INFO, "No apm ini file %s", ini_name);
-}
-
-int cras_apm_list_init(const char *device_config_dir)
-{
-	if (rmodule == NULL) {
-		rmodule = (struct cras_apm_reverse_module *)calloc(
-			1, sizeof(*rmodule));
-		rmodule->ext.run = reverse_data_run;
-		rmodule->ext.configure = reverse_data_configure;
-	}
-
-	aec_config_dir = device_config_dir;
-	get_aec_ini(aec_config_dir);
-	get_apm_ini(aec_config_dir);
-
-	update_first_output_dev_to_process();
-	cras_iodev_list_set_device_enabled_callback(
-		handle_device_enabled, handle_device_disabled, rmodule);
-
-	return 0;
-}
-
-void cras_apm_list_reload_aec_config()
-{
-	if (NULL == aec_config_dir)
-		return;
-
-	get_aec_ini(aec_config_dir);
-	get_apm_ini(aec_config_dir);
-
-	/* Dump the config content at reload only, for debug. */
-	webrtc_apm_dump_configs(apm_ini, aec_ini);
-}
-
-int cras_apm_list_deinit()
-{
-	if (rmodule) {
-		if (rmodule->fbuf)
-			float_buffer_destroy(&rmodule->fbuf);
-		free(rmodule);
-		rmodule = NULL;
-	}
-	return 0;
-}
-
-int cras_apm_list_process(struct cras_apm *apm, struct float_buffer *input,
-			  unsigned int offset)
-{
-	unsigned int writable, nframes, nread;
-	int ch, i, j, ret;
-	float *const *wp;
-	float *const *rp;
-
-	nread = float_buffer_level(input);
-	if (nread < offset) {
-		syslog(LOG_ERR, "Process offset exceeds read level");
-		return -EINVAL;
-	}
-
-	writable = float_buffer_writable(apm->fbuffer);
-	writable = MIN(nread - offset, writable);
-
-	nframes = writable;
-	while (nframes) {
-		nread = nframes;
-		wp = float_buffer_write_pointer(apm->fbuffer);
-		rp = float_buffer_read_pointer(input, offset, &nread);
-
-		for (i = 0; i < apm->fbuffer->num_channels; i++) {
-			/* Look up the channel position and copy from
-			 * the correct index of |input| buffer.
-			 */
-			for (ch = 0; ch < CRAS_CH_MAX; ch++)
-				if (apm->fmt.channel_layout[ch] == i)
-					break;
-			if (ch == CRAS_CH_MAX)
-				continue;
-
-			j = apm->dev_fmt.channel_layout[ch];
-			if (j == -1)
-				continue;
-
-			memcpy(wp[i], rp[j], nread * sizeof(float));
-		}
-
-		nframes -= nread;
-		offset += nread;
-
-		float_buffer_written(apm->fbuffer, nread);
-	}
-
-	/* process and move to int buffer */
-	if ((float_buffer_writable(apm->fbuffer) == 0) &&
-	    (buf_queued(apm->buffer) == 0)) {
-		nread = float_buffer_level(apm->fbuffer);
-		rp = float_buffer_read_pointer(apm->fbuffer, 0, &nread);
-		ret = webrtc_apm_process_stream_f(apm->apm_ptr,
-						  apm->fmt.num_channels,
-						  apm->fmt.frame_rate, rp);
-		if (ret) {
-			syslog(LOG_ERR, "APM process stream f err");
-			return ret;
-		}
-
-		dsp_util_interleave(rp, buf_write_pointer(apm->buffer),
-				    apm->fbuffer->num_channels, apm->fmt.format,
-				    nread);
-		buf_increment_write(apm->buffer,
-				    nread * cras_get_format_bytes(&apm->fmt));
-		float_buffer_reset(apm->fbuffer);
-	}
-
-	return writable;
-}
-
-struct cras_audio_area *cras_apm_list_get_processed(struct cras_apm *apm)
-{
-	uint8_t *buf_ptr;
-
-	buf_ptr = buf_read_pointer_size(apm->buffer, &apm->area->frames);
-	apm->area->frames /= cras_get_format_bytes(&apm->fmt);
-	cras_audio_area_config_buf_pointers(apm->area, &apm->fmt, buf_ptr);
-	return apm->area;
-}
-
-void cras_apm_list_put_processed(struct cras_apm *apm, unsigned int frames)
-{
-	buf_increment_read(apm->buffer,
-			   frames * cras_get_format_bytes(&apm->fmt));
-}
-
-struct cras_audio_format *cras_apm_list_get_format(struct cras_apm *apm)
-{
-	return &apm->fmt;
-}
-
-bool cras_apm_list_get_use_tuned_settings(struct cras_apm *apm)
-{
-	/* If input and output devices in AEC use case, plus that a
-	 * tuned setting is provided. */
-	return apm->is_aec_use_case && (aec_ini || apm_ini);
-}
-
-void cras_apm_list_set_aec_dump(struct cras_apm_list *list, void *dev_ptr,
-				int start, int fd)
-{
-	struct cras_apm *apm;
-	char file_name[256];
-	int rc;
-	FILE *handle;
-
-	DL_SEARCH_SCALAR(list->apms, apm, dev_ptr, dev_ptr);
-	if (apm == NULL)
-		return;
-
-	if (start) {
-		handle = fdopen(fd, "w");
-		if (handle == NULL) {
-			syslog(LOG_ERR, "Create dump handle fail, errno %d",
-			       errno);
-			return;
-		}
-		/* webrtc apm will own the FILE handle and close it. */
-		rc = webrtc_apm_aec_dump(apm->apm_ptr, &apm->work_queue, start,
-					 handle);
-		if (rc)
-			syslog(LOG_ERR, "Fail to dump debug file %s, rc %d",
-			       file_name, rc);
-	} else {
-		rc = webrtc_apm_aec_dump(apm->apm_ptr, &apm->work_queue, 0,
-					 NULL);
-		if (rc)
-			syslog(LOG_ERR, "Failed to stop apm debug, rc %d", rc);
-	}
-}
diff --git a/cras/src/server/cras_apm_list.h b/cras/src/server/cras_apm_list.h
deleted file mode 100644
index 7a36cea..0000000
--- a/cras/src/server/cras_apm_list.h
+++ /dev/null
@@ -1,248 +0,0 @@
-/* Copyright 2018 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_APM_LIST_H_
-#define CRAS_APM_LIST_H_
-
-#include "cras_types.h"
-
-struct cras_audio_area;
-struct cras_audio_format;
-struct cras_apm;
-struct cras_apm_list;
-struct float_buffer;
-
-#ifdef HAVE_WEBRTC_APM
-
-/* Initialize the apm list for analyzing output data. */
-int cras_apm_list_init(const char *device_config_dir);
-
-/* Reloads the aec config. Used for debug and tuning. */
-void cras_apm_list_reload_aec_config();
-
-/* Deinitialize apm list to free all allocated resources. */
-int cras_apm_list_deinit();
-
-/*
- * Creates an list to hold all APM instances created when a stream
- * attaches to iodev(s). This should be called in main thread.
- *
- * Below diagram explains the life cycle of an APM instance, how are
- * related APIs used, and in which thread should each API be called.
- *
- * Main thread                     Audio thread
- * maintaining apm_list            maintaining active_apms
- * -----------                     ------------
- * cras_apm_list_create
- * cras_apm_list_add_apm    ->     cras_apm_list_start_apm
- *
- *                                 cras_apm_list_get_active_apm
- *                                 cras_apm_list_process
- *                                 cras_apm_list_get_processed
- *                                 cras_apm_list_put_processed
- *
- * cras_apm_list_remove_apm <-     cras_apm_list_stop_apm
- * cras_apm_list_destroy
- *
- * Args:
- *    stream_ptr - Pointer to the stream.
- *    effects - Bit map specifying the enabled effects on this stream.
- */
-struct cras_apm_list *cras_apm_list_create(void *stream_ptr, uint64_t effects);
-
-/*
- * Creates a cras_apm associated to given dev_ptr and adds it to the list.
- * If there already exists an APM instance linked to dev_ptr, we assume
- * the open format is unchanged so just return it. This should be called
- * in main thread.
- * Args:
- *    list - The list holding APM instances.
- *    dev_ptr - Pointer to the iodev to add new APM for.
- *    fmt - Format of the audio data used for this cras_apm.
- *    is_aec_use_case - If the dev_ptr is for typical AEC use case.
- */
-struct cras_apm *cras_apm_list_add_apm(struct cras_apm_list *list,
-				       void *dev_ptr,
-				       const struct cras_audio_format *fmt,
-				       bool is_aec_use_case);
-
-/*
- * Gets the active APM instance that is associated to given stream and dev pair.
- * This should be called in audio thread.
- * Args:
- *    stream_ptr - Pointer to the stream.
- *    dev_ptr - The iodev as key to look up associated APM.
- */
-struct cras_apm *cras_apm_list_get_active_apm(void *stream_ptr, void *dev_ptr);
-
-/*
- * Starts the APM instance in the list that is associated with dev_ptr by
- * adding it to the active APM list in audio thread.
- */
-void cras_apm_list_start_apm(struct cras_apm_list *list, void *dev_ptr);
-
-/*
- * Stops the APM instance in the list that is associated with dev_ptr by
- * removing it from the active APM list in audio thread.
- */
-void cras_apm_list_stop_apm(struct cras_apm_list *list, void *dev_ptr);
-
-/*
- * Gets the effects bit map of the APM list.
- * Args:
- *    list - The list holding APM instances.
- */
-uint64_t cras_apm_list_get_effects(struct cras_apm_list *list);
-
-/* Removes a cras_apm from list and destroys it. */
-int cras_apm_list_destroy(struct cras_apm_list *list);
-
-/*
- * Removes an APM from the list, expected to be used when an iodev is no
- * longer open for the client stream holding the APM list. This should
- * be called in main thread.
- * Args:
- *    list - The list holding APM instances.
- *    dev_ptr - Device pointer used to look up which apm to remove.
- */
-void cras_apm_list_remove_apm(struct cras_apm_list *list, void *dev_ptr);
-
-/* Passes audio data from hardware for cras_apm to process.
- * Args:
- *    apm - The cras_apm instance.
- *    input - Float buffer from device for apm to process.
- *    offset - Offset in |input| to note the data position to start
- *        reading.
- */
-int cras_apm_list_process(struct cras_apm *apm, struct float_buffer *input,
-			  unsigned int offset);
-
-/* Gets the APM processed data in the form of audio area.
- * Args:
- *    apm - The cras_apm instance that owns the audio area pointer and
- *        processed data.
- * Returns:
- *    The audio area used to read processed data. No need to free
- *    by caller.
- */
-struct cras_audio_area *cras_apm_list_get_processed(struct cras_apm *apm);
-
-/* Tells |apm| that |frames| of processed data has been used, so |apm|
- * can allocate space to read more from input device.
- * Args:
- *    apm - The cras_apm instance owns the processed data.
- *    frames - The number in frames of processed data to mark as used.
- */
-void cras_apm_list_put_processed(struct cras_apm *apm, unsigned int frames);
-
-/* Gets the format of the actual data processed by webrtc-apm library.
- * Args:
- *    apm - The cras_apm instance holding audio data and format info.
- */
-struct cras_audio_format *cras_apm_list_get_format(struct cras_apm *apm);
-
-/*
- * Gets if this apm instance is using tuned settings.
- */
-bool cras_apm_list_get_use_tuned_settings(struct cras_apm *apm);
-
-/* Sets debug recording to start or stop.
- * Args:
- *    list - List contains the apm instance to start/stop debug recording.
- *    dev_ptr - Use as key to look up specific apm to do aec dump.
- *    start - True to set debug recording start, otherwise stop.
- *    fd - File descriptor to aec dump destination.
- */
-void cras_apm_list_set_aec_dump(struct cras_apm_list *list, void *dev_ptr,
-				int start, int fd);
-
-#else
-
-/*
- * If webrtc audio processing library is not available then define all
- * cras_apm_list functions as empty. As long as cras_apm_list_add returns
- * NULL, non of the other functions should be called.
- */
-static inline int cras_apm_list_init(const char *device_config_dir)
-{
-	return 0;
-}
-static inline void cras_apm_list_reload_aec_config()
-{
-}
-static inline struct cras_apm_list *cras_apm_list_create(void *stream_ptr,
-							 unsigned int effects)
-{
-	return NULL;
-}
-static inline struct cras_apm *
-cras_apm_list_add_apm(struct cras_apm_list *list, void *dev_ptr,
-		      const struct cras_audio_format *fmt, bool is_aec_use_case)
-{
-	return NULL;
-}
-static inline struct cras_apm *cras_apm_list_get_active_apm(void *stream_ptr,
-							    void *dev_ptr)
-{
-	return NULL;
-}
-static inline uint64_t cras_apm_list_get_effects(struct cras_apm_list *list)
-{
-	return 0;
-}
-static inline int cras_apm_list_destroy(struct cras_apm_list *list)
-{
-	return 0;
-}
-static inline void cras_apm_list_remove_apm(struct cras_apm_list *list,
-					    void *dev_ptr)
-{
-}
-
-static inline int cras_apm_list_process(struct cras_apm *apm,
-					struct float_buffer *input,
-					unsigned int offset)
-{
-	return 0;
-}
-
-static inline struct cras_audio_area *
-cras_apm_list_get_processed(struct cras_apm *apm)
-{
-	return NULL;
-}
-
-static inline void cras_apm_list_put_processed(struct cras_apm *apm,
-					       unsigned int frames)
-{
-}
-static inline void cras_apm_list_start_apm(struct cras_apm_list *list,
-					   void *dev_ptr)
-{
-}
-static inline void cras_apm_list_stop_apm(struct cras_apm_list *list,
-					  void *dev_ptr)
-{
-}
-
-static inline struct cras_audio_format *
-cras_apm_list_get_format(struct cras_apm *apm)
-{
-	return NULL;
-}
-
-static inline bool cras_apm_list_get_use_tuned_settings(struct cras_apm *apm)
-{
-	return 0;
-}
-
-static inline void cras_apm_list_set_aec_dump(struct cras_apm_list *list,
-					      void *dev_ptr, int start, int fd)
-{
-}
-
-#endif /* HAVE_WEBRTC_APM */
-
-#endif /* CRAS_APM_LIST_H_ */
diff --git a/cras/src/server/cras_audio_area.c b/cras/src/server/cras_audio_area.c
deleted file mode 100644
index 1861573..0000000
--- a/cras/src/server/cras_audio_area.c
+++ /dev/null
@@ -1,105 +0,0 @@
-/* Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <stdlib.h>
-#include <sys/param.h>
-
-#include "cras_audio_area.h"
-#include "cras_audio_format.h"
-#include "cras_mix.h"
-
-struct cras_audio_area *cras_audio_area_create(int num_channels)
-{
-	struct cras_audio_area *area;
-	size_t sz;
-
-	sz = sizeof(*area) + num_channels * sizeof(struct cras_channel_area);
-	area = calloc(1, sz);
-	area->num_channels = num_channels;
-
-	return area;
-}
-
-unsigned int cras_audio_area_copy(const struct cras_audio_area *dst,
-				  unsigned int dst_offset,
-				  const struct cras_audio_format *dst_fmt,
-				  const struct cras_audio_area *src,
-				  unsigned int src_offset,
-				  float software_gain_scaler)
-{
-	unsigned int src_idx, dst_idx;
-	unsigned int ncopy;
-	uint8_t *schan, *dchan;
-
-	ncopy = MIN(src->frames - src_offset, dst->frames - dst_offset);
-
-	/* TODO(dgreid) - this replaces a memcpy, it needs to be way faster. */
-	for (src_idx = 0; src_idx < src->num_channels; src_idx++) {
-		for (dst_idx = 0; dst_idx < dst->num_channels; dst_idx++) {
-			if (!(src->channels[src_idx].ch_set &
-			      dst->channels[dst_idx].ch_set))
-				continue;
-
-			schan = src->channels[src_idx].buf +
-				src_offset * src->channels[src_idx].step_bytes;
-			dchan = dst->channels[dst_idx].buf +
-				dst_offset * dst->channels[dst_idx].step_bytes;
-
-			cras_mix_add_scale_stride(
-				dst_fmt->format, dchan, schan, ncopy,
-				dst->channels[dst_idx].step_bytes,
-				src->channels[src_idx].step_bytes,
-				software_gain_scaler);
-		}
-	}
-
-	return ncopy;
-}
-
-void cras_audio_area_destroy(struct cras_audio_area *area)
-{
-	free(area);
-}
-
-void cras_audio_area_config_channels(struct cras_audio_area *area,
-				     const struct cras_audio_format *fmt)
-{
-	unsigned int i, ch;
-
-	/* For mono, config the channel type to match both front
-	 * left and front right.
-	 * TODO(hychao): add more mapping when we have like {FL, FC}
-	 * for mono + kb mic.
-	 */
-	if ((fmt->num_channels == 1) &&
-	    ((fmt->channel_layout[CRAS_CH_FC] == 0) ||
-	     (fmt->channel_layout[CRAS_CH_FL] == 0))) {
-		channel_area_set_channel(area->channels, CRAS_CH_FL);
-		channel_area_set_channel(area->channels, CRAS_CH_FR);
-		return;
-	}
-
-	for (i = 0; i < fmt->num_channels; i++) {
-		area->channels[i].ch_set = 0;
-		for (ch = 0; ch < CRAS_CH_MAX; ch++)
-			if (fmt->channel_layout[ch] == i)
-				channel_area_set_channel(&area->channels[i],
-							 ch);
-	}
-}
-
-void cras_audio_area_config_buf_pointers(struct cras_audio_area *area,
-					 const struct cras_audio_format *fmt,
-					 uint8_t *base_buffer)
-{
-	int i;
-	const int sample_size = snd_pcm_format_physical_width(fmt->format) / 8;
-
-	/* TODO(dgreid) - assuming interleaved audio here for now. */
-	for (i = 0; i < area->num_channels; i++) {
-		area->channels[i].step_bytes = cras_get_format_bytes(fmt);
-		area->channels[i].buf = base_buffer + i * sample_size;
-	}
-}
diff --git a/cras/src/server/cras_audio_area.h b/cras/src/server/cras_audio_area.h
deleted file mode 100644
index fe04232..0000000
--- a/cras/src/server/cras_audio_area.h
+++ /dev/null
@@ -1,99 +0,0 @@
-/* Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_AUDIO_AREA_H_
-#define CRAS_AUDIO_AREA_H_
-
-#include <stdint.h>
-
-#include "cras_audio_format.h"
-
-/*
- * Descriptor of the memory area holding a channel of audio.
- * Members:
- *    ch_set - Bit set of channels this channel area could map to.
- *    step_bytes - The number of bytes between adjacent samples.
- *    buf - A pointer to the start address of this area.
- */
-struct cras_channel_area {
-	unsigned int ch_set;
-	unsigned int step_bytes;
-	uint8_t *buf;
-};
-
-/*
- * Descriptor of the memory area that provides various access to audio channels.
- * Members:
- *    frames - The size of the audio buffer in frames.
- *    num_channels - The number of channels in the audio area.
- *    channels - array of channel areas.
- */
-struct cras_audio_area {
-	unsigned int frames;
-	unsigned int num_channels;
-	struct cras_channel_area channels[];
-};
-
-/*
- * Sets the channel bit for a channel area.
- * Args:
- *    ca - the channel area to set channel bit set.
- *    channel - the channel bit to add to the channel area.
- */
-static inline void channel_area_set_channel(struct cras_channel_area *ca,
-					    enum CRAS_CHANNEL channel)
-{
-	ca->ch_set |= (1 << channel);
-}
-
-/*
- * Creates a cras_audio_area.
- * Args:
- *    num_channels - The number of channels in the audio area.
-*/
-struct cras_audio_area *cras_audio_area_create(int num_channels);
-
-/*
- * Copies a cras_audio_area to another cras_audio_area with given offset.
- * Args:
- *    dst - The destination audio area.
- *    dst_offset - The offset of dst audio area in frames.
- *    format - The format of dst area.
- *    src - The source audio area.
- *    src_offset - The offset of src audio area in frames.
- *    software_gain_scaler - The software gain scaler needed.
- * Returns the number of frames copied.
- */
-unsigned int cras_audio_area_copy(const struct cras_audio_area *dst,
-				  unsigned int dst_offset,
-				  const struct cras_audio_format *dst_fmt,
-				  const struct cras_audio_area *src,
-				  unsigned int src_offset,
-				  float software_gain_scaler);
-
-/*
- * Destroys a cras_audio_area.
- * Args:
- *    area - the audio area to destroy
- */
-void cras_audio_area_destroy(struct cras_audio_area *area);
-
-/*
- * Configures the channel types based on the audio format.
- * Args:
- *    area - The audio area created with cras_audio_area_create.
- *    fmt - The format to use to configure the channels.
- */
-void cras_audio_area_config_channels(struct cras_audio_area *area,
-				     const struct cras_audio_format *fmt);
-
-/*
- * Sets the buffer pointers for each channel.
- */
-void cras_audio_area_config_buf_pointers(struct cras_audio_area *area,
-					 const struct cras_audio_format *fmt,
-					 uint8_t *base_buffer);
-
-#endif /* CRAS_AUDIO_AREA_H_ */
diff --git a/cras/src/server/cras_audio_thread_monitor.c b/cras/src/server/cras_audio_thread_monitor.c
deleted file mode 100644
index ed3afba..0000000
--- a/cras/src/server/cras_audio_thread_monitor.c
+++ /dev/null
@@ -1,139 +0,0 @@
-/* Copyright 2018 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <stdbool.h>
-#include <syslog.h>
-#include "audio_thread.h"
-#include "cras_iodev_list.h"
-#include "cras_main_message.h"
-#include "cras_system_state.h"
-#include "cras_types.h"
-#include "cras_util.h"
-
-#define MIN_WAIT_SECOND 30
-
-struct cras_audio_thread_event_message {
-	struct cras_main_message header;
-	enum CRAS_AUDIO_THREAD_EVENT_TYPE event_type;
-};
-
-static void take_snapshot(enum CRAS_AUDIO_THREAD_EVENT_TYPE event_type)
-{
-	struct cras_audio_thread_snapshot *snapshot;
-
-	snapshot = (struct cras_audio_thread_snapshot *)calloc(
-		1, sizeof(struct cras_audio_thread_snapshot));
-	struct timespec now_time;
-	clock_gettime(CLOCK_MONOTONIC_RAW, &now_time);
-	snapshot->timestamp = now_time;
-	snapshot->event_type = event_type;
-	audio_thread_dump_thread_info(cras_iodev_list_get_audio_thread(),
-				      &snapshot->audio_debug_info);
-	cras_system_state_add_snapshot(snapshot);
-}
-
-static void cras_audio_thread_event_message_init(
-	struct cras_audio_thread_event_message *msg,
-	enum CRAS_AUDIO_THREAD_EVENT_TYPE event_type)
-{
-	msg->header.type = CRAS_MAIN_AUDIO_THREAD_EVENT;
-	msg->header.length = sizeof(*msg);
-	msg->event_type = event_type;
-}
-
-int cras_audio_thread_event_send(enum CRAS_AUDIO_THREAD_EVENT_TYPE event_type)
-{
-	struct cras_audio_thread_event_message msg;
-	cras_audio_thread_event_message_init(&msg, event_type);
-	return cras_main_message_send(&msg.header);
-}
-
-int cras_audio_thread_event_a2dp_overrun()
-{
-	return cras_audio_thread_event_send(AUDIO_THREAD_EVENT_A2DP_OVERRUN);
-}
-
-int cras_audio_thread_event_a2dp_throttle()
-{
-	return cras_audio_thread_event_send(AUDIO_THREAD_EVENT_A2DP_THROTTLE);
-}
-
-int cras_audio_thread_event_debug()
-{
-	return cras_audio_thread_event_send(AUDIO_THREAD_EVENT_DEBUG);
-}
-
-int cras_audio_thread_event_busyloop()
-{
-	return cras_audio_thread_event_send(AUDIO_THREAD_EVENT_BUSYLOOP);
-}
-
-int cras_audio_thread_event_underrun()
-{
-	return cras_audio_thread_event_send(AUDIO_THREAD_EVENT_UNDERRUN);
-}
-
-int cras_audio_thread_event_severe_underrun()
-{
-	return cras_audio_thread_event_send(AUDIO_THREAD_EVENT_SEVERE_UNDERRUN);
-}
-
-int cras_audio_thread_event_drop_samples()
-{
-	return cras_audio_thread_event_send(AUDIO_THREAD_EVENT_DROP_SAMPLES);
-}
-
-int cras_audio_thread_event_dev_overrun()
-{
-	return cras_audio_thread_event_send(AUDIO_THREAD_EVENT_DEV_OVERRUN);
-}
-
-static struct timespec last_event_snapshot_time[AUDIO_THREAD_EVENT_TYPE_COUNT];
-
-/*
- * Callback function for handling audio thread events in main thread,
- * which takes a snapshot of the audio thread and waits at least 30 seconds
- * for the same event type. Events with the same event type within 30 seconds
- * will be ignored by the handle function.
- */
-static void handle_audio_thread_event_message(struct cras_main_message *msg,
-					      void *arg)
-{
-	struct cras_audio_thread_event_message *audio_thread_msg =
-		(struct cras_audio_thread_event_message *)msg;
-	struct timespec now_time;
-
-	/*
-	 * Skip invalid event types
-	 */
-	if (audio_thread_msg->event_type >= AUDIO_THREAD_EVENT_TYPE_COUNT)
-		return;
-
-	struct timespec *last_snapshot_time =
-		&last_event_snapshot_time[audio_thread_msg->event_type];
-
-	clock_gettime(CLOCK_REALTIME, &now_time);
-
-	/*
-	 * Wait at least 30 seconds for the same event type
-	 */
-	struct timespec diff_time;
-	subtract_timespecs(&now_time, last_snapshot_time, &diff_time);
-	if ((last_snapshot_time->tv_sec == 0 &&
-	     last_snapshot_time->tv_nsec == 0) ||
-	    diff_time.tv_sec >= MIN_WAIT_SECOND) {
-		take_snapshot(audio_thread_msg->event_type);
-		*last_snapshot_time = now_time;
-	}
-}
-
-int cras_audio_thread_monitor_init()
-{
-	memset(last_event_snapshot_time, 0,
-	       sizeof(struct timespec) * AUDIO_THREAD_EVENT_TYPE_COUNT);
-	cras_main_message_add_handler(CRAS_MAIN_AUDIO_THREAD_EVENT,
-				      handle_audio_thread_event_message, NULL);
-	return 0;
-}
diff --git a/cras/src/server/cras_audio_thread_monitor.h b/cras/src/server/cras_audio_thread_monitor.h
deleted file mode 100644
index 39b2176..0000000
--- a/cras/src/server/cras_audio_thread_monitor.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/* Copyright 2018 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_AUDIO_THREAD_MONITOR_H_
-#define CRAS_AUDIO_THREAD_MONITOR_H_
-
-/*
- * Notifies the main thread when A2DP buffer overruns.
- */
-int cras_audio_thread_event_a2dp_overrun();
-
-/*
- * Notifies the main thread when A2DP packet transmittion throttles.
- */
-int cras_audio_thread_event_a2dp_throttle();
-
-/*
- * Sends a debug event to the audio thread for debugging.
- */
-int cras_audio_thread_event_debug();
-
-/*
- * Notifies the main thread when a busyloop event happens.
- */
-int cras_audio_thread_event_busyloop();
-
-/*
- * Notifies the main thread when a underrun event happens.
- */
-int cras_audio_thread_event_underrun();
-
-/*
- * Notifies the main thread when a severe underrun event happens.
- */
-int cras_audio_thread_event_severe_underrun();
-
-/*
- * Notifies the main thread when a drop samples event happens.
- */
-int cras_audio_thread_event_drop_samples();
-
-/*
- * Notifies the main thread when a device overrun event happens.
- */
-int cras_audio_thread_event_dev_overrun();
-
-/*
- * Initializes audio thread monitor and sets main thread callback.
- */
-int cras_audio_thread_monitor_init();
-
-#endif /* CRAS_AUDIO_THREAD_MONITOR_H_ */
diff --git a/cras/src/server/cras_bt_adapter.c b/cras/src/server/cras_bt_adapter.c
deleted file mode 100644
index bcdecef..0000000
--- a/cras/src/server/cras_bt_adapter.c
+++ /dev/null
@@ -1,383 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <dbus/dbus.h>
-
-#include <errno.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <string.h>
-#include <syslog.h>
-#include <sys/socket.h>
-#include <sys/ioctl.h>
-
-#include "bluetooth.h"
-#include "cras_bt_adapter.h"
-#include "cras_bt_constants.h"
-#include "utlist.h"
-
-/*
- * Object to represent a bluetooth adapter on the system. Used to query the
- * capabilities regarding certain bluetooth audio.
- * Members:
- *    conn - The dbus connection used to send message to bluetoothd.
- *    object_path - Object path of the bluetooth adapter.
- *    address - The BT address of this adapter.
- *    name - The readable name of this adapter.
- *    bluetooth_class - The bluetooth class of device.
- *    powered - Powered on or off.
- *    bus_type - Type of bus this adapter runs on.
- *    wide_band_speech - If this adapter supports wide band speech.
- */
-struct cras_bt_adapter {
-	DBusConnection *conn;
-	char *object_path;
-	char *address;
-	char *name;
-	uint32_t bluetooth_class;
-	int powered;
-	int bus_type;
-	int wide_band_speech;
-
-	struct cras_bt_adapter *prev, *next;
-};
-
-static struct cras_bt_adapter *adapters;
-
-static int cras_bt_adapter_query_bus_type(struct cras_bt_adapter *adapter)
-{
-	static const char *hci_str = "hci";
-	struct hci_dev_info dev_info;
-	char *pos;
-	int ctl, err;
-
-	/* Object path [variable prefix]/{hci0,hci1,...} */
-	pos = strstr(adapter->object_path, hci_str);
-	if (!pos)
-		return -1;
-
-	ctl = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI);
-	if (ctl < 0) {
-		syslog(LOG_ERR, "Error creating HCI ctl socket");
-		return -1;
-	}
-
-	/* dev_id = 0 for hci0 */
-	dev_info.type = 0;
-	dev_info.dev_id = atoi(pos + 3);
-	err = ioctl(ctl, HCIGETDEVINFO, (void *)&dev_info);
-	if (err) {
-		syslog(LOG_ERR, "HCI get dev info error %s", strerror(errno));
-		close(ctl);
-		return -1;
-	}
-	if ((dev_info.type & 0x0f) < HCI_BUS_MAX)
-		adapter->bus_type = (dev_info.type & 0x0f);
-
-	close(ctl);
-	return 0;
-}
-
-struct cras_bt_adapter *cras_bt_adapter_create(DBusConnection *conn,
-					       const char *object_path)
-{
-	struct cras_bt_adapter *adapter;
-
-	adapter = calloc(1, sizeof(*adapter));
-	if (adapter == NULL)
-		return NULL;
-
-	adapter->conn = conn;
-	adapter->object_path = strdup(object_path);
-	if (adapter->object_path == NULL) {
-		free(adapter);
-		return NULL;
-	}
-
-	DL_APPEND(adapters, adapter);
-
-	/* Set bus type to USB as default when query fails. */
-	if (cras_bt_adapter_query_bus_type(adapter))
-		adapter->bus_type = HCI_USB;
-
-	return adapter;
-}
-
-void cras_bt_adapter_destroy(struct cras_bt_adapter *adapter)
-{
-	DL_DELETE(adapters, adapter);
-
-	free(adapter->object_path);
-	free(adapter->address);
-	free(adapter->name);
-	free(adapter);
-}
-
-void cras_bt_adapter_reset()
-{
-	while (adapters) {
-		syslog(LOG_INFO, "Bluetooth Adapter: %s removed",
-		       adapters->address);
-		cras_bt_adapter_destroy(adapters);
-	}
-}
-
-struct cras_bt_adapter *cras_bt_adapter_get(const char *object_path)
-{
-	struct cras_bt_adapter *adapter;
-
-	if (object_path == NULL)
-		return NULL;
-
-	DL_FOREACH (adapters, adapter) {
-		if (strcmp(adapter->object_path, object_path) == 0)
-			return adapter;
-	}
-
-	return NULL;
-}
-
-size_t cras_bt_adapter_get_list(struct cras_bt_adapter ***adapter_list_out)
-{
-	struct cras_bt_adapter *adapter;
-	struct cras_bt_adapter **adapter_list = NULL;
-	size_t num_adapters = 0;
-
-	DL_FOREACH (adapters, adapter) {
-		struct cras_bt_adapter **tmp;
-
-		tmp = realloc(adapter_list,
-			      sizeof(adapter_list[0]) * (num_adapters + 1));
-		if (!tmp) {
-			free(adapter_list);
-			return -ENOMEM;
-		}
-
-		adapter_list = tmp;
-		adapter_list[num_adapters++] = adapter;
-	}
-
-	*adapter_list_out = adapter_list;
-	return num_adapters;
-}
-
-const char *cras_bt_adapter_object_path(const struct cras_bt_adapter *adapter)
-{
-	return adapter->object_path;
-}
-
-const char *cras_bt_adapter_address(const struct cras_bt_adapter *adapter)
-{
-	return adapter->address;
-}
-
-const char *cras_bt_adapter_name(const struct cras_bt_adapter *adapter)
-{
-	return adapter->name;
-}
-
-int cras_bt_adapter_powered(const struct cras_bt_adapter *adapter)
-{
-	return adapter->powered;
-}
-
-int cras_bt_adapter_wbs_supported(struct cras_bt_adapter *adapter)
-{
-	return adapter->wide_band_speech;
-}
-
-static void bt_adapter_set_powered(struct cras_bt_adapter *adapter, int powered)
-{
-	adapter->powered = powered;
-	if (powered)
-		cras_bt_adapter_get_supported_capabilities(adapter);
-}
-
-void cras_bt_adapter_update_properties(struct cras_bt_adapter *adapter,
-				       DBusMessageIter *properties_array_iter,
-				       DBusMessageIter *invalidated_array_iter)
-{
-	while (dbus_message_iter_get_arg_type(properties_array_iter) !=
-	       DBUS_TYPE_INVALID) {
-		DBusMessageIter properties_dict_iter, variant_iter;
-		const char *key;
-		int type;
-
-		dbus_message_iter_recurse(properties_array_iter,
-					  &properties_dict_iter);
-
-		dbus_message_iter_get_basic(&properties_dict_iter, &key);
-		dbus_message_iter_next(&properties_dict_iter);
-
-		dbus_message_iter_recurse(&properties_dict_iter, &variant_iter);
-		type = dbus_message_iter_get_arg_type(&variant_iter);
-
-		if (type == DBUS_TYPE_STRING) {
-			const char *value;
-
-			dbus_message_iter_get_basic(&variant_iter, &value);
-
-			if (strcmp(key, "Address") == 0) {
-				free(adapter->address);
-				adapter->address = strdup(value);
-
-			} else if (strcmp(key, "Alias") == 0) {
-				free(adapter->name);
-				adapter->name = strdup(value);
-			}
-
-		} else if (type == DBUS_TYPE_UINT32) {
-			uint32_t value;
-
-			dbus_message_iter_get_basic(&variant_iter, &value);
-
-			if (strcmp(key, "Class") == 0)
-				adapter->bluetooth_class = value;
-
-		} else if (type == DBUS_TYPE_BOOLEAN) {
-			int value;
-
-			dbus_message_iter_get_basic(&variant_iter, &value);
-
-			if (strcmp(key, "Powered") == 0)
-				bt_adapter_set_powered(adapter, value);
-		}
-
-		dbus_message_iter_next(properties_array_iter);
-	}
-
-	while (invalidated_array_iter &&
-	       dbus_message_iter_get_arg_type(invalidated_array_iter) !=
-		       DBUS_TYPE_INVALID) {
-		const char *key;
-
-		dbus_message_iter_get_basic(invalidated_array_iter, &key);
-
-		if (strcmp(key, "Address") == 0) {
-			free(adapter->address);
-			adapter->address = NULL;
-		} else if (strcmp(key, "Alias") == 0) {
-			free(adapter->name);
-			adapter->name = NULL;
-		} else if (strcmp(key, "Class") == 0) {
-			adapter->bluetooth_class = 0;
-		} else if (strcmp(key, "Powered") == 0) {
-			adapter->powered = 0;
-		}
-
-		dbus_message_iter_next(invalidated_array_iter);
-	}
-}
-
-int cras_bt_adapter_on_usb(struct cras_bt_adapter *adapter)
-{
-	return !!(adapter->bus_type == HCI_USB);
-}
-
-/*
- * Expect to receive supported capabilities in reply, like below format:
- * array [
- *   dict entry(
- *     string "wide band speech"
- *     variant
- *       boolean <value>
- *   )
- * ]
- */
-static void on_get_supported_capabilities_reply(DBusPendingCall *pending_call,
-						void *data)
-{
-	DBusMessage *reply;
-	DBusMessageIter message_iter, capabilities;
-	struct cras_bt_adapter *adapter;
-
-	reply = dbus_pending_call_steal_reply(pending_call);
-	dbus_pending_call_unref(pending_call);
-
-	if (dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR) {
-		syslog(LOG_ERR,
-		       "GetSupportedCapabilities message replied error: %s",
-		       dbus_message_get_error_name(reply));
-		goto get_supported_capabilities_err;
-	}
-
-	if (!dbus_message_iter_init(reply, &message_iter)) {
-		syslog(LOG_ERR, "GetSupportedCapabilities reply doesn't have"
-				"argument");
-		goto get_supported_capabilities_err;
-	}
-
-	DL_FOREACH (adapters, adapter) {
-		if (adapter == (struct cras_bt_adapter *)data)
-			break;
-	}
-	if (NULL == adapter)
-		goto get_supported_capabilities_err;
-
-	dbus_message_iter_recurse(&message_iter, &capabilities);
-
-	while (dbus_message_iter_get_arg_type(&capabilities) !=
-	       DBUS_TYPE_INVALID) {
-		DBusMessageIter cap_dict_iter, variant_iter;
-		const char *key;
-		int type;
-
-		dbus_message_iter_recurse(&capabilities, &cap_dict_iter);
-
-		dbus_message_iter_get_basic(&cap_dict_iter, &key);
-		dbus_message_iter_next(&cap_dict_iter);
-
-		dbus_message_iter_recurse(&cap_dict_iter, &variant_iter);
-		type = dbus_message_iter_get_arg_type(&variant_iter);
-
-		if (type == DBUS_TYPE_BOOLEAN) {
-			int value;
-
-			dbus_message_iter_get_basic(&variant_iter, &value);
-
-			if (strcmp(key, "wide band speech") == 0)
-				adapter->wide_band_speech = value;
-		}
-
-		dbus_message_iter_next(&capabilities);
-	}
-
-get_supported_capabilities_err:
-	dbus_message_unref(reply);
-}
-
-int cras_bt_adapter_get_supported_capabilities(struct cras_bt_adapter *adapter)
-{
-	DBusMessage *method_call;
-	DBusError dbus_error;
-	DBusPendingCall *pending_call;
-
-	method_call = dbus_message_new_method_call(BLUEZ_SERVICE,
-						   adapter->object_path,
-						   BLUEZ_INTERFACE_ADAPTER,
-						   "GetSupportedCapabilities");
-	if (!method_call)
-		return -ENOMEM;
-
-	dbus_error_init(&dbus_error);
-	if (!dbus_connection_send_with_reply(adapter->conn, method_call,
-					     &pending_call,
-					     DBUS_TIMEOUT_USE_DEFAULT)) {
-		dbus_message_unref(method_call);
-		syslog(LOG_ERR,
-		       "Failed to send GetSupportedCapabilities message");
-		return -EIO;
-	}
-
-	dbus_message_unref(method_call);
-	if (!dbus_pending_call_set_notify(pending_call,
-					  on_get_supported_capabilities_reply,
-					  adapter, NULL)) {
-		dbus_pending_call_cancel(pending_call);
-		dbus_pending_call_unref(pending_call);
-		return -EIO;
-	}
-	return 0;
-}
diff --git a/cras/src/server/cras_bt_adapter.h b/cras/src/server/cras_bt_adapter.h
deleted file mode 100644
index dc07b68..0000000
--- a/cras/src/server/cras_bt_adapter.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_BT_ADAPTER_H_
-#define CRAS_BT_ADAPTER_H_
-
-#include <dbus/dbus.h>
-
-struct cras_bt_adapter;
-
-/* Creates an bt_adapter instance representing the bluetooth controller
- * on the system.
- * Args:
- *    conn - The dbus connection.
- *    object_path - Object path of the bluetooth controller.
- */
-struct cras_bt_adapter *cras_bt_adapter_create(DBusConnection *conn,
-					       const char *object_path);
-void cras_bt_adapter_destroy(struct cras_bt_adapter *adapter);
-void cras_bt_adapter_reset();
-
-struct cras_bt_adapter *cras_bt_adapter_get(const char *object_path);
-size_t cras_bt_adapter_get_list(struct cras_bt_adapter ***adapter_list_out);
-
-const char *cras_bt_adapter_object_path(const struct cras_bt_adapter *adapter);
-const char *cras_bt_adapter_address(const struct cras_bt_adapter *adapter);
-const char *cras_bt_adapter_name(const struct cras_bt_adapter *adapter);
-
-int cras_bt_adapter_powered(const struct cras_bt_adapter *adapter);
-
-/*
- * Returns true if adapter supports wide band speech feature.
- */
-int cras_bt_adapter_wbs_supported(struct cras_bt_adapter *adapter);
-
-void cras_bt_adapter_update_properties(struct cras_bt_adapter *adapter,
-				       DBusMessageIter *properties_array_iter,
-				       DBusMessageIter *invalidated_array_iter);
-
-int cras_bt_adapter_on_usb(struct cras_bt_adapter *adapter);
-
-/*
- * Queries adapter supported capabilies from bluetooth daemon. This shall
- * be called only after adapter powers on.
- */
-int cras_bt_adapter_get_supported_capabilities(struct cras_bt_adapter *adapter);
-
-#endif /* CRAS_BT_ADAPTER_H_ */
diff --git a/cras/src/server/cras_bt_battery_provider.c b/cras/src/server/cras_bt_battery_provider.c
deleted file mode 100644
index 13e6590..0000000
--- a/cras/src/server/cras_bt_battery_provider.c
+++ /dev/null
@@ -1,371 +0,0 @@
-/* Copyright 2020 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-#include <dbus/dbus.h>
-#include <errno.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <string.h>
-#include <syslog.h>
-
-#include "cras_bt_adapter.h"
-#include "cras_bt_battery_provider.h"
-#include "cras_bt_constants.h"
-#include "cras_dbus_util.h"
-#include "cras_observer.h"
-#include "utlist.h"
-
-/* CRAS registers one battery provider to BlueZ, so we use a singleton. */
-static struct cras_bt_battery_provider battery_provider = {
-	.object_path = CRAS_DEFAULT_BATTERY_PROVIDER,
-	.interface = BLUEZ_INTERFACE_BATTERY_PROVIDER,
-	.conn = NULL,
-	.is_registered = false,
-	.observer = NULL,
-	.batteries = NULL,
-};
-
-static int cmp_battery_address(const struct cras_bt_battery *battery,
-			       const char *address)
-{
-	return strcmp(battery->address, address);
-}
-
-static void replace_colon_with_underscore(char *str)
-{
-	for (int i = 0; str[i]; i++) {
-		if (str[i] == ':')
-			str[i] = '_';
-	}
-}
-
-/* Converts address XX:XX:XX:XX:XX:XX to Battery Provider object path:
- * /org/chromium/Cras/Bluetooth/BatteryProvider/XX_XX_XX_XX_XX_XX
- */
-static char *address_to_battery_path(const char *address)
-{
-	char *object_path = malloc(strlen(CRAS_DEFAULT_BATTERY_PROVIDER) +
-				   strlen(address) + 2);
-
-	sprintf(object_path, "%s/%s", CRAS_DEFAULT_BATTERY_PROVIDER, address);
-	replace_colon_with_underscore(object_path);
-
-	return object_path;
-}
-
-/* Converts address XX:XX:XX:XX:XX:XX to device object path:
- * /org/bluez/hci0/dev_XX_XX_XX_XX_XX_XX
- */
-static char *address_to_device_path(const char *address)
-{
-	char *object_path = malloc(strlen(CRAS_DEFAULT_BATTERY_PREFIX) +
-				   strlen(address) + 1);
-
-	sprintf(object_path, "%s%s", CRAS_DEFAULT_BATTERY_PREFIX, address);
-	replace_colon_with_underscore(object_path);
-
-	return object_path;
-}
-
-static struct cras_bt_battery *battery_new(const char *address, uint32_t level)
-{
-	struct cras_bt_battery *battery;
-
-	battery = calloc(1, sizeof(struct cras_bt_battery));
-	battery->address = strdup(address);
-	battery->object_path = address_to_battery_path(address);
-	battery->device_path = address_to_device_path(address);
-	battery->level = level;
-
-	return battery;
-}
-
-static void battery_free(struct cras_bt_battery *battery)
-{
-	if (battery->address)
-		free(battery->address);
-	if (battery->object_path)
-		free(battery->object_path);
-	if (battery->device_path)
-		free(battery->device_path);
-	free(battery);
-}
-
-static void populate_battery_properties(DBusMessageIter *iter,
-					const struct cras_bt_battery *battery)
-{
-	DBusMessageIter dict, entry, variant;
-	const char *property_percentage = "Percentage";
-	const char *property_device = "Device";
-	uint8_t level = battery->level;
-
-	dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY, "{sv}", &dict);
-
-	dbus_message_iter_open_container(&dict, DBUS_TYPE_DICT_ENTRY, NULL,
-					 &entry);
-	dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING,
-				       &property_percentage);
-	dbus_message_iter_open_container(&entry, DBUS_TYPE_VARIANT,
-					 DBUS_TYPE_BYTE_AS_STRING, &variant);
-	dbus_message_iter_append_basic(&variant, DBUS_TYPE_BYTE, &level);
-	dbus_message_iter_close_container(&entry, &variant);
-	dbus_message_iter_close_container(&dict, &entry);
-
-	dbus_message_iter_open_container(&dict, DBUS_TYPE_DICT_ENTRY, NULL,
-					 &entry);
-	dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING,
-				       &property_device);
-	dbus_message_iter_open_container(&entry, DBUS_TYPE_VARIANT,
-					 DBUS_TYPE_OBJECT_PATH_AS_STRING,
-					 &variant);
-	dbus_message_iter_append_basic(&variant, DBUS_TYPE_OBJECT_PATH,
-				       &battery->device_path);
-	dbus_message_iter_close_container(&entry, &variant);
-	dbus_message_iter_close_container(&dict, &entry);
-
-	dbus_message_iter_close_container(iter, &dict);
-}
-
-/* Creates a new battery object and exposes it on D-Bus. */
-static struct cras_bt_battery *
-get_or_create_battery(struct cras_bt_battery_provider *provider,
-		      const char *address, uint32_t level)
-{
-	struct cras_bt_battery *battery;
-	DBusMessage *msg;
-	DBusMessageIter iter, dict, entry;
-
-	LL_SEARCH(provider->batteries, battery, address, cmp_battery_address);
-
-	if (battery)
-		return battery;
-
-	syslog(LOG_DEBUG, "Creating new battery for %s", address);
-
-	battery = battery_new(address, level);
-	LL_APPEND(provider->batteries, battery);
-
-	msg = dbus_message_new_signal(CRAS_DEFAULT_BATTERY_PROVIDER,
-				      DBUS_INTERFACE_OBJECT_MANAGER,
-				      DBUS_SIGNAL_INTERFACES_ADDED);
-
-	dbus_message_iter_init_append(msg, &iter);
-	dbus_message_iter_append_basic(&iter, DBUS_TYPE_OBJECT_PATH,
-				       &battery->object_path);
-	dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "{sa{sv}}",
-					 &dict);
-	dbus_message_iter_open_container(&dict, DBUS_TYPE_DICT_ENTRY, NULL,
-					 &entry);
-	dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING,
-				       &provider->interface);
-	populate_battery_properties(&entry, battery);
-	dbus_message_iter_close_container(&dict, &entry);
-	dbus_message_iter_close_container(&iter, &dict);
-
-	if (!dbus_connection_send(provider->conn, msg, NULL)) {
-		syslog(LOG_ERR,
-		       "Error sending " DBUS_SIGNAL_INTERFACES_ADDED " signal");
-	}
-
-	dbus_message_unref(msg);
-
-	return battery;
-}
-
-/* Updates the level of a battery object and signals it on D-Bus. */
-static void
-update_battery_level(const struct cras_bt_battery_provider *provider,
-		     struct cras_bt_battery *battery, uint32_t level)
-{
-	DBusMessage *msg;
-	DBusMessageIter iter;
-
-	if (battery->level == level)
-		return;
-
-	battery->level = level;
-
-	msg = dbus_message_new_signal(battery->object_path,
-				      DBUS_INTERFACE_PROPERTIES,
-				      DBUS_SIGNAL_PROPERTIES_CHANGED);
-
-	dbus_message_iter_init_append(msg, &iter);
-	dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING,
-				       &provider->interface);
-	populate_battery_properties(&iter, battery);
-
-	if (!dbus_connection_send(provider->conn, msg, NULL)) {
-		syslog(LOG_ERR, "Error sending " DBUS_SIGNAL_PROPERTIES_CHANGED
-				" signal");
-	}
-
-	dbus_message_unref(msg);
-}
-
-/* Invoked when HFP sends an alert about a battery value change. */
-static void on_bt_battery_changed(void *context, const char *address,
-				  uint32_t level)
-{
-	struct cras_bt_battery_provider *provider = context;
-
-	syslog(LOG_DEBUG, "Battery changed for address %s, level %d", address,
-	       level);
-
-	if (!provider->is_registered) {
-		syslog(LOG_WARNING, "Received battery level update while "
-				    "battery provider is not registered");
-		return;
-	}
-
-	struct cras_bt_battery *battery =
-		get_or_create_battery(provider, address, level);
-
-	update_battery_level(provider, battery, level);
-}
-
-/* Invoked when we receive a D-Bus return of RegisterBatteryProvider from
- * BlueZ.
- */
-static void
-cras_bt_on_battery_provider_registered(DBusPendingCall *pending_call,
-				       void *data)
-{
-	DBusMessage *reply;
-	struct cras_bt_battery_provider *provider = data;
-	struct cras_observer_ops observer_ops;
-
-	reply = dbus_pending_call_steal_reply(pending_call);
-	dbus_pending_call_unref(pending_call);
-
-	if (dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR) {
-		syslog(LOG_ERR, "RegisterBatteryProvider returned error: %s",
-		       dbus_message_get_error_name(reply));
-		dbus_message_unref(reply);
-		return;
-	}
-
-	syslog(LOG_INFO, "RegisterBatteryProvider succeeded");
-
-	provider->is_registered = true;
-
-	memset(&observer_ops, 0, sizeof(observer_ops));
-	observer_ops.bt_battery_changed = on_bt_battery_changed;
-	provider->observer = cras_observer_add(&observer_ops, provider);
-
-	dbus_message_unref(reply);
-}
-
-int cras_bt_register_battery_provider(DBusConnection *conn,
-				      const struct cras_bt_adapter *adapter)
-{
-	const char *adapter_path;
-	DBusMessage *method_call;
-	DBusMessageIter message_iter;
-	DBusPendingCall *pending_call;
-
-	if (battery_provider.is_registered) {
-		syslog(LOG_ERR, "Battery Provider already registered");
-		return -EBUSY;
-	}
-
-	if (battery_provider.conn)
-		dbus_connection_unref(battery_provider.conn);
-
-	battery_provider.conn = conn;
-	dbus_connection_ref(battery_provider.conn);
-
-	adapter_path = cras_bt_adapter_object_path(adapter);
-	method_call = dbus_message_new_method_call(
-		BLUEZ_SERVICE, adapter_path,
-		BLUEZ_INTERFACE_BATTERY_PROVIDER_MANAGER,
-		"RegisterBatteryProvider");
-	if (!method_call)
-		return -ENOMEM;
-
-	dbus_message_iter_init_append(method_call, &message_iter);
-	dbus_message_iter_append_basic(&message_iter, DBUS_TYPE_OBJECT_PATH,
-				       &battery_provider.object_path);
-
-	if (!dbus_connection_send_with_reply(conn, method_call, &pending_call,
-					     DBUS_TIMEOUT_USE_DEFAULT)) {
-		dbus_message_unref(method_call);
-		return -ENOMEM;
-	}
-
-	dbus_message_unref(method_call);
-
-	if (!pending_call)
-		return -EIO;
-
-	if (!dbus_pending_call_set_notify(
-		    pending_call, cras_bt_on_battery_provider_registered,
-		    &battery_provider, NULL)) {
-		dbus_pending_call_cancel(pending_call);
-		dbus_pending_call_unref(pending_call);
-		return -ENOMEM;
-	}
-
-	return 0;
-}
-
-/* Removes a battery object and signals the removal on D-Bus as well. */
-static void cleanup_battery(struct cras_bt_battery_provider *provider,
-			    struct cras_bt_battery *battery)
-{
-	DBusMessage *msg;
-	DBusMessageIter iter, entry;
-
-	if (!battery)
-		return;
-
-	LL_DELETE(provider->batteries, battery);
-
-	msg = dbus_message_new_signal(CRAS_DEFAULT_BATTERY_PROVIDER,
-				      DBUS_INTERFACE_OBJECT_MANAGER,
-				      DBUS_SIGNAL_INTERFACES_REMOVED);
-
-	dbus_message_iter_init_append(msg, &iter);
-	dbus_message_iter_append_basic(&iter, DBUS_TYPE_OBJECT_PATH,
-				       &battery->object_path);
-	dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
-					 DBUS_TYPE_STRING_AS_STRING, &entry);
-	dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING,
-				       &provider->interface);
-	dbus_message_iter_close_container(&iter, &entry);
-
-	if (!dbus_connection_send(provider->conn, msg, NULL)) {
-		syslog(LOG_ERR, "Error sending " DBUS_SIGNAL_INTERFACES_REMOVED
-				" signal");
-	}
-
-	dbus_message_unref(msg);
-
-	battery_free(battery);
-}
-
-void cras_bt_battery_provider_reset()
-{
-	struct cras_bt_battery *battery;
-
-	syslog(LOG_INFO, "Resetting battery provider");
-
-	if (!battery_provider.is_registered)
-		return;
-
-	battery_provider.is_registered = false;
-
-	LL_FOREACH (battery_provider.batteries, battery) {
-		cleanup_battery(&battery_provider, battery);
-	}
-
-	if (battery_provider.conn) {
-		dbus_connection_unref(battery_provider.conn);
-		battery_provider.conn = NULL;
-	}
-
-	if (battery_provider.observer) {
-		cras_observer_remove(battery_provider.observer);
-		battery_provider.observer = NULL;
-	}
-}
diff --git a/cras/src/server/cras_bt_battery_provider.h b/cras/src/server/cras_bt_battery_provider.h
deleted file mode 100644
index 1998cd7..0000000
--- a/cras/src/server/cras_bt_battery_provider.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/* Copyright 2020 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_BT_BATTERY_PROVIDER_H_
-#define CRAS_BT_BATTERY_PROVIDER_H_
-
-#include <dbus/dbus.h>
-#include <stdbool.h>
-
-#include "cras_bt_adapter.h"
-
-/* Object to represent a battery that is exposed to BlueZ. */
-struct cras_bt_battery {
-	char *address;
-	char *object_path;
-	char *device_path;
-	uint32_t level;
-	struct cras_bt_battery *next;
-};
-
-/* Object to register as battery provider so that bluetoothd will monitor
- * battery objects that we expose.
- */
-struct cras_bt_battery_provider {
-	const char *object_path;
-	const char *interface;
-	DBusConnection *conn;
-	bool is_registered;
-	struct cras_observer_client *observer;
-	struct cras_bt_battery *batteries;
-};
-
-/* Registers battery provider to bluetoothd. This is used when a Bluetooth
- * adapter got enumerated.
- * Args:
- *    conn - The D-Bus connection.
- *    adapter - The enumerated bluetooth adapter.
- */
-int cras_bt_register_battery_provider(DBusConnection *conn,
-				      const struct cras_bt_adapter *adapter);
-
-/* Resets internal state of battery provider. */
-void cras_bt_battery_provider_reset();
-
-#endif /* CRAS_BT_BATTERY_PROVIDER_H_ */
diff --git a/cras/src/server/cras_bt_constants.h b/cras/src/server/cras_bt_constants.h
deleted file mode 100644
index 318aeca..0000000
--- a/cras/src/server/cras_bt_constants.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_BT_CONSTANTS_H_
-#define CRAS_BT_CONSTANTS_H_
-
-#define BLUEZ_SERVICE "org.bluez"
-
-#define BLUEZ_INTERFACE_ADAPTER "org.bluez.Adapter1"
-#define BLUEZ_INTERFACE_BATTERY_PROVIDER "org.bluez.BatteryProvider1"
-#define BLUEZ_INTERFACE_BATTERY_PROVIDER_MANAGER                               \
-	"org.bluez.BatteryProviderManager1"
-#define BLUEZ_INTERFACE_DEVICE "org.bluez.Device1"
-#define BLUEZ_INTERFACE_MEDIA "org.bluez.Media1"
-#define BLUEZ_INTERFACE_MEDIA_ENDPOINT "org.bluez.MediaEndpoint1"
-#define BLUEZ_INTERFACE_MEDIA_PLAYER "org.mpris.MediaPlayer2.Player"
-#define BLUEZ_INTERFACE_MEDIA_TRANSPORT "org.bluez.MediaTransport1"
-#define BLUEZ_INTERFACE_PLAYER "org.bluez.MediaPlayer1"
-#define BLUEZ_INTERFACE_PROFILE "org.bluez.Profile1"
-#define BLUEZ_PROFILE_MGMT_INTERFACE "org.bluez.ProfileManager1"
-/* Remove once our D-Bus header files are updated to define this. */
-#ifndef DBUS_INTERFACE_OBJECT_MANAGER
-#define DBUS_INTERFACE_OBJECT_MANAGER "org.freedesktop.DBus.ObjectManager"
-#endif
-#define DBUS_SIGNAL_INTERFACES_ADDED "InterfacesAdded"
-#define DBUS_SIGNAL_INTERFACES_REMOVED "InterfacesRemoved"
-#define DBUS_SIGNAL_PROPERTIES_CHANGED "PropertiesChanged"
-
-/* UUIDs taken from lib/uuid.h in the BlueZ source */
-#define HSP_HS_UUID "00001108-0000-1000-8000-00805f9b34fb"
-#define HSP_AG_UUID "00001112-0000-1000-8000-00805f9b34fb"
-
-#define HFP_HF_UUID "0000111e-0000-1000-8000-00805f9b34fb"
-#define HFP_AG_UUID "0000111f-0000-1000-8000-00805f9b34fb"
-
-#define A2DP_SOURCE_UUID "0000110a-0000-1000-8000-00805f9b34fb"
-#define A2DP_SINK_UUID "0000110b-0000-1000-8000-00805f9b34fb"
-
-#define AVRCP_REMOTE_UUID "0000110e-0000-1000-8000-00805f9b34fb"
-#define AVRCP_TARGET_UUID "0000110c-0000-1000-8000-00805f9b34fb"
-
-#define GENERIC_AUDIO_UUID "00001203-0000-1000-8000-00805f9b34fb"
-
-/* Constants for CRAS BT player */
-#define CRAS_DEFAULT_PLAYER "/org/chromium/Cras/Bluetooth/DefaultPlayer"
-/* The longest possible player playback status is "forward-seek" */
-#define CRAS_PLAYER_PLAYBACK_STATUS_SIZE_MAX 13 * sizeof(char)
-#define CRAS_PLAYER_PLAYBACK_STATUS_DEFAULT "playing"
-/* Neither BlueZ or the MRPIS specs limited the player identity max size, 128
- * should be large enough for most.
- */
-#define CRAS_PLAYER_IDENTITY_SIZE_MAX 128 * sizeof(char)
-#define CRAS_PLAYER_IDENTITY_DEFAULT "DefaultPlayer"
-#define CRAS_PLAYER_METADATA_SIZE_MAX 128 * sizeof(char)
-
-#define CRAS_DEFAULT_BATTERY_PROVIDER                                          \
-	"/org/chromium/Cras/Bluetooth/BatteryProvider"
-#define CRAS_DEFAULT_BATTERY_PREFIX "/org/bluez/hci0/dev_"
-
-/* Instead of letting CRAS obtain the A2DP streaming packet size (a.k.a. AVDTP
- * MTU) from BlueZ Media Transport, force the packet size to the default L2CAP
- * packet size. This prevent the audio peripheral device to negotiate a larger
- * packet size and later failed to fulfill it and causing audio artifact. This
- * defined constant is for experiment only and is put back behind a
- * chrome://flag.
- */
-#define A2DP_FIX_PACKET_SIZE 672
-
-#endif /* CRAS_BT_CONSTANTS_H_ */
diff --git a/cras/src/server/cras_bt_device.c b/cras/src/server/cras_bt_device.c
deleted file mode 100644
index 6b06dd1..0000000
--- a/cras/src/server/cras_bt_device.c
+++ /dev/null
@@ -1,1409 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef _GNU_SOURCE
-#define _GNU_SOURCE /* for ppoll */
-#endif
-
-#include <dbus/dbus.h>
-
-#include <errno.h>
-#include <poll.h>
-#include <stdbool.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/socket.h>
-#include <syslog.h>
-
-#include "bluetooth.h"
-#include "cras_a2dp_endpoint.h"
-#include "cras_bt_adapter.h"
-#include "cras_bt_device.h"
-#include "cras_bt_constants.h"
-#include "cras_bt_log.h"
-#include "cras_bt_io.h"
-#include "cras_bt_profile.h"
-#include "cras_hfp_ag_profile.h"
-#include "cras_hfp_slc.h"
-#include "cras_iodev.h"
-#include "cras_iodev_list.h"
-#include "cras_main_message.h"
-#include "cras_server_metrics.h"
-#include "cras_system_state.h"
-#include "cras_tm.h"
-#include "sfh.h"
-#include "utlist.h"
-
-/*
- * Bluetooth Core 5.0 spec, vol 4, part B, section 2 describes
- * the recommended HCI packet size in one USB transfer for CVSD
- * and MSBC codec.
- */
-#define USB_MSBC_PKT_SIZE 60
-#define USB_CVSD_PKT_SIZE 48
-#define DEFAULT_SCO_PKT_SIZE USB_CVSD_PKT_SIZE
-
-static const unsigned int PROFILE_SWITCH_DELAY_MS = 500;
-static const unsigned int PROFILE_DROP_SUSPEND_DELAY_MS = 5000;
-
-/* Check profile connections every 2 seconds and rerty 30 times maximum.
- * Attemp to connect profiles which haven't been ready every 3 retries.
- */
-static const unsigned int CONN_WATCH_PERIOD_MS = 2000;
-static const unsigned int CONN_WATCH_MAX_RETRIES = 30;
-
-/* This is used when a critical SCO failure happens and is worth scheduling a
- * suspend in case for some reason BT headset stays connected in baseband and
- * confuses user.
- */
-static const unsigned int SCO_SUSPEND_DELAY_MS = 5000;
-
-static const unsigned int CRAS_SUPPORTED_PROFILES =
-	CRAS_BT_DEVICE_PROFILE_A2DP_SINK | CRAS_BT_DEVICE_PROFILE_HFP_HANDSFREE;
-
-/* Object to represent a general bluetooth device, and used to
- * associate with some CRAS modules if it supports audio.
- * Members:
- *    conn - The dbus connection object used to send message to bluetoothd.
- *    object_path - Object path of the bluetooth device.
- *    adapter - The object path of the adapter associates with this device.
- *    address - The BT address of this device.
- *    name - The readable name of this device.
- *    bluetooth_class - The bluetooth class of this device.
- *    paired - If this device is paired.
- *    trusted - If this device is trusted.
- *    connected - If this devices is connected.
- *    connected_profiles - OR'ed all connected audio profiles.
- *    profiles - OR'ed by all audio profiles this device supports.
- *    hidden_profiles - OR'ed by all audio profiles this device actually
- *        supports but is not scanned by BlueZ.
- *    bt_iodevs - The pointer to the cras_iodevs of this device.
- *    active_profile - The flag to indicate the active audio profile this
- *        device is currently using.
- *    conn_watch_retries - The retry count for conn_watch_timer.
- *    conn_watch_timer - The timer used to watch connected profiles and start
- *        BT audio input/ouput when all profiles are ready.
- *    suspend_timer - The timer used to suspend device.
- *    switch_profile_timer - The timer used to delay enabling iodev after
- *        profile switch.
- *    sco_fd - The file descriptor of the SCO connection.
- *    sco_ref_count - The reference counts of the SCO connection.
- *    suspend_reason - The reason code for why suspend is scheduled.
- *    stable_id - The unique and persistent id of this bt_device.
- */
-struct cras_bt_device {
-	DBusConnection *conn;
-	char *object_path;
-	char *adapter_obj_path;
-	char *address;
-	char *name;
-	uint32_t bluetooth_class;
-	int paired;
-	int trusted;
-	int connected;
-	unsigned int connected_profiles;
-	unsigned int profiles;
-	unsigned int hidden_profiles;
-	struct cras_iodev *bt_iodevs[CRAS_NUM_DIRECTIONS];
-	unsigned int active_profile;
-	int use_hardware_volume;
-	int conn_watch_retries;
-	struct cras_timer *conn_watch_timer;
-	struct cras_timer *suspend_timer;
-	struct cras_timer *switch_profile_timer;
-	int sco_fd;
-	size_t sco_ref_count;
-	enum cras_bt_device_suspend_reason suspend_reason;
-	unsigned int stable_id;
-
-	struct cras_bt_device *prev, *next;
-};
-
-enum BT_DEVICE_COMMAND {
-	BT_DEVICE_CANCEL_SUSPEND,
-	BT_DEVICE_SCHEDULE_SUSPEND,
-	BT_DEVICE_SWITCH_PROFILE,
-	BT_DEVICE_SWITCH_PROFILE_ENABLE_DEV,
-};
-
-struct bt_device_msg {
-	struct cras_main_message header;
-	enum BT_DEVICE_COMMAND cmd;
-	struct cras_bt_device *device;
-	struct cras_iodev *dev;
-	unsigned int arg1;
-	unsigned int arg2;
-};
-
-static struct cras_bt_device *devices;
-
-enum cras_bt_device_profile cras_bt_device_profile_from_uuid(const char *uuid)
-{
-	if (strcmp(uuid, HSP_HS_UUID) == 0)
-		return CRAS_BT_DEVICE_PROFILE_HSP_HEADSET;
-	else if (strcmp(uuid, HSP_AG_UUID) == 0)
-		return CRAS_BT_DEVICE_PROFILE_HSP_AUDIOGATEWAY;
-	else if (strcmp(uuid, HFP_HF_UUID) == 0)
-		return CRAS_BT_DEVICE_PROFILE_HFP_HANDSFREE;
-	else if (strcmp(uuid, HFP_AG_UUID) == 0)
-		return CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY;
-	else if (strcmp(uuid, A2DP_SOURCE_UUID) == 0)
-		return CRAS_BT_DEVICE_PROFILE_A2DP_SOURCE;
-	else if (strcmp(uuid, A2DP_SINK_UUID) == 0)
-		return CRAS_BT_DEVICE_PROFILE_A2DP_SINK;
-	else if (strcmp(uuid, AVRCP_REMOTE_UUID) == 0)
-		return CRAS_BT_DEVICE_PROFILE_AVRCP_REMOTE;
-	else if (strcmp(uuid, AVRCP_TARGET_UUID) == 0)
-		return CRAS_BT_DEVICE_PROFILE_AVRCP_TARGET;
-	else
-		return 0;
-}
-
-struct cras_bt_device *cras_bt_device_create(DBusConnection *conn,
-					     const char *object_path)
-{
-	struct cras_bt_device *device;
-
-	device = calloc(1, sizeof(*device));
-	if (device == NULL)
-		return NULL;
-
-	device->conn = conn;
-	device->object_path = strdup(object_path);
-	if (device->object_path == NULL) {
-		free(device);
-		return NULL;
-	}
-	device->stable_id =
-		SuperFastHash(device->object_path, strlen(device->object_path),
-			      strlen(device->object_path));
-
-	DL_APPEND(devices, device);
-
-	return device;
-}
-
-static void on_connect_profile_reply(DBusPendingCall *pending_call, void *data)
-{
-	DBusMessage *reply;
-
-	reply = dbus_pending_call_steal_reply(pending_call);
-	dbus_pending_call_unref(pending_call);
-
-	if (dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR)
-		syslog(LOG_ERR, "Connect profile message replied error: %s",
-		       dbus_message_get_error_name(reply));
-
-	dbus_message_unref(reply);
-}
-
-static void on_disconnect_reply(DBusPendingCall *pending_call, void *data)
-{
-	DBusMessage *reply;
-
-	reply = dbus_pending_call_steal_reply(pending_call);
-	dbus_pending_call_unref(pending_call);
-
-	if (dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR)
-		syslog(LOG_ERR, "Disconnect message replied error");
-
-	dbus_message_unref(reply);
-}
-
-int cras_bt_device_connect_profile(DBusConnection *conn,
-				   struct cras_bt_device *device,
-				   const char *uuid)
-{
-	DBusMessage *method_call;
-	DBusError dbus_error;
-	DBusPendingCall *pending_call;
-
-	method_call =
-		dbus_message_new_method_call(BLUEZ_SERVICE, device->object_path,
-					     BLUEZ_INTERFACE_DEVICE,
-					     "ConnectProfile");
-	if (!method_call)
-		return -ENOMEM;
-
-	if (!dbus_message_append_args(method_call, DBUS_TYPE_STRING, &uuid,
-				      DBUS_TYPE_INVALID))
-		return -ENOMEM;
-
-	dbus_error_init(&dbus_error);
-
-	pending_call = NULL;
-	if (!dbus_connection_send_with_reply(conn, method_call, &pending_call,
-					     DBUS_TIMEOUT_USE_DEFAULT)) {
-		dbus_message_unref(method_call);
-		syslog(LOG_ERR, "Failed to send Disconnect message");
-		return -EIO;
-	}
-
-	dbus_message_unref(method_call);
-	if (!dbus_pending_call_set_notify(
-		    pending_call, on_connect_profile_reply, conn, NULL)) {
-		dbus_pending_call_cancel(pending_call);
-		dbus_pending_call_unref(pending_call);
-		return -EIO;
-	}
-	return 0;
-}
-
-int cras_bt_device_disconnect(DBusConnection *conn,
-			      struct cras_bt_device *device)
-{
-	DBusMessage *method_call;
-	DBusError dbus_error;
-	DBusPendingCall *pending_call;
-
-	method_call =
-		dbus_message_new_method_call(BLUEZ_SERVICE, device->object_path,
-					     BLUEZ_INTERFACE_DEVICE,
-					     "Disconnect");
-	if (!method_call)
-		return -ENOMEM;
-
-	dbus_error_init(&dbus_error);
-
-	pending_call = NULL;
-	if (!dbus_connection_send_with_reply(conn, method_call, &pending_call,
-					     DBUS_TIMEOUT_USE_DEFAULT)) {
-		dbus_message_unref(method_call);
-		syslog(LOG_ERR, "Failed to send Disconnect message");
-		return -EIO;
-	}
-
-	dbus_message_unref(method_call);
-	if (!dbus_pending_call_set_notify(pending_call, on_disconnect_reply,
-					  conn, NULL)) {
-		dbus_pending_call_cancel(pending_call);
-		dbus_pending_call_unref(pending_call);
-		return -EIO;
-	}
-	return 0;
-}
-
-static void cras_bt_device_destroy(struct cras_bt_device *device)
-{
-	struct cras_tm *tm = cras_system_state_get_tm();
-	DL_DELETE(devices, device);
-
-	if (device->conn_watch_timer)
-		cras_tm_cancel_timer(tm, device->conn_watch_timer);
-	if (device->switch_profile_timer)
-		cras_tm_cancel_timer(tm, device->switch_profile_timer);
-	if (device->suspend_timer)
-		cras_tm_cancel_timer(tm, device->suspend_timer);
-	free(device->adapter_obj_path);
-	free(device->object_path);
-	free(device->address);
-	free(device->name);
-	free(device);
-}
-
-void cras_bt_device_remove(struct cras_bt_device *device)
-{
-	/*
-	 * We expect BT stack to disconnect this device before removing it,
-	 * but it may not the case if there's issue at BT side. Print error
-	 * log whenever this happens.
-	 */
-	if (device->connected)
-		syslog(LOG_ERR, "Removing dev with connected profiles %u",
-		       device->connected_profiles);
-	/*
-	 * Possibly clean up the associated A2DP and HFP AG iodevs that are
-	 * still accessing this device.
-	 */
-	cras_a2dp_suspend_connected_device(device);
-	cras_hfp_ag_suspend_connected_device(device);
-	cras_bt_device_destroy(device);
-}
-
-void cras_bt_device_reset()
-{
-	while (devices) {
-		syslog(LOG_INFO, "Bluetooth Device: %s removed",
-		       devices->address);
-		cras_bt_device_destroy(devices);
-	}
-}
-
-struct cras_bt_device *cras_bt_device_get(const char *object_path)
-{
-	struct cras_bt_device *device;
-
-	DL_FOREACH (devices, device) {
-		if (strcmp(device->object_path, object_path) == 0)
-			return device;
-	}
-
-	return NULL;
-}
-
-const char *cras_bt_device_object_path(const struct cras_bt_device *device)
-{
-	return device->object_path;
-}
-
-int cras_bt_device_get_stable_id(const struct cras_bt_device *device)
-{
-	return device->stable_id;
-}
-
-struct cras_bt_adapter *
-cras_bt_device_adapter(const struct cras_bt_device *device)
-{
-	return cras_bt_adapter_get(device->adapter_obj_path);
-}
-
-const char *cras_bt_device_address(const struct cras_bt_device *device)
-{
-	return device->address;
-}
-
-const char *cras_bt_device_name(const struct cras_bt_device *device)
-{
-	return device->name;
-}
-
-int cras_bt_device_paired(const struct cras_bt_device *device)
-{
-	return device->paired;
-}
-
-int cras_bt_device_trusted(const struct cras_bt_device *device)
-{
-	return device->trusted;
-}
-
-int cras_bt_device_connected(const struct cras_bt_device *device)
-{
-	return device->connected;
-}
-
-int cras_bt_device_supports_profile(const struct cras_bt_device *device,
-				    enum cras_bt_device_profile profile)
-{
-	return !!(device->profiles & profile);
-}
-
-void cras_bt_device_append_iodev(struct cras_bt_device *device,
-				 struct cras_iodev *iodev,
-				 enum cras_bt_device_profile profile)
-{
-	struct cras_iodev *bt_iodev;
-
-	bt_iodev = device->bt_iodevs[iodev->direction];
-
-	if (bt_iodev) {
-		cras_bt_io_append(bt_iodev, iodev, profile);
-	} else {
-		device->bt_iodevs[iodev->direction] =
-			cras_bt_io_create(device, iodev, profile);
-	}
-}
-
-/*
- * Sets the audio nodes to 'plugged' means UI can select it and open it
- * for streams. Sets to 'unplugged' to hide these nodes from UI, when device
- * disconnects in progress.
- */
-static void bt_device_set_nodes_plugged(struct cras_bt_device *device,
-					int plugged)
-{
-	struct cras_iodev *iodev;
-
-	iodev = device->bt_iodevs[CRAS_STREAM_INPUT];
-	if (iodev)
-		cras_iodev_set_node_plugged(iodev->active_node, plugged);
-
-	iodev = device->bt_iodevs[CRAS_STREAM_OUTPUT];
-	if (iodev)
-		cras_iodev_set_node_plugged(iodev->active_node, plugged);
-}
-
-static void bt_device_switch_profile(struct cras_bt_device *device,
-				     struct cras_iodev *bt_iodev,
-				     int enable_dev);
-
-void cras_bt_device_rm_iodev(struct cras_bt_device *device,
-			     struct cras_iodev *iodev)
-{
-	struct cras_iodev *bt_iodev;
-	int rc;
-
-	bt_device_set_nodes_plugged(device, 0);
-
-	bt_iodev = device->bt_iodevs[iodev->direction];
-	if (bt_iodev) {
-		unsigned try_profile;
-
-		/* Check what will the preffered profile be if we remove dev. */
-		try_profile = cras_bt_io_try_remove(bt_iodev, iodev);
-		if (!try_profile)
-			goto destroy_bt_io;
-
-		/* If the check result doesn't match with the active
-		 * profile we are currently using, switch to the
-		 * preffered profile before actually remove the iodev.
-		 */
-		if (!cras_bt_io_on_profile(bt_iodev, try_profile)) {
-			device->active_profile = try_profile;
-			bt_device_switch_profile(device, bt_iodev, 0);
-		}
-		rc = cras_bt_io_remove(bt_iodev, iodev);
-		if (rc) {
-			syslog(LOG_ERR, "Fail to fallback to profile %u",
-			       try_profile);
-			goto destroy_bt_io;
-		}
-	}
-	return;
-
-destroy_bt_io:
-	device->bt_iodevs[iodev->direction] = NULL;
-	cras_bt_io_destroy(bt_iodev);
-
-	if (!device->bt_iodevs[CRAS_STREAM_INPUT] &&
-	    !device->bt_iodevs[CRAS_STREAM_OUTPUT])
-		cras_bt_device_set_active_profile(device, 0);
-}
-
-void cras_bt_device_a2dp_configured(struct cras_bt_device *device)
-{
-	BTLOG(btlog, BT_A2DP_CONFIGURED, device->connected_profiles, 0);
-	device->connected_profiles |= CRAS_BT_DEVICE_PROFILE_A2DP_SINK;
-}
-
-int cras_bt_device_has_a2dp(struct cras_bt_device *device)
-{
-	struct cras_iodev *odev = device->bt_iodevs[CRAS_STREAM_OUTPUT];
-
-	/* Check if there is an output iodev with A2DP node attached. */
-	return odev &&
-	       cras_bt_io_get_profile(odev, CRAS_BT_DEVICE_PROFILE_A2DP_SOURCE);
-}
-
-int cras_bt_device_can_switch_to_a2dp(struct cras_bt_device *device)
-{
-	struct cras_iodev *idev = device->bt_iodevs[CRAS_STREAM_INPUT];
-
-	return cras_bt_device_has_a2dp(device) &&
-	       (!idev || !cras_iodev_is_open(idev));
-}
-
-static void bt_device_remove_conflict(struct cras_bt_device *device)
-{
-	struct cras_bt_device *connected;
-
-	/* Suspend other HFP audio gateways that conflict with device. */
-	cras_hfp_ag_remove_conflict(device);
-
-	/* Check if there's conflict A2DP headset and suspend it. */
-	connected = cras_a2dp_connected_device();
-	if (connected && (connected != device))
-		cras_a2dp_suspend_connected_device(connected);
-}
-
-static void bt_device_conn_watch_cb(struct cras_timer *timer, void *arg);
-
-int cras_bt_device_audio_gateway_initialized(struct cras_bt_device *device)
-{
-	BTLOG(btlog, BT_AUDIO_GATEWAY_INIT, device->profiles, 0);
-	/* Marks HFP/HSP as connected. This is what connection watcher
-	 * checks. */
-	device->connected_profiles |= (CRAS_BT_DEVICE_PROFILE_HFP_HANDSFREE |
-				       CRAS_BT_DEVICE_PROFILE_HSP_HEADSET);
-
-	/* If device connects HFP but not reporting correct UUID, manually add
-	 * it to allow CRAS to enumerate audio node for it. We're seeing this
-	 * behavior on qualification test software. */
-	if (!cras_bt_device_supports_profile(
-		    device, CRAS_BT_DEVICE_PROFILE_HFP_HANDSFREE)) {
-		unsigned int profiles =
-			device->profiles | CRAS_BT_DEVICE_PROFILE_HFP_HANDSFREE;
-		cras_bt_device_set_supported_profiles(device, profiles);
-		device->hidden_profiles |= CRAS_BT_DEVICE_PROFILE_HFP_HANDSFREE;
-		bt_device_conn_watch_cb(NULL, (void *)device);
-	}
-
-	return 0;
-}
-
-unsigned int
-cras_bt_device_get_active_profile(const struct cras_bt_device *device)
-{
-	return device->active_profile;
-}
-
-void cras_bt_device_set_active_profile(struct cras_bt_device *device,
-				       unsigned int profile)
-{
-	device->active_profile = profile;
-}
-
-static void cras_bt_device_log_profile(const struct cras_bt_device *device,
-				       enum cras_bt_device_profile profile)
-{
-	switch (profile) {
-	case CRAS_BT_DEVICE_PROFILE_HFP_HANDSFREE:
-		syslog(LOG_DEBUG, "Bluetooth Device: %s is HFP handsfree",
-		       device->address);
-		break;
-	case CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY:
-		syslog(LOG_DEBUG, "Bluetooth Device: %s is HFP audio gateway",
-		       device->address);
-		break;
-	case CRAS_BT_DEVICE_PROFILE_A2DP_SOURCE:
-		syslog(LOG_DEBUG, "Bluetooth Device: %s is A2DP source",
-		       device->address);
-		break;
-	case CRAS_BT_DEVICE_PROFILE_A2DP_SINK:
-		syslog(LOG_DEBUG, "Bluetooth Device: %s is A2DP sink",
-		       device->address);
-		break;
-	case CRAS_BT_DEVICE_PROFILE_AVRCP_REMOTE:
-		syslog(LOG_DEBUG, "Bluetooth Device: %s is AVRCP remote",
-		       device->address);
-		break;
-	case CRAS_BT_DEVICE_PROFILE_AVRCP_TARGET:
-		syslog(LOG_DEBUG, "Bluetooth Device: %s is AVRCP target",
-		       device->address);
-		break;
-	case CRAS_BT_DEVICE_PROFILE_HSP_HEADSET:
-		syslog(LOG_DEBUG, "Bluetooth Device: %s is HSP headset",
-		       device->address);
-		break;
-	case CRAS_BT_DEVICE_PROFILE_HSP_AUDIOGATEWAY:
-		syslog(LOG_DEBUG, "Bluetooth Device: %s is HSP audio gateway",
-		       device->address);
-		break;
-	}
-}
-
-static void cras_bt_device_log_profiles(const struct cras_bt_device *device,
-					unsigned int profiles)
-{
-	unsigned int profile;
-
-	while (profiles) {
-		/* Get the LSB of profiles */
-		profile = profiles & -profiles;
-		cras_bt_device_log_profile(device, profile);
-		profiles ^= profile;
-	}
-}
-
-static int
-cras_bt_device_is_profile_connected(const struct cras_bt_device *device,
-				    enum cras_bt_device_profile profile)
-{
-	return !!(device->connected_profiles & profile);
-}
-
-static void
-bt_device_schedule_suspend(struct cras_bt_device *device, unsigned int msec,
-			   enum cras_bt_device_suspend_reason suspend_reason);
-
-/* Callback used to periodically check if supported profiles are connected. */
-static void bt_device_conn_watch_cb(struct cras_timer *timer, void *arg)
-{
-	struct cras_tm *tm;
-	struct cras_bt_device *device = (struct cras_bt_device *)arg;
-	int rc;
-	bool a2dp_supported;
-	bool a2dp_connected;
-	bool hfp_supported;
-	bool hfp_connected;
-
-	BTLOG(btlog, BT_DEV_CONN_WATCH_CB, device->conn_watch_retries,
-	      device->profiles);
-	device->conn_watch_timer = NULL;
-
-	/* Skip the callback if it is not an audio device. */
-	if (!device->profiles)
-		return;
-
-	a2dp_supported = cras_bt_device_supports_profile(
-		device, CRAS_BT_DEVICE_PROFILE_A2DP_SINK);
-	a2dp_connected = cras_bt_device_is_profile_connected(
-		device, CRAS_BT_DEVICE_PROFILE_A2DP_SINK);
-	hfp_supported = cras_bt_device_supports_profile(
-		device, CRAS_BT_DEVICE_PROFILE_HFP_HANDSFREE);
-	hfp_connected = cras_bt_device_is_profile_connected(
-		device, CRAS_BT_DEVICE_PROFILE_HFP_HANDSFREE);
-
-	/* If not both A2DP and HFP are supported, simply wait for BlueZ
-	 * to notify us about the new connection.
-	 * Otherwise, when seeing one but not the other profile is connected,
-	 * send message to ask BlueZ to connect the pending one.
-	 */
-	if (a2dp_supported && hfp_supported) {
-		/* If both a2dp and hfp are not connected, do nothing. BlueZ
-		 * should be responsible to notify connection of one profile.
-		 */
-		if (!a2dp_connected && hfp_connected)
-			cras_bt_device_connect_profile(device->conn, device,
-						       A2DP_SINK_UUID);
-		if (a2dp_connected && !hfp_connected)
-			cras_bt_device_connect_profile(device->conn, device,
-						       HFP_HF_UUID);
-	}
-
-	if (a2dp_supported != a2dp_connected || hfp_supported != hfp_connected)
-		goto arm_retry_timer;
-
-	/* Expected profiles are all connected, no more connection watch
-	 * callback will be scheduled.
-	 * Base on the decision that we expose only the latest connected
-	 * BT audio device to user, treat all other connected devices as
-	 * conflict and remove them before we start A2DP/HFP of this device.
-	 */
-	bt_device_remove_conflict(device);
-
-	if (cras_bt_device_is_profile_connected(
-		    device, CRAS_BT_DEVICE_PROFILE_A2DP_SINK))
-		cras_a2dp_start(device);
-
-	if (cras_bt_device_is_profile_connected(
-		    device, CRAS_BT_DEVICE_PROFILE_HFP_HANDSFREE)) {
-		rc = cras_hfp_ag_start(device);
-		if (rc) {
-			syslog(LOG_ERR, "Start audio gateway failed, rc %d",
-			       rc);
-			bt_device_schedule_suspend(device, 0,
-						   HFP_AG_START_FAILURE);
-		}
-	}
-	bt_device_set_nodes_plugged(device, 1);
-	return;
-
-arm_retry_timer:
-
-	syslog(LOG_DEBUG, "conn_watch_retries: %d", device->conn_watch_retries);
-
-	if (--device->conn_watch_retries) {
-		tm = cras_system_state_get_tm();
-		device->conn_watch_timer =
-			cras_tm_create_timer(tm, CONN_WATCH_PERIOD_MS,
-					     bt_device_conn_watch_cb, device);
-	} else {
-		syslog(LOG_ERR, "Connection watch timeout.");
-		bt_device_schedule_suspend(device, 0, CONN_WATCH_TIME_OUT);
-	}
-}
-
-static void
-cras_bt_device_start_new_conn_watch_timer(struct cras_bt_device *device)
-{
-	struct cras_tm *tm = cras_system_state_get_tm();
-
-	if (device->conn_watch_timer) {
-		cras_tm_cancel_timer(tm, device->conn_watch_timer);
-	}
-	device->conn_watch_retries = CONN_WATCH_MAX_RETRIES;
-	device->conn_watch_timer = cras_tm_create_timer(
-		tm, CONN_WATCH_PERIOD_MS, bt_device_conn_watch_cb, device);
-}
-
-static void bt_device_cancel_suspend(struct cras_bt_device *device);
-
-void cras_bt_device_set_connected(struct cras_bt_device *device, int value)
-{
-	struct cras_tm *tm = cras_system_state_get_tm();
-	if (!device->connected && value) {
-		BTLOG(btlog, BT_DEV_CONNECTED, device->profiles,
-		      device->stable_id);
-	}
-
-	if (device->connected && !value) {
-		BTLOG(btlog, BT_DEV_DISCONNECTED, device->profiles,
-		      device->stable_id);
-		cras_bt_profile_on_device_disconnected(device);
-		/* Device is disconnected, resets connected profiles and the
-		 * suspend timer which scheduled earlier. */
-		device->connected_profiles = 0;
-		bt_device_cancel_suspend(device);
-	}
-
-	device->connected = value;
-
-	if (!device->connected && device->conn_watch_timer) {
-		cras_tm_cancel_timer(tm, device->conn_watch_timer);
-		device->conn_watch_timer = NULL;
-	}
-}
-
-void cras_bt_device_notify_profile_dropped(struct cras_bt_device *device,
-					   enum cras_bt_device_profile profile)
-{
-	device->connected_profiles &= ~profile;
-
-	/* Do nothing if device already disconnected. */
-	if (!device->connected)
-		return;
-
-	/* If any profile, a2dp or hfp/hsp, has dropped for some reason,
-	 * we shall make sure this device is fully disconnected within
-	 * given time so that user does not see a headset stay connected
-	 * but works with partial function.
-	 */
-	bt_device_schedule_suspend(device, PROFILE_DROP_SUSPEND_DELAY_MS,
-				   UNEXPECTED_PROFILE_DROP);
-}
-
-/* Refresh the list of known supported profiles.
- * Args:
- *    device - The BT device holding scanned profiles bitmap.
- *    profiles - The OR'ed profiles the device claims to support as is notified
- *               by BlueZ.
- * Returns:
- *    The OR'ed profiles that are both supported by Cras and isn't previously
- *    supported by the device.
- */
-int cras_bt_device_set_supported_profiles(struct cras_bt_device *device,
-					  unsigned int profiles)
-{
-	/* Do nothing if no new profiles. */
-	if ((device->profiles & profiles) == profiles)
-		return 0;
-
-	unsigned int new_profiles = profiles & ~device->profiles;
-
-	/* Log this event as we might need to re-intialize the BT audio nodes
-	 * if new audio profile is reported for already connected device. */
-	if (device->connected && (new_profiles & CRAS_SUPPORTED_PROFILES))
-		BTLOG(btlog, BT_NEW_AUDIO_PROFILE_AFTER_CONNECT,
-		      device->profiles, new_profiles);
-	cras_bt_device_log_profiles(device, new_profiles);
-	device->profiles = profiles | device->hidden_profiles;
-
-	return (new_profiles & CRAS_SUPPORTED_PROFILES);
-}
-
-void cras_bt_device_update_properties(struct cras_bt_device *device,
-				      DBusMessageIter *properties_array_iter,
-				      DBusMessageIter *invalidated_array_iter)
-{
-	int watch_needed = 0;
-	while (dbus_message_iter_get_arg_type(properties_array_iter) !=
-	       DBUS_TYPE_INVALID) {
-		DBusMessageIter properties_dict_iter, variant_iter;
-		const char *key;
-		int type;
-
-		dbus_message_iter_recurse(properties_array_iter,
-					  &properties_dict_iter);
-
-		dbus_message_iter_get_basic(&properties_dict_iter, &key);
-		dbus_message_iter_next(&properties_dict_iter);
-
-		dbus_message_iter_recurse(&properties_dict_iter, &variant_iter);
-		type = dbus_message_iter_get_arg_type(&variant_iter);
-
-		if (type == DBUS_TYPE_STRING || type == DBUS_TYPE_OBJECT_PATH) {
-			const char *value;
-
-			dbus_message_iter_get_basic(&variant_iter, &value);
-
-			if (strcmp(key, "Adapter") == 0) {
-				free(device->adapter_obj_path);
-				device->adapter_obj_path = strdup(value);
-			} else if (strcmp(key, "Address") == 0) {
-				free(device->address);
-				device->address = strdup(value);
-			} else if (strcmp(key, "Alias") == 0) {
-				free(device->name);
-				device->name = strdup(value);
-			}
-
-		} else if (type == DBUS_TYPE_UINT32) {
-			uint32_t value;
-
-			dbus_message_iter_get_basic(&variant_iter, &value);
-
-			if (strcmp(key, "Class") == 0)
-				device->bluetooth_class = value;
-
-		} else if (type == DBUS_TYPE_BOOLEAN) {
-			int value;
-
-			dbus_message_iter_get_basic(&variant_iter, &value);
-
-			if (strcmp(key, "Paired") == 0) {
-				device->paired = value;
-			} else if (strcmp(key, "Trusted") == 0) {
-				device->trusted = value;
-			} else if (strcmp(key, "Connected") == 0) {
-				cras_bt_device_set_connected(device, value);
-				watch_needed = device->connected &&
-					       cras_bt_device_supports_profile(
-						       device,
-						       CRAS_SUPPORTED_PROFILES);
-			}
-
-		} else if (strcmp(dbus_message_iter_get_signature(&variant_iter),
-				  "as") == 0 &&
-			   strcmp(key, "UUIDs") == 0) {
-			DBusMessageIter uuid_array_iter;
-			unsigned int profiles = 0;
-
-			dbus_message_iter_recurse(&variant_iter,
-						  &uuid_array_iter);
-			while (dbus_message_iter_get_arg_type(
-				       &uuid_array_iter) != DBUS_TYPE_INVALID) {
-				const char *uuid;
-
-				dbus_message_iter_get_basic(&uuid_array_iter,
-							    &uuid);
-				profiles |=
-					cras_bt_device_profile_from_uuid(uuid);
-
-				dbus_message_iter_next(&uuid_array_iter);
-			}
-
-			/* If updated properties includes new audio profile and
-			 * device is connected, we need to start connection
-			 * watcher. This is needed because on some bluetooth
-			 * devices, supported profiles do not present when
-			 * device interface is added and they are updated later.
-			 */
-			if (cras_bt_device_set_supported_profiles(device,
-								  profiles))
-				watch_needed = device->connected;
-		}
-
-		dbus_message_iter_next(properties_array_iter);
-	}
-
-	while (invalidated_array_iter &&
-	       dbus_message_iter_get_arg_type(invalidated_array_iter) !=
-		       DBUS_TYPE_INVALID) {
-		const char *key;
-
-		dbus_message_iter_get_basic(invalidated_array_iter, &key);
-
-		if (strcmp(key, "Adapter") == 0) {
-			free(device->adapter_obj_path);
-			device->adapter_obj_path = NULL;
-		} else if (strcmp(key, "Address") == 0) {
-			free(device->address);
-			device->address = NULL;
-		} else if (strcmp(key, "Alias") == 0) {
-			free(device->name);
-			device->name = NULL;
-		} else if (strcmp(key, "Class") == 0) {
-			device->bluetooth_class = 0;
-		} else if (strcmp(key, "Paired") == 0) {
-			device->paired = 0;
-		} else if (strcmp(key, "Trusted") == 0) {
-			device->trusted = 0;
-		} else if (strcmp(key, "Connected") == 0) {
-			device->connected = 0;
-		} else if (strcmp(key, "UUIDs") == 0) {
-			device->profiles = device->hidden_profiles;
-		}
-
-		dbus_message_iter_next(invalidated_array_iter);
-	}
-
-	if (watch_needed)
-		cras_bt_device_start_new_conn_watch_timer(device);
-}
-
-/* Converts bluetooth address string into sockaddr structure. The address
- * string is expected of the form 1A:2B:3C:4D:5E:6F, and each of the six
- * hex values will be parsed into sockaddr in inverse order.
- * Args:
- *    str - The string version of bluetooth address
- *    addr - The struct to be filled with converted address
- */
-static int bt_address(const char *str, struct sockaddr *addr)
-{
-	int i;
-
-	if (strlen(str) != 17) {
-		syslog(LOG_ERR, "Invalid bluetooth address %s", str);
-		return -1;
-	}
-
-	memset(addr, 0, sizeof(*addr));
-	addr->sa_family = AF_BLUETOOTH;
-	for (i = 5; i >= 0; i--) {
-		addr->sa_data[i] = (unsigned char)strtol(str, NULL, 16);
-		str += 3;
-	}
-
-	return 0;
-}
-
-/* Apply codec specific settings to the socket fd. */
-static int apply_codec_settings(int fd, uint8_t codec)
-{
-	struct bt_voice voice;
-	uint32_t pkt_status;
-
-	memset(&voice, 0, sizeof(voice));
-	if (codec == HFP_CODEC_ID_CVSD)
-		return 0;
-
-	if (codec != HFP_CODEC_ID_MSBC) {
-		syslog(LOG_ERR, "Unsupported codec %d", codec);
-		return -1;
-	}
-
-	voice.setting = BT_VOICE_TRANSPARENT;
-
-	if (setsockopt(fd, SOL_BLUETOOTH, BT_VOICE, &voice, sizeof(voice)) <
-	    0) {
-		syslog(LOG_ERR, "Failed to apply voice setting");
-		return -1;
-	}
-
-	pkt_status = 1;
-	if (setsockopt(fd, SOL_BLUETOOTH, BT_PKT_STATUS, &pkt_status,
-		       sizeof(pkt_status))) {
-		syslog(LOG_ERR, "Failed to enable BT_PKT_STATUS");
-	}
-	return 0;
-}
-
-int cras_bt_device_sco_connect(struct cras_bt_device *device, int codec)
-{
-	int sk = 0, err;
-	struct sockaddr addr;
-	struct cras_bt_adapter *adapter;
-	struct timespec timeout = { 1, 0 };
-	struct pollfd pollfd;
-
-	adapter = cras_bt_device_adapter(device);
-	if (!adapter) {
-		syslog(LOG_ERR, "No adapter found for device %s at SCO connect",
-		       cras_bt_device_object_path(device));
-		goto error;
-	}
-
-	sk = socket(PF_BLUETOOTH, SOCK_SEQPACKET | O_NONBLOCK | SOCK_CLOEXEC,
-		    BTPROTO_SCO);
-	if (sk < 0) {
-		syslog(LOG_ERR, "Failed to create socket: %s (%d)",
-		       strerror(errno), errno);
-		cras_server_metrics_hfp_sco_connection_error(
-			CRAS_METRICS_SCO_SKT_OPEN_ERROR);
-		return -errno;
-	}
-
-	/* Bind to local address */
-	if (bt_address(cras_bt_adapter_address(adapter), &addr))
-		goto error;
-	if (bind(sk, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
-		syslog(LOG_ERR, "Failed to bind socket: %s (%d)",
-		       strerror(errno), errno);
-		goto error;
-	}
-
-	/* Connect to remote in nonblocking mode */
-	fcntl(sk, F_SETFL, O_NONBLOCK);
-
-	if (bt_address(cras_bt_device_address(device), &addr))
-		goto error;
-
-	err = apply_codec_settings(sk, codec);
-	if (err)
-		goto error;
-
-	err = connect(sk, (struct sockaddr *)&addr, sizeof(addr));
-	if (err && errno != EINPROGRESS) {
-		syslog(LOG_ERR, "Failed to connect: %s (%d)", strerror(errno),
-		       errno);
-		cras_server_metrics_hfp_sco_connection_error(
-			CRAS_METRICS_SCO_SKT_CONNECT_ERROR);
-		goto error;
-	}
-
-	pollfd.fd = sk;
-	pollfd.events = POLLOUT;
-
-	err = ppoll(&pollfd, 1, &timeout, NULL);
-	if (err <= 0) {
-		syslog(LOG_ERR, "Connect SCO: poll for writable timeout");
-		cras_server_metrics_hfp_sco_connection_error(
-			CRAS_METRICS_SCO_SKT_POLL_TIMEOUT);
-		goto error;
-	}
-
-	if (pollfd.revents & (POLLERR | POLLHUP)) {
-		syslog(LOG_ERR,
-		       "SCO socket error, revents: %u. Suspend in %u seconds",
-		       pollfd.revents, SCO_SUSPEND_DELAY_MS);
-		cras_server_metrics_hfp_sco_connection_error(
-			CRAS_METRICS_SCO_SKT_POLL_ERR_HUP);
-		bt_device_schedule_suspend(device, SCO_SUSPEND_DELAY_MS,
-					   HFP_SCO_SOCKET_ERROR);
-		goto error;
-	}
-
-	cras_server_metrics_hfp_sco_connection_error(
-		CRAS_METRICS_SCO_SKT_SUCCESS);
-	BTLOG(btlog, BT_SCO_CONNECT, 1, sk);
-	return sk;
-
-error:
-	BTLOG(btlog, BT_SCO_CONNECT, 0, sk);
-	if (sk)
-		close(sk);
-	return -1;
-}
-
-int cras_bt_device_sco_packet_size(struct cras_bt_device *device,
-				   int sco_socket, int codec)
-{
-	struct sco_options so;
-	socklen_t len = sizeof(so);
-	struct cras_bt_adapter *adapter;
-	uint32_t wbs_pkt_len = 0;
-	socklen_t optlen = sizeof(wbs_pkt_len);
-
-	adapter = cras_bt_adapter_get(device->adapter_obj_path);
-
-	if (cras_bt_adapter_on_usb(adapter)) {
-		if (codec == HFP_CODEC_ID_MSBC) {
-			/* BT_SNDMTU and BT_RCVMTU return the same value. */
-			if (getsockopt(sco_socket, SOL_BLUETOOTH, BT_SNDMTU,
-				       &wbs_pkt_len, &optlen))
-				syslog(LOG_ERR, "Failed to get BT_SNDMTU");
-
-			return (wbs_pkt_len > 0) ? wbs_pkt_len :
-						   USB_MSBC_PKT_SIZE;
-		} else {
-			return USB_CVSD_PKT_SIZE;
-		}
-	}
-
-	/* For non-USB cases, query the SCO MTU from driver. */
-	if (getsockopt(sco_socket, SOL_SCO, SCO_OPTIONS, &so, &len) < 0) {
-		syslog(LOG_ERR, "Get SCO options error: %s", strerror(errno));
-		return DEFAULT_SCO_PKT_SIZE;
-	}
-	return so.mtu;
-}
-
-void cras_bt_device_set_use_hardware_volume(struct cras_bt_device *device,
-					    int use_hardware_volume)
-{
-	struct cras_iodev *iodev;
-
-	device->use_hardware_volume = use_hardware_volume;
-	iodev = device->bt_iodevs[CRAS_STREAM_OUTPUT];
-	if (iodev)
-		iodev->software_volume_needed = !use_hardware_volume;
-}
-
-int cras_bt_device_get_use_hardware_volume(struct cras_bt_device *device)
-{
-	return device->use_hardware_volume;
-}
-
-static void init_bt_device_msg(struct bt_device_msg *msg,
-			       enum BT_DEVICE_COMMAND cmd,
-			       struct cras_bt_device *device,
-			       struct cras_iodev *dev, unsigned int arg1,
-			       unsigned int arg2)
-{
-	memset(msg, 0, sizeof(*msg));
-	msg->header.type = CRAS_MAIN_BT;
-	msg->header.length = sizeof(*msg);
-	msg->cmd = cmd;
-	msg->device = device;
-	msg->dev = dev;
-	msg->arg1 = arg1;
-	msg->arg2 = arg2;
-}
-
-int cras_bt_device_cancel_suspend(struct cras_bt_device *device)
-{
-	struct bt_device_msg msg;
-	int rc;
-
-	init_bt_device_msg(&msg, BT_DEVICE_CANCEL_SUSPEND, device, NULL, 0, 0);
-	rc = cras_main_message_send((struct cras_main_message *)&msg);
-	return rc;
-}
-
-int cras_bt_device_schedule_suspend(
-	struct cras_bt_device *device, unsigned int msec,
-	enum cras_bt_device_suspend_reason suspend_reason)
-{
-	struct bt_device_msg msg;
-	int rc;
-
-	init_bt_device_msg(&msg, BT_DEVICE_SCHEDULE_SUSPEND, device, NULL, msec,
-			   suspend_reason);
-	rc = cras_main_message_send((struct cras_main_message *)&msg);
-	return rc;
-}
-
-/* This diagram describes how the profile switching happens. When
- * certain conditions met, bt iodev will call the APIs below to interact
- * with main thread to switch to another active profile.
- *
- * Audio thread:
- *  +--------------------------------------------------------------+
- *  | bt iodev                                                     |
- *  |              +------------------+    +-----------------+     |
- *  |              | condition met to |    | open, close, or |     |
- *  |           +--| change profile   |<---| append profile  |<--+ |
- *  |           |  +------------------+    +-----------------+   | |
- *  +-----------|------------------------------------------------|-+
- *              |                                                |
- * Main thread: |
- *  +-----------|------------------------------------------------|-+
- *  |           |                                                | |
- *  |           |      +------------+     +----------------+     | |
- *  |           +----->| set active |---->| switch profile |-----+ |
- *  |                  | profile    |     +----------------+       |
- *  | bt device        +------------+                              |
- *  +--------------------------------------------------------------+
- */
-int cras_bt_device_switch_profile_enable_dev(struct cras_bt_device *device,
-					     struct cras_iodev *bt_iodev)
-{
-	struct bt_device_msg msg;
-	int rc;
-
-	init_bt_device_msg(&msg, BT_DEVICE_SWITCH_PROFILE_ENABLE_DEV, device,
-			   bt_iodev, 0, 0);
-	rc = cras_main_message_send((struct cras_main_message *)&msg);
-	return rc;
-}
-
-int cras_bt_device_switch_profile(struct cras_bt_device *device,
-				  struct cras_iodev *bt_iodev)
-{
-	struct bt_device_msg msg;
-	int rc;
-
-	init_bt_device_msg(&msg, BT_DEVICE_SWITCH_PROFILE, device, bt_iodev, 0,
-			   0);
-	rc = cras_main_message_send((struct cras_main_message *)&msg);
-	return rc;
-}
-
-static void profile_switch_delay_cb(struct cras_timer *timer, void *arg)
-{
-	struct cras_bt_device *device = (struct cras_bt_device *)arg;
-	struct cras_iodev *iodev;
-
-	device->switch_profile_timer = NULL;
-	iodev = device->bt_iodevs[CRAS_STREAM_OUTPUT];
-	if (!iodev)
-		return;
-
-	/*
-	 * During the |PROFILE_SWITCH_DELAY_MS| time interval, BT iodev could
-	 * have been enabled by others, and its active profile may have changed.
-	 * If iodev has been enabled, that means it has already picked up a
-	 * reasonable profile to use and audio thread is accessing iodev now.
-	 * We should NOT call into update_active_node from main thread
-	 * because that may mess up the active node content.
-	 */
-	iodev->update_active_node(iodev, 0, 1);
-	cras_iodev_list_resume_dev(iodev->info.idx);
-}
-
-static void bt_device_switch_profile_with_delay(struct cras_bt_device *device,
-						unsigned int delay_ms)
-{
-	struct cras_tm *tm = cras_system_state_get_tm();
-
-	if (device->switch_profile_timer) {
-		cras_tm_cancel_timer(tm, device->switch_profile_timer);
-		device->switch_profile_timer = NULL;
-	}
-	device->switch_profile_timer = cras_tm_create_timer(
-		tm, delay_ms, profile_switch_delay_cb, device);
-}
-
-/* Switches associated bt iodevs to use the active profile. This is
- * achieved by close the iodevs, update their active nodes, and then
- * finally reopen them. */
-static void bt_device_switch_profile(struct cras_bt_device *device,
-				     struct cras_iodev *bt_iodev,
-				     int enable_dev)
-{
-	struct cras_iodev *iodev;
-	int dir;
-
-	/* If a bt iodev is active, temporarily force close it.
-	 * Note that we need to check all bt_iodevs for the situation that both
-	 * input and output are active while switches from HFP/HSP to A2DP.
-	 */
-	for (dir = 0; dir < CRAS_NUM_DIRECTIONS; dir++) {
-		iodev = device->bt_iodevs[dir];
-		if (!iodev)
-			continue;
-		cras_iodev_list_suspend_dev(iodev->info.idx);
-	}
-
-	for (dir = 0; dir < CRAS_NUM_DIRECTIONS; dir++) {
-		iodev = device->bt_iodevs[dir];
-		if (!iodev)
-			continue;
-
-		/* If the iodev was active or this profile switching is
-		 * triggered at opening iodev, add it to active dev list.
-		 * However for the output iodev, adding it back to active dev
-		 * list could cause immediate switching from HFP to A2DP if
-		 * there exists an output stream. Certain headset/speaker
-		 * would fail to playback afterwards when the switching happens
-		 * too soon, so put this task in a delayed callback.
-		 */
-		if (dir == CRAS_STREAM_INPUT) {
-			iodev->update_active_node(iodev, 0, 1);
-			cras_iodev_list_resume_dev(iodev->info.idx);
-		} else {
-			bt_device_switch_profile_with_delay(
-				device, PROFILE_SWITCH_DELAY_MS);
-		}
-	}
-}
-
-static void bt_device_suspend_cb(struct cras_timer *timer, void *arg)
-{
-	struct cras_bt_device *device = (struct cras_bt_device *)arg;
-
-	BTLOG(btlog, BT_DEV_SUSPEND_CB, device->profiles,
-	      device->suspend_reason);
-	device->suspend_timer = NULL;
-
-	/* Error log the reason so we can track them in user reports. */
-	switch (device->suspend_reason) {
-	case A2DP_LONG_TX_FAILURE:
-		syslog(LOG_ERR, "Suspend dev: A2DP long Tx failure");
-		break;
-	case A2DP_TX_FATAL_ERROR:
-		syslog(LOG_ERR, "Suspend dev: A2DP Tx fatal error");
-		break;
-	case CONN_WATCH_TIME_OUT:
-		syslog(LOG_ERR, "Suspend dev: Conn watch times out");
-		break;
-	case HFP_SCO_SOCKET_ERROR:
-		syslog(LOG_ERR, "Suspend dev: SCO socket error");
-		break;
-	case HFP_AG_START_FAILURE:
-		syslog(LOG_ERR, "Suspend dev: HFP AG start failure");
-		break;
-	case UNEXPECTED_PROFILE_DROP:
-		syslog(LOG_ERR, "Suspend dev: Unexpected profile drop");
-		break;
-	}
-
-	cras_a2dp_suspend_connected_device(device);
-	cras_hfp_ag_suspend_connected_device(device);
-	cras_bt_device_disconnect(device->conn, device);
-}
-
-static void
-bt_device_schedule_suspend(struct cras_bt_device *device, unsigned int msec,
-			   enum cras_bt_device_suspend_reason suspend_reason)
-{
-	struct cras_tm *tm = cras_system_state_get_tm();
-
-	if (device->suspend_timer)
-		return;
-	device->suspend_reason = suspend_reason;
-	device->suspend_timer =
-		cras_tm_create_timer(tm, msec, bt_device_suspend_cb, device);
-}
-
-static void bt_device_cancel_suspend(struct cras_bt_device *device)
-{
-	struct cras_tm *tm = cras_system_state_get_tm();
-	if (device->suspend_timer == NULL)
-		return;
-	cras_tm_cancel_timer(tm, device->suspend_timer);
-	device->suspend_timer = NULL;
-}
-
-static void bt_device_process_msg(struct cras_main_message *msg, void *arg)
-{
-	struct bt_device_msg *bt_msg = (struct bt_device_msg *)msg;
-	struct cras_bt_device *device = NULL;
-
-	DL_FOREACH (devices, device) {
-		if (device == bt_msg->device)
-			break;
-	}
-
-	/* Do nothing if target device no longer exists. */
-	if (device == NULL)
-		return;
-
-	switch (bt_msg->cmd) {
-	case BT_DEVICE_SWITCH_PROFILE:
-		bt_device_switch_profile(bt_msg->device, bt_msg->dev, 0);
-		break;
-	case BT_DEVICE_SWITCH_PROFILE_ENABLE_DEV:
-		bt_device_switch_profile(bt_msg->device, bt_msg->dev, 1);
-		break;
-	case BT_DEVICE_SCHEDULE_SUSPEND:
-		bt_device_schedule_suspend(bt_msg->device, bt_msg->arg1,
-					   bt_msg->arg2);
-		break;
-	case BT_DEVICE_CANCEL_SUSPEND:
-		bt_device_cancel_suspend(bt_msg->device);
-		break;
-	default:
-		break;
-	}
-}
-
-void cras_bt_device_start_monitor()
-{
-	cras_main_message_add_handler(CRAS_MAIN_BT, bt_device_process_msg,
-				      NULL);
-}
-
-void cras_bt_device_update_hardware_volume(struct cras_bt_device *device,
-					   int volume)
-{
-	struct cras_iodev *iodev;
-
-	iodev = device->bt_iodevs[CRAS_STREAM_OUTPUT];
-	if (iodev == NULL)
-		return;
-
-	/* Check if this BT device is okay to use hardware volume. If not
-	 * then ignore the reported volume change event.
-	 */
-	if (!cras_bt_device_get_use_hardware_volume(device))
-		return;
-
-	iodev->active_node->volume = volume;
-	cras_iodev_list_notify_node_volume(iodev->active_node);
-}
-
-int cras_bt_device_get_sco(struct cras_bt_device *device, int codec)
-{
-	if (device->sco_ref_count == 0) {
-		device->sco_fd = cras_bt_device_sco_connect(device, codec);
-		if (device->sco_fd < 0)
-			return device->sco_fd;
-	}
-
-	++device->sco_ref_count;
-	return 0;
-}
-
-void cras_bt_device_put_sco(struct cras_bt_device *device)
-{
-	if (device->sco_ref_count == 0)
-		return;
-
-	if (--device->sco_ref_count == 0)
-		close(device->sco_fd);
-}
diff --git a/cras/src/server/cras_bt_device.h b/cras/src/server/cras_bt_device.h
deleted file mode 100644
index 9d3a2b9..0000000
--- a/cras/src/server/cras_bt_device.h
+++ /dev/null
@@ -1,230 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_BT_DEVICE_H_
-#define CRAS_BT_DEVICE_H_
-
-#include <dbus/dbus.h>
-
-struct cras_bt_adapter;
-struct cras_bt_device;
-struct cras_iodev;
-struct cras_timer;
-
-/* All the reasons for when CRAS schedule a suspend to BT device. */
-enum cras_bt_device_suspend_reason {
-	A2DP_LONG_TX_FAILURE,
-	A2DP_TX_FATAL_ERROR,
-	CONN_WATCH_TIME_OUT,
-	HFP_SCO_SOCKET_ERROR,
-	HFP_AG_START_FAILURE,
-	UNEXPECTED_PROFILE_DROP,
-};
-
-enum cras_bt_device_profile {
-	CRAS_BT_DEVICE_PROFILE_A2DP_SOURCE = (1 << 0),
-	CRAS_BT_DEVICE_PROFILE_A2DP_SINK = (1 << 1),
-	CRAS_BT_DEVICE_PROFILE_AVRCP_REMOTE = (1 << 2),
-	CRAS_BT_DEVICE_PROFILE_AVRCP_TARGET = (1 << 3),
-	CRAS_BT_DEVICE_PROFILE_HFP_HANDSFREE = (1 << 4),
-	CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY = (1 << 5),
-	CRAS_BT_DEVICE_PROFILE_HSP_HEADSET = (1 << 6),
-	CRAS_BT_DEVICE_PROFILE_HSP_AUDIOGATEWAY = (1 << 7)
-};
-
-enum cras_bt_device_profile cras_bt_device_profile_from_uuid(const char *uuid);
-
-struct cras_bt_device *cras_bt_device_create(DBusConnection *conn,
-					     const char *object_path);
-
-/*
- * Removes a BT device from record. If this device is connected state,
- * ensure the associated A2DP and HFP AG be removed cleanly.
- */
-void cras_bt_device_remove(struct cras_bt_device *device);
-
-void cras_bt_device_reset();
-
-struct cras_bt_device *cras_bt_device_get(const char *object_path);
-
-const char *cras_bt_device_object_path(const struct cras_bt_device *device);
-
-/* Gets the stable id of given cras_bt_device. */
-int cras_bt_device_get_stable_id(const struct cras_bt_device *device);
-
-struct cras_bt_adapter *
-cras_bt_device_adapter(const struct cras_bt_device *device);
-const char *cras_bt_device_address(const struct cras_bt_device *device);
-const char *cras_bt_device_name(const struct cras_bt_device *device);
-int cras_bt_device_paired(const struct cras_bt_device *device);
-int cras_bt_device_trusted(const struct cras_bt_device *device);
-int cras_bt_device_connected(const struct cras_bt_device *device);
-
-void cras_bt_device_update_properties(struct cras_bt_device *device,
-				      DBusMessageIter *properties_array_iter,
-				      DBusMessageIter *invalidated_array_iter);
-
-/* Updates the supported profiles on dev. Expose for unit test. */
-int cras_bt_device_set_supported_profiles(struct cras_bt_device *device,
-					  unsigned int profiles);
-
-/* Checks if profile is claimed supported by the device. */
-int cras_bt_device_supports_profile(const struct cras_bt_device *device,
-				    enum cras_bt_device_profile profile);
-
-/* Sets if the BT audio device should use hardware volume.
- * Args:
- *    device - The remote bluetooth audio device.
- *    use_hardware_volume - Set to true to indicate hardware volume
- *        is preferred over software volume.
- */
-void cras_bt_device_set_use_hardware_volume(struct cras_bt_device *device,
-					    int use_hardware_volume);
-
-/* Gets if the BT audio device should use hardware volume. */
-int cras_bt_device_get_use_hardware_volume(struct cras_bt_device *device);
-
-/* Sets device connected state. Expose for unit test. */
-void cras_bt_device_set_connected(struct cras_bt_device *device, int value);
-
-/* Forces disconnect the bt device. Used when handling audio error
- * that we want to make the device be completely disconnected from
- * host to reflect the state that an error has occurred.
- * Args:
- *    conn - The dbus connection.
- *    device - The bt device to disconnect.
- */
-int cras_bt_device_disconnect(DBusConnection *conn,
-			      struct cras_bt_device *device);
-
-/* Gets the SCO socket for the device.
- * Args:
- *     device - The device object to get SCO socket for.
- *     codec - 1 for CVSD, 2 for mSBC
- */
-int cras_bt_device_sco_connect(struct cras_bt_device *device, int codec);
-
-/* Gets the SCO packet size in bytes, used by HFP iodev for audio I/O.
- * The logic is built base on experience: for USB bus, respect BT Core spec
- * that has clear recommendation of packet size of codecs (CVSD, mSBC).
- * As for other buses, use the MTU value of SCO socket filled by driver.
- * Args:
- *    device - The bt device to query mtu.
- *    sco_socket - The SCO socket.
- *    codec - 1 for CVSD, 2 for mSBC per HFP 1.7 specification.
- */
-int cras_bt_device_sco_packet_size(struct cras_bt_device *device,
-				   int sco_socket, int codec);
-
-/* Appends an iodev to bt device.
- * Args:
- *    device - The device to append iodev to.
- *    iodev - The iodev to add.
- *    profile - The profile of the iodev about to add.
- */
-void cras_bt_device_append_iodev(struct cras_bt_device *device,
-				 struct cras_iodev *iodev,
-				 enum cras_bt_device_profile profile);
-
-/* Removes an iodev from bt device.
- * Args:
- *    device - The device to remove iodev from.
- *    iodev - The iodev to remove.
- */
-void cras_bt_device_rm_iodev(struct cras_bt_device *device,
-			     struct cras_iodev *iodev);
-
-/* Gets the active profile of the bt device. */
-unsigned int
-cras_bt_device_get_active_profile(const struct cras_bt_device *device);
-
-/* Sets the active profile of the bt device. */
-void cras_bt_device_set_active_profile(struct cras_bt_device *device,
-				       unsigned int profile);
-
-/* Switches profile after the active profile of bt device has changed and
- * enables bt iodev immediately. This function is used for profile switching
- * at iodev open.
- * Args:
- *    device - The bluetooth device.
- *    bt_iodev - The iodev triggers the reactivaion.
- */
-int cras_bt_device_switch_profile_enable_dev(struct cras_bt_device *device,
-					     struct cras_iodev *bt_iodev);
-
-/* Switches profile after the active profile of bt device has changed. This
- * function is used when we want to switch profile without changing the
- * iodev's status.
- * Args:
- *    device - The bluetooth device.
- *    bt_iodev - The iodev triggers the reactivaion.
- */
-int cras_bt_device_switch_profile(struct cras_bt_device *device,
-				  struct cras_iodev *bt_iodev);
-
-void cras_bt_device_start_monitor();
-
-/* Checks if the device has an iodev for A2DP. */
-int cras_bt_device_has_a2dp(struct cras_bt_device *device);
-
-/* Returns true if and only if device has an iodev for A2DP and the bt device
- * is not opening for audio capture.
- */
-int cras_bt_device_can_switch_to_a2dp(struct cras_bt_device *device);
-
-/* Updates the volume to bt_device when a volume change event is reported. */
-void cras_bt_device_update_hardware_volume(struct cras_bt_device *device,
-					   int volume);
-
-/* Notifies bt_device that a2dp connection is configured. */
-void cras_bt_device_a2dp_configured(struct cras_bt_device *device);
-
-/* Cancels any scheduled suspension of device. */
-int cras_bt_device_cancel_suspend(struct cras_bt_device *device);
-
-/* Schedules device to suspend after given delay. */
-int cras_bt_device_schedule_suspend(
-	struct cras_bt_device *device, unsigned int msec,
-	enum cras_bt_device_suspend_reason suspend_reason);
-
-/* Notifies bt device that audio gateway is initialized.
- * Args:
- *   device - The bluetooth device.
- * Returns:
- *   0 on success, error code otherwise.
- */
-int cras_bt_device_audio_gateway_initialized(struct cras_bt_device *device);
-
-/*
- * Notifies bt device about a profile no longer works. It could be caused
- * by initialize failure or fatal error has occurred.
- * Args:
- *    device - The bluetooth audio device.
- *    profile - The BT audio profile that has dropped.
- */
-void cras_bt_device_notify_profile_dropped(struct cras_bt_device *device,
-					   enum cras_bt_device_profile profile);
-
-/*
- * Establishes SCO connection if it has not been established on the BT device.
- * Note: this function should be only used for hfp_alsa_io.
- * Args:
- *    device - The bluetooth device.
- *    codec - 1 for CVSD, 2 for mSBC
- * Returns:
- *   0 on success, error code otherwise.
- */
-int cras_bt_device_get_sco(struct cras_bt_device *device, int codec);
-
-/*
- * Closes SCO connection if the caller is the last user for the connection on
- * the BT device.
- * Note: this function should be only used for hfp_alsa_io.
- * Args:
- *   device - The bluetooth device.
- */
-void cras_bt_device_put_sco(struct cras_bt_device *device);
-
-#endif /* CRAS_BT_DEVICE_H_ */
diff --git a/cras/src/server/cras_bt_endpoint.c b/cras/src/server/cras_bt_endpoint.c
deleted file mode 100644
index 5b2b6e0..0000000
--- a/cras/src/server/cras_bt_endpoint.c
+++ /dev/null
@@ -1,583 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <dbus/dbus.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <string.h>
-#include <syslog.h>
-
-#include "cras_bt_constants.h"
-#include "cras_bt_adapter.h"
-#include "cras_bt_endpoint.h"
-#include "cras_bt_transport.h"
-#include "utlist.h"
-
-/* Defined by doc/media-api.txt in the BlueZ source */
-#define ENDPOINT_INTROSPECT_XML                                                 \
-	DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE                               \
-	"<node>\n"                                                              \
-	"  <interface name=\"org.bluez.MediaEndpoint\">\n"                      \
-	"    <method name=\"SetConfiguration\">\n"                              \
-	"      <arg name=\"transport\" type=\"o\" direction=\"in\"/>\n"         \
-	"      <arg name=\"configuration\" type=\"a{sv}\" direction=\"in\"/>\n" \
-	"    </method>\n"                                                       \
-	"    <method name=\"SelectConfiguration\">\n"                           \
-	"      <arg name=\"capabilities\" type=\"ay\" direction=\"in\"/>\n"     \
-	"      <arg name=\"configuration\" type=\"ay\" direction=\"out\"/>\n"   \
-	"    </method>\n"                                                       \
-	"    <method name=\"ClearConfiguration\">\n"                            \
-	"    </method>\n"                                                       \
-	"    <method name=\"Release\">\n"                                       \
-	"    </method>\n"                                                       \
-	"  </interface>\n"                                                      \
-	"  <interface name=\"" DBUS_INTERFACE_INTROSPECTABLE "\">\n"            \
-	"    <method name=\"Introspect\">\n"                                    \
-	"      <arg name=\"data\" type=\"s\" direction=\"out\"/>\n"             \
-	"    </method>\n"                                                       \
-	"  </interface>\n"                                                      \
-	"</node>\n"
-
-static void cras_bt_endpoint_suspend(struct cras_bt_endpoint *endpoint)
-{
-	struct cras_bt_transport *transport;
-
-	if (!endpoint->transport)
-		return;
-
-	endpoint->suspend(endpoint, endpoint->transport);
-
-	transport = endpoint->transport;
-	cras_bt_transport_set_endpoint(transport, NULL);
-	endpoint->transport = NULL;
-
-	/*
-	 * If BT stack has notified this transport interface removed.
-	 * Destroy transport now since all related objects has been
-	 * cleaned up.
-	 */
-	if (cras_bt_transport_is_removed(transport))
-		cras_bt_transport_destroy(transport);
-}
-
-static DBusHandlerResult
-cras_bt_endpoint_set_configuration(DBusConnection *conn, DBusMessage *message,
-				   void *arg)
-{
-	DBusMessageIter message_iter, properties_array_iter;
-	const char *endpoint_path, *transport_path;
-	struct cras_bt_endpoint *endpoint;
-	struct cras_bt_transport *transport;
-	DBusMessage *reply;
-
-	syslog(LOG_DEBUG, "SetConfiguration: %s",
-	       dbus_message_get_path(message));
-
-	endpoint_path = dbus_message_get_path(message);
-	endpoint = cras_bt_endpoint_get(endpoint_path);
-	if (!endpoint)
-		return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-
-	if (!dbus_message_has_signature(message, "oa{sv}")) {
-		syslog(LOG_WARNING, "Bad SetConfiguration message received.");
-		return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-	}
-
-	dbus_message_iter_init(message, &message_iter);
-
-	dbus_message_iter_get_basic(&message_iter, &transport_path);
-	dbus_message_iter_next(&message_iter);
-
-	dbus_message_iter_recurse(&message_iter, &properties_array_iter);
-
-	transport = cras_bt_transport_get(transport_path);
-	if (transport) {
-		cras_bt_transport_update_properties(
-			transport, &properties_array_iter, NULL);
-	} else {
-		transport = cras_bt_transport_create(conn, transport_path);
-		if (transport) {
-			cras_bt_transport_update_properties(
-				transport, &properties_array_iter, NULL);
-			syslog(LOG_INFO, "Bluetooth Transport: %s added",
-			       cras_bt_transport_object_path(transport));
-		}
-	}
-
-	if (!cras_bt_transport_device(transport)) {
-		syslog(LOG_ERR, "Do device found for transport %s",
-		       cras_bt_transport_object_path(transport));
-		return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-	}
-
-	cras_bt_transport_set_endpoint(transport, endpoint);
-	endpoint->transport = transport;
-	endpoint->set_configuration(endpoint, transport);
-
-	reply = dbus_message_new_method_return(message);
-	if (!reply)
-		return DBUS_HANDLER_RESULT_NEED_MEMORY;
-	if (!dbus_connection_send(conn, reply, NULL))
-		return DBUS_HANDLER_RESULT_NEED_MEMORY;
-
-	dbus_message_unref(reply);
-	return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult
-cras_bt_endpoint_select_configuration(DBusConnection *conn,
-				      DBusMessage *message, void *arg)
-{
-	DBusError dbus_error;
-	const char *endpoint_path;
-	struct cras_bt_endpoint *endpoint;
-	char buf[4];
-	void *capabilities, *configuration = buf;
-	int len;
-	DBusMessage *reply;
-
-	syslog(LOG_DEBUG, "SelectConfiguration: %s",
-	       dbus_message_get_path(message));
-
-	endpoint_path = dbus_message_get_path(message);
-	endpoint = cras_bt_endpoint_get(endpoint_path);
-	if (!endpoint)
-		return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-
-	dbus_error_init(&dbus_error);
-
-	if (!dbus_message_get_args(message, &dbus_error, DBUS_TYPE_ARRAY,
-				   DBUS_TYPE_BYTE, &capabilities, &len,
-				   DBUS_TYPE_INVALID)) {
-		syslog(LOG_WARNING, "Bad SelectConfiguration method call: %s",
-		       dbus_error.message);
-		dbus_error_free(&dbus_error);
-		return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-	}
-
-	if (len > sizeof(configuration) ||
-	    endpoint->select_configuration(endpoint, capabilities, len,
-					   configuration) < 0) {
-		reply = dbus_message_new_error(
-			message,
-			"org.chromium.Cras.Error.UnsupportedConfiguration",
-			"Unable to select configuration from capabilities");
-
-		if (!dbus_connection_send(conn, reply, NULL))
-			return DBUS_HANDLER_RESULT_NEED_MEMORY;
-
-		dbus_message_unref(reply);
-		return DBUS_HANDLER_RESULT_HANDLED;
-	}
-
-	reply = dbus_message_new_method_return(message);
-	if (!reply)
-		return DBUS_HANDLER_RESULT_NEED_MEMORY;
-	if (!dbus_message_append_args(reply, DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE,
-				      &configuration, len, DBUS_TYPE_INVALID))
-		return DBUS_HANDLER_RESULT_NEED_MEMORY;
-	if (!dbus_connection_send(conn, reply, NULL))
-		return DBUS_HANDLER_RESULT_NEED_MEMORY;
-
-	dbus_message_unref(reply);
-	return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult
-cras_bt_endpoint_clear_configuration(DBusConnection *conn, DBusMessage *message,
-				     void *arg)
-{
-	DBusError dbus_error;
-	const char *endpoint_path, *transport_path;
-	struct cras_bt_endpoint *endpoint;
-	struct cras_bt_transport *transport;
-	DBusMessage *reply;
-
-	syslog(LOG_DEBUG, "ClearConfiguration: %s",
-	       dbus_message_get_path(message));
-
-	endpoint_path = dbus_message_get_path(message);
-	endpoint = cras_bt_endpoint_get(endpoint_path);
-	if (!endpoint)
-		return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-
-	dbus_error_init(&dbus_error);
-
-	if (!dbus_message_get_args(message, &dbus_error, DBUS_TYPE_OBJECT_PATH,
-				   &transport_path, DBUS_TYPE_INVALID)) {
-		syslog(LOG_WARNING, "Bad ClearConfiguration method call: %s",
-		       dbus_error.message);
-		dbus_error_free(&dbus_error);
-		return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-	}
-
-	transport = cras_bt_transport_get(transport_path);
-
-	if (transport == endpoint->transport)
-		cras_bt_endpoint_suspend(endpoint);
-
-	reply = dbus_message_new_method_return(message);
-	if (!reply)
-		return DBUS_HANDLER_RESULT_NEED_MEMORY;
-	if (!dbus_connection_send(conn, reply, NULL))
-		return DBUS_HANDLER_RESULT_NEED_MEMORY;
-
-	dbus_message_unref(reply);
-	return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult
-cras_bt_endpoint_release(DBusConnection *conn, DBusMessage *message, void *arg)
-{
-	const char *endpoint_path;
-	struct cras_bt_endpoint *endpoint;
-	DBusMessage *reply;
-
-	syslog(LOG_DEBUG, "Release: %s", dbus_message_get_path(message));
-
-	endpoint_path = dbus_message_get_path(message);
-	endpoint = cras_bt_endpoint_get(endpoint_path);
-	if (!endpoint)
-		return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-
-	cras_bt_endpoint_suspend(endpoint);
-
-	reply = dbus_message_new_method_return(message);
-	if (!reply)
-		return DBUS_HANDLER_RESULT_NEED_MEMORY;
-	if (!dbus_connection_send(conn, reply, NULL))
-		return DBUS_HANDLER_RESULT_NEED_MEMORY;
-
-	dbus_message_unref(reply);
-	return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult cras_bt_handle_endpoint_message(DBusConnection *conn,
-							 DBusMessage *message,
-							 void *arg)
-{
-	syslog(LOG_DEBUG, "Endpoint message: %s %s %s",
-	       dbus_message_get_path(message),
-	       dbus_message_get_interface(message),
-	       dbus_message_get_member(message));
-
-	if (dbus_message_is_method_call(message, DBUS_INTERFACE_INTROSPECTABLE,
-					"Introspect")) {
-		DBusMessage *reply;
-		const char *xml = ENDPOINT_INTROSPECT_XML;
-
-		reply = dbus_message_new_method_return(message);
-		if (!reply)
-			return DBUS_HANDLER_RESULT_NEED_MEMORY;
-		if (!dbus_message_append_args(reply, DBUS_TYPE_STRING, &xml,
-					      DBUS_TYPE_INVALID))
-			return DBUS_HANDLER_RESULT_NEED_MEMORY;
-		if (!dbus_connection_send(conn, reply, NULL))
-			return DBUS_HANDLER_RESULT_NEED_MEMORY;
-
-		dbus_message_unref(reply);
-		return DBUS_HANDLER_RESULT_HANDLED;
-
-	} else if (dbus_message_is_method_call(message,
-					       BLUEZ_INTERFACE_MEDIA_ENDPOINT,
-					       "SetConfiguration")) {
-		return cras_bt_endpoint_set_configuration(conn, message, arg);
-
-	} else if (dbus_message_is_method_call(message,
-					       BLUEZ_INTERFACE_MEDIA_ENDPOINT,
-					       "SelectConfiguration")) {
-		return cras_bt_endpoint_select_configuration(conn, message,
-							     arg);
-
-	} else if (dbus_message_is_method_call(message,
-					       BLUEZ_INTERFACE_MEDIA_ENDPOINT,
-					       "ClearConfiguration")) {
-		return cras_bt_endpoint_clear_configuration(conn, message, arg);
-
-	} else if (dbus_message_is_method_call(message,
-					       BLUEZ_INTERFACE_MEDIA_ENDPOINT,
-					       "Release")) {
-		return cras_bt_endpoint_release(conn, message, arg);
-
-	} else {
-		syslog(LOG_DEBUG, "%s: %s.%s: Unknown MediaEndpoint message",
-		       dbus_message_get_path(message),
-		       dbus_message_get_interface(message),
-		       dbus_message_get_member(message));
-		return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-	}
-}
-
-static void cras_bt_on_register_endpoint(DBusPendingCall *pending_call,
-					 void *data)
-{
-	DBusMessage *reply;
-
-	reply = dbus_pending_call_steal_reply(pending_call);
-	dbus_pending_call_unref(pending_call);
-
-	if (dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR) {
-		syslog(LOG_WARNING, "RegisterEndpoint returned error: %s",
-		       dbus_message_get_error_name(reply));
-		dbus_message_unref(reply);
-		return;
-	}
-
-	dbus_message_unref(reply);
-}
-
-int cras_bt_register_endpoint(DBusConnection *conn,
-			      const struct cras_bt_adapter *adapter,
-			      struct cras_bt_endpoint *endpoint)
-{
-	const char *adapter_path, *key;
-	DBusMessage *method_call;
-	DBusMessageIter message_iter;
-	DBusMessageIter properties_array_iter, properties_dict_iter;
-	DBusMessageIter variant_iter, bytes_iter;
-	DBusPendingCall *pending_call;
-	char buf[4];
-	void *capabilities = buf;
-	int len = sizeof(buf);
-	int error;
-
-	error = endpoint->get_capabilities(endpoint, capabilities, &len);
-	if (error < 0)
-		return error;
-
-	adapter_path = cras_bt_adapter_object_path(adapter);
-
-	method_call = dbus_message_new_method_call(BLUEZ_SERVICE, adapter_path,
-						   BLUEZ_INTERFACE_MEDIA,
-						   "RegisterEndpoint");
-	if (!method_call)
-		return -ENOMEM;
-
-	dbus_message_iter_init_append(method_call, &message_iter);
-	dbus_message_iter_append_basic(&message_iter, DBUS_TYPE_OBJECT_PATH,
-				       &endpoint->object_path);
-
-	dbus_message_iter_open_container(
-		&message_iter, DBUS_TYPE_ARRAY,
-		DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING DBUS_TYPE_STRING_AS_STRING
-			DBUS_TYPE_VARIANT_AS_STRING
-				DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
-		&properties_array_iter);
-
-	key = "UUID";
-	dbus_message_iter_open_container(&properties_array_iter,
-					 DBUS_TYPE_DICT_ENTRY, NULL,
-					 &properties_dict_iter);
-	dbus_message_iter_append_basic(&properties_dict_iter, DBUS_TYPE_STRING,
-				       &key);
-	dbus_message_iter_open_container(&properties_dict_iter,
-					 DBUS_TYPE_VARIANT,
-					 DBUS_TYPE_STRING_AS_STRING,
-					 &variant_iter);
-	dbus_message_iter_append_basic(&variant_iter, DBUS_TYPE_STRING,
-				       &endpoint->uuid);
-	dbus_message_iter_close_container(&properties_dict_iter, &variant_iter);
-	dbus_message_iter_close_container(&properties_array_iter,
-					  &properties_dict_iter);
-
-	key = "Codec";
-	dbus_message_iter_open_container(&properties_array_iter,
-					 DBUS_TYPE_DICT_ENTRY, NULL,
-					 &properties_dict_iter);
-	dbus_message_iter_append_basic(&properties_dict_iter, DBUS_TYPE_STRING,
-				       &key);
-	dbus_message_iter_open_container(&properties_dict_iter,
-					 DBUS_TYPE_VARIANT,
-					 DBUS_TYPE_BYTE_AS_STRING,
-					 &variant_iter);
-	dbus_message_iter_append_basic(&variant_iter, DBUS_TYPE_BYTE,
-				       &endpoint->codec);
-	dbus_message_iter_close_container(&properties_dict_iter, &variant_iter);
-	dbus_message_iter_close_container(&properties_array_iter,
-					  &properties_dict_iter);
-
-	key = "Capabilities";
-	dbus_message_iter_open_container(&properties_array_iter,
-					 DBUS_TYPE_DICT_ENTRY, NULL,
-					 &properties_dict_iter);
-	dbus_message_iter_append_basic(&properties_dict_iter, DBUS_TYPE_STRING,
-				       &key);
-	dbus_message_iter_open_container(
-		&properties_dict_iter, DBUS_TYPE_VARIANT,
-		DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_BYTE_AS_STRING,
-		&variant_iter);
-	dbus_message_iter_open_container(&variant_iter, DBUS_TYPE_ARRAY,
-					 DBUS_TYPE_BYTE_AS_STRING, &bytes_iter);
-	dbus_message_iter_append_fixed_array(&bytes_iter, DBUS_TYPE_BYTE,
-					     &capabilities, len);
-	dbus_message_iter_close_container(&variant_iter, &bytes_iter);
-	dbus_message_iter_close_container(&properties_dict_iter, &variant_iter);
-	dbus_message_iter_close_container(&properties_array_iter,
-					  &properties_dict_iter);
-
-	dbus_message_iter_close_container(&message_iter,
-					  &properties_array_iter);
-
-	if (!dbus_connection_send_with_reply(conn, method_call, &pending_call,
-					     DBUS_TIMEOUT_USE_DEFAULT)) {
-		dbus_message_unref(method_call);
-		return -ENOMEM;
-	}
-
-	dbus_message_unref(method_call);
-	if (!pending_call)
-		return -EIO;
-
-	if (!dbus_pending_call_set_notify(
-		    pending_call, cras_bt_on_register_endpoint, NULL, NULL)) {
-		dbus_pending_call_cancel(pending_call);
-		dbus_pending_call_unref(pending_call);
-		return -ENOMEM;
-	}
-
-	return 0;
-}
-
-static void cras_bt_on_unregister_endpoint(DBusPendingCall *pending_call,
-					   void *data)
-{
-	DBusMessage *reply;
-
-	reply = dbus_pending_call_steal_reply(pending_call);
-	dbus_pending_call_unref(pending_call);
-
-	if (dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR) {
-		syslog(LOG_WARNING, "UnregisterEndpoint returned error: %s",
-		       dbus_message_get_error_name(reply));
-		dbus_message_unref(reply);
-		return;
-	}
-
-	dbus_message_unref(reply);
-}
-
-int cras_bt_unregister_endpoint(DBusConnection *conn,
-				const struct cras_bt_adapter *adapter,
-				struct cras_bt_endpoint *endpoint)
-{
-	const char *adapter_path;
-	DBusMessage *method_call;
-	DBusPendingCall *pending_call;
-
-	adapter_path = cras_bt_adapter_object_path(adapter);
-
-	method_call = dbus_message_new_method_call(BLUEZ_SERVICE, adapter_path,
-						   BLUEZ_INTERFACE_MEDIA,
-						   "UnregisterEndpoint");
-	if (!method_call)
-		return -ENOMEM;
-
-	if (!dbus_message_append_args(method_call, DBUS_TYPE_OBJECT_PATH,
-				      &endpoint->object_path,
-				      DBUS_TYPE_INVALID))
-		return -ENOMEM;
-
-	if (!dbus_connection_send_with_reply(conn, method_call, &pending_call,
-					     DBUS_TIMEOUT_USE_DEFAULT)) {
-		dbus_message_unref(method_call);
-		return -ENOMEM;
-	}
-
-	dbus_message_unref(method_call);
-	if (!pending_call)
-		return -EIO;
-
-	if (!dbus_pending_call_set_notify(
-		    pending_call, cras_bt_on_unregister_endpoint, NULL, NULL)) {
-		dbus_pending_call_cancel(pending_call);
-		dbus_pending_call_unref(pending_call);
-		return -ENOMEM;
-	}
-
-	return 0;
-}
-
-/* Available endpoints */
-static struct cras_bt_endpoint *endpoints;
-
-int cras_bt_register_endpoints(DBusConnection *conn,
-			       const struct cras_bt_adapter *adapter)
-{
-	struct cras_bt_endpoint *endpoint;
-
-	DL_FOREACH (endpoints, endpoint)
-		cras_bt_register_endpoint(conn, adapter, endpoint);
-
-	return 0;
-}
-
-int cras_bt_endpoint_add(DBusConnection *conn,
-			 struct cras_bt_endpoint *endpoint)
-{
-	static const DBusObjectPathVTable endpoint_vtable = {
-		.message_function = cras_bt_handle_endpoint_message
-	};
-
-	DBusError dbus_error;
-	struct cras_bt_adapter **adapters;
-	size_t num_adapters, i;
-
-	DL_APPEND(endpoints, endpoint);
-
-	dbus_error_init(&dbus_error);
-
-	if (!dbus_connection_register_object_path(conn, endpoint->object_path,
-						  &endpoint_vtable,
-						  &dbus_error)) {
-		syslog(LOG_WARNING,
-		       "Couldn't register Bluetooth endpoint: %s: %s",
-		       endpoint->object_path, dbus_error.message);
-		dbus_error_free(&dbus_error);
-		return -ENOMEM;
-	}
-
-	num_adapters = cras_bt_adapter_get_list(&adapters);
-	for (i = 0; i < num_adapters; ++i)
-		cras_bt_register_endpoint(conn, adapters[i], endpoint);
-	free(adapters);
-
-	return 0;
-}
-
-void cras_bt_endpoint_rm(DBusConnection *conn,
-			 struct cras_bt_endpoint *endpoint)
-{
-	struct cras_bt_adapter **adapters;
-	size_t num_adapters, i;
-
-	num_adapters = cras_bt_adapter_get_list(&adapters);
-	for (i = 0; i < num_adapters; ++i)
-		cras_bt_unregister_endpoint(conn, adapters[i], endpoint);
-	free(adapters);
-
-	dbus_connection_unregister_object_path(conn, endpoint->object_path);
-
-	DL_DELETE(endpoints, endpoint);
-}
-
-void cras_bt_endpoint_reset()
-{
-	struct cras_bt_endpoint *endpoint;
-
-	DL_FOREACH (endpoints, endpoint)
-		cras_bt_endpoint_suspend(endpoint);
-}
-
-struct cras_bt_endpoint *cras_bt_endpoint_get(const char *object_path)
-{
-	struct cras_bt_endpoint *endpoint;
-
-	DL_FOREACH (endpoints, endpoint) {
-		if (strcmp(endpoint->object_path, object_path) == 0)
-			return endpoint;
-	}
-
-	return NULL;
-}
diff --git a/cras/src/server/cras_bt_endpoint.h b/cras/src/server/cras_bt_endpoint.h
deleted file mode 100644
index 963071c..0000000
--- a/cras/src/server/cras_bt_endpoint.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_BT_ENDPOINT_H_
-#define CRAS_BT_ENDPOINT_H_
-
-#include <dbus/dbus.h>
-#include <stdint.h>
-
-#include "cras_bt_adapter.h"
-
-struct cras_bt_transport;
-
-struct cras_bt_endpoint {
-	const char *object_path;
-	const char *uuid;
-	uint8_t codec;
-
-	int (*get_capabilities)(struct cras_bt_endpoint *endpoint,
-				void *capabilities, int *len);
-	int (*select_configuration)(struct cras_bt_endpoint *endpoint,
-				    void *capabilities, int len,
-				    void *configuration);
-
-	void (*set_configuration)(struct cras_bt_endpoint *endpoint,
-				  struct cras_bt_transport *transport);
-	void (*suspend)(struct cras_bt_endpoint *endpoint,
-			struct cras_bt_transport *transport);
-
-	void (*transport_state_changed)(struct cras_bt_endpoint *endpoint,
-					struct cras_bt_transport *transport);
-
-	struct cras_bt_transport *transport;
-	struct cras_bt_endpoint *prev, *next;
-};
-
-int cras_bt_register_endpoint(DBusConnection *conn,
-			      const struct cras_bt_adapter *adapter,
-			      struct cras_bt_endpoint *endpoint);
-
-int cras_bt_unregister_endpoint(DBusConnection *conn,
-				const struct cras_bt_adapter *adapter,
-				struct cras_bt_endpoint *endpoint);
-
-int cras_bt_register_endpoints(DBusConnection *conn,
-			       const struct cras_bt_adapter *adapter);
-
-int cras_bt_endpoint_add(DBusConnection *conn,
-			 struct cras_bt_endpoint *endpoint);
-void cras_bt_endpoint_rm(DBusConnection *conn,
-			 struct cras_bt_endpoint *endpoint);
-
-void cras_bt_endpoint_reset();
-
-struct cras_bt_endpoint *cras_bt_endpoint_get(const char *object_path);
-
-#endif /* CRAS_BT_ENDPOINT_H_ */
diff --git a/cras/src/server/cras_bt_io.c b/cras/src/server/cras_bt_io.c
deleted file mode 100644
index acdca80..0000000
--- a/cras/src/server/cras_bt_io.c
+++ /dev/null
@@ -1,721 +0,0 @@
-/* Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <sys/time.h>
-#include <syslog.h>
-
-#include "cras_bt_io.h"
-#include "cras_bt_device.h"
-#include "cras_hfp_iodev.h"
-#include "cras_utf8.h"
-#include "cras_iodev.h"
-#include "cras_iodev_list.h"
-#include "sfh.h"
-#include "utlist.h"
-
-#define DEFAULT_BT_DEVICE_NAME "BLUETOOTH"
-
-/* Extends cras_ionode to hold bluetooth profile information
- * so that iodevs of different profile(A2DP or HFP/HSP) can be
- * associated with the same bt_io.
- * Members:
- *    base - The base class cras_ionode.
- *    profile_dev - Pointer to the profile specific iodev.
- *    profile - The bluetooth profile profile_dev runs on.
- */
-struct bt_node {
-	struct cras_ionode base;
-	struct cras_iodev *profile_dev;
-	unsigned int profile;
-};
-
-/* The structure represents a virtual input or output device of a
- * bluetooth audio device, speaker or headset for example. A node
- * will be added to this virtual iodev for each profile supported
- * by the bluetooth audio device.
- * Member:
- *    base - The base class cras_iodev
- *    next_node_id - The index will give to the next node
- */
-struct bt_io {
-	struct cras_iodev base;
-	unsigned int next_node_id;
-	struct cras_bt_device *device;
-};
-
-/* Returns the active profile specific iodev. */
-static struct cras_iodev *active_profile_dev(const struct cras_iodev *iodev)
-{
-	struct bt_node *active = (struct bt_node *)iodev->active_node;
-
-	return active->profile_dev;
-}
-
-/* Adds a profile specific iodev to btio. */
-static struct cras_ionode *add_profile_dev(struct cras_iodev *bt_iodev,
-					   struct cras_iodev *dev,
-					   enum cras_bt_device_profile profile)
-{
-	struct bt_node *n;
-	struct bt_io *btio = (struct bt_io *)bt_iodev;
-
-	n = (struct bt_node *)calloc(1, sizeof(*n));
-	if (!n)
-		return NULL;
-
-	n->base.dev = bt_iodev;
-	n->base.idx = btio->next_node_id++;
-	n->base.type = CRAS_NODE_TYPE_BLUETOOTH;
-	n->base.volume = 100;
-	n->base.stable_id = dev->info.stable_id;
-	n->base.capture_gain = 0;
-	gettimeofday(&n->base.plugged_time, NULL);
-
-	strcpy(n->base.name, dev->info.name);
-	n->profile_dev = dev;
-	n->profile = profile;
-
-	cras_iodev_add_node(bt_iodev, &n->base);
-	return &n->base;
-}
-
-/* Forces bt device to switch to use the given profile. Note that if
- * it has already been open for streaming, the new active profile will
- * take effect after the related btio(s) are reopened.
- */
-static void bt_switch_to_profile(struct cras_bt_device *device,
-				 enum cras_bt_device_profile profile)
-{
-	switch (profile) {
-	case CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY:
-	case CRAS_BT_DEVICE_PROFILE_HSP_AUDIOGATEWAY:
-		cras_bt_device_set_active_profile(
-			device,
-			CRAS_BT_DEVICE_PROFILE_HSP_AUDIOGATEWAY |
-				CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY);
-		break;
-	case CRAS_BT_DEVICE_PROFILE_A2DP_SOURCE:
-		cras_bt_device_set_active_profile(
-			device, CRAS_BT_DEVICE_PROFILE_A2DP_SOURCE);
-		break;
-	default:
-		syslog(LOG_ERR, "Unexpect profile %u", profile);
-		break;
-	}
-}
-
-/* Switches the active profile to A2DP if it can. */
-static void bt_possibly_switch_to_a2dp(struct bt_io *btio)
-{
-	if (!cras_bt_device_has_a2dp(btio->device))
-		return;
-	cras_bt_device_set_active_profile(btio->device,
-					  CRAS_BT_DEVICE_PROFILE_A2DP_SOURCE);
-	cras_bt_device_switch_profile(btio->device, &btio->base);
-}
-
-/* Checks if bt device is active for the given profile.
- */
-static int device_using_profile(struct cras_bt_device *device,
-				unsigned int profile)
-{
-	return cras_bt_device_get_active_profile(device) & profile;
-}
-
-/* Checks if the condition is met to switch to a different profile based
- * on two rules:
- * (1) Prefer to use A2DP for output since the audio quality is better.
- * (2) Must use HFP/HSP for input since A2DP doesn't support audio input.
- *
- * If the profile switch happens, return non-zero error code, otherwise
- * return zero.
- */
-static int open_dev(struct cras_iodev *iodev)
-{
-	struct bt_io *btio = (struct bt_io *)iodev;
-	struct cras_iodev *dev = active_profile_dev(iodev);
-	int rc;
-
-	/* Force to use HFP if opening input dev. */
-	if (device_using_profile(btio->device,
-				 CRAS_BT_DEVICE_PROFILE_A2DP_SOURCE) &&
-	    iodev->direction == CRAS_STREAM_INPUT) {
-		bt_switch_to_profile(btio->device,
-				     CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY);
-		cras_bt_device_switch_profile_enable_dev(btio->device, iodev);
-		return -EAGAIN;
-	}
-
-	if (dev && dev->open_dev) {
-		rc = dev->open_dev(dev);
-		if (rc == 0)
-			return 0;
-
-		/* If input iodev open fails, switch profile back to A2DP. */
-		if (iodev->direction == CRAS_STREAM_INPUT)
-			bt_possibly_switch_to_a2dp(btio);
-		return rc;
-	}
-
-	return 0;
-}
-
-static int update_supported_formats(struct cras_iodev *iodev)
-{
-	struct cras_iodev *dev = active_profile_dev(iodev);
-	int rc, length, i;
-
-	if (!dev)
-		return -EINVAL;
-
-	if (dev->update_supported_formats) {
-		rc = dev->update_supported_formats(dev);
-		if (rc)
-			return rc;
-	}
-
-	/* Fill in the supported rates and channel counts. */
-	for (length = 0; dev->supported_rates[length]; length++)
-		;
-	free(iodev->supported_rates);
-	iodev->supported_rates = (size_t *)malloc(
-		(length + 1) * sizeof(*iodev->supported_rates));
-	for (i = 0; i < length + 1; i++)
-		iodev->supported_rates[i] = dev->supported_rates[i];
-
-	for (length = 0; dev->supported_channel_counts[length]; length++)
-		;
-	iodev->supported_channel_counts = (size_t *)malloc(
-		(length + 1) * sizeof(*iodev->supported_channel_counts));
-	for (i = 0; i < length + 1; i++)
-		iodev->supported_channel_counts[i] =
-			dev->supported_channel_counts[i];
-
-	for (length = 0; dev->supported_formats[length]; length++)
-		;
-
-	iodev->supported_formats = (snd_pcm_format_t *)malloc(
-		(length + 1) * sizeof(*iodev->supported_formats));
-	for (i = 0; i < length + 1; i++)
-		iodev->supported_formats[i] = dev->supported_formats[i];
-
-	/* Record max supported channels into cras_iodev_info. */
-	iodev->info.max_supported_channels = dev->info.max_supported_channels;
-	return 0;
-}
-
-static int configure_dev(struct cras_iodev *iodev)
-{
-	int rc;
-	struct cras_iodev *dev = active_profile_dev(iodev);
-	if (!dev)
-		return -EINVAL;
-
-	/* Fill back the format iodev is using. */
-	if (dev->format == NULL) {
-		dev->format = (struct cras_audio_format *)malloc(
-			sizeof(*dev->format));
-		if (!dev->format)
-			return -ENOMEM;
-		*dev->format = *iodev->format;
-	}
-
-	rc = dev->configure_dev(dev);
-	if (rc)
-		return rc;
-
-	iodev->buffer_size = dev->buffer_size;
-	iodev->min_buffer_level = dev->min_buffer_level;
-	if (dev->start)
-		dev->state = CRAS_IODEV_STATE_OPEN;
-	else
-		dev->state = CRAS_IODEV_STATE_NO_STREAM_RUN;
-
-	return 0;
-}
-
-static int close_dev(struct cras_iodev *iodev)
-{
-	struct bt_io *btio = (struct bt_io *)iodev;
-	int rc;
-	struct cras_iodev *dev = active_profile_dev(iodev);
-	if (!dev)
-		return -EINVAL;
-
-	/* If input iodev is in open state and being closed, switch profile
-	 * from HFP to A2DP. */
-	if (cras_iodev_is_open(iodev) &&
-	    device_using_profile(
-		    btio->device,
-		    CRAS_BT_DEVICE_PROFILE_HSP_AUDIOGATEWAY |
-			    CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY) &&
-	    (iodev->direction == CRAS_STREAM_INPUT))
-		bt_possibly_switch_to_a2dp(btio);
-
-	rc = dev->close_dev(dev);
-	if (rc < 0)
-		return rc;
-	cras_iodev_free_format(iodev);
-	dev->state = CRAS_IODEV_STATE_CLOSE;
-	return 0;
-}
-
-static void set_bt_volume(struct cras_iodev *iodev)
-{
-	struct cras_iodev *dev = active_profile_dev(iodev);
-	if (!dev)
-		return;
-
-	if (dev->active_node)
-		dev->active_node->volume = iodev->active_node->volume;
-
-	/* The parent bt_iodev could set software_volume_needed flag for cases
-	 * that software volume provides better experience across profiles
-	 * (HFP and A2DP). Otherwise, use the profile specific implementation
-	 * to adjust volume. */
-	if (dev->set_volume && !iodev->software_volume_needed)
-		dev->set_volume(dev);
-}
-
-static int frames_queued(const struct cras_iodev *iodev,
-			 struct timespec *tstamp)
-{
-	struct cras_iodev *dev = active_profile_dev(iodev);
-	if (!dev)
-		return -EINVAL;
-	return dev->frames_queued(dev, tstamp);
-}
-
-static int delay_frames(const struct cras_iodev *iodev)
-{
-	struct cras_iodev *dev = active_profile_dev(iodev);
-	if (!dev)
-		return -EINVAL;
-	return dev->delay_frames(dev);
-}
-
-static int get_buffer(struct cras_iodev *iodev, struct cras_audio_area **area,
-		      unsigned *frames)
-{
-	struct cras_iodev *dev = active_profile_dev(iodev);
-	if (!dev)
-		return -EINVAL;
-	return dev->get_buffer(dev, area, frames);
-}
-
-static int put_buffer(struct cras_iodev *iodev, unsigned nwritten)
-{
-	struct cras_iodev *dev = active_profile_dev(iodev);
-	if (!dev)
-		return -EINVAL;
-	return dev->put_buffer(dev, nwritten);
-}
-
-static int flush_buffer(struct cras_iodev *iodev)
-{
-	struct cras_iodev *dev = active_profile_dev(iodev);
-	if (!dev)
-		return -EINVAL;
-	return dev->flush_buffer(dev);
-}
-
-/* If the first private iodev doesn't match the active profile stored on
- * device, select to the correct private iodev.
- */
-static void update_active_node(struct cras_iodev *iodev, unsigned node_idx,
-			       unsigned dev_enabled)
-{
-	struct bt_io *btio = (struct bt_io *)iodev;
-	struct cras_ionode *node;
-	struct bt_node *active = (struct bt_node *)iodev->active_node;
-	struct cras_iodev *dev;
-	int rc;
-
-	if (device_using_profile(btio->device, active->profile))
-		goto leave;
-
-	/* Switch to the correct dev using active_profile. */
-	DL_FOREACH (iodev->nodes, node) {
-		struct bt_node *n = (struct bt_node *)node;
-		if (n == active)
-			continue;
-
-		if (device_using_profile(btio->device, n->profile)) {
-			active->profile = n->profile;
-			active->profile_dev = n->profile_dev;
-
-			/* Set volume for the new profile. */
-			set_bt_volume(iodev);
-		}
-	}
-
-leave:
-	dev = active_profile_dev(iodev);
-	if (dev && dev->update_active_node)
-		dev->update_active_node(dev, node_idx, dev_enabled);
-
-	/* Update supported formats here to get the supported formats from the
-	 * new updated active profile dev.
-	 */
-	rc = update_supported_formats(iodev);
-	if (rc) {
-		syslog(LOG_ERR, "Failed to update supported formats, rc=%d",
-		       rc);
-	}
-}
-
-static int output_underrun(struct cras_iodev *iodev)
-{
-	struct cras_iodev *dev = active_profile_dev(iodev);
-	if (!dev)
-		return -EINVAL;
-
-	if (dev->output_underrun) {
-		dev->min_cb_level = iodev->min_cb_level;
-		dev->max_cb_level = iodev->max_cb_level;
-		dev->buffer_size = iodev->buffer_size;
-		return dev->output_underrun(dev);
-	}
-
-	return 0;
-}
-
-static int no_stream(struct cras_iodev *iodev, int enable)
-{
-	struct cras_iodev *dev = active_profile_dev(iodev);
-	int rc;
-
-	if (!dev)
-		return -EINVAL;
-
-	if (dev->no_stream) {
-		/*
-		 * Copy iodev->min_cb_level and iodev->max_cb_level from the
-		 * parent (i.e. bt_io).  no_stream() of hfp_alsa_iodev will
-		 * use them.
-		 * A2DP and HFP dev will use buffer and callback sizes to fill
-		 * zeros in no stream state.
-		 */
-		dev->min_cb_level = iodev->min_cb_level;
-		dev->max_cb_level = iodev->max_cb_level;
-		dev->buffer_size = iodev->buffer_size;
-		rc = dev->no_stream(dev, enable);
-		if (rc < 0)
-			return rc;
-	}
-	if (enable)
-		dev->state = CRAS_IODEV_STATE_NO_STREAM_RUN;
-	else
-		dev->state = CRAS_IODEV_STATE_NORMAL_RUN;
-
-	return 0;
-}
-
-static int is_free_running(const struct cras_iodev *iodev)
-{
-	struct cras_iodev *dev = active_profile_dev(iodev);
-	if (!dev)
-		return -EINVAL;
-
-	if (dev->is_free_running)
-		return dev->is_free_running(dev);
-
-	return 0;
-}
-
-static int start(const struct cras_iodev *iodev)
-{
-	struct cras_iodev *dev = active_profile_dev(iodev);
-	int rc;
-
-	if (!dev)
-		return -EINVAL;
-
-	if (dev->start) {
-		rc = dev->start(dev);
-		if (rc)
-			return rc;
-	}
-	dev->state = CRAS_IODEV_STATE_NORMAL_RUN;
-	return 0;
-}
-
-static unsigned int frames_to_play_in_sleep(struct cras_iodev *iodev,
-					    unsigned int *hw_level,
-					    struct timespec *hw_tstamp)
-{
-	struct cras_iodev *dev = active_profile_dev(iodev);
-	if (!dev || !dev->frames_to_play_in_sleep)
-		return cras_iodev_default_frames_to_play_in_sleep(
-			iodev, hw_level, hw_tstamp);
-
-	return dev->frames_to_play_in_sleep(dev, hw_level, hw_tstamp);
-}
-
-static int get_valid_frames(struct cras_iodev *iodev,
-			    struct timespec *hw_tstamp)
-{
-	struct cras_iodev *dev = active_profile_dev(iodev);
-	if (!dev)
-		return -EINVAL;
-
-	if (dev->get_valid_frames)
-		return dev->get_valid_frames(dev, hw_tstamp);
-
-	return cras_iodev_frames_queued(iodev, hw_tstamp);
-}
-
-struct cras_iodev *cras_bt_io_create(struct cras_bt_device *device,
-				     struct cras_iodev *dev,
-				     enum cras_bt_device_profile profile)
-{
-	int err;
-	struct bt_io *btio;
-	struct cras_iodev *iodev;
-	struct cras_ionode *node;
-	struct bt_node *active;
-
-	if (!dev)
-		return NULL;
-
-	btio = (struct bt_io *)calloc(1, sizeof(*btio));
-	if (!btio)
-		goto error;
-	btio->device = device;
-
-	iodev = &btio->base;
-	iodev->direction = dev->direction;
-	strcpy(iodev->info.name, dev->info.name);
-	iodev->info.stable_id = dev->info.stable_id;
-
-	iodev->open_dev = open_dev;
-	iodev->configure_dev = configure_dev;
-	iodev->frames_queued = frames_queued;
-	iodev->delay_frames = delay_frames;
-	iodev->get_buffer = get_buffer;
-	iodev->put_buffer = put_buffer;
-	iodev->flush_buffer = flush_buffer;
-	iodev->close_dev = close_dev;
-	iodev->update_supported_formats = update_supported_formats;
-	iodev->update_active_node = update_active_node;
-	iodev->no_stream = no_stream;
-	iodev->output_underrun = output_underrun;
-	iodev->is_free_running = is_free_running;
-	iodev->get_valid_frames = get_valid_frames;
-	iodev->start = start;
-	iodev->frames_to_play_in_sleep = frames_to_play_in_sleep;
-
-	/* Input also checks |software_volume_needed| flag for using software
-	 * gain. Keep it as false for BT input.
-	 * TODO(hychao): after wide band speech mode is supported, consider
-	 * enable software gain.
-	 */
-	if (dev->direction == CRAS_STREAM_OUTPUT) {
-		iodev->software_volume_needed =
-			!cras_bt_device_get_use_hardware_volume(device);
-		iodev->set_volume = set_bt_volume;
-	}
-
-	/* Create the fake node so it's the only node exposed to UI, and
-	 * point it to the first profile dev. */
-	active = (struct bt_node *)calloc(1, sizeof(*active));
-	if (!active)
-		goto error;
-	active->base.dev = iodev;
-	active->base.idx = btio->next_node_id++;
-	active->base.type = dev->active_node->type;
-	active->base.volume = 100;
-	active->base.stable_id = cras_bt_device_get_stable_id(device);
-	active->base.ui_gain_scaler = 1.0f;
-	/*
-	 * If the same headset is connected in wideband mode, we shall assign
-	 * a separate stable_id so the node priority/preference mechanism in
-	 * Chrome UI doesn't break.
-	 */
-	if ((active->base.type == CRAS_NODE_TYPE_BLUETOOTH) &&
-	    (dev->direction == CRAS_STREAM_INPUT))
-		active->base.stable_id =
-			SuperFastHash((const char *)&active->base.type,
-				      sizeof(active->base.type),
-				      active->base.stable_id);
-	active->profile = profile;
-	active->profile_dev = dev;
-	strcpy(active->base.name, dev->info.name);
-	/* The node name exposed to UI should be a valid UTF8 string. */
-	if (!is_utf8_string(active->base.name))
-		strcpy(active->base.name, DEFAULT_BT_DEVICE_NAME);
-	cras_iodev_add_node(iodev, &active->base);
-
-	node = add_profile_dev(&btio->base, dev, profile);
-	if (node == NULL)
-		goto error;
-
-	/* Default active profile to a2dp whenever it's allowed. */
-	if (!cras_bt_device_get_active_profile(device) ||
-	    (profile == CRAS_BT_DEVICE_PROFILE_A2DP_SOURCE &&
-	     cras_bt_device_can_switch_to_a2dp(device)))
-		bt_switch_to_profile(device, profile);
-
-	if (iodev->direction == CRAS_STREAM_OUTPUT)
-		err = cras_iodev_list_add_output(iodev);
-	else
-		err = cras_iodev_list_add_input(iodev);
-	if (err)
-		goto error;
-
-	cras_iodev_set_active_node(iodev, &active->base);
-	return &btio->base;
-
-error:
-	if (btio)
-		free(btio);
-	return NULL;
-}
-
-void cras_bt_io_free_resources(struct cras_iodev *bt_iodev)
-{
-	struct cras_ionode *node;
-	struct bt_node *n;
-
-	free(bt_iodev->supported_rates);
-	free(bt_iodev->supported_channel_counts);
-	free(bt_iodev->supported_formats);
-
-	DL_FOREACH (bt_iodev->nodes, node) {
-		n = (struct bt_node *)node;
-		cras_iodev_rm_node(bt_iodev, node);
-		free(n);
-	}
-
-	cras_iodev_free_resources(bt_iodev);
-}
-
-void cras_bt_io_destroy(struct cras_iodev *bt_iodev)
-{
-	int rc;
-	struct bt_io *btio = (struct bt_io *)bt_iodev;
-
-	if (bt_iodev->direction == CRAS_STREAM_OUTPUT)
-		rc = cras_iodev_list_rm_output(bt_iodev);
-	else
-		rc = cras_iodev_list_rm_input(bt_iodev);
-	if (rc == -EBUSY)
-		return;
-
-	cras_bt_io_free_resources(bt_iodev);
-	free(btio);
-}
-
-struct cras_ionode *cras_bt_io_get_profile(struct cras_iodev *bt_iodev,
-					   enum cras_bt_device_profile profile)
-{
-	struct cras_ionode *node;
-	DL_FOREACH (bt_iodev->nodes, node) {
-		struct bt_node *n = (struct bt_node *)node;
-		if (n->profile & profile)
-			return node;
-	}
-	return NULL;
-}
-
-int cras_bt_io_append(struct cras_iodev *bt_iodev, struct cras_iodev *dev,
-		      enum cras_bt_device_profile profile)
-{
-	struct cras_ionode *node;
-	struct bt_io *btio = (struct bt_io *)bt_iodev;
-
-	if (cras_bt_io_get_profile(bt_iodev, profile))
-		return -EEXIST;
-
-	node = add_profile_dev(bt_iodev, dev, profile);
-	if (!node)
-		return -ENOMEM;
-
-	if (profile == CRAS_BT_DEVICE_PROFILE_A2DP_SOURCE &&
-	    cras_bt_device_can_switch_to_a2dp(btio->device)) {
-		bt_switch_to_profile(btio->device,
-				     CRAS_BT_DEVICE_PROFILE_A2DP_SOURCE);
-		cras_bt_device_switch_profile(btio->device, bt_iodev);
-		syslog(LOG_ERR, "Switch to A2DP on append");
-	}
-	return 0;
-}
-
-int cras_bt_io_on_profile(struct cras_iodev *bt_iodev,
-			  enum cras_bt_device_profile profile)
-{
-	struct bt_node *btnode = (struct bt_node *)bt_iodev->active_node;
-	return !!(profile & btnode->profile);
-}
-
-enum cras_bt_device_profile
-cras_bt_io_profile_to_log(struct cras_iodev *bt_iodev)
-{
-	struct bt_node *btnode = (struct bt_node *)bt_iodev->active_node;
-
-	if (btnode->profile & CRAS_BT_DEVICE_PROFILE_A2DP_SOURCE)
-		return CRAS_BT_DEVICE_PROFILE_A2DP_SOURCE;
-
-	if (hfp_iodev_is_hsp(btnode->profile_dev))
-		return CRAS_BT_DEVICE_PROFILE_HSP_AUDIOGATEWAY;
-	else
-		return CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY;
-}
-
-unsigned int cras_bt_io_try_remove(struct cras_iodev *bt_iodev,
-				   struct cras_iodev *dev)
-{
-	struct cras_ionode *node;
-	struct bt_node *active, *btnode;
-	unsigned int try_profile = 0;
-
-	active = (struct bt_node *)bt_iodev->active_node;
-
-	if (active->profile_dev == dev) {
-		DL_FOREACH (bt_iodev->nodes, node) {
-			btnode = (struct bt_node *)node;
-			/* Skip the active node and the node we're trying
-			 * to remove. */
-			if (btnode == active || btnode->profile_dev == dev)
-				continue;
-			try_profile = btnode->profile;
-			break;
-		}
-	} else {
-		try_profile = active->profile;
-	}
-	return try_profile;
-}
-
-int cras_bt_io_remove(struct cras_iodev *bt_iodev, struct cras_iodev *dev)
-{
-	struct cras_ionode *node;
-	struct bt_node *btnode;
-
-	DL_FOREACH (bt_iodev->nodes, node) {
-		btnode = (struct bt_node *)node;
-		if (btnode->profile_dev != dev)
-			continue;
-
-		/* If this is the active node, reset it. Otherwise delete
-		 * this node. */
-		if (node == bt_iodev->active_node) {
-			btnode->profile_dev = NULL;
-			btnode->profile = 0;
-		} else {
-			DL_DELETE(bt_iodev->nodes, node);
-			free(node);
-		}
-	}
-
-	/* The node of active profile could have been removed, update it.
-	 * Return err when fail to locate the active profile dev. */
-	update_active_node(bt_iodev, 0, 1);
-	btnode = (struct bt_node *)bt_iodev->active_node;
-	if ((btnode->profile == 0) || (btnode->profile_dev == NULL))
-		return -EINVAL;
-
-	return 0;
-}
diff --git a/cras/src/server/cras_bt_io.h b/cras/src/server/cras_bt_io.h
deleted file mode 100644
index a867afd..0000000
--- a/cras/src/server/cras_bt_io.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/* Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_BT_IODEV_H_
-#define CRAS_BT_IODEV_H_
-
-#include "cras_bt_device.h"
-
-struct cras_iodev;
-
-/* Creates a bluetooth iodev. */
-struct cras_iodev *cras_bt_io_create(struct cras_bt_device *device,
-				     struct cras_iodev *dev,
-				     enum cras_bt_device_profile profile);
-
-/* Destroys a bluetooth iodev. */
-void cras_bt_io_destroy(struct cras_iodev *bt_iodev);
-
-/* Looks up for the node of given profile, returns NULL if doesn't exist. */
-struct cras_ionode *cras_bt_io_get_profile(struct cras_iodev *bt_iodev,
-					   enum cras_bt_device_profile profile);
-
-/* Appends a profile specific iodev to bt_iodev. */
-int cras_bt_io_append(struct cras_iodev *bt_iodev, struct cras_iodev *dev,
-		      enum cras_bt_device_profile profile);
-
-/* Checks if the active node of bt_io matches a profile. */
-int cras_bt_io_on_profile(struct cras_iodev *bt_iodev,
-			  enum cras_bt_device_profile profile);
-
-/* Returns A2DP, HFP or HSP that this bt_iodev is running for.
- * Do NOT use this function except for logging.
- */
-enum cras_bt_device_profile
-cras_bt_io_profile_to_log(struct cras_iodev *bt_iodev);
-
-/* Dry-run the profile device removal from bt_iodev.
- * Returns:
- *    0 if the bt_iodev will be empty and should to be destroied
- *    after the removal, othersie the value of the next preffered
- *    profile to use.
- */
-unsigned int cras_bt_io_try_remove(struct cras_iodev *bt_iodev,
-				   struct cras_iodev *dev);
-
-/* Removes a profile specific iodev from bt_iodev.
- * Returns:
- *    0 if dev is removed and bt_iodev successfully updated to
- *    the new profile, otherwise return negative error code. */
-int cras_bt_io_remove(struct cras_iodev *bt_iodev, struct cras_iodev *dev);
-
-#endif /* CRAS_BT_IODEV_H_ */
diff --git a/cras/src/server/cras_bt_log.h b/cras/src/server/cras_bt_log.h
deleted file mode 100644
index 26c559a..0000000
--- a/cras/src/server/cras_bt_log.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/* Copyright 2019 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_BT_LOG_H_
-#define CRAS_BT_LOG_H_
-
-#include <stdint.h>
-
-#include "cras_types.h"
-
-#define CRAS_BT_LOGGING 1
-
-#if (CRAS_BT_LOGGING)
-#define BTLOG(log, event, data1, data2)                                        \
-	cras_bt_event_log_data(log, event, data1, data2);
-#else
-#define BTLOG(log, event, data1, data2)
-#endif
-
-extern struct cras_bt_event_log *btlog;
-
-static inline struct cras_bt_event_log *cras_bt_event_log_init()
-{
-	struct cras_bt_event_log *log;
-	log = (struct cras_bt_event_log *)calloc(
-		1, sizeof(struct cras_bt_event_log));
-	log->len = CRAS_BT_EVENT_LOG_SIZE;
-
-	return log;
-}
-
-static inline void cras_bt_event_log_deinit(struct cras_bt_event_log *log)
-{
-	free(log);
-}
-
-static inline void cras_bt_event_log_data(struct cras_bt_event_log *log,
-					  enum CRAS_BT_LOG_EVENTS event,
-					  uint32_t data1, uint32_t data2)
-{
-	struct timespec now;
-
-	clock_gettime(CLOCK_MONOTONIC_RAW, &now);
-	log->log[log->write_pos].tag_sec =
-		(event << 24) | (now.tv_sec & 0x00ffffff);
-	log->log[log->write_pos].nsec = now.tv_nsec;
-	log->log[log->write_pos].data1 = data1;
-	log->log[log->write_pos].data2 = data2;
-
-	log->write_pos++;
-	log->write_pos %= CRAS_BT_EVENT_LOG_SIZE;
-}
-
-#endif /* CRAS_BT_LOG_H_ */
\ No newline at end of file
diff --git a/cras/src/server/cras_bt_manager.c b/cras/src/server/cras_bt_manager.c
deleted file mode 100644
index a710340..0000000
--- a/cras/src/server/cras_bt_manager.c
+++ /dev/null
@@ -1,619 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <dbus/dbus.h>
-#include <errno.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <string.h>
-#include <syslog.h>
-
-#include "cras_bt_constants.h"
-#include "cras_bt_manager.h"
-#include "cras_bt_adapter.h"
-#include "cras_bt_device.h"
-#include "cras_bt_endpoint.h"
-#include "cras_bt_log.h"
-#include "cras_bt_player.h"
-#include "cras_bt_profile.h"
-#include "cras_bt_transport.h"
-#include "cras_bt_battery_provider.h"
-#include "utlist.h"
-
-struct cras_bt_event_log *btlog;
-
-static void cras_bt_interface_added(DBusConnection *conn,
-				    const char *object_path,
-				    const char *interface_name,
-				    DBusMessageIter *properties_array_iter)
-{
-	if (strcmp(interface_name, BLUEZ_INTERFACE_ADAPTER) == 0) {
-		struct cras_bt_adapter *adapter;
-
-		adapter = cras_bt_adapter_get(object_path);
-		if (adapter) {
-			cras_bt_adapter_update_properties(
-				adapter, properties_array_iter, NULL);
-		} else {
-			BTLOG(btlog, BT_ADAPTER_ADDED, 0, 0);
-			adapter = cras_bt_adapter_create(conn, object_path);
-			if (adapter) {
-				cras_bt_adapter_update_properties(
-					adapter, properties_array_iter, NULL);
-
-				syslog(LOG_INFO, "Bluetooth Adapter: %s added",
-				       cras_bt_adapter_address(adapter));
-			} else {
-				syslog(LOG_WARNING,
-				       "Failed to create Bluetooth Adapter: %s",
-				       object_path);
-			}
-		}
-
-	} else if (strcmp(interface_name, BLUEZ_INTERFACE_MEDIA) == 0) {
-		struct cras_bt_adapter *adapter;
-
-		adapter = cras_bt_adapter_get(object_path);
-		if (adapter) {
-			cras_bt_register_endpoints(conn, adapter);
-			cras_bt_register_player(conn, adapter);
-
-			syslog(LOG_INFO,
-			       "Bluetooth Endpoint and/or Player: %s added",
-			       cras_bt_adapter_address(adapter));
-		} else {
-			syslog(LOG_WARNING,
-			       "Failed to create Bluetooth Endpoint and/or Player: %s",
-			       object_path);
-		}
-
-	} else if (strcmp(interface_name, BLUEZ_PROFILE_MGMT_INTERFACE) == 0) {
-		cras_bt_register_profiles(conn);
-
-		syslog(LOG_INFO, "Bluetooth Profile Manager added");
-
-	} else if (strcmp(interface_name, BLUEZ_INTERFACE_DEVICE) == 0) {
-		struct cras_bt_device *device;
-
-		device = cras_bt_device_get(object_path);
-		if (device) {
-			cras_bt_device_update_properties(
-				device, properties_array_iter, NULL);
-		} else {
-			device = cras_bt_device_create(conn, object_path);
-			if (device) {
-				cras_bt_device_update_properties(
-					device, properties_array_iter, NULL);
-
-				syslog(LOG_INFO, "Bluetooth Device: %s added",
-				       cras_bt_device_address(device));
-			} else {
-				syslog(LOG_WARNING,
-				       "Failed to create Bluetooth Device: %s",
-				       object_path);
-			}
-		}
-
-	} else if (strcmp(interface_name, BLUEZ_INTERFACE_MEDIA_TRANSPORT) ==
-		   0) {
-		struct cras_bt_transport *transport;
-
-		transport = cras_bt_transport_get(object_path);
-		if (transport) {
-			cras_bt_transport_update_properties(
-				transport, properties_array_iter, NULL);
-		} else {
-			transport = cras_bt_transport_create(conn, object_path);
-			if (transport) {
-				cras_bt_transport_update_properties(
-					transport, properties_array_iter, NULL);
-
-				syslog(LOG_INFO,
-				       "Bluetooth Transport: %s added",
-				       cras_bt_transport_object_path(
-					       transport));
-			} else {
-				syslog(LOG_WARNING,
-				       "Failed to create Bluetooth Transport: "
-				       "%s",
-				       object_path);
-			}
-		}
-	} else if (strcmp(interface_name,
-			  BLUEZ_INTERFACE_BATTERY_PROVIDER_MANAGER) == 0) {
-		struct cras_bt_adapter *adapter;
-		int ret;
-
-		syslog(LOG_INFO,
-		       "Bluetooth Battery Provider Manager available");
-
-		adapter = cras_bt_adapter_get(object_path);
-		if (adapter) {
-			syslog(LOG_INFO,
-			       "Registering Battery Provider for adapter %s",
-			       cras_bt_adapter_address(adapter));
-			ret = cras_bt_register_battery_provider(conn, adapter);
-			if (ret != 0) {
-				syslog(LOG_ERR,
-				       "Error registering Battery Provider "
-				       "for adapter %s: %s",
-				       cras_bt_adapter_address(adapter),
-				       strerror(-ret));
-			}
-		} else {
-			syslog(LOG_WARNING,
-			       "Adapter not available when trying to create "
-			       "Battery Provider");
-		}
-	}
-}
-
-static void cras_bt_interface_removed(DBusConnection *conn,
-				      const char *object_path,
-				      const char *interface_name)
-{
-	if (strcmp(interface_name, BLUEZ_INTERFACE_ADAPTER) == 0) {
-		struct cras_bt_adapter *adapter;
-
-		BTLOG(btlog, BT_ADAPTER_REMOVED, 0, 0);
-		adapter = cras_bt_adapter_get(object_path);
-		if (adapter) {
-			syslog(LOG_INFO, "Bluetooth Adapter: %s removed",
-			       cras_bt_adapter_address(adapter));
-			cras_bt_adapter_destroy(adapter);
-		}
-
-	} else if (strcmp(interface_name, BLUEZ_INTERFACE_DEVICE) == 0) {
-		struct cras_bt_device *device;
-
-		device = cras_bt_device_get(object_path);
-		if (device) {
-			syslog(LOG_INFO, "Bluetooth Device: %s removed",
-			       cras_bt_device_address(device));
-			cras_bt_device_remove(device);
-		}
-
-	} else if (strcmp(interface_name, BLUEZ_INTERFACE_MEDIA_TRANSPORT) ==
-		   0) {
-		struct cras_bt_transport *transport;
-
-		transport = cras_bt_transport_get(object_path);
-		if (transport) {
-			syslog(LOG_INFO, "Bluetooth Transport: %s removed",
-			       cras_bt_transport_object_path(transport));
-			cras_bt_transport_remove(transport);
-		}
-	} else if (strcmp(interface_name,
-			  BLUEZ_INTERFACE_BATTERY_PROVIDER_MANAGER) == 0) {
-		syslog(LOG_INFO, "Bluetooth Battery Provider Manager removed");
-		cras_bt_battery_provider_reset();
-	}
-}
-
-static void cras_bt_update_properties(DBusConnection *conn,
-				      const char *object_path,
-				      const char *interface_name,
-				      DBusMessageIter *properties_array_iter,
-				      DBusMessageIter *invalidated_array_iter)
-{
-	if (strcmp(interface_name, BLUEZ_INTERFACE_ADAPTER) == 0) {
-		struct cras_bt_adapter *adapter;
-
-		adapter = cras_bt_adapter_get(object_path);
-		if (adapter) {
-			cras_bt_adapter_update_properties(
-				adapter, properties_array_iter,
-				invalidated_array_iter);
-		}
-
-	} else if (strcmp(interface_name, BLUEZ_INTERFACE_DEVICE) == 0) {
-		struct cras_bt_device *device;
-
-		device = cras_bt_device_get(object_path);
-		if (device) {
-			cras_bt_device_update_properties(
-				device, properties_array_iter,
-				invalidated_array_iter);
-		}
-
-	} else if (strcmp(interface_name, BLUEZ_INTERFACE_MEDIA_TRANSPORT) ==
-		   0) {
-		struct cras_bt_transport *transport;
-
-		transport = cras_bt_transport_get(object_path);
-		if (transport) {
-			cras_bt_transport_update_properties(
-				transport, properties_array_iter,
-				invalidated_array_iter);
-		}
-	}
-}
-
-/* Destroys all bt related stuff. The reset functions must be called in
- * reverse order of the adapter -> device -> profile(s) hierarchy.
- */
-static void cras_bt_reset()
-{
-	BTLOG(btlog, BT_RESET, 0, 0);
-	cras_bt_endpoint_reset();
-	cras_bt_transport_reset();
-	cras_bt_profile_reset();
-	cras_bt_device_reset();
-	cras_bt_adapter_reset();
-}
-
-static void cras_bt_on_get_managed_objects(DBusPendingCall *pending_call,
-					   void *data)
-{
-	DBusConnection *conn = (DBusConnection *)data;
-	DBusMessage *reply;
-	DBusMessageIter message_iter, object_array_iter;
-
-	reply = dbus_pending_call_steal_reply(pending_call);
-	dbus_pending_call_unref(pending_call);
-
-	if (dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR) {
-		syslog(LOG_WARNING, "GetManagedObjects returned error: %s",
-		       dbus_message_get_error_name(reply));
-		dbus_message_unref(reply);
-		return;
-	}
-
-	if (!dbus_message_has_signature(reply, "a{oa{sa{sv}}}")) {
-		syslog(LOG_WARNING, "Bad GetManagedObjects reply received");
-		dbus_message_unref(reply);
-		return;
-	}
-
-	dbus_message_iter_init(reply, &message_iter);
-	dbus_message_iter_recurse(&message_iter, &object_array_iter);
-
-	while (dbus_message_iter_get_arg_type(&object_array_iter) !=
-	       DBUS_TYPE_INVALID) {
-		DBusMessageIter object_dict_iter, interface_array_iter;
-		const char *object_path;
-
-		dbus_message_iter_recurse(&object_array_iter,
-					  &object_dict_iter);
-
-		dbus_message_iter_get_basic(&object_dict_iter, &object_path);
-		dbus_message_iter_next(&object_dict_iter);
-
-		dbus_message_iter_recurse(&object_dict_iter,
-					  &interface_array_iter);
-
-		while (dbus_message_iter_get_arg_type(&interface_array_iter) !=
-		       DBUS_TYPE_INVALID) {
-			DBusMessageIter interface_dict_iter;
-			DBusMessageIter properties_array_iter;
-			const char *interface_name;
-
-			dbus_message_iter_recurse(&interface_array_iter,
-						  &interface_dict_iter);
-
-			dbus_message_iter_get_basic(&interface_dict_iter,
-						    &interface_name);
-			dbus_message_iter_next(&interface_dict_iter);
-
-			dbus_message_iter_recurse(&interface_dict_iter,
-						  &properties_array_iter);
-
-			cras_bt_interface_added(conn, object_path,
-						interface_name,
-						&properties_array_iter);
-
-			dbus_message_iter_next(&interface_array_iter);
-		}
-
-		dbus_message_iter_next(&object_array_iter);
-	}
-
-	dbus_message_unref(reply);
-}
-
-static int cras_bt_get_managed_objects(DBusConnection *conn)
-{
-	DBusMessage *method_call;
-	DBusPendingCall *pending_call;
-
-	method_call =
-		dbus_message_new_method_call(BLUEZ_SERVICE, "/",
-					     DBUS_INTERFACE_OBJECT_MANAGER,
-					     "GetManagedObjects");
-	if (!method_call)
-		return -ENOMEM;
-
-	pending_call = NULL;
-	if (!dbus_connection_send_with_reply(conn, method_call, &pending_call,
-					     DBUS_TIMEOUT_USE_DEFAULT)) {
-		dbus_message_unref(method_call);
-		return -ENOMEM;
-	}
-
-	dbus_message_unref(method_call);
-	if (!pending_call)
-		return -EIO;
-
-	if (!dbus_pending_call_set_notify(
-		    pending_call, cras_bt_on_get_managed_objects, conn, NULL)) {
-		dbus_pending_call_cancel(pending_call);
-		dbus_pending_call_unref(pending_call);
-		return -ENOMEM;
-	}
-
-	return 0;
-}
-
-static DBusHandlerResult cras_bt_handle_name_owner_changed(DBusConnection *conn,
-							   DBusMessage *message,
-							   void *arg)
-{
-	DBusError dbus_error;
-	const char *service_name, *old_owner, *new_owner;
-
-	if (!dbus_message_is_signal(message, DBUS_INTERFACE_DBUS,
-				    "NameOwnerChanged"))
-		return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-
-	dbus_error_init(&dbus_error);
-	if (!dbus_message_get_args(message, &dbus_error, DBUS_TYPE_STRING,
-				   &service_name, DBUS_TYPE_STRING, &old_owner,
-				   DBUS_TYPE_STRING, &new_owner,
-				   DBUS_TYPE_INVALID)) {
-		syslog(LOG_WARNING, "Bad NameOwnerChanged signal received: %s",
-		       dbus_error.message);
-		dbus_error_free(&dbus_error);
-		return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-	}
-
-	syslog(LOG_INFO, "Bluetooth daemon disconnected from the bus.");
-	cras_bt_reset();
-
-	if (strlen(new_owner) > 0)
-		cras_bt_get_managed_objects(conn);
-
-	return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult cras_bt_handle_interfaces_added(DBusConnection *conn,
-							 DBusMessage *message,
-							 void *arg)
-{
-	DBusMessageIter message_iter, interface_array_iter;
-	const char *object_path;
-
-	if (!dbus_message_is_signal(message, DBUS_INTERFACE_OBJECT_MANAGER,
-				    "InterfacesAdded"))
-		return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-
-	if (!dbus_message_has_signature(message, "oa{sa{sv}}")) {
-		syslog(LOG_WARNING, "Bad InterfacesAdded signal received");
-		return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-	}
-
-	dbus_message_iter_init(message, &message_iter);
-
-	dbus_message_iter_get_basic(&message_iter, &object_path);
-	dbus_message_iter_next(&message_iter);
-
-	dbus_message_iter_recurse(&message_iter, &interface_array_iter);
-
-	while (dbus_message_iter_get_arg_type(&interface_array_iter) !=
-	       DBUS_TYPE_INVALID) {
-		DBusMessageIter interface_dict_iter, properties_array_iter;
-		const char *interface_name;
-
-		dbus_message_iter_recurse(&interface_array_iter,
-					  &interface_dict_iter);
-
-		dbus_message_iter_get_basic(&interface_dict_iter,
-					    &interface_name);
-		dbus_message_iter_next(&interface_dict_iter);
-
-		dbus_message_iter_recurse(&interface_dict_iter,
-					  &properties_array_iter);
-
-		cras_bt_interface_added(conn, object_path, interface_name,
-					&properties_array_iter);
-
-		dbus_message_iter_next(&interface_array_iter);
-	}
-
-	return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult cras_bt_handle_interfaces_removed(DBusConnection *conn,
-							   DBusMessage *message,
-							   void *arg)
-{
-	DBusMessageIter message_iter, interface_array_iter;
-	const char *object_path;
-
-	if (!dbus_message_is_signal(message, DBUS_INTERFACE_OBJECT_MANAGER,
-				    "InterfacesRemoved"))
-		return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-
-	if (!dbus_message_has_signature(message, "oas")) {
-		syslog(LOG_WARNING, "Bad InterfacesRemoved signal received");
-		return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-	}
-
-	dbus_message_iter_init(message, &message_iter);
-
-	dbus_message_iter_get_basic(&message_iter, &object_path);
-	dbus_message_iter_next(&message_iter);
-
-	dbus_message_iter_recurse(&message_iter, &interface_array_iter);
-
-	while (dbus_message_iter_get_arg_type(&interface_array_iter) !=
-	       DBUS_TYPE_INVALID) {
-		const char *interface_name;
-
-		dbus_message_iter_get_basic(&interface_array_iter,
-					    &interface_name);
-
-		cras_bt_interface_removed(conn, object_path, interface_name);
-
-		dbus_message_iter_next(&interface_array_iter);
-	}
-
-	return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult cras_bt_handle_properties_changed(DBusConnection *conn,
-							   DBusMessage *message,
-							   void *arg)
-{
-	DBusMessageIter message_iter, properties_array_iter;
-	DBusMessageIter invalidated_array_iter;
-	const char *object_path, *interface_name;
-
-	if (!dbus_message_is_signal(message, DBUS_INTERFACE_PROPERTIES,
-				    "PropertiesChanged"))
-		return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-
-	if (!dbus_message_has_signature(message, "sa{sv}as")) {
-		syslog(LOG_WARNING, "Bad PropertiesChanged signal received");
-		return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-	}
-
-	object_path = dbus_message_get_path(message);
-
-	dbus_message_iter_init(message, &message_iter);
-
-	dbus_message_iter_get_basic(&message_iter, &interface_name);
-	dbus_message_iter_next(&message_iter);
-
-	dbus_message_iter_recurse(&message_iter, &properties_array_iter);
-	dbus_message_iter_next(&message_iter);
-
-	dbus_message_iter_recurse(&message_iter, &invalidated_array_iter);
-
-	cras_bt_update_properties(conn, object_path, interface_name,
-				  &properties_array_iter,
-				  &invalidated_array_iter);
-
-	return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-void cras_bt_start(DBusConnection *conn)
-{
-	DBusError dbus_error;
-
-	btlog = cras_bt_event_log_init();
-
-	dbus_error_init(&dbus_error);
-
-	/* Inform the bus daemon which signals we wish to receive. */
-	dbus_bus_add_match(conn,
-			   "type='signal',"
-			   "sender='" DBUS_SERVICE_DBUS "',"
-			   "interface='" DBUS_INTERFACE_DBUS "',"
-			   "member='NameOwnerChanged',"
-			   "arg0='" BLUEZ_SERVICE "'",
-			   &dbus_error);
-	if (dbus_error_is_set(&dbus_error))
-		goto add_match_error;
-
-	dbus_bus_add_match(conn,
-			   "type='signal',"
-			   "sender='" BLUEZ_SERVICE "',"
-			   "interface='" DBUS_INTERFACE_OBJECT_MANAGER "',"
-			   "member='InterfacesAdded'",
-			   &dbus_error);
-	if (dbus_error_is_set(&dbus_error))
-		goto add_match_error;
-
-	dbus_bus_add_match(conn,
-			   "type='signal',"
-			   "sender='" BLUEZ_SERVICE "',"
-			   "interface='" DBUS_INTERFACE_OBJECT_MANAGER "',"
-			   "member='InterfacesRemoved'",
-			   &dbus_error);
-	if (dbus_error_is_set(&dbus_error))
-		goto add_match_error;
-
-	dbus_bus_add_match(conn,
-			   "type='signal',"
-			   "sender='" BLUEZ_SERVICE "',"
-			   "interface='" DBUS_INTERFACE_PROPERTIES "',"
-			   "member='PropertiesChanged'",
-			   &dbus_error);
-	if (dbus_error_is_set(&dbus_error))
-		goto add_match_error;
-
-	/* Install filter functions to handle the signals we receive. */
-	if (!dbus_connection_add_filter(conn, cras_bt_handle_name_owner_changed,
-					NULL, NULL))
-		goto add_filter_error;
-
-	if (!dbus_connection_add_filter(conn, cras_bt_handle_interfaces_added,
-					NULL, NULL))
-		goto add_filter_error;
-
-	if (!dbus_connection_add_filter(conn, cras_bt_handle_interfaces_removed,
-					NULL, NULL))
-		goto add_filter_error;
-
-	if (!dbus_connection_add_filter(conn, cras_bt_handle_properties_changed,
-					NULL, NULL))
-		goto add_filter_error;
-
-	cras_bt_get_managed_objects(conn);
-	return;
-
-add_match_error:
-	syslog(LOG_WARNING, "Couldn't setup Bluetooth device monitoring: %s",
-	       dbus_error.message);
-	dbus_error_free(&dbus_error);
-	cras_bt_stop(conn);
-	return;
-
-add_filter_error:
-	syslog(LOG_WARNING, "Couldn't setup Bluetooth device monitoring: %s",
-	       strerror(ENOMEM));
-	cras_bt_stop(conn);
-	return;
-}
-
-void cras_bt_stop(DBusConnection *conn)
-{
-	cras_bt_reset();
-
-	dbus_bus_remove_match(conn,
-			      "type='signal',"
-			      "sender='" DBUS_SERVICE_DBUS "',"
-			      "interface='" DBUS_INTERFACE_DBUS "',"
-			      "member='NameOwnerChanged',"
-			      "arg0='" BLUEZ_SERVICE "'",
-			      NULL);
-	dbus_bus_remove_match(conn,
-			      "type='signal',"
-			      "sender='" BLUEZ_SERVICE "',"
-			      "interface='" DBUS_INTERFACE_OBJECT_MANAGER "',"
-			      "member='InterfacesAdded'",
-			      NULL);
-	dbus_bus_remove_match(conn,
-			      "type='signal',"
-			      "sender='" BLUEZ_SERVICE "',"
-			      "interface='" DBUS_INTERFACE_OBJECT_MANAGER "',"
-			      "member='InterfacesRemoved'",
-			      NULL);
-	dbus_bus_remove_match(conn,
-			      "type='signal',"
-			      "sender='" BLUEZ_SERVICE "',"
-			      "interface='" DBUS_INTERFACE_PROPERTIES "',"
-			      "member='PropertiesChanged'",
-			      NULL);
-
-	dbus_connection_remove_filter(conn, cras_bt_handle_name_owner_changed,
-				      NULL);
-	dbus_connection_remove_filter(conn, cras_bt_handle_interfaces_added,
-				      NULL);
-	dbus_connection_remove_filter(conn, cras_bt_handle_interfaces_removed,
-				      NULL);
-	dbus_connection_remove_filter(conn, cras_bt_handle_properties_changed,
-				      NULL);
-}
diff --git a/cras/src/server/cras_bt_manager.h b/cras/src/server/cras_bt_manager.h
deleted file mode 100644
index 155d8ef..0000000
--- a/cras/src/server/cras_bt_manager.h
+++ /dev/null
@@ -1,14 +0,0 @@
-/* Copyright (c) 2013 The Chromium Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_BT_MANAGER_H_
-#define CRAS_BT_MANAGER_H_
-
-#include <dbus/dbus.h>
-
-void cras_bt_start(DBusConnection *conn);
-void cras_bt_stop(DBusConnection *conn);
-
-#endif /* CRAS_BT_MANAGER_H_ */
diff --git a/cras/src/server/cras_bt_player.c b/cras/src/server/cras_bt_player.c
deleted file mode 100644
index 446cd91..0000000
--- a/cras/src/server/cras_bt_player.c
+++ /dev/null
@@ -1,486 +0,0 @@
-/* Copyright 2016 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-#include <dbus/dbus.h>
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <syslog.h>
-
-#include "cras_bt_adapter.h"
-#include "cras_bt_constants.h"
-#include "cras_bt_player.h"
-#include "cras_dbus_util.h"
-#include "cras_utf8.h"
-#include "utlist.h"
-
-static void cras_bt_on_player_registered(DBusPendingCall *pending_call,
-					 void *data)
-{
-	DBusMessage *reply;
-
-	reply = dbus_pending_call_steal_reply(pending_call);
-	dbus_pending_call_unref(pending_call);
-
-	if (dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR) {
-		syslog(LOG_ERR, "RegisterPlayer returned error: %s",
-		       dbus_message_get_error_name(reply));
-		dbus_message_unref(reply);
-		return;
-	}
-
-	dbus_message_unref(reply);
-}
-
-static int cras_bt_add_player(DBusConnection *conn,
-			      const struct cras_bt_adapter *adapter,
-			      struct cras_bt_player *player)
-{
-	const char *adapter_path;
-	DBusMessage *method_call;
-	DBusMessageIter message_iter, dict;
-	DBusPendingCall *pending_call;
-
-	adapter_path = cras_bt_adapter_object_path(adapter);
-	method_call = dbus_message_new_method_call(BLUEZ_SERVICE, adapter_path,
-						   BLUEZ_INTERFACE_MEDIA,
-						   "RegisterPlayer");
-	if (!method_call)
-		return -ENOMEM;
-
-	dbus_message_iter_init_append(method_call, &message_iter);
-	dbus_message_iter_append_basic(&message_iter, DBUS_TYPE_OBJECT_PATH,
-				       &player->object_path);
-
-	dbus_message_iter_open_container(
-		&message_iter, DBUS_TYPE_ARRAY,
-		DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING DBUS_TYPE_STRING_AS_STRING
-			DBUS_TYPE_VARIANT_AS_STRING
-				DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
-		&dict);
-
-	append_key_value(&dict, "PlaybackStatus", DBUS_TYPE_STRING,
-			 DBUS_TYPE_STRING_AS_STRING, &player->playback_status);
-	append_key_value(&dict, "Identity", DBUS_TYPE_STRING,
-			 DBUS_TYPE_STRING_AS_STRING, &player->identity);
-	append_key_value(&dict, "LoopStatus", DBUS_TYPE_STRING,
-			 DBUS_TYPE_STRING_AS_STRING, &player->loop_status);
-	append_key_value(&dict, "Position", DBUS_TYPE_INT64,
-			 DBUS_TYPE_INT64_AS_STRING, &player->position);
-	append_key_value(&dict, "Shuffle", DBUS_TYPE_BOOLEAN,
-			 DBUS_TYPE_BOOLEAN_AS_STRING, &player->shuffle);
-	append_key_value(&dict, "CanGoNext", DBUS_TYPE_BOOLEAN,
-			 DBUS_TYPE_BOOLEAN_AS_STRING, &player->can_go_next);
-	append_key_value(&dict, "CanGoPrevious", DBUS_TYPE_BOOLEAN,
-			 DBUS_TYPE_BOOLEAN_AS_STRING, &player->can_go_prev);
-	append_key_value(&dict, "CanPlay", DBUS_TYPE_BOOLEAN,
-			 DBUS_TYPE_BOOLEAN_AS_STRING, &player->can_play);
-	append_key_value(&dict, "CanPause", DBUS_TYPE_BOOLEAN,
-			 DBUS_TYPE_BOOLEAN_AS_STRING, &player->can_pause);
-	append_key_value(&dict, "CanControl", DBUS_TYPE_BOOLEAN,
-			 DBUS_TYPE_BOOLEAN_AS_STRING, &player->can_control);
-
-	dbus_message_iter_close_container(&message_iter, &dict);
-
-	if (!dbus_connection_send_with_reply(conn, method_call, &pending_call,
-					     DBUS_TIMEOUT_USE_DEFAULT)) {
-		dbus_message_unref(method_call);
-		return -ENOMEM;
-	}
-
-	dbus_message_unref(method_call);
-	if (!pending_call)
-		return -EIO;
-
-	if (!dbus_pending_call_set_notify(
-		    pending_call, cras_bt_on_player_registered, player, NULL)) {
-		dbus_pending_call_cancel(pending_call);
-		dbus_pending_call_unref(pending_call);
-		return -ENOMEM;
-	}
-	return 0;
-}
-
-/* Note that player properties will be used mostly for AVRCP qualification and
- * not for normal use cases. The corresponding media events won't be routed by
- * CRAS until we have a plan to provide general system API to handle media
- * control.
- */
-static struct cras_bt_player player = {
-	.object_path = CRAS_DEFAULT_PLAYER,
-	.playback_status = NULL,
-	.identity = NULL,
-	.loop_status = "None",
-	.shuffle = 0,
-	.metadata = NULL,
-	.position = 0,
-	.can_go_next = 0,
-	.can_go_prev = 0,
-	.can_play = 0,
-	.can_pause = 0,
-	.can_control = 0,
-	.message_cb = NULL,
-};
-
-static DBusHandlerResult cras_bt_player_handle_message(DBusConnection *conn,
-						       DBusMessage *message,
-						       void *arg)
-{
-	const char *msg = dbus_message_get_member(message);
-
-	if (player.message_cb)
-		player.message_cb(msg);
-
-	return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static struct cras_bt_player_metadata *cras_bt_player_metadata_init()
-{
-	struct cras_bt_player_metadata *metadata =
-		malloc(sizeof(struct cras_bt_player_metadata));
-	metadata->title = calloc(1, CRAS_PLAYER_METADATA_SIZE_MAX);
-	metadata->album = calloc(1, CRAS_PLAYER_METADATA_SIZE_MAX);
-	metadata->artist = calloc(1, CRAS_PLAYER_METADATA_SIZE_MAX);
-	metadata->length = 0;
-
-	return metadata;
-}
-
-static void cras_bt_player_init()
-{
-	player.playback_status = malloc(CRAS_PLAYER_PLAYBACK_STATUS_SIZE_MAX);
-	player.identity = malloc(CRAS_PLAYER_IDENTITY_SIZE_MAX);
-
-	strcpy(player.playback_status, CRAS_PLAYER_PLAYBACK_STATUS_DEFAULT);
-	strcpy(player.identity, CRAS_PLAYER_IDENTITY_DEFAULT);
-	player.position = 0;
-
-	player.metadata = cras_bt_player_metadata_init();
-}
-
-static void cras_bt_player_append_metadata_artist(DBusMessageIter *iter,
-						  const char *artist)
-{
-	DBusMessageIter dict, varient, array;
-	const char *artist_key = "xesam:artist";
-
-	dbus_message_iter_open_container(iter, DBUS_TYPE_DICT_ENTRY, NULL,
-					 &dict);
-	dbus_message_iter_append_basic(&dict, DBUS_TYPE_STRING, &artist_key);
-	dbus_message_iter_open_container(
-		&dict, DBUS_TYPE_VARIANT,
-		DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_STRING_AS_STRING, &varient);
-	dbus_message_iter_open_container(&varient, DBUS_TYPE_ARRAY,
-					 DBUS_TYPE_STRING_AS_STRING, &array);
-	dbus_message_iter_append_basic(&array, DBUS_TYPE_STRING, &artist);
-	dbus_message_iter_close_container(&varient, &array);
-	dbus_message_iter_close_container(&dict, &varient);
-	dbus_message_iter_close_container(iter, &dict);
-}
-
-static void cras_bt_player_append_metadata(DBusMessageIter *iter,
-					   const char *title,
-					   const char *artist,
-					   const char *album,
-					   dbus_int64_t length)
-{
-	DBusMessageIter varient, array;
-	dbus_message_iter_open_container(
-		iter, DBUS_TYPE_VARIANT,
-		DBUS_TYPE_ARRAY_AS_STRING DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
-			DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_VARIANT_AS_STRING
-				DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
-		&varient);
-	dbus_message_iter_open_container(
-		&varient, DBUS_TYPE_ARRAY,
-		DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING DBUS_TYPE_STRING_AS_STRING
-			DBUS_TYPE_VARIANT_AS_STRING
-				DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
-		&array);
-	if (!is_utf8_string(title)) {
-		syslog(LOG_INFO, "Non-utf8 title: %s", title);
-		title = "";
-	}
-	if (!is_utf8_string(album)) {
-		syslog(LOG_INFO, "Non-utf8 album: %s", album);
-		album = "";
-	}
-	if (!is_utf8_string(artist)) {
-		syslog(LOG_INFO, "Non-utf8 artist: %s", artist);
-		artist = "";
-	}
-
-	append_key_value(&array, "xesam:title", DBUS_TYPE_STRING,
-			 DBUS_TYPE_STRING_AS_STRING, &title);
-	append_key_value(&array, "xesam:album", DBUS_TYPE_STRING,
-			 DBUS_TYPE_STRING_AS_STRING, &album);
-	append_key_value(&array, "mpris:length", DBUS_TYPE_INT64,
-			 DBUS_TYPE_INT64_AS_STRING, &length);
-	cras_bt_player_append_metadata_artist(&array, artist);
-
-	dbus_message_iter_close_container(&varient, &array);
-	dbus_message_iter_close_container(iter, &varient);
-}
-
-static bool cras_bt_player_parse_metadata(const char *title, const char *album,
-					  const char *artist,
-					  const dbus_int64_t length)
-{
-	bool require_update = false;
-
-	if (title && strcmp(player.metadata->title, title)) {
-		snprintf(player.metadata->title, CRAS_PLAYER_METADATA_SIZE_MAX,
-			 "%s", title);
-		require_update = true;
-	}
-	if (artist && strcmp(player.metadata->artist, artist)) {
-		snprintf(player.metadata->artist, CRAS_PLAYER_METADATA_SIZE_MAX,
-			 "%s", artist);
-		require_update = true;
-	}
-	if (album && strcmp(player.metadata->album, album)) {
-		snprintf(player.metadata->album, CRAS_PLAYER_METADATA_SIZE_MAX,
-			 "%s", album);
-		require_update = true;
-	}
-	if (length && player.metadata->length != length) {
-		player.metadata->length = length;
-		require_update = true;
-	}
-
-	return require_update;
-}
-
-int cras_bt_player_create(DBusConnection *conn)
-{
-	static const DBusObjectPathVTable player_vtable = {
-		.message_function = cras_bt_player_handle_message
-	};
-
-	DBusError dbus_error;
-	struct cras_bt_adapter **adapters;
-	size_t num_adapters, i;
-
-	dbus_error_init(&dbus_error);
-
-	cras_bt_player_init();
-	if (!dbus_connection_register_object_path(
-		    conn, player.object_path, &player_vtable, &dbus_error)) {
-		syslog(LOG_ERR, "Cannot register player %s",
-		       player.object_path);
-		dbus_error_free(&dbus_error);
-		return -ENOMEM;
-	}
-
-	num_adapters = cras_bt_adapter_get_list(&adapters);
-	for (i = 0; i < num_adapters; ++i)
-		cras_bt_add_player(conn, adapters[i], &player);
-	free(adapters);
-	return 0;
-}
-
-int cras_bt_register_player(DBusConnection *conn,
-			    const struct cras_bt_adapter *adapter)
-{
-	return cras_bt_add_player(conn, adapter, &player);
-}
-
-int cras_bt_player_update_playback_status(DBusConnection *conn,
-					  const char *status)
-{
-	DBusMessage *msg;
-	DBusMessageIter iter, dict;
-	const char *playerInterface = BLUEZ_INTERFACE_MEDIA_PLAYER;
-
-	if (!player.playback_status)
-		return -ENXIO;
-
-	/* Verify the string value matches one of the possible status defined in
-	 * bluez/profiles/audio/avrcp.c
-	 */
-	if (strcasecmp(status, "stopped") != 0 &&
-	    strcasecmp(status, "playing") != 0 &&
-	    strcasecmp(status, "paused") != 0 &&
-	    strcasecmp(status, "forward-seek") != 0 &&
-	    strcasecmp(status, "reverse-seek") != 0 &&
-	    strcasecmp(status, "error") != 0)
-		return -EINVAL;
-
-	if (!strcasecmp(player.playback_status, status))
-		return 0;
-
-	strcpy(player.playback_status, status);
-
-	msg = dbus_message_new_signal(CRAS_DEFAULT_PLAYER,
-				      DBUS_INTERFACE_PROPERTIES,
-				      "PropertiesChanged");
-	if (!msg)
-		return -ENOMEM;
-
-	dbus_message_iter_init_append(msg, &iter);
-	dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING,
-				       &playerInterface);
-	dbus_message_iter_open_container(
-		&iter, DBUS_TYPE_ARRAY,
-		DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING DBUS_TYPE_STRING_AS_STRING
-			DBUS_TYPE_VARIANT_AS_STRING
-				DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
-		&dict);
-	append_key_value(&dict, "PlaybackStatus", DBUS_TYPE_STRING,
-			 DBUS_TYPE_STRING_AS_STRING, &status);
-	dbus_message_iter_close_container(&iter, &dict);
-
-	if (!dbus_connection_send(conn, msg, NULL)) {
-		dbus_message_unref(msg);
-		return -ENOMEM;
-	}
-
-	dbus_message_unref(msg);
-	return 0;
-}
-
-int cras_bt_player_update_identity(DBusConnection *conn, const char *identity)
-{
-	DBusMessage *msg;
-	DBusMessageIter iter, dict;
-	const char *playerInterface = BLUEZ_INTERFACE_MEDIA_PLAYER;
-
-	if (!player.identity)
-		return -ENXIO;
-
-	if (!identity)
-		return -EINVAL;
-
-	if (!is_utf8_string(identity)) {
-		syslog(LOG_INFO, "Non-utf8 identity: %s", identity);
-		identity = "";
-	}
-
-	if (!strcasecmp(player.identity, identity))
-		return 0;
-
-	strcpy(player.identity, identity);
-
-	msg = dbus_message_new_signal(CRAS_DEFAULT_PLAYER,
-				      DBUS_INTERFACE_PROPERTIES,
-				      "PropertiesChanged");
-	if (!msg)
-		return -ENOMEM;
-
-	dbus_message_iter_init_append(msg, &iter);
-	dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING,
-				       &playerInterface);
-	dbus_message_iter_open_container(
-		&iter, DBUS_TYPE_ARRAY,
-		DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING DBUS_TYPE_STRING_AS_STRING
-			DBUS_TYPE_VARIANT_AS_STRING
-				DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
-		&dict);
-	append_key_value(&dict, "Identity", DBUS_TYPE_STRING,
-			 DBUS_TYPE_STRING_AS_STRING, &identity);
-	dbus_message_iter_close_container(&iter, &dict);
-
-	if (!dbus_connection_send(conn, msg, NULL)) {
-		dbus_message_unref(msg);
-		return -ENOMEM;
-	}
-
-	dbus_message_unref(msg);
-	return 0;
-}
-
-int cras_bt_player_update_position(DBusConnection *conn,
-				   const dbus_int64_t position)
-{
-	DBusMessage *msg;
-	DBusMessageIter iter, dict;
-	const char *playerInterface = BLUEZ_INTERFACE_MEDIA_PLAYER;
-
-	if (position < 0)
-		return -EINVAL;
-
-	player.position = position;
-
-	msg = dbus_message_new_signal(CRAS_DEFAULT_PLAYER,
-				      DBUS_INTERFACE_PROPERTIES,
-				      "PropertiesChanged");
-	if (!msg)
-		return -ENOMEM;
-
-	dbus_message_iter_init_append(msg, &iter);
-	dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING,
-				       &playerInterface);
-	dbus_message_iter_open_container(
-		&iter, DBUS_TYPE_ARRAY,
-		DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING DBUS_TYPE_STRING_AS_STRING
-			DBUS_TYPE_VARIANT_AS_STRING
-				DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
-		&dict);
-	append_key_value(&dict, "Position", DBUS_TYPE_INT64,
-			 DBUS_TYPE_INT64_AS_STRING, &player.position);
-	dbus_message_iter_close_container(&iter, &dict);
-
-	if (!dbus_connection_send(conn, msg, NULL)) {
-		dbus_message_unref(msg);
-		return -ENOMEM;
-	}
-
-	dbus_message_unref(msg);
-	return 0;
-}
-
-int cras_bt_player_update_metadata(DBusConnection *conn, const char *title,
-				   const char *artist, const char *album,
-				   const dbus_int64_t length)
-{
-	DBusMessage *msg;
-	DBusMessageIter iter, array, dict;
-	const char *property = "Metadata";
-	const char *playerInterface = BLUEZ_INTERFACE_MEDIA_PLAYER;
-
-	if (!player.metadata)
-		return -ENXIO;
-
-	msg = dbus_message_new_signal(CRAS_DEFAULT_PLAYER,
-				      DBUS_INTERFACE_PROPERTIES,
-				      "PropertiesChanged");
-	if (!msg)
-		return -ENOMEM;
-
-	dbus_message_iter_init_append(msg, &iter);
-	dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING,
-				       &playerInterface);
-	dbus_message_iter_open_container(
-		&iter, DBUS_TYPE_ARRAY,
-		DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING DBUS_TYPE_STRING_AS_STRING
-			DBUS_TYPE_VARIANT_AS_STRING
-				DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
-		&array);
-	dbus_message_iter_open_container(&array, DBUS_TYPE_DICT_ENTRY, NULL,
-					 &dict);
-	dbus_message_iter_append_basic(&dict, DBUS_TYPE_STRING, &property);
-
-	if (!cras_bt_player_parse_metadata(title, album, artist, length)) {
-		/* Nothing to update. */
-		dbus_message_unref(msg);
-		return 0;
-	}
-
-	cras_bt_player_append_metadata(&dict, player.metadata->title,
-				       player.metadata->artist,
-				       player.metadata->album,
-				       player.metadata->length);
-
-	dbus_message_iter_close_container(&array, &dict);
-	dbus_message_iter_close_container(&iter, &array);
-
-	if (!dbus_connection_send(conn, msg, NULL)) {
-		dbus_message_unref(msg);
-		return -ENOMEM;
-	}
-
-	dbus_message_unref(msg);
-	return 0;
-}
diff --git a/cras/src/server/cras_bt_player.h b/cras/src/server/cras_bt_player.h
deleted file mode 100644
index 25a6c8c..0000000
--- a/cras/src/server/cras_bt_player.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/* Copyright 2016 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_BT_PLAYER_H_
-#define CRAS_BT_PLAYER_H_
-
-#include <dbus/dbus.h>
-#include <stdbool.h>
-
-#include "cras_bt_adapter.h"
-
-/* Object to hold current metadata. This is not a full list of what BlueZ/MPRIS
- * supports but a subset because Chromium only provides the following.
- */
-struct cras_bt_player_metadata {
-	char *title;
-	char *artist;
-	char *album;
-	int64_t length;
-};
-
-/* Object to register as media player so that bluetoothd will report hardware
- * volume from device through bt_transport. Properties of the player are defined
- * in BlueZ's media API.
- */
-struct cras_bt_player {
-	const char *object_path;
-	char *playback_status;
-	char *identity;
-	const char *loop_status;
-	struct cras_bt_player_metadata *metadata;
-	int64_t position;
-	bool can_go_next;
-	bool can_go_prev;
-	bool can_play;
-	bool can_pause;
-	bool can_control;
-	bool shuffle;
-	void (*message_cb)(const char *message);
-};
-
-/* Creates a player object and register it to bluetoothd.
- * Args:
- *    conn - The dbus connection.
- */
-int cras_bt_player_create(DBusConnection *conn);
-
-/* Registers created player to bluetoothd. This is used when an bluetooth
- * adapter got enumerated.
- * Args:
- *    conn - The dbus connection.
- *    adapter - The enumerated bluetooth adapter.
- */
-int cras_bt_register_player(DBusConnection *conn,
-			    const struct cras_bt_adapter *adapter);
-
-/* Updates playback status for player and notifies bluetoothd
- * Args:
- *    conn - The dbus connection.
- *    status - The player playback status.
- */
-int cras_bt_player_update_playback_status(DBusConnection *conn,
-					  const char *status);
-
-/* Updates the player identity and notifies bluetoothd.
- * Args:
- *    conn - The dbus connection.
- *    identity - The identity of the registered player. This could be the name
- *               of the app or the name of the site playing media.
- */
-int cras_bt_player_update_identity(DBusConnection *conn, const char *identity);
-
-/* Updates the player current track's position and notifies bluetoothd.
- * Args:
- *    conn - The dbus connection.
- *    position - The current track position in microseconds.
- */
-int cras_bt_player_update_position(DBusConnection *conn,
-				   const dbus_int64_t position);
-
-/* Updates the player current metadata and notifies bluetoothd.
- * Args:
- *    conn - The dbus connection.
- *    title - The title associated to the current media session.
- *    artist - The artist associated to the current media session.
- *    album - The album associated to the current media session.
- *    length - The duration in microseconds associated to the current media
- *             session.
- */
-int cras_bt_player_update_metadata(DBusConnection *conn, const char *title,
-				   const char *artist, const char *album,
-				   const dbus_int64_t length);
-#endif /* CRAS_BT_PLAYER_H_ */
diff --git a/cras/src/server/cras_bt_profile.c b/cras/src/server/cras_bt_profile.c
deleted file mode 100644
index 9b4171f..0000000
--- a/cras/src/server/cras_bt_profile.c
+++ /dev/null
@@ -1,479 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <dbus/dbus.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <string.h>
-#include <syslog.h>
-#include <unistd.h>
-
-#include "cras_bt_constants.h"
-#include "cras_bt_device.h"
-#include "cras_bt_profile.h"
-#include "cras_dbus_util.h"
-#include "utlist.h"
-
-#define PROFILE_INTROSPECT_XML                                                 \
-	DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE                              \
-	"<node>\n"                                                             \
-	"  <interface name=\"org.bluez.Profile1\">\n"                          \
-	"    <method name=\"Release\">\n"                                      \
-	"    </method>\n"                                                      \
-	"    <method name=\"NewConnection\">\n"                                \
-	"      <arg name=\"device\" type=\"o\" direction=\"in\">\n"            \
-	"      <arg name=\"fd\" type=\"h\" direction=\"in\">\n"                \
-	"      <arg name=\"fd_properties\" type=\"a{sv}\" direction=\"in\">\n" \
-	"    </method>\n"                                                      \
-	"    <method name=\"RequestDisconnection\">\n"                         \
-	"      <arg name=\"device\" type=\"o\" direction=\"in\">\n"            \
-	"    </method>\n"                                                      \
-	"    <method name=\"Cancel\">\n"                                       \
-	"    </method>\n"                                                      \
-	"  <interface name=\"" DBUS_INTERFACE_INTROSPECTABLE "\">\n"           \
-	"    <method name=\"Introspect\">\n"                                   \
-	"      <arg name=\"data\" type=\"s\" direction=\"out\"/>\n"            \
-	"    </method>\n"                                                      \
-	"  </interface>\n"                                                     \
-	"</node>\n"
-
-/* Profiles */
-static struct cras_bt_profile *profiles;
-
-static DBusHandlerResult cras_bt_profile_handle_release(DBusConnection *conn,
-							DBusMessage *message,
-							void *arg)
-{
-	DBusMessage *reply;
-	const char *profile_path;
-	struct cras_bt_profile *profile;
-
-	profile_path = dbus_message_get_path(message);
-
-	profile = cras_bt_profile_get(profile_path);
-	if (!profile)
-		return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-
-	syslog(LOG_ERR, "Profile %s released by bluetoothd", profile->name);
-	profile->release(profile);
-
-	reply = dbus_message_new_method_return(message);
-	if (!reply)
-		return DBUS_HANDLER_RESULT_NEED_MEMORY;
-	if (!dbus_connection_send(conn, reply, NULL)) {
-		dbus_message_unref(reply);
-		return DBUS_HANDLER_RESULT_NEED_MEMORY;
-	}
-
-	dbus_message_unref(reply);
-
-	return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult
-cras_bt_profile_handle_new_connection(DBusConnection *conn,
-				      DBusMessage *message, void *arg)
-{
-	DBusMessageIter message_iter;
-	DBusMessage *reply;
-	const char *profile_path, *object_path;
-	int fd = -1;
-	int err;
-	struct cras_bt_profile *profile;
-	struct cras_bt_device *device;
-
-	profile_path = dbus_message_get_path(message);
-
-	dbus_message_iter_init(message, &message_iter);
-	dbus_message_iter_get_basic(&message_iter, &object_path);
-	dbus_message_iter_next(&message_iter);
-
-	if (dbus_message_iter_get_arg_type(&message_iter) !=
-	    DBUS_TYPE_UNIX_FD) {
-		syslog(LOG_ERR, "Argument not a valid unix file descriptor");
-		goto invalid;
-	}
-
-	dbus_message_iter_get_basic(&message_iter, &fd);
-	dbus_message_iter_next(&message_iter);
-	if (fd < 0)
-		goto invalid;
-
-	profile = cras_bt_profile_get(profile_path);
-	if (!profile)
-		goto invalid;
-
-	device = cras_bt_device_get(object_path);
-	if (!device) {
-		syslog(LOG_ERR, "Device %s not found at %s new connection",
-		       object_path, profile_path);
-		device = cras_bt_device_create(conn, object_path);
-	}
-
-	err = profile->new_connection(conn, profile, device, fd);
-	if (err) {
-		syslog(LOG_INFO, "%s new connection rejected", profile->name);
-		close(fd);
-		reply = dbus_message_new_error(
-			message, "org.chromium.Cras.Error.RejectNewConnection",
-			"Possibly another headset already in use");
-		if (!dbus_connection_send(conn, reply, NULL))
-			return DBUS_HANDLER_RESULT_NEED_MEMORY;
-
-		dbus_message_unref(reply);
-		return DBUS_HANDLER_RESULT_HANDLED;
-	}
-
-	reply = dbus_message_new_method_return(message);
-	if (!reply)
-		return DBUS_HANDLER_RESULT_NEED_MEMORY;
-	if (!dbus_connection_send(conn, reply, NULL)) {
-		dbus_message_unref(reply);
-		return DBUS_HANDLER_RESULT_NEED_MEMORY;
-	}
-
-	dbus_message_unref(reply);
-	return DBUS_HANDLER_RESULT_HANDLED;
-
-invalid:
-	if (fd >= 0)
-		close(fd);
-	return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-}
-
-static DBusHandlerResult
-cras_bt_profile_handle_request_disconnection(DBusConnection *conn,
-					     DBusMessage *message, void *arg)
-{
-	DBusMessageIter message_iter;
-	DBusMessage *reply;
-	const char *prpofile_path, *object_path;
-	struct cras_bt_profile *profile;
-	struct cras_bt_device *device;
-
-	prpofile_path = dbus_message_get_path(message);
-
-	dbus_message_iter_init(message, &message_iter);
-	dbus_message_iter_get_basic(&message_iter, &object_path);
-	dbus_message_iter_next(&message_iter);
-
-	profile = cras_bt_profile_get(prpofile_path);
-	if (!profile)
-		goto invalid;
-
-	device = cras_bt_device_get(object_path);
-	if (!device)
-		goto invalid;
-
-	profile->request_disconnection(profile, device);
-
-	reply = dbus_message_new_method_return(message);
-	if (!reply)
-		return DBUS_HANDLER_RESULT_NEED_MEMORY;
-	if (!dbus_connection_send(conn, reply, NULL)) {
-		dbus_message_unref(reply);
-		return DBUS_HANDLER_RESULT_NEED_MEMORY;
-	}
-
-	dbus_message_unref(reply);
-
-	return DBUS_HANDLER_RESULT_HANDLED;
-
-invalid:
-	return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-}
-
-static DBusHandlerResult cras_bt_profile_handle_cancel(DBusConnection *conn,
-						       DBusMessage *message,
-						       void *arg)
-{
-	DBusMessage *reply;
-	const char *profile_path;
-	struct cras_bt_profile *profile;
-
-	profile_path = dbus_message_get_path(message);
-
-	profile = cras_bt_profile_get(profile_path);
-	if (!profile)
-		return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-
-	profile->cancel(profile);
-
-	reply = dbus_message_new_method_return(message);
-	if (!reply)
-		return DBUS_HANDLER_RESULT_NEED_MEMORY;
-	if (!dbus_connection_send(conn, reply, NULL)) {
-		dbus_message_unref(reply);
-		return DBUS_HANDLER_RESULT_NEED_MEMORY;
-	}
-
-	dbus_message_unref(reply);
-
-	return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult cras_bt_handle_profile_messages(DBusConnection *conn,
-							 DBusMessage *message,
-							 void *arg)
-{
-	if (dbus_message_is_method_call(message, DBUS_INTERFACE_INTROSPECTABLE,
-					"Introspect")) {
-		DBusMessage *reply;
-		const char *xml = PROFILE_INTROSPECT_XML;
-
-		reply = dbus_message_new_method_return(message);
-		if (!reply)
-			return DBUS_HANDLER_RESULT_NEED_MEMORY;
-		if (!dbus_message_append_args(reply, DBUS_TYPE_STRING, &xml,
-					      DBUS_TYPE_INVALID)) {
-			dbus_message_unref(reply);
-			return DBUS_HANDLER_RESULT_NEED_MEMORY;
-		}
-		if (!dbus_connection_send(conn, reply, NULL)) {
-			dbus_message_unref(reply);
-			return DBUS_HANDLER_RESULT_NEED_MEMORY;
-		}
-
-		dbus_message_unref(reply);
-		return DBUS_HANDLER_RESULT_HANDLED;
-	} else if (dbus_message_is_method_call(message, BLUEZ_INTERFACE_PROFILE,
-					       "Release")) {
-		return cras_bt_profile_handle_release(conn, message, arg);
-	} else if (dbus_message_is_method_call(message, BLUEZ_INTERFACE_PROFILE,
-					       "NewConnection")) {
-		return cras_bt_profile_handle_new_connection(conn, message,
-							     arg);
-	} else if (dbus_message_is_method_call(message, BLUEZ_INTERFACE_PROFILE,
-					       "RequestDisconnection")) {
-		return cras_bt_profile_handle_request_disconnection(
-			conn, message, arg);
-	} else if (dbus_message_is_method_call(message, BLUEZ_INTERFACE_PROFILE,
-					       "Cancel")) {
-		return cras_bt_profile_handle_cancel(conn, message, arg);
-	} else {
-		syslog(LOG_ERR, "Unknown Profile message");
-	}
-
-	return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static void cras_bt_on_register_profile(DBusPendingCall *pending_call,
-					void *data)
-{
-	DBusMessage *reply;
-
-	reply = dbus_pending_call_steal_reply(pending_call);
-	dbus_pending_call_unref(pending_call);
-
-	if (dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR)
-		syslog(LOG_ERR, "RegisterProfile returned error: %s",
-		       dbus_message_get_error_name(reply));
-	dbus_message_unref(reply);
-}
-
-int cras_bt_register_profile(DBusConnection *conn,
-			     struct cras_bt_profile *profile)
-{
-	DBusMessage *method_call;
-	DBusMessageIter message_iter;
-	DBusMessageIter properties_array_iter;
-	DBusPendingCall *pending_call;
-
-	method_call = dbus_message_new_method_call(BLUEZ_SERVICE,
-						   PROFILE_MANAGER_OBJ_PATH,
-						   BLUEZ_PROFILE_MGMT_INTERFACE,
-						   "RegisterProfile");
-
-	if (!method_call)
-		return -ENOMEM;
-
-	dbus_message_iter_init_append(method_call, &message_iter);
-	dbus_message_iter_append_basic(&message_iter, DBUS_TYPE_OBJECT_PATH,
-				       &profile->object_path);
-	dbus_message_iter_append_basic(&message_iter, DBUS_TYPE_STRING,
-				       &profile->uuid);
-
-	dbus_message_iter_open_container(
-		&message_iter, DBUS_TYPE_ARRAY,
-		DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING DBUS_TYPE_STRING_AS_STRING
-			DBUS_TYPE_VARIANT_AS_STRING
-				DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
-		&properties_array_iter);
-
-	if (!append_key_value(&properties_array_iter, "Name", DBUS_TYPE_STRING,
-			      DBUS_TYPE_STRING_AS_STRING, &profile->name)) {
-		dbus_message_unref(method_call);
-		return -ENOMEM;
-	}
-
-	if (profile->record &&
-	    !append_key_value(&properties_array_iter, "ServiceRecord",
-			      DBUS_TYPE_STRING, DBUS_TYPE_STRING_AS_STRING,
-			      &profile->record)) {
-		dbus_message_unref(method_call);
-		return -ENOMEM;
-	}
-
-	if (!append_key_value(&properties_array_iter, "Version",
-			      DBUS_TYPE_UINT16, DBUS_TYPE_UINT16_AS_STRING,
-			      &profile->version)) {
-		dbus_message_unref(method_call);
-		return -ENOMEM;
-	}
-
-	if (profile->role &&
-	    !append_key_value(&properties_array_iter, "Role", DBUS_TYPE_STRING,
-			      DBUS_TYPE_STRING_AS_STRING, &profile->role)) {
-		dbus_message_unref(method_call);
-		return -ENOMEM;
-	}
-
-	if (profile->features &&
-	    !append_key_value(&properties_array_iter, "Features",
-			      DBUS_TYPE_UINT16, DBUS_TYPE_UINT16_AS_STRING,
-			      &profile->features)) {
-		dbus_message_unref(method_call);
-		return -ENOMEM;
-	}
-
-	dbus_message_iter_close_container(&message_iter,
-					  &properties_array_iter);
-
-	if (!dbus_connection_send_with_reply(conn, method_call, &pending_call,
-					     DBUS_TIMEOUT_USE_DEFAULT)) {
-		dbus_message_unref(method_call);
-		return -ENOMEM;
-	}
-
-	dbus_message_unref(method_call);
-	if (!pending_call)
-		return -EIO;
-
-	if (!dbus_pending_call_set_notify(
-		    pending_call, cras_bt_on_register_profile, NULL, NULL)) {
-		dbus_pending_call_cancel(pending_call);
-		dbus_pending_call_unref(pending_call);
-		syslog(LOG_ERR, "register profile fail on set notify");
-		return -ENOMEM;
-	}
-
-	return 0;
-}
-
-int cras_bt_unregister_profile(DBusConnection *conn,
-			       struct cras_bt_profile *profile)
-{
-	DBusMessage *method_call;
-	DBusMessageIter message_iter;
-	DBusError dbus_error;
-	DBusMessage *reply;
-
-	method_call = dbus_message_new_method_call(BLUEZ_SERVICE,
-						   PROFILE_MANAGER_OBJ_PATH,
-						   BLUEZ_PROFILE_MGMT_INTERFACE,
-						   "UnregisterProfile");
-
-	if (!method_call)
-		return -ENOMEM;
-	dbus_error_init(&dbus_error);
-	dbus_message_iter_init_append(method_call, &message_iter);
-	dbus_message_iter_append_basic(&message_iter, DBUS_TYPE_OBJECT_PATH,
-				       &profile->object_path);
-	reply = dbus_connection_send_with_reply_and_block(
-		conn, method_call, DBUS_TIMEOUT_USE_DEFAULT, &dbus_error);
-
-	if (!reply) {
-		dbus_error_free(&dbus_error);
-		dbus_message_unref(method_call);
-		return -EIO;
-	}
-
-	dbus_message_unref(method_call);
-
-	if (dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR) {
-		syslog(LOG_ERR, "Unregister profile returned error: %s",
-		       dbus_message_get_error_name(reply));
-		dbus_message_unref(reply);
-		return -EIO;
-	}
-	dbus_message_unref(reply);
-	return 0;
-}
-
-int cras_bt_register_profiles(DBusConnection *conn)
-{
-	struct cras_bt_profile *profile;
-	int err;
-
-	DL_FOREACH (profiles, profile) {
-		err = cras_bt_register_profile(conn, profile);
-		if (err)
-			return err;
-	}
-
-	return 0;
-}
-
-int cras_bt_add_profile(DBusConnection *conn, struct cras_bt_profile *profile)
-{
-	static const DBusObjectPathVTable profile_vtable = {
-		NULL, cras_bt_handle_profile_messages, NULL, NULL, NULL, NULL
-	};
-
-	DBusError dbus_error;
-
-	dbus_error_init(&dbus_error);
-
-	if (!dbus_connection_register_object_path(
-		    conn, profile->object_path, &profile_vtable, &dbus_error)) {
-		syslog(LOG_ERR, "Could not register BT profile %s: %s",
-		       profile->object_path, dbus_error.message);
-		dbus_error_free(&dbus_error);
-		return -ENOMEM;
-	}
-
-	DL_APPEND(profiles, profile);
-
-	return 0;
-}
-
-int cras_bt_rm_profile(DBusConnection *conn, struct cras_bt_profile *profile)
-{
-	DL_DELETE(profiles, profile);
-
-	if (!dbus_connection_unregister_object_path(conn,
-						    profile->object_path)) {
-		syslog(LOG_ERR, "Could not unregister BT profile %s",
-		       profile->object_path);
-		return -ENOMEM;
-	}
-	return 0;
-}
-
-void cras_bt_profile_reset()
-{
-	struct cras_bt_profile *profile;
-
-	DL_FOREACH (profiles, profile)
-		profile->release(profile);
-}
-
-struct cras_bt_profile *cras_bt_profile_get(const char *path)
-{
-	struct cras_bt_profile *profile;
-	DL_FOREACH (profiles, profile) {
-		if (strcmp(profile->object_path, path) == 0)
-			return profile;
-	}
-
-	return NULL;
-}
-
-void cras_bt_profile_on_device_disconnected(struct cras_bt_device *device)
-{
-	struct cras_bt_profile *profile;
-	DL_FOREACH (profiles, profile)
-		profile->request_disconnection(profile, device);
-}
diff --git a/cras/src/server/cras_bt_profile.h b/cras/src/server/cras_bt_profile.h
deleted file mode 100644
index 4f8ab44..0000000
--- a/cras/src/server/cras_bt_profile.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_BT_PROFILE_H_
-#define CRAS_BT_PROFILE_H_
-
-#include <dbus/dbus.h>
-
-#include "cras_bt_device.h"
-
-#define PROFILE_MANAGER_OBJ_PATH "/org/bluez"
-
-/* Structure in cras to represent an external profile of bluez. All members
- * and functions are documented in bluez/doc/profile-api.txt, more options
- * can be put into this structure when we need it.
- */
-struct cras_bt_profile {
-	const char *name;
-	const char *object_path;
-	const char *uuid;
-	const char *role;
-	const char *record;
-	int version;
-	int features;
-	void (*release)(struct cras_bt_profile *profile);
-	int (*new_connection)(DBusConnection *conn,
-			      struct cras_bt_profile *profile,
-			      struct cras_bt_device *device, int rfcomm_fd);
-	void (*request_disconnection)(struct cras_bt_profile *profile,
-				      struct cras_bt_device *device);
-	void (*cancel)(struct cras_bt_profile *profile);
-	struct cras_bt_profile *prev, *next;
-};
-
-/* Adds the profile to cras and registers it with bluez.
- * Args:
- *    conn - The dbus connection.
- *    profile - Pointer to the profile structure to be add.
- */
-int cras_bt_add_profile(DBusConnection *conn, struct cras_bt_profile *profile);
-
-/* Removes |profile| from the list of profiles registered with bluez.
- * Args:
- *    conn - The dbus connection.
- *    profile - Pointer to the profile structure to be removed.
- */
-int cras_bt_rm_profile(DBusConnection *conn, struct cras_bt_profile *profile);
-
-/* Gets the profile by object path.
- * Args:
- *    path - The object path of the desired profile.
- *
- * Returns:
- *    The profile of the requested object path, or NULL if it
- *    does not exist.
- */
-struct cras_bt_profile *cras_bt_profile_get(const char *path);
-
-/* Resets all added profiles. */
-void cras_bt_profile_reset();
-
-/* Notifies all profiles when a device is disconnected. */
-void cras_bt_profile_on_device_disconnected(struct cras_bt_device *device);
-
-/* Registeres |profile| with bluez.
- * Args:
- *    conn - The dbus connection.
- *    profile - Pointer to the profile structure to be registered.
- */
-int cras_bt_register_profile(DBusConnection *conn,
-			     struct cras_bt_profile *profile);
-
-/* Unregisteres |profile| with bluez.
- * Args:
- *    conn - The dbus connection.
- *    profile - Pointer to the profile structure to be unregistered.
- */
-int cras_bt_unregister_profile(DBusConnection *conn,
-			       struct cras_bt_profile *profile);
-
-/* Registers all added profiles.
- * Args:
- *    conn - The dbus connection.
- * Returns:
- *    0 on success, or negative error code on failure.
- */
-int cras_bt_register_profiles(DBusConnection *conn);
-
-#endif /* CRAS_BT_PROFILE_H_ */
diff --git a/cras/src/server/cras_bt_transport.c b/cras/src/server/cras_bt_transport.c
deleted file mode 100644
index 402cd75..0000000
--- a/cras/src/server/cras_bt_transport.c
+++ /dev/null
@@ -1,634 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <dbus/dbus.h>
-
-#include <errno.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <string.h>
-#include <syslog.h>
-#include <unistd.h>
-
-#include "cras_bt_device.h"
-#include "cras_bt_endpoint.h"
-#include "cras_bt_log.h"
-#include "cras_bt_transport.h"
-#include "cras_bt_constants.h"
-#include "cras_system_state.h"
-#include "utlist.h"
-
-struct cras_bt_transport {
-	DBusConnection *conn;
-	char *object_path;
-	struct cras_bt_device *device;
-	enum cras_bt_device_profile profile;
-	int codec;
-	void *configuration;
-	int configuration_len;
-	enum cras_bt_transport_state state;
-	int fd;
-	uint16_t read_mtu;
-	uint16_t write_mtu;
-	int volume;
-	int removed;
-
-	struct cras_bt_endpoint *endpoint;
-	struct cras_bt_transport *prev, *next;
-};
-
-static struct cras_bt_transport *transports;
-
-struct cras_bt_transport *cras_bt_transport_create(DBusConnection *conn,
-						   const char *object_path)
-{
-	struct cras_bt_transport *transport;
-
-	transport = calloc(1, sizeof(*transport));
-	if (transport == NULL)
-		return NULL;
-
-	transport->object_path = strdup(object_path);
-	if (transport->object_path == NULL) {
-		free(transport);
-		return NULL;
-	}
-
-	transport->conn = conn;
-	dbus_connection_ref(transport->conn);
-
-	transport->fd = -1;
-	transport->volume = -1;
-
-	DL_APPEND(transports, transport);
-
-	return transport;
-}
-
-void cras_bt_transport_set_endpoint(struct cras_bt_transport *transport,
-				    struct cras_bt_endpoint *endpoint)
-{
-	transport->endpoint = endpoint;
-}
-
-int cras_bt_transport_is_removed(struct cras_bt_transport *transport)
-{
-	return transport->removed;
-}
-
-void cras_bt_transport_remove(struct cras_bt_transport *transport)
-{
-	/*
-	 * If the transport object is still associated with a valid
-	 * endpoint. Flag it as removed and wait for the ClearConfiguration
-	 * message from BT to actually suspend this A2DP connection and
-	 * destroy the transport.
-	 */
-	if (transport->endpoint)
-		transport->removed = 1;
-	else
-		cras_bt_transport_destroy(transport);
-}
-
-void cras_bt_transport_destroy(struct cras_bt_transport *transport)
-{
-	DL_DELETE(transports, transport);
-
-	dbus_connection_unref(transport->conn);
-
-	if (transport->fd >= 0)
-		close(transport->fd);
-
-	cras_bt_device_set_use_hardware_volume(transport->device, 0);
-
-	free(transport->object_path);
-	free(transport->configuration);
-	free(transport);
-}
-
-void cras_bt_transport_reset()
-{
-	while (transports) {
-		syslog(LOG_INFO, "Bluetooth Transport: %s removed",
-		       transports->object_path);
-		cras_bt_transport_destroy(transports);
-	}
-}
-
-struct cras_bt_transport *cras_bt_transport_get(const char *object_path)
-{
-	struct cras_bt_transport *transport;
-
-	DL_FOREACH (transports, transport) {
-		if (strcmp(transport->object_path, object_path) == 0)
-			return transport;
-	}
-
-	return NULL;
-}
-
-size_t
-cras_bt_transport_get_list(struct cras_bt_transport ***transport_list_out)
-{
-	struct cras_bt_transport *transport;
-	struct cras_bt_transport **transport_list = NULL;
-	size_t num_transports = 0;
-
-	DL_FOREACH (transports, transport) {
-		struct cras_bt_transport **tmp;
-
-		tmp = realloc(transport_list,
-			      sizeof(transport_list[0]) * (num_transports + 1));
-		if (!tmp) {
-			free(transport_list);
-			return -ENOMEM;
-		}
-
-		transport_list = tmp;
-		transport_list[num_transports++] = transport;
-	}
-
-	*transport_list_out = transport_list;
-	return num_transports;
-}
-
-const char *
-cras_bt_transport_object_path(const struct cras_bt_transport *transport)
-{
-	return transport->object_path;
-}
-
-struct cras_bt_device *
-cras_bt_transport_device(const struct cras_bt_transport *transport)
-{
-	return transport->device;
-}
-
-enum cras_bt_device_profile
-cras_bt_transport_profile(const struct cras_bt_transport *transport)
-{
-	return transport->profile;
-}
-
-int cras_bt_transport_configuration(const struct cras_bt_transport *transport,
-				    void *configuration, int len)
-{
-	if (len < transport->configuration_len)
-		return -ENOSPC;
-
-	memcpy(configuration, transport->configuration,
-	       transport->configuration_len);
-
-	return 0;
-}
-
-enum cras_bt_transport_state
-cras_bt_transport_state(const struct cras_bt_transport *transport)
-{
-	return transport->state;
-}
-
-int cras_bt_transport_fd(const struct cras_bt_transport *transport)
-{
-	return transport->fd;
-}
-
-uint16_t cras_bt_transport_write_mtu(const struct cras_bt_transport *transport)
-{
-	return transport->write_mtu;
-}
-
-static enum cras_bt_transport_state
-cras_bt_transport_state_from_string(const char *value)
-{
-	if (strcmp("idle", value) == 0)
-		return CRAS_BT_TRANSPORT_STATE_IDLE;
-	else if (strcmp("pending", value) == 0)
-		return CRAS_BT_TRANSPORT_STATE_PENDING;
-	else if (strcmp("active", value) == 0)
-		return CRAS_BT_TRANSPORT_STATE_ACTIVE;
-	else
-		return CRAS_BT_TRANSPORT_STATE_IDLE;
-}
-
-static void cras_bt_transport_state_changed(struct cras_bt_transport *transport)
-{
-	if (transport->endpoint && transport->endpoint->transport_state_changed)
-		transport->endpoint->transport_state_changed(
-			transport->endpoint, transport);
-}
-
-/* Updates bt_device when certain transport property has changed. */
-static void cras_bt_transport_update_device(struct cras_bt_transport *transport)
-{
-	if (!transport->device)
-		return;
-
-	/* When the transport has non-negaive volume, it means the remote
-	 * BT audio devices supports AVRCP absolute volume. Set the flag in bt
-	 * device to use hardware volume. Also map the volume value from 0-127
-	 * to 0-100.
-	 */
-	if (transport->volume != -1) {
-		cras_bt_device_set_use_hardware_volume(transport->device, 1);
-		cras_bt_device_update_hardware_volume(
-			transport->device, transport->volume * 100 / 127);
-	}
-}
-
-void cras_bt_transport_update_properties(struct cras_bt_transport *transport,
-					 DBusMessageIter *properties_array_iter,
-					 DBusMessageIter *invalidated_array_iter)
-{
-	while (dbus_message_iter_get_arg_type(properties_array_iter) !=
-	       DBUS_TYPE_INVALID) {
-		DBusMessageIter properties_dict_iter, variant_iter;
-		const char *key;
-		int type;
-
-		dbus_message_iter_recurse(properties_array_iter,
-					  &properties_dict_iter);
-
-		dbus_message_iter_get_basic(&properties_dict_iter, &key);
-		dbus_message_iter_next(&properties_dict_iter);
-
-		dbus_message_iter_recurse(&properties_dict_iter, &variant_iter);
-		type = dbus_message_iter_get_arg_type(&variant_iter);
-
-		if (type == DBUS_TYPE_STRING) {
-			const char *value;
-
-			dbus_message_iter_get_basic(&variant_iter, &value);
-
-			if (strcmp(key, "UUID") == 0) {
-				transport->profile =
-					cras_bt_device_profile_from_uuid(value);
-
-			} else if (strcmp(key, "State") == 0) {
-				enum cras_bt_transport_state old_state =
-					transport->state;
-				transport->state =
-					cras_bt_transport_state_from_string(
-						value);
-				if (transport->state != old_state)
-					cras_bt_transport_state_changed(
-						transport);
-			}
-
-		} else if (type == DBUS_TYPE_BYTE) {
-			int value;
-
-			dbus_message_iter_get_basic(&variant_iter, &value);
-
-			if (strcmp(key, "Codec") == 0)
-				transport->codec = value;
-		} else if (type == DBUS_TYPE_OBJECT_PATH) {
-			const char *obj_path;
-
-			if (strcmp(key, "Device") == 0) {
-				/* Property: object Device [readonly] */
-				dbus_message_iter_get_basic(&variant_iter,
-							    &obj_path);
-				transport->device =
-					cras_bt_device_get(obj_path);
-				if (!transport->device) {
-					syslog(LOG_ERR,
-					       "Device %s not found at update "
-					       "transport properties",
-					       obj_path);
-					transport->device =
-						cras_bt_device_create(
-							transport->conn,
-							obj_path);
-					cras_bt_transport_update_device(
-						transport);
-				}
-			}
-		} else if (strcmp(dbus_message_iter_get_signature(&variant_iter),
-				  "ay") == 0 &&
-			   strcmp(key, "Configuration") == 0) {
-			DBusMessageIter value_iter;
-			char *value;
-			int len;
-
-			dbus_message_iter_recurse(&variant_iter, &value_iter);
-			dbus_message_iter_get_fixed_array(&value_iter, &value,
-							  &len);
-
-			free(transport->configuration);
-			transport->configuration_len = 0;
-
-			transport->configuration = malloc(len);
-			if (transport->configuration) {
-				memcpy(transport->configuration, value, len);
-				transport->configuration_len = len;
-			}
-
-		} else if (strcmp(key, "Volume") == 0) {
-			uint16_t volume;
-
-			dbus_message_iter_get_basic(&variant_iter, &volume);
-			transport->volume = volume;
-			BTLOG(btlog, BT_TRANSPORT_UPDATE_VOLUME, volume, 0);
-			cras_bt_transport_update_device(transport);
-		}
-
-		dbus_message_iter_next(properties_array_iter);
-	}
-
-	while (invalidated_array_iter &&
-	       dbus_message_iter_get_arg_type(invalidated_array_iter) !=
-		       DBUS_TYPE_INVALID) {
-		const char *key;
-
-		dbus_message_iter_get_basic(invalidated_array_iter, &key);
-
-		if (strcmp(key, "Device") == 0) {
-			transport->device = NULL;
-		} else if (strcmp(key, "UUID") == 0) {
-			transport->profile = 0;
-		} else if (strcmp(key, "State") == 0) {
-			transport->state = CRAS_BT_TRANSPORT_STATE_IDLE;
-		} else if (strcmp(key, "Codec") == 0) {
-			transport->codec = 0;
-		} else if (strcmp(key, "Configuration") == 0) {
-			free(transport->configuration);
-			transport->configuration = NULL;
-			transport->configuration_len = 0;
-		}
-
-		dbus_message_iter_next(invalidated_array_iter);
-	}
-}
-
-static void on_transport_volume_set(DBusPendingCall *pending_call, void *data)
-{
-	DBusMessage *reply;
-
-	reply = dbus_pending_call_steal_reply(pending_call);
-	dbus_pending_call_unref(pending_call);
-
-	if (dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR)
-		syslog(LOG_ERR, "Set absolute volume returned error: %s",
-		       dbus_message_get_error_name(reply));
-	dbus_message_unref(reply);
-}
-
-int cras_bt_transport_set_volume(struct cras_bt_transport *transport,
-				 uint16_t volume)
-{
-	const char *key = "Volume";
-	const char *interface = BLUEZ_INTERFACE_MEDIA_TRANSPORT;
-	DBusMessage *method_call;
-	DBusMessageIter message_iter, variant;
-	DBusPendingCall *pending_call;
-
-	BTLOG(btlog, BT_TRANSPORT_SET_VOLUME, volume, 0);
-	method_call =
-		dbus_message_new_method_call(BLUEZ_SERVICE,
-					     transport->object_path,
-					     DBUS_INTERFACE_PROPERTIES, "Set");
-	if (!method_call)
-		return -ENOMEM;
-
-	dbus_message_iter_init_append(method_call, &message_iter);
-
-	dbus_message_iter_append_basic(&message_iter, DBUS_TYPE_STRING,
-				       &interface);
-	dbus_message_iter_append_basic(&message_iter, DBUS_TYPE_STRING, &key);
-
-	dbus_message_iter_open_container(&message_iter, DBUS_TYPE_VARIANT,
-					 DBUS_TYPE_UINT16_AS_STRING, &variant);
-	dbus_message_iter_append_basic(&variant, DBUS_TYPE_UINT16, &volume);
-	dbus_message_iter_close_container(&message_iter, &variant);
-
-	if (!dbus_connection_send_with_reply(transport->conn, method_call,
-					     &pending_call,
-					     DBUS_TIMEOUT_USE_DEFAULT)) {
-		dbus_message_unref(method_call);
-		return -ENOMEM;
-	}
-
-	dbus_message_unref(method_call);
-	if (!pending_call)
-		return -EIO;
-
-	if (!dbus_pending_call_set_notify(pending_call, on_transport_volume_set,
-					  NULL, NULL)) {
-		dbus_pending_call_cancel(pending_call);
-		dbus_pending_call_unref(pending_call);
-		return -ENOMEM;
-	}
-
-	return 0;
-}
-
-int cras_bt_transport_acquire(struct cras_bt_transport *transport)
-{
-	DBusMessage *method_call, *reply;
-	DBusError dbus_error;
-	int rc = 0;
-
-	if (transport->fd >= 0)
-		return 0;
-
-	method_call = dbus_message_new_method_call(
-		BLUEZ_SERVICE, transport->object_path,
-		BLUEZ_INTERFACE_MEDIA_TRANSPORT, "Acquire");
-	if (!method_call)
-		return -ENOMEM;
-
-	dbus_error_init(&dbus_error);
-
-	reply = dbus_connection_send_with_reply_and_block(
-		transport->conn, method_call, DBUS_TIMEOUT_USE_DEFAULT,
-		&dbus_error);
-	if (!reply) {
-		syslog(LOG_ERR, "Failed to acquire transport %s: %s",
-		       transport->object_path, dbus_error.message);
-		dbus_error_free(&dbus_error);
-		dbus_message_unref(method_call);
-		rc = -EIO;
-		goto acquire_fail;
-	}
-
-	dbus_message_unref(method_call);
-
-	if (dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR) {
-		syslog(LOG_ERR, "Acquire returned error: %s",
-		       dbus_message_get_error_name(reply));
-		dbus_message_unref(reply);
-		rc = -EIO;
-		goto acquire_fail;
-	}
-
-	if (!dbus_message_get_args(
-		    reply, &dbus_error, DBUS_TYPE_UNIX_FD, &(transport->fd),
-		    DBUS_TYPE_UINT16, &(transport->read_mtu), DBUS_TYPE_UINT16,
-		    &(transport->write_mtu), DBUS_TYPE_INVALID)) {
-		syslog(LOG_ERR, "Bad Acquire reply received: %s",
-		       dbus_error.message);
-		dbus_error_free(&dbus_error);
-		dbus_message_unref(reply);
-		rc = -EINVAL;
-		goto acquire_fail;
-	}
-
-	if (cras_system_get_bt_fix_a2dp_packet_size_enabled() &&
-	    transport->write_mtu > A2DP_FIX_PACKET_SIZE)
-		transport->write_mtu = A2DP_FIX_PACKET_SIZE;
-
-	BTLOG(btlog, BT_TRANSPORT_ACQUIRE, 1, transport->fd);
-	dbus_message_unref(reply);
-	return 0;
-
-acquire_fail:
-	BTLOG(btlog, BT_TRANSPORT_ACQUIRE, 0, 0);
-	return rc;
-}
-
-int cras_bt_transport_try_acquire(struct cras_bt_transport *transport)
-{
-	DBusMessage *method_call, *reply;
-	DBusError dbus_error;
-	int fd, read_mtu, write_mtu;
-
-	method_call = dbus_message_new_method_call(
-		BLUEZ_SERVICE, transport->object_path,
-		BLUEZ_INTERFACE_MEDIA_TRANSPORT, "TryAcquire");
-	if (!method_call)
-		return -ENOMEM;
-
-	dbus_error_init(&dbus_error);
-
-	reply = dbus_connection_send_with_reply_and_block(
-		transport->conn, method_call, DBUS_TIMEOUT_USE_DEFAULT,
-		&dbus_error);
-	if (!reply) {
-		syslog(LOG_ERR, "Failed to try acquire transport %s: %s",
-		       transport->object_path, dbus_error.message);
-		dbus_error_free(&dbus_error);
-		dbus_message_unref(method_call);
-		return -EIO;
-	}
-
-	dbus_message_unref(method_call);
-
-	if (dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR) {
-		syslog(LOG_ERR, "TryAcquire returned error: %s",
-		       dbus_message_get_error_name(reply));
-		dbus_message_unref(reply);
-		return -EIO;
-	}
-
-	if (!dbus_message_get_args(reply, &dbus_error, DBUS_TYPE_UNIX_FD, &fd,
-				   DBUS_TYPE_UINT16, &read_mtu,
-				   DBUS_TYPE_UINT16, &write_mtu,
-				   DBUS_TYPE_INVALID)) {
-		syslog(LOG_ERR, "Bad TryAcquire reply received: %s",
-		       dbus_error.message);
-		dbus_error_free(&dbus_error);
-		dbus_message_unref(reply);
-		return -EINVAL;
-	}
-
-	/* Done TryAcquired the transport so it won't be released in bluez,
-	 * no need for the new file descriptor so close it. */
-	if (transport->fd != fd)
-		close(fd);
-
-	dbus_message_unref(reply);
-	return 0;
-}
-
-/* Callback to trigger when transport release completed. */
-static void cras_bt_on_transport_release(DBusPendingCall *pending_call,
-					 void *data)
-{
-	DBusMessage *reply;
-
-	reply = dbus_pending_call_steal_reply(pending_call);
-	dbus_pending_call_unref(pending_call);
-
-	if (dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR) {
-		syslog(LOG_WARNING, "Release transport returned error: %s",
-		       dbus_message_get_error_name(reply));
-		dbus_message_unref(reply);
-		return;
-	}
-
-	dbus_message_unref(reply);
-}
-
-int cras_bt_transport_release(struct cras_bt_transport *transport,
-			      unsigned int blocking)
-{
-	DBusMessage *method_call, *reply;
-	DBusPendingCall *pending_call;
-	DBusError dbus_error;
-
-	if (transport->fd < 0)
-		return 0;
-
-	BTLOG(btlog, BT_TRANSPORT_RELEASE, transport->fd, 0);
-
-	/* Close the transport on our end no matter whether or not the server
-	 * gives us an error.
-	 */
-	close(transport->fd);
-	transport->fd = -1;
-
-	method_call = dbus_message_new_method_call(
-		BLUEZ_SERVICE, transport->object_path,
-		BLUEZ_INTERFACE_MEDIA_TRANSPORT, "Release");
-	if (!method_call)
-		return -ENOMEM;
-
-	if (blocking) {
-		dbus_error_init(&dbus_error);
-
-		reply = dbus_connection_send_with_reply_and_block(
-			transport->conn, method_call, DBUS_TIMEOUT_USE_DEFAULT,
-			&dbus_error);
-		if (!reply) {
-			syslog(LOG_ERR, "Failed to release transport %s: %s",
-			       transport->object_path, dbus_error.message);
-			dbus_error_free(&dbus_error);
-			dbus_message_unref(method_call);
-			return -EIO;
-		}
-
-		dbus_message_unref(method_call);
-
-		if (dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR) {
-			syslog(LOG_ERR, "Release returned error: %s",
-			       dbus_message_get_error_name(reply));
-			dbus_message_unref(reply);
-			return -EIO;
-		}
-
-		dbus_message_unref(reply);
-	} else {
-		if (!dbus_connection_send_with_reply(
-			    transport->conn, method_call, &pending_call,
-			    DBUS_TIMEOUT_USE_DEFAULT)) {
-			dbus_message_unref(method_call);
-			return -ENOMEM;
-		}
-
-		dbus_message_unref(method_call);
-		if (!pending_call)
-			return -EIO;
-
-		if (!dbus_pending_call_set_notify(pending_call,
-						  cras_bt_on_transport_release,
-						  transport, NULL)) {
-			dbus_pending_call_cancel(pending_call);
-			dbus_pending_call_unref(pending_call);
-			return -ENOMEM;
-		}
-	}
-	return 0;
-}
diff --git a/cras/src/server/cras_bt_transport.h b/cras/src/server/cras_bt_transport.h
deleted file mode 100644
index 6722fb0..0000000
--- a/cras/src/server/cras_bt_transport.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_BT_TRANSPORT_H_
-#define CRAS_BT_TRANSPORT_H_
-
-#include <dbus/dbus.h>
-#include <stdint.h>
-
-#include "cras_bt_device.h"
-
-struct cras_bt_endpoint;
-struct cras_bt_transport;
-
-enum cras_bt_transport_state {
-	CRAS_BT_TRANSPORT_STATE_IDLE,
-	CRAS_BT_TRANSPORT_STATE_PENDING,
-	CRAS_BT_TRANSPORT_STATE_ACTIVE
-};
-
-struct cras_bt_transport *cras_bt_transport_create(DBusConnection *conn,
-						   const char *object_path);
-void cras_bt_transport_set_endpoint(struct cras_bt_transport *transport,
-				    struct cras_bt_endpoint *endpoint);
-
-/* Handles the event when BT stack notifies specific transport is removed.
- * Args:
- *    transport - The transport object representing an A2DP connection.
- */
-void cras_bt_transport_remove(struct cras_bt_transport *transport);
-
-/* Queries the state if BT stack has removed given transport.
- * Args:
- *    transport - The transport object representing an A2DP connection.
- */
-int cras_bt_transport_is_removed(struct cras_bt_transport *transport);
-
-void cras_bt_transport_destroy(struct cras_bt_transport *transport);
-void cras_bt_transport_reset();
-
-struct cras_bt_transport *cras_bt_transport_get(const char *object_path);
-size_t
-cras_bt_transport_get_list(struct cras_bt_transport ***transport_list_out);
-
-const char *
-cras_bt_transport_object_path(const struct cras_bt_transport *transport);
-struct cras_bt_device *
-cras_bt_transport_device(const struct cras_bt_transport *transport);
-enum cras_bt_device_profile
-cras_bt_transport_profile(const struct cras_bt_transport *transport);
-int cras_bt_transport_configuration(const struct cras_bt_transport *transport,
-				    void *configuration, int len);
-enum cras_bt_transport_state
-cras_bt_transport_state(const struct cras_bt_transport *transport);
-
-int cras_bt_transport_fd(const struct cras_bt_transport *transport);
-uint16_t cras_bt_transport_write_mtu(const struct cras_bt_transport *transport);
-
-void cras_bt_transport_update_properties(
-	struct cras_bt_transport *transport,
-	DBusMessageIter *properties_array_iter,
-	DBusMessageIter *invalidated_array_iter);
-
-int cras_bt_transport_try_acquire(struct cras_bt_transport *transport);
-int cras_bt_transport_acquire(struct cras_bt_transport *transport);
-
-/* Releases the cras_bt_transport.
- * Args:
- *    transport - The transport object to release
- *    blocking - True to send release dbus message in blocking mode, otherwise
- *        in non-block mode.
- */
-int cras_bt_transport_release(struct cras_bt_transport *transport,
-			      unsigned int blocking);
-
-/* Sets the volume to cras_bt_transport. Note that the volume gets applied
- * to BT headset only when the transport is in ACTIVE state.
- * Args:
- *    transport - The transport object to set volume to.
- *    volume - The desired volume value, range in [0-127].
- */
-int cras_bt_transport_set_volume(struct cras_bt_transport *transport,
-				 uint16_t volume);
-
-#endif /* CRAS_BT_TRANSPORT_H_ */
diff --git a/cras/src/server/cras_capture_rclient.c b/cras/src/server/cras_capture_rclient.c
deleted file mode 100644
index 9b1f2b8..0000000
--- a/cras/src/server/cras_capture_rclient.c
+++ /dev/null
@@ -1,35 +0,0 @@
-/* Copyright 2019 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <syslog.h>
-
-#include "cras_iodev_list.h"
-#include "cras_messages.h"
-#include "cras_observer.h"
-#include "cras_rclient.h"
-#include "cras_rclient_util.h"
-#include "cras_rstream.h"
-#include "cras_types.h"
-#include "cras_util.h"
-
-/* Declarations of cras_rclient operators for cras_capture_rclient. */
-static const struct cras_rclient_ops cras_capture_rclient_ops = {
-	.handle_message_from_client = rclient_handle_message_from_client,
-	.send_message_to_client = rclient_send_message_to_client,
-	.destroy = rclient_destroy,
-};
-
-/*
- * Exported Functions.
- */
-
-/* Creates a client structure and sends a message back informing the client that
- * the connection has succeeded. */
-struct cras_rclient *cras_capture_rclient_create(int fd, size_t id)
-{
-	return rclient_generic_create(
-		fd, id, &cras_capture_rclient_ops,
-		cras_stream_direction_mask(CRAS_STREAM_INPUT));
-}
diff --git a/cras/src/server/cras_capture_rclient.h b/cras/src/server/cras_capture_rclient.h
deleted file mode 100644
index 129e559..0000000
--- a/cras/src/server/cras_capture_rclient.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/* Copyright 2019 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_CAPTURE_RCLIENT_H_
-#define CRAS_CAPTURE_RCLIENT_H_
-
-struct cras_rclient;
-
-/* Creates a capture rclient structure.
- * Args:
- *    fd - The file descriptor used for communication with the client.
- *    id - Unique identifier for this client.
- * Returns:
- *    A pointer to the newly created rclient on success, NULL on failure.
- */
-struct cras_rclient *cras_capture_rclient_create(int fd, size_t id);
-
-#endif /* CRAS_CAPTURE_RCLIENT_H_ */
diff --git a/cras/src/server/cras_control_rclient.c b/cras/src/server/cras_control_rclient.c
deleted file mode 100644
index cd0c4d3..0000000
--- a/cras/src/server/cras_control_rclient.c
+++ /dev/null
@@ -1,572 +0,0 @@
-/* Copyright 2019 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-#include <assert.h>
-#include <stdlib.h>
-#include <syslog.h>
-
-#include "audio_thread.h"
-#include "audio_thread_log.h"
-#include "cras_apm_list.h"
-#include "cras_bt_log.h"
-#include "cras_config.h"
-#include "cras_control_rclient.h"
-#include "cras_dsp.h"
-#include "cras_iodev.h"
-#include "cras_iodev_list.h"
-#include "cras_hfp_ag_profile.h"
-#include "cras_main_thread_log.h"
-#include "cras_messages.h"
-#include "cras_observer.h"
-#include "cras_rclient.h"
-#include "cras_rclient_util.h"
-#include "cras_rstream.h"
-#include "cras_system_state.h"
-#include "cras_types.h"
-#include "cras_util.h"
-#include "utlist.h"
-
-/* Handles dumping audio thread debug info back to the client. */
-static void dump_audio_thread_info(struct cras_rclient *client)
-{
-	struct cras_client_audio_debug_info_ready msg;
-	struct cras_server_state *state;
-
-	cras_fill_client_audio_debug_info_ready(&msg);
-	state = cras_system_state_get_no_lock();
-	audio_thread_dump_thread_info(cras_iodev_list_get_audio_thread(),
-				      &state->audio_debug_info);
-	client->ops->send_message_to_client(client, &msg.header, NULL, 0);
-}
-
-/* Sends shared memory fd for audio thread event log back to the client. */
-static void get_atlog_fd(struct cras_rclient *client)
-{
-	struct cras_client_atlog_fd_ready msg;
-	int atlog_fd;
-
-	cras_fill_client_atlog_fd_ready(&msg);
-	atlog_fd = audio_thread_event_log_shm_fd();
-	client->ops->send_message_to_client(client, &msg.header, &atlog_fd, 1);
-}
-
-/* Handles dumping audio snapshots to shared memory for the client. */
-static void dump_audio_thread_snapshots(struct cras_rclient *client)
-{
-	struct cras_client_audio_debug_info_ready msg;
-
-	cras_fill_client_audio_debug_info_ready(&msg);
-	cras_system_state_dump_snapshots();
-	client->ops->send_message_to_client(client, &msg.header, NULL, 0);
-}
-
-static void handle_get_hotword_models(struct cras_rclient *client,
-				      cras_node_id_t node_id)
-{
-	struct cras_client_get_hotword_models_ready *msg;
-	char *hotword_models;
-	unsigned hotword_models_size;
-	uint8_t buf[CRAS_CLIENT_MAX_MSG_SIZE];
-
-	msg = (struct cras_client_get_hotword_models_ready *)buf;
-	hotword_models = cras_iodev_list_get_hotword_models(node_id);
-	if (!hotword_models)
-		goto empty_reply;
-	hotword_models_size = strlen(hotword_models);
-	if (hotword_models_size > CRAS_MAX_HOTWORD_MODELS) {
-		free(hotword_models);
-		goto empty_reply;
-	}
-
-	cras_fill_client_get_hotword_models_ready(msg, hotword_models,
-						  hotword_models_size);
-	client->ops->send_message_to_client(client, &msg->header, NULL, 0);
-	free(hotword_models);
-	return;
-
-empty_reply:
-	cras_fill_client_get_hotword_models_ready(msg, NULL, 0);
-	client->ops->send_message_to_client(client, &msg->header, NULL, 0);
-}
-
-/* Client notification callback functions. */
-
-static void send_output_volume_changed(void *context, int32_t volume)
-{
-	struct cras_client_volume_changed msg;
-	struct cras_rclient *client = (struct cras_rclient *)context;
-
-	cras_fill_client_output_volume_changed(&msg, volume);
-	client->ops->send_message_to_client(client, &msg.header, NULL, 0);
-}
-
-static void send_output_mute_changed(void *context, int muted, int user_muted,
-				     int mute_locked)
-{
-	struct cras_client_mute_changed msg;
-	struct cras_rclient *client = (struct cras_rclient *)context;
-
-	cras_fill_client_output_mute_changed(&msg, muted, user_muted,
-					     mute_locked);
-	client->ops->send_message_to_client(client, &msg.header, NULL, 0);
-}
-
-static void send_capture_gain_changed(void *context, int32_t gain)
-{
-	struct cras_client_volume_changed msg;
-	struct cras_rclient *client = (struct cras_rclient *)context;
-
-	cras_fill_client_capture_gain_changed(&msg, gain);
-	client->ops->send_message_to_client(client, &msg.header, NULL, 0);
-}
-
-static void send_capture_mute_changed(void *context, int muted, int mute_locked)
-{
-	struct cras_client_mute_changed msg;
-	struct cras_rclient *client = (struct cras_rclient *)context;
-
-	cras_fill_client_capture_mute_changed(&msg, muted, mute_locked);
-	client->ops->send_message_to_client(client, &msg.header, NULL, 0);
-}
-
-static void send_nodes_changed(void *context)
-{
-	struct cras_client_nodes_changed msg;
-	struct cras_rclient *client = (struct cras_rclient *)context;
-
-	cras_fill_client_nodes_changed(&msg);
-	client->ops->send_message_to_client(client, &msg.header, NULL, 0);
-}
-
-static void send_active_node_changed(void *context,
-				     enum CRAS_STREAM_DIRECTION dir,
-				     cras_node_id_t node_id)
-{
-	struct cras_client_active_node_changed msg;
-	struct cras_rclient *client = (struct cras_rclient *)context;
-
-	cras_fill_client_active_node_changed(&msg, dir, node_id);
-	client->ops->send_message_to_client(client, &msg.header, NULL, 0);
-}
-
-static void send_output_node_volume_changed(void *context,
-					    cras_node_id_t node_id,
-					    int32_t volume)
-{
-	struct cras_client_node_value_changed msg;
-	struct cras_rclient *client = (struct cras_rclient *)context;
-
-	cras_fill_client_output_node_volume_changed(&msg, node_id, volume);
-	client->ops->send_message_to_client(client, &msg.header, NULL, 0);
-}
-
-static void send_node_left_right_swapped_changed(void *context,
-						 cras_node_id_t node_id,
-						 int swapped)
-{
-	struct cras_client_node_value_changed msg;
-	struct cras_rclient *client = (struct cras_rclient *)context;
-
-	cras_fill_client_node_left_right_swapped_changed(&msg, node_id,
-							 swapped);
-	client->ops->send_message_to_client(client, &msg.header, NULL, 0);
-}
-
-static void send_input_node_gain_changed(void *context, cras_node_id_t node_id,
-					 int32_t gain)
-{
-	struct cras_client_node_value_changed msg;
-	struct cras_rclient *client = (struct cras_rclient *)context;
-
-	cras_fill_client_input_node_gain_changed(&msg, node_id, gain);
-	client->ops->send_message_to_client(client, &msg.header, NULL, 0);
-}
-
-static void send_num_active_streams_changed(void *context,
-					    enum CRAS_STREAM_DIRECTION dir,
-					    uint32_t num_active_streams)
-{
-	struct cras_client_num_active_streams_changed msg;
-	struct cras_rclient *client = (struct cras_rclient *)context;
-
-	cras_fill_client_num_active_streams_changed(&msg, dir,
-						    num_active_streams);
-	client->ops->send_message_to_client(client, &msg.header, NULL, 0);
-}
-
-static void register_for_notification(struct cras_rclient *client,
-				      enum CRAS_CLIENT_MESSAGE_ID msg_id,
-				      int do_register)
-{
-	struct cras_observer_ops observer_ops;
-	int empty;
-
-	cras_observer_get_ops(client->observer, &observer_ops);
-
-	switch (msg_id) {
-	case CRAS_CLIENT_OUTPUT_VOLUME_CHANGED:
-		observer_ops.output_volume_changed =
-			do_register ? send_output_volume_changed : NULL;
-		break;
-	case CRAS_CLIENT_OUTPUT_MUTE_CHANGED:
-		observer_ops.output_mute_changed =
-			do_register ? send_output_mute_changed : NULL;
-		break;
-	case CRAS_CLIENT_CAPTURE_GAIN_CHANGED:
-		observer_ops.capture_gain_changed =
-			do_register ? send_capture_gain_changed : NULL;
-		break;
-	case CRAS_CLIENT_CAPTURE_MUTE_CHANGED:
-		observer_ops.capture_mute_changed =
-			do_register ? send_capture_mute_changed : NULL;
-		break;
-	case CRAS_CLIENT_NODES_CHANGED:
-		observer_ops.nodes_changed =
-			do_register ? send_nodes_changed : NULL;
-		break;
-	case CRAS_CLIENT_ACTIVE_NODE_CHANGED:
-		observer_ops.active_node_changed =
-			do_register ? send_active_node_changed : NULL;
-		break;
-	case CRAS_CLIENT_OUTPUT_NODE_VOLUME_CHANGED:
-		observer_ops.output_node_volume_changed =
-			do_register ? send_output_node_volume_changed : NULL;
-		break;
-	case CRAS_CLIENT_NODE_LEFT_RIGHT_SWAPPED_CHANGED:
-		observer_ops.node_left_right_swapped_changed =
-			do_register ? send_node_left_right_swapped_changed :
-				      NULL;
-		break;
-	case CRAS_CLIENT_INPUT_NODE_GAIN_CHANGED:
-		observer_ops.input_node_gain_changed =
-			do_register ? send_input_node_gain_changed : NULL;
-		break;
-	case CRAS_CLIENT_NUM_ACTIVE_STREAMS_CHANGED:
-		observer_ops.num_active_streams_changed =
-			do_register ? send_num_active_streams_changed : NULL;
-		break;
-	default:
-		syslog(LOG_ERR, "Invalid client notification message ID: %u",
-		       msg_id);
-		break;
-	}
-
-	empty = cras_observer_ops_are_empty(&observer_ops);
-	if (client->observer) {
-		if (empty) {
-			cras_observer_remove(client->observer);
-			client->observer = NULL;
-		} else {
-			cras_observer_set_ops(client->observer, &observer_ops);
-		}
-	} else if (!empty) {
-		client->observer = cras_observer_add(&observer_ops, client);
-	}
-}
-
-static int direction_valid(enum CRAS_STREAM_DIRECTION direction)
-{
-	return direction < CRAS_NUM_DIRECTIONS &&
-	       direction != CRAS_STREAM_UNDEFINED;
-}
-
-/* Entry point for handling a message from the client.  Called from the main
- * server context.
- *
- * If the message from clients has incorrect length (truncated message), return
- * an error up to CRAS server.
- * If the message from clients has invalid content, should return the errors to
- * clients by send_message_to_client and return 0 here.
- *
- */
-static int ccr_handle_message_from_client(struct cras_rclient *client,
-					  const struct cras_server_message *msg,
-					  int *fds, unsigned int num_fds)
-{
-	int rc = 0;
-	assert(client && msg);
-
-	rc = rclient_validate_message_fds(msg, fds, num_fds);
-	if (rc < 0) {
-		for (int i = 0; i < (int)num_fds; i++)
-			if (fds[i] >= 0)
-				close(fds[i]);
-		return rc;
-	}
-	int fd = num_fds > 0 ? fds[0] : -1;
-
-	switch (msg->id) {
-	case CRAS_SERVER_CONNECT_STREAM: {
-		int client_shm_fd = num_fds > 1 ? fds[1] : -1;
-		if (MSG_LEN_VALID(msg, struct cras_connect_message)) {
-			rclient_handle_client_stream_connect(
-				client,
-				(const struct cras_connect_message *)msg, fd,
-				client_shm_fd);
-		} else {
-			return -EINVAL;
-		}
-		break;
-	}
-	case CRAS_SERVER_DISCONNECT_STREAM:
-		if (!MSG_LEN_VALID(msg, struct cras_disconnect_stream_message))
-			return -EINVAL;
-		rclient_handle_client_stream_disconnect(
-			client,
-			(const struct cras_disconnect_stream_message *)msg);
-		break;
-	case CRAS_SERVER_SET_SYSTEM_VOLUME:
-		if (!MSG_LEN_VALID(msg, struct cras_set_system_volume))
-			return -EINVAL;
-		cras_system_set_volume(
-			((const struct cras_set_system_volume *)msg)->volume);
-		break;
-	case CRAS_SERVER_SET_SYSTEM_MUTE:
-		if (!MSG_LEN_VALID(msg, struct cras_set_system_mute))
-			return -EINVAL;
-		cras_system_set_mute(
-			((const struct cras_set_system_mute *)msg)->mute);
-		break;
-	case CRAS_SERVER_SET_USER_MUTE:
-		if (!MSG_LEN_VALID(msg, struct cras_set_system_mute))
-			return -EINVAL;
-		cras_system_set_user_mute(
-			((const struct cras_set_system_mute *)msg)->mute);
-		break;
-	case CRAS_SERVER_SET_SYSTEM_MUTE_LOCKED:
-		if (!MSG_LEN_VALID(msg, struct cras_set_system_mute))
-			return -EINVAL;
-		cras_system_set_mute_locked(
-			((const struct cras_set_system_mute *)msg)->mute);
-		break;
-	case CRAS_SERVER_SET_SYSTEM_CAPTURE_MUTE:
-		if (!MSG_LEN_VALID(msg, struct cras_set_system_mute))
-			return -EINVAL;
-		cras_system_set_capture_mute(
-			((const struct cras_set_system_mute *)msg)->mute);
-		break;
-	case CRAS_SERVER_SET_SYSTEM_CAPTURE_MUTE_LOCKED:
-		if (!MSG_LEN_VALID(msg, struct cras_set_system_mute))
-			return -EINVAL;
-		cras_system_set_capture_mute_locked(
-			((const struct cras_set_system_mute *)msg)->mute);
-		break;
-	case CRAS_SERVER_SET_NODE_ATTR: {
-		const struct cras_set_node_attr *m =
-			(const struct cras_set_node_attr *)msg;
-		if (!MSG_LEN_VALID(msg, struct cras_set_node_attr))
-			return -EINVAL;
-		cras_iodev_list_set_node_attr(m->node_id, m->attr, m->value);
-		break;
-	}
-	case CRAS_SERVER_SELECT_NODE: {
-		const struct cras_select_node *m =
-			(const struct cras_select_node *)msg;
-		if (!MSG_LEN_VALID(msg, struct cras_select_node) ||
-		    !direction_valid(m->direction))
-			return -EINVAL;
-		cras_iodev_list_select_node(m->direction, m->node_id);
-		break;
-	}
-	case CRAS_SERVER_ADD_ACTIVE_NODE: {
-		const struct cras_add_active_node *m =
-			(const struct cras_add_active_node *)msg;
-		if (!MSG_LEN_VALID(msg, struct cras_add_active_node) ||
-		    !direction_valid(m->direction))
-			return -EINVAL;
-		cras_iodev_list_add_active_node(m->direction, m->node_id);
-		break;
-	}
-	case CRAS_SERVER_RM_ACTIVE_NODE: {
-		const struct cras_rm_active_node *m =
-			(const struct cras_rm_active_node *)msg;
-		if (!MSG_LEN_VALID(msg, struct cras_rm_active_node) ||
-		    !direction_valid(m->direction))
-			return -EINVAL;
-		cras_iodev_list_rm_active_node(m->direction, m->node_id);
-		break;
-	}
-	case CRAS_SERVER_RELOAD_DSP:
-		cras_dsp_reload_ini();
-		break;
-	case CRAS_SERVER_DUMP_DSP_INFO:
-		cras_dsp_dump_info();
-		break;
-	case CRAS_SERVER_DUMP_AUDIO_THREAD:
-		dump_audio_thread_info(client);
-		break;
-	case CRAS_SERVER_GET_ATLOG_FD:
-		get_atlog_fd(client);
-		break;
-	case CRAS_SERVER_DUMP_MAIN: {
-		struct cras_client_audio_debug_info_ready msg;
-		struct cras_server_state *state;
-
-		state = cras_system_state_get_no_lock();
-		memcpy(&state->main_thread_debug_info.main_log, main_log,
-		       sizeof(struct main_thread_event_log));
-
-		cras_fill_client_audio_debug_info_ready(&msg);
-		client->ops->send_message_to_client(client, &msg.header, NULL,
-						    0);
-		break;
-	}
-	case CRAS_SERVER_DUMP_BT: {
-		struct cras_client_audio_debug_info_ready msg;
-		struct cras_server_state *state;
-
-		state = cras_system_state_get_no_lock();
-#ifdef CRAS_DBUS
-		memcpy(&state->bt_debug_info.bt_log, btlog,
-		       sizeof(struct cras_bt_event_log));
-		memcpy(&state->bt_debug_info.wbs_logger,
-		       cras_hfp_ag_get_wbs_logger(),
-		       sizeof(struct packet_status_logger));
-#else
-		memset(&state->bt_debug_info.bt_log, 0,
-		       sizeof(struct cras_bt_debug_info));
-		memset(&state->bt_debug_info.wbs_logger, 0,
-		       sizeof(struct packet_status_logger));
-#endif
-
-		cras_fill_client_audio_debug_info_ready(&msg);
-		client->ops->send_message_to_client(client, &msg.header, NULL,
-						    0);
-		break;
-	}
-	case CRAS_SERVER_SET_BT_WBS_ENABLED: {
-		const struct cras_set_bt_wbs_enabled *m =
-			(const struct cras_set_bt_wbs_enabled *)msg;
-		if (!MSG_LEN_VALID(msg, struct cras_set_bt_wbs_enabled))
-			return -EINVAL;
-		cras_system_set_bt_wbs_enabled(m->enabled);
-		break;
-	}
-	case CRAS_SERVER_DUMP_SNAPSHOTS:
-		dump_audio_thread_snapshots(client);
-		break;
-	case CRAS_SERVER_ADD_TEST_DEV: {
-		const struct cras_add_test_dev *m =
-			(const struct cras_add_test_dev *)msg;
-		if (!MSG_LEN_VALID(msg, struct cras_add_test_dev))
-			return -EINVAL;
-		cras_iodev_list_add_test_dev(m->type);
-		break;
-	}
-	case CRAS_SERVER_TEST_DEV_COMMAND: {
-		const struct cras_test_dev_command *m =
-			(const struct cras_test_dev_command *)msg;
-		if (!MSG_LEN_VALID(msg, struct cras_test_dev_command))
-			return -EINVAL;
-		cras_iodev_list_test_dev_command(
-			m->iodev_idx, (enum CRAS_TEST_IODEV_CMD)m->command,
-			m->data_len, m->data);
-		break;
-	}
-	case CRAS_SERVER_SUSPEND:
-		cras_system_set_suspended(1);
-		break;
-	case CRAS_SERVER_RESUME:
-		cras_system_set_suspended(0);
-		break;
-	case CRAS_CONFIG_GLOBAL_REMIX: {
-		const struct cras_config_global_remix *m =
-			(const struct cras_config_global_remix *)msg;
-		float *coefficient;
-
-		if (!MSG_LEN_VALID(msg, struct cras_config_global_remix) ||
-		    m->num_channels > CRAS_MAX_REMIX_CHANNELS)
-			return -EINVAL;
-		const size_t coefficient_len =
-			(size_t)m->num_channels * (size_t)m->num_channels;
-		const size_t size_with_coefficients =
-			sizeof(*m) +
-			coefficient_len * sizeof(m->coefficient[0]);
-		if (size_with_coefficients != msg->length)
-			return -EINVAL;
-
-		coefficient =
-			(float *)calloc(coefficient_len, sizeof(coefficient));
-		if (!coefficient) {
-			syslog(LOG_ERR,
-			       "Failed to create local coefficient array.");
-			break;
-		}
-		memcpy(coefficient, m->coefficient,
-		       coefficient_len * sizeof(coefficient));
-
-		audio_thread_config_global_remix(
-			cras_iodev_list_get_audio_thread(), m->num_channels,
-			coefficient);
-		free(coefficient);
-		break;
-	}
-	case CRAS_SERVER_GET_HOTWORD_MODELS: {
-		if (!MSG_LEN_VALID(msg, struct cras_get_hotword_models))
-			return -EINVAL;
-		handle_get_hotword_models(
-			client,
-			((const struct cras_get_hotword_models *)msg)->node_id);
-		break;
-	}
-	case CRAS_SERVER_SET_HOTWORD_MODEL: {
-		const struct cras_set_hotword_model *m =
-			(const struct cras_set_hotword_model *)msg;
-		if (!MSG_LEN_VALID(msg, struct cras_set_hotword_model))
-			return -EINVAL;
-		cras_iodev_list_set_hotword_model(m->node_id, m->model_name);
-		break;
-	}
-	case CRAS_SERVER_REGISTER_NOTIFICATION: {
-		const struct cras_register_notification *m =
-			(struct cras_register_notification *)msg;
-		if (!MSG_LEN_VALID(msg, struct cras_register_notification))
-			return -EINVAL;
-		register_for_notification(
-			client, (enum CRAS_CLIENT_MESSAGE_ID)m->msg_id,
-			m->do_register);
-		break;
-	}
-	case CRAS_SERVER_SET_AEC_DUMP: {
-		const struct cras_set_aec_dump *m =
-			(const struct cras_set_aec_dump *)msg;
-		if (!MSG_LEN_VALID(msg, struct cras_set_aec_dump))
-			return -EINVAL;
-		audio_thread_set_aec_dump(cras_iodev_list_get_audio_thread(),
-					  m->stream_id, m->start, fd);
-		break;
-	}
-	case CRAS_SERVER_RELOAD_AEC_CONFIG:
-		cras_apm_list_reload_aec_config();
-		break;
-	default:
-		break;
-	}
-
-	return 0;
-}
-
-/* Declarations of cras_rclient operators for cras_control_rclient. */
-static const struct cras_rclient_ops cras_control_rclient_ops = {
-	.handle_message_from_client = ccr_handle_message_from_client,
-	.send_message_to_client = rclient_send_message_to_client,
-	.destroy = rclient_destroy,
-};
-
-/*
- * Exported Functions.
- */
-
-/* Creates a client structure and sends a message back informing the client that
- * the conneciton has succeeded. */
-struct cras_rclient *cras_control_rclient_create(int fd, size_t id)
-{
-	/* Supports all directions but not CRAS_STREAM_UNDEFINED. */
-	int supported_directions =
-		CRAS_STREAM_ALL_DIRECTION ^
-		cras_stream_direction_mask(CRAS_STREAM_UNDEFINED);
-
-	return rclient_generic_create(fd, id, &cras_control_rclient_ops,
-				      supported_directions);
-}
diff --git a/cras/src/server/cras_control_rclient.h b/cras/src/server/cras_control_rclient.h
deleted file mode 100644
index d654df5..0000000
--- a/cras/src/server/cras_control_rclient.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/* Copyright 2019 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_CONTROL_RCLIENT_H_
-#define CRAS_CONTROL_RCLIENT_H_
-
-struct cras_rclient;
-
-/* Creates a control rclient structure.
- * Args:
- *    fd - The file descriptor used for communication with the client.
- *    id - Unique identifier for this client.
- * Returns:
- *    A pointer to the newly created rclient on success, NULL on failure.
- */
-struct cras_rclient *cras_control_rclient_create(int fd, size_t id);
-
-#endif /* CRAS_CONTROL_RCLIENT_H_ */
diff --git a/cras/src/server/cras_dbus.c b/cras/src/server/cras_dbus.c
deleted file mode 100644
index 5975f1c..0000000
--- a/cras/src/server/cras_dbus.c
+++ /dev/null
@@ -1,184 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <dbus/dbus.h>
-#include <errno.h>
-#include <poll.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <syslog.h>
-#include <sys/select.h>
-#include <unistd.h>
-
-#include "cras_system_state.h"
-#include "cras_tm.h"
-
-static void dbus_watch_callback(void *arg, int revents)
-{
-	DBusWatch *watch = (DBusWatch *)arg;
-	int r, flags;
-	struct pollfd pollfd;
-
-	pollfd.fd = dbus_watch_get_unix_fd(watch);
-	pollfd.events = POLLIN | POLLOUT;
-
-	r = poll(&pollfd, 1, 0);
-	if (r <= 0)
-		return;
-
-	flags = 0;
-	if (pollfd.revents & POLLIN)
-		flags |= DBUS_WATCH_READABLE;
-	if (pollfd.revents & POLLOUT)
-		flags |= DBUS_WATCH_WRITABLE;
-
-	if (!dbus_watch_handle(watch, flags))
-		syslog(LOG_WARNING, "Failed to handle D-Bus watch.");
-}
-
-static dbus_bool_t dbus_watch_add(DBusWatch *watch, void *data)
-{
-	int r;
-	unsigned int flags = dbus_watch_get_flags(watch);
-
-	/* Only select the read watch.
-	 * TODO(hychao): select on write watch when we have a use case.
-	 */
-	if ((flags & DBUS_WATCH_READABLE) && dbus_watch_get_enabled(watch)) {
-		r = cras_system_add_select_fd(dbus_watch_get_unix_fd(watch),
-					      dbus_watch_callback, watch,
-					      POLLIN);
-		if (r != 0)
-			return FALSE;
-	}
-
-	return TRUE;
-}
-
-static void dbus_watch_remove(DBusWatch *watch, void *data)
-{
-	unsigned int flags = dbus_watch_get_flags(watch);
-
-	/* Only select the read watch. */
-	if (flags & DBUS_WATCH_READABLE)
-		cras_system_rm_select_fd(dbus_watch_get_unix_fd(watch));
-}
-
-static void dbus_watch_toggled(DBusWatch *watch, void *data)
-{
-	if (dbus_watch_get_enabled(watch)) {
-		dbus_watch_add(watch, NULL);
-	} else {
-		dbus_watch_remove(watch, NULL);
-	}
-}
-
-static void dbus_timeout_callback(struct cras_timer *t, void *data)
-{
-	struct cras_tm *tm = cras_system_state_get_tm();
-	struct DBusTimeout *timeout = data;
-
-	/* Timer is automatically removed after it fires.  Add a new one so this
-	 * fires until it is removed by dbus. */
-	t = cras_tm_create_timer(tm, dbus_timeout_get_interval(timeout),
-				 dbus_timeout_callback, timeout);
-	dbus_timeout_set_data(timeout, t, NULL);
-
-	if (!dbus_timeout_handle(timeout))
-		syslog(LOG_WARNING, "Failed to handle D-Bus timeout.");
-}
-
-static dbus_bool_t dbus_timeout_add(DBusTimeout *timeout, void *arg)
-{
-	struct cras_tm *tm = cras_system_state_get_tm();
-	struct cras_timer *t = dbus_timeout_get_data(timeout);
-
-	if (t) {
-		dbus_timeout_set_data(timeout, NULL, NULL);
-		cras_tm_cancel_timer(tm, t);
-	}
-
-	if (dbus_timeout_get_enabled(timeout)) {
-		t = cras_tm_create_timer(tm, dbus_timeout_get_interval(timeout),
-					 dbus_timeout_callback, timeout);
-		dbus_timeout_set_data(timeout, t, NULL);
-		if (t == NULL)
-			return FALSE;
-	}
-
-	return TRUE;
-}
-
-static void dbus_timeout_remove(DBusTimeout *timeout, void *arg)
-{
-	struct cras_tm *tm = cras_system_state_get_tm();
-	struct cras_timer *t = dbus_timeout_get_data(timeout);
-
-	if (t) {
-		dbus_timeout_set_data(timeout, NULL, NULL);
-		cras_tm_cancel_timer(tm, t);
-	}
-}
-
-static void dbus_timeout_toggled(DBusTimeout *timeout, void *arg)
-{
-	if (dbus_timeout_get_enabled(timeout))
-		dbus_timeout_add(timeout, NULL);
-	else
-		dbus_timeout_remove(timeout, NULL);
-}
-
-DBusConnection *cras_dbus_connect_system_bus()
-{
-	DBusError dbus_error;
-	DBusConnection *conn;
-	int rc;
-
-	dbus_error_init(&dbus_error);
-
-	conn = dbus_bus_get(DBUS_BUS_SYSTEM, &dbus_error);
-	if (!conn) {
-		syslog(LOG_WARNING, "Failed to connect to D-Bus: %s",
-		       dbus_error.message);
-		dbus_error_free(&dbus_error);
-		return NULL;
-	}
-
-	/* Request a name on the bus. */
-	rc = dbus_bus_request_name(conn, "org.chromium.cras", 0, &dbus_error);
-	if (dbus_error_is_set(&dbus_error)) {
-		syslog(LOG_ERR, "Requesting dbus name %s", dbus_error.message);
-		dbus_error_free(&dbus_error);
-	}
-	if (rc != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER)
-		syslog(LOG_ERR, "Not primary owner of dbus name.");
-
-	if (!dbus_connection_set_watch_functions(
-		    conn, dbus_watch_add, dbus_watch_remove, dbus_watch_toggled,
-		    NULL, NULL))
-		goto error;
-	if (!dbus_connection_set_timeout_functions(
-		    conn, dbus_timeout_add, dbus_timeout_remove,
-		    dbus_timeout_toggled, NULL, NULL))
-		goto error;
-
-	return conn;
-
-error:
-	syslog(LOG_WARNING, "Failed to setup D-Bus connection.");
-	dbus_connection_unref(conn);
-	return NULL;
-}
-
-void cras_dbus_dispatch(DBusConnection *conn)
-{
-	while (dbus_connection_dispatch(conn) == DBUS_DISPATCH_DATA_REMAINS)
-		;
-}
-
-void cras_dbus_disconnect_system_bus(DBusConnection *conn)
-{
-	dbus_connection_unref(conn);
-}
diff --git a/cras/src/server/cras_dbus.h b/cras/src/server/cras_dbus.h
deleted file mode 100644
index 35014ed..0000000
--- a/cras/src/server/cras_dbus.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_DBUS_H_
-#define CRAS_DBUS_H_
-
-#include <dbus/dbus.h>
-
-/* Establish connection to the D-Bus System Bus. */
-DBusConnection *cras_dbus_connect_system_bus();
-
-/* Dispatch pending incoming and outgoing messages.
- *
- * This function must be called from the main loop to dispatch any
- * pending incoming and outgoing messages to the appropriate registered
- * object handler functions or filter functions - including those internal
- * to libdbus.
- *
- * It does nothing if there are no pending messages.
- */
-void cras_dbus_dispatch(DBusConnection *conn);
-
-/* Disconnect from the D-Bus System Bus. */
-void cras_dbus_disconnect_system_bus(DBusConnection *conn);
-
-#endif /* CRAS_DBUS_H_ */
diff --git a/cras/src/server/cras_dbus_control.c b/cras/src/server/cras_dbus_control.c
deleted file mode 100644
index b66e127..0000000
--- a/cras/src/server/cras_dbus_control.c
+++ /dev/null
@@ -1,1532 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <dbus/dbus.h>
-#include <errno.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <string.h>
-#include <syslog.h>
-
-#include "audio_thread.h"
-#include "cras_bt_player.h"
-#include "cras_dbus.h"
-#include "cras_dbus_control.h"
-#include "cras_dbus_util.h"
-#include "cras_hfp_ag_profile.h"
-#include "cras_iodev_list.h"
-#include "cras_main_thread_log.h"
-#include "cras_observer.h"
-#include "cras_system_state.h"
-#include "cras_utf8.h"
-#include "cras_util.h"
-#include "utlist.h"
-
-#define CRAS_CONTROL_INTERFACE "org.chromium.cras.Control"
-#define CRAS_ROOT_OBJECT_PATH "/org/chromium/cras"
-#define CONTROL_INTROSPECT_XML                                                  \
-	DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE                               \
-	"<node>\n"                                                              \
-	"  <interface name=\"" CRAS_CONTROL_INTERFACE "\">\n"                   \
-	"    <method name=\"SetOutputVolume\">\n"                               \
-	"      <arg name=\"volume\" type=\"i\" direction=\"in\"/>\n"            \
-	"    </method>\n"                                                       \
-	"    <method name=\"SetOutputNodeVolume\">\n"                           \
-	"      <arg name=\"node_id\" type=\"t\" direction=\"in\"/>\n"           \
-	"      <arg name=\"volume\" type=\"i\" direction=\"in\"/>\n"            \
-	"    </method>\n"                                                       \
-	"    <method name=\"SwapLeftRight\">\n"                                 \
-	"      <arg name=\"node_id\" type=\"t\" direction=\"in\"/>\n"           \
-	"      <arg name=\"swap\" type=\"b\" direction=\"in\"/>\n"              \
-	"    </method>\n"                                                       \
-	"    <method name=\"SetOutputMute\">\n"                                 \
-	"      <arg name=\"mute_on\" type=\"b\" direction=\"in\"/>\n"           \
-	"    </method>\n"                                                       \
-	"    <method name=\"SetOutputUserMute\">\n"                             \
-	"      <arg name=\"mute_on\" type=\"b\" direction=\"in\"/>\n"           \
-	"    </method>\n"                                                       \
-	"    <method name=\"SetSuspendAudio\">\n"                               \
-	"      <arg name=\"suspend\" type=\"b\" direction=\"in\"/>\n"           \
-	"    </method>\n"                                                       \
-	"    <method name=\"SetInputNodeGain\">\n"                              \
-	"      <arg name=\"node_id\" type=\"t\" direction=\"in\"/>\n"           \
-	"      <arg name=\"gain\" type=\"i\" direction=\"in\"/>\n"              \
-	"    </method>\n"                                                       \
-	"    <method name=\"SetInputMute\">\n"                                  \
-	"      <arg name=\"mute_on\" type=\"b\" direction=\"in\"/>\n"           \
-	"    </method>\n"                                                       \
-	"    <method name=\"GetVolumeState\">\n"                                \
-	"      <arg name=\"output_volume\" type=\"i\" direction=\"out\"/>\n"    \
-	"      <arg name=\"output_mute\" type=\"b\" direction=\"out\"/>\n"      \
-	"      <arg name=\"input_mute\" type=\"b\" direction=\"out\"/>\n"       \
-	"      <arg name=\"output_user_mute\" type=\"b\" direction=\"out\"/>\n" \
-	"    </method>\n"                                                       \
-	"    <method name=\"GetDefaultOutputBufferSize\">\n"                    \
-	"      <arg name=\"buffer_size\" type=\"i\" direction=\"out\"/>\n"      \
-	"    </method>\n"                                                       \
-	"    <method name=\"GetNodes\">\n"                                      \
-	"      <arg name=\"nodes\" type=\"a{sv}\" direction=\"out\"/>\n"        \
-	"    </method>\n"                                                       \
-	"    <method name=\"GetSystemAecSupported\">\n"                         \
-	"      <arg name=\"supported\" type=\"b\" direction=\"out\"/>\n"        \
-	"    </method>\n"                                                       \
-	"    <method name=\"GetSystemAecGroupId\">\n"                           \
-	"      <arg name=\"group_id\" type=\"i\" direction=\"out\"/>\n"         \
-	"    </method>\n"                                                       \
-	"    <method name=\"GetDeprioritizeBtWbsMic\">\n"                       \
-	"      <arg name=\"deprioritized\" type=\"b\" direction=\"out\"/>\n"    \
-	"    </method>\n"                                                       \
-	"    <method name=\"SetActiveOutputNode\">\n"                           \
-	"      <arg name=\"node_id\" type=\"t\" direction=\"in\"/>\n"           \
-	"    </method>\n"                                                       \
-	"    <method name=\"SetActiveInputNode\">\n"                            \
-	"      <arg name=\"node_id\" type=\"t\" direction=\"in\"/>\n"           \
-	"    </method>\n"                                                       \
-	"    <method name=\"AddActiveInputNode\">\n"                            \
-	"      <arg name=\"node_id\" type=\"t\" direction=\"in\"/>\n"           \
-	"    </method>\n"                                                       \
-	"    <method name=\"AddActiveOutputNode\">\n"                           \
-	"      <arg name=\"node_id\" type=\"t\" direction=\"in\"/>\n"           \
-	"    </method>\n"                                                       \
-	"    <method name=\"RemoveActiveInputNode\">\n"                         \
-	"      <arg name=\"node_id\" type=\"t\" direction=\"in\"/>\n"           \
-	"    </method>\n"                                                       \
-	"    <method name=\"RemoveActiveOutputNode\">\n"                        \
-	"      <arg name=\"node_id\" type=\"t\" direction=\"in\"/>\n"           \
-	"    </method>\n"                                                       \
-	"    <method name=\"SetFixA2dpPacketSize\">\n"                          \
-	"      <arg name=\"toggle\" type=\"b\" direction=\"in\"/>\n"            \
-	"    </method>\n"                                                       \
-	"    <method name=\"GetNumberOfActiveStreams\">\n"                      \
-	"      <arg name=\"num\" type=\"i\" direction=\"out\"/>\n"              \
-	"    </method>\n"                                                       \
-	"    <method name=\"GetNumberOfActiveOutputStreams\">\n"                \
-	"      <arg name=\"num\" type=\"i\" direction=\"out\"/>\n"              \
-	"    </method>\n"                                                       \
-	"    <method name=\"GetNumberOfActiveInputStreams\">\n"                 \
-	"      <arg name=\"num\" type=\"i\" direction=\"out\"/>\n"              \
-	"    </method>\n"                                                       \
-	"    <method name=\"GetNumberOfInputStreamsWithPermission\">\n"         \
-	"      <arg name=\"num\" type=\"a{sv}\" direction=\"out\"/>\n"          \
-	"    </method>\n"                                                       \
-	"    <method name=\"SetGlobalOutputChannelRemix\">\n"                   \
-	"      <arg name=\"num_channels\" type=\"i\" direction=\"in\"/>\n"      \
-	"      <arg name=\"coefficient\" type=\"ad\" direction=\"in\"/>\n"      \
-	"    </method>\n"                                                       \
-	"    <method name=\"SetHotwordModel\">\n"                               \
-	"      <arg name=\"node_id\" type=\"t\" direction=\"in\"/>\n"           \
-	"      <arg name=\"model_name\" type=\"s\" direction=\"in\"/>\n"        \
-	"    </method>\n"                                                       \
-	"    <method name=\"IsAudioOutputActive\">\n"                           \
-	"      <arg name=\"active\" type=\"b\" direction=\"out\"/>\n"           \
-	"    </method>\n"                                                       \
-	"    <method name=\"SetWbsEnabled\">\n"                                 \
-	"      <arg name=\"enabled\" type=\"b\" direction=\"in\"/>\n"           \
-	"    </method>\n"                                                       \
-	"    <method name=\"SetNoiseCancellationEnabled\">\n"                   \
-	"      <arg name=\"enabled\" type=\"b\" direction=\"in\"/>\n"           \
-	"    </method>\n"                                                       \
-	"    <method name=\"SetPlayerPlaybackStatus\">\n"                       \
-	"      <arg name=\"status\" type=\"s\" direction=\"in\"/>\n"            \
-	"    </method>\n"                                                       \
-	"    <method name=\"SetPlayerIdentity\">\n"                             \
-	"      <arg name=\"identity\" type=\"s\" direction=\"in\"/>\n"          \
-	"    </method>\n"                                                       \
-	"    <method name=\"SetPlayerPosition\">\n"                             \
-	"      <arg name=\"position\" type=\"x\" direction=\"in\"/>\n"          \
-	"    </method>\n"                                                       \
-	"    <method name=\"SetPlayerMetadata\">\n"                             \
-	"      <arg name=\"metadata\" type=\"a{sv}\" direction=\"in\"/>\n"      \
-	"    </method>\n"                                                       \
-	"  </interface>\n"                                                      \
-	"  <interface name=\"" DBUS_INTERFACE_INTROSPECTABLE "\">\n"            \
-	"    <method name=\"Introspect\">\n"                                    \
-	"      <arg name=\"data\" type=\"s\" direction=\"out\"/>\n"             \
-	"    </method>\n"                                                       \
-	"  </interface>\n"                                                      \
-	"</node>\n"
-
-struct cras_dbus_control {
-	DBusConnection *conn;
-	struct cras_observer_client *observer;
-};
-static struct cras_dbus_control dbus_control;
-
-/* helper to extract a single argument from a DBus message. */
-static int get_single_arg(DBusMessage *message, int dbus_type, void *arg)
-{
-	DBusError dbus_error;
-
-	dbus_error_init(&dbus_error);
-
-	if (!dbus_message_get_args(message, &dbus_error, dbus_type, arg,
-				   DBUS_TYPE_INVALID)) {
-		syslog(LOG_WARNING, "Bad method received: %s",
-		       dbus_error.message);
-		dbus_error_free(&dbus_error);
-		return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-	}
-
-	return 0;
-}
-
-static bool get_string_metadata(DBusMessageIter *iter, const char **dst)
-{
-	if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_STRING)
-		return FALSE;
-
-	dbus_message_iter_get_basic(iter, dst);
-	return TRUE;
-}
-
-static bool get_int64_metadata(DBusMessageIter *iter, dbus_int64_t *dst)
-{
-	if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_INT64)
-		return FALSE;
-
-	dbus_message_iter_get_basic(iter, dst);
-	return TRUE;
-}
-
-static bool get_metadata(DBusMessage *message, const char **title,
-			 const char **artist, const char **album,
-			 dbus_int64_t *length)
-{
-	DBusError dbus_error;
-	DBusMessageIter iter, dict;
-
-	dbus_error_init(&dbus_error);
-	dbus_message_iter_init(message, &iter);
-
-	if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY)
-		return FALSE;
-
-	dbus_message_iter_recurse(&iter, &dict);
-
-	while (dbus_message_iter_get_arg_type(&dict) != DBUS_TYPE_INVALID) {
-		DBusMessageIter entry, var;
-		const char *key;
-
-		if (dbus_message_iter_get_arg_type(&dict) !=
-		    DBUS_TYPE_DICT_ENTRY)
-			return FALSE;
-
-		dbus_message_iter_recurse(&dict, &entry);
-		if (dbus_message_iter_get_arg_type(&entry) != DBUS_TYPE_STRING)
-			return FALSE;
-
-		dbus_message_iter_get_basic(&entry, &key);
-		dbus_message_iter_next(&entry);
-
-		if (dbus_message_iter_get_arg_type(&entry) != DBUS_TYPE_VARIANT)
-			return FALSE;
-
-		dbus_message_iter_recurse(&entry, &var);
-		if (strcasecmp(key, "title") == 0) {
-			if (!get_string_metadata(&var, title))
-				return FALSE;
-		} else if (strcasecmp(key, "artist") == 0) {
-			if (!get_string_metadata(&var, artist))
-				return FALSE;
-		} else if (strcasecmp(key, "album") == 0) {
-			if (!get_string_metadata(&var, album))
-				return FALSE;
-		} else if (strcasecmp(key, "length") == 0) {
-			if (!get_int64_metadata(&var, length))
-				return FALSE;
-		} else
-			syslog(LOG_WARNING, "%s not supported, ignoring", key);
-
-		dbus_message_iter_next(&dict);
-	}
-
-	return TRUE;
-}
-
-/* Helper to send an empty reply. */
-static void send_empty_reply(DBusConnection *conn, DBusMessage *message)
-{
-	DBusMessage *reply;
-	dbus_uint32_t serial = 0;
-
-	reply = dbus_message_new_method_return(message);
-	if (!reply)
-		return;
-
-	dbus_connection_send(conn, reply, &serial);
-
-	dbus_message_unref(reply);
-}
-
-/* Helper to send an int32 reply. */
-static void send_int32_reply(DBusConnection *conn, DBusMessage *message,
-			     dbus_int32_t value)
-{
-	DBusMessage *reply;
-	dbus_uint32_t serial = 0;
-
-	reply = dbus_message_new_method_return(message);
-	if (!reply)
-		return;
-
-	dbus_message_append_args(reply, DBUS_TYPE_INT32, &value,
-				 DBUS_TYPE_INVALID);
-	dbus_connection_send(conn, reply, &serial);
-
-	dbus_message_unref(reply);
-}
-
-/* Handlers for exported DBus method calls. */
-static DBusHandlerResult
-handle_set_output_volume(DBusConnection *conn, DBusMessage *message, void *arg)
-{
-	int rc;
-	dbus_int32_t new_vol;
-
-	rc = get_single_arg(message, DBUS_TYPE_INT32, &new_vol);
-	if (rc)
-		return rc;
-
-	cras_system_set_volume(new_vol);
-
-	send_empty_reply(conn, message);
-
-	return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult handle_set_output_node_volume(DBusConnection *conn,
-						       DBusMessage *message,
-						       void *arg)
-{
-	dbus_int32_t new_vol;
-	cras_node_id_t id;
-	DBusError dbus_error;
-
-	dbus_error_init(&dbus_error);
-
-	if (!dbus_message_get_args(message, &dbus_error, DBUS_TYPE_UINT64, &id,
-				   DBUS_TYPE_INT32, &new_vol,
-				   DBUS_TYPE_INVALID)) {
-		syslog(LOG_WARNING, "Bad method received: %s",
-		       dbus_error.message);
-		dbus_error_free(&dbus_error);
-		return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-	}
-
-	cras_iodev_list_set_node_attr(id, IONODE_ATTR_VOLUME, new_vol);
-
-	send_empty_reply(conn, message);
-
-	return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult handle_swap_left_right(DBusConnection *conn,
-						DBusMessage *message, void *arg)
-{
-	cras_node_id_t id;
-	dbus_bool_t swap;
-	DBusError dbus_error;
-
-	dbus_error_init(&dbus_error);
-
-	if (!dbus_message_get_args(message, &dbus_error, DBUS_TYPE_UINT64, &id,
-				   DBUS_TYPE_BOOLEAN, &swap,
-				   DBUS_TYPE_INVALID)) {
-		syslog(LOG_WARNING, "Bad method received: %s",
-		       dbus_error.message);
-		dbus_error_free(&dbus_error);
-		return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-	}
-
-	cras_iodev_list_set_node_attr(id, IONODE_ATTR_SWAP_LEFT_RIGHT, swap);
-
-	send_empty_reply(conn, message);
-
-	return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult handle_set_output_mute(DBusConnection *conn,
-						DBusMessage *message, void *arg)
-{
-	int rc;
-	dbus_bool_t new_mute;
-
-	rc = get_single_arg(message, DBUS_TYPE_BOOLEAN, &new_mute);
-	if (rc)
-		return rc;
-
-	cras_system_set_mute(new_mute);
-
-	send_empty_reply(conn, message);
-
-	return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult handle_set_output_user_mute(DBusConnection *conn,
-						     DBusMessage *message,
-						     void *arg)
-{
-	int rc;
-	dbus_bool_t new_mute;
-
-	rc = get_single_arg(message, DBUS_TYPE_BOOLEAN, &new_mute);
-	if (rc)
-		return rc;
-
-	cras_system_set_user_mute(new_mute);
-	MAINLOG(main_log, MAIN_THREAD_SET_OUTPUT_USER_MUTE, new_mute, 0, 0);
-
-	send_empty_reply(conn, message);
-
-	return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult
-handle_set_suspend_audio(DBusConnection *conn, DBusMessage *message, void *arg)
-{
-	int rc;
-	dbus_bool_t suspend;
-	rc = get_single_arg(message, DBUS_TYPE_BOOLEAN, &suspend);
-	if (rc)
-		return rc;
-
-	cras_system_set_suspended(suspend);
-
-	send_empty_reply(conn, message);
-
-	return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult handle_set_input_node_gain(DBusConnection *conn,
-						    DBusMessage *message,
-						    void *arg)
-{
-	dbus_int32_t new_gain;
-	cras_node_id_t id;
-	DBusError dbus_error;
-
-	dbus_error_init(&dbus_error);
-
-	if (!dbus_message_get_args(message, &dbus_error, DBUS_TYPE_UINT64, &id,
-				   DBUS_TYPE_INT32, &new_gain,
-				   DBUS_TYPE_INVALID)) {
-		syslog(LOG_WARNING, "Bad method received: %s",
-		       dbus_error.message);
-		dbus_error_free(&dbus_error);
-		return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-	}
-
-	cras_iodev_list_set_node_attr(id, IONODE_ATTR_CAPTURE_GAIN, new_gain);
-
-	send_empty_reply(conn, message);
-
-	return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult handle_set_input_mute(DBusConnection *conn,
-					       DBusMessage *message, void *arg)
-{
-	int rc;
-	dbus_bool_t new_mute;
-
-	rc = get_single_arg(message, DBUS_TYPE_BOOLEAN, &new_mute);
-	if (rc)
-		return rc;
-
-	cras_system_set_capture_mute(new_mute);
-
-	send_empty_reply(conn, message);
-
-	return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult
-handle_get_volume_state(DBusConnection *conn, DBusMessage *message, void *arg)
-{
-	DBusMessage *reply;
-	dbus_uint32_t serial = 0;
-	dbus_int32_t volume;
-	dbus_bool_t system_muted;
-	dbus_bool_t user_muted;
-	dbus_bool_t capture_muted;
-
-	reply = dbus_message_new_method_return(message);
-
-	volume = cras_system_get_volume();
-	system_muted = cras_system_get_system_mute();
-	user_muted = cras_system_get_user_mute();
-	capture_muted = cras_system_get_capture_mute();
-
-	dbus_message_append_args(reply, DBUS_TYPE_INT32, &volume,
-				 DBUS_TYPE_BOOLEAN, &system_muted,
-				 DBUS_TYPE_BOOLEAN, &capture_muted,
-				 DBUS_TYPE_BOOLEAN, &user_muted,
-				 DBUS_TYPE_INVALID);
-
-	dbus_connection_send(conn, reply, &serial);
-
-	dbus_message_unref(reply);
-
-	return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult
-handle_get_default_output_buffer_size(DBusConnection *conn,
-				      DBusMessage *message, void *arg)
-{
-	DBusMessage *reply;
-	dbus_uint32_t serial = 0;
-	dbus_int32_t buffer_size;
-
-	reply = dbus_message_new_method_return(message);
-
-	buffer_size = cras_system_get_default_output_buffer_size();
-	dbus_message_append_args(reply, DBUS_TYPE_INT32, &buffer_size,
-				 DBUS_TYPE_INVALID);
-
-	dbus_connection_send(conn, reply, &serial);
-
-	dbus_message_unref(reply);
-
-	return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-/* Appends the information about a node to the dbus message. Returns
- * false if not enough memory. */
-static dbus_bool_t append_node_dict(DBusMessageIter *iter,
-				    const struct cras_iodev_info *dev,
-				    const struct cras_ionode_info *node,
-				    enum CRAS_STREAM_DIRECTION direction)
-{
-	DBusMessageIter dict;
-	dbus_bool_t is_input;
-	dbus_uint64_t id;
-	const char *dev_name = dev->name;
-	dbus_uint64_t stable_dev_id = node->stable_id;
-	const char *node_type = node->type;
-	const char *node_name = node->name;
-	dbus_bool_t active;
-	dbus_uint64_t plugged_time = node->plugged_time.tv_sec * 1000000ULL +
-				     node->plugged_time.tv_usec;
-	dbus_uint64_t node_volume = node->volume;
-	dbus_int64_t node_capture_gain = node->capture_gain;
-	char *models, *empty_models = "";
-
-	is_input = (direction == CRAS_STREAM_INPUT);
-	id = node->iodev_idx;
-	id = (id << 32) | node->ionode_idx;
-	active = !!node->active;
-
-	// If dev_name is not utf8, libdbus may abort cras.
-	if (!is_utf8_string(dev_name)) {
-		syslog(LOG_ERR,
-		       "Non-utf8 device name '%s' cannot be sent via dbus",
-		       dev_name);
-		dev_name = "";
-	}
-
-	if (!dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY, "{sv}",
-					      &dict))
-		return FALSE;
-	if (!append_key_value(&dict, "IsInput", DBUS_TYPE_BOOLEAN,
-			      DBUS_TYPE_BOOLEAN_AS_STRING, &is_input))
-		return FALSE;
-	if (!append_key_value(&dict, "Id", DBUS_TYPE_UINT64,
-			      DBUS_TYPE_UINT64_AS_STRING, &id))
-		return FALSE;
-	if (!append_key_value(&dict, "DeviceName", DBUS_TYPE_STRING,
-			      DBUS_TYPE_STRING_AS_STRING, &dev_name))
-		return FALSE;
-	/*
-	 * If stable id migration is needed, use key 'StableDeviceIdNew'
-	 * together with 'StableDeviceId'.
-	 */
-	if (!append_key_value(&dict, "StableDeviceId", DBUS_TYPE_UINT64,
-			      DBUS_TYPE_UINT64_AS_STRING, &stable_dev_id))
-		return FALSE;
-	if (!append_key_value(&dict, "Type", DBUS_TYPE_STRING,
-			      DBUS_TYPE_STRING_AS_STRING, &node_type))
-		return FALSE;
-	if (!append_key_value(&dict, "Name", DBUS_TYPE_STRING,
-			      DBUS_TYPE_STRING_AS_STRING, &node_name))
-		return FALSE;
-	if (!append_key_value(&dict, "Active", DBUS_TYPE_BOOLEAN,
-			      DBUS_TYPE_BOOLEAN_AS_STRING, &active))
-		return FALSE;
-	if (!append_key_value(&dict, "PluggedTime", DBUS_TYPE_UINT64,
-			      DBUS_TYPE_UINT64_AS_STRING, &plugged_time))
-		return FALSE;
-	if (!append_key_value(&dict, "NodeVolume", DBUS_TYPE_UINT64,
-			      DBUS_TYPE_UINT64_AS_STRING, &node_volume))
-		return FALSE;
-	if (!append_key_value(&dict, "NodeCaptureGain", DBUS_TYPE_INT64,
-			      DBUS_TYPE_INT64_AS_STRING, &node_capture_gain))
-		return FALSE;
-
-	models = cras_iodev_list_get_hotword_models(id);
-	if (!append_key_value(&dict, "HotwordModels", DBUS_TYPE_STRING,
-			      DBUS_TYPE_STRING_AS_STRING,
-			      models ? &models : &empty_models)) {
-		free(models);
-		return FALSE;
-	}
-	free(models);
-
-	if (!dbus_message_iter_close_container(iter, &dict))
-		return FALSE;
-
-	return TRUE;
-}
-
-/* Appends the information about all nodes in a given direction. Returns false
- * if not enough memory. */
-static dbus_bool_t append_nodes(enum CRAS_STREAM_DIRECTION direction,
-				DBusMessageIter *array)
-{
-	const struct cras_iodev_info *devs;
-	const struct cras_ionode_info *nodes;
-	int ndevs, nnodes;
-	int i, j;
-
-	if (direction == CRAS_STREAM_OUTPUT) {
-		ndevs = cras_system_state_get_output_devs(&devs);
-		nnodes = cras_system_state_get_output_nodes(&nodes);
-	} else {
-		ndevs = cras_system_state_get_input_devs(&devs);
-		nnodes = cras_system_state_get_input_nodes(&nodes);
-	}
-
-	for (i = 0; i < nnodes; i++) {
-		/* Don't reply unplugged nodes. */
-		if (!nodes[i].plugged)
-			continue;
-		/* Find the device for this node. */
-		for (j = 0; j < ndevs; j++)
-			if (devs[j].idx == nodes[i].iodev_idx)
-				break;
-		if (j == ndevs)
-			continue;
-		/* Send information about this node. */
-		if (!append_node_dict(array, &devs[j], &nodes[i], direction))
-			return FALSE;
-	}
-
-	return TRUE;
-}
-
-static DBusHandlerResult handle_get_nodes(DBusConnection *conn,
-					  DBusMessage *message, void *arg)
-{
-	DBusMessage *reply;
-	DBusMessageIter array;
-	dbus_uint32_t serial = 0;
-
-	reply = dbus_message_new_method_return(message);
-	dbus_message_iter_init_append(reply, &array);
-	if (!append_nodes(CRAS_STREAM_OUTPUT, &array))
-		return DBUS_HANDLER_RESULT_NEED_MEMORY;
-	if (!append_nodes(CRAS_STREAM_INPUT, &array))
-		return DBUS_HANDLER_RESULT_NEED_MEMORY;
-	dbus_connection_send(conn, reply, &serial);
-	dbus_message_unref(reply);
-
-	return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult handle_get_system_aec_supported(DBusConnection *conn,
-							 DBusMessage *message,
-							 void *arg)
-{
-	DBusMessage *reply;
-	dbus_uint32_t serial = 0;
-	dbus_bool_t system_aec_supported;
-
-	reply = dbus_message_new_method_return(message);
-
-	system_aec_supported = cras_system_get_aec_supported();
-	dbus_message_append_args(reply, DBUS_TYPE_BOOLEAN,
-				 &system_aec_supported, DBUS_TYPE_INVALID);
-
-	dbus_connection_send(conn, reply, &serial);
-
-	dbus_message_unref(reply);
-
-	return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult handle_get_system_aec_group_id(DBusConnection *conn,
-							DBusMessage *message,
-							void *arg)
-{
-	DBusMessage *reply;
-	dbus_uint32_t serial = 0;
-	dbus_int32_t system_aec_group_id;
-
-	reply = dbus_message_new_method_return(message);
-
-	system_aec_group_id = cras_system_get_aec_group_id();
-	dbus_message_append_args(reply, DBUS_TYPE_INT32, &system_aec_group_id,
-				 DBUS_TYPE_INVALID);
-
-	dbus_connection_send(conn, reply, &serial);
-
-	dbus_message_unref(reply);
-
-	return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult
-handle_get_deprioritize_bt_wbs_mic(DBusConnection *conn, DBusMessage *message,
-				   void *arg)
-{
-	DBusMessage *reply;
-	dbus_uint32_t serial = 0;
-	dbus_bool_t deprioritized;
-
-	reply = dbus_message_new_method_return(message);
-
-	deprioritized = cras_system_get_deprioritize_bt_wbs_mic();
-	dbus_message_append_args(reply, DBUS_TYPE_BOOLEAN, &deprioritized,
-				 DBUS_TYPE_INVALID);
-
-	dbus_connection_send(conn, reply, &serial);
-
-	dbus_message_unref(reply);
-
-	return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult
-handle_set_active_node(DBusConnection *conn, DBusMessage *message, void *arg,
-		       enum CRAS_STREAM_DIRECTION direction)
-{
-	int rc;
-	cras_node_id_t id;
-
-	rc = get_single_arg(message, DBUS_TYPE_UINT64, &id);
-	if (rc)
-		return rc;
-
-	cras_iodev_list_select_node(direction, id);
-
-	send_empty_reply(conn, message);
-
-	return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult
-handle_add_active_node(DBusConnection *conn, DBusMessage *message, void *arg,
-		       enum CRAS_STREAM_DIRECTION direction)
-{
-	int rc;
-	cras_node_id_t id;
-
-	rc = get_single_arg(message, DBUS_TYPE_UINT64, &id);
-	if (rc)
-		return rc;
-
-	cras_iodev_list_add_active_node(direction, id);
-
-	send_empty_reply(conn, message);
-
-	return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult
-handle_rm_active_node(DBusConnection *conn, DBusMessage *message, void *arg,
-		      enum CRAS_STREAM_DIRECTION direction)
-{
-	int rc;
-	cras_node_id_t id;
-
-	rc = get_single_arg(message, DBUS_TYPE_UINT64, &id);
-	if (rc)
-		return rc;
-
-	cras_iodev_list_rm_active_node(direction, id);
-
-	send_empty_reply(conn, message);
-
-	return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult handle_set_fix_a2dp_packet_size(DBusConnection *conn,
-							 DBusMessage *message,
-							 void *arg)
-{
-	int rc;
-	dbus_bool_t enabled = FALSE;
-
-	rc = get_single_arg(message, DBUS_TYPE_BOOLEAN, &enabled);
-	if (rc)
-		return rc;
-
-	cras_system_set_bt_fix_a2dp_packet_size_enabled(enabled);
-
-	send_empty_reply(conn, message);
-
-	return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult handle_get_num_active_streams(DBusConnection *conn,
-						       DBusMessage *message,
-						       void *arg)
-{
-	send_int32_reply(conn, message, cras_system_state_get_active_streams());
-	return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult
-handle_get_num_active_streams_use_input_hw(DBusConnection *conn,
-					   DBusMessage *message, void *arg)
-{
-	dbus_int32_t num = 0;
-	unsigned i;
-
-	for (i = 0; i < CRAS_NUM_DIRECTIONS; i++) {
-		if (cras_stream_uses_input_hw(i))
-			num += cras_system_state_get_active_streams_by_direction(
-				i);
-	}
-	send_int32_reply(conn, message, num);
-
-	return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult
-handle_get_num_active_streams_use_output_hw(DBusConnection *conn,
-					    DBusMessage *message, void *arg)
-{
-	dbus_int32_t num = 0;
-	unsigned i;
-
-	for (i = 0; i < CRAS_NUM_DIRECTIONS; i++) {
-		if (cras_stream_uses_output_hw(i))
-			num += cras_system_state_get_active_streams_by_direction(
-				i);
-	}
-	send_int32_reply(conn, message, num);
-
-	return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static bool append_num_input_streams_with_permission(
-	DBusMessage *message, uint32_t num_input_streams[CRAS_NUM_CLIENT_TYPE])
-{
-	DBusMessageIter array;
-	DBusMessageIter dict;
-	unsigned type;
-
-	dbus_message_iter_init_append(message, &array);
-	for (type = 0; type < CRAS_NUM_CLIENT_TYPE; ++type) {
-		const char *client_type_str = cras_client_type_str(type);
-		if (!is_utf8_string(client_type_str)) {
-			syslog(LOG_ERR,
-			       "Non-utf8 clinet_type_str '%s' cannot be sent "
-			       "via dbus",
-			       client_type_str);
-			client_type_str = "";
-		}
-
-		if (!dbus_message_iter_open_container(&array, DBUS_TYPE_ARRAY,
-						      "{sv}", &dict))
-			return false;
-		if (!append_key_value(&dict, "ClientType", DBUS_TYPE_STRING,
-				      DBUS_TYPE_STRING_AS_STRING,
-				      &client_type_str))
-			return false;
-		if (!append_key_value(&dict, "NumStreamsWithPermission",
-				      DBUS_TYPE_UINT32,
-				      DBUS_TYPE_UINT32_AS_STRING,
-				      &num_input_streams[type]))
-			return false;
-		if (!dbus_message_iter_close_container(&array, &dict))
-			return false;
-	}
-	return true;
-}
-
-static DBusHandlerResult
-handle_get_num_input_streams_with_permission(DBusConnection *conn,
-					     DBusMessage *message, void *arg)
-{
-	DBusMessage *reply;
-	dbus_uint32_t serial = 0;
-	uint32_t num_input_streams[CRAS_NUM_CLIENT_TYPE] = {};
-
-	reply = dbus_message_new_method_return(message);
-
-	cras_system_state_get_input_streams_with_permission(num_input_streams);
-	if (!append_num_input_streams_with_permission(reply, num_input_streams))
-		goto error;
-
-	dbus_connection_send(conn, reply, &serial);
-	dbus_message_unref(reply);
-	return DBUS_HANDLER_RESULT_HANDLED;
-
-error:
-	dbus_message_unref(reply);
-	return DBUS_HANDLER_RESULT_NEED_MEMORY;
-}
-
-static DBusHandlerResult
-handle_set_global_output_channel_remix(DBusConnection *conn,
-				       DBusMessage *message, void *arg)
-{
-	dbus_int32_t num_channels;
-	double *coeff_array;
-	dbus_int32_t count;
-	DBusError dbus_error;
-	float *coefficient;
-	int i;
-
-	dbus_error_init(&dbus_error);
-
-	if (!dbus_message_get_args(message, &dbus_error, DBUS_TYPE_INT32,
-				   &num_channels, DBUS_TYPE_ARRAY,
-				   DBUS_TYPE_DOUBLE, &coeff_array, &count,
-				   DBUS_TYPE_INVALID)) {
-		syslog(LOG_WARNING, "Set global output channel remix error: %s",
-		       dbus_error.message);
-		dbus_error_free(&dbus_error);
-		return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-	}
-
-	coefficient = (float *)calloc(count, sizeof(*coefficient));
-	if (!coefficient)
-		return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-
-	for (i = 0; i < count; i++)
-		coefficient[i] = coeff_array[i];
-
-	audio_thread_config_global_remix(cras_iodev_list_get_audio_thread(),
-					 num_channels, coefficient);
-
-	send_empty_reply(conn, message);
-	free(coefficient);
-	return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult
-handle_set_hotword_model(DBusConnection *conn, DBusMessage *message, void *arg)
-{
-	cras_node_id_t id;
-	const char *model_name;
-	DBusError dbus_error;
-	dbus_int32_t ret;
-
-	dbus_error_init(&dbus_error);
-
-	if (!dbus_message_get_args(message, &dbus_error, DBUS_TYPE_UINT64, &id,
-				   DBUS_TYPE_STRING, &model_name,
-				   DBUS_TYPE_INVALID)) {
-		syslog(LOG_WARNING, "Bad method received: %s",
-		       dbus_error.message);
-		dbus_error_free(&dbus_error);
-		return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-	}
-
-	ret = cras_iodev_list_set_hotword_model(id, model_name);
-	send_int32_reply(conn, message, ret);
-
-	return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult handle_is_audio_active(DBusConnection *conn,
-						DBusMessage *message, void *arg)
-{
-	dbus_int32_t active = cras_system_state_get_non_empty_status();
-
-	send_int32_reply(conn, message, active);
-
-	return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult handle_set_wbs_enabled(DBusConnection *conn,
-						DBusMessage *message, void *arg)
-{
-	int rc;
-	dbus_bool_t enabled;
-
-	rc = get_single_arg(message, DBUS_TYPE_BOOLEAN, &enabled);
-	if (rc)
-		return rc;
-
-	cras_system_set_bt_wbs_enabled(enabled);
-
-	send_empty_reply(conn, message);
-
-	return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult
-handle_set_noise_cancellation_enabled(DBusConnection *conn,
-				      DBusMessage *message, void *arg)
-{
-	int rc;
-	dbus_bool_t enabled;
-
-	rc = get_single_arg(message, DBUS_TYPE_BOOLEAN, &enabled);
-	if (rc)
-		return rc;
-
-	cras_system_set_noise_cancellation_enabled(enabled);
-
-	send_empty_reply(conn, message);
-
-	return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult handle_set_player_playback_status(DBusConnection *conn,
-							   DBusMessage *message,
-							   void *arg)
-{
-	char *status;
-	DBusError dbus_error;
-	int rc;
-
-	dbus_error_init(&dbus_error);
-
-	rc = get_single_arg(message, DBUS_TYPE_STRING, &status);
-	if (rc)
-		return rc;
-
-	rc = cras_bt_player_update_playback_status(conn, status);
-	if (rc) {
-		syslog(LOG_WARNING,
-		       "CRAS failed to update BT Player Status: %d", rc);
-	}
-
-	send_empty_reply(conn, message);
-
-	return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult handle_set_player_identity(DBusConnection *conn,
-						    DBusMessage *message,
-						    void *arg)
-{
-	char *identity;
-	DBusError dbus_error;
-	int rc;
-
-	dbus_error_init(&dbus_error);
-
-	rc = get_single_arg(message, DBUS_TYPE_STRING, &identity);
-	if (rc)
-		return rc;
-
-	rc = cras_bt_player_update_identity(conn, identity);
-	if (rc) {
-		syslog(LOG_WARNING,
-		       "CRAS failed to update BT Player Identity: %d", rc);
-	}
-
-	send_empty_reply(conn, message);
-
-	return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult handle_set_player_position(DBusConnection *conn,
-						    DBusMessage *message,
-						    void *arg)
-{
-	dbus_int64_t position;
-	DBusError dbus_error;
-	int rc;
-
-	dbus_error_init(&dbus_error);
-
-	rc = get_single_arg(message, DBUS_TYPE_INT64, &position);
-	if (rc)
-		return rc;
-
-	rc = cras_bt_player_update_position(conn, position);
-	if (rc) {
-		syslog(LOG_WARNING,
-		       "CRAS failed to update BT Player Position: %d", rc);
-	}
-
-	send_empty_reply(conn, message);
-
-	return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult handle_set_player_metadata(DBusConnection *conn,
-						    DBusMessage *message,
-						    void *arg)
-{
-	DBusError dbus_error;
-	int rc;
-
-	dbus_error_init(&dbus_error);
-	const char *title = NULL, *artist = NULL, *album = NULL;
-	dbus_int64_t length = 0;
-
-	if (!get_metadata(message, &title, &artist, &album, &length))
-		return -EINVAL;
-
-	rc = cras_bt_player_update_metadata(conn, title, artist, album, length);
-	if (rc) {
-		syslog(LOG_WARNING, "CRAS failed to update BT Metadata: %d",
-		       rc);
-	}
-
-	send_empty_reply(conn, message);
-
-	return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-/* Handle incoming messages. */
-static DBusHandlerResult handle_control_message(DBusConnection *conn,
-						DBusMessage *message, void *arg)
-{
-	syslog(LOG_DEBUG, "Control message: %s %s %s",
-	       dbus_message_get_path(message),
-	       dbus_message_get_interface(message),
-	       dbus_message_get_member(message));
-
-	if (dbus_message_is_method_call(message, DBUS_INTERFACE_INTROSPECTABLE,
-					"Introspect")) {
-		DBusMessage *reply;
-		const char *xml = CONTROL_INTROSPECT_XML;
-
-		reply = dbus_message_new_method_return(message);
-		if (!reply)
-			return DBUS_HANDLER_RESULT_NEED_MEMORY;
-		if (!dbus_message_append_args(reply, DBUS_TYPE_STRING, &xml,
-					      DBUS_TYPE_INVALID))
-			return DBUS_HANDLER_RESULT_NEED_MEMORY;
-		if (!dbus_connection_send(conn, reply, NULL))
-			return DBUS_HANDLER_RESULT_NEED_MEMORY;
-
-		dbus_message_unref(reply);
-		return DBUS_HANDLER_RESULT_HANDLED;
-
-	} else if (dbus_message_is_method_call(message, CRAS_CONTROL_INTERFACE,
-					       "SetOutputVolume")) {
-		return handle_set_output_volume(conn, message, arg);
-	} else if (dbus_message_is_method_call(message, CRAS_CONTROL_INTERFACE,
-					       "SetOutputNodeVolume")) {
-		return handle_set_output_node_volume(conn, message, arg);
-	} else if (dbus_message_is_method_call(message, CRAS_CONTROL_INTERFACE,
-					       "SwapLeftRight")) {
-		return handle_swap_left_right(conn, message, arg);
-	} else if (dbus_message_is_method_call(message, CRAS_CONTROL_INTERFACE,
-					       "SetOutputMute")) {
-		return handle_set_output_mute(conn, message, arg);
-	} else if (dbus_message_is_method_call(message, CRAS_CONTROL_INTERFACE,
-					       "SetOutputUserMute")) {
-		return handle_set_output_user_mute(conn, message, arg);
-	} else if (dbus_message_is_method_call(message, CRAS_CONTROL_INTERFACE,
-					       "SetSuspendAudio")) {
-		return handle_set_suspend_audio(conn, message, arg);
-	} else if (dbus_message_is_method_call(message, CRAS_CONTROL_INTERFACE,
-					       "SetInputNodeGain")) {
-		return handle_set_input_node_gain(conn, message, arg);
-	} else if (dbus_message_is_method_call(message, CRAS_CONTROL_INTERFACE,
-					       "SetInputMute")) {
-		return handle_set_input_mute(conn, message, arg);
-	} else if (dbus_message_is_method_call(message, CRAS_CONTROL_INTERFACE,
-					       "GetVolumeState")) {
-		return handle_get_volume_state(conn, message, arg);
-	} else if (dbus_message_is_method_call(message, CRAS_CONTROL_INTERFACE,
-					       "GetDefaultOutputBufferSize")) {
-		return handle_get_default_output_buffer_size(conn, message,
-							     arg);
-	} else if (dbus_message_is_method_call(message, CRAS_CONTROL_INTERFACE,
-					       "GetNodes")) {
-		return handle_get_nodes(conn, message, arg);
-	} else if (dbus_message_is_method_call(message, CRAS_CONTROL_INTERFACE,
-					       "GetSystemAecSupported")) {
-		return handle_get_system_aec_supported(conn, message, arg);
-	} else if (dbus_message_is_method_call(message, CRAS_CONTROL_INTERFACE,
-					       "GetSystemAecGroupId")) {
-		return handle_get_system_aec_group_id(conn, message, arg);
-	} else if (dbus_message_is_method_call(message, CRAS_CONTROL_INTERFACE,
-					       "GetDeprioritizeBtWbsMic")) {
-		return handle_get_deprioritize_bt_wbs_mic(conn, message, arg);
-	} else if (dbus_message_is_method_call(message, CRAS_CONTROL_INTERFACE,
-					       "SetActiveOutputNode")) {
-		return handle_set_active_node(conn, message, arg,
-					      CRAS_STREAM_OUTPUT);
-	} else if (dbus_message_is_method_call(message, CRAS_CONTROL_INTERFACE,
-					       "SetActiveInputNode")) {
-		return handle_set_active_node(conn, message, arg,
-					      CRAS_STREAM_INPUT);
-	} else if (dbus_message_is_method_call(message, CRAS_CONTROL_INTERFACE,
-					       "AddActiveInputNode")) {
-		return handle_add_active_node(conn, message, arg,
-					      CRAS_STREAM_INPUT);
-	} else if (dbus_message_is_method_call(message, CRAS_CONTROL_INTERFACE,
-					       "AddActiveOutputNode")) {
-		return handle_add_active_node(conn, message, arg,
-					      CRAS_STREAM_OUTPUT);
-	} else if (dbus_message_is_method_call(message, CRAS_CONTROL_INTERFACE,
-					       "RemoveActiveInputNode")) {
-		return handle_rm_active_node(conn, message, arg,
-					     CRAS_STREAM_INPUT);
-	} else if (dbus_message_is_method_call(message, CRAS_CONTROL_INTERFACE,
-					       "RemoveActiveOutputNode")) {
-		return handle_rm_active_node(conn, message, arg,
-					     CRAS_STREAM_OUTPUT);
-	} else if (dbus_message_is_method_call(message, CRAS_CONTROL_INTERFACE,
-					       "SetFixA2dpPacketSize")) {
-		return handle_set_fix_a2dp_packet_size(conn, message, arg);
-	} else if (dbus_message_is_method_call(message, CRAS_CONTROL_INTERFACE,
-					       "GetNumberOfActiveStreams")) {
-		return handle_get_num_active_streams(conn, message, arg);
-	} else if (dbus_message_is_method_call(
-			   message, CRAS_CONTROL_INTERFACE,
-			   "GetNumberOfActiveInputStreams")) {
-		return handle_get_num_active_streams_use_input_hw(conn, message,
-								  arg);
-	} else if (dbus_message_is_method_call(
-			   message, CRAS_CONTROL_INTERFACE,
-			   "GetNumberOfInputStreamsWithPermission")) {
-		return handle_get_num_input_streams_with_permission(
-			conn, message, arg);
-	} else if (dbus_message_is_method_call(
-			   message, CRAS_CONTROL_INTERFACE,
-			   "GetNumberOfActiveOutputStreams")) {
-		return handle_get_num_active_streams_use_output_hw(
-			conn, message, arg);
-	} else if (dbus_message_is_method_call(message, CRAS_CONTROL_INTERFACE,
-					       "SetGlobalOutputChannelRemix")) {
-		return handle_set_global_output_channel_remix(conn, message,
-							      arg);
-	} else if (dbus_message_is_method_call(message, CRAS_CONTROL_INTERFACE,
-					       "SetHotwordModel")) {
-		return handle_set_hotword_model(conn, message, arg);
-	} else if (dbus_message_is_method_call(message, CRAS_CONTROL_INTERFACE,
-					       "IsAudioOutputActive")) {
-		return handle_is_audio_active(conn, message, arg);
-	} else if (dbus_message_is_method_call(message, CRAS_CONTROL_INTERFACE,
-					       "SetWbsEnabled")) {
-		return handle_set_wbs_enabled(conn, message, arg);
-	} else if (dbus_message_is_method_call(message, CRAS_CONTROL_INTERFACE,
-					       "SetNoiseCancellationEnabled")) {
-		return handle_set_noise_cancellation_enabled(conn, message,
-							     arg);
-	} else if (dbus_message_is_method_call(message, CRAS_CONTROL_INTERFACE,
-					       "SetPlayerPlaybackStatus")) {
-		return handle_set_player_playback_status(conn, message, arg);
-	} else if (dbus_message_is_method_call(message, CRAS_CONTROL_INTERFACE,
-					       "SetPlayerIdentity")) {
-		return handle_set_player_identity(conn, message, arg);
-	} else if (dbus_message_is_method_call(message, CRAS_CONTROL_INTERFACE,
-					       "SetPlayerPosition")) {
-		return handle_set_player_position(conn, message, arg);
-	} else if (dbus_message_is_method_call(message, CRAS_CONTROL_INTERFACE,
-					       "SetPlayerMetadata")) {
-		return handle_set_player_metadata(conn, message, arg);
-	}
-
-	return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-}
-
-/* Creates a new DBus message, must be freed with dbus_message_unref. */
-static DBusMessage *create_dbus_message(const char *name)
-{
-	DBusMessage *msg;
-	msg = dbus_message_new_signal(CRAS_ROOT_OBJECT_PATH,
-				      CRAS_CONTROL_INTERFACE, name);
-	if (!msg)
-		syslog(LOG_ERR, "Failed to create signal");
-
-	return msg;
-}
-
-/* Handlers for system updates that generate DBus signals. */
-
-static void signal_output_volume(void *context, int32_t volume)
-{
-	struct cras_dbus_control *control = (struct cras_dbus_control *)context;
-	dbus_uint32_t serial = 0;
-	DBusMessage *msg;
-
-	msg = create_dbus_message("OutputVolumeChanged");
-	if (!msg)
-		return;
-
-	volume = cras_system_get_volume();
-	dbus_message_append_args(msg, DBUS_TYPE_INT32, &volume,
-				 DBUS_TYPE_INVALID);
-	dbus_connection_send(control->conn, msg, &serial);
-	dbus_message_unref(msg);
-}
-
-static void signal_output_mute(void *context, int muted, int user_muted,
-			       int mute_locked)
-{
-	struct cras_dbus_control *control = (struct cras_dbus_control *)context;
-	dbus_uint32_t serial = 0;
-	DBusMessage *msg;
-
-	msg = create_dbus_message("OutputMuteChanged");
-	if (!msg)
-		return;
-
-	muted = cras_system_get_system_mute();
-	user_muted = cras_system_get_user_mute();
-	dbus_message_append_args(msg, DBUS_TYPE_BOOLEAN, &muted,
-				 DBUS_TYPE_BOOLEAN, &user_muted,
-				 DBUS_TYPE_INVALID);
-	dbus_connection_send(control->conn, msg, &serial);
-	dbus_message_unref(msg);
-}
-
-static void signal_capture_gain(void *context, int32_t gain)
-{
-	struct cras_dbus_control *control = (struct cras_dbus_control *)context;
-	dbus_uint32_t serial = 0;
-	DBusMessage *msg;
-
-	msg = create_dbus_message("InputGainChanged");
-	if (!msg)
-		return;
-
-	dbus_message_append_args(msg, DBUS_TYPE_INT32, &gain,
-				 DBUS_TYPE_INVALID);
-	dbus_connection_send(control->conn, msg, &serial);
-	dbus_message_unref(msg);
-}
-
-static void signal_capture_mute(void *context, int muted, int mute_locked)
-{
-	struct cras_dbus_control *control = (struct cras_dbus_control *)context;
-	dbus_uint32_t serial = 0;
-	DBusMessage *msg;
-
-	msg = create_dbus_message("InputMuteChanged");
-	if (!msg)
-		return;
-
-	dbus_message_append_args(msg, DBUS_TYPE_BOOLEAN, &muted,
-				 DBUS_TYPE_INVALID);
-	dbus_connection_send(control->conn, msg, &serial);
-	dbus_message_unref(msg);
-}
-
-static void signal_nodes_changed(void *context)
-{
-	struct cras_dbus_control *control = (struct cras_dbus_control *)context;
-	dbus_uint32_t serial = 0;
-	DBusMessage *msg;
-
-	msg = create_dbus_message("NodesChanged");
-	if (!msg)
-		return;
-
-	dbus_connection_send(control->conn, msg, &serial);
-	dbus_message_unref(msg);
-}
-
-static void signal_active_node_changed(void *context,
-				       enum CRAS_STREAM_DIRECTION dir,
-				       cras_node_id_t node_id)
-{
-	struct cras_dbus_control *control = (struct cras_dbus_control *)context;
-	DBusMessage *msg;
-	dbus_uint32_t serial = 0;
-
-	msg = create_dbus_message((dir == CRAS_STREAM_OUTPUT) ?
-						"ActiveOutputNodeChanged" :
-						"ActiveInputNodeChanged");
-	if (!msg)
-		return;
-	dbus_message_append_args(msg, DBUS_TYPE_UINT64, &node_id,
-				 DBUS_TYPE_INVALID);
-	dbus_connection_send(control->conn, msg, &serial);
-	dbus_message_unref(msg);
-}
-
-/* Called by iodev_list when a node volume changes. */
-static void signal_node_volume_changed(void *context, cras_node_id_t node_id,
-				       int32_t volume)
-{
-	struct cras_dbus_control *control = (struct cras_dbus_control *)context;
-	dbus_uint32_t serial = 0;
-	DBusMessage *msg;
-
-	msg = create_dbus_message("OutputNodeVolumeChanged");
-	if (!msg)
-		return;
-
-	dbus_message_append_args(msg, DBUS_TYPE_UINT64, &node_id,
-				 DBUS_TYPE_INT32, &volume, DBUS_TYPE_INVALID);
-	dbus_connection_send(control->conn, msg, &serial);
-	dbus_message_unref(msg);
-}
-
-static void signal_node_capture_gain_changed(void *context,
-					     cras_node_id_t node_id,
-					     int capture_gain)
-{
-	struct cras_dbus_control *control = (struct cras_dbus_control *)context;
-	dbus_uint32_t serial = 0;
-	DBusMessage *msg;
-
-	msg = create_dbus_message("InputNodeGainChanged");
-	if (!msg)
-		return;
-
-	dbus_message_append_args(msg, DBUS_TYPE_UINT64, &node_id,
-				 DBUS_TYPE_INT32, &capture_gain,
-				 DBUS_TYPE_INVALID);
-	dbus_connection_send(control->conn, msg, &serial);
-	dbus_message_unref(msg);
-}
-
-static void signal_node_left_right_swapped_changed(void *context,
-						   cras_node_id_t node_id,
-						   int swapped)
-{
-	struct cras_dbus_control *control = (struct cras_dbus_control *)context;
-	dbus_uint32_t serial = 0;
-	DBusMessage *msg;
-
-	msg = create_dbus_message("NodeLeftRightSwappedChanged");
-	if (!msg)
-		return;
-
-	dbus_message_append_args(msg, DBUS_TYPE_UINT64, &node_id,
-				 DBUS_TYPE_BOOLEAN, &swapped,
-				 DBUS_TYPE_INVALID);
-	dbus_connection_send(control->conn, msg, &serial);
-	dbus_message_unref(msg);
-}
-
-static void signal_num_active_streams_changed(void *context,
-					      enum CRAS_STREAM_DIRECTION dir,
-					      uint32_t num_active_streams)
-{
-	struct cras_dbus_control *control = (struct cras_dbus_control *)context;
-	dbus_uint32_t serial = 0;
-	DBusMessage *msg;
-	dbus_int32_t num;
-
-	msg = create_dbus_message("NumberOfActiveStreamsChanged");
-	if (!msg)
-		return;
-
-	num = cras_system_state_get_active_streams();
-	dbus_message_append_args(msg, DBUS_TYPE_INT32, &num, DBUS_TYPE_INVALID);
-	dbus_connection_send(control->conn, msg, &serial);
-	dbus_message_unref(msg);
-}
-
-static void signal_num_input_streams_with_permission_changed(
-	void *context, uint32_t num_input_streams[CRAS_NUM_CLIENT_TYPE])
-{
-	struct cras_dbus_control *control = (struct cras_dbus_control *)context;
-	dbus_uint32_t serial = 0;
-	DBusMessage *msg;
-
-	msg = create_dbus_message("NumberOfInputStreamsWithPermissionChanged");
-	if (!msg)
-		return;
-
-	if (!append_num_input_streams_with_permission(msg, num_input_streams))
-		goto error;
-
-	dbus_connection_send(control->conn, msg, &serial);
-error:
-	dbus_message_unref(msg);
-}
-
-static void signal_hotword_triggered(void *context, int64_t tv_sec,
-				     int64_t tv_nsec)
-{
-	struct cras_dbus_control *control = (struct cras_dbus_control *)context;
-	dbus_uint32_t serial = 0;
-	DBusMessage *msg;
-
-	msg = create_dbus_message("HotwordTriggered");
-	if (!msg)
-		return;
-
-	dbus_message_append_args(msg, DBUS_TYPE_INT64, &tv_sec, DBUS_TYPE_INT64,
-				 &tv_nsec, DBUS_TYPE_INVALID);
-	dbus_connection_send(control->conn, msg, &serial);
-	dbus_message_unref(msg);
-}
-
-static void signal_non_empty_audio_state_changed(void *context, int non_empty)
-{
-	struct cras_dbus_control *control = (struct cras_dbus_control *)context;
-
-	dbus_uint32_t serial = 0;
-	DBusMessage *msg;
-
-	msg = create_dbus_message("AudioOutputActiveStateChanged");
-	if (!msg)
-		return;
-
-	dbus_message_append_args(msg, DBUS_TYPE_BOOLEAN, &non_empty,
-				 DBUS_TYPE_INVALID);
-
-	dbus_connection_send(control->conn, msg, &serial);
-	dbus_message_unref(msg);
-}
-
-/* Exported Interface */
-
-void cras_dbus_control_start(DBusConnection *conn)
-{
-	static const DBusObjectPathVTable control_vtable = {
-		.message_function = handle_control_message,
-	};
-
-	DBusError dbus_error;
-	struct cras_observer_ops observer_ops;
-
-	dbus_control.conn = conn;
-	dbus_connection_ref(dbus_control.conn);
-
-	if (!dbus_connection_register_object_path(conn, CRAS_ROOT_OBJECT_PATH,
-						  &control_vtable,
-						  &dbus_error)) {
-		syslog(LOG_WARNING, "Couldn't register CRAS control: %s: %s",
-		       CRAS_ROOT_OBJECT_PATH, dbus_error.message);
-		dbus_error_free(&dbus_error);
-		return;
-	}
-
-	memset(&observer_ops, 0, sizeof(observer_ops));
-	observer_ops.output_volume_changed = signal_output_volume;
-	observer_ops.output_mute_changed = signal_output_mute;
-	observer_ops.capture_gain_changed = signal_capture_gain;
-	observer_ops.capture_mute_changed = signal_capture_mute;
-	observer_ops.num_active_streams_changed =
-		signal_num_active_streams_changed;
-	observer_ops.num_input_streams_with_permission_changed =
-		signal_num_input_streams_with_permission_changed;
-	observer_ops.nodes_changed = signal_nodes_changed;
-	observer_ops.active_node_changed = signal_active_node_changed;
-	observer_ops.input_node_gain_changed = signal_node_capture_gain_changed;
-	observer_ops.output_node_volume_changed = signal_node_volume_changed;
-	observer_ops.node_left_right_swapped_changed =
-		signal_node_left_right_swapped_changed;
-	observer_ops.hotword_triggered = signal_hotword_triggered;
-	observer_ops.non_empty_audio_state_changed =
-		signal_non_empty_audio_state_changed;
-
-	dbus_control.observer = cras_observer_add(&observer_ops, &dbus_control);
-}
-
-void cras_dbus_control_stop()
-{
-	if (!dbus_control.conn)
-		return;
-
-	dbus_connection_unregister_object_path(dbus_control.conn,
-					       CRAS_ROOT_OBJECT_PATH);
-
-	dbus_connection_unref(dbus_control.conn);
-	dbus_control.conn = NULL;
-	cras_observer_remove(dbus_control.observer);
-	dbus_control.observer = NULL;
-}
diff --git a/cras/src/server/cras_dbus_control.h b/cras/src/server/cras_dbus_control.h
deleted file mode 100644
index e4c845b..0000000
--- a/cras/src/server/cras_dbus_control.h
+++ /dev/null
@@ -1,15 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_DBUS_CONTROL_H_
-#define CRAS_DBUS_CONTROL_H_
-
-/* Starts the dbus control interface, begins listening for incoming messages. */
-void cras_dbus_control_start(DBusConnection *conn);
-
-/* Stops monitoring the dbus interface for command messages. */
-void cras_dbus_control_stop();
-
-#endif /* CRAS_DBUS_CONTROL_H_ */
diff --git a/cras/src/server/cras_dbus_util.c b/cras/src/server/cras_dbus_util.c
deleted file mode 100644
index 79e4834..0000000
--- a/cras/src/server/cras_dbus_util.c
+++ /dev/null
@@ -1,29 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include "cras_dbus_util.h"
-
-dbus_bool_t append_key_value(DBusMessageIter *iter, const char *key, int type,
-			     const char *type_string, void *value)
-{
-	DBusMessageIter entry, variant;
-
-	if (!dbus_message_iter_open_container(iter, DBUS_TYPE_DICT_ENTRY, NULL,
-					      &entry))
-		return FALSE;
-	if (!dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &key))
-		return FALSE;
-	if (!dbus_message_iter_open_container(&entry, DBUS_TYPE_VARIANT,
-					      type_string, &variant))
-		return FALSE;
-	if (!dbus_message_iter_append_basic(&variant, type, value))
-		return FALSE;
-	if (!dbus_message_iter_close_container(&entry, &variant))
-		return FALSE;
-	if (!dbus_message_iter_close_container(iter, &entry))
-		return FALSE;
-
-	return TRUE;
-}
diff --git a/cras/src/server/cras_dbus_util.h b/cras/src/server/cras_dbus_util.h
deleted file mode 100644
index 94d5320..0000000
--- a/cras/src/server/cras_dbus_util.h
+++ /dev/null
@@ -1,18 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <dbus/dbus.h>
-
-/* Appends a key-value pair to the dbus message.
- * Args:
- *    key - the key (a string)
- *    type - the type of the value (for example, 'y')
- *    type_string - the type of the value in string form (for example, "y")
- *    value - a pointer to the value to be appended.
- * Returns:
- *    false if not enough memory.
-*/
-dbus_bool_t append_key_value(DBusMessageIter *iter, const char *key, int type,
-			     const char *type_string, void *value);
diff --git a/cras/src/server/cras_device_monitor.c b/cras/src/server/cras_device_monitor.c
deleted file mode 100644
index e9730a0..0000000
--- a/cras/src/server/cras_device_monitor.c
+++ /dev/null
@@ -1,119 +0,0 @@
-/* Copyright 2016 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <stdbool.h>
-#include <syslog.h>
-
-#include "cras_device_monitor.h"
-#include "cras_iodev_list.h"
-#include "cras_main_message.h"
-
-enum CRAS_DEVICE_MONITOR_MSG_TYPE {
-	RESET_DEVICE,
-	SET_MUTE_STATE,
-	ERROR_CLOSE,
-};
-
-struct cras_device_monitor_message {
-	struct cras_main_message header;
-	enum CRAS_DEVICE_MONITOR_MSG_TYPE message_type;
-	unsigned int dev_idx;
-};
-
-static void init_device_msg(struct cras_device_monitor_message *msg,
-			    enum CRAS_DEVICE_MONITOR_MSG_TYPE type,
-			    unsigned int dev_idx)
-{
-	memset(msg, 0, sizeof(*msg));
-	msg->header.type = CRAS_MAIN_MONITOR_DEVICE;
-	msg->header.length = sizeof(*msg);
-	msg->message_type = type;
-	msg->dev_idx = dev_idx;
-}
-
-int cras_device_monitor_reset_device(unsigned int dev_idx)
-{
-	struct cras_device_monitor_message msg;
-	int err;
-
-	init_device_msg(&msg, RESET_DEVICE, dev_idx);
-	err = cras_main_message_send((struct cras_main_message *)&msg);
-	if (err < 0) {
-		syslog(LOG_ERR, "Failed to send device message %d",
-		       RESET_DEVICE);
-		return err;
-	}
-	return 0;
-}
-
-int cras_device_monitor_set_device_mute_state(unsigned int dev_idx)
-{
-	struct cras_device_monitor_message msg;
-	int err;
-
-	init_device_msg(&msg, SET_MUTE_STATE, dev_idx);
-	err = cras_main_message_send((struct cras_main_message *)&msg);
-	if (err < 0) {
-		syslog(LOG_ERR, "Failed to send device message %d",
-		       SET_MUTE_STATE);
-		return err;
-	}
-	return 0;
-}
-
-int cras_device_monitor_error_close(unsigned int dev_idx)
-{
-	struct cras_device_monitor_message msg;
-	int err;
-
-	init_device_msg(&msg, ERROR_CLOSE, dev_idx);
-	err = cras_main_message_send((struct cras_main_message *)&msg);
-	if (err < 0) {
-		syslog(LOG_ERR, "Failed to send device message %d",
-		       ERROR_CLOSE);
-		return err;
-	}
-	return 0;
-}
-
-/* When device is in a bad state, e.g. severe underrun,
- * it might break how audio thread works and cause busy wake up loop.
- * Resetting the device can bring device back to normal state.
- * Let main thread follow the disable/enable sequence in iodev_list
-  * to properly close/open the device while enabling/disabling fallback
- * device.
- */
-static void handle_device_message(struct cras_main_message *msg, void *arg)
-{
-	struct cras_device_monitor_message *device_msg =
-		(struct cras_device_monitor_message *)msg;
-
-	switch (device_msg->message_type) {
-	case RESET_DEVICE:
-		syslog(LOG_ERR, "trying to recover device 0x%x by resetting it",
-		       device_msg->dev_idx);
-		cras_iodev_list_suspend_dev(device_msg->dev_idx);
-		cras_iodev_list_resume_dev(device_msg->dev_idx);
-		break;
-	case SET_MUTE_STATE:
-		cras_iodev_list_set_dev_mute(device_msg->dev_idx);
-		break;
-	case ERROR_CLOSE:
-		syslog(LOG_ERR, "Close erroneous device in main thread");
-		cras_iodev_list_suspend_dev(device_msg->dev_idx);
-		break;
-	default:
-		syslog(LOG_ERR, "Unknown device message type %u",
-		       device_msg->message_type);
-		break;
-	}
-}
-
-int cras_device_monitor_init()
-{
-	cras_main_message_add_handler(CRAS_MAIN_MONITOR_DEVICE,
-				      handle_device_message, NULL);
-	return 0;
-}
diff --git a/cras/src/server/cras_device_monitor.h b/cras/src/server/cras_device_monitor.h
deleted file mode 100644
index eca2372..0000000
--- a/cras/src/server/cras_device_monitor.h
+++ /dev/null
@@ -1,22 +0,0 @@
-/* Copyright 2016 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_DEVICE_MONITOR_H_
-#define CRAS_DEVICE_MONITOR_H_
-
-/* Asks main thread to reset a device */
-int cras_device_monitor_reset_device(unsigned int dev_idx);
-
-/* Asks main thread to set mute/unmute state on a device. */
-int cras_device_monitor_set_device_mute_state(unsigned int dev_idx);
-
-/* Initializes device monitor and sets main thread callback. */
-int cras_device_monitor_init();
-
-/* Asks main thread to close device because error has occured in audio
- * thread. */
-int cras_device_monitor_error_close(unsigned int dev_idx);
-
-#endif /* CRAS_DEVICE_MONITOR_H_ */
diff --git a/cras/src/server/cras_dsp.c b/cras/src/server/cras_dsp.c
deleted file mode 100644
index 9c4cc7b..0000000
--- a/cras/src/server/cras_dsp.c
+++ /dev/null
@@ -1,265 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <pthread.h>
-#include <syslog.h>
-#include "dumper.h"
-#include "cras_expr.h"
-#include "cras_dsp_ini.h"
-#include "cras_dsp_pipeline.h"
-#include "dsp_util.h"
-#include "utlist.h"
-
-/* We have a dsp_context for each pipeline. The context records the
- * parameters used to create a pipeline, so the pipeline can be
- * (re-)loaded later. The pipeline is (re-)loaded in the following
- * cases:
- *
- * (1) The client asks to (re-)load it with cras_load_pipeline().
- * (2) The client asks to reload the ini with cras_reload_ini().
- *
- * The pipeline is (re-)loaded asynchronously in an internal thread,
- * so the client needs to use cras_dsp_get_pipeline() and
- * cras_dsp_put_pipeline() to safely access the pipeline.
- */
-struct cras_dsp_context {
-	pthread_mutex_t mutex;
-	struct pipeline *pipeline;
-
-	struct cras_expr_env env;
-	int sample_rate;
-	const char *purpose;
-	struct cras_dsp_context *prev, *next;
-};
-
-static struct dumper *syslog_dumper;
-static const char *ini_filename;
-static struct ini *global_ini;
-static struct cras_dsp_context *context_list;
-
-static void initialize_environment(struct cras_expr_env *env)
-{
-	cras_expr_env_install_builtins(env);
-	cras_expr_env_set_variable_boolean(env, "disable_eq", 0);
-	cras_expr_env_set_variable_boolean(env, "disable_drc", 0);
-	cras_expr_env_set_variable_string(env, "dsp_name", "");
-	cras_expr_env_set_variable_boolean(env, "swap_lr_disabled", 1);
-}
-
-static void destroy_pipeline(struct pipeline *pipeline)
-{
-	struct ini *private_ini;
-
-	private_ini = cras_dsp_pipeline_get_ini(pipeline);
-	cras_dsp_pipeline_free(pipeline);
-
-	/*
-	 * If pipeline is using an dsp ini other than the global one, free
-	 * this ini so its life cycle is aligned with the associated dsp
-	 * pipeline.
-	 */
-	if (private_ini && (private_ini != global_ini))
-		cras_dsp_ini_free(private_ini);
-}
-
-static struct pipeline *prepare_pipeline(struct cras_dsp_context *ctx,
-					 struct ini *target_ini)
-{
-	struct pipeline *pipeline;
-	const char *purpose = ctx->purpose;
-
-	pipeline = cras_dsp_pipeline_create(target_ini, &ctx->env, purpose);
-
-	if (pipeline) {
-		syslog(LOG_DEBUG, "pipeline created");
-	} else {
-		syslog(LOG_DEBUG, "cannot create pipeline");
-		goto bail;
-	}
-
-	if (cras_dsp_pipeline_load(pipeline) != 0) {
-		syslog(LOG_ERR, "cannot load pipeline");
-		goto bail;
-	}
-
-	if (cras_dsp_pipeline_instantiate(pipeline, ctx->sample_rate) != 0) {
-		syslog(LOG_ERR, "cannot instantiate pipeline");
-		goto bail;
-	}
-
-	if (cras_dsp_pipeline_get_sample_rate(pipeline) != ctx->sample_rate) {
-		syslog(LOG_ERR, "pipeline sample rate mismatch (%d vs %d)",
-		       cras_dsp_pipeline_get_sample_rate(pipeline),
-		       ctx->sample_rate);
-		goto bail;
-	}
-
-	return pipeline;
-
-bail:
-	if (pipeline)
-		destroy_pipeline(pipeline);
-	return NULL;
-}
-
-static void cmd_load_pipeline(struct cras_dsp_context *ctx,
-			      struct ini *target_ini)
-{
-	struct pipeline *pipeline, *old_pipeline;
-
-	pipeline = target_ini ? prepare_pipeline(ctx, target_ini) : NULL;
-
-	/* This locking is short to avoild blocking audio thread. */
-	pthread_mutex_lock(&ctx->mutex);
-	old_pipeline = ctx->pipeline;
-	ctx->pipeline = pipeline;
-	pthread_mutex_unlock(&ctx->mutex);
-
-	if (old_pipeline)
-		destroy_pipeline(old_pipeline);
-}
-
-static void cmd_reload_ini()
-{
-	struct ini *old_ini = global_ini;
-	struct cras_dsp_context *ctx;
-
-	struct ini *new_ini = cras_dsp_ini_create(ini_filename);
-	if (!new_ini) {
-		syslog(LOG_DEBUG, "cannot create dsp ini");
-		return;
-	}
-
-	DL_FOREACH (context_list, ctx) {
-		cmd_load_pipeline(ctx, new_ini);
-	}
-
-	global_ini = new_ini;
-
-	if (old_ini)
-		cras_dsp_ini_free(old_ini);
-}
-
-/* Exported functions */
-
-void cras_dsp_init(const char *filename)
-{
-	dsp_enable_flush_denormal_to_zero();
-	ini_filename = strdup(filename);
-	syslog_dumper = syslog_dumper_create(LOG_ERR);
-	cmd_reload_ini();
-}
-
-void cras_dsp_stop()
-{
-	syslog_dumper_free(syslog_dumper);
-	if (ini_filename)
-		free((char *)ini_filename);
-	if (global_ini) {
-		cras_dsp_ini_free(global_ini);
-		global_ini = NULL;
-	}
-}
-
-struct cras_dsp_context *cras_dsp_context_new(int sample_rate,
-					      const char *purpose)
-{
-	struct cras_dsp_context *ctx = calloc(1, sizeof(*ctx));
-
-	pthread_mutex_init(&ctx->mutex, NULL);
-	initialize_environment(&ctx->env);
-	ctx->sample_rate = sample_rate;
-	ctx->purpose = strdup(purpose);
-
-	DL_APPEND(context_list, ctx);
-	return ctx;
-}
-
-void cras_dsp_context_free(struct cras_dsp_context *ctx)
-{
-	DL_DELETE(context_list, ctx);
-
-	pthread_mutex_destroy(&ctx->mutex);
-	if (ctx->pipeline) {
-		destroy_pipeline(ctx->pipeline);
-		ctx->pipeline = NULL;
-	}
-	cras_expr_env_free(&ctx->env);
-	free((char *)ctx->purpose);
-	free(ctx);
-}
-
-void cras_dsp_set_variable_string(struct cras_dsp_context *ctx, const char *key,
-				  const char *value)
-{
-	cras_expr_env_set_variable_string(&ctx->env, key, value);
-}
-
-void cras_dsp_set_variable_boolean(struct cras_dsp_context *ctx,
-				   const char *key, char value)
-{
-	cras_expr_env_set_variable_boolean(&ctx->env, key, value);
-}
-
-void cras_dsp_load_pipeline(struct cras_dsp_context *ctx)
-{
-	cmd_load_pipeline(ctx, global_ini);
-}
-
-void cras_dsp_load_mock_pipeline(struct cras_dsp_context *ctx,
-				 unsigned int num_channels)
-{
-	struct ini *mock_ini;
-	mock_ini = create_mock_ini(ctx->purpose, num_channels);
-	if (mock_ini == NULL)
-		syslog(LOG_ERR, "Failed to create mock ini");
-	else
-		cmd_load_pipeline(ctx, mock_ini);
-}
-
-struct pipeline *cras_dsp_get_pipeline(struct cras_dsp_context *ctx)
-{
-	pthread_mutex_lock(&ctx->mutex);
-	if (!ctx->pipeline) {
-		pthread_mutex_unlock(&ctx->mutex);
-		return NULL;
-	}
-	return ctx->pipeline;
-}
-
-void cras_dsp_put_pipeline(struct cras_dsp_context *ctx)
-{
-	pthread_mutex_unlock(&ctx->mutex);
-}
-
-void cras_dsp_reload_ini()
-{
-	cmd_reload_ini();
-}
-
-void cras_dsp_dump_info()
-{
-	struct pipeline *pipeline;
-	struct cras_dsp_context *ctx;
-
-	if (global_ini)
-		cras_dsp_ini_dump(syslog_dumper, global_ini);
-	DL_FOREACH (context_list, ctx) {
-		cras_expr_env_dump(syslog_dumper, &ctx->env);
-		pipeline = ctx->pipeline;
-		if (pipeline)
-			cras_dsp_pipeline_dump(syslog_dumper, pipeline);
-	}
-}
-
-unsigned int cras_dsp_num_output_channels(const struct cras_dsp_context *ctx)
-{
-	return cras_dsp_pipeline_get_num_output_channels(ctx->pipeline);
-}
-
-unsigned int cras_dsp_num_input_channels(const struct cras_dsp_context *ctx)
-{
-	return cras_dsp_pipeline_get_num_input_channels(ctx->pipeline);
-}
diff --git a/cras/src/server/cras_dsp.h b/cras/src/server/cras_dsp.h
deleted file mode 100644
index 366e2e6..0000000
--- a/cras/src/server/cras_dsp.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_DSP_H_
-#define CRAS_DSP_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "cras_dsp_pipeline.h"
-
-struct cras_dsp_context;
-
-/* Starts the dsp subsystem. It starts a thread internally to load the
- * plugins. This should be called before other functions.
- * Args:
- *    filename - The ini file where the dsp plugin graph should be read from.
- */
-void cras_dsp_init(const char *filename);
-
-/* Stops the dsp subsystem. */
-void cras_dsp_stop();
-
-/* Creates a dsp context. The context holds a pipeline and its
- * parameters.  To use the pipeline in the context, first use
- * cras_dsp_load_pipeline() to load it and then use
- * cras_dsp_get_pipeline() to lock it for access.
- * Args:
- *    sample_rate - The sampling rate of the pipeline.
- *    purpose - The purpose of the pipeline, "playback" or "capture".
- * Returns:
- *    A pointer to the dsp context.
- */
-struct cras_dsp_context *cras_dsp_context_new(int sample_rate,
-					      const char *purpose);
-
-/* Frees a dsp context. */
-void cras_dsp_context_free(struct cras_dsp_context *ctx);
-
-/* Sets a configuration string variable in the context. */
-void cras_dsp_set_variable_string(struct cras_dsp_context *ctx, const char *key,
-				  const char *value);
-
-/* Sets a configuration boolean variable in the context. */
-void cras_dsp_set_variable_boolean(struct cras_dsp_context *ctx,
-				   const char *key, char value);
-
-/* Loads the pipeline to the context. This should be called again when
- * new values of configuration variables may change the plugin
- * graph. The actual loading happens in another thread to avoid
- * blocking the audio thread. */
-void cras_dsp_load_pipeline(struct cras_dsp_context *ctx);
-
-/* Loads a mock pipeline of source directly connects to sink, of given
- * number of channels.
- */
-void cras_dsp_load_mock_pipeline(struct cras_dsp_context *ctx,
-				 unsigned int num_channels);
-
-/* Locks the pipeline in the context for access. Returns NULL if the
- * pipeline is still being loaded or cannot be loaded. */
-struct pipeline *cras_dsp_get_pipeline(struct cras_dsp_context *ctx);
-
-/* Releases the pipeline in the context. This must be called in pair
- * with cras_dsp_get_pipeline() once the client finishes using the
- * pipeline. This should be called in the same thread as
- * cras_dsp_get_pipeline() was called. */
-void cras_dsp_put_pipeline(struct cras_dsp_context *ctx);
-
-/* Re-reads the ini file and reloads all pipelines in the system. */
-void cras_dsp_reload_ini();
-
-/* Dump current dsp information to syslog. */
-void cras_dsp_dump_info();
-
-/* Number of channels output. */
-unsigned int cras_dsp_num_output_channels(const struct cras_dsp_context *ctx);
-
-/* Number of channels input. */
-unsigned int cras_dsp_num_input_channels(const struct cras_dsp_context *ctx);
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif /* CRAS_DSP_H_ */
diff --git a/cras/src/server/cras_dsp_ini.c b/cras/src/server/cras_dsp_ini.c
deleted file mode 100644
index a331acf..0000000
--- a/cras/src/server/cras_dsp_ini.c
+++ /dev/null
@@ -1,492 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <errno.h>
-#include <stdlib.h>
-#include <syslog.h>
-#include "cras_dsp_ini.h"
-#include "iniparser_wrapper.h"
-
-#define MAX_NR_PORT 128 /* the max number of ports for a plugin */
-#define MAX_PORT_NAME_LENGTH 20 /* names like "output_32" */
-#define MAX_MOCK_INI_CH 20 /* Max number of channels to create mock ini */
-
-/* Format of the ini file (See dsp.ini.sample for an example).
-
-- Each section in the ini file specifies a plugin. The section name is
-  just an identifier. The "library" and "label" attributes in a
-  section must be defined. The "library" attribute is the name of the
-  shared library from which this plugin will be loaded, or a special
-  value "builtin" for built-in plugins. The "label" attribute specify
-  which plugin inside the shared library should be loaded.
-
-- Built-in plugins have an attribute "label" which has value "source"
-  or "sink". It defines where the audio data flows into and flows out
-  of the pipeline.  Built-in plugins also have a attribute "purpose"
-  which has the value "playback" or "capture". It defines which
-  pipeline these plugins belong to.
-
-- Each plugin can have an optional "disable expression", which defines
-  under which conditions the plugin is disabled.
-
-- Each plugin have some ports which specify the parameters for the
-  plugin or to specify connections to other plugins. The ports in each
-  plugin are numbered from 0. Each port is either an input port or an
-  output port, and each port is either an audio port or a control
-  port. The connections between two ports are expressed by giving the
-  same value to both ports. For audio ports, the value should be
-  "{identifier}". For control ports, the value shoule be
-  "<identifier>". For example, the following fragment
-
-  [plugin1]
-  ...
-  output_4={audio_left}
-  output_5={audio_right}
-
-  [plugin2]
-  ...
-  input_0={audio_left}
-
-  [plugin3]
-  ...
-  input_2={audio_right}
-
-  specifies these connections:
-  port 4 of plugin1 --> port 0 of plugin2
-  port 5 of plugin1 --> port 2 of plugin3
-
-*/
-
-static const char *getstring(struct ini *ini, const char *sec_name,
-			     const char *key)
-{
-	char full_key[MAX_INI_KEY_LENGTH + 1];
-	snprintf(full_key, sizeof(full_key), "%s:%s", sec_name, key);
-	return iniparser_getstring(ini->dict, full_key, NULL);
-}
-
-static int lookup_flow(struct ini *ini, const char *name)
-{
-	int i;
-	const struct flow *flow;
-
-	ARRAY_ELEMENT_FOREACH (&ini->flows, i, flow) {
-		if (strcmp(flow->name, name) == 0)
-			return i;
-	}
-
-	return -1;
-}
-
-static int lookup_or_add_flow(struct ini *ini, const char *name)
-{
-	struct flow *flow;
-	int i = lookup_flow(ini, name);
-	if (i != -1)
-		return i;
-	i = ARRAY_COUNT(&ini->flows);
-	flow = ARRAY_APPEND_ZERO(&ini->flows);
-	flow->name = name;
-	return i;
-}
-
-static int parse_ports(struct ini *ini, const char *sec_name,
-		       struct plugin *plugin)
-{
-	char key[MAX_PORT_NAME_LENGTH];
-	const char *str;
-	int i;
-	struct port *p;
-	int direction;
-
-	for (i = 0; i < MAX_NR_PORT; i++) {
-		direction = PORT_INPUT;
-		snprintf(key, sizeof(key), "input_%d", i);
-		str = getstring(ini, sec_name, key);
-		if (str == NULL) {
-			direction = PORT_OUTPUT;
-			snprintf(key, sizeof(key), "output_%d", i);
-			str = getstring(ini, sec_name, key);
-			if (str == NULL)
-				break; /* no more ports */
-		}
-
-		if (*str == '\0') {
-			syslog(LOG_ERR, "empty value for %s:%s", sec_name, key);
-			return -1;
-		}
-
-		if (str[0] == '<' || str[0] == '{') {
-			p = ARRAY_APPEND_ZERO(&plugin->ports);
-			p->type = (str[0] == '<') ? PORT_CONTROL : PORT_AUDIO;
-			p->flow_id = lookup_or_add_flow(ini, str);
-			p->init_value = 0;
-		} else {
-			char *endptr;
-			float init_value = strtof(str, &endptr);
-			if (endptr == str) {
-				syslog(LOG_ERR, "cannot parse number from '%s'",
-				       str);
-			}
-			p = ARRAY_APPEND_ZERO(&plugin->ports);
-			p->type = PORT_CONTROL;
-			p->flow_id = INVALID_FLOW_ID;
-			p->init_value = init_value;
-		}
-		p->direction = direction;
-	}
-
-	return 0;
-}
-
-static int parse_plugin_section(struct ini *ini, const char *sec_name,
-				struct plugin *p)
-{
-	p->title = sec_name;
-	p->library = getstring(ini, sec_name, "library");
-	p->label = getstring(ini, sec_name, "label");
-	p->purpose = getstring(ini, sec_name, "purpose");
-	p->disable_expr =
-		cras_expr_expression_parse(getstring(ini, sec_name, "disable"));
-
-	if (p->library == NULL || p->label == NULL) {
-		syslog(LOG_ERR, "A plugin must have library and label: %s",
-		       sec_name);
-		return -1;
-	}
-
-	if (parse_ports(ini, sec_name, p) < 0) {
-		syslog(LOG_ERR, "Failed to parse ports: %s", sec_name);
-		return -1;
-	}
-
-	return 0;
-}
-
-static void fill_flow_info(struct ini *ini)
-{
-	int i, j;
-	struct plugin *plugin;
-	struct port *port;
-	struct flow *flow;
-	struct plugin **pplugin;
-	int *pport;
-
-	ARRAY_ELEMENT_FOREACH (&ini->plugins, i, plugin) {
-		ARRAY_ELEMENT_FOREACH (&plugin->ports, j, port) {
-			int flow_id = port->flow_id;
-			if (flow_id == INVALID_FLOW_ID)
-				continue;
-			flow = ARRAY_ELEMENT(&ini->flows, flow_id);
-			flow->type = port->type;
-			if (port->direction == PORT_INPUT) {
-				pplugin = &flow->to;
-				pport = &flow->to_port;
-			} else {
-				pplugin = &flow->from;
-				pport = &flow->from_port;
-			}
-			*pplugin = plugin;
-			*pport = j;
-		}
-	}
-}
-
-/* Adds a port to a plugin with specified flow id and direction. */
-static void add_audio_port(struct ini *ini, struct plugin *plugin, int flow_id,
-			   enum port_direction port_direction)
-{
-	struct port *p;
-	p = ARRAY_APPEND_ZERO(&plugin->ports);
-	p->type = PORT_AUDIO;
-	p->flow_id = flow_id;
-	p->init_value = 0;
-	p->direction = port_direction;
-}
-
-/* Fills fields for a swap_lr plugin.*/
-static void fill_swap_lr_plugin(struct ini *ini, struct plugin *plugin,
-				int input_flowid_0, int input_flowid_1,
-				int output_flowid_0, int output_flowid_1)
-{
-	plugin->title = "swap_lr";
-	plugin->library = "builtin";
-	plugin->label = "swap_lr";
-	plugin->purpose = "playback";
-	plugin->disable_expr = cras_expr_expression_parse("swap_lr_disabled");
-
-	add_audio_port(ini, plugin, input_flowid_0, PORT_INPUT);
-	add_audio_port(ini, plugin, input_flowid_1, PORT_INPUT);
-	add_audio_port(ini, plugin, output_flowid_0, PORT_OUTPUT);
-	add_audio_port(ini, plugin, output_flowid_1, PORT_OUTPUT);
-}
-
-/* Adds a new flow with name. If there is already a flow with the name, returns
- * INVALID_FLOW_ID.
- */
-static int add_new_flow(struct ini *ini, const char *name)
-{
-	struct flow *flow;
-	int i = lookup_flow(ini, name);
-	if (i != -1)
-		return INVALID_FLOW_ID;
-	i = ARRAY_COUNT(&ini->flows);
-	flow = ARRAY_APPEND_ZERO(&ini->flows);
-	flow->name = name;
-	return i;
-}
-
-/* Finds the first playback sink plugin in ini. */
-struct plugin *find_first_playback_sink_plugin(struct ini *ini)
-{
-	int i;
-	struct plugin *plugin;
-
-	ARRAY_ELEMENT_FOREACH (&ini->plugins, i, plugin) {
-		if (strcmp(plugin->library, "builtin") != 0)
-			continue;
-		if (strcmp(plugin->label, "sink") != 0)
-			continue;
-		if (!plugin->purpose ||
-		    strcmp(plugin->purpose, "playback") != 0)
-			continue;
-		return plugin;
-	}
-
-	return NULL;
-}
-
-/* Inserts a swap_lr plugin before sink. Handles the port change such that
- * the port originally connects to sink will connect to swap_lr.
- */
-static int insert_swap_lr_plugin(struct ini *ini)
-{
-	struct plugin *swap_lr, *sink;
-	int sink_input_flowid_0, sink_input_flowid_1;
-	int swap_lr_output_flowid_0, swap_lr_output_flowid_1;
-
-	/* Only add swap_lr plugin for two-channel playback dsp.
-	 * TODO(cychiang): Handle multiple sinks if needed.
-	 */
-	sink = find_first_playback_sink_plugin(ini);
-	if ((sink == NULL) || ARRAY_COUNT(&sink->ports) != 2)
-		return 0;
-
-	/* Gets the original flow ids of the sink input ports. */
-	sink_input_flowid_0 = ARRAY_ELEMENT(&sink->ports, 0)->flow_id;
-	sink_input_flowid_1 = ARRAY_ELEMENT(&sink->ports, 1)->flow_id;
-
-	/* Create new flow ids for swap_lr output ports. */
-	swap_lr_output_flowid_0 = add_new_flow(ini, "{swap_lr_out:0}");
-	swap_lr_output_flowid_1 = add_new_flow(ini, "{swap_lr_out:1}");
-
-	if (swap_lr_output_flowid_0 == INVALID_FLOW_ID ||
-	    swap_lr_output_flowid_1 == INVALID_FLOW_ID) {
-		syslog(LOG_ERR, "Can not create flow id for swap_lr_out");
-		return -EINVAL;
-	}
-
-	/* Creates a swap_lr plugin and sets the input and output ports. */
-	swap_lr = ARRAY_APPEND_ZERO(&ini->plugins);
-	fill_swap_lr_plugin(ini, swap_lr, sink_input_flowid_0,
-			    sink_input_flowid_1, swap_lr_output_flowid_0,
-			    swap_lr_output_flowid_1);
-
-	/* Look up first sink again because ini->plugins could be realloc'ed */
-	sink = find_first_playback_sink_plugin(ini);
-
-	/* The flow ids of sink input ports should be changed to flow ids of
-	 * {swap_lr_out:0}, {swap_lr_out:1}. */
-	ARRAY_ELEMENT(&sink->ports, 0)->flow_id = swap_lr_output_flowid_0;
-	ARRAY_ELEMENT(&sink->ports, 1)->flow_id = swap_lr_output_flowid_1;
-
-	return 0;
-}
-
-struct ini *create_mock_ini(const char *purpose, unsigned int num_channels)
-{
-	static char mock_flow_names[MAX_MOCK_INI_CH][9] = {
-		"{tmp:0}",  "{tmp:1}",	"{tmp:2}",  "{tmp:3}",	"{tmp:4}",
-		"{tmp:5}",  "{tmp:6}",	"{tmp:7}",  "{tmp:8}",	"{tmp:9}",
-		"{tmp:10}", "{tmp:11}", "{tmp:12}", "{tmp:13}", "{tmp:14}",
-		"{tmp:15}", "{tmp:16}", "{tmp:17}", "{tmp:18}", "{tmp:19}",
-	};
-	struct ini *ini;
-	struct plugin *source, *sink;
-	int tmp_flow_ids[MAX_MOCK_INI_CH];
-	int i;
-
-	if (num_channels > MAX_MOCK_INI_CH) {
-		syslog(LOG_ERR, "Unable to create %u channels of mock ini",
-		       num_channels);
-		return NULL;
-	}
-
-	ini = calloc(1, sizeof(struct ini));
-	if (!ini) {
-		syslog(LOG_ERR, "no memory for ini struct");
-		return NULL;
-	}
-
-	for (i = 0; i < num_channels; i++)
-		tmp_flow_ids[i] = add_new_flow(ini, mock_flow_names[i]);
-
-	source = ARRAY_APPEND_ZERO(&ini->plugins);
-	source->title = "source";
-	source->library = "builtin";
-	source->label = "source";
-	source->purpose = purpose;
-
-	for (i = 0; i < num_channels; i++)
-		add_audio_port(ini, source, tmp_flow_ids[i], PORT_OUTPUT);
-
-	sink = ARRAY_APPEND_ZERO(&ini->plugins);
-	sink->title = "sink";
-	sink->library = "builtin";
-	sink->label = "sink";
-	sink->purpose = purpose;
-
-	for (i = 0; i < num_channels; i++)
-		add_audio_port(ini, sink, tmp_flow_ids[i], PORT_INPUT);
-
-	fill_flow_info(ini);
-
-	return ini;
-}
-
-struct ini *cras_dsp_ini_create(const char *ini_filename)
-{
-	struct ini *ini;
-	dictionary *dict;
-	int nsec, i;
-	const char *sec_name;
-	struct plugin *plugin;
-	int rc;
-
-	ini = calloc(1, sizeof(struct ini));
-	if (!ini) {
-		syslog(LOG_ERR, "no memory for ini struct");
-		return NULL;
-	}
-
-	dict = iniparser_load_wrapper((char *)ini_filename);
-	if (!dict) {
-		syslog(LOG_DEBUG, "no ini file %s", ini_filename);
-		goto bail;
-	}
-	ini->dict = dict;
-
-	/* Parse the plugin sections */
-	nsec = iniparser_getnsec(dict);
-	for (i = 0; i < nsec; i++) {
-		sec_name = iniparser_getsecname(dict, i);
-		plugin = ARRAY_APPEND_ZERO(&ini->plugins);
-		if (parse_plugin_section(ini, sec_name, plugin) < 0)
-			goto bail;
-	}
-
-	/* Insert a swap_lr plugin before sink. */
-	rc = insert_swap_lr_plugin(ini);
-	if (rc < 0) {
-		syslog(LOG_ERR, "failed to insert swap_lr plugin");
-		goto bail;
-	}
-
-	/* Fill flow info now because now the plugin array won't change */
-	fill_flow_info(ini);
-
-	return ini;
-bail:
-	cras_dsp_ini_free(ini);
-	return NULL;
-}
-
-void cras_dsp_ini_free(struct ini *ini)
-{
-	struct plugin *p;
-	int i;
-
-	/* free plugins */
-	ARRAY_ELEMENT_FOREACH (&ini->plugins, i, p) {
-		cras_expr_expression_free(p->disable_expr);
-		ARRAY_FREE(&p->ports);
-	}
-	ARRAY_FREE(&ini->plugins);
-	ARRAY_FREE(&ini->flows);
-
-	if (ini->dict) {
-		iniparser_freedict(ini->dict);
-		ini->dict = NULL;
-	}
-
-	free(ini);
-}
-
-static const char *port_direction_str(enum port_direction port_direction)
-{
-	switch (port_direction) {
-	case PORT_INPUT:
-		return "input";
-	case PORT_OUTPUT:
-		return "output";
-	default:
-		return "unknown";
-	}
-}
-
-static const char *port_type_str(enum port_type port_type)
-{
-	switch (port_type) {
-	case PORT_CONTROL:
-		return "control";
-	case PORT_AUDIO:
-		return "audio";
-	default:
-		return "unknown";
-	}
-}
-
-static const char *plugin_title(struct plugin *plugin)
-{
-	if (plugin == NULL)
-		return "(null)";
-	return plugin->title;
-}
-
-void cras_dsp_ini_dump(struct dumper *d, struct ini *ini)
-{
-	int i, j;
-	struct plugin *plugin;
-	struct port *port;
-	const struct flow *flow;
-
-	dumpf(d, "---- ini dump begin ---\n");
-	dumpf(d, "ini->dict = %p\n", ini->dict);
-
-	dumpf(d, "number of plugins = %d\n", ARRAY_COUNT(&ini->plugins));
-	ARRAY_ELEMENT_FOREACH (&ini->plugins, i, plugin) {
-		dumpf(d, "[plugin %d: %s]\n", i, plugin->title);
-		dumpf(d, "library=%s\n", plugin->library);
-		dumpf(d, "label=%s\n", plugin->label);
-		dumpf(d, "purpose=%s\n", plugin->purpose);
-		dumpf(d, "disable=%p\n", plugin->disable_expr);
-		ARRAY_ELEMENT_FOREACH (&plugin->ports, j, port) {
-			dumpf(d,
-			      "  [%s port %d] type=%s, flow_id=%d, value=%g\n",
-			      port_direction_str(port->direction), j,
-			      port_type_str(port->type), port->flow_id,
-			      port->init_value);
-		}
-	}
-
-	dumpf(d, "number of flows = %d\n", ARRAY_COUNT(&ini->flows));
-	ARRAY_ELEMENT_FOREACH (&ini->flows, i, flow) {
-		dumpf(d, "  [flow %d] %s, %s, %s:%d -> %s:%d\n", i, flow->name,
-		      port_type_str(flow->type), plugin_title(flow->from),
-		      flow->from_port, plugin_title(flow->to), flow->to_port);
-	}
-
-	dumpf(d, "---- ini dump end ----\n");
-}
diff --git a/cras/src/server/cras_dsp_ini.h b/cras/src/server/cras_dsp_ini.h
deleted file mode 100644
index c839d4b..0000000
--- a/cras/src/server/cras_dsp_ini.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_DSP_INI_H_
-#define CRAS_DSP_INI_H_
-
-#include "iniparser_wrapper.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "array.h"
-#include "dumper.h"
-#include "cras_expr.h"
-
-enum port_direction {
-	PORT_INPUT,
-	PORT_OUTPUT,
-};
-
-enum port_type {
-	PORT_CONTROL,
-	PORT_AUDIO,
-};
-
-#define INVALID_FLOW_ID -1
-
-struct port {
-	enum port_direction direction;
-	enum port_type type;
-
-	/* This is only used if there is a flow connects to this port,
-	   -1 otherwise (i.e. the port has a constant input/output) */
-	int flow_id;
-
-	/* This is only used if type is PORT_CONTROL */
-	float init_value;
-};
-
-DECLARE_ARRAY_TYPE(struct port, port_array)
-
-struct plugin {
-	const char *title;
-	const char *library; /* file name like "plugin.so" */
-	const char *label; /* label like "Eq" */
-	const char *purpose; /* like "playback" or "capture" */
-	struct cras_expr_expression *disable_expr; /* the disable expression of
-					     this plugin */
-	port_array ports;
-};
-
-struct flow {
-	enum port_type type; /* the type of the ports this flow connects to */
-	const char *name;
-	struct plugin *from;
-	struct plugin *to;
-	int from_port;
-	int to_port;
-};
-
-DECLARE_ARRAY_TYPE(struct plugin, plugin_array)
-DECLARE_ARRAY_TYPE(struct flow, flow_array)
-
-struct ini {
-	dictionary *dict;
-	plugin_array plugins;
-	flow_array flows;
-};
-
-/*
- * Creates a mock ini structure equivalent to:
- *
- * [src]
- * out0={tmp:0}
- * out1={tmp:1}
- * ...
- *
- * [sink]
- * in0={tmp:0}
- * in1={tmp:1}
- * ...
- *
- * The caller of this function is responsible to free the returned
- * ini by calling cras_dsp_ini_free().
- */
-struct ini *create_mock_ini(const char *purpose, unsigned int num_channels);
-
-/* Reads the ini file into the ini structure */
-struct ini *cras_dsp_ini_create(const char *ini_filename);
-/* Frees the dsp structure. */
-void cras_dsp_ini_free(struct ini *ini);
-/* Dumps the information in the ini structure to syslog. */
-void cras_dsp_ini_dump(struct dumper *d, struct ini *ini);
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif /* CRAS_DSP_INI_H_ */
diff --git a/cras/src/server/cras_dsp_mod_builtin.c b/cras/src/server/cras_dsp_mod_builtin.c
deleted file mode 100644
index 296c0eb..0000000
--- a/cras/src/server/cras_dsp_mod_builtin.c
+++ /dev/null
@@ -1,631 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <stdlib.h>
-#include "cras_dsp_module.h"
-#include "drc.h"
-#include "dsp_util.h"
-#include "dcblock.h"
-#include "eq.h"
-#include "eq2.h"
-
-/*
- *  empty module functions (for source and sink)
- */
-static int empty_instantiate(struct dsp_module *module,
-			     unsigned long sample_rate)
-{
-	return 0;
-}
-
-static void empty_connect_port(struct dsp_module *module, unsigned long port,
-			       float *data_location)
-{
-}
-
-static int empty_get_delay(struct dsp_module *module)
-{
-	return 0;
-}
-
-static void empty_run(struct dsp_module *module, unsigned long sample_count)
-{
-}
-
-static void empty_deinstantiate(struct dsp_module *module)
-{
-}
-
-static void empty_free_module(struct dsp_module *module)
-{
-	free(module);
-}
-
-static int empty_get_properties(struct dsp_module *module)
-{
-	return 0;
-}
-
-static void empty_dump(struct dsp_module *module, struct dumper *d)
-{
-	dumpf(d, "built-in module\n");
-}
-
-static void empty_init_module(struct dsp_module *module)
-{
-	module->instantiate = &empty_instantiate;
-	module->connect_port = &empty_connect_port;
-	module->get_delay = &empty_get_delay;
-	module->run = &empty_run;
-	module->deinstantiate = &empty_deinstantiate;
-	module->free_module = &empty_free_module;
-	module->get_properties = &empty_get_properties;
-	module->dump = &empty_dump;
-}
-
-/*
- *  swap_lr module functions
- */
-static int swap_lr_instantiate(struct dsp_module *module,
-			       unsigned long sample_rate)
-{
-	module->data = calloc(4, sizeof(float *));
-	return 0;
-}
-
-static void swap_lr_connect_port(struct dsp_module *module, unsigned long port,
-				 float *data_location)
-{
-	float **ports;
-	ports = (float **)module->data;
-	ports[port] = data_location;
-}
-
-static void swap_lr_run(struct dsp_module *module, unsigned long sample_count)
-{
-	size_t i;
-	float **ports = (float **)module->data;
-
-	/* This module runs dsp in-place, so ports[0] == ports[2],
-	 * ports[1] == ports[3]. Here we swap data on two channels.
-	 */
-	for (i = 0; i < sample_count; i++) {
-		float temp = ports[0][i];
-		ports[2][i] = ports[1][i];
-		ports[3][i] = temp;
-	}
-}
-
-static void swap_lr_deinstantiate(struct dsp_module *module)
-{
-	free(module->data);
-}
-
-static void swap_lr_init_module(struct dsp_module *module)
-{
-	module->instantiate = &swap_lr_instantiate;
-	module->connect_port = &swap_lr_connect_port;
-	module->get_delay = &empty_get_delay;
-	module->run = &swap_lr_run;
-	module->deinstantiate = &swap_lr_deinstantiate;
-	module->free_module = &empty_free_module;
-	module->get_properties = &empty_get_properties;
-}
-
-/*
- *  invert_lr module functions
- */
-static int invert_lr_instantiate(struct dsp_module *module,
-				 unsigned long sample_rate)
-{
-	module->data = calloc(4, sizeof(float *));
-	return 0;
-}
-
-static void invert_lr_connect_port(struct dsp_module *module,
-				   unsigned long port, float *data_location)
-{
-	float **ports;
-	ports = (float **)module->data;
-	ports[port] = data_location;
-}
-
-static void invert_lr_run(struct dsp_module *module, unsigned long sample_count)
-{
-	size_t i;
-	float **ports = (float **)module->data;
-
-	for (i = 0; i < sample_count; i++) {
-		ports[2][i] = -ports[0][i];
-		ports[3][i] = ports[1][i];
-	}
-}
-
-static void invert_lr_deinstantiate(struct dsp_module *module)
-{
-	free(module->data);
-}
-
-static void invert_lr_init_module(struct dsp_module *module)
-{
-	module->instantiate = &invert_lr_instantiate;
-	module->connect_port = &invert_lr_connect_port;
-	module->get_delay = &empty_get_delay;
-	module->run = &invert_lr_run;
-	module->deinstantiate = &invert_lr_deinstantiate;
-	module->free_module = &empty_free_module;
-	module->get_properties = &empty_get_properties;
-}
-
-/*
- *  mix_stereo module functions
- */
-static int mix_stereo_instantiate(struct dsp_module *module,
-				  unsigned long sample_rate)
-{
-	module->data = calloc(4, sizeof(float *));
-	return 0;
-}
-
-static void mix_stereo_connect_port(struct dsp_module *module,
-				    unsigned long port, float *data_location)
-{
-	float **ports;
-	ports = (float **)module->data;
-	ports[port] = data_location;
-}
-
-static void mix_stereo_run(struct dsp_module *module,
-			   unsigned long sample_count)
-{
-	size_t i;
-	float tmp;
-	float **ports = (float **)module->data;
-
-	for (i = 0; i < sample_count; i++) {
-		tmp = ports[0][i] + ports[1][i];
-		ports[2][i] = tmp;
-		ports[3][i] = tmp;
-	}
-}
-
-static void mix_stereo_deinstantiate(struct dsp_module *module)
-{
-	free(module->data);
-}
-
-static void mix_stereo_init_module(struct dsp_module *module)
-{
-	module->instantiate = &mix_stereo_instantiate;
-	module->connect_port = &mix_stereo_connect_port;
-	module->get_delay = &empty_get_delay;
-	module->run = &mix_stereo_run;
-	module->deinstantiate = &mix_stereo_deinstantiate;
-	module->free_module = &empty_free_module;
-	module->get_properties = &empty_get_properties;
-	module->dump = &empty_dump;
-}
-
-/*
- *  dcblock module functions
- */
-struct dcblock_data {
-	struct dcblock *dcblockl;
-	struct dcblock *dcblockr;
-	unsigned long sample_rate;
-
-	/* One port for input, one for output, and 1 parameter */
-	float *ports[5];
-};
-
-static int dcblock_instantiate(struct dsp_module *module,
-			       unsigned long sample_rate)
-{
-	struct dcblock_data *data;
-
-	module->data = calloc(1, sizeof(struct dcblock_data));
-	data = (struct dcblock_data *)module->data;
-	data->sample_rate = sample_rate;
-
-	return 0;
-}
-
-static void dcblock_connect_port(struct dsp_module *module, unsigned long port,
-				 float *data_location)
-{
-	struct dcblock_data *data = (struct dcblock_data *)module->data;
-	data->ports[port] = data_location;
-}
-
-static void dcblock_run(struct dsp_module *module, unsigned long sample_count)
-{
-	struct dcblock_data *data = (struct dcblock_data *)module->data;
-	if (!data->dcblockl)
-		data->dcblockl =
-			dcblock_new(*data->ports[4], data->sample_rate);
-	if (!data->dcblockr)
-		data->dcblockr =
-			dcblock_new(*data->ports[4], data->sample_rate);
-	if (data->ports[0] != data->ports[2])
-		memcpy(data->ports[2], data->ports[0],
-		       sizeof(float) * sample_count);
-	if (data->ports[1] != data->ports[3])
-		memcpy(data->ports[3], data->ports[1],
-		       sizeof(float) * sample_count);
-
-	dcblock_process(data->dcblockl, data->ports[2], (int)sample_count);
-	dcblock_process(data->dcblockr, data->ports[3], (int)sample_count);
-}
-
-static void dcblock_deinstantiate(struct dsp_module *module)
-{
-	struct dcblock_data *data = (struct dcblock_data *)module->data;
-	if (data->dcblockl)
-		dcblock_free(data->dcblockl);
-	if (data->dcblockr)
-		dcblock_free(data->dcblockr);
-	free(data);
-}
-
-static void dcblock_init_module(struct dsp_module *module)
-{
-	module->instantiate = &dcblock_instantiate;
-	module->connect_port = &dcblock_connect_port;
-	module->get_delay = &empty_get_delay;
-	module->run = &dcblock_run;
-	module->deinstantiate = &dcblock_deinstantiate;
-	module->free_module = &empty_free_module;
-	module->get_properties = &empty_get_properties;
-	module->dump = &empty_dump;
-}
-
-/*
- *  eq module functions
- */
-struct eq_data {
-	int sample_rate;
-	struct eq *eq; /* Initialized in the first call of eq_run() */
-
-	/* One port for input, one for output, and 4 parameters per eq */
-	float *ports[2 + MAX_BIQUADS_PER_EQ * 4];
-};
-
-static int eq_instantiate(struct dsp_module *module, unsigned long sample_rate)
-{
-	struct eq_data *data;
-
-	module->data = calloc(1, sizeof(struct eq_data));
-	data = (struct eq_data *)module->data;
-	data->sample_rate = (int)sample_rate;
-	return 0;
-}
-
-static void eq_connect_port(struct dsp_module *module, unsigned long port,
-			    float *data_location)
-{
-	struct eq_data *data = (struct eq_data *)module->data;
-	data->ports[port] = data_location;
-}
-
-static void eq_run(struct dsp_module *module, unsigned long sample_count)
-{
-	struct eq_data *data = (struct eq_data *)module->data;
-	if (!data->eq) {
-		float nyquist = data->sample_rate / 2;
-		int i;
-
-		data->eq = eq_new();
-		for (i = 2; i < 2 + MAX_BIQUADS_PER_EQ * 4; i += 4) {
-			if (!data->ports[i])
-				break;
-			int type = (int)*data->ports[i];
-			float freq = *data->ports[i + 1];
-			float Q = *data->ports[i + 2];
-			float gain = *data->ports[i + 3];
-			eq_append_biquad(data->eq, type, freq / nyquist, Q,
-					 gain);
-		}
-	}
-	if (data->ports[0] != data->ports[1])
-		memcpy(data->ports[1], data->ports[0],
-		       sizeof(float) * sample_count);
-	eq_process(data->eq, data->ports[1], (int)sample_count);
-}
-
-static void eq_deinstantiate(struct dsp_module *module)
-{
-	struct eq_data *data = (struct eq_data *)module->data;
-	if (data->eq)
-		eq_free(data->eq);
-	free(data);
-}
-
-static void eq_init_module(struct dsp_module *module)
-{
-	module->instantiate = &eq_instantiate;
-	module->connect_port = &eq_connect_port;
-	module->get_delay = &empty_get_delay;
-	module->run = &eq_run;
-	module->deinstantiate = &eq_deinstantiate;
-	module->free_module = &empty_free_module;
-	module->get_properties = &empty_get_properties;
-	module->dump = &empty_dump;
-}
-
-/*
- *  eq2 module functions
- */
-struct eq2_data {
-	int sample_rate;
-	struct eq2 *eq2; /* Initialized in the first call of eq2_run() */
-
-	/* Two ports for input, two for output, and 8 parameters per eq pair */
-	float *ports[4 + MAX_BIQUADS_PER_EQ2 * 8];
-};
-
-static int eq2_instantiate(struct dsp_module *module, unsigned long sample_rate)
-{
-	struct eq2_data *data;
-
-	module->data = calloc(1, sizeof(struct eq2_data));
-	data = (struct eq2_data *)module->data;
-	data->sample_rate = (int)sample_rate;
-	return 0;
-}
-
-static void eq2_connect_port(struct dsp_module *module, unsigned long port,
-			     float *data_location)
-{
-	struct eq2_data *data = (struct eq2_data *)module->data;
-	data->ports[port] = data_location;
-}
-
-static void eq2_run(struct dsp_module *module, unsigned long sample_count)
-{
-	struct eq2_data *data = (struct eq2_data *)module->data;
-	if (!data->eq2) {
-		float nyquist = data->sample_rate / 2;
-		int i, channel;
-
-		data->eq2 = eq2_new();
-		for (i = 4; i < 4 + MAX_BIQUADS_PER_EQ2 * 8; i += 8) {
-			if (!data->ports[i])
-				break;
-			for (channel = 0; channel < 2; channel++) {
-				int k = i + channel * 4;
-				int type = (int)*data->ports[k];
-				float freq = *data->ports[k + 1];
-				float Q = *data->ports[k + 2];
-				float gain = *data->ports[k + 3];
-				eq2_append_biquad(data->eq2, channel, type,
-						  freq / nyquist, Q, gain);
-			}
-		}
-	}
-
-	if (data->ports[0] != data->ports[2])
-		memcpy(data->ports[2], data->ports[0],
-		       sizeof(float) * sample_count);
-	if (data->ports[3] != data->ports[1])
-		memcpy(data->ports[3], data->ports[1],
-		       sizeof(float) * sample_count);
-
-	eq2_process(data->eq2, data->ports[2], data->ports[3],
-		    (int)sample_count);
-}
-
-static void eq2_deinstantiate(struct dsp_module *module)
-{
-	struct eq2_data *data = (struct eq2_data *)module->data;
-	if (data->eq2)
-		eq2_free(data->eq2);
-	free(data);
-}
-
-static void eq2_init_module(struct dsp_module *module)
-{
-	module->instantiate = &eq2_instantiate;
-	module->connect_port = &eq2_connect_port;
-	module->get_delay = &empty_get_delay;
-	module->run = &eq2_run;
-	module->deinstantiate = &eq2_deinstantiate;
-	module->free_module = &empty_free_module;
-	module->get_properties = &empty_get_properties;
-	module->dump = &empty_dump;
-}
-
-/*
- *  drc module functions
- */
-struct drc_data {
-	int sample_rate;
-	struct drc *drc; /* Initialized in the first call of drc_run() */
-
-	/* Two ports for input, two for output, one for disable_emphasis,
-	 * and 8 parameters each band */
-	float *ports[4 + 1 + 8 * 3];
-};
-
-static int drc_instantiate(struct dsp_module *module, unsigned long sample_rate)
-{
-	struct drc_data *data;
-
-	module->data = calloc(1, sizeof(struct drc_data));
-	data = (struct drc_data *)module->data;
-	data->sample_rate = (int)sample_rate;
-	return 0;
-}
-
-static void drc_connect_port(struct dsp_module *module, unsigned long port,
-			     float *data_location)
-{
-	struct drc_data *data = (struct drc_data *)module->data;
-	data->ports[port] = data_location;
-}
-
-static int drc_get_delay(struct dsp_module *module)
-{
-	struct drc_data *data = (struct drc_data *)module->data;
-	return DRC_DEFAULT_PRE_DELAY * data->sample_rate;
-}
-
-static void drc_run(struct dsp_module *module, unsigned long sample_count)
-{
-	struct drc_data *data = (struct drc_data *)module->data;
-	if (!data->drc) {
-		int i;
-		float nyquist = data->sample_rate / 2;
-		struct drc *drc = drc_new(data->sample_rate);
-
-		data->drc = drc;
-		drc->emphasis_disabled = (int)*data->ports[4];
-		for (i = 0; i < 3; i++) {
-			int k = 5 + i * 8;
-			float f = *data->ports[k];
-			float enable = *data->ports[k + 1];
-			float threshold = *data->ports[k + 2];
-			float knee = *data->ports[k + 3];
-			float ratio = *data->ports[k + 4];
-			float attack = *data->ports[k + 5];
-			float release = *data->ports[k + 6];
-			float boost = *data->ports[k + 7];
-			drc_set_param(drc, i, PARAM_CROSSOVER_LOWER_FREQ,
-				      f / nyquist);
-			drc_set_param(drc, i, PARAM_ENABLED, enable);
-			drc_set_param(drc, i, PARAM_THRESHOLD, threshold);
-			drc_set_param(drc, i, PARAM_KNEE, knee);
-			drc_set_param(drc, i, PARAM_RATIO, ratio);
-			drc_set_param(drc, i, PARAM_ATTACK, attack);
-			drc_set_param(drc, i, PARAM_RELEASE, release);
-			drc_set_param(drc, i, PARAM_POST_GAIN, boost);
-		}
-		drc_init(drc);
-	}
-	if (data->ports[0] != data->ports[2])
-		memcpy(data->ports[2], data->ports[0],
-		       sizeof(float) * sample_count);
-	if (data->ports[1] != data->ports[3])
-		memcpy(data->ports[3], data->ports[1],
-		       sizeof(float) * sample_count);
-
-	drc_process(data->drc, &data->ports[2], (int)sample_count);
-}
-
-static void drc_deinstantiate(struct dsp_module *module)
-{
-	struct drc_data *data = (struct drc_data *)module->data;
-	if (data->drc)
-		drc_free(data->drc);
-	free(data);
-}
-
-static void drc_init_module(struct dsp_module *module)
-{
-	module->instantiate = &drc_instantiate;
-	module->connect_port = &drc_connect_port;
-	module->get_delay = &drc_get_delay;
-	module->run = &drc_run;
-	module->deinstantiate = &drc_deinstantiate;
-	module->free_module = &empty_free_module;
-	module->get_properties = &empty_get_properties;
-	module->dump = &empty_dump;
-}
-
-/*
- * sink module functions
- */
-struct sink_data {
-	struct ext_dsp_module *ext_module;
-	float *ports[MAX_EXT_DSP_PORTS];
-};
-
-static int sink_instantiate(struct dsp_module *module,
-			    unsigned long sample_rate)
-{
-	module->data = (struct sink_data *)calloc(1, sizeof(struct sink_data));
-	return 0;
-}
-
-static void sink_deinstantiate(struct dsp_module *module)
-{
-	struct sink_data *data = (struct sink_data *)module->data;
-	free(data);
-}
-
-static void sink_connect_port(struct dsp_module *module, unsigned long port,
-			      float *data_location)
-{
-	struct sink_data *data = (struct sink_data *)module->data;
-	data->ports[port] = data_location;
-}
-
-static void sink_run(struct dsp_module *module, unsigned long sample_count)
-{
-	struct sink_data *data = (struct sink_data *)module->data;
-
-	if (!data->ext_module)
-		return;
-	data->ext_module->run(data->ext_module, sample_count);
-}
-
-static void sink_init_module(struct dsp_module *module)
-{
-	module->instantiate = &sink_instantiate;
-	module->connect_port = &sink_connect_port;
-	module->get_delay = &empty_get_delay;
-	module->run = &sink_run;
-	module->deinstantiate = &sink_deinstantiate;
-	module->free_module = &empty_free_module;
-	module->get_properties = &empty_get_properties;
-	module->dump = &empty_dump;
-}
-
-void cras_dsp_module_set_sink_ext_module(struct dsp_module *module,
-					 struct ext_dsp_module *ext_module)
-{
-	struct sink_data *data = (struct sink_data *)module->data;
-	int i;
-	data->ext_module = ext_module;
-
-	if (data->ext_module == NULL)
-		return;
-
-	for (i = 0; i < MAX_EXT_DSP_PORTS; i++)
-		ext_module->ports[i] = data->ports[i];
-}
-
-/*
- *  builtin module dispatcher
- */
-struct dsp_module *cras_dsp_module_load_builtin(struct plugin *plugin)
-{
-	struct dsp_module *module;
-	if (strcmp(plugin->library, "builtin") != 0)
-		return NULL;
-
-	module = calloc(1, sizeof(struct dsp_module));
-
-	if (strcmp(plugin->label, "mix_stereo") == 0) {
-		mix_stereo_init_module(module);
-	} else if (strcmp(plugin->label, "invert_lr") == 0) {
-		invert_lr_init_module(module);
-	} else if (strcmp(plugin->label, "dcblock") == 0) {
-		dcblock_init_module(module);
-	} else if (strcmp(plugin->label, "eq") == 0) {
-		eq_init_module(module);
-	} else if (strcmp(plugin->label, "eq2") == 0) {
-		eq2_init_module(module);
-	} else if (strcmp(plugin->label, "drc") == 0) {
-		drc_init_module(module);
-	} else if (strcmp(plugin->label, "swap_lr") == 0) {
-		swap_lr_init_module(module);
-	} else if (strcmp(plugin->label, "sink") == 0) {
-		sink_init_module(module);
-	} else {
-		empty_init_module(module);
-	}
-
-	return module;
-}
diff --git a/cras/src/server/cras_dsp_mod_ladspa.c b/cras/src/server/cras_dsp_mod_ladspa.c
deleted file mode 100644
index 2ee1539..0000000
--- a/cras/src/server/cras_dsp_mod_ladspa.c
+++ /dev/null
@@ -1,217 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <dlfcn.h>
-#include <syslog.h>
-#include <ladspa.h>
-
-#include "cras_dsp_module.h"
-
-#define PLUGIN_PATH_PREFIX "/usr/lib/ladspa"
-#define PLUGIN_PATH_MAX 256
-
-struct ladspa_data {
-	void *dlopen_handle; /* the handle returned by dlopen() */
-	const LADSPA_Descriptor *descriptor;
-	LADSPA_Handle *handle; /* returned by instantiate() */
-	int activated;
-};
-
-static void activate(struct dsp_module *module)
-{
-	struct ladspa_data *data = module->data;
-	const LADSPA_Descriptor *desc = data->descriptor;
-	data->activated = 1;
-	if (!desc->activate)
-		return;
-	desc->activate(data->handle);
-}
-
-static void deactivate(struct dsp_module *module)
-{
-	struct ladspa_data *data = module->data;
-	const LADSPA_Descriptor *desc = data->descriptor;
-	data->activated = 0;
-	if (!desc->deactivate)
-		return;
-	desc->deactivate(data->handle);
-}
-
-static int instantiate(struct dsp_module *module, unsigned long sample_rate)
-{
-	struct ladspa_data *data = module->data;
-	const LADSPA_Descriptor *desc = data->descriptor;
-
-	data->handle = desc->instantiate(desc, sample_rate);
-	if (!data->handle) {
-		syslog(LOG_ERR, "instantiate failed for %s, rate %ld",
-		       desc->Label, sample_rate);
-		return -1;
-	}
-	return 0;
-}
-
-static void deinstantiate(struct dsp_module *module)
-{
-	struct ladspa_data *data = module->data;
-	const LADSPA_Descriptor *desc = data->descriptor;
-
-	if (data->activated)
-		deactivate(module);
-	desc->cleanup(data->handle);
-	data->handle = NULL;
-}
-
-static void connect_port(struct dsp_module *module, unsigned long port,
-			 float *data_location)
-{
-	struct ladspa_data *data = module->data;
-	const LADSPA_Descriptor *desc = data->descriptor;
-	desc->connect_port(data->handle, port, data_location);
-}
-
-static int get_delay(struct dsp_module *module)
-{
-	return 0;
-}
-
-static void run(struct dsp_module *module, unsigned long sample_count)
-{
-	struct ladspa_data *data = module->data;
-	const LADSPA_Descriptor *desc = data->descriptor;
-
-	if (!data->activated)
-		activate(module);
-	desc->run(data->handle, sample_count);
-}
-
-static void free_module(struct dsp_module *module)
-{
-	struct ladspa_data *data = module->data;
-	if (data->activated)
-		deactivate(module);
-	if (data->dlopen_handle) {
-		dlclose(data->dlopen_handle);
-		data->dlopen_handle = NULL;
-	}
-	free(module->data);
-	free(module);
-}
-
-static int get_properties(struct dsp_module *module)
-{
-	struct ladspa_data *data = module->data;
-	int properties = 0;
-	if (LADSPA_IS_INPLACE_BROKEN(data->descriptor->Properties))
-		properties |= MODULE_INPLACE_BROKEN;
-	return properties;
-}
-
-static void dump(struct dsp_module *module, struct dumper *d)
-{
-	struct ladspa_data *data = module->data;
-	const LADSPA_Descriptor *descriptor = data->descriptor;
-
-	dumpf(d, "  LADSPA: dlopen=%p, desc=%p, handle=%p, activated=%d\n",
-	      data->dlopen_handle, data->descriptor, data->handle,
-	      data->activated);
-	if (descriptor) {
-		dumpf(d, "   Name=%s\n", descriptor->Name);
-		dumpf(d, "   Maker=%s\n", descriptor->Maker);
-	}
-}
-
-static int verify_plugin_descriptor(struct plugin *plugin,
-				    const LADSPA_Descriptor *desc)
-{
-	int i;
-	struct port *port;
-
-	if (desc->PortCount != ARRAY_COUNT(&plugin->ports)) {
-		syslog(LOG_ERR, "port count mismatch: %s", plugin->title);
-		return -1;
-	}
-
-	ARRAY_ELEMENT_FOREACH (&plugin->ports, i, port) {
-		LADSPA_PortDescriptor port_desc = desc->PortDescriptors[i];
-		if ((port->direction == PORT_INPUT) !=
-		    !!(port_desc & LADSPA_PORT_INPUT)) {
-			syslog(LOG_ERR, "port direction mismatch: %s:%d!",
-			       plugin->title, i);
-			return -1;
-		}
-
-		if ((port->type == PORT_CONTROL) !=
-		    !!(port_desc & LADSPA_PORT_CONTROL)) {
-			syslog(LOG_ERR, "port type mismatch: %s:%d!",
-			       plugin->title, i);
-			return -1;
-		}
-	}
-
-	return 0;
-}
-
-struct dsp_module *cras_dsp_module_load_ladspa(struct plugin *plugin)
-{
-	char path[PLUGIN_PATH_MAX];
-	int index;
-	LADSPA_Descriptor_Function desc_func;
-	struct ladspa_data *data = calloc(1, sizeof(struct ladspa_data));
-	struct dsp_module *module;
-
-	snprintf(path, sizeof(path), "%s/%s", PLUGIN_PATH_PREFIX,
-		 plugin->library);
-
-	data->dlopen_handle = dlopen(path, RTLD_NOW);
-	if (!data->dlopen_handle) {
-		syslog(LOG_ERR, "cannot open plugin from %s: %s", path,
-		       dlerror());
-		goto bail;
-	}
-
-	desc_func = (LADSPA_Descriptor_Function)dlsym(data->dlopen_handle,
-						      "ladspa_descriptor");
-
-	if (!desc_func) {
-		syslog(LOG_ERR, "cannot find descriptor function from %s: %s",
-		       path, dlerror());
-		goto bail;
-	}
-
-	for (index = 0;; index++) {
-		const LADSPA_Descriptor *desc = desc_func(index);
-		if (desc == NULL) {
-			syslog(LOG_ERR, "cannot find label %s from %s",
-			       plugin->label, path);
-			goto bail;
-		}
-		if (strcmp(desc->Label, plugin->label) == 0) {
-			syslog(LOG_DEBUG, "plugin '%s' loaded from %s",
-			       plugin->label, path);
-			if (verify_plugin_descriptor(plugin, desc) != 0)
-				goto bail;
-			data->descriptor = desc;
-			break;
-		}
-	}
-
-	module = calloc(1, sizeof(struct dsp_module));
-	module->data = data;
-	module->instantiate = &instantiate;
-	module->connect_port = &connect_port;
-	module->get_delay = &get_delay;
-	module->run = &run;
-	module->deinstantiate = &deinstantiate;
-	module->get_properties = &get_properties;
-	module->free_module = &free_module;
-	module->dump = &dump;
-	return module;
-bail:
-	if (data->dlopen_handle)
-		dlclose(data->dlopen_handle);
-	free(data);
-	return NULL;
-}
diff --git a/cras/src/server/cras_dsp_module.h b/cras/src/server/cras_dsp_module.h
deleted file mode 100644
index 53b9dca..0000000
--- a/cras/src/server/cras_dsp_module.h
+++ /dev/null
@@ -1,118 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_DSP_MODULE_H_
-#define CRAS_DSP_MODULE_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "cras_dsp_ini.h"
-
-#define MAX_EXT_DSP_PORTS 8
-
-/* Holds the functions we can use on a dsp module. */
-struct dsp_module {
-	/* Opaque data used by the implementation of this module */
-	void *data;
-
-	/* Initializes the module for a given sampling rate. To change
-	 * the sampling rate, deinstantiate() must be called before
-	 * calling instantiate again.
-	 * Args:
-	 *    sample_rate - The sampling rate for the audio data, like 44100.
-	 * Returns:
-	 *    0 if the initialization is successful. -1 otherwise.
-	 */
-	int (*instantiate)(struct dsp_module *mod, unsigned long sample_rate);
-
-	/* Assigns the memory location for a port of this module.
-	 * Args:
-	 *    port - The index of the port.
-	 *    data_location - The memory address of the data for this port.
-	 */
-	void (*connect_port)(struct dsp_module *mod, unsigned long port,
-			     float *data_location);
-
-	/* Returns the buffering delay of this module. This should be called
-	 * only after all input control ports have been connected.
-	 * Returns:
-	 *     The buffering delay in frames. The value returned should only be
-	 * based on the sampling rate and the input control ports values and not
-	 * the audio data itself.
-	 */
-	int (*get_delay)(struct dsp_module *mod);
-
-	/* Processes a block of samples using this module. The memory
-	 * location for the input and output data are assigned by the
-	 * connect_port() call.
-	 * Args:
-	 *    sample_count - The number of samples to be processed.
-	 */
-	void (*run)(struct dsp_module *mod, unsigned long sample_count);
-
-	/* Free resources used by the module. This module can be used
-	 * again by calling instantiate() */
-	void (*deinstantiate)(struct dsp_module *mod);
-
-	/* Frees all resources used by this module. After calling
-	 * free_module(), this struct dsp_module cannot be used
-	 * anymore.
-	 */
-	void (*free_module)(struct dsp_module *mod);
-
-	/* Returns special properties of this module, see the enum
-	 * below for details */
-	int (*get_properties)(struct dsp_module *mod);
-
-	/* Dumps the information about current state of this module */
-	void (*dump)(struct dsp_module *mod, struct dumper *d);
-};
-
-/* An external module interface working with existing dsp pipeline.
- * __________  ___________        ____________      __________
- * |        |  |         |        |          |      |        |
- * |        |->| dsp mod |-> ...->| dsp mod  | ---> |        |
- * | device |  |_________|        |__________|      | stream |
- * |        |                      | ___________    |        |
- * |        |                      | | ext     |    |        |
- * |        |                      ->| dsp mod | -> |        |
- * |________|                        |_________|    |________|
- *
- * According to above diagram, an ext_dsp_module works by appending to
- * the sink of existing dsp pipeline. For audio input, this creates a
- * multiple output pipeline that stream can read processed buffer from.
- * This is useful for a stream to apply special processing effects while
- * sharing the common dsp with the other streams.
- *
- * Members:
- *    ports - A list of ports can connect to existing dsp ports in a pipeline.
- *    run - Processes |nframes| of data.
- *    configure - Configures given external dsp module by the device buffer
- *        size, rate, and number of channels of the format of the device that
- *        the associated pipeline runs for.
- */
-struct ext_dsp_module {
-	float *ports[MAX_EXT_DSP_PORTS];
-	void (*run)(struct ext_dsp_module *ext, unsigned int nframes);
-	void (*configure)(struct ext_dsp_module *ext, unsigned int buffer_size,
-			  unsigned int num_channels, unsigned int rate);
-};
-
-enum { MODULE_INPLACE_BROKEN = 1 }; /* See ladspa.h for explanation */
-
-/* Connects an external dsp module to a builtin sink module. */
-void cras_dsp_module_set_sink_ext_module(struct dsp_module *module,
-					 struct ext_dsp_module *ext_module);
-
-struct dsp_module *cras_dsp_module_load_ladspa(struct plugin *plugin);
-struct dsp_module *cras_dsp_module_load_builtin(struct plugin *plugin);
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif /* CRAS_DSP_MODULE_H_ */
diff --git a/cras/src/server/cras_dsp_pipeline.c b/cras/src/server/cras_dsp_pipeline.c
deleted file mode 100644
index 9e492ac..0000000
--- a/cras/src/server/cras_dsp_pipeline.c
+++ /dev/null
@@ -1,1007 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <inttypes.h>
-#include <sys/param.h>
-#include <syslog.h>
-
-#include "cras_util.h"
-#include "cras_dsp_module.h"
-#include "cras_dsp_pipeline.h"
-#include "dsp_util.h"
-
-/* We have a static representation of the dsp graph in a "struct ini",
- * and here we will construct a dynamic representation of it in a
- * "struct pipeline". The difference between the static one and the
- * dynamic one is that we will only include the subset of the dsp
- * graph actually needed in the dynamic one (so those plugins that are
- * disabled will not be included). Here are the mapping between the
- * static representation and the dynamic representation:
- *
- *      static                      dynamic
- *  -------------    --------------------------------------
- *  struct ini       struct pipeline
- *  struct plugin    struct instance
- *  strict port      struct audio_port, struct control_port
- *
- * For example, if the ini file specifies these plugins and their
- * connections:
- *
- * [A]
- * output_0={audio}
- * [B]
- * input_0={audio}
- * output_1={result}
- * [C]
- * input_0={result}
- *
- * That is, A connects to B, and B connects to C. If the plugin B is
- * now disabled, in the pipeline we construct there will only be two
- * instances (A and C) and the audio ports on these instances will
- * connect to each other directly, bypassing B.
- */
-
-/* This represents an audio port on an instance. */
-struct audio_port {
-	struct audio_port *peer; /* the audio port this port connects to */
-	struct plugin *plugin; /* the plugin corresponds to the instance */
-	int original_index; /* the port index in the plugin */
-	int buf_index; /* the buffer index in the pipeline */
-};
-
-/* This represents a control port on an instance. */
-struct control_port {
-	struct control_port *peer; /* the control port this port connects to */
-	struct plugin *plugin; /* the plugin corresponds to the instance */
-	int original_index; /* the port index in the plugin */
-	float value; /* the value of the control port */
-};
-
-DECLARE_ARRAY_TYPE(struct audio_port, audio_port_array);
-DECLARE_ARRAY_TYPE(struct control_port, control_port_array);
-
-/* An instance is a dynamic representation of a plugin. We only create
- * an instance when a plugin is needed (data actually flows through it
- * and it is not disabled). An instance also contains a pointer to a
- * struct dsp_module, which is the implementation of the plugin */
-struct instance {
-	/* The plugin this instance corresponds to */
-	struct plugin *plugin;
-
-	/* These are the ports on this instance. The difference
-	 * between this and the port array in a struct plugin is that
-	 * the ports skip disabled plugins and connect to the upstream
-	 * ports directly.
-	 */
-	audio_port_array input_audio_ports;
-	audio_port_array output_audio_ports;
-	control_port_array input_control_ports;
-	control_port_array output_control_ports;
-
-	/* The implementation of the plugin */
-	struct dsp_module *module;
-
-	/* Whether this module's instantiate() function has been called */
-	int instantiated;
-
-	/* This caches the value returned from get_properties() of a module */
-	int properties;
-
-	/* This is the total buffering delay from source to this instance. It is
-	 * in number of frames. */
-	int total_delay;
-};
-
-DECLARE_ARRAY_TYPE(struct instance, instance_array)
-
-/* An pipeline is a dynamic representation of a dsp ini file. */
-struct pipeline {
-	/* The purpose of the pipeline. "playback" or "capture" */
-	const char *purpose;
-
-	/* The ini file this pipeline comes from */
-	struct ini *ini;
-
-	/* All needed instances for this pipeline. It is sorted in an
-	 * order that if instance B depends on instance A, then A will
-	 * appear in front of B. */
-	instance_array instances;
-
-	/* The maximum number of audio buffers that will be used at
-	 * the same time for this pipeline */
-	int peak_buf;
-
-	/* The audio data buffers */
-	float **buffers;
-
-	/* The instance where the audio data flow in */
-	struct instance *source_instance;
-
-	/* The instance where the audio data flow out */
-	struct instance *sink_instance;
-
-	/* The number of audio channels for this pipeline */
-	int input_channels;
-	int output_channels;
-
-	/* The audio sampling rate for this pipleine. It is zero if
-	 * cras_dsp_pipeline_instantiate() has not been called. */
-	int sample_rate;
-
-	/* The total time it takes to run the pipeline, in nanoseconds. */
-	int64_t total_time;
-
-	/* The max/min time it takes to run the pipeline, in nanoseconds. */
-	int64_t max_time;
-	int64_t min_time;
-
-	/* The number of blocks the pipeline. */
-	int64_t total_blocks;
-
-	/* The total number of sample frames the pipeline processed */
-	int64_t total_samples;
-};
-
-static struct instance *find_instance_by_plugin(const instance_array *instances,
-						const struct plugin *plugin)
-{
-	int i;
-	struct instance *instance;
-
-	ARRAY_ELEMENT_FOREACH (instances, i, instance) {
-		if (instance->plugin == plugin)
-			return instance;
-	}
-
-	return NULL;
-}
-
-/* Finds out where the data sent to plugin:index come from. The issue
- * we need to handle here is the previous plugin may be disabled, so
- * we need to go upstream until we find the real origin */
-static int find_origin_port(struct ini *ini, const instance_array *instances,
-			    const struct plugin *plugin, int index,
-			    const struct plugin **origin, int *origin_index)
-{
-	enum port_type type;
-	struct port *port;
-	int flow_id;
-	struct flow *flow;
-	int i, k;
-	int found;
-
-	port = ARRAY_ELEMENT(&plugin->ports, index);
-	type = port->type;
-	flow_id = port->flow_id;
-	if (flow_id == INVALID_FLOW_ID)
-		return -1;
-	flow = ARRAY_ELEMENT(&ini->flows, flow_id);
-
-	/* move to the previous plugin */
-	plugin = flow->from;
-	index = flow->from_port;
-
-	/* if the plugin is not disabled, it will be pointed by some instance */
-	if (find_instance_by_plugin(instances, plugin)) {
-		*origin = plugin;
-		*origin_index = index;
-		return 0;
-	}
-
-	/* Now we know the previous plugin is disabled, we need to go
-	 * upstream. We assume the k-th output port of the plugin
-	 * corresponds to the k-th input port of the plugin (with the
-	 * same type) */
-
-	k = 0;
-	found = 0;
-	ARRAY_ELEMENT_FOREACH (&plugin->ports, i, port) {
-		if (index == i) {
-			found = 1;
-			break;
-		}
-		if (port->direction == PORT_OUTPUT && port->type == type)
-			k++;
-	}
-	if (!found)
-		return -1;
-
-	found = 0;
-	ARRAY_ELEMENT_FOREACH (&plugin->ports, i, port) {
-		if (port->direction == PORT_INPUT && port->type == type) {
-			if (k-- == 0) {
-				index = i;
-				found = 1;
-				break;
-			}
-		}
-	}
-	if (!found)
-		return -1;
-
-	return find_origin_port(ini, instances, plugin, index, origin,
-				origin_index);
-}
-
-static struct audio_port *find_output_audio_port(instance_array *instances,
-						 const struct plugin *plugin,
-						 int index)
-{
-	int i;
-	struct instance *instance;
-	struct audio_port *audio_port;
-
-	instance = find_instance_by_plugin(instances, plugin);
-	if (!instance)
-		return NULL;
-
-	ARRAY_ELEMENT_FOREACH (&instance->output_audio_ports, i, audio_port) {
-		if (audio_port->original_index == index)
-			return audio_port;
-	}
-
-	return NULL;
-}
-
-static struct control_port *find_output_control_port(instance_array *instances,
-						     const struct plugin *plugin,
-						     int index)
-{
-	int i;
-	struct instance *instance;
-	struct control_port *control_port;
-
-	instance = find_instance_by_plugin(instances, plugin);
-	if (!instance)
-		return NULL;
-
-	ARRAY_ELEMENT_FOREACH (&instance->output_control_ports, i,
-			       control_port) {
-		if (control_port->original_index == index)
-			return control_port;
-	}
-
-	return NULL;
-}
-
-static char is_disabled(struct plugin *plugin, struct cras_expr_env *env)
-{
-	char disabled;
-	return (plugin->disable_expr &&
-		cras_expr_expression_eval_boolean(plugin->disable_expr, env,
-						  &disabled) == 0 &&
-		disabled == 1);
-}
-
-static int topological_sort(struct pipeline *pipeline,
-			    struct cras_expr_env *env, struct plugin *plugin,
-			    char *visited)
-{
-	struct port *port;
-	struct flow *flow;
-	int index;
-	int i;
-	int flow_id;
-	struct instance *instance;
-	struct ini *ini = pipeline->ini;
-
-	index = ARRAY_INDEX(&ini->plugins, plugin);
-	if (visited[index])
-		return 0;
-	visited[index] = 1;
-
-	ARRAY_ELEMENT_FOREACH (&plugin->ports, i, port) {
-		if (port->flow_id == INVALID_FLOW_ID)
-			continue;
-		flow_id = port->flow_id;
-		flow = ARRAY_ELEMENT(&ini->flows, flow_id);
-		if (!flow->from) {
-			syslog(LOG_ERR, "no plugin flows to %s:%d",
-			       plugin->title, i);
-			return -1;
-		}
-		if (topological_sort(pipeline, env, flow->from, visited) < 0)
-			return -1;
-	}
-
-	/* if the plugin is disabled, we don't construct an instance for it */
-	if (is_disabled(plugin, env))
-		return 0;
-
-	instance = ARRAY_APPEND_ZERO(&pipeline->instances);
-	instance->plugin = plugin;
-
-	/* constructs audio and control ports for the instance */
-	ARRAY_ELEMENT_FOREACH (&plugin->ports, i, port) {
-		int need_connect = (port->flow_id != INVALID_FLOW_ID &&
-				    port->direction == PORT_INPUT);
-		const struct plugin *origin = NULL;
-		int origin_index = 0;
-
-		if (need_connect) {
-			if (find_origin_port(ini, &pipeline->instances, plugin,
-					     i, &origin, &origin_index) < 0)
-				return -1;
-		}
-
-		if (port->type == PORT_AUDIO) {
-			audio_port_array *audio_port_array =
-				(port->direction == PORT_INPUT) ?
-					&instance->input_audio_ports :
-					&instance->output_audio_ports;
-			struct audio_port *audio_port =
-				ARRAY_APPEND_ZERO(audio_port_array);
-			audio_port->plugin = plugin;
-			audio_port->original_index = i;
-			if (need_connect) {
-				struct audio_port *from;
-				from = find_output_audio_port(
-					&pipeline->instances, origin,
-					origin_index);
-				if (!from)
-					return -1;
-				from->peer = audio_port;
-				audio_port->peer = from;
-			}
-		} else if (port->type == PORT_CONTROL) {
-			control_port_array *control_port_array =
-				(port->direction == PORT_INPUT) ?
-					&instance->input_control_ports :
-					&instance->output_control_ports;
-			struct control_port *control_port =
-				ARRAY_APPEND_ZERO(control_port_array);
-			control_port->plugin = plugin;
-			control_port->original_index = i;
-			control_port->value = port->init_value;
-			if (need_connect) {
-				struct control_port *from;
-				from = find_output_control_port(
-					&pipeline->instances, origin,
-					origin_index);
-				if (!from)
-					return -1;
-				from->peer = control_port;
-				control_port->peer = from;
-			}
-		}
-	}
-
-	return 0;
-}
-
-static struct plugin *find_enabled_builtin_plugin(struct ini *ini,
-						  const char *label,
-						  const char *purpose,
-						  struct cras_expr_env *env)
-{
-	int i;
-	struct plugin *plugin, *found = NULL;
-
-	ARRAY_ELEMENT_FOREACH (&ini->plugins, i, plugin) {
-		if (strcmp(plugin->library, "builtin") != 0)
-			continue;
-		if (strcmp(plugin->label, label) != 0)
-			continue;
-		if (!plugin->purpose || strcmp(plugin->purpose, purpose) != 0)
-			continue;
-		if (is_disabled(plugin, env))
-			continue;
-		if (found) {
-			syslog(LOG_ERR, "two %s plugins enabled: %s and %s",
-			       label, found->title, plugin->title);
-			return NULL;
-		}
-		found = plugin;
-	}
-
-	return found;
-}
-
-struct pipeline *cras_dsp_pipeline_create(struct ini *ini,
-					  struct cras_expr_env *env,
-					  const char *purpose)
-{
-	struct pipeline *pipeline;
-	int n;
-	char *visited;
-	int rc;
-	struct plugin *source =
-		find_enabled_builtin_plugin(ini, "source", purpose, env);
-	struct plugin *sink =
-		find_enabled_builtin_plugin(ini, "sink", purpose, env);
-
-	if (!source || !sink) {
-		syslog(LOG_DEBUG,
-		       "no enabled source or sink found %p/%p for %s", source,
-		       sink, purpose);
-		return NULL;
-	}
-
-	pipeline = calloc(1, sizeof(struct pipeline));
-	if (!pipeline) {
-		syslog(LOG_ERR, "no memory for pipeline");
-		return NULL;
-	}
-
-	pipeline->ini = ini;
-	pipeline->purpose = purpose;
-	/* create instances for needed plugins, in the order of dependency */
-	n = ARRAY_COUNT(&ini->plugins);
-	visited = calloc(1, n);
-	rc = topological_sort(pipeline, env, sink, visited);
-	free(visited);
-
-	if (rc < 0) {
-		syslog(LOG_ERR, "failed to construct pipeline");
-		cras_dsp_pipeline_free(pipeline);
-		return NULL;
-	}
-
-	pipeline->source_instance =
-		find_instance_by_plugin(&pipeline->instances, source);
-	pipeline->sink_instance =
-		find_instance_by_plugin(&pipeline->instances, sink);
-
-	if (!pipeline->source_instance || !pipeline->sink_instance) {
-		syslog(LOG_ERR, "source(%p) or sink(%p) missing/disabled?",
-		       source, sink);
-		cras_dsp_pipeline_free(pipeline);
-		return NULL;
-	}
-
-	pipeline->input_channels =
-		ARRAY_COUNT(&pipeline->source_instance->output_audio_ports);
-	pipeline->output_channels =
-		ARRAY_COUNT(&pipeline->sink_instance->input_audio_ports);
-	if (pipeline->output_channels > pipeline->input_channels) {
-		/* Can't increase channel count, no where to put them. */
-		syslog(LOG_ERR, "DSP output more channels than input\n");
-		cras_dsp_pipeline_free(pipeline);
-		return NULL;
-	}
-
-	return pipeline;
-}
-
-static int load_module(struct plugin *plugin, struct instance *instance)
-{
-	struct dsp_module *module;
-	module = cras_dsp_module_load_builtin(plugin);
-	if (!module)
-		module = cras_dsp_module_load_ladspa(plugin);
-	if (!module)
-		return -1;
-	instance->module = module;
-	instance->properties = module->get_properties(module);
-	return 0;
-}
-
-static void use_buffers(char *busy, audio_port_array *audio_ports)
-{
-	int i, k = 0;
-	struct audio_port *audio_port;
-
-	ARRAY_ELEMENT_FOREACH (audio_ports, i, audio_port) {
-		while (busy[k])
-			k++;
-		audio_port->buf_index = k;
-		busy[k] = 1;
-	}
-}
-
-static void unuse_buffers(char *busy, audio_port_array *audio_ports)
-{
-	int i;
-	struct audio_port *audio_port;
-
-	ARRAY_ELEMENT_FOREACH (audio_ports, i, audio_port) {
-		busy[audio_port->buf_index] = 0;
-	}
-}
-
-/* assign which buffer each audio port on each instance should use */
-static int allocate_buffers(struct pipeline *pipeline)
-{
-	int i;
-	struct instance *instance;
-	int need_buf = 0, peak_buf = 0;
-	char *busy;
-
-	/* first figure out how many buffers do we need */
-	ARRAY_ELEMENT_FOREACH (&pipeline->instances, i, instance) {
-		int in = ARRAY_COUNT(&instance->input_audio_ports);
-		int out = ARRAY_COUNT(&instance->output_audio_ports);
-
-		if (instance->properties & MODULE_INPLACE_BROKEN) {
-			/* We cannot reuse input buffer as output
-			 * buffer, so we need to use extra buffers */
-			need_buf += out;
-			peak_buf = MAX(peak_buf, need_buf);
-			need_buf -= in;
-		} else {
-			need_buf += out - in;
-			peak_buf = MAX(peak_buf, need_buf);
-		}
-	}
-	/*
-	 * cras_dsp_pipeline_create creates pipeline with source and sink and it
-	 * makes sure all ports could be accessed from some sources, which means
-	 * that there is at least one source with out > 0 and in == 0.
-	 * This will give us peak_buf > 0 in the previous calculation.
-	 */
-	if (peak_buf <= 0) {
-		syslog(LOG_ERR, "peak_buf = %d, which must be greater than 0.",
-		       peak_buf);
-		return -1;
-	}
-
-	/* then allocate the buffers */
-	pipeline->peak_buf = peak_buf;
-	pipeline->buffers = (float **)calloc(peak_buf, sizeof(float *));
-
-	if (!pipeline->buffers) {
-		syslog(LOG_ERR, "failed to allocate buffers");
-		return -1;
-	}
-
-	for (i = 0; i < peak_buf; i++) {
-		size_t size = DSP_BUFFER_SIZE * sizeof(float);
-		float *buf = calloc(1, size);
-		if (!buf) {
-			syslog(LOG_ERR, "failed to allocate buf");
-			return -1;
-		}
-		pipeline->buffers[i] = buf;
-	}
-
-	/* Now assign buffer index for each instance's input/output ports */
-	busy = calloc(peak_buf, sizeof(*busy));
-	ARRAY_ELEMENT_FOREACH (&pipeline->instances, i, instance) {
-		int j;
-		struct audio_port *audio_port;
-
-		/* Collect input buffers from upstream */
-		ARRAY_ELEMENT_FOREACH (&instance->input_audio_ports, j,
-				       audio_port) {
-			audio_port->buf_index = audio_port->peer->buf_index;
-		}
-
-		/* If the module has the MODULE_INPLACE_BROKEN flag,
-		 * we cannot reuse input buffers as output buffers, so
-		 * we need to use extra buffers. For example, in this graph
-		 *
-		 * [A]
-		 * output_0={x}
-		 * output_1={y}
-		 * output_2={z}
-		 * output_3={w}
-		 * [B]
-		 * input_0={x}
-		 * input_1={y}
-		 * input_2={z}
-		 * input_3={w}
-		 * output_4={u}
-		 *
-		 * Then peak_buf for this pipeline is 4. However if
-		 * plugin B has the MODULE_INPLACE_BROKEN flag, then
-		 * peak_buf is 5 because plugin B cannot output to the
-		 * same buffer used for input.
-		 *
-		 * This means if we don't have the flag, we can free
-		 * the input buffers then allocate the output buffers,
-		 * but if we have the flag, we have to allocate the
-		 * output buffers before freeing the input buffers.
-		 */
-		if (instance->properties & MODULE_INPLACE_BROKEN) {
-			use_buffers(busy, &instance->output_audio_ports);
-			unuse_buffers(busy, &instance->input_audio_ports);
-		} else {
-			unuse_buffers(busy, &instance->input_audio_ports);
-			use_buffers(busy, &instance->output_audio_ports);
-		}
-	}
-	free(busy);
-
-	return 0;
-}
-
-int cras_dsp_pipeline_load(struct pipeline *pipeline)
-{
-	int i;
-	struct instance *instance;
-
-	ARRAY_ELEMENT_FOREACH (&pipeline->instances, i, instance) {
-		struct plugin *plugin = instance->plugin;
-		if (load_module(plugin, instance) != 0)
-			return -1;
-	}
-
-	if (allocate_buffers(pipeline) != 0)
-		return -1;
-
-	return 0;
-}
-
-/* Calculates the total buffering delay of each instance from the source */
-static void calculate_audio_delay(struct pipeline *pipeline)
-{
-	int i;
-	struct instance *instance;
-
-	ARRAY_ELEMENT_FOREACH (&pipeline->instances, i, instance) {
-		struct dsp_module *module = instance->module;
-		audio_port_array *audio_in = &instance->input_audio_ports;
-		struct audio_port *audio_port;
-		int delay = 0;
-		int j;
-
-		/* Finds the max delay of all modules that provide input to this
-		 * instance. */
-		ARRAY_ELEMENT_FOREACH (audio_in, j, audio_port) {
-			struct instance *upstream = find_instance_by_plugin(
-				&pipeline->instances, audio_port->peer->plugin);
-			delay = MAX(upstream->total_delay, delay);
-		}
-
-		instance->total_delay = delay + module->get_delay(module);
-	}
-}
-
-int cras_dsp_pipeline_instantiate(struct pipeline *pipeline, int sample_rate)
-{
-	int i;
-	struct instance *instance;
-
-	ARRAY_ELEMENT_FOREACH (&pipeline->instances, i, instance) {
-		struct dsp_module *module = instance->module;
-		if (module->instantiate(module, sample_rate) != 0)
-			return -1;
-		instance->instantiated = 1;
-		syslog(LOG_DEBUG, "instantiate %s", instance->plugin->label);
-	}
-	pipeline->sample_rate = sample_rate;
-
-	ARRAY_ELEMENT_FOREACH (&pipeline->instances, i, instance) {
-		audio_port_array *audio_in = &instance->input_audio_ports;
-		audio_port_array *audio_out = &instance->output_audio_ports;
-		control_port_array *control_in = &instance->input_control_ports;
-		control_port_array *control_out =
-			&instance->output_control_ports;
-		int j;
-		struct audio_port *audio_port;
-		struct control_port *control_port;
-		struct dsp_module *module = instance->module;
-
-		/* connect audio ports */
-		ARRAY_ELEMENT_FOREACH (audio_in, j, audio_port) {
-			float *buf = pipeline->buffers[audio_port->buf_index];
-			module->connect_port(module, audio_port->original_index,
-					     buf);
-			syslog(LOG_DEBUG, "connect audio buf %d to %s:%d (in)",
-			       audio_port->buf_index, instance->plugin->title,
-			       audio_port->original_index);
-		}
-		ARRAY_ELEMENT_FOREACH (audio_out, j, audio_port) {
-			float *buf = pipeline->buffers[audio_port->buf_index];
-			module->connect_port(module, audio_port->original_index,
-					     buf);
-			syslog(LOG_DEBUG, "connect audio buf %d to %s:%d (out)",
-			       audio_port->buf_index, instance->plugin->title,
-			       audio_port->original_index);
-		}
-
-		/* connect control ports */
-		ARRAY_ELEMENT_FOREACH (control_in, j, control_port) {
-			/* Note for input control ports which has a
-			 * peer, we use &control_port->peer->value, so
-			 * we can get the peer port's output value
-			 * directly */
-			float *value = control_port->peer ?
-					       &control_port->peer->value :
-					       &control_port->value;
-			module->connect_port(
-				module, control_port->original_index, value);
-			syslog(LOG_DEBUG,
-			       "connect control (val=%g) to %s:%d (in)",
-			       control_port->value, instance->plugin->title,
-			       control_port->original_index);
-		}
-		ARRAY_ELEMENT_FOREACH (control_out, j, control_port) {
-			module->connect_port(module,
-					     control_port->original_index,
-					     &control_port->value);
-			syslog(LOG_DEBUG,
-			       "connect control (val=%g) to %s:%d (out)",
-			       control_port->value, instance->plugin->title,
-			       control_port->original_index);
-		}
-	}
-
-	calculate_audio_delay(pipeline);
-	return 0;
-}
-
-void cras_dsp_pipeline_deinstantiate(struct pipeline *pipeline)
-{
-	int i;
-	struct instance *instance;
-
-	ARRAY_ELEMENT_FOREACH (&pipeline->instances, i, instance) {
-		struct dsp_module *module = instance->module;
-		if (instance->instantiated) {
-			module->deinstantiate(module);
-			instance->instantiated = 0;
-		}
-	}
-	pipeline->sample_rate = 0;
-}
-
-int cras_dsp_pipeline_get_delay(struct pipeline *pipeline)
-{
-	return pipeline->sink_instance->total_delay;
-}
-
-int cras_dsp_pipeline_get_sample_rate(struct pipeline *pipeline)
-{
-	return pipeline->sample_rate;
-}
-
-int cras_dsp_pipeline_get_num_input_channels(struct pipeline *pipeline)
-{
-	return pipeline->input_channels;
-}
-
-int cras_dsp_pipeline_get_num_output_channels(struct pipeline *pipeline)
-{
-	return pipeline->output_channels;
-}
-
-int cras_dsp_pipeline_get_peak_audio_buffers(struct pipeline *pipeline)
-{
-	return pipeline->peak_buf;
-}
-
-static float *find_buffer(struct pipeline *pipeline,
-			  audio_port_array *audio_ports, int index)
-{
-	int i;
-	struct audio_port *audio_port;
-
-	ARRAY_ELEMENT_FOREACH (audio_ports, i, audio_port) {
-		if (audio_port->original_index == index)
-			return pipeline->buffers[audio_port->buf_index];
-	}
-	return NULL;
-}
-
-float *cras_dsp_pipeline_get_source_buffer(struct pipeline *pipeline, int index)
-{
-	return find_buffer(pipeline,
-			   &pipeline->source_instance->output_audio_ports,
-			   index);
-}
-
-float *cras_dsp_pipeline_get_sink_buffer(struct pipeline *pipeline, int index)
-{
-	return find_buffer(pipeline,
-			   &pipeline->sink_instance->input_audio_ports, index);
-}
-
-void cras_dsp_pipeline_set_sink_ext_module(struct pipeline *pipeline,
-					   struct ext_dsp_module *ext_module)
-{
-	cras_dsp_module_set_sink_ext_module(pipeline->sink_instance->module,
-					    ext_module);
-}
-
-struct ini *cras_dsp_pipeline_get_ini(struct pipeline *pipeline)
-{
-	return pipeline->ini;
-}
-
-void cras_dsp_pipeline_run(struct pipeline *pipeline, int sample_count)
-{
-	int i;
-	struct instance *instance;
-
-	ARRAY_ELEMENT_FOREACH (&pipeline->instances, i, instance) {
-		struct dsp_module *module = instance->module;
-		module->run(module, sample_count);
-	}
-}
-
-void cras_dsp_pipeline_add_statistic(struct pipeline *pipeline,
-				     const struct timespec *time_delta,
-				     int samples)
-{
-	int64_t t;
-	if (samples <= 0)
-		return;
-
-	t = time_delta->tv_sec * 1000000000LL + time_delta->tv_nsec;
-
-	if (pipeline->total_blocks == 0) {
-		pipeline->max_time = t;
-		pipeline->min_time = t;
-	} else {
-		pipeline->max_time = MAX(pipeline->max_time, t);
-		pipeline->min_time = MIN(pipeline->min_time, t);
-	}
-
-	pipeline->total_blocks++;
-	pipeline->total_samples += samples;
-	pipeline->total_time += t;
-}
-
-int cras_dsp_pipeline_apply(struct pipeline *pipeline, uint8_t *buf,
-			    snd_pcm_format_t format, unsigned int frames)
-{
-	size_t remaining;
-	size_t chunk;
-	size_t i;
-	unsigned int input_channels = pipeline->input_channels;
-	unsigned int output_channels = pipeline->output_channels;
-	float *source[input_channels];
-	float *sink[output_channels];
-	struct timespec begin, end, delta;
-	int rc;
-
-	if (!pipeline || frames == 0)
-		return 0;
-
-	clock_gettime(CLOCK_THREAD_CPUTIME_ID, &begin);
-
-	/* get pointers to source and sink buffers */
-	for (i = 0; i < input_channels; i++)
-		source[i] = cras_dsp_pipeline_get_source_buffer(pipeline, i);
-	for (i = 0; i < output_channels; i++)
-		sink[i] = cras_dsp_pipeline_get_sink_buffer(pipeline, i);
-
-	remaining = frames;
-
-	/* process at most DSP_BUFFER_SIZE frames each loop */
-	while (remaining > 0) {
-		chunk = MIN(remaining, (size_t)DSP_BUFFER_SIZE);
-
-		/* deinterleave and convert to float */
-		rc = dsp_util_deinterleave(buf, source, input_channels, format,
-					   chunk);
-		if (rc)
-			return rc;
-
-		/* Run the pipeline */
-		cras_dsp_pipeline_run(pipeline, chunk);
-
-		/* interleave and convert back to int16_t */
-		rc = dsp_util_interleave(sink, buf, output_channels, format,
-					 chunk);
-		if (rc)
-			return rc;
-
-		buf += chunk * output_channels * PCM_FORMAT_WIDTH(format) / 8;
-		remaining -= chunk;
-	}
-
-	clock_gettime(CLOCK_THREAD_CPUTIME_ID, &end);
-	subtract_timespecs(&end, &begin, &delta);
-	cras_dsp_pipeline_add_statistic(pipeline, &delta, frames);
-	return 0;
-}
-
-void cras_dsp_pipeline_free(struct pipeline *pipeline)
-{
-	int i;
-	struct instance *instance;
-
-	ARRAY_ELEMENT_FOREACH (&pipeline->instances, i, instance) {
-		struct dsp_module *module = instance->module;
-		instance->plugin = NULL;
-		ARRAY_FREE(&instance->input_audio_ports);
-		ARRAY_FREE(&instance->input_control_ports);
-		ARRAY_FREE(&instance->output_audio_ports);
-		ARRAY_FREE(&instance->output_control_ports);
-
-		if (module) {
-			if (instance->instantiated) {
-				module->deinstantiate(module);
-				instance->instantiated = 0;
-			}
-			module->free_module(module);
-			instance->module = NULL;
-		}
-	}
-
-	pipeline->ini = NULL;
-	ARRAY_FREE(&pipeline->instances);
-
-	for (i = 0; i < pipeline->peak_buf; i++)
-		free(pipeline->buffers[i]);
-	free(pipeline->buffers);
-	free(pipeline);
-}
-
-static void dump_audio_ports(struct dumper *d, const char *name,
-			     audio_port_array *audio_ports)
-{
-	int i;
-	struct audio_port *audio_port;
-	int n = ARRAY_COUNT(audio_ports);
-
-	if (n == 0)
-		return;
-	dumpf(d, "   %s (%d) =\n", name, n);
-
-	ARRAY_ELEMENT_FOREACH (audio_ports, i, audio_port) {
-		dumpf(d, "   %p, peer %p, orig=%d, buf=%d\n", audio_port,
-		      audio_port->peer, audio_port->original_index,
-		      audio_port->buf_index);
-	}
-}
-
-static void dump_control_ports(struct dumper *d, const char *name,
-			       control_port_array *control_ports)
-{
-	int i;
-	struct control_port *control_port;
-	int n = ARRAY_COUNT(control_ports);
-
-	if (n == 0)
-		return;
-	dumpf(d, "   %s (%d) =\n", name, ARRAY_COUNT(control_ports));
-
-	ARRAY_ELEMENT_FOREACH (control_ports, i, control_port) {
-		dumpf(d, "   %p, peer %p, orig=%d, value=%g\n", control_port,
-		      control_port->peer, control_port->original_index,
-		      control_port->value);
-	}
-}
-
-void cras_dsp_pipeline_dump(struct dumper *d, struct pipeline *pipeline)
-{
-	int i;
-	struct instance *instance;
-
-	dumpf(d, "---- pipeline dump begin ----\n");
-	dumpf(d, "pipeline (%s):\n", pipeline->purpose);
-	dumpf(d, " input channels: %d\n", pipeline->input_channels);
-	dumpf(d, " output channels: %d\n", pipeline->output_channels);
-	dumpf(d, " sample_rate: %d\n", pipeline->sample_rate);
-	dumpf(d, " processed samples: %" PRId64 "\n", pipeline->total_samples);
-	dumpf(d, " processed blocks: %" PRId64 "\n", pipeline->total_blocks);
-	dumpf(d, " total processing time: %" PRId64 "ns\n",
-	      pipeline->total_time);
-	if (pipeline->total_blocks) {
-		dumpf(d, " average block size: %" PRId64 "\n",
-		      pipeline->total_samples / pipeline->total_blocks);
-		dumpf(d, " avg processing time per block: %" PRId64 "ns\n",
-		      pipeline->total_time / pipeline->total_blocks);
-	}
-	dumpf(d, " min processing time per block: %" PRId64 "ns\n",
-	      pipeline->min_time);
-	dumpf(d, " max processing time per block: %" PRId64 "ns\n",
-	      pipeline->max_time);
-	if (pipeline->total_samples)
-		dumpf(d, " cpu load: %g%%\n",
-		      pipeline->total_time * 1e-9 / pipeline->total_samples *
-			      pipeline->sample_rate * 100);
-	dumpf(d, " instances (%d):\n", ARRAY_COUNT(&pipeline->instances));
-	ARRAY_ELEMENT_FOREACH (&pipeline->instances, i, instance) {
-		struct dsp_module *module = instance->module;
-		dumpf(d, "  [%d]%s mod=%p, total delay=%d\n", i,
-		      instance->plugin->title, module, instance->total_delay);
-		if (module)
-			module->dump(module, d);
-		dump_audio_ports(d, "input_audio_ports",
-				 &instance->input_audio_ports);
-		dump_audio_ports(d, "output_audio_ports",
-				 &instance->output_audio_ports);
-		dump_control_ports(d, "input_control_ports",
-				   &instance->input_control_ports);
-		dump_control_ports(d, "output_control_ports",
-				   &instance->output_control_ports);
-	}
-	dumpf(d, " peak_buf = %d\n", pipeline->peak_buf);
-	dumpf(d, "---- pipeline dump end ----\n");
-}
diff --git a/cras/src/server/cras_dsp_pipeline.h b/cras/src/server/cras_dsp_pipeline.h
deleted file mode 100644
index 1a5a85a..0000000
--- a/cras/src/server/cras_dsp_pipeline.h
+++ /dev/null
@@ -1,159 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_DSP_PIPELINE_H_
-#define CRAS_DSP_PIPELINE_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <stdint.h>
-
-#include "dumper.h"
-#include "cras_audio_format.h"
-#include "cras_dsp_ini.h"
-#include "cras_dsp_module.h"
-
-/* These are the functions to create and use dsp pipelines. A dsp
- * pipeline is a collection of dsp plugins that process audio
- * data. The plugins and their connections are specified in an ini
- * file. Before using the pipeline, we need to instantiate the
- * pipeline by giving an audio sampling rate. Then we get the pointers
- * to the input buffers, fill the input data, run the pipeline, and
- * obtain the processed data from the output buffers.
- */
-
-/* The maximum number of samples that cras_dsp_pipeline_run() can
- * accept. Beyond this the user should break the samples into several
- * blocks and call cras_dsp_pipeline_run() several times.
- */
-#define DSP_BUFFER_SIZE 2048
-
-struct pipeline;
-
-/* Creates a pipeline from the given ini file.
- * Args:
- *    ini - The ini file the pipeline is created from.
- *    env - The expression environment for evaluating disable expression.
- *    purpose - The purpose of the pipeline, "playback" or "capture".
- * Returns:
- *    A pointer to the pipeline, or NULL if the creation fails.
- */
-struct pipeline *cras_dsp_pipeline_create(struct ini *ini,
-					  struct cras_expr_env *env,
-					  const char *purpose);
-
-/* Frees the resources used by the pipeline. */
-void cras_dsp_pipeline_free(struct pipeline *pipeline);
-
-/* Loads the implementation of the plugins in the pipeline (from
- * shared libraries). Must be called before
- * cras_dsp_pipeline_instantiate().
- * Returns:
- *    0 if successful. -1 otherwise.
- */
-int cras_dsp_pipeline_load(struct pipeline *pipeline);
-
-/* Instantiates the pipeline given the sampling rate.
- * Args:
- *    sample_rate - The audio sampling rate.
- * Returns:
- *    0 if successful. -1 otherwise.
- */
-int cras_dsp_pipeline_instantiate(struct pipeline *pipeline, int sample_rate);
-
-/* The counterpart of cras_dsp_pipeline_instantiate(). To change the
- * sampling rate, this must be called before another call to
- * cras_dsp_pipeline_instantiate(). */
-void cras_dsp_pipeline_deinstantiate(struct pipeline *pipeline);
-
-/* Returns the buffering delay of the pipeline. This should only be called
- * after a pipeline has been instantiated.
- * Returns:
- *    The buffering delay in frames.
- */
-int cras_dsp_pipeline_get_delay(struct pipeline *pipeline);
-
-/* Returns the number of input/output audio channels this pipeline expects */
-int cras_dsp_pipeline_get_num_input_channels(struct pipeline *pipeline);
-int cras_dsp_pipeline_get_num_output_channels(struct pipeline *pipeline);
-
-/* Returns the pointer to the input buffer for a channel of this
- * pipeline. The size of the buffer is DSP_BUFFER_SIZE samples, and
- * the number of samples acually used should be passed to
- * cras_dsp_pipeline_run().
- *
- * Args:
- *    index - The channel index. The valid value is 0 to
- *            cras_dsp_pipeline_get_num_channels() - 1.
- */
-float *cras_dsp_pipeline_get_source_buffer(struct pipeline *pipeline,
-					   int index);
-
-/* Returns the pointer to the output buffer for a channel of this
- * pipeline. The size of the buffer is DSP_BUFFER_SIZE samples.
- *
- * Args:
- *    index - The channel index. The valid value is 0 to
- *            cras_dsp_pipeline_get_num_channels() - 1.
- */
-float *cras_dsp_pipeline_get_sink_buffer(struct pipeline *pipeline, int index);
-
-/*
- * Connects |ext_module| to the sink of given dsp pipeline.
- * Args:
- *    pipeline - The pipeline whose sink should connect to ext_module.
- *    ext_module - The external dsp module to connect to pipeline sink.
- */
-void cras_dsp_pipeline_set_sink_ext_module(struct pipeline *pipeline,
-					   struct ext_dsp_module *ext_module);
-
-/* Returns the number of internal audio buffers allocated by the
- * pipeline. This is used by the unit test only */
-int cras_dsp_pipeline_get_peak_audio_buffers(struct pipeline *pipeline);
-
-/* Returns the sampling rate passed by cras_dsp_pipeline_instantiate(),
- * or 0 if is has not been called */
-int cras_dsp_pipeline_get_sample_rate(struct pipeline *pipeline);
-
-/* Gets the dsp ini that corresponds to the pipeline. */
-struct ini *cras_dsp_pipeline_get_ini(struct pipeline *pipeline);
-
-/* Processes a block of audio samples. sample_count should be no more
- * than DSP_BUFFER_SIZE */
-void cras_dsp_pipeline_run(struct pipeline *pipeline, int sample_count);
-
-/* Add a statistic of running time for the pipeline.
- *
- * Args:
- *    time_delta - The time it takes to run the pipeline and any other
- *                 preprocessing and postprocessing.
- *    samples - The number of audio sample frames processed.
- */
-void cras_dsp_pipeline_add_statistic(struct pipeline *pipeline,
-				     const struct timespec *time_delta,
-				     int samples);
-
-/* Runs the specified pipeline across the given interleaved buffer in place.
- * Args:
- *    pipeline - The pipeline to run.
- *    buf - The samples to be processed, interleaved.
- *    format - Sample format of the buffer.
- *    frames - the numver of samples in the buffer.
- * Returns:
- *    Negative code if error, otherwise 0.
- */
-int cras_dsp_pipeline_apply(struct pipeline *pipeline, uint8_t *buf,
-			    snd_pcm_format_t format, unsigned int frames);
-
-/* Dumps the current state of the pipeline. For debugging only */
-void cras_dsp_pipeline_dump(struct dumper *d, struct pipeline *pipeline);
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif /* CRAS_DSP_PIPELINE_H_ */
diff --git a/cras/src/server/cras_empty_iodev.c b/cras/src/server/cras_empty_iodev.c
deleted file mode 100644
index 3471c75..0000000
--- a/cras/src/server/cras_empty_iodev.c
+++ /dev/null
@@ -1,254 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <pthread.h>
-#include <sys/param.h>
-#include <syslog.h>
-
-#include "cras_audio_area.h"
-#include "cras_config.h"
-#include "cras_iodev.h"
-#include "cras_iodev_list.h"
-#include "cras_rstream.h"
-#include "cras_types.h"
-#include "utlist.h"
-
-#define EMPTY_BUFFER_SIZE (32 * 1024)
-#define MAX_EMPTY_FRAME_SIZE 8
-#define EMPTY_FRAMES (EMPTY_BUFFER_SIZE / MAX_EMPTY_FRAME_SIZE)
-
-static size_t empty_supported_rates[] = { 44100, 48000, 0 };
-
-static size_t empty_supported_channel_counts[] = { 1, 2, 0 };
-
-static snd_pcm_format_t empty_supported_formats[] = {
-	SND_PCM_FORMAT_S16_LE, SND_PCM_FORMAT_S24_LE, SND_PCM_FORMAT_S32_LE,
-	SND_PCM_FORMAT_S24_3LE, 0
-};
-
-struct empty_iodev {
-	struct cras_iodev base;
-	uint8_t *audio_buffer;
-	uint64_t read_frames, written_frames;
-	struct timespec dev_start_time;
-};
-
-/*
- * Current level of the audio buffer.  This is made up based on what has been
- * read/written and how long it has been since the start. Simulates audio
- * hardware running at the given sample rate.
- */
-static unsigned int current_level(const struct cras_iodev *iodev)
-{
-	struct empty_iodev *empty_iodev = (struct empty_iodev *)iodev;
-	uint64_t frames_since_start, nframes;
-
-	if (iodev->active_node->type == CRAS_NODE_TYPE_HOTWORD)
-		return 0;
-
-	frames_since_start = cras_frames_since_time(
-		&empty_iodev->dev_start_time, iodev->format->frame_rate);
-
-	if (iodev->direction == CRAS_STREAM_INPUT) {
-		nframes = frames_since_start - empty_iodev->read_frames;
-		return MIN(nframes, EMPTY_FRAMES);
-	}
-
-	/* output */
-	if (empty_iodev->written_frames <= frames_since_start)
-		return 0;
-	return empty_iodev->written_frames - frames_since_start;
-}
-
-/*
- * iodev callbacks.
- */
-
-static int frames_queued(const struct cras_iodev *iodev,
-			 struct timespec *tstamp)
-{
-	clock_gettime(CLOCK_MONOTONIC_RAW, tstamp);
-	return current_level(iodev);
-}
-
-static int delay_frames(const struct cras_iodev *iodev)
-{
-	return 0;
-}
-
-static int close_dev(struct cras_iodev *iodev)
-{
-	struct empty_iodev *empty_iodev = (struct empty_iodev *)iodev;
-
-	free(empty_iodev->audio_buffer);
-	empty_iodev->audio_buffer = NULL;
-	cras_iodev_free_audio_area(iodev);
-	return 0;
-}
-
-static int configure_dev(struct cras_iodev *iodev)
-{
-	struct empty_iodev *empty_iodev = (struct empty_iodev *)iodev;
-
-	if (iodev->format == NULL)
-		return -EINVAL;
-
-	cras_iodev_init_audio_area(iodev, iodev->format->num_channels);
-	empty_iodev->audio_buffer = calloc(1, EMPTY_BUFFER_SIZE);
-	empty_iodev->read_frames = 0;
-	empty_iodev->written_frames = 0;
-
-	clock_gettime(CLOCK_MONOTONIC_RAW, &empty_iodev->dev_start_time);
-
-	return 0;
-}
-
-static int get_buffer(struct cras_iodev *iodev, struct cras_audio_area **area,
-		      unsigned *frames)
-{
-	struct empty_iodev *empty_iodev = (struct empty_iodev *)iodev;
-	unsigned int avail, current;
-
-	if (iodev->direction == CRAS_STREAM_OUTPUT) {
-		avail = EMPTY_FRAMES - current_level(iodev);
-		*frames = MIN(*frames, avail);
-	} else {
-		current = current_level(iodev);
-		*frames = MIN(*frames, current);
-	}
-
-	iodev->area->frames = *frames;
-	cras_audio_area_config_buf_pointers(iodev->area, iodev->format,
-					    empty_iodev->audio_buffer);
-	*area = iodev->area;
-	return 0;
-}
-
-/*
- * Returns -EPIPE if there are not enough frames or spaces in device buffer.
- * It matches other alsa-based devices.
- */
-static int put_buffer(struct cras_iodev *iodev, unsigned frames)
-{
-	struct empty_iodev *empty_iodev = (struct empty_iodev *)iodev;
-
-	if (iodev->direction == CRAS_STREAM_INPUT) {
-		if (current_level(iodev) < frames)
-			return -EPIPE;
-		empty_iodev->read_frames += frames;
-	} else {
-		if (EMPTY_FRAMES - current_level(iodev) < frames)
-			return -EPIPE;
-		empty_iodev->written_frames += frames;
-	}
-	return 0;
-}
-
-static int flush_buffer(struct cras_iodev *iodev)
-{
-	struct empty_iodev *empty_iodev = (struct empty_iodev *)iodev;
-
-	if (iodev->direction == CRAS_STREAM_INPUT)
-		empty_iodev->read_frames = 0;
-	else
-		empty_iodev->written_frames = 0;
-
-	clock_gettime(CLOCK_MONOTONIC_RAW, &empty_iodev->dev_start_time);
-	return 0;
-}
-
-static void update_active_node(struct cras_iodev *iodev, unsigned node_idx,
-			       unsigned dev_enabled)
-{
-}
-
-/*
- * Exported Interface.
- */
-
-struct cras_iodev *empty_iodev_create(enum CRAS_STREAM_DIRECTION direction,
-				      enum CRAS_NODE_TYPE node_type)
-{
-	struct empty_iodev *empty_iodev;
-	struct cras_iodev *iodev;
-	struct cras_ionode *node;
-
-	if (direction != CRAS_STREAM_INPUT && direction != CRAS_STREAM_OUTPUT)
-		return NULL;
-
-	empty_iodev = calloc(1, sizeof(*empty_iodev));
-	if (empty_iodev == NULL)
-		return NULL;
-	iodev = &empty_iodev->base;
-	iodev->direction = direction;
-
-	iodev->supported_rates = empty_supported_rates;
-	iodev->supported_channel_counts = empty_supported_channel_counts;
-	iodev->supported_formats = empty_supported_formats;
-	iodev->buffer_size = EMPTY_FRAMES;
-
-	iodev->configure_dev = configure_dev;
-	iodev->close_dev = close_dev;
-	iodev->frames_queued = frames_queued;
-	iodev->delay_frames = delay_frames;
-	iodev->get_buffer = get_buffer;
-	iodev->put_buffer = put_buffer;
-	iodev->flush_buffer = flush_buffer;
-	iodev->update_active_node = update_active_node;
-	iodev->no_stream = cras_iodev_default_no_stream_playback;
-
-	/* Create an empty ionode */
-	node = (struct cras_ionode *)calloc(1, sizeof(*node));
-	node->dev = iodev;
-	node->type = node_type;
-	node->volume = 100;
-	node->ui_gain_scaler = 1.0f;
-	strcpy(node->name, "(default)");
-	cras_iodev_add_node(iodev, node);
-	cras_iodev_set_active_node(iodev, node);
-
-	/* Finally add it to the appropriate iodev list. */
-	if (direction == CRAS_STREAM_INPUT) {
-		if (node->type == CRAS_NODE_TYPE_HOTWORD) {
-			snprintf(iodev->info.name, ARRAY_SIZE(iodev->info.name),
-				 "Silent hotword device.");
-			iodev->info.name[ARRAY_SIZE(iodev->info.name) - 1] =
-				'\0';
-			iodev->info.idx = SILENT_HOTWORD_DEVICE;
-		} else {
-			snprintf(iodev->info.name, ARRAY_SIZE(iodev->info.name),
-				 "Silent record device.");
-			iodev->info.name[ARRAY_SIZE(iodev->info.name) - 1] =
-				'\0';
-			iodev->info.idx = SILENT_RECORD_DEVICE;
-		}
-	} else {
-		snprintf(iodev->info.name, ARRAY_SIZE(iodev->info.name),
-			 "Silent playback device.");
-		iodev->info.name[ARRAY_SIZE(iodev->info.name) - 1] = '\0';
-		iodev->info.idx = SILENT_PLAYBACK_DEVICE;
-	}
-
-	/*
-	 * Record max supported channels into cras_iodev_info.
-	 * The value is the max of empty_supported_channel_counts.
-	 */
-	iodev->info.max_supported_channels = 2;
-
-	return iodev;
-}
-
-void empty_iodev_destroy(struct cras_iodev *iodev)
-{
-	struct empty_iodev *empty_iodev = (struct empty_iodev *)iodev;
-
-	if (iodev->direction == CRAS_STREAM_INPUT)
-		cras_iodev_list_rm_input(iodev);
-	else
-		cras_iodev_list_rm_output(iodev);
-	free(iodev->active_node);
-	cras_iodev_free_resources(iodev);
-	free(empty_iodev);
-}
diff --git a/cras/src/server/cras_empty_iodev.h b/cras/src/server/cras_empty_iodev.h
deleted file mode 100644
index d85b9e0..0000000
--- a/cras/src/server/cras_empty_iodev.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_EMPTY_IO_H_
-#define CRAS_EMPTY_IO_H_
-
-#include "cras_types.h"
-
-struct cras_iodev;
-
-/* Initializes an empty iodev.  Empty iodevs are used when there are no other
- * iodevs available.  They give the attached streams a temporary place to live
- * until a new iodev becomes available.
- * Args:
- *    direciton - input or output.
- *    node_type - the default node type.
- * Returns:
- *    A pointer to the newly created iodev if successful, NULL otherwise.
- */
-struct cras_iodev *empty_iodev_create(enum CRAS_STREAM_DIRECTION direction,
-				      enum CRAS_NODE_TYPE node_type);
-
-/* Destroys an empty_iodev created with empty_iodev_create. */
-void empty_iodev_destroy(struct cras_iodev *iodev);
-
-#endif /* CRAS_EMPTY_IO_H_ */
diff --git a/cras/src/server/cras_expr.c b/cras/src/server/cras_expr.c
deleted file mode 100644
index f7fab0d..0000000
--- a/cras/src/server/cras_expr.c
+++ /dev/null
@@ -1,653 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <ctype.h>
-#include <stdlib.h>
-#include <syslog.h>
-
-#include "array.h"
-#include "cras_expr.h"
-
-static const char *copy_str(const char *begin, const char *end)
-{
-	char *s = malloc(end - begin + 1);
-	memcpy(s, begin, end - begin);
-	s[end - begin] = '\0';
-	return s;
-}
-
-static void value_set_boolean(struct cras_expr_value *value, char boolean)
-{
-	cras_expr_value_free(value);
-	value->type = CRAS_EXPR_VALUE_TYPE_BOOLEAN;
-	value->u.boolean = !!boolean;
-}
-
-static void value_set_integer(struct cras_expr_value *value, int integer)
-{
-	cras_expr_value_free(value);
-	value->type = CRAS_EXPR_VALUE_TYPE_INT;
-	value->u.integer = integer;
-}
-
-static void value_set_string2(struct cras_expr_value *value, const char *begin,
-			      const char *end)
-{
-	cras_expr_value_free(value);
-	value->type = CRAS_EXPR_VALUE_TYPE_STRING;
-	value->u.string = copy_str(begin, end);
-}
-
-static void value_set_string(struct cras_expr_value *value, const char *str)
-{
-	value_set_string2(value, str, str + strlen(str));
-}
-
-static void cras_expr_value_set_function(struct cras_expr_value *value,
-					 cras_expr_function_type function)
-{
-	cras_expr_value_free(value);
-	value->type = CRAS_EXPR_VALUE_TYPE_FUNCTION;
-	value->u.function = function;
-}
-
-static void copy_value(struct cras_expr_value *value,
-		       struct cras_expr_value *original)
-{
-	cras_expr_value_free(value); /* free the original value first */
-	value->type = original->type;
-	switch (value->type) {
-	case CRAS_EXPR_VALUE_TYPE_NONE:
-		break;
-	case CRAS_EXPR_VALUE_TYPE_BOOLEAN:
-		value->u.boolean = original->u.boolean;
-		break;
-	case CRAS_EXPR_VALUE_TYPE_INT:
-		value->u.integer = original->u.integer;
-		break;
-	case CRAS_EXPR_VALUE_TYPE_STRING:
-		value->u.string = strdup(original->u.string);
-		break;
-	case CRAS_EXPR_VALUE_TYPE_FUNCTION:
-		value->u.function = original->u.function;
-		break;
-	}
-}
-
-void cras_expr_value_free(struct cras_expr_value *value)
-{
-	switch (value->type) {
-	case CRAS_EXPR_VALUE_TYPE_STRING:
-		free((char *)value->u.string);
-		value->u.string = NULL;
-		break;
-	case CRAS_EXPR_VALUE_TYPE_NONE:
-	case CRAS_EXPR_VALUE_TYPE_BOOLEAN:
-	case CRAS_EXPR_VALUE_TYPE_INT:
-	case CRAS_EXPR_VALUE_TYPE_FUNCTION:
-		break;
-	}
-	value->type = CRAS_EXPR_VALUE_TYPE_NONE;
-}
-
-void cras_expr_value_dump(struct dumper *d, const struct cras_expr_value *value)
-{
-	switch (value->type) {
-	case CRAS_EXPR_VALUE_TYPE_NONE:
-		dumpf(d, "none");
-		break;
-	case CRAS_EXPR_VALUE_TYPE_BOOLEAN:
-		dumpf(d, "boolean(%s)", value->u.boolean ? "true" : "false");
-		break;
-	case CRAS_EXPR_VALUE_TYPE_INT:
-		dumpf(d, "integer(%d)", value->u.integer);
-		break;
-	case CRAS_EXPR_VALUE_TYPE_STRING:
-		dumpf(d, "string(%s)", value->u.string);
-		break;
-	case CRAS_EXPR_VALUE_TYPE_FUNCTION:
-		dumpf(d, "function(%p)", value->u.function);
-		break;
-	}
-}
-
-static struct cras_expr_value *find_value(struct cras_expr_env *env,
-					  const char *name)
-{
-	int i;
-	const char **key;
-
-	ARRAY_ELEMENT_FOREACH (&env->keys, i, key) {
-		if (strcmp(*key, name) == 0)
-			return ARRAY_ELEMENT(&env->values, i);
-	}
-	return NULL;
-}
-
-/* Insert a (key, value) pair to the environment. The value is
- * initialized to zero. Return the pointer to value so it can be set
- * to the proper value. */
-static struct cras_expr_value *insert_value(struct cras_expr_env *env,
-					    const char *key)
-{
-	*ARRAY_APPEND_ZERO(&env->keys) = strdup(key);
-	return ARRAY_APPEND_ZERO(&env->values);
-}
-
-static struct cras_expr_value *find_or_insert_value(struct cras_expr_env *env,
-						    const char *key)
-{
-	struct cras_expr_value *value = find_value(env, key);
-	if (!value)
-		value = insert_value(env, key);
-	return value;
-}
-
-static void function_not(cras_expr_value_array *operands,
-			 struct cras_expr_value *result)
-{
-	struct cras_expr_value *value;
-	int is_false;
-
-	if (ARRAY_COUNT(operands) != 2) {
-		cras_expr_value_free(result);
-		syslog(LOG_ERR, "not takes one argument");
-		return;
-	}
-
-	value = ARRAY_ELEMENT(operands, 1);
-	is_false = (value->type == CRAS_EXPR_VALUE_TYPE_BOOLEAN &&
-		    !value->u.boolean);
-	value_set_boolean(result, is_false);
-}
-
-static void function_and(cras_expr_value_array *operands,
-			 struct cras_expr_value *result)
-{
-	int i;
-	struct cras_expr_value *value;
-	int n = ARRAY_COUNT(operands);
-
-	/* no operands -- return #t */
-	if (n <= 1) {
-		value_set_boolean(result, 1);
-		return;
-	}
-
-	/* if there is any #f, return it */
-	ARRAY_ELEMENT_FOREACH (operands, i, value) {
-		if (i == 0)
-			continue; /* ignore "and" itself */
-		if (value->type == CRAS_EXPR_VALUE_TYPE_BOOLEAN &&
-		    !value->u.boolean) {
-			value_set_boolean(result, 0);
-			return;
-		}
-	}
-
-	/* otherwise return the last element */
-	copy_value(result, ARRAY_ELEMENT(operands, n - 1));
-}
-
-static void function_or(cras_expr_value_array *operands,
-			struct cras_expr_value *result)
-{
-	int i;
-	struct cras_expr_value *value;
-
-	ARRAY_ELEMENT_FOREACH (operands, i, value) {
-		if (i == 0)
-			continue; /* ignore "or" itself */
-		if (value->type != CRAS_EXPR_VALUE_TYPE_BOOLEAN ||
-		    value->u.boolean) {
-			copy_value(result, value);
-			return;
-		}
-	}
-
-	value_set_boolean(result, 0);
-}
-
-static char function_equal_real(cras_expr_value_array *operands)
-{
-	int i;
-	struct cras_expr_value *value, *prev;
-
-	ARRAY_ELEMENT_FOREACH (operands, i, value) {
-		if (i <= 1)
-			continue; /* ignore equal? and first operand */
-		/* compare with the previous operand */
-
-		prev = ARRAY_ELEMENT(operands, i - 1);
-
-		if (prev->type != value->type)
-			return 0;
-
-		switch (prev->type) {
-		case CRAS_EXPR_VALUE_TYPE_NONE:
-			break;
-		case CRAS_EXPR_VALUE_TYPE_BOOLEAN:
-			if (prev->u.boolean != value->u.boolean)
-				return 0;
-			break;
-		case CRAS_EXPR_VALUE_TYPE_INT:
-			if (prev->u.integer != value->u.integer)
-				return 0;
-			break;
-		case CRAS_EXPR_VALUE_TYPE_STRING:
-			if (strcmp(prev->u.string, value->u.string) != 0)
-				return 0;
-			break;
-		case CRAS_EXPR_VALUE_TYPE_FUNCTION:
-			if (prev->u.function != value->u.function)
-				return 0;
-			break;
-		}
-	}
-
-	return 1;
-}
-
-static void function_equal(cras_expr_value_array *operands,
-			   struct cras_expr_value *result)
-{
-	value_set_boolean(result, function_equal_real(operands));
-}
-
-static void env_set_variable(struct cras_expr_env *env, const char *name,
-			     struct cras_expr_value *new_value)
-{
-	struct cras_expr_value *value = find_or_insert_value(env, name);
-	copy_value(value, new_value);
-}
-
-void cras_expr_env_install_builtins(struct cras_expr_env *env)
-{
-	struct cras_expr_value value = CRAS_EXPR_VALUE_INIT;
-
-	/* initialize env with builtin functions */
-	cras_expr_value_set_function(&value, &function_not);
-	env_set_variable(env, "not", &value);
-
-	cras_expr_value_set_function(&value, &function_and);
-	env_set_variable(env, "and", &value);
-
-	cras_expr_value_set_function(&value, &function_or);
-	env_set_variable(env, "or", &value);
-
-	cras_expr_value_set_function(&value, &function_equal);
-	env_set_variable(env, "equal?", &value);
-
-	cras_expr_value_free(&value);
-}
-
-void cras_expr_env_set_variable_boolean(struct cras_expr_env *env,
-					const char *name, char boolean)
-{
-	struct cras_expr_value *value = find_or_insert_value(env, name);
-	value_set_boolean(value, boolean);
-}
-
-void cras_expr_env_set_variable_integer(struct cras_expr_env *env,
-					const char *name, int integer)
-{
-	struct cras_expr_value *value = find_or_insert_value(env, name);
-	value_set_integer(value, integer);
-}
-
-void cras_expr_env_set_variable_string(struct cras_expr_env *env,
-				       const char *name, const char *str)
-{
-	struct cras_expr_value *value = find_or_insert_value(env, name);
-	value_set_string(value, str);
-}
-
-void cras_expr_env_free(struct cras_expr_env *env)
-{
-	int i;
-	const char **key;
-	struct cras_expr_value *value;
-
-	ARRAY_ELEMENT_FOREACH (&env->keys, i, key) {
-		free((char *)*key);
-	}
-
-	ARRAY_ELEMENT_FOREACH (&env->values, i, value) {
-		cras_expr_value_free(value);
-	}
-
-	ARRAY_FREE(&env->keys);
-	ARRAY_FREE(&env->values);
-}
-
-void cras_expr_env_dump(struct dumper *d, const struct cras_expr_env *env)
-{
-	int i;
-	const char **key;
-	struct cras_expr_value *value;
-
-	dumpf(d, "--- environment ---\n");
-	ARRAY_ELEMENT_FOREACH (&env->keys, i, key) {
-		dumpf(d, " key=%s,", *key);
-		dumpf(d, " value=");
-		value = ARRAY_ELEMENT(&env->values, i);
-		cras_expr_value_dump(d, value);
-		dumpf(d, "\n");
-	}
-}
-
-static struct cras_expr_expression *new_boolean_literal(char boolean)
-{
-	struct cras_expr_expression *expr;
-	expr = calloc(1, sizeof(struct cras_expr_expression));
-	expr->type = EXPR_TYPE_LITERAL;
-	value_set_boolean(&expr->u.literal, boolean);
-	return expr;
-}
-
-static struct cras_expr_expression *new_integer_literal(int integer)
-{
-	struct cras_expr_expression *expr;
-	expr = calloc(1, sizeof(struct cras_expr_expression));
-	expr->type = EXPR_TYPE_LITERAL;
-	value_set_integer(&expr->u.literal, integer);
-	return expr;
-}
-
-static struct cras_expr_expression *new_string_literal(const char *begin,
-						       const char *end)
-{
-	struct cras_expr_expression *expr;
-	expr = calloc(1, sizeof(struct cras_expr_expression));
-	expr->type = EXPR_TYPE_LITERAL;
-	value_set_string2(&expr->u.literal, begin, end);
-	return expr;
-}
-
-static struct cras_expr_expression *new_variable(const char *begin,
-						 const char *end)
-{
-	struct cras_expr_expression *expr;
-	expr = calloc(1, sizeof(struct cras_expr_expression));
-	expr->type = EXPR_TYPE_VARIABLE;
-	expr->u.variable = copy_str(begin, end);
-	return expr;
-}
-
-static struct cras_expr_expression *new_compound_expression()
-{
-	struct cras_expr_expression *expr;
-	expr = calloc(1, sizeof(struct cras_expr_expression));
-	expr->type = EXPR_TYPE_COMPOUND;
-	return expr;
-}
-
-static void add_sub_expression(struct cras_expr_expression *expr,
-			       struct cras_expr_expression *sub)
-{
-	ARRAY_APPEND(&expr->u.children, sub);
-}
-
-static int is_identifier_char(char c)
-{
-	if (isspace(c))
-		return 0;
-	if (c == '\0')
-		return 0;
-	if (isalpha(c))
-		return 1;
-	if (c == '_' || c == '-' || c == '?')
-		return 1;
-	return 0;
-}
-
-static struct cras_expr_expression *parse_one_expr(const char **str)
-{
-	/* skip whitespace */
-	while (isspace(**str))
-		(*str)++;
-
-	if (**str == '\0')
-		return NULL;
-
-	/* boolean literal: #t, #f */
-	if (**str == '#') {
-		(*str)++;
-		char c = **str;
-		if (c == 't' || c == 'f') {
-			(*str)++;
-			return new_boolean_literal(c == 't');
-		} else {
-			syslog(LOG_ERR, "unexpected char after #: '%c'", c);
-		}
-		return NULL;
-	}
-
-	/* integer literal: (-)[0-9]+ */
-	if (isdigit(**str) || (**str == '-' && isdigit((*str)[1])))
-		return new_integer_literal(strtol(*str, (char **)str, 10));
-
-	/* string literal: "..." */
-	if (**str == '"') {
-		const char *begin = *str + 1;
-		const char *end = strchr(begin, '"');
-		if (end == NULL) {
-			syslog(LOG_ERR, "no matching \"");
-			end = begin;
-			*str = begin;
-		} else {
-			*str = end + 1;
-		}
-		return new_string_literal(begin, end);
-	}
-
-	/* compound expression: (expr1 expr2 ...) */
-	if (**str == '(') {
-		(*str)++;
-		struct cras_expr_expression *expr = new_compound_expression();
-		while (1) {
-			struct cras_expr_expression *next = parse_one_expr(str);
-			if (next == NULL)
-				break;
-			add_sub_expression(expr, next);
-		}
-		if (**str != ')') {
-			syslog(LOG_ERR, "no matching ): found '%c'", **str);
-			cras_expr_expression_free(expr);
-			return NULL;
-		} else {
-			(*str)++;
-		}
-		return expr;
-	}
-
-	/* variable name */
-	if (is_identifier_char(**str)) {
-		const char *begin = *str;
-		while (is_identifier_char(**str))
-			(*str)++;
-		return new_variable(begin, *str);
-	}
-
-	return NULL;
-}
-
-struct cras_expr_expression *cras_expr_expression_parse(const char *str)
-{
-	if (!str)
-		return NULL;
-	return parse_one_expr(&str);
-}
-
-static void dump_value(struct dumper *d, const struct cras_expr_value *value,
-		       int indent)
-{
-	switch (value->type) {
-	case CRAS_EXPR_VALUE_TYPE_NONE:
-		dumpf(d, "%*s(none)", indent, "");
-		break;
-	case CRAS_EXPR_VALUE_TYPE_BOOLEAN:
-		dumpf(d, "%*s%s", indent, "", value->u.boolean ? "#t" : "#f");
-		break;
-	case CRAS_EXPR_VALUE_TYPE_INT:
-		dumpf(d, "%*s%d", indent, "", value->u.integer);
-		break;
-	case CRAS_EXPR_VALUE_TYPE_STRING:
-		dumpf(d, "%*s%s", indent, "", value->u.string);
-		break;
-	case CRAS_EXPR_VALUE_TYPE_FUNCTION:
-		dumpf(d, "%*s%p", indent, "", value->u.function);
-		break;
-	}
-}
-
-static void dump_one_expression(struct dumper *d,
-				const struct cras_expr_expression *expr,
-				int indent)
-{
-	int i;
-	struct cras_expr_expression **sub;
-
-	switch (expr->type) {
-	case EXPR_TYPE_NONE:
-		dumpf(d, "%*snone", indent, "");
-		break;
-	case EXPR_TYPE_LITERAL:
-		dumpf(d, "%*sliteral", indent, "");
-		dump_value(d, &expr->u.literal, indent + 2);
-		break;
-	case EXPR_TYPE_VARIABLE:
-		dumpf(d, "%*svariable (%s)", indent, "", expr->u.variable);
-		break;
-	case EXPR_TYPE_COMPOUND:
-		dumpf(d, "%*scompound", indent, "");
-		ARRAY_ELEMENT_FOREACH (&expr->u.children, i, sub) {
-			dump_one_expression(d, *sub, indent + 2);
-		}
-		break;
-	}
-}
-
-void cras_expr_expression_dump(struct dumper *d,
-			       const struct cras_expr_expression *expr)
-{
-	dump_one_expression(d, expr, 0);
-}
-
-void cras_expr_expression_free(struct cras_expr_expression *expr)
-{
-	if (!expr)
-		return;
-
-	switch (expr->type) {
-	case EXPR_TYPE_NONE:
-		break;
-	case EXPR_TYPE_LITERAL:
-		cras_expr_value_free(&expr->u.literal);
-		break;
-	case EXPR_TYPE_VARIABLE:
-		free((char *)expr->u.variable);
-		break;
-	case EXPR_TYPE_COMPOUND: {
-		int i;
-		struct cras_expr_expression **psub;
-		ARRAY_ELEMENT_FOREACH (&expr->u.children, i, psub) {
-			cras_expr_expression_free(*psub);
-		}
-		ARRAY_FREE(&expr->u.children);
-		break;
-	}
-	}
-	free(expr);
-}
-
-void cras_expr_expression_eval(struct cras_expr_expression *expr,
-			       struct cras_expr_env *env,
-			       struct cras_expr_value *result)
-{
-	cras_expr_value_free(result);
-
-	switch (expr->type) {
-	case EXPR_TYPE_NONE:
-		break;
-	case EXPR_TYPE_LITERAL:
-		copy_value(result, &expr->u.literal);
-		break;
-	case EXPR_TYPE_VARIABLE: {
-		struct cras_expr_value *value =
-			find_value(env, expr->u.variable);
-		if (value == NULL) {
-			syslog(LOG_ERR, "cannot find value for %s",
-			       expr->u.variable);
-		} else {
-			copy_value(result, value);
-		}
-		break;
-	}
-	case EXPR_TYPE_COMPOUND: {
-		int i;
-		struct cras_expr_expression **psub;
-		cras_expr_value_array values = ARRAY_INIT;
-		struct cras_expr_value *value;
-
-		ARRAY_ELEMENT_FOREACH (&expr->u.children, i, psub) {
-			value = ARRAY_APPEND_ZERO(&values);
-			cras_expr_expression_eval(*psub, env, value);
-		}
-
-		if (ARRAY_COUNT(&values) > 0) {
-			struct cras_expr_value *f = ARRAY_ELEMENT(&values, 0);
-			if (f->type == CRAS_EXPR_VALUE_TYPE_FUNCTION)
-				f->u.function(&values, result);
-			else
-				syslog(LOG_ERR,
-				       "first element is not a function");
-		} else {
-			syslog(LOG_ERR, "empty compound expression?");
-		}
-
-		ARRAY_ELEMENT_FOREACH (&values, i, value) {
-			cras_expr_value_free(value);
-		}
-
-		ARRAY_FREE(&values);
-		break;
-	}
-	}
-}
-
-int cras_expr_expression_eval_int(struct cras_expr_expression *expr,
-				  struct cras_expr_env *env, int *integer)
-{
-	int rc = 0;
-	struct cras_expr_value value = CRAS_EXPR_VALUE_INIT;
-
-	cras_expr_expression_eval(expr, env, &value);
-	if (value.type == CRAS_EXPR_VALUE_TYPE_INT) {
-		*integer = value.u.integer;
-	} else {
-		syslog(LOG_ERR, "value type is not integer (%d)", value.type);
-		rc = -1;
-	}
-	cras_expr_value_free(&value);
-	return rc;
-}
-
-int cras_expr_expression_eval_boolean(struct cras_expr_expression *expr,
-				      struct cras_expr_env *env, char *boolean)
-{
-	int rc = 0;
-	struct cras_expr_value value = CRAS_EXPR_VALUE_INIT;
-
-	cras_expr_expression_eval(expr, env, &value);
-	if (value.type == CRAS_EXPR_VALUE_TYPE_BOOLEAN) {
-		*boolean = value.u.boolean;
-	} else {
-		syslog(LOG_ERR, "value type is not boolean (%d)", value.type);
-		rc = -1;
-	}
-	cras_expr_value_free(&value);
-	return rc;
-}
diff --git a/cras/src/server/cras_expr.h b/cras/src/server/cras_expr.h
deleted file mode 100644
index a26e98d..0000000
--- a/cras/src/server/cras_expr.h
+++ /dev/null
@@ -1,108 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_EXPR_H_
-#define CRAS_EXPR_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "array.h"
-#include "dumper.h"
-
-/* Value */
-
-enum cras_expr_value_type {
-	CRAS_EXPR_VALUE_TYPE_NONE,
-	CRAS_EXPR_VALUE_TYPE_BOOLEAN,
-	CRAS_EXPR_VALUE_TYPE_INT,
-	CRAS_EXPR_VALUE_TYPE_STRING,
-	CRAS_EXPR_VALUE_TYPE_FUNCTION,
-};
-
-DECLARE_ARRAY_TYPE(struct cras_expr_value, cras_expr_value_array);
-typedef void (*cras_expr_function_type)(cras_expr_value_array *operands,
-					struct cras_expr_value *result);
-
-struct cras_expr_value {
-	enum cras_expr_value_type type;
-	union {
-		char boolean;
-		int integer;
-		const char *string;
-		cras_expr_function_type function;
-	} u;
-};
-
-/* initial value for the value type is zero */
-// clang-format off
-#define CRAS_EXPR_VALUE_INIT {}
-// clang-format on
-
-/* Expression */
-
-enum expr_type {
-	EXPR_TYPE_NONE,
-	EXPR_TYPE_LITERAL,
-	EXPR_TYPE_VARIABLE,
-	EXPR_TYPE_COMPOUND,
-};
-
-DECLARE_ARRAY_TYPE(struct cras_expr_expression *, expr_array);
-
-struct cras_expr_expression {
-	enum expr_type type;
-	union {
-		struct cras_expr_value literal;
-		const char *variable;
-		expr_array children;
-	} u;
-};
-
-/* Environment */
-
-DECLARE_ARRAY_TYPE(const char *, string_array);
-
-struct cras_expr_env {
-	string_array keys;
-	cras_expr_value_array values;
-};
-
-/* initial value for the environment type is zero */
-// clang-format off
-#define CRAS_EXPR_ENV_INIT {}
-// clang-format on
-
-void cras_expr_env_install_builtins(struct cras_expr_env *env);
-void cras_expr_env_set_variable_boolean(struct cras_expr_env *env,
-					const char *name, char boolean);
-void cras_expr_env_set_variable_integer(struct cras_expr_env *env,
-					const char *name, int integer);
-void cras_expr_env_set_variable_string(struct cras_expr_env *env,
-				       const char *name, const char *str);
-void cras_expr_env_free(struct cras_expr_env *env);
-void cras_expr_env_dump(struct dumper *d, const struct cras_expr_env *env);
-
-struct cras_expr_expression *cras_expr_expression_parse(const char *str);
-void cras_expr_expression_eval(struct cras_expr_expression *expr,
-			       struct cras_expr_env *env,
-			       struct cras_expr_value *value);
-int cras_expr_expression_eval_boolean(struct cras_expr_expression *expr,
-				      struct cras_expr_env *env, char *boolean);
-int cras_expr_expression_eval_int(struct cras_expr_expression *expr,
-				  struct cras_expr_env *env, int *integer);
-void cras_expr_expression_free(struct cras_expr_expression *expr);
-void cras_expr_expression_dump(struct dumper *d,
-			       const struct cras_expr_expression *expr);
-void cras_expr_value_free(struct cras_expr_value *value);
-void cras_expr_value_dump(struct dumper *d,
-			  const struct cras_expr_value *value);
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif /* CRAS_EXPR_H_ */
diff --git a/cras/src/server/cras_fmt_conv.c b/cras/src/server/cras_fmt_conv.c
deleted file mode 100644
index 842529b..0000000
--- a/cras/src/server/cras_fmt_conv.c
+++ /dev/null
@@ -1,847 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-/* For now just use speex, can add more resamplers later. */
-#include <speex/speex_resampler.h>
-#include <sys/param.h>
-#include <syslog.h>
-#include <endian.h>
-#include <limits.h>
-#include <math.h>
-
-#include "cras_fmt_conv.h"
-#include "cras_fmt_conv_ops.h"
-#include "cras_audio_format.h"
-#include "cras_util.h"
-#include "linear_resampler.h"
-
-/* The quality level is a value between 0 and 10. This is a tradeoff between
- * performance, latency, and quality. */
-#define SPEEX_QUALITY_LEVEL 4
-/* Max number of converters, src, down/up mix, 2xformat, and linear resample. */
-#define MAX_NUM_CONVERTERS 5
-/* Channel index for stereo. */
-#define STEREO_L 0
-#define STEREO_R 1
-
-typedef void (*sample_format_converter_t)(const uint8_t *in, size_t in_samples,
-					  uint8_t *out);
-typedef size_t (*channel_converter_t)(struct cras_fmt_conv *conv,
-				      const uint8_t *in, size_t in_frames,
-				      uint8_t *out);
-
-/* Member data for the resampler. */
-struct cras_fmt_conv {
-	SpeexResamplerState *speex_state;
-	channel_converter_t channel_converter;
-	float **ch_conv_mtx; /* Coefficient matrix for mixing channels. */
-	sample_format_converter_t in_format_converter;
-	sample_format_converter_t out_format_converter;
-	struct linear_resampler *resampler;
-	struct cras_audio_format in_fmt;
-	struct cras_audio_format out_fmt;
-	uint8_t *tmp_bufs[MAX_NUM_CONVERTERS - 1];
-	size_t tmp_buf_frames;
-	size_t pre_linear_resample;
-	size_t num_converters; /* Incremented once for SRC, channel, format. */
-};
-
-static int is_channel_layout_equal(const struct cras_audio_format *a,
-				   const struct cras_audio_format *b)
-{
-	int ch;
-	for (ch = 0; ch < CRAS_CH_MAX; ch++)
-		if (a->channel_layout[ch] != b->channel_layout[ch])
-			return 0;
-
-	return 1;
-}
-
-/*
- * Calculates the normalize_factor abs_sum(ci) from given coefficients.
- * Since sum(ci / abs_sum(ci)) <= 1, this could prevent sample overflow while
- * upmixing or downmixing.
- */
-static float normalize_factor(float *buf, size_t n)
-{
-	int i;
-	float abs_sum = 0.0;
-	for (i = 0; i < n; i++)
-		abs_sum += fabs(buf[i]);
-
-	return 1.0 / abs_sum;
-}
-
-/*
- * Normalize all channels with the same factor to maintain
- * the energy ratio between original channels.
- */
-static void normalize(float **mtx, size_t m, size_t n, float factor)
-{
-	int i, j;
-	for (i = 0; i < m; i++)
-		for (j = 0; j < n; j++)
-			mtx[i][j] *= factor;
-}
-
-/*
- * Populates the down mix matrix by rules:
- * 1. Front/side left(right) channel will mix to left(right) of
- *    full scale.
- * 2. Center and LFE will be split equally to left and right.
- *    Rear
- * 3. Rear left/right will split 1/4 of the power to opposite
- *    channel.
- */
-static void surround51_to_stereo_downmix_mtx(float **mtx,
-					     int8_t layout[CRAS_CH_MAX])
-{
-	if (layout[CRAS_CH_FC] != -1) {
-		mtx[STEREO_L][layout[CRAS_CH_FC]] = 0.707;
-		mtx[STEREO_R][layout[CRAS_CH_FC]] = 0.707;
-	}
-	if (layout[CRAS_CH_FL] != -1 && layout[CRAS_CH_FR] != -1) {
-		mtx[STEREO_L][layout[CRAS_CH_FL]] = 1.0;
-		mtx[STEREO_R][layout[CRAS_CH_FR]] = 1.0;
-	}
-	if (layout[CRAS_CH_SL] != -1 && layout[CRAS_CH_SR] != -1) {
-		mtx[STEREO_L][layout[CRAS_CH_SL]] = 1.0;
-		mtx[STEREO_R][layout[CRAS_CH_SR]] = 1.0;
-	}
-	if (layout[CRAS_CH_RL] != -1 && layout[CRAS_CH_RR] != -1) {
-		/* Split 1/4 power to the other side */
-		mtx[STEREO_L][layout[CRAS_CH_RL]] = 0.866;
-		mtx[STEREO_R][layout[CRAS_CH_RL]] = 0.5;
-		mtx[STEREO_R][layout[CRAS_CH_RR]] = 0.866;
-		mtx[STEREO_L][layout[CRAS_CH_RR]] = 0.5;
-	}
-	if (layout[CRAS_CH_LFE] != -1) {
-		mtx[STEREO_L][layout[CRAS_CH_LFE]] = 0.707;
-		mtx[STEREO_R][layout[CRAS_CH_LFE]] = 0.707;
-	}
-	normalize(mtx, 2, 6, normalize_factor(mtx[STEREO_L], 6));
-}
-
-/* Populates the down mix matrix by rules:
- * 1. Front left(right) channel will mix to the front left(right) of
- *    full scale.
- * 2. Rear and side left(right) channel will mix to the rear left(right) of
- *    full scale.
- * 3. Center will be split equally to the front left and right.
- * 4. LFE will be split equally to the other channels.
- */
-static void surround51_to_quad_downmix_mtx(float **mtx,
-					   int8_t layout[CRAS_CH_MAX])
-{
-	if (layout[CRAS_CH_FL] != -1 && layout[CRAS_CH_FR] != -1) {
-		mtx[CRAS_CH_FL][layout[CRAS_CH_FL]] = 1.0;
-		mtx[CRAS_CH_FR][layout[CRAS_CH_FR]] = 1.0;
-	}
-	if (layout[CRAS_CH_RL] != -1 && layout[CRAS_CH_RR] != -1) {
-		mtx[CRAS_CH_RL][layout[CRAS_CH_RL]] = 1.0;
-		mtx[CRAS_CH_RR][layout[CRAS_CH_RR]] = 1.0;
-	}
-	if (layout[CRAS_CH_SL] != -1 && layout[CRAS_CH_SR] != -1) {
-		mtx[CRAS_CH_RL][layout[CRAS_CH_SL]] = 1.0;
-		mtx[CRAS_CH_RR][layout[CRAS_CH_SR]] = 1.0;
-	}
-	if (layout[CRAS_CH_FC] != -1) {
-		/* Split 1/2 power to the front L/R */
-		mtx[CRAS_CH_FL][layout[CRAS_CH_FC]] = 0.707;
-		mtx[CRAS_CH_FR][layout[CRAS_CH_FC]] = 0.707;
-	}
-	if (layout[CRAS_CH_LFE] != -1) {
-		/* Split 1/4 power to the other channel */
-		mtx[CRAS_CH_FL][layout[CRAS_CH_LFE]] = 0.5;
-		mtx[CRAS_CH_FR][layout[CRAS_CH_LFE]] = 0.5;
-		mtx[CRAS_CH_RL][layout[CRAS_CH_LFE]] = 0.5;
-		mtx[CRAS_CH_RR][layout[CRAS_CH_LFE]] = 0.5;
-	}
-
-	normalize(mtx, 4, 6, normalize_factor(mtx[CRAS_CH_FL], 6));
-}
-
-static int is_supported_format(const struct cras_audio_format *fmt)
-{
-	if (!fmt)
-		return 0;
-
-	switch (fmt->format) {
-	case SND_PCM_FORMAT_U8:
-	case SND_PCM_FORMAT_S16_LE:
-	case SND_PCM_FORMAT_S24_3LE:
-	case SND_PCM_FORMAT_S24_LE:
-	case SND_PCM_FORMAT_S32_LE:
-		return 1;
-	default:
-		return 0;
-	}
-}
-
-static size_t mono_to_stereo(struct cras_fmt_conv *conv, const uint8_t *in,
-			     size_t in_frames, uint8_t *out)
-{
-	return s16_mono_to_stereo(in, in_frames, out);
-}
-
-static size_t stereo_to_mono(struct cras_fmt_conv *conv, const uint8_t *in,
-			     size_t in_frames, uint8_t *out)
-{
-	return s16_stereo_to_mono(in, in_frames, out);
-}
-
-static size_t mono_to_51(struct cras_fmt_conv *conv, const uint8_t *in,
-			 size_t in_frames, uint8_t *out)
-{
-	size_t left, right, center;
-
-	left = conv->out_fmt.channel_layout[CRAS_CH_FL];
-	right = conv->out_fmt.channel_layout[CRAS_CH_FR];
-	center = conv->out_fmt.channel_layout[CRAS_CH_FC];
-
-	return s16_mono_to_51(left, right, center, in, in_frames, out);
-}
-
-static size_t stereo_to_51(struct cras_fmt_conv *conv, const uint8_t *in,
-			   size_t in_frames, uint8_t *out)
-{
-	size_t left, right, center;
-
-	left = conv->out_fmt.channel_layout[CRAS_CH_FL];
-	right = conv->out_fmt.channel_layout[CRAS_CH_FR];
-	center = conv->out_fmt.channel_layout[CRAS_CH_FC];
-
-	return s16_stereo_to_51(left, right, center, in, in_frames, out);
-}
-
-static size_t quad_to_51(struct cras_fmt_conv *conv, const uint8_t *in,
-			 size_t in_frames, uint8_t *out)
-{
-	size_t fl, fr, rl, rr;
-
-	fl = conv->out_fmt.channel_layout[CRAS_CH_FL];
-	fr = conv->out_fmt.channel_layout[CRAS_CH_FR];
-	rl = conv->out_fmt.channel_layout[CRAS_CH_RL];
-	rr = conv->out_fmt.channel_layout[CRAS_CH_RR];
-
-	return s16_quad_to_51(fl, fr, rl, rr, in, in_frames, out);
-}
-
-static size_t _51_to_stereo(struct cras_fmt_conv *conv, const uint8_t *in,
-			    size_t in_frames, uint8_t *out)
-{
-	return s16_51_to_stereo(in, in_frames, out);
-}
-
-static size_t _51_to_quad(struct cras_fmt_conv *conv, const uint8_t *in,
-			  size_t in_frames, uint8_t *out)
-{
-	return s16_51_to_quad(in, in_frames, out);
-}
-
-static size_t stereo_to_quad(struct cras_fmt_conv *conv, const uint8_t *in,
-			     size_t in_frames, uint8_t *out)
-{
-	size_t front_left, front_right, rear_left, rear_right;
-
-	front_left = conv->out_fmt.channel_layout[CRAS_CH_FL];
-	front_right = conv->out_fmt.channel_layout[CRAS_CH_FR];
-	rear_left = conv->out_fmt.channel_layout[CRAS_CH_RL];
-	rear_right = conv->out_fmt.channel_layout[CRAS_CH_RR];
-
-	return s16_stereo_to_quad(front_left, front_right, rear_left,
-				  rear_right, in, in_frames, out);
-}
-
-static size_t quad_to_stereo(struct cras_fmt_conv *conv, const uint8_t *in,
-			     size_t in_frames, uint8_t *out)
-{
-	size_t front_left, front_right, rear_left, rear_right;
-
-	front_left = conv->in_fmt.channel_layout[CRAS_CH_FL];
-	front_right = conv->in_fmt.channel_layout[CRAS_CH_FR];
-	rear_left = conv->in_fmt.channel_layout[CRAS_CH_RL];
-	rear_right = conv->in_fmt.channel_layout[CRAS_CH_RR];
-
-	return s16_quad_to_stereo(front_left, front_right, rear_left,
-				  rear_right, in, in_frames, out);
-}
-
-static size_t default_all_to_all(struct cras_fmt_conv *conv, const uint8_t *in,
-				 size_t in_frames, uint8_t *out)
-{
-	size_t num_in_ch, num_out_ch;
-
-	num_in_ch = conv->in_fmt.num_channels;
-	num_out_ch = conv->out_fmt.num_channels;
-
-	return s16_default_all_to_all(&conv->out_fmt, num_in_ch, num_out_ch, in,
-				      in_frames, out);
-}
-
-// Fill min(in channels, out_channels), leave the rest 0s.
-static size_t default_some_to_some(struct cras_fmt_conv *conv,
-				   const uint8_t *in,
-				   size_t in_frames,
-				   uint8_t *out)
-{
-	size_t num_in_ch, num_out_ch;
-
-	num_in_ch = conv->in_fmt.num_channels;
-	num_out_ch = conv->out_fmt.num_channels;
-
-	return s16_some_to_some(&conv->out_fmt, num_in_ch, num_out_ch, in,
-				in_frames, out);
-}
-
-static size_t convert_channels(struct cras_fmt_conv *conv, const uint8_t *in,
-			       size_t in_frames, uint8_t *out)
-{
-	float **ch_conv_mtx;
-	size_t num_in_ch, num_out_ch;
-
-	ch_conv_mtx = conv->ch_conv_mtx;
-	num_in_ch = conv->in_fmt.num_channels;
-	num_out_ch = conv->out_fmt.num_channels;
-
-	return s16_convert_channels(ch_conv_mtx, num_in_ch, num_out_ch, in,
-				    in_frames, out);
-}
-
-/*
- * Exported interface
- */
-
-struct cras_fmt_conv *cras_fmt_conv_create(const struct cras_audio_format *in,
-					   const struct cras_audio_format *out,
-					   size_t max_frames,
-					   size_t pre_linear_resample)
-{
-	struct cras_fmt_conv *conv;
-	int rc;
-	unsigned i;
-
-	conv = calloc(1, sizeof(*conv));
-	if (conv == NULL)
-		return NULL;
-	conv->in_fmt = *in;
-	conv->out_fmt = *out;
-	conv->tmp_buf_frames = max_frames;
-	conv->pre_linear_resample = pre_linear_resample;
-
-	if (!is_supported_format(in)) {
-		syslog(LOG_ERR, "Invalid input format %d", in->format);
-		cras_fmt_conv_destroy(&conv);
-		return NULL;
-	}
-
-	if (!is_supported_format(out)) {
-		syslog(LOG_ERR, "Invalid output format %d", out->format);
-		cras_fmt_conv_destroy(&conv);
-		return NULL;
-	}
-
-	/* Set up sample format conversion. */
-	/* TODO(dgreid) - modify channel and sample rate conversion so
-	 * converting to s16 isnt necessary. */
-	if (in->format != SND_PCM_FORMAT_S16_LE) {
-		conv->num_converters++;
-		syslog(LOG_DEBUG, "Convert from format %d to %d.", in->format,
-		       out->format);
-		switch (in->format) {
-		case SND_PCM_FORMAT_U8:
-			conv->in_format_converter = convert_u8_to_s16le;
-			break;
-		case SND_PCM_FORMAT_S24_LE:
-			conv->in_format_converter = convert_s24le_to_s16le;
-			break;
-		case SND_PCM_FORMAT_S32_LE:
-			conv->in_format_converter = convert_s32le_to_s16le;
-			break;
-		case SND_PCM_FORMAT_S24_3LE:
-			conv->in_format_converter = convert_s243le_to_s16le;
-			break;
-		default:
-			syslog(LOG_ERR, "Should never reachable");
-			break;
-		}
-	}
-	if (out->format != SND_PCM_FORMAT_S16_LE) {
-		conv->num_converters++;
-		syslog(LOG_DEBUG, "Convert from format %d to %d.", in->format,
-		       out->format);
-		switch (out->format) {
-		case SND_PCM_FORMAT_U8:
-			conv->out_format_converter = convert_s16le_to_u8;
-			break;
-		case SND_PCM_FORMAT_S24_LE:
-			conv->out_format_converter = convert_s16le_to_s24le;
-			break;
-		case SND_PCM_FORMAT_S32_LE:
-			conv->out_format_converter = convert_s16le_to_s32le;
-			break;
-		case SND_PCM_FORMAT_S24_3LE:
-			conv->out_format_converter = convert_s16le_to_s243le;
-			break;
-		default:
-			syslog(LOG_ERR, "Should never reachable");
-			break;
-		}
-	}
-
-	/* Set up channel number conversion. */
-	if (in->num_channels != out->num_channels) {
-		conv->num_converters++;
-		syslog(LOG_DEBUG, "Convert from %zu to %zu channels.",
-		       in->num_channels, out->num_channels);
-
-		/* Populate the conversion matrix base on in/out channel count
-		 * and layout. */
-		if (in->num_channels == 1 && out->num_channels == 2) {
-			conv->channel_converter = mono_to_stereo;
-		} else if (in->num_channels == 1 && out->num_channels == 6) {
-			conv->channel_converter = mono_to_51;
-		} else if (in->num_channels == 2 && out->num_channels == 1) {
-			conv->channel_converter = stereo_to_mono;
-		} else if (in->num_channels == 2 && out->num_channels == 4) {
-			conv->channel_converter = stereo_to_quad;
-		} else if (in->num_channels == 4 && out->num_channels == 2) {
-			conv->channel_converter = quad_to_stereo;
-		} else if (in->num_channels == 2 && out->num_channels == 6) {
-			conv->channel_converter = stereo_to_51;
-		} else if (in->num_channels == 4 && out->num_channels == 6) {
-			conv->channel_converter = quad_to_51;
-		} else if (in->num_channels == 6 &&
-			   (out->num_channels == 2 || out->num_channels == 4)) {
-			int in_channel_layout_set = 0;
-
-			/* Checks if channel_layout is set in the incoming format */
-			for (i = 0; i < CRAS_CH_MAX; i++)
-				if (in->channel_layout[i] != -1)
-					in_channel_layout_set = 1;
-
-			/* Use the conversion matrix based converter when a
-			 * channel layout is set, or default to use existing
-			 * converter to downmix to stereo */
-			if (in_channel_layout_set) {
-				conv->ch_conv_mtx =
-					cras_channel_conv_matrix_alloc(
-						in->num_channels,
-						out->num_channels);
-				if (conv->ch_conv_mtx == NULL) {
-					cras_fmt_conv_destroy(&conv);
-					return NULL;
-				}
-				conv->channel_converter = convert_channels;
-				if (out->num_channels == 4) {
-					surround51_to_quad_downmix_mtx(
-						conv->ch_conv_mtx,
-						conv->in_fmt.channel_layout);
-				} else {
-					surround51_to_stereo_downmix_mtx(
-						conv->ch_conv_mtx,
-						conv->in_fmt.channel_layout);
-				}
-			} else {
-				if (out->num_channels == 4)
-					conv->channel_converter = _51_to_quad;
-				else
-					conv->channel_converter = _51_to_stereo;
-			}
-		} else if (in->num_channels <= 8 && out->num_channels <= 8) {
-			// For average channel counts mix from all to all.
-			syslog(LOG_WARNING,
-			       "Using all_to_all map for %zu to %zu",
-			       in->num_channels, out->num_channels);
-			conv->channel_converter = default_all_to_all;
-		} else {
-			syslog(LOG_WARNING,
-			       "Using some_to_some channel map for %zu to %zu",
-			       in->num_channels, out->num_channels);
-			conv->channel_converter = default_some_to_some;
-		}
-	} else if (in->num_channels > 2 && !is_channel_layout_equal(in, out)) {
-		conv->num_converters++;
-		conv->ch_conv_mtx = cras_channel_conv_matrix_create(in, out);
-		if (conv->ch_conv_mtx == NULL) {
-			syslog(LOG_ERR,
-			       "Failed to create channel conversion matrix."
-			       "Fallback to default_all_to_all.");
-			conv->channel_converter = default_all_to_all;
-		} else {
-			conv->channel_converter = convert_channels;
-		}
-	}
-	/* Set up sample rate conversion. */
-	if (in->frame_rate != out->frame_rate) {
-		conv->num_converters++;
-		syslog(LOG_DEBUG, "Convert from %zu to %zu Hz.", in->frame_rate,
-		       out->frame_rate);
-		conv->speex_state =
-			speex_resampler_init(out->num_channels, in->frame_rate,
-					     out->frame_rate,
-					     SPEEX_QUALITY_LEVEL, &rc);
-		if (conv->speex_state == NULL) {
-			syslog(LOG_ERR, "Fail to create speex:%zu %zu %zu %d",
-			       out->num_channels, in->frame_rate,
-			       out->frame_rate, rc);
-			cras_fmt_conv_destroy(&conv);
-			return NULL;
-		}
-	}
-
-	/*
-	 * Set up linear resampler.
-	 *
-	 * Note: intended to give both src_rate and dst_rate the same value
-	 * (i.e. out->frame_rate).  They will be updated in runtime in
-	 * update_estimated_rate() when the audio thread wants to adjust the
-	 * rate for inaccurate device consumption rate.
-	 */
-	conv->num_converters++;
-	conv->resampler =
-		linear_resampler_create(out->num_channels,
-					cras_get_format_bytes(out),
-					out->frame_rate, out->frame_rate);
-	if (conv->resampler == NULL) {
-		syslog(LOG_ERR, "Fail to create linear resampler");
-		cras_fmt_conv_destroy(&conv);
-		return NULL;
-	}
-
-	/* Need num_converters-1 temp buffers, the final converter renders
-	 * directly into the output. */
-	for (i = 0; i < conv->num_converters - 1; i++) {
-		conv->tmp_bufs[i] = malloc(
-			max_frames * 4 * /* width in bytes largest format. */
-			MAX(in->num_channels, out->num_channels));
-		if (conv->tmp_bufs[i] == NULL) {
-			cras_fmt_conv_destroy(&conv);
-			return NULL;
-		}
-	}
-
-	assert(conv->num_converters <= MAX_NUM_CONVERTERS);
-
-	return conv;
-}
-
-void cras_fmt_conv_destroy(struct cras_fmt_conv **convp)
-{
-	unsigned i;
-	struct cras_fmt_conv *conv = *convp;
-
-	if (conv->ch_conv_mtx)
-		cras_channel_conv_matrix_destroy(conv->ch_conv_mtx,
-						 conv->out_fmt.num_channels);
-	if (conv->speex_state)
-		speex_resampler_destroy(conv->speex_state);
-	if (conv->resampler)
-		linear_resampler_destroy(conv->resampler);
-	for (i = 0; i < MAX_NUM_CONVERTERS - 1; i++)
-		free(conv->tmp_bufs[i]);
-	free(conv);
-	*convp = NULL;
-}
-
-struct cras_fmt_conv *cras_channel_remix_conv_create(unsigned int num_channels,
-						     const float *coefficient)
-{
-	struct cras_fmt_conv *conv;
-	unsigned out_ch, in_ch;
-
-	conv = calloc(1, sizeof(*conv));
-	if (conv == NULL)
-		return NULL;
-	conv->in_fmt.num_channels = num_channels;
-	conv->out_fmt.num_channels = num_channels;
-
-	conv->ch_conv_mtx =
-		cras_channel_conv_matrix_alloc(num_channels, num_channels);
-	/* Convert the coeffiencnt array to conversion matrix. */
-	for (out_ch = 0; out_ch < num_channels; out_ch++)
-		for (in_ch = 0; in_ch < num_channels; in_ch++)
-			conv->ch_conv_mtx[out_ch][in_ch] =
-				coefficient[in_ch + out_ch * num_channels];
-
-	conv->num_converters = 1;
-	conv->tmp_bufs[0] = malloc(4 * /* width in bytes largest format. */
-				   num_channels);
-	return conv;
-}
-
-void cras_channel_remix_convert(struct cras_fmt_conv *conv,
-				const struct cras_audio_format *fmt,
-				uint8_t *in_buf, size_t nframes)
-{
-	unsigned ch, fr;
-	int16_t *tmp = (int16_t *)conv->tmp_bufs[0];
-	int16_t *buf = (int16_t *)in_buf;
-
-	/*
-	 * Skip remix for non S16_LE format.
-	 * TODO(tzungbi): support 24 bits remix convert.
-	 */
-	if (fmt->format != SND_PCM_FORMAT_S16_LE)
-		return;
-
-	/* Do remix only when input buffer has the same number of channels. */
-	if (fmt->num_channels != conv->in_fmt.num_channels)
-		return;
-
-	for (fr = 0; fr < nframes; fr++) {
-		for (ch = 0; ch < conv->in_fmt.num_channels; ch++)
-			tmp[ch] = s16_multiply_buf_with_coef(
-				conv->ch_conv_mtx[ch], buf,
-				conv->in_fmt.num_channels);
-		for (ch = 0; ch < conv->in_fmt.num_channels; ch++)
-			buf[ch] = tmp[ch];
-		buf += conv->in_fmt.num_channels;
-	}
-}
-
-const struct cras_audio_format *
-cras_fmt_conv_in_format(const struct cras_fmt_conv *conv)
-{
-	return &conv->in_fmt;
-}
-
-const struct cras_audio_format *
-cras_fmt_conv_out_format(const struct cras_fmt_conv *conv)
-{
-	return &conv->out_fmt;
-}
-
-size_t cras_fmt_conv_in_frames_to_out(struct cras_fmt_conv *conv,
-				      size_t in_frames)
-{
-	if (!conv)
-		return in_frames;
-
-	if (conv->pre_linear_resample)
-		in_frames = linear_resampler_in_frames_to_out(conv->resampler,
-							      in_frames);
-	in_frames = cras_frames_at_rate(conv->in_fmt.frame_rate, in_frames,
-					conv->out_fmt.frame_rate);
-	if (!conv->pre_linear_resample)
-		in_frames = linear_resampler_in_frames_to_out(conv->resampler,
-							      in_frames);
-	return in_frames;
-}
-
-size_t cras_fmt_conv_out_frames_to_in(struct cras_fmt_conv *conv,
-				      size_t out_frames)
-{
-	if (!conv)
-		return out_frames;
-	if (!conv->pre_linear_resample)
-		out_frames = linear_resampler_out_frames_to_in(conv->resampler,
-							       out_frames);
-	out_frames = cras_frames_at_rate(conv->out_fmt.frame_rate, out_frames,
-					 conv->in_fmt.frame_rate);
-	if (conv->pre_linear_resample)
-		out_frames = linear_resampler_out_frames_to_in(conv->resampler,
-							       out_frames);
-	return out_frames;
-}
-
-void cras_fmt_conv_set_linear_resample_rates(struct cras_fmt_conv *conv,
-					     float from, float to)
-{
-	linear_resampler_set_rates(conv->resampler, from, to);
-}
-
-size_t cras_fmt_conv_convert_frames(struct cras_fmt_conv *conv,
-				    const uint8_t *in_buf, uint8_t *out_buf,
-				    unsigned int *in_frames, size_t out_frames)
-{
-	uint32_t fr_in, fr_out;
-	uint8_t *buffers[MAX_NUM_CONVERTERS + 1]; /* converters + out buffer. */
-	size_t buf_idx = 0;
-	static int logged_frames_dont_fit;
-	unsigned int used_converters = conv->num_converters;
-	unsigned int post_linear_resample = 0;
-	unsigned int pre_linear_resample = 0;
-	unsigned int linear_resample_fr = 0;
-
-	assert(conv);
-	assert(*in_frames <= conv->tmp_buf_frames);
-
-	if (linear_resampler_needed(conv->resampler)) {
-		post_linear_resample = !conv->pre_linear_resample;
-		pre_linear_resample = conv->pre_linear_resample;
-	}
-
-	/* If no SRC, then in_frames should = out_frames. */
-	if (conv->speex_state == NULL) {
-		fr_in = MIN(*in_frames, out_frames);
-		if (out_frames < *in_frames && !logged_frames_dont_fit) {
-			syslog(LOG_INFO, "fmt_conv: %u to %zu no SRC.",
-			       *in_frames, out_frames);
-			logged_frames_dont_fit = 1;
-		}
-	} else {
-		fr_in = *in_frames;
-	}
-	fr_out = fr_in;
-
-	/* Set up a chain of buffers.  The output buffer of the first conversion
-	 * is used as input to the second and so forth, ending in the output
-	 * buffer. */
-	if (!linear_resampler_needed(conv->resampler))
-		used_converters--;
-
-	buffers[4] = (uint8_t *)conv->tmp_bufs[3];
-	buffers[3] = (uint8_t *)conv->tmp_bufs[2];
-	buffers[2] = (uint8_t *)conv->tmp_bufs[1];
-	buffers[1] = (uint8_t *)conv->tmp_bufs[0];
-	buffers[0] = (uint8_t *)in_buf;
-	buffers[used_converters] = out_buf;
-
-	if (pre_linear_resample) {
-		linear_resample_fr = fr_in;
-		unsigned resample_limit = out_frames;
-
-		/* If there is a 2nd fmt conversion we should convert the
-		 * resample limit and round it to the lower bound in order
-		 * not to convert too many frames in the pre linear resampler.
-		 */
-		if (conv->speex_state != NULL) {
-			resample_limit = resample_limit *
-					 conv->in_fmt.frame_rate /
-					 conv->out_fmt.frame_rate;
-			/*
-			 * However if the limit frames count is less than
-			 * |out_rate / in_rate|, the final limit value could be
-			 * rounded to zero so it confuses linear resampler to
-			 * do nothing. Make sure it's non-zero in that case.
-			 */
-			if (resample_limit == 0)
-				resample_limit = 1;
-		}
-
-		resample_limit = MIN(resample_limit, conv->tmp_buf_frames);
-		fr_in = linear_resampler_resample(
-			conv->resampler, buffers[buf_idx], &linear_resample_fr,
-			buffers[buf_idx + 1], resample_limit);
-		buf_idx++;
-	}
-
-	/* If the input format isn't S16_LE convert to it. */
-	if (conv->in_fmt.format != SND_PCM_FORMAT_S16_LE) {
-		conv->in_format_converter(buffers[buf_idx],
-					  fr_in * conv->in_fmt.num_channels,
-					  (uint8_t *)buffers[buf_idx + 1]);
-		buf_idx++;
-	}
-
-	/* Then channel conversion. */
-	if (conv->channel_converter != NULL) {
-		conv->channel_converter(conv, buffers[buf_idx], fr_in,
-					buffers[buf_idx + 1]);
-		buf_idx++;
-	}
-
-	/* Then SRC. */
-	if (conv->speex_state != NULL) {
-		unsigned int out_limit = out_frames;
-
-		if (post_linear_resample)
-			out_limit = linear_resampler_out_frames_to_in(
-				conv->resampler, out_limit);
-		fr_out = cras_frames_at_rate(conv->in_fmt.frame_rate, fr_in,
-					     conv->out_fmt.frame_rate);
-		if (fr_out > out_frames + 1 && !logged_frames_dont_fit) {
-			syslog(LOG_INFO,
-			       "fmt_conv: put %u frames in %zu sized buffer",
-			       fr_out, out_frames);
-			logged_frames_dont_fit = 1;
-		}
-		/* limit frames to the output size. */
-		fr_out = MIN(fr_out, out_limit);
-		speex_resampler_process_interleaved_int(
-			conv->speex_state, (int16_t *)buffers[buf_idx], &fr_in,
-			(int16_t *)buffers[buf_idx + 1], &fr_out);
-		buf_idx++;
-	}
-
-	if (post_linear_resample) {
-		linear_resample_fr = fr_out;
-		unsigned resample_limit = MIN(conv->tmp_buf_frames, out_frames);
-		fr_out = linear_resampler_resample(
-			conv->resampler, buffers[buf_idx], &linear_resample_fr,
-			buffers[buf_idx + 1], resample_limit);
-		buf_idx++;
-	}
-
-	/* If the output format isn't S16_LE convert to it. */
-	if (conv->out_fmt.format != SND_PCM_FORMAT_S16_LE) {
-		conv->out_format_converter(buffers[buf_idx],
-					   fr_out * conv->out_fmt.num_channels,
-					   (uint8_t *)buffers[buf_idx + 1]);
-		buf_idx++;
-	}
-
-	if (pre_linear_resample) {
-		*in_frames = linear_resample_fr;
-
-		/* When buffer sizes are small, there's a corner case that
-		 * speex library resamples 0 frame to N-1 frames, where N
-		 * is the integer ratio of output and input rate. For example,
-		 * 16KHz to 48KHz. In this case fmt_conv should claim zero
-		 * frames processed, instead of using the linear resampler
-		 * processed frames count. Otherwise there will be a frame
-		 * leak and, if accumulated, causes delay in multiple devices
-		 * use case.
-		 */
-		if (conv->speex_state && (fr_in == 0))
-			*in_frames = 0;
-	} else {
-		*in_frames = fr_in;
-	}
-	return fr_out;
-}
-
-int cras_fmt_conversion_needed(const struct cras_fmt_conv *conv)
-{
-	return linear_resampler_needed(conv->resampler) ||
-	       (conv->num_converters > 1);
-}
-
-/* If the server cannot provide the requested format, configures an audio format
- * converter that handles transforming the input format to the format used by
- * the server. */
-int config_format_converter(struct cras_fmt_conv **conv,
-			    enum CRAS_STREAM_DIRECTION dir,
-			    const struct cras_audio_format *from,
-			    const struct cras_audio_format *to,
-			    unsigned int frames)
-{
-	struct cras_audio_format target;
-
-	/* For input, preserve the channel count and layout of
-	 * from format */
-	if (dir == CRAS_STREAM_INPUT) {
-		target = *from;
-		target.format = to->format;
-		target.frame_rate = to->frame_rate;
-	} else {
-		target = *to;
-	}
-
-	syslog(LOG_DEBUG,
-	       "format convert: from:%d %zu %zu target: %d %zu %zu "
-	       "frames = %u",
-	       from->format, from->frame_rate, from->num_channels,
-	       target.format, target.frame_rate, target.num_channels, frames);
-	*conv = cras_fmt_conv_create(from, &target, frames,
-				     (dir == CRAS_STREAM_INPUT));
-	if (!*conv) {
-		syslog(LOG_ERR, "Failed to create format converter");
-		return -ENOMEM;
-	}
-
-	return 0;
-}
diff --git a/cras/src/server/cras_fmt_conv.h b/cras/src/server/cras_fmt_conv.h
deleted file mode 100644
index 12c0c16..0000000
--- a/cras/src/server/cras_fmt_conv.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-/*
- * Used to convert from one audio format to another.  Currently only supports
- * sample rate conversion with the speex backend.
- */
-#ifndef CRAS_FMT_CONV_H_
-#define CRAS_FMT_CONV_H_
-
-#include <stdint.h>
-#include <stdlib.h>
-
-#include "cras_types.h"
-
-struct cras_audio_format;
-struct cras_fmt_conv;
-
-/* Create and destroy format converters. */
-struct cras_fmt_conv *cras_fmt_conv_create(const struct cras_audio_format *in,
-					   const struct cras_audio_format *out,
-					   size_t max_frames,
-					   size_t pre_linear_resample);
-void cras_fmt_conv_destroy(struct cras_fmt_conv **conv);
-
-/* Creates the format converter for channel remixing. The conversion takes
- * a N by N float matrix, to multiply each N-channels sample.
- * Args:
- *    num_channels - Number of channels of PCM data.
- *    coefficient - Float array of length N * N representing the conversion
- *        matrix, where matrix[i][j] corresponds to coefficient[i * N + j]
- */
-struct cras_fmt_conv *cras_channel_remix_conv_create(unsigned int num_channels,
-						     const float *coefficient);
-
-/* Converts nframes of sample from in_buf, using given remix converter.
- * Args:
- *    conv - The format converter.
- *    fmt - The format of the buffer to convert.
- *    in_buf - The buffer to convert.
- *    nframes - The number of frames to convert.
- */
-void cras_channel_remix_convert(struct cras_fmt_conv *conv,
-				const struct cras_audio_format *fmt,
-				uint8_t *in_buf, size_t nframes);
-
-/* Get the input format of the converter. */
-const struct cras_audio_format *
-cras_fmt_conv_in_format(const struct cras_fmt_conv *conv);
-
-/* Get the output format of the converter. */
-const struct cras_audio_format *
-cras_fmt_conv_out_format(const struct cras_fmt_conv *conv);
-
-/* Get the number of output frames that will result from converting in_frames */
-size_t cras_fmt_conv_in_frames_to_out(struct cras_fmt_conv *conv,
-				      size_t in_frames);
-/* Get the number of input frames that will result from converting out_frames */
-size_t cras_fmt_conv_out_frames_to_in(struct cras_fmt_conv *conv,
-				      size_t out_frames);
-/* Sets the input and output rate to the linear resampler. */
-void cras_fmt_conv_set_linear_resample_rates(struct cras_fmt_conv *conv,
-					     float from, float to);
-/* Converts in_frames samples from in_buf, storing the results in out_buf.
- * Args:
- *    conv - The format converter returned from cras_fmt_conv_create().
- *    in_buf - Samples to convert.
- *    out_buf - Converted samples are placed here.
- *    in_frames - Number of frames from in_buf to convert.
- *    out_frames - Maximum number of frames to store in out_buf.  If there isn't
- *      any format conversion, out_frames must be >= in_frames.  When doing
- *      format conversion out_frames should be able to hold all the converted
- *      frames, this can be checked with cras_fmt_conv_in_frames_to_out().
- * Return number of frames put in out_buf. */
-size_t cras_fmt_conv_convert_frames(struct cras_fmt_conv *conv,
-				    const uint8_t *in_buf, uint8_t *out_buf,
-				    unsigned int *in_frames, size_t out_frames);
-
-/* Checks if format conversion is needed for a fmt converter.
- * Args:
- *    conv - The format convert to check.
- *  Returns:
- *    Non-zero if a format conversion is needed.
- */
-int cras_fmt_conversion_needed(const struct cras_fmt_conv *conv);
-
-/* If the server cannot provide the requested format, configures an audio format
- * converter that handles transforming the input format to the format used by
- * the server.
- * Args:
- *    conv - filled with the new converter if needed.
- *    dir - the stream direction the new converter used for.
- *    from - Format to convert from.
- *    to - Format to convert to.
- *    frames - size of buffer.
- */
-int config_format_converter(struct cras_fmt_conv **conv,
-			    enum CRAS_STREAM_DIRECTION dir,
-			    const struct cras_audio_format *from,
-			    const struct cras_audio_format *to,
-			    unsigned int frames);
-
-#endif /* CRAS_FMT_CONV_H_ */
diff --git a/cras/src/server/cras_fmt_conv_ops.c b/cras/src/server/cras_fmt_conv_ops.c
deleted file mode 100644
index adc5521..0000000
--- a/cras/src/server/cras_fmt_conv_ops.c
+++ /dev/null
@@ -1,503 +0,0 @@
-/* Copyright 2019 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-#include <stdint.h>
-#include <limits.h>
-#include <string.h>
-
-#include "cras_fmt_conv_ops.h"
-
-#define MAX(a, b)                                                              \
-	({                                                                     \
-		__typeof__(a) _a = (a);                                        \
-		__typeof__(b) _b = (b);                                        \
-		_a > _b ? _a : _b;                                             \
-	})
-#define MIN(a, b)                                                              \
-	({                                                                     \
-		__typeof__(a) _a = (a);                                        \
-		__typeof__(b) _b = (b);                                        \
-		_a < _b ? _a : _b;                                             \
-	})
-
-/*
- * Add and clip.
- */
-static int16_t s16_add_and_clip(int16_t a, int16_t b)
-{
-	int32_t sum;
-
-	a = htole16(a);
-	b = htole16(b);
-	sum = (int32_t)a + (int32_t)b;
-	sum = MAX(sum, SHRT_MIN);
-	sum = MIN(sum, SHRT_MAX);
-	return (int16_t)le16toh(sum);
-}
-
-/*
- * Format converter.
- */
-void convert_u8_to_s16le(const uint8_t *in, size_t in_samples, uint8_t *out)
-{
-	size_t i;
-	uint16_t *_out = (uint16_t *)out;
-
-	for (i = 0; i < in_samples; i++, in++, _out++)
-		*_out = (uint16_t)((int16_t)*in - 0x80) << 8;
-}
-
-void convert_s243le_to_s16le(const uint8_t *in, size_t in_samples, uint8_t *out)
-{
-	/* find how to calculate in and out size, implement the conversion
-	 * between S24_3LE and S16 */
-
-	size_t i;
-	int8_t *_in = (int8_t *)in;
-	uint16_t *_out = (uint16_t *)out;
-
-	for (i = 0; i < in_samples; i++, _in += 3, _out++)
-		memcpy(_out, _in + 1, 2);
-}
-
-void convert_s24le_to_s16le(const uint8_t *in, size_t in_samples, uint8_t *out)
-{
-	size_t i;
-	int32_t *_in = (int32_t *)in;
-	uint16_t *_out = (uint16_t *)out;
-
-	for (i = 0; i < in_samples; i++, _in++, _out++)
-		*_out = (int16_t)((*_in & 0x00ffffff) >> 8);
-}
-
-void convert_s32le_to_s16le(const uint8_t *in, size_t in_samples, uint8_t *out)
-{
-	size_t i;
-	int32_t *_in = (int32_t *)in;
-	uint16_t *_out = (uint16_t *)out;
-
-	for (i = 0; i < in_samples; i++, _in++, _out++)
-		*_out = (int16_t)(*_in >> 16);
-}
-
-void convert_s16le_to_u8(const uint8_t *in, size_t in_samples, uint8_t *out)
-{
-	size_t i;
-	int16_t *_in = (int16_t *)in;
-
-	for (i = 0; i < in_samples; i++, _in++, out++)
-		*out = (uint8_t)(*_in >> 8) + 128;
-}
-
-void convert_s16le_to_s243le(const uint8_t *in, size_t in_samples, uint8_t *out)
-{
-	size_t i;
-	int16_t *_in = (int16_t *)in;
-	uint8_t *_out = (uint8_t *)out;
-
-	for (i = 0; i < in_samples; i++, _in++, _out += 3) {
-		*_out = 0;
-		memcpy(_out + 1, _in, 2);
-	}
-}
-
-void convert_s16le_to_s24le(const uint8_t *in, size_t in_samples, uint8_t *out)
-{
-	size_t i;
-	int16_t *_in = (int16_t *)in;
-	uint32_t *_out = (uint32_t *)out;
-
-	for (i = 0; i < in_samples; i++, _in++, _out++)
-		*_out = ((uint32_t)(int32_t)*_in << 8);
-}
-
-void convert_s16le_to_s32le(const uint8_t *in, size_t in_samples, uint8_t *out)
-{
-	size_t i;
-	int16_t *_in = (int16_t *)in;
-	uint32_t *_out = (uint32_t *)out;
-
-	for (i = 0; i < in_samples; i++, _in++, _out++)
-		*_out = ((uint32_t)(int32_t)*_in << 16);
-}
-
-/*
- * Channel converter: mono to stereo.
- */
-size_t s16_mono_to_stereo(const uint8_t *_in, size_t in_frames, uint8_t *_out)
-{
-	size_t i;
-	const int16_t *in = (const int16_t *)_in;
-	int16_t *out = (int16_t *)_out;
-
-	for (i = 0; i < in_frames; i++) {
-		out[2 * i] = in[i];
-		out[2 * i + 1] = in[i];
-	}
-	return in_frames;
-}
-
-/*
- * Channel converter: stereo to mono.
- */
-size_t s16_stereo_to_mono(const uint8_t *_in, size_t in_frames, uint8_t *_out)
-{
-	size_t i;
-	const int16_t *in = (const int16_t *)_in;
-	int16_t *out = (int16_t *)_out;
-
-	for (i = 0; i < in_frames; i++)
-		out[i] = s16_add_and_clip(in[2 * i], in[2 * i + 1]);
-	return in_frames;
-}
-
-/*
- * Channel converter: mono to 5.1 surround.
- *
- * Fit mono to front center of the output, or split to front left/right
- * if front center is missing from the output channel layout.
- */
-size_t s16_mono_to_51(size_t left, size_t right, size_t center,
-		      const uint8_t *_in, size_t in_frames, uint8_t *_out)
-{
-	size_t i;
-	const int16_t *in = (const int16_t *)_in;
-	int16_t *out = (int16_t *)_out;
-
-	memset(out, 0, sizeof(*out) * 6 * in_frames);
-
-	if (center != -1)
-		for (i = 0; i < in_frames; i++)
-			out[6 * i + center] = in[i];
-	else if (left != -1 && right != -1)
-		for (i = 0; i < in_frames; i++) {
-			out[6 * i + right] = in[i] / 2;
-			out[6 * i + left] = in[i] / 2;
-		}
-	else
-		/* Select the first channel to convert to as the
-		 * default behavior.
-		 */
-		for (i = 0; i < in_frames; i++)
-			out[6 * i] = in[i];
-
-	return in_frames;
-}
-
-/*
- * Channel converter: stereo to 5.1 surround.
- *
- * Fit the left/right of input to the front left/right of output respectively
- * and fill others with zero. If any of the front left/right is missed from
- * the output channel layout, mix to front center.
- */
-size_t s16_stereo_to_51(size_t left, size_t right, size_t center,
-			const uint8_t *_in, size_t in_frames, uint8_t *_out)
-{
-	size_t i;
-	const int16_t *in = (const int16_t *)_in;
-	int16_t *out = (int16_t *)_out;
-
-	memset(out, 0, sizeof(*out) * 6 * in_frames);
-
-	if (left != -1 && right != -1)
-		for (i = 0; i < in_frames; i++) {
-			out[6 * i + left] = in[2 * i];
-			out[6 * i + right] = in[2 * i + 1];
-		}
-	else if (center != -1)
-		for (i = 0; i < in_frames; i++)
-			out[6 * i + center] =
-				s16_add_and_clip(in[2 * i], in[2 * i + 1]);
-	else
-		/* Select the first two channels to convert to as the
-		 * default behavior.
-		 */
-		for (i = 0; i < in_frames; i++) {
-			out[6 * i] = in[2 * i];
-			out[6 * i + 1] = in[2 * i + 1];
-		}
-
-	return in_frames;
-}
-
-/*
- * Channel converter: quad to 5.1 surround.
- *
- * Fit the front left/right of input to the front left/right of output
- * and rear left/right of input to the rear left/right of output
- * respectively and fill others with zero.
- */
-size_t s16_quad_to_51(size_t font_left, size_t front_right, size_t rear_left,
-		      size_t rear_right, const uint8_t *_in, size_t in_frames,
-		      uint8_t *_out)
-{
-	size_t i;
-	const int16_t *in = (const int16_t *)_in;
-	int16_t *out = (int16_t *)_out;
-
-	memset(out, 0, sizeof(*out) * 6 * in_frames);
-
-	if (font_left != -1 && front_right != -1 && rear_left != -1 &&
-	    rear_right != -1)
-		for (i = 0; i < in_frames; i++) {
-			out[6 * i + font_left] = in[4 * i];
-			out[6 * i + front_right] = in[4 * i + 1];
-			out[6 * i + rear_left] = in[4 * i + 2];
-			out[6 * i + rear_right] = in[4 * i + 3];
-		}
-	else
-		/* Use default 5.1 channel mapping for the conversion.
-		 */
-		for (i = 0; i < in_frames; i++) {
-			out[6 * i] = in[4 * i];
-			out[6 * i + 1] = in[4 * i + 1];
-			out[6 * i + 4] = in[4 * i + 2];
-			out[6 * i + 5] = in[4 * i + 3];
-		}
-
-	return in_frames;
-}
-
-/*
- * Channel converter: 5.1 surround to stereo.
- *
- * The out buffer can have room for just stereo samples. This convert function
- * is used as the default behavior when channel layout is not set from the
- * client side.
- */
-size_t s16_51_to_stereo(const uint8_t *_in, size_t in_frames, uint8_t *_out)
-{
-	const int16_t *in = (const int16_t *)_in;
-	int16_t *out = (int16_t *)_out;
-	static const unsigned int left_idx = 0;
-	static const unsigned int right_idx = 1;
-	static const unsigned int center_idx = 2;
-	/* static const unsigned int lfe_idx = 3; */
-	/* static const unsigned int left_surround_idx = 4; */
-	/* static const unsigned int right_surround_idx = 5; */
-
-	size_t i;
-	int16_t half_center;
-	/* Use the normalized_factor from the left channel = 1 / (|1| + |0.707|)
-	 * to prevent mixing overflow.
-	 */
-	const float normalized_factor = 0.585;
-	for (i = 0; i < in_frames; i++) {
-		half_center =
-			in[6 * i + center_idx] * 0.707 * normalized_factor;
-		out[2 * i + left_idx] =
-			in[6 * i + left_idx] * normalized_factor + half_center;
-		out[2 * i + right_idx] =
-			in[6 * i + right_idx] * normalized_factor + half_center;
-	}
-	return in_frames;
-}
-
-/*
- * Channel converter: 5.1 surround to quad (front L/R, rear L/R).
- *
- * The out buffer can have room for just quad samples. This convert function
- * is used as the default behavior when channel layout is not set from the
- * client side.
- */
-size_t s16_51_to_quad(const uint8_t *_in, size_t in_frames, uint8_t *_out)
-{
-	const int16_t *in = (const int16_t *)_in;
-	int16_t *out = (int16_t *)_out;
-	static const unsigned int l_quad = 0;
-	static const unsigned int r_quad = 1;
-	static const unsigned int rl_quad = 2;
-	static const unsigned int rr_quad = 3;
-
-	static const unsigned int l_51 = 0;
-	static const unsigned int r_51 = 1;
-	static const unsigned int center_51 = 2;
-	static const unsigned int lfe_51 = 3;
-	static const unsigned int rl_51 = 4;
-	static const unsigned int rr_51 = 5;
-
-	/* Use normalized_factor from the left channel = 1 / (|1| + |0.707| + |0.5|)
-	 * to prevent overflow. */
-	const float normalized_factor = 0.453;
-	size_t i;
-	for (i = 0; i < in_frames; i++) {
-		int16_t half_center;
-		int16_t lfe;
-
-		half_center = in[6 * i + center_51] * 0.707 * normalized_factor;
-		lfe = in[6 * i + lfe_51] * 0.5 * normalized_factor;
-		out[4 * i + l_quad] = normalized_factor * in[6 * i + l_51] +
-				      half_center + lfe;
-		out[4 * i + r_quad] = normalized_factor * in[6 * i + r_51] +
-				      half_center + lfe;
-		out[4 * i + rl_quad] =
-			normalized_factor * in[6 * i + rl_51] + lfe;
-		out[4 * i + rr_quad] =
-			normalized_factor * in[6 * i + rr_51] + lfe;
-	}
-	return in_frames;
-}
-
-/*
- * Channel converter: stereo to quad (front L/R, rear L/R).
- *
- * Fit left/right of input to the front left/right of output respectively
- * and fill others with zero.
- */
-size_t s16_stereo_to_quad(size_t front_left, size_t front_right,
-			  size_t rear_left, size_t rear_right,
-			  const uint8_t *_in, size_t in_frames, uint8_t *_out)
-{
-	size_t i;
-	const int16_t *in = (const int16_t *)_in;
-	int16_t *out = (int16_t *)_out;
-
-	if (front_left != -1 && front_right != -1 && rear_left != -1 &&
-	    rear_right != -1)
-		for (i = 0; i < in_frames; i++) {
-			out[4 * i + front_left] = in[2 * i];
-			out[4 * i + front_right] = in[2 * i + 1];
-			out[4 * i + rear_left] = in[2 * i];
-			out[4 * i + rear_right] = in[2 * i + 1];
-		}
-	else
-		/* Select the first four channels to convert to as the
-		 * default behavior.
-		 */
-		for (i = 0; i < in_frames; i++) {
-			out[4 * i] = in[2 * i];
-			out[4 * i + 1] = in[2 * i + 1];
-			out[4 * i + 2] = in[2 * i];
-			out[4 * i + 3] = in[2 * i + 1];
-		}
-
-	return in_frames;
-}
-
-/*
- * Channel converter: quad (front L/R, rear L/R) to stereo.
- */
-size_t s16_quad_to_stereo(size_t front_left, size_t front_right,
-			  size_t rear_left, size_t rear_right,
-			  const uint8_t *_in, size_t in_frames, uint8_t *_out)
-{
-	size_t i;
-	const int16_t *in = (const int16_t *)_in;
-	int16_t *out = (int16_t *)_out;
-
-	if (front_left == -1 || front_right == -1 || rear_left == -1 ||
-	    rear_right == -1) {
-		front_left = 0;
-		front_right = 1;
-		rear_left = 2;
-		rear_right = 3;
-	}
-
-	for (i = 0; i < in_frames; i++) {
-		out[2 * i] = s16_add_and_clip(in[4 * i + front_left],
-					      in[4 * i + rear_left] / 4);
-		out[2 * i + 1] = s16_add_and_clip(in[4 * i + front_right],
-						  in[4 * i + rear_right] / 4);
-	}
-	return in_frames;
-}
-
-/*
- * Channel converter: N channels to M channels.
- *
- * The out buffer must have room for M channel. This convert function is used
- * as the default behavior when channel layout is not set from the client side.
- */
-size_t s16_default_all_to_all(struct cras_audio_format *out_fmt,
-			      size_t num_in_ch, size_t num_out_ch,
-			      const uint8_t *_in, size_t in_frames,
-			      uint8_t *_out)
-{
-	unsigned int in_ch, out_ch, i;
-	const int16_t *in = (const int16_t *)_in;
-	int16_t *out = (int16_t *)_out;
-	int32_t sum;
-
-	for (i = 0; i < in_frames; i++) {
-		sum = 0;
-		for (in_ch = 0; in_ch < num_in_ch; in_ch++) {
-			sum += (int32_t)in[in_ch + i * num_in_ch];
-		}
-		/*
-		 * 1. Divide `int32_t` by `size_t` without an explicit
-		 *    conversion will generate corrupted results.
-		 * 2. After the division, `sum` should be in the range of
-		 *    int16_t. No clipping is needed.
-		 */
-		sum /= (int32_t)num_in_ch;
-		for (out_ch = 0; out_ch < num_out_ch; out_ch++) {
-			out[out_ch + i * num_out_ch] = (int16_t)sum;
-		}
-	}
-	return in_frames;
-}
-
-/*
- * Copies the input channels across output channels. Drops input channels that
- * don't fit. Ignores output channels greater than the number of input channels.
- */
-size_t s16_some_to_some(const struct cras_audio_format *out_fmt,
-			const size_t num_in_ch, const size_t num_out_ch,
-			const uint8_t *_in, const size_t frame_count,
-			uint8_t *_out)
-{
-	unsigned int i;
-	const int16_t *in = (const int16_t *)_in;
-	int16_t *out = (int16_t *)_out;
-	const size_t num_copy_ch = MIN(num_in_ch, num_out_ch);
-
-	memset(out, 0, frame_count * cras_get_format_bytes(out_fmt));
-	for (i = 0; i < frame_count; i++, out += num_out_ch, in += num_in_ch) {
-		memcpy(out, in, num_copy_ch * sizeof(int16_t));
-	}
-
-	return frame_count;
-}
-
-/*
- * Multiplies buffer vector with coefficient vector.
- */
-int16_t s16_multiply_buf_with_coef(float *coef, const int16_t *buf, size_t size)
-{
-	int32_t sum = 0;
-	int i;
-
-	for (i = 0; i < size; i++)
-		sum += coef[i] * buf[i];
-	sum = MAX(sum, -0x8000);
-	sum = MIN(sum, 0x7fff);
-	return (int16_t)sum;
-}
-
-/*
- * Channel layout converter.
- *
- * Converts channels based on the channel conversion coefficient matrix.
- */
-size_t s16_convert_channels(float **ch_conv_mtx, size_t num_in_ch,
-			    size_t num_out_ch, const uint8_t *_in,
-			    size_t in_frames, uint8_t *_out)
-{
-	unsigned i, fr;
-	unsigned in_idx = 0;
-	unsigned out_idx = 0;
-	const int16_t *in = (const int16_t *)_in;
-	int16_t *out = (int16_t *)_out;
-
-	for (fr = 0; fr < in_frames; fr++) {
-		for (i = 0; i < num_out_ch; i++)
-			out[out_idx + i] = s16_multiply_buf_with_coef(
-				ch_conv_mtx[i], &in[in_idx], num_in_ch);
-		in_idx += num_in_ch;
-		out_idx += num_out_ch;
-	}
-
-	return in_frames;
-}
diff --git a/cras/src/server/cras_fmt_conv_ops.h b/cras/src/server/cras_fmt_conv_ops.h
deleted file mode 100644
index 0af7564..0000000
--- a/cras/src/server/cras_fmt_conv_ops.h
+++ /dev/null
@@ -1,109 +0,0 @@
-/* Copyright 2019 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_FMT_CONV_OPS_H_
-#define CRAS_FMT_CONV_OPS_H_
-
-#include <sys/types.h>
-#include "cras_audio_format.h"
-
-/*
- * Format converter.
- */
-void convert_u8_to_s16le(const uint8_t *in, size_t in_samples, uint8_t *out);
-void convert_s243le_to_s16le(const uint8_t *in, size_t in_samples,
-			     uint8_t *out);
-void convert_s24le_to_s16le(const uint8_t *in, size_t in_samples, uint8_t *out);
-void convert_s32le_to_s16le(const uint8_t *in, size_t in_samples, uint8_t *out);
-void convert_s16le_to_u8(const uint8_t *in, size_t in_samples, uint8_t *out);
-void convert_s16le_to_s243le(const uint8_t *in, size_t in_samples,
-			     uint8_t *out);
-void convert_s16le_to_s24le(const uint8_t *in, size_t in_samples, uint8_t *out);
-void convert_s16le_to_s32le(const uint8_t *in, size_t in_samples, uint8_t *out);
-
-/*
- * Channel converter: mono to stereo.
- */
-size_t s16_mono_to_stereo(const uint8_t *in, size_t in_frames, uint8_t *out);
-
-/*
- * Channel converter: stereo to mono.
- */
-size_t s16_stereo_to_mono(const uint8_t *in, size_t in_frames, uint8_t *out);
-
-/*
- * Channel converter: mono to 5.1 surround.
- */
-size_t s16_mono_to_51(size_t left, size_t right, size_t center,
-		      const uint8_t *in, size_t in_frames, uint8_t *out);
-
-/*
- * Channel converter: stereo to 5.1 surround.
- */
-size_t s16_stereo_to_51(size_t left, size_t right, size_t center,
-			const uint8_t *in, size_t in_frames, uint8_t *out);
-
-/*
- * Channel converter: quad to 5.1 surround.
- */
-size_t s16_quad_to_51(size_t font_left, size_t front_right, size_t rear_left,
-		      size_t rear_right, const uint8_t *in, size_t in_frames,
-		      uint8_t *out);
-
-/*
- * Channel converter: 5.1 surround to stereo.
- */
-size_t s16_51_to_stereo(const uint8_t *in, size_t in_frames, uint8_t *out);
-
-/*
- * Channel converter: 5.1 surround to quad.
- */
-size_t s16_51_to_quad(const uint8_t *in, size_t in_frames, uint8_t *out);
-
-/*
- * Channel converter: stereo to quad (front L/R, rear L/R).
- */
-size_t s16_stereo_to_quad(size_t front_left, size_t front_right,
-			  size_t rear_left, size_t rear_right,
-			  const uint8_t *in, size_t in_frames, uint8_t *out);
-
-/*
- * Channel converter: quad (front L/R, rear L/R) to stereo.
- */
-size_t s16_quad_to_stereo(size_t front_left, size_t front_right,
-			  size_t rear_left, size_t rear_right,
-			  const uint8_t *in, size_t in_frames, uint8_t *out);
-
-/*
- * Channel converter: N channels to M channels.
- */
-size_t s16_default_all_to_all(struct cras_audio_format *out_fmt,
-			      size_t num_in_ch, size_t num_out_ch,
-			      const uint8_t *in, size_t in_frames,
-			      uint8_t *out);
-
-/*
- * Channel converter: N channels to M channels filling min(N,M) channels by
- * directly copying to the destination.
- */
-size_t s16_some_to_some(const struct cras_audio_format *out_fmt,
-			const size_t num_in_ch, const size_t num_out_ch,
-			const uint8_t *_in, const size_t frame_count,
-			uint8_t *_out);
-
-/*
- * Multiplies buffer vector with coefficient vector.
- */
-int16_t s16_multiply_buf_with_coef(float *coef, const int16_t *buf,
-				   size_t size);
-
-/*
- * Channel layout converter.
- */
-size_t s16_convert_channels(float **ch_conv_mtx, size_t num_in_ch,
-			    size_t num_out_ch, const uint8_t *in,
-			    size_t in_frames, uint8_t *out);
-
-#endif /* CRAS_FMT_CONV_OPS_H_ */
diff --git a/cras/src/server/cras_gpio_jack.c b/cras/src/server/cras_gpio_jack.c
deleted file mode 100644
index 7021908..0000000
--- a/cras/src/server/cras_gpio_jack.c
+++ /dev/null
@@ -1,100 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <fcntl.h>
-#include <linux/input.h>
-#include <stdio.h>
-#include <string.h>
-#include <syslog.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <unistd.h>
-#include <libudev.h>
-
-#include "cras_util.h"
-#include "cras_gpio_jack.h"
-
-int gpio_switch_open(const char *pathname)
-{
-	return open(pathname, O_RDONLY);
-}
-
-int gpio_switch_read(int fd, void *buf, size_t n_bytes)
-{
-	return read(fd, buf, n_bytes);
-}
-
-int gpio_switch_eviocgname(int fd, char *name, size_t n_bytes)
-{
-	return ioctl(fd, EVIOCGNAME(n_bytes), name);
-}
-
-int gpio_switch_eviocgbit(int fd, void *buf, size_t n_bytes)
-{
-	return ioctl(fd, EVIOCGBIT(EV_SW, n_bytes), buf);
-}
-
-int gpio_switch_eviocgsw(int fd, void *bits, size_t n_bytes)
-{
-	return ioctl(fd, EVIOCGSW(n_bytes), bits);
-}
-
-char *sys_input_get_device_name(const char *path)
-{
-	char name[256];
-	int fd = open(path, O_RDONLY);
-
-	if (fd >= 0) {
-		gpio_switch_eviocgname(fd, name, sizeof(name));
-		close(fd);
-		return strdup(name);
-	} else {
-		syslog(LOG_WARNING, "Could not open '%s': %s", path,
-		       strerror(errno));
-		return NULL;
-	}
-}
-
-void gpio_switch_list_for_each(gpio_switch_list_callback callback, void *arg)
-{
-	struct udev *udev;
-	struct udev_enumerate *enumerate;
-	struct udev_list_entry *dl;
-	struct udev_list_entry *dev_list_entry;
-
-	if (!callback)
-		return;
-
-	udev = udev_new();
-	assert(udev != NULL);
-	enumerate = udev_enumerate_new(udev);
-	udev_enumerate_add_match_subsystem(enumerate, "input");
-	udev_enumerate_scan_devices(enumerate);
-	dl = udev_enumerate_get_list_entry(enumerate);
-
-	udev_list_entry_foreach(dev_list_entry, dl)
-	{
-		const char *path = udev_list_entry_get_name(dev_list_entry);
-		struct udev_device *dev =
-			udev_device_new_from_syspath(udev, path);
-		const char *devnode = udev_device_get_devnode(dev);
-		char *ioctl_name;
-
-		if (devnode == NULL)
-			continue;
-
-		ioctl_name = sys_input_get_device_name(devnode);
-		if (ioctl_name == NULL)
-			continue;
-
-		if (callback(devnode, ioctl_name, arg)) {
-			free(ioctl_name);
-			break;
-		}
-		free(ioctl_name);
-	}
-	udev_enumerate_unref(enumerate);
-	udev_unref(udev);
-}
diff --git a/cras/src/server/cras_gpio_jack.h b/cras/src/server/cras_gpio_jack.h
deleted file mode 100644
index e6dd8aa..0000000
--- a/cras/src/server/cras_gpio_jack.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef _CRAS_GPIO_JACK_H
-#define _CRAS_GPIO_JACK_H
-
-#include "cras_types.h"
-
-struct mixer_name;
-
-int gpio_switch_open(const char *pathname);
-int gpio_switch_read(int fd, void *buf, size_t n_bytes);
-
-int gpio_switch_eviocgbit(int fd, void *buf, size_t n_bytes);
-int gpio_switch_eviocgsw(int fd, void *bits, size_t n_bytes);
-
-/* sys_input_get_device_name:
- *
- *   Returns the heap-allocated device name of a /dev/input/event*
- *   pathname.  Caller is responsible for releasing.
- */
-char *sys_input_get_device_name(const char *path);
-
-/* List for each callback function.
- *
- * Args:
- *    dev_path - Full path to the GPIO device.
- *    dev_name - The name of the GPIO device.
- *    arg - The argument passed to gpio_switch_list_for_each.
- *
- * Returns:
- *    0 to continue searching, non-zero otherwise.
- */
-typedef int (*gpio_switch_list_callback)(const char *dev_path,
-					 const char *dev_name, void *arg);
-
-/* Execute the given callback on each GPIO device.
- *
- * Args:
- *    callback - The callback to execute.
- *    arg - An argument to pass to the callback.
- */
-void gpio_switch_list_for_each(gpio_switch_list_callback callback, void *arg);
-
-#endif
diff --git a/cras/src/server/cras_hfp_ag_profile.c b/cras/src/server/cras_hfp_ag_profile.c
deleted file mode 100644
index b5fcecc..0000000
--- a/cras/src/server/cras_hfp_ag_profile.c
+++ /dev/null
@@ -1,466 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <stdint.h>
-#include <syslog.h>
-#include <sys/socket.h>
-#include <unistd.h>
-
-#include "cras_a2dp_endpoint.h"
-#include "cras_bt_adapter.h"
-#include "cras_bt_constants.h"
-#include "cras_bt_log.h"
-#include "cras_bt_profile.h"
-#include "cras_hfp_ag_profile.h"
-#include "cras_hfp_info.h"
-#include "cras_hfp_iodev.h"
-#include "cras_hfp_alsa_iodev.h"
-#include "cras_server_metrics.h"
-#include "cras_system_state.h"
-#include "cras_iodev_list.h"
-#include "utlist.h"
-#include "packet_status_logger.h"
-
-#define HFP_AG_PROFILE_NAME "Hands-Free Voice gateway"
-#define HFP_AG_PROFILE_PATH "/org/chromium/Cras/Bluetooth/HFPAG"
-#define HFP_VERSION 0x0107
-#define HSP_AG_PROFILE_NAME "Headset Voice gateway"
-#define HSP_AG_PROFILE_PATH "/org/chromium/Cras/Bluetooth/HSPAG"
-#define HSP_VERSION_1_2 0x0102
-#define HSP_VERSION_1_2_STR "0x0102"
-
-#define HSP_AG_RECORD                                                          \
-	"<?xml version=\"1.0\" encoding=\"UTF-8\" ?>"                          \
-	"<record>"                                                             \
-	"  <attribute id=\"0x0001\">"                                          \
-	"    <sequence>"                                                       \
-	"      <uuid value=\"" HSP_AG_UUID "\" />"                             \
-	"      <uuid value=\"" GENERIC_AUDIO_UUID "\" />"                      \
-	"    </sequence>"                                                      \
-	"  </attribute>"                                                       \
-	"  <attribute id=\"0x0004\">"                                          \
-	"    <sequence>"                                                       \
-	"      <sequence>"                                                     \
-	"        <uuid value=\"0x0100\" />"                                    \
-	"      </sequence>"                                                    \
-	"      <sequence>"                                                     \
-	"        <uuid value=\"0x0003\" />"                                    \
-	"        <uint8 value=\"0x0c\" />"                                     \
-	"      </sequence>"                                                    \
-	"    </sequence>"                                                      \
-	"  </attribute>"                                                       \
-	"  <attribute id=\"0x0005\">"                                          \
-	"    <sequence>"                                                       \
-	"      <uuid value=\"0x1002\" />"                                      \
-	"    </sequence>"                                                      \
-	"  </attribute>"                                                       \
-	"  <attribute id=\"0x0009\">"                                          \
-	"    <sequence>"                                                       \
-	"      <sequence>"                                                     \
-	"        <uuid value=\"" HSP_HS_UUID "\" />"                           \
-	"        <uint16 value=\"" HSP_VERSION_1_2_STR "\" />"                 \
-	"      </sequence>"                                                    \
-	"    </sequence>"                                                      \
-	"  </attribute>"                                                       \
-	"  <attribute id=\"0x0100\">"                                          \
-	"    <text value=\"" HSP_AG_PROFILE_NAME "\" />"                       \
-	"  </attribute>"                                                       \
-	"  <attribute id=\"0x0301\" >"                                         \
-	"    <uint8 value=\"0x01\" />"                                         \
-	"  </attribute>"                                                       \
-	"</record>"
-
-/* The supported features value in +BSRF command response of HFP AG in CRAS */
-#define BSRF_SUPPORTED_FEATURES (AG_ENHANCED_CALL_STATUS | AG_HF_INDICATORS)
-
-/* The "SupportedFeatures" attribute value of HFP AG service record in CRAS. */
-#define SDP_SUPPORTED_FEATURES FEATURES_AG_WIDE_BAND_SPEECH
-
-/* Object representing the audio gateway role for HFP/HSP.
- * Members:
- *    idev - The input iodev for HFP/HSP.
- *    odev - The output iodev for HFP/HSP.
- *    info - The hfp_info object for SCO audio.
- *    slc_handle - The service level connection.
- *    device - The bt device associated with this audio gateway.
- *    a2dp_delay_retries - The number of retries left to delay starting
- *        the hfp/hsp audio gateway to wait for a2dp connection.
- *    conn - The dbus connection used to send message to bluetoothd.
- *    profile - The profile enum of this audio gateway.
- */
-struct audio_gateway {
-	struct cras_iodev *idev;
-	struct cras_iodev *odev;
-	struct hfp_info *info;
-	struct hfp_slc_handle *slc_handle;
-	struct cras_bt_device *device;
-	int a2dp_delay_retries;
-	DBusConnection *conn;
-	enum cras_bt_device_profile profile;
-	struct audio_gateway *prev, *next;
-};
-
-static struct audio_gateway *connected_ags;
-static struct packet_status_logger wbs_logger;
-
-static int need_go_sco_pcm(struct cras_bt_device *device)
-{
-	return cras_iodev_list_get_sco_pcm_iodev(CRAS_STREAM_INPUT) ||
-	       cras_iodev_list_get_sco_pcm_iodev(CRAS_STREAM_OUTPUT);
-}
-
-static void destroy_audio_gateway(struct audio_gateway *ag)
-{
-	DL_DELETE(connected_ags, ag);
-
-	cras_server_metrics_hfp_battery_indicator(
-		hfp_slc_get_hf_supports_battery_indicator(ag->slc_handle));
-
-	if (need_go_sco_pcm(ag->device)) {
-		if (ag->idev)
-			hfp_alsa_iodev_destroy(ag->idev);
-		if (ag->odev)
-			hfp_alsa_iodev_destroy(ag->odev);
-	} else {
-		if (ag->idev)
-			hfp_iodev_destroy(ag->idev);
-		if (ag->odev)
-			hfp_iodev_destroy(ag->odev);
-	}
-
-	if (ag->info) {
-		if (hfp_info_running(ag->info))
-			hfp_info_stop(ag->info);
-		hfp_info_destroy(ag->info);
-	}
-	if (ag->slc_handle)
-		hfp_slc_destroy(ag->slc_handle);
-
-	free(ag);
-}
-
-/* Checks if there already a audio gateway connected for device. */
-static int has_audio_gateway(struct cras_bt_device *device)
-{
-	struct audio_gateway *ag;
-	DL_FOREACH (connected_ags, ag) {
-		if (ag->device == device)
-			return 1;
-	}
-	return 0;
-}
-
-static void cras_hfp_ag_release(struct cras_bt_profile *profile)
-{
-	struct audio_gateway *ag;
-
-	DL_FOREACH (connected_ags, ag)
-		destroy_audio_gateway(ag);
-}
-
-/* Callback triggered when SLC is initialized.  */
-static int cras_hfp_ag_slc_initialized(struct hfp_slc_handle *handle)
-{
-	struct audio_gateway *ag;
-
-	DL_SEARCH_SCALAR(connected_ags, ag, slc_handle, handle);
-	if (!ag)
-		return -EINVAL;
-
-	/* Log if the hands-free device supports WBS or not. Assuming the
-	 * codec negotiation feature means the WBS capability on headset.
-	 */
-	cras_server_metrics_hfp_wideband_support(
-		hfp_slc_get_hf_codec_negotiation_supported(handle));
-
-	/* Log the final selected codec given that codec negotiation is
-	 * supported.
-	 */
-	if (hfp_slc_get_hf_codec_negotiation_supported(handle) &&
-	    hfp_slc_get_ag_codec_negotiation_supported(handle))
-		cras_server_metrics_hfp_wideband_selected_codec(
-			hfp_slc_get_selected_codec(handle));
-
-	/* Defer the starting of audio gateway to bt_device. */
-	return cras_bt_device_audio_gateway_initialized(ag->device);
-}
-
-static int cras_hfp_ag_slc_disconnected(struct hfp_slc_handle *handle)
-{
-	struct audio_gateway *ag;
-
-	DL_SEARCH_SCALAR(connected_ags, ag, slc_handle, handle);
-	if (!ag)
-		return -EINVAL;
-
-	destroy_audio_gateway(ag);
-	cras_bt_device_notify_profile_dropped(
-		ag->device, CRAS_BT_DEVICE_PROFILE_HFP_HANDSFREE);
-	return 0;
-}
-
-static int check_for_conflict_ag(struct cras_bt_device *new_connected)
-{
-	struct audio_gateway *ag;
-
-	/* Check if there's already an A2DP/HFP device. */
-	DL_FOREACH (connected_ags, ag) {
-		if (cras_bt_device_has_a2dp(ag->device))
-			return -1;
-	}
-
-	/* Check if there's already an A2DP-only device. */
-	if (cras_a2dp_connected_device() &&
-	    cras_bt_device_supports_profile(new_connected,
-					    CRAS_BT_DEVICE_PROFILE_A2DP_SINK))
-		return -1;
-
-	return 0;
-}
-
-int cras_hfp_ag_remove_conflict(struct cras_bt_device *device)
-{
-	struct audio_gateway *ag;
-
-	DL_FOREACH (connected_ags, ag) {
-		if (ag->device == device)
-			continue;
-		cras_bt_device_notify_profile_dropped(
-			ag->device, CRAS_BT_DEVICE_PROFILE_HFP_HANDSFREE);
-		destroy_audio_gateway(ag);
-	}
-	return 0;
-}
-
-static int cras_hfp_ag_new_connection(DBusConnection *conn,
-				      struct cras_bt_profile *profile,
-				      struct cras_bt_device *device,
-				      int rfcomm_fd)
-{
-	struct cras_bt_adapter *adapter;
-	struct audio_gateway *ag;
-	int ag_features;
-
-	BTLOG(btlog, BT_HFP_NEW_CONNECTION, 0, 0);
-
-	if (has_audio_gateway(device)) {
-		syslog(LOG_ERR,
-		       "Audio gateway exists when %s connects for profile %s",
-		       cras_bt_device_name(device), profile->name);
-		close(rfcomm_fd);
-		return 0;
-	}
-
-	if (check_for_conflict_ag(device))
-		return -1;
-
-	ag = (struct audio_gateway *)calloc(1, sizeof(*ag));
-	ag->device = device;
-	ag->conn = conn;
-	ag->profile = cras_bt_device_profile_from_uuid(profile->uuid);
-
-	adapter = cras_bt_device_adapter(device);
-	/*
-	 * If the WBS enabled flag is set and adapter reports wbs capability
-	 * then add codec negotiation feature.
-	 * TODO(hychao): AND the two conditions to let bluetooth daemon
-	 * control whether to turn on WBS feature.
-	 */
-	ag_features = BSRF_SUPPORTED_FEATURES;
-	if (cras_system_get_bt_wbs_enabled() && adapter &&
-	    cras_bt_adapter_wbs_supported(adapter))
-		ag_features |= AG_CODEC_NEGOTIATION;
-
-	ag->slc_handle = hfp_slc_create(rfcomm_fd, 0, ag_features, device,
-					cras_hfp_ag_slc_initialized,
-					cras_hfp_ag_slc_disconnected);
-	DL_APPEND(connected_ags, ag);
-	return 0;
-}
-
-static void cras_hfp_ag_request_disconnection(struct cras_bt_profile *profile,
-					      struct cras_bt_device *device)
-{
-	struct audio_gateway *ag;
-
-	BTLOG(btlog, BT_HFP_REQUEST_DISCONNECT, 0, 0);
-
-	DL_FOREACH (connected_ags, ag) {
-		if (ag->slc_handle && ag->device == device) {
-			cras_bt_device_notify_profile_dropped(
-				ag->device,
-				CRAS_BT_DEVICE_PROFILE_HFP_HANDSFREE);
-			destroy_audio_gateway(ag);
-		}
-	}
-}
-
-static void cras_hfp_ag_cancel(struct cras_bt_profile *profile)
-{
-}
-
-static struct cras_bt_profile cras_hfp_ag_profile = {
-	.name = HFP_AG_PROFILE_NAME,
-	.object_path = HFP_AG_PROFILE_PATH,
-	.uuid = HFP_AG_UUID,
-	.version = HFP_VERSION,
-	.role = NULL,
-	.features = SDP_SUPPORTED_FEATURES,
-	.record = NULL,
-	.release = cras_hfp_ag_release,
-	.new_connection = cras_hfp_ag_new_connection,
-	.request_disconnection = cras_hfp_ag_request_disconnection,
-	.cancel = cras_hfp_ag_cancel
-};
-
-int cras_hfp_ag_profile_create(DBusConnection *conn)
-{
-	return cras_bt_add_profile(conn, &cras_hfp_ag_profile);
-}
-
-static int cras_hsp_ag_new_connection(DBusConnection *conn,
-				      struct cras_bt_profile *profile,
-				      struct cras_bt_device *device,
-				      int rfcomm_fd)
-{
-	struct audio_gateway *ag;
-
-	BTLOG(btlog, BT_HSP_NEW_CONNECTION, 0, 0);
-
-	if (has_audio_gateway(device)) {
-		syslog(LOG_ERR,
-		       "Audio gateway exists when %s connects for profile %s",
-		       cras_bt_device_name(device), profile->name);
-		close(rfcomm_fd);
-		return 0;
-	}
-
-	if (check_for_conflict_ag(device))
-		return -1;
-
-	ag = (struct audio_gateway *)calloc(1, sizeof(*ag));
-	ag->device = device;
-	ag->conn = conn;
-	ag->profile = cras_bt_device_profile_from_uuid(profile->uuid);
-	ag->slc_handle =
-		hfp_slc_create(rfcomm_fd, 1, BSRF_SUPPORTED_FEATURES, device,
-			       NULL, cras_hfp_ag_slc_disconnected);
-	DL_APPEND(connected_ags, ag);
-	cras_hfp_ag_slc_initialized(ag->slc_handle);
-	return 0;
-}
-
-static void cras_hsp_ag_request_disconnection(struct cras_bt_profile *profile,
-					      struct cras_bt_device *device)
-{
-	struct audio_gateway *ag;
-
-	BTLOG(btlog, BT_HSP_REQUEST_DISCONNECT, 0, 0);
-
-	DL_FOREACH (connected_ags, ag) {
-		if (ag->slc_handle && ag->device == device) {
-			cras_bt_device_notify_profile_dropped(
-				ag->device, CRAS_BT_DEVICE_PROFILE_HSP_HEADSET);
-			destroy_audio_gateway(ag);
-		}
-	}
-}
-
-static struct cras_bt_profile cras_hsp_ag_profile = {
-	.name = HSP_AG_PROFILE_NAME,
-	.object_path = HSP_AG_PROFILE_PATH,
-	.uuid = HSP_AG_UUID,
-	.version = HSP_VERSION_1_2,
-	.role = NULL,
-	.record = HSP_AG_RECORD,
-	.release = cras_hfp_ag_release,
-	.new_connection = cras_hsp_ag_new_connection,
-	.request_disconnection = cras_hsp_ag_request_disconnection,
-	.cancel = cras_hfp_ag_cancel
-};
-
-int cras_hfp_ag_start(struct cras_bt_device *device)
-{
-	struct audio_gateway *ag;
-
-	BTLOG(btlog, BT_AUDIO_GATEWAY_START, 0, 0);
-
-	DL_SEARCH_SCALAR(connected_ags, ag, device, device);
-	if (ag == NULL)
-		return -EEXIST;
-
-	/*
-	 * There is chance that bluetooth stack notifies us about remote
-	 * device's capability incrementally in multiple events. That could
-	 * cause hfp_ag_start be called more than once. Check if the input
-	 * HFP iodev is already created so we don't re-create HFP resources.
-	 */
-	if (ag->idev)
-		return 0;
-
-	if (need_go_sco_pcm(device)) {
-		struct cras_iodev *in_aio, *out_aio;
-
-		in_aio = cras_iodev_list_get_sco_pcm_iodev(CRAS_STREAM_INPUT);
-		out_aio = cras_iodev_list_get_sco_pcm_iodev(CRAS_STREAM_OUTPUT);
-
-		ag->idev = hfp_alsa_iodev_create(in_aio, ag->device,
-						 ag->slc_handle, ag->profile);
-		ag->odev = hfp_alsa_iodev_create(out_aio, ag->device,
-						 ag->slc_handle, ag->profile);
-	} else {
-		ag->info = hfp_info_create();
-		hfp_info_set_wbs_logger(ag->info, &wbs_logger);
-		ag->idev =
-			hfp_iodev_create(CRAS_STREAM_INPUT, ag->device,
-					 ag->slc_handle, ag->profile, ag->info);
-		ag->odev =
-			hfp_iodev_create(CRAS_STREAM_OUTPUT, ag->device,
-					 ag->slc_handle, ag->profile, ag->info);
-	}
-
-	if (!ag->idev && !ag->odev) {
-		destroy_audio_gateway(ag);
-		return -ENOMEM;
-	}
-
-	return 0;
-}
-
-void cras_hfp_ag_suspend_connected_device(struct cras_bt_device *device)
-{
-	struct audio_gateway *ag;
-
-	DL_SEARCH_SCALAR(connected_ags, ag, device, device);
-	if (ag)
-		destroy_audio_gateway(ag);
-}
-
-struct hfp_slc_handle *cras_hfp_ag_get_active_handle()
-{
-	/* Returns the first handle for HFP qualification. In future we
-	 * might want this to return the HFP device user is selected. */
-	return connected_ags ? connected_ags->slc_handle : NULL;
-}
-
-struct hfp_slc_handle *cras_hfp_ag_get_slc(struct cras_bt_device *device)
-{
-	struct audio_gateway *ag;
-	DL_FOREACH (connected_ags, ag) {
-		if (ag->device == device)
-			return ag->slc_handle;
-	}
-	return NULL;
-}
-
-struct packet_status_logger *cras_hfp_ag_get_wbs_logger()
-{
-	return &wbs_logger;
-}
-
-int cras_hsp_ag_profile_create(DBusConnection *conn)
-{
-	return cras_bt_add_profile(conn, &cras_hsp_ag_profile);
-}
diff --git a/cras/src/server/cras_hfp_ag_profile.h b/cras/src/server/cras_hfp_ag_profile.h
deleted file mode 100644
index 3de5618..0000000
--- a/cras/src/server/cras_hfp_ag_profile.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_HFP_AG_PROFILE_H_
-#define CRAS_HFP_AG_PROFILE_H_
-
-#include <dbus/dbus.h>
-#include <stdbool.h>
-
-#include "cras_bt_device.h"
-#include "cras_hfp_slc.h"
-
-/*
- * For service record profile, 'SupportedFearues' attribute bit mapping
- * for HFP AG. Bits 0 to 4 are identical to the unsolicited result code
- * of +BRSF command.
- */
-#define FEATURES_AG_THREE_WAY_CALLING 0x0001
-#define FEATURES_AG_EC_ANDOR_NR 0x0002
-#define FEATURES_AG_VOICE_RECOGNITION 0x0004
-#define FEATURES_AG_INBAND_RINGTONE 0x0008
-#define FEATURES_AG_ATTACH_NUMBER_TO_VOICETAG 0x0010
-#define FEATURES_AG_WIDE_BAND_SPEECH 0x0020
-
-struct hfp_slc_handle;
-
-/* Adds a profile instance for HFP AG (Hands-Free Profile Audio Gateway). */
-int cras_hfp_ag_profile_create(DBusConnection *conn);
-
-/* Adds a profile instance for HSP AG (Headset Profile Audio Gateway). */
-int cras_hsp_ag_profile_create(DBusConnection *conn);
-
-/* Starts the HFP audio gateway for audio input/output. */
-int cras_hfp_ag_start(struct cras_bt_device *device);
-
-/*
- * Suspends all connected audio gateways except the one associated to device.
- * Used to stop previously running HFP/HSP audio when a new device is connected.
- * Args:
- *    device - The device that we want to keep connection while others should
- *        be removed.
- */
-int cras_hfp_ag_remove_conflict(struct cras_bt_device *device);
-
-/* Suspends audio gateway associated with given bt device. */
-void cras_hfp_ag_suspend_connected_device(struct cras_bt_device *device);
-
-/* Gets the active SLC handle. Used for HFP qualification. */
-struct hfp_slc_handle *cras_hfp_ag_get_active_handle();
-
-/* Gets the SLC handle for given cras_bt_device. */
-struct hfp_slc_handle *cras_hfp_ag_get_slc(struct cras_bt_device *device);
-
-/* Gets the logger for WBS packet status. */
-struct packet_status_logger *cras_hfp_ag_get_wbs_logger();
-
-#endif /* CRAS_HFP_AG_PROFILE_H_ */
diff --git a/cras/src/server/cras_hfp_alsa_iodev.c b/cras/src/server/cras_hfp_alsa_iodev.c
deleted file mode 100644
index c1b60b3..0000000
--- a/cras/src/server/cras_hfp_alsa_iodev.c
+++ /dev/null
@@ -1,336 +0,0 @@
-/* Copyright 2019 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <sys/socket.h>
-#include <sys/time.h>
-#include <syslog.h>
-
-#include "cras_audio_area.h"
-#include "cras_hfp_slc.h"
-#include "cras_iodev.h"
-#include "cras_system_state.h"
-#include "cras_util.h"
-#include "utlist.h"
-#include "cras_bt_device.h"
-
-#include "cras_hfp_alsa_iodev.h"
-
-/* Object to represent a special HFP iodev which would be managed by bt_io but
- * playback/capture via an inner ALSA iodev.
- * Members:
- *    base - The base class cras_iodev.
- *    device - The corresponding remote BT device.
- *    slc - The service level connection.
- *    aio - The effective iodev for playback/capture.
- */
-struct hfp_alsa_io {
-	struct cras_iodev base;
-	struct cras_bt_device *device;
-	struct hfp_slc_handle *slc;
-	struct cras_iodev *aio;
-};
-
-static int hfp_alsa_get_valid_frames(struct cras_iodev *iodev,
-				     struct timespec *hw_tstamp)
-{
-	struct hfp_alsa_io *hfp_alsa_io = (struct hfp_alsa_io *)iodev;
-	struct cras_iodev *aio = hfp_alsa_io->aio;
-
-	return aio->get_valid_frames(aio, hw_tstamp);
-}
-
-static int hfp_alsa_open_dev(struct cras_iodev *iodev)
-{
-	struct hfp_alsa_io *hfp_alsa_io = (struct hfp_alsa_io *)iodev;
-	struct cras_iodev *aio = hfp_alsa_io->aio;
-
-	return aio->open_dev(aio);
-}
-
-static int hfp_alsa_update_supported_formats(struct cras_iodev *iodev)
-{
-	/* 16 bit, mono, 8kHz (narrow band speech); */
-	free(iodev->supported_rates);
-	iodev->supported_rates = malloc(2 * sizeof(*iodev->supported_rates));
-	if (!iodev->supported_rates)
-		return -ENOMEM;
-	iodev->supported_rates[0] = 8000;
-	iodev->supported_rates[1] = 0;
-
-	free(iodev->supported_channel_counts);
-	iodev->supported_channel_counts =
-		malloc(2 * sizeof(*iodev->supported_channel_counts));
-	if (!iodev->supported_channel_counts)
-		return -ENOMEM;
-	iodev->supported_channel_counts[0] = 1;
-	iodev->supported_channel_counts[1] = 0;
-
-	free(iodev->supported_formats);
-	iodev->supported_formats =
-		malloc(2 * sizeof(*iodev->supported_formats));
-	if (!iodev->supported_formats)
-		return -ENOMEM;
-	iodev->supported_formats[0] = SND_PCM_FORMAT_S16_LE;
-	iodev->supported_formats[1] = 0;
-
-	return 0;
-}
-
-static int hfp_alsa_configure_dev(struct cras_iodev *iodev)
-{
-	struct hfp_alsa_io *hfp_alsa_io = (struct hfp_alsa_io *)iodev;
-	struct cras_iodev *aio = hfp_alsa_io->aio;
-	int rc;
-
-	/* Fill back the format iodev is using. */
-	if (aio->format == NULL) {
-		aio->format = (struct cras_audio_format *)malloc(
-			sizeof(*aio->format));
-		if (!aio->format)
-			return -ENOMEM;
-		*aio->format = *iodev->format;
-	}
-
-	rc = aio->configure_dev(aio);
-	if (rc) {
-		syslog(LOG_ERR, "Failed to configure aio: %d\n", rc);
-		return rc;
-	}
-
-	rc = cras_bt_device_get_sco(
-		hfp_alsa_io->device,
-		hfp_slc_get_selected_codec(hfp_alsa_io->slc));
-	if (rc < 0) {
-		syslog(LOG_ERR, "Failed to get sco: %d\n", rc);
-		return rc;
-	}
-
-	hfp_set_call_status(hfp_alsa_io->slc, 1);
-	iodev->buffer_size = aio->buffer_size;
-
-	return 0;
-}
-
-static int hfp_alsa_close_dev(struct cras_iodev *iodev)
-{
-	struct hfp_alsa_io *hfp_alsa_io = (struct hfp_alsa_io *)iodev;
-	struct cras_iodev *aio = hfp_alsa_io->aio;
-
-	hfp_set_call_status(hfp_alsa_io->slc, 0);
-	cras_bt_device_put_sco(hfp_alsa_io->device);
-	cras_iodev_free_format(iodev);
-	return aio->close_dev(aio);
-}
-
-static int hfp_alsa_frames_queued(const struct cras_iodev *iodev,
-				  struct timespec *tstamp)
-{
-	struct hfp_alsa_io *hfp_alsa_io = (struct hfp_alsa_io *)iodev;
-	struct cras_iodev *aio = hfp_alsa_io->aio;
-
-	return aio->frames_queued(aio, tstamp);
-}
-
-static int hfp_alsa_delay_frames(const struct cras_iodev *iodev)
-{
-	struct hfp_alsa_io *hfp_alsa_io = (struct hfp_alsa_io *)iodev;
-	struct cras_iodev *aio = hfp_alsa_io->aio;
-
-	return aio->delay_frames(aio);
-}
-
-static int hfp_alsa_get_buffer(struct cras_iodev *iodev,
-			       struct cras_audio_area **area, unsigned *frames)
-{
-	struct hfp_alsa_io *hfp_alsa_io = (struct hfp_alsa_io *)iodev;
-	struct cras_iodev *aio = hfp_alsa_io->aio;
-
-	return aio->get_buffer(aio, area, frames);
-}
-
-static int hfp_alsa_put_buffer(struct cras_iodev *iodev, unsigned nwritten)
-{
-	struct hfp_alsa_io *hfp_alsa_io = (struct hfp_alsa_io *)iodev;
-	struct cras_iodev *aio = hfp_alsa_io->aio;
-
-	return aio->put_buffer(aio, nwritten);
-}
-
-static int hfp_alsa_flush_buffer(struct cras_iodev *iodev)
-{
-	struct hfp_alsa_io *hfp_alsa_io = (struct hfp_alsa_io *)iodev;
-	struct cras_iodev *aio = hfp_alsa_io->aio;
-
-	return aio->flush_buffer(aio);
-}
-
-static void hfp_alsa_update_active_node(struct cras_iodev *iodev,
-					unsigned node_idx, unsigned dev_enabled)
-{
-	struct hfp_alsa_io *hfp_alsa_io = (struct hfp_alsa_io *)iodev;
-	struct cras_iodev *aio = hfp_alsa_io->aio;
-
-	aio->update_active_node(aio, node_idx, dev_enabled);
-}
-
-static int hfp_alsa_start(const struct cras_iodev *iodev)
-{
-	struct hfp_alsa_io *hfp_alsa_io = (struct hfp_alsa_io *)iodev;
-	struct cras_iodev *aio = hfp_alsa_io->aio;
-
-	return aio->start(aio);
-}
-
-static void hfp_alsa_set_volume(struct cras_iodev *iodev)
-{
-	size_t volume;
-	struct hfp_alsa_io *hfp_alsa_io = (struct hfp_alsa_io *)iodev;
-
-	volume = cras_system_get_volume();
-	if (iodev->active_node)
-		volume = cras_iodev_adjust_node_volume(iodev->active_node,
-						       volume);
-
-	hfp_event_speaker_gain(hfp_alsa_io->slc, volume);
-}
-
-static int hfp_alsa_no_stream(struct cras_iodev *iodev, int enable)
-{
-	struct hfp_alsa_io *hfp_alsa_io = (struct hfp_alsa_io *)iodev;
-	struct cras_iodev *aio = hfp_alsa_io->aio;
-
-	/*
-	 * Copy iodev->min_cb_level and iodev->max_cb_level from the parent
-	 * (i.e. hfp_alsa_iodev).  no_stream() of alsa_io will use them.
-	 */
-	aio->min_cb_level = iodev->min_cb_level;
-	aio->max_cb_level = iodev->max_cb_level;
-	return aio->no_stream(aio, enable);
-}
-
-static int hfp_alsa_is_free_running(const struct cras_iodev *iodev)
-{
-	struct hfp_alsa_io *hfp_alsa_io = (struct hfp_alsa_io *)iodev;
-	struct cras_iodev *aio = hfp_alsa_io->aio;
-
-	return aio->is_free_running(aio);
-}
-
-static int hfp_alsa_output_underrun(struct cras_iodev *iodev)
-{
-	struct hfp_alsa_io *hfp_alsa_io = (struct hfp_alsa_io *)iodev;
-	struct cras_iodev *aio = hfp_alsa_io->aio;
-
-	/*
-	 * Copy iodev->min_cb_level and iodev->max_cb_level from the parent
-	 * (i.e. hfp_alsa_iodev).  output_underrun() of alsa_io will use them.
-	 */
-	aio->min_cb_level = iodev->min_cb_level;
-	aio->max_cb_level = iodev->max_cb_level;
-
-	return aio->output_underrun(aio);
-}
-
-struct cras_iodev *hfp_alsa_iodev_create(struct cras_iodev *aio,
-					 struct cras_bt_device *device,
-					 struct hfp_slc_handle *slc,
-					 enum cras_bt_device_profile profile)
-{
-	struct hfp_alsa_io *hfp_alsa_io;
-	struct cras_iodev *iodev;
-	struct cras_ionode *node;
-	const char *name;
-
-	hfp_alsa_io = calloc(1, sizeof(*hfp_alsa_io));
-	if (!hfp_alsa_io)
-		return NULL;
-
-	iodev = &hfp_alsa_io->base;
-	iodev->direction = aio->direction;
-
-	hfp_alsa_io->device = device;
-	hfp_alsa_io->slc = slc;
-	hfp_alsa_io->aio = aio;
-
-	/* Set iodev's name to device readable name or the address. */
-	name = cras_bt_device_name(device);
-	if (!name)
-		name = cras_bt_device_object_path(device);
-	snprintf(iodev->info.name, sizeof(iodev->info.name), "%s", name);
-	iodev->info.name[ARRAY_SIZE(iodev->info.name) - 1] = 0;
-	iodev->info.stable_id = cras_bt_device_get_stable_id(device);
-
-	iodev->open_dev = hfp_alsa_open_dev;
-	iodev->update_supported_formats = hfp_alsa_update_supported_formats;
-	iodev->configure_dev = hfp_alsa_configure_dev;
-	iodev->close_dev = hfp_alsa_close_dev;
-
-	iodev->frames_queued = hfp_alsa_frames_queued;
-	iodev->delay_frames = hfp_alsa_delay_frames;
-	iodev->get_buffer = hfp_alsa_get_buffer;
-	iodev->put_buffer = hfp_alsa_put_buffer;
-	iodev->flush_buffer = hfp_alsa_flush_buffer;
-
-	iodev->update_active_node = hfp_alsa_update_active_node;
-	iodev->start = hfp_alsa_start;
-	iodev->set_volume = hfp_alsa_set_volume;
-	iodev->get_valid_frames = hfp_alsa_get_valid_frames;
-	iodev->no_stream = hfp_alsa_no_stream;
-	iodev->is_free_running = hfp_alsa_is_free_running;
-	iodev->output_underrun = hfp_alsa_output_underrun;
-
-	iodev->min_buffer_level = aio->min_buffer_level;
-
-	node = calloc(1, sizeof(*node));
-	node->dev = iodev;
-	strcpy(node->name, iodev->info.name);
-
-	node->plugged = 1;
-	/* If headset mic uses legacy narrow band, i.e CVSD codec, report a
-	 * different node type so UI can set different plug priority. */
-	node->type = CRAS_NODE_TYPE_BLUETOOTH;
-	if ((hfp_slc_get_selected_codec(hfp_alsa_io->slc) ==
-	     HFP_CODEC_ID_CVSD) &&
-	    (iodev->direction == CRAS_STREAM_INPUT))
-		node->type = CRAS_NODE_TYPE_BLUETOOTH_NB_MIC;
-	node->volume = 100;
-	gettimeofday(&node->plugged_time, NULL);
-
-	/* Prepare active node before append, so bt_io can extract correct
-	 * info from hfp_alsa iodev and node. */
-	cras_iodev_add_node(iodev, node);
-	cras_iodev_set_active_node(iodev, node);
-	cras_bt_device_append_iodev(device, iodev, profile);
-
-	/* Record max supported channels into cras_iodev_info. */
-	iodev->info.max_supported_channels = 1;
-
-	/* Specifically disable EWMA calculation on this and the child iodev. */
-	ewma_power_disable(&iodev->ewma);
-	ewma_power_disable(&aio->ewma);
-
-	return iodev;
-}
-
-void hfp_alsa_iodev_destroy(struct cras_iodev *iodev)
-{
-	struct hfp_alsa_io *hfp_alsa_io = (struct hfp_alsa_io *)iodev;
-	struct cras_ionode *node;
-
-	cras_bt_device_rm_iodev(hfp_alsa_io->device, iodev);
-
-	node = iodev->active_node;
-	if (node) {
-		cras_iodev_rm_node(iodev, node);
-		free(node);
-	}
-
-	free(iodev->supported_channel_counts);
-	free(iodev->supported_rates);
-	free(iodev->supported_formats);
-	cras_iodev_free_resources(iodev);
-
-	free(hfp_alsa_io);
-}
diff --git a/cras/src/server/cras_hfp_alsa_iodev.h b/cras/src/server/cras_hfp_alsa_iodev.h
deleted file mode 100644
index e05af68..0000000
--- a/cras/src/server/cras_hfp_alsa_iodev.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/* Copyright 2019 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_HFP_ALSA_IODEV_H_
-#define CRAS_HFP_ALSA_IODEV_H_
-
-#include "cras_bt_device.h"
-#include "cras_hfp_info.h"
-#include "cras_types.h"
-
-struct hfp_slc_handle;
-
-/*
- * Creates a hfp alsa iodev.
- *
- * hfp_alsa_iodev is a special HFP iodev which would be managed by bt_io but
- * playback/capture via an inner ALSA iodev.
- *
- * The usage of hfp_alsa_iodev is only for SCO connection over PCM/I2S.
- */
-struct cras_iodev *hfp_alsa_iodev_create(struct cras_iodev *aio,
-					 struct cras_bt_device *device,
-					 struct hfp_slc_handle *slc,
-					 enum cras_bt_device_profile profile);
-
-void hfp_alsa_iodev_destroy(struct cras_iodev *iodev);
-
-#endif /* CRAS_HFP_ALSA_IODEV_H_ */
diff --git a/cras/src/server/cras_hfp_info.c b/cras/src/server/cras_hfp_info.c
deleted file mode 100644
index fc407b2..0000000
--- a/cras/src/server/cras_hfp_info.c
+++ /dev/null
@@ -1,868 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <stdint.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/socket.h>
-#include <syslog.h>
-
-#include "audio_thread.h"
-#include "bluetooth.h"
-#include "byte_buffer.h"
-#include "cras_hfp_info.h"
-#include "cras_hfp_slc.h"
-#include "cras_iodev_list.h"
-#include "cras_plc.h"
-#include "cras_sbc_codec.h"
-#include "cras_server_metrics.h"
-#include "utlist.h"
-#include "packet_status_logger.h"
-
-/* The max buffer size. Note that the actual used size must set to multiple
- * of SCO packet size, and the packet size does not necessarily be equal to
- * MTU. We should keep this as common multiple of possible packet sizes, for
- * example: 48, 60, 64, 128.
- */
-#define MAX_HFP_BUF_SIZE_BYTES 28800
-
-/* rate(8kHz) * sample_size(2 bytes) * channels(1) */
-#define HFP_BYTE_RATE 16000
-
-/* Per Bluetooth Core v5.0 and HFP 1.7 specification. */
-#define MSBC_H2_HEADER_LEN 2
-#define MSBC_FRAME_LEN 57
-#define MSBC_FRAME_SIZE 59
-#define MSBC_CODE_SIZE 240
-#define MSBC_SYNC_WORD 0xAD
-
-/* For one mSBC 1 compressed wideband audio channel the HCI packets will
- * be 3 octets of HCI header + 60 octets of data. */
-#define MSBC_PKT_SIZE 60
-
-#define H2_HEADER_0 0x01
-
-/* Supported HCI SCO packet sizes. The wideband speech mSBC frame parsing
- * code ties to limited packet size values. Specifically list them out
- * to check against when setting packet size.
- *
- * Temp buffer size should be set to least common multiple of HCI SCO packet
- * size and MSBC_PKT_SIZE for optimizing buffer copy.
- * To add a new supported packet size value, add corresponding entry to the
- * lists, test the read/write msbc code, and fix the code if needed.
- */
-static const size_t wbs_supported_packet_size[] = { 60, 24, 0 };
-static const size_t wbs_hci_sco_buffer_size[] = { 60, 120, 0 };
-
-/* Second octet of H2 header is composed by 4 bits fixed 0x8 and 4 bits
- * sequence number 0000, 0011, 1100, 1111. */
-static const uint8_t h2_header_frames_count[] = { 0x08, 0x38, 0xc8, 0xf8 };
-
-/* Structure to hold variables for a HFP connection. Since HFP supports
- * bi-direction audio, two iodevs should share one hfp_info if they
- * represent two directions of the same HFP headset
- * Members:
- *     fd - The file descriptor for SCO socket.
- *     started - If the hfp_info has started to read/write SCO data.
- *     mtu - The max transmit unit reported from BT adapter.
- *     packet_size - The size of SCO packet to read/write preferred by
- *         adapter, could be different than mtu.
- *     capture_buf - The buffer to hold samples read from SCO socket.
- *     playback_buf - The buffer to hold samples about to write to SCO socket.
- *     msbc_read - mSBC codec to decode input audio in wideband speech mode.
- *     msbc_write - mSBC codec to encode output audio in wideband speech mode.
- *     msbc_plc - PLC component to handle the packet loss of input audio in
- *         wideband speech mode.
- *     msbc_num_out_frames - Number of total written mSBC frames.
- *     msbc_num_in_frames - Number of total read mSBC frames.
- *     msbc_num_lost_frames - Number of total lost mSBC frames.
- *     read_cb - Callback to call when SCO socket can read. It returns the
- *         number of PCM bytes read.
- *     write_cb - Callback to call when SCO socket can write.
- *     write_buf - Temp buffer for writeing HCI SCO packet in wideband.
- *     read_buf - Temp buffer for reading HCI SCO packet in wideband.
- *     input_format_bytes - The audio format bytes for input device. 0 means
- *         there is no input device for the hfp_info.
- *     output_format_bytes - The audio format bytes for output device. 0 means
- *         there is no output device for the hfp_info.
- *     write_wp - Write pointer of write_buf.
- *     write_rp - Read pointer of write_buf.
- *     read_wp - Write pointer of read_buf.
- *     read_rp - Read pointer of read_buf.
- *     read_align_cb - Callback used to align mSBC frame reading with read buf.
- *     msbc_read_current_corrupted - Flag to mark if the current mSBC frame
- *         read is corrupted.
- *     wbs_logger - The logger for packet status in WBS.
- */
-struct hfp_info {
-	int fd;
-	int started;
-	unsigned int mtu;
-	unsigned int packet_size;
-	struct byte_buffer *capture_buf;
-	struct byte_buffer *playback_buf;
-	struct cras_audio_codec *msbc_read;
-	struct cras_audio_codec *msbc_write;
-	struct cras_msbc_plc *msbc_plc;
-	unsigned int msbc_num_out_frames;
-	unsigned int msbc_num_in_frames;
-	unsigned int msbc_num_lost_frames;
-	int (*read_cb)(struct hfp_info *info);
-	int (*write_cb)(struct hfp_info *info);
-	uint8_t *write_buf;
-	uint8_t *read_buf;
-	size_t input_format_bytes;
-	size_t output_format_bytes;
-	size_t write_wp;
-	size_t write_rp;
-	size_t read_wp;
-	size_t read_rp;
-	int (*read_align_cb)(uint8_t *buf);
-	bool msbc_read_current_corrupted;
-	struct packet_status_logger *wbs_logger;
-};
-
-int hfp_info_add_iodev(struct hfp_info *info,
-		       enum CRAS_STREAM_DIRECTION direction,
-		       struct cras_audio_format *format)
-{
-	if (direction == CRAS_STREAM_OUTPUT) {
-		if (info->output_format_bytes)
-			goto invalid;
-		info->output_format_bytes = cras_get_format_bytes(format);
-
-		buf_reset(info->playback_buf);
-	} else if (direction == CRAS_STREAM_INPUT) {
-		if (info->input_format_bytes)
-			goto invalid;
-		info->input_format_bytes = cras_get_format_bytes(format);
-
-		buf_reset(info->capture_buf);
-	}
-
-	return 0;
-
-invalid:
-	return -EINVAL;
-}
-
-int hfp_info_rm_iodev(struct hfp_info *info,
-		      enum CRAS_STREAM_DIRECTION direction)
-{
-	if (direction == CRAS_STREAM_OUTPUT && info->output_format_bytes) {
-		memset(info->playback_buf->bytes, 0,
-		       info->playback_buf->used_size);
-		info->output_format_bytes = 0;
-	} else if (direction == CRAS_STREAM_INPUT && info->input_format_bytes) {
-		info->input_format_bytes = 0;
-	} else {
-		return -EINVAL;
-	}
-
-	return 0;
-}
-
-int hfp_info_has_iodev(struct hfp_info *info)
-{
-	return info->output_format_bytes || info->input_format_bytes;
-}
-
-void hfp_buf_acquire(struct hfp_info *info,
-		     enum CRAS_STREAM_DIRECTION direction, uint8_t **buf,
-		     unsigned *count)
-{
-	size_t format_bytes;
-	unsigned int buf_avail;
-
-	if (direction == CRAS_STREAM_OUTPUT && info->output_format_bytes) {
-		*buf = buf_write_pointer_size(info->playback_buf, &buf_avail);
-		format_bytes = info->output_format_bytes;
-	} else if (direction == CRAS_STREAM_INPUT && info->input_format_bytes) {
-		*buf = buf_read_pointer_size(info->capture_buf, &buf_avail);
-		format_bytes = info->input_format_bytes;
-	} else {
-		*count = 0;
-		return;
-	}
-
-	if (*count * format_bytes > buf_avail)
-		*count = buf_avail / format_bytes;
-}
-
-int hfp_buf_size(struct hfp_info *info, enum CRAS_STREAM_DIRECTION direction)
-{
-	if (direction == CRAS_STREAM_OUTPUT && info->output_format_bytes)
-		return info->playback_buf->used_size /
-		       info->output_format_bytes;
-	else if (direction == CRAS_STREAM_INPUT && info->input_format_bytes)
-		return info->capture_buf->used_size / info->input_format_bytes;
-	return 0;
-}
-
-void hfp_buf_release(struct hfp_info *info,
-		     enum CRAS_STREAM_DIRECTION direction,
-		     unsigned written_frames)
-{
-	if (direction == CRAS_STREAM_OUTPUT && info->output_format_bytes)
-		buf_increment_write(info->playback_buf,
-				    written_frames * info->output_format_bytes);
-	else if (direction == CRAS_STREAM_INPUT && info->input_format_bytes)
-		buf_increment_read(info->capture_buf,
-				   written_frames * info->input_format_bytes);
-	else
-		written_frames = 0;
-}
-
-int hfp_buf_queued(struct hfp_info *info, enum CRAS_STREAM_DIRECTION direction)
-{
-	if (direction == CRAS_STREAM_OUTPUT && info->output_format_bytes)
-		return buf_queued(info->playback_buf) /
-		       info->output_format_bytes;
-	else if (direction == CRAS_STREAM_INPUT && info->input_format_bytes)
-		return buf_queued(info->capture_buf) / info->input_format_bytes;
-	else
-		return 0;
-}
-
-int hfp_fill_output_with_zeros(struct hfp_info *info, unsigned int nframes)
-{
-	unsigned int buf_avail;
-	unsigned int nbytes;
-	uint8_t *buf;
-	int i;
-	int ret = 0;
-
-	if (info->output_format_bytes) {
-		nbytes = nframes * info->output_format_bytes;
-		/* Loop twice to make sure ring buffer is filled. */
-		for (i = 0; i < 2; i++) {
-			buf = buf_write_pointer_size(info->playback_buf,
-						     &buf_avail);
-			if (buf_avail == 0)
-				break;
-			buf_avail = MIN(nbytes, buf_avail);
-			memset(buf, 0, buf_avail);
-			buf_increment_write(info->playback_buf, buf_avail);
-			nbytes -= buf_avail;
-			ret += buf_avail / info->output_format_bytes;
-		}
-	}
-	return ret;
-}
-
-void hfp_force_output_level(struct hfp_info *info, unsigned int level)
-{
-	if (info->output_format_bytes) {
-		level *= info->output_format_bytes;
-		level = MIN(level, MAX_HFP_BUF_SIZE_BYTES);
-		buf_adjust_readable(info->playback_buf, level);
-	}
-}
-
-int hfp_write_msbc(struct hfp_info *info)
-{
-	size_t encoded;
-	int err;
-	int pcm_encoded;
-	unsigned int pcm_avail, to_write;
-	uint8_t *samples;
-	uint8_t *wp;
-
-	if (info->write_rp + info->packet_size <= info->write_wp)
-		goto msbc_send_again;
-
-	/* Make sure there are MSBC_CODE_SIZE bytes to encode. */
-	samples = buf_read_pointer_size(info->playback_buf, &pcm_avail);
-	if (pcm_avail < MSBC_CODE_SIZE) {
-		to_write = MSBC_CODE_SIZE - pcm_avail;
-		/*
-		 * Size of playback_buf is multiple of MSBC_CODE_SIZE so we
-		 * are safe to prepare the buffer by appending some zero bytes.
-		 */
-		wp = buf_write_pointer_size(info->playback_buf, &pcm_avail);
-		memset(wp, 0, to_write);
-		buf_increment_write(info->playback_buf, to_write);
-
-		samples = buf_read_pointer_size(info->playback_buf, &pcm_avail);
-		if (pcm_avail < MSBC_CODE_SIZE)
-			return -EINVAL;
-	}
-
-	/* Encode the next MSBC_CODE_SIZE of bytes. */
-	wp = info->write_buf + info->write_wp;
-	wp[0] = H2_HEADER_0;
-	wp[1] = h2_header_frames_count[info->msbc_num_out_frames % 4];
-	pcm_encoded = info->msbc_write->encode(
-		info->msbc_write, samples, pcm_avail, wp + MSBC_H2_HEADER_LEN,
-		MSBC_PKT_SIZE - MSBC_H2_HEADER_LEN, &encoded);
-	if (pcm_encoded < 0) {
-		syslog(LOG_ERR, "msbc encoding err: %s", strerror(pcm_encoded));
-		return pcm_encoded;
-	}
-	buf_increment_read(info->playback_buf, pcm_encoded);
-	pcm_avail -= pcm_encoded;
-	info->write_wp += MSBC_PKT_SIZE;
-	info->msbc_num_out_frames++;
-
-	if (info->write_rp + info->packet_size > info->write_wp)
-		return 0;
-
-msbc_send_again:
-	err = send(info->fd, info->write_buf + info->write_rp,
-		   info->packet_size, 0);
-	if (err < 0) {
-		if (errno == EINTR)
-			goto msbc_send_again;
-		return err;
-	}
-	if (err != (int)info->packet_size) {
-		syslog(LOG_ERR, "Partially write %d bytes for mSBC", err);
-		return -1;
-	}
-	info->write_rp += info->packet_size;
-	if (info->write_rp == info->write_wp) {
-		info->write_rp = 0;
-		info->write_wp = 0;
-	}
-
-	return err;
-}
-
-int hfp_write(struct hfp_info *info)
-{
-	int err = 0;
-	unsigned to_send;
-	uint8_t *samples;
-
-	/* Write something */
-	samples = buf_read_pointer_size(info->playback_buf, &to_send);
-	if (to_send < info->packet_size)
-		return 0;
-	to_send = info->packet_size;
-
-send_sample:
-	err = send(info->fd, samples, to_send, 0);
-	if (err < 0) {
-		if (errno == EINTR)
-			goto send_sample;
-
-		return err;
-	}
-
-	if (err != (int)info->packet_size) {
-		syslog(LOG_ERR,
-		       "Partially write %d bytes for SCO packet size %u", err,
-		       info->packet_size);
-		return -1;
-	}
-
-	buf_increment_read(info->playback_buf, to_send);
-
-	return err;
-}
-
-static int h2_header_get_seq(const uint8_t *p)
-{
-	int i;
-	for (i = 0; i < 4; i++) {
-		if (*p == h2_header_frames_count[i])
-			return i;
-	}
-	return -1;
-}
-
-/*
- * Extract mSBC frame from SCO socket input bytes, given that the mSBC frame
- * could be lost or corrupted.
- * Args:
- *    input - Pointer to input bytes read from SCO socket.
- *    len - Length of input bytes.
- *    seq_out - To be filled by the sequence number of mSBC packet.
- * Returns:
- *    The starting position of mSBC frame if found.
- */
-static const uint8_t *extract_msbc_frame(const uint8_t *input, int len,
-					 unsigned int *seq_out)
-{
-	int rp = 0;
-	int seq = -1;
-	while (len - rp >= MSBC_FRAME_SIZE) {
-		if ((input[rp] != H2_HEADER_0) ||
-		    (input[rp + 2] != MSBC_SYNC_WORD)) {
-			rp++;
-			continue;
-		}
-		seq = h2_header_get_seq(input + rp + 1);
-		if (seq < 0) {
-			rp++;
-			continue;
-		}
-		// `seq` is guaranteed to be positive now.
-		*seq_out = (unsigned int)seq;
-		return input + rp;
-	}
-	return NULL;
-}
-
-/* Log value 0 when packet is received. */
-static void log_wbs_packet_received(struct hfp_info *info)
-{
-	if (info->wbs_logger)
-		packet_status_logger_update(info->wbs_logger, 0);
-}
-
-/* Log value 1 when packet is lost. */
-static void log_wbs_packet_lost(struct hfp_info *info)
-{
-	if (info->wbs_logger)
-		packet_status_logger_update(info->wbs_logger, 1);
-}
-
-/*
- * Handle the case when mSBC frame is considered lost.
- * Args:
- *    info - The hfp_info instance holding mSBC codec and PLC objects.
- */
-static int handle_packet_loss(struct hfp_info *info)
-{
-	int decoded;
-	unsigned int pcm_avail;
-	uint8_t *in_bytes;
-
-	/* It's possible client doesn't consume data causing overrun. In that
-	 * case we treat it as one mSBC frame read but dropped. */
-	info->msbc_num_in_frames++;
-	info->msbc_num_lost_frames++;
-
-	log_wbs_packet_lost(info);
-
-	in_bytes = buf_write_pointer_size(info->capture_buf, &pcm_avail);
-	if (pcm_avail < MSBC_CODE_SIZE)
-		return 0;
-
-	decoded = cras_msbc_plc_handle_bad_frames(info->msbc_plc,
-						  info->msbc_read, in_bytes);
-	if (decoded < 0)
-		return decoded;
-
-	buf_increment_write(info->capture_buf, decoded);
-
-	return decoded;
-}
-
-/* Checks if mSBC frame header aligns with the beginning of buffer. */
-static int msbc_frame_align(uint8_t *buf)
-{
-	if ((buf[0] != H2_HEADER_0) || (buf[2] != MSBC_SYNC_WORD)) {
-		syslog(LOG_DEBUG, "Waiting for valid mSBC frame head");
-		return 0;
-	}
-	return 1;
-}
-
-int hfp_read_msbc(struct hfp_info *info)
-{
-	int err = 0;
-	unsigned int pcm_avail = 0;
-	int decoded;
-	size_t pcm_decoded = 0;
-	size_t pcm_read = 0;
-	uint8_t *capture_buf;
-	const uint8_t *frame_head = NULL;
-	unsigned int seq;
-
-	struct msghdr msg = { 0 };
-	struct iovec iov;
-	struct cmsghdr *cmsg;
-	const unsigned int control_size = CMSG_SPACE(sizeof(int));
-	char control[control_size];
-	uint8_t pkt_status;
-
-	memset(control, 0, sizeof(control));
-recv_msbc_bytes:
-	msg.msg_iov = &iov;
-	msg.msg_iovlen = 1;
-	iov.iov_base = info->read_buf + info->read_wp;
-	iov.iov_len = info->packet_size;
-	msg.msg_control = control;
-	msg.msg_controllen = control_size;
-
-	err = recvmsg(info->fd, &msg, 0);
-	if (err < 0) {
-		syslog(LOG_ERR, "HCI SCO packet read err %s", strerror(errno));
-		if (errno == EINTR)
-			goto recv_msbc_bytes;
-		return err;
-	}
-	/*
-	 * Treat return code 0 (socket shutdown) as error here. BT stack
-	 * shall send signal to main thread for device disconnection.
-	 */
-	if (err != (int)info->packet_size) {
-		syslog(LOG_ERR, "Partially read %d bytes for mSBC packet", err);
-		return -1;
-	}
-
-	/* Offset in input data breaks mSBC frame parsing. Discard this packet
-	 * until read alignment succeed. */
-	if (info->read_align_cb) {
-		if (!info->read_align_cb(info->read_buf))
-			return 0;
-		else
-			info->read_align_cb = NULL;
-	}
-	info->read_wp += err;
-
-	pkt_status = 0;
-	for (cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL;
-	     cmsg = CMSG_NXTHDR(&msg, cmsg)) {
-		if (cmsg->cmsg_level == SOL_BLUETOOTH &&
-		    cmsg->cmsg_type == BT_SCM_PKT_STATUS) {
-			size_t len = cmsg->cmsg_len - sizeof(*cmsg);
-			memcpy(&pkt_status, CMSG_DATA(cmsg), len);
-		}
-	}
-
-	/*
-	 * HCI SCO packet status flag:
-	 * 0x00 - correctly received data.
-	 * 0x01 - possibly invalid data.
-	 * 0x10 - No data received.
-	 * 0x11 - Data partially lost.
-	 *
-	 * If the latest SCO packet read doesn't cross the boundary of a mSBC
-	 * frame, the packet status flag can be used to derive if the current
-	 * mSBC frame is corrupted.
-	 */
-	if (info->read_rp + MSBC_PKT_SIZE >= info->read_wp)
-		info->msbc_read_current_corrupted |= (pkt_status > 0);
-
-	/* Read buffer not enough to parse another mSBC frame. */
-	if (info->read_rp + MSBC_PKT_SIZE > info->read_wp)
-		return 0;
-
-	if (info->msbc_read_current_corrupted) {
-		syslog(LOG_DEBUG, "mSBC frame corrputed from packet status");
-		info->msbc_read_current_corrupted = 0;
-		frame_head = NULL;
-	} else {
-		frame_head =
-			extract_msbc_frame(info->read_buf + info->read_rp,
-					   info->read_wp - info->read_rp, &seq);
-		if (!frame_head)
-			syslog(LOG_DEBUG, "Failed to extract msbc frame");
-	}
-
-	/*
-	 * Done with parsing the raw bytes just read. If mSBC frame head not
-	 * found, we shall handle it as packet loss.
-	 */
-	info->read_rp += MSBC_PKT_SIZE;
-	if (info->read_rp == info->read_wp) {
-		info->read_rp = 0;
-		info->read_wp = 0;
-	}
-	if (!frame_head)
-		return handle_packet_loss(info);
-
-	/*
-	 * Consider packet loss when found discontinuity in sequence number.
-	 */
-	while (seq != (info->msbc_num_in_frames % 4)) {
-		syslog(LOG_DEBUG, "SCO packet seq unmatch");
-		err = handle_packet_loss(info);
-		if (err < 0)
-			return err;
-		pcm_read += err;
-	}
-
-	/* Check if there's room for more PCM. */
-	capture_buf = buf_write_pointer_size(info->capture_buf, &pcm_avail);
-	if (pcm_avail < MSBC_CODE_SIZE)
-		return pcm_read;
-
-	decoded = info->msbc_read->decode(info->msbc_read,
-					  frame_head + MSBC_H2_HEADER_LEN,
-					  MSBC_FRAME_LEN, capture_buf,
-					  pcm_avail, &pcm_decoded);
-	if (decoded < 0) {
-		/*
-		 * If mSBC frame cannot be decoded, consider this packet is
-		 * corrupted and lost.
-		 */
-		syslog(LOG_ERR, "mSBC decode failed");
-		err = handle_packet_loss(info);
-		if (err < 0)
-			return err;
-		pcm_read += err;
-	} else {
-		/* Good mSBC frame decoded. */
-		log_wbs_packet_received(info);
-		buf_increment_write(info->capture_buf, pcm_decoded);
-		info->msbc_num_in_frames++;
-		cras_msbc_plc_handle_good_frames(info->msbc_plc, capture_buf,
-						 capture_buf);
-		pcm_read += pcm_decoded;
-	}
-	return pcm_read;
-}
-
-int hfp_read(struct hfp_info *info)
-{
-	int err = 0;
-	unsigned to_read;
-	uint8_t *capture_buf;
-
-	capture_buf = buf_write_pointer_size(info->capture_buf, &to_read);
-
-	if (to_read < info->packet_size)
-		return 0;
-	to_read = info->packet_size;
-
-recv_sample:
-	err = recv(info->fd, capture_buf, to_read, 0);
-	if (err < 0) {
-		syslog(LOG_ERR, "Read error %s", strerror(errno));
-		if (errno == EINTR)
-			goto recv_sample;
-
-		return err;
-	}
-
-	if (err != (int)info->packet_size) {
-		/* Allow the SCO packet size be modified from the default MTU
-		 * value to the size of SCO data we first read. This is for
-		 * some adapters who prefers a different value than MTU for
-		 * transmitting SCO packet.
-		 */
-		if (err && (info->packet_size == info->mtu)) {
-			info->packet_size = err;
-		} else {
-			syslog(LOG_ERR,
-			       "Partially read %d bytes for %u size SCO packet",
-			       err, info->packet_size);
-			return -1;
-		}
-	}
-
-	buf_increment_write(info->capture_buf, err);
-
-	return err;
-}
-
-/* Callback function to handle sample read and write.
- * Note that we poll the SCO socket for read sample, since it reflects
- * there is actual some sample to read while the socket always reports
- * writable even when device buffer is full.
- * The strategy is to synchronize read & write operations:
- * 1. Read one chunk of MTU bytes of data.
- * 2. When input device not attached, ignore the data just read.
- * 3. When output device attached, write one chunk of MTU bytes of data.
- */
-static int hfp_info_callback(void *arg, int revents)
-{
-	struct hfp_info *info = (struct hfp_info *)arg;
-	int err = 0;
-
-	if (!info->started)
-		return 0;
-
-	/* Allow last read before handling error or hang-up events. */
-	if (revents & POLLIN) {
-		err = info->read_cb(info);
-		if (err < 0) {
-			syslog(LOG_ERR, "Read error");
-			goto read_write_error;
-		}
-	}
-	/* Ignore the bytes just read if input dev not in present */
-	if (!info->input_format_bytes)
-		buf_increment_read(info->capture_buf, err);
-
-	if (revents & (POLLERR | POLLHUP)) {
-		syslog(LOG_ERR, "Error polling SCO socket, revent %d", revents);
-		goto read_write_error;
-	}
-
-	/* Without output stream's presence, we shall still send zero packets
-	 * to HF. This is required for some HF devices to start sending non-zero
-	 * data to AG.
-	 */
-	if (!info->output_format_bytes)
-		buf_increment_write(info->playback_buf,
-				    info->msbc_write ? err : info->packet_size);
-
-	err = info->write_cb(info);
-	if (err < 0) {
-		syslog(LOG_ERR, "Write error");
-		goto read_write_error;
-	}
-
-	return 0;
-
-read_write_error:
-	/*
-	 * This callback is executing in audio thread, so it's safe to
-	 * unregister itself by audio_thread_rm_callback().
-	 */
-	audio_thread_rm_callback(info->fd);
-	close(info->fd);
-	info->fd = 0;
-	info->started = 0;
-
-	return 0;
-}
-
-struct hfp_info *hfp_info_create()
-{
-	struct hfp_info *info;
-	info = (struct hfp_info *)calloc(1, sizeof(*info));
-	if (!info)
-		goto error;
-
-	info->capture_buf = byte_buffer_create(MAX_HFP_BUF_SIZE_BYTES);
-	if (!info->capture_buf)
-		goto error;
-
-	info->playback_buf = byte_buffer_create(MAX_HFP_BUF_SIZE_BYTES);
-	if (!info->playback_buf)
-		goto error;
-
-	return info;
-
-error:
-	if (info) {
-		if (info->capture_buf)
-			byte_buffer_destroy(&info->capture_buf);
-		if (info->playback_buf)
-			byte_buffer_destroy(&info->playback_buf);
-		free(info);
-	}
-	return NULL;
-}
-
-void hfp_info_set_wbs_logger(struct hfp_info *info,
-			     struct packet_status_logger *wbs_logger)
-{
-	info->wbs_logger = wbs_logger;
-}
-
-int hfp_info_running(struct hfp_info *info)
-{
-	return info->started;
-}
-
-int hfp_info_start(int fd, unsigned int mtu, int codec, struct hfp_info *info)
-{
-	info->fd = fd;
-	info->mtu = mtu;
-
-	/* Initialize to MTU, it may change when actually read the socket. */
-	info->packet_size = mtu;
-	buf_reset(info->playback_buf);
-	buf_reset(info->capture_buf);
-
-	if (codec == HFP_CODEC_ID_MSBC) {
-		int i;
-		for (i = 0; wbs_supported_packet_size[i] != 0; i++) {
-			if (info->packet_size == wbs_supported_packet_size[i])
-				break;
-		}
-		/* In case of unsupported value, error log and fallback to
-		 * MSBC_PKT_SIZE(60). */
-		if (wbs_supported_packet_size[i] == 0) {
-			syslog(LOG_ERR, "Unsupported packet size %u",
-			       info->packet_size);
-			i = 0;
-		}
-		info->packet_size = wbs_supported_packet_size[i];
-		info->write_buf = (uint8_t *)malloc(wbs_hci_sco_buffer_size[i]);
-		info->read_buf = (uint8_t *)malloc(wbs_hci_sco_buffer_size[i]);
-
-		info->write_cb = hfp_write_msbc;
-		info->read_cb = hfp_read_msbc;
-		info->msbc_read = cras_msbc_codec_create();
-		info->msbc_write = cras_msbc_codec_create();
-		info->msbc_plc = cras_msbc_plc_create();
-
-		packet_status_logger_init(info->wbs_logger);
-	} else {
-		info->write_cb = hfp_write;
-		info->read_cb = hfp_read;
-	}
-
-	audio_thread_add_events_callback(info->fd, hfp_info_callback, info,
-					 POLLIN | POLLERR | POLLHUP);
-
-	info->started = 1;
-	info->msbc_num_out_frames = 0;
-	info->msbc_num_in_frames = 0;
-	info->msbc_num_lost_frames = 0;
-	info->write_rp = 0;
-	info->write_wp = 0;
-	info->read_rp = 0;
-	info->read_wp = 0;
-
-	/* Mark as aligned if packet size equals to MSBC_PKT_SIZE. */
-	info->read_align_cb =
-		(info->packet_size == MSBC_PKT_SIZE) ? NULL : msbc_frame_align;
-	info->msbc_read_current_corrupted = 0;
-
-	return 0;
-}
-
-int hfp_info_stop(struct hfp_info *info)
-{
-	if (!info->started)
-		return 0;
-
-	audio_thread_rm_callback_sync(cras_iodev_list_get_audio_thread(),
-				      info->fd);
-
-	close(info->fd);
-	info->fd = 0;
-	info->started = 0;
-
-	/* Unset the write/read callbacks. */
-	info->write_cb = NULL;
-	info->read_cb = NULL;
-
-	if (info->write_buf)
-		free(info->write_buf);
-	if (info->read_buf)
-		free(info->read_buf);
-
-	if (info->msbc_read) {
-		cras_sbc_codec_destroy(info->msbc_read);
-		info->msbc_read = NULL;
-	}
-	if (info->msbc_write) {
-		cras_sbc_codec_destroy(info->msbc_write);
-		info->msbc_write = NULL;
-	}
-	if (info->msbc_plc) {
-		cras_msbc_plc_destroy(info->msbc_plc);
-		info->msbc_plc = NULL;
-	}
-
-	if (info->msbc_num_in_frames) {
-		cras_server_metrics_hfp_packet_loss(
-			(float)info->msbc_num_lost_frames /
-			info->msbc_num_in_frames);
-	}
-
-	return 0;
-}
-
-void hfp_info_destroy(struct hfp_info *info)
-{
-	if (info->capture_buf)
-		byte_buffer_destroy(&info->capture_buf);
-
-	if (info->playback_buf)
-		byte_buffer_destroy(&info->playback_buf);
-
-	free(info);
-}
diff --git a/cras/src/server/cras_hfp_info.h b/cras/src/server/cras_hfp_info.h
deleted file mode 100644
index 3472aea..0000000
--- a/cras/src/server/cras_hfp_info.h
+++ /dev/null
@@ -1,127 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_HFP_INFO_H_
-#define CRAS_HFP_INFO_H_
-
-#include "cras_audio_format.h"
-#include "cras_types.h"
-
-/* Linked list to hold the information of callbacks to trigger
- * when the size of SCO packet has changed.
- */
-struct hfp_packet_size_changed_callback {
-	void *data;
-	void (*cb)(void *data);
-	struct hfp_packet_size_changed_callback *next, *prev;
-};
-
-/* Structure to handle sample transmission between CRAS and the SCO
- * socket acquired from bluez.
- */
-struct hfp_info;
-
-/* Creates an hfp_info instance.
- */
-struct hfp_info *hfp_info_create();
-
-/* Destroys given hfp_info instance. */
-void hfp_info_destroy(struct hfp_info *info);
-
-/* Sets the wbs_logger to hfp_info instance. */
-void hfp_info_set_wbs_logger(struct hfp_info *info,
-			     struct packet_status_logger *wbs_logger);
-
-/* Checks if given hfp_info is running. */
-int hfp_info_running(struct hfp_info *info);
-
-/* Starts the hfp_info to transmit and reveice samples to and from the file
- * descriptor of a SCO socket. This should be called from main thread.
- * Args:
- *    codec - 1 for CVSD, 2 for mSBC per HFP 1.7 specification.
- */
-int hfp_info_start(int fd, unsigned int mtu, int codec, struct hfp_info *info);
-
-/* Stops given hfp_info. This implies sample transmission will
- * stop and socket be closed. This should be called from main thread.
- */
-int hfp_info_stop(struct hfp_info *info);
-
-/* Queries how many frames of data are queued.
- * Args:
- *    info - The hfp_info holding the buffer to query.
- *    direction - The direction to indicate which buffer to query, playback
- *          or capture.
- */
-int hfp_buf_queued(struct hfp_info *info, enum CRAS_STREAM_DIRECTION direction);
-
-/* Fill output buffer with zero frames.
- * Args:
- *    info - The hfp_info holding the output buffer.
- *    nframes - How many zero frames to fill.
- * Returns:
- *    The actual number of zero frames filled.
- */
-int hfp_fill_output_with_zeros(struct hfp_info *info, unsigned int nframes);
-
-/* Force output buffer level to given value. Calling this may override
- * existing data so use it only when buffer has been filled by zeros.
- * If no output device was added, calling this has no effect.
- * Args:
- *    info - The hfp_info holding output buffer.
- *    level - Value of the target output level.
- */
-void hfp_force_output_level(struct hfp_info *info, unsigned int level);
-
-/* Gets how many frames of the buffer are used.
- * Args:
- *    info - The hfp_info holding buffer.
- *    direction - The direction of the buffer.
- */
-int hfp_buf_size(struct hfp_info *info, enum CRAS_STREAM_DIRECTION direction);
-
-/* Acquire buffer of count frames for dev to write(or read,
- * depend on dev's direction).
- * Args:
- *    info - The hfp_info holding buffer.
- *    direction - The direction of dev to acquire buffer for.
- *    buf - To hold the returned pointer of acquired buffer.
- *    count - Number of bytes of buffer to acquire, will be filled with the
- *    actual acquired buffer size in bytes.
- */
-void hfp_buf_acquire(struct hfp_info *info,
-		     enum CRAS_STREAM_DIRECTION direction, uint8_t **buf,
-		     unsigned *count);
-
-/* Releases the previously acquired buffer.
- * Args:
- *    info - The hfp_info holding the buffer.
- *    direction - The direction of dev to release buffer for.
- *    written_frames - The size of the previously acquired buffer in frames
- *    which's been used.
- */
-void hfp_buf_release(struct hfp_info *info,
-		     enum CRAS_STREAM_DIRECTION direction,
-		     unsigned written_frames);
-
-/* Adds cras_iodev to given hfp_info.  Only when an output iodev is added,
- * hfp_info starts sending samples to the SCO socket. Similarly, only when an
- * input iodev is added, it starts to read samples from SCO socket.
- */
-int hfp_info_add_iodev(struct hfp_info *info,
-		       enum CRAS_STREAM_DIRECTION direction,
-		       struct cras_audio_format *format);
-
-/* Removes cras_iodev from hfp_info.  hfp_info will stop sending or
- * reading samples right after the iodev is removed. This function is used for
- * iodev closure.
- */
-int hfp_info_rm_iodev(struct hfp_info *info,
-		      enum CRAS_STREAM_DIRECTION direction);
-
-/* Checks if there's any iodev added to the given hfp_info. */
-int hfp_info_has_iodev(struct hfp_info *info);
-
-#endif /* CRAS_HFP_INFO_H_ */
diff --git a/cras/src/server/cras_hfp_iodev.c b/cras/src/server/cras_hfp_iodev.c
deleted file mode 100644
index 6a4ced0..0000000
--- a/cras/src/server/cras_hfp_iodev.c
+++ /dev/null
@@ -1,371 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <stdbool.h>
-#include <sys/param.h>
-#include <sys/socket.h>
-#include <sys/time.h>
-#include <syslog.h>
-
-#include "cras_audio_area.h"
-#include "cras_hfp_ag_profile.h"
-#include "cras_hfp_iodev.h"
-#include "cras_hfp_info.h"
-#include "cras_hfp_slc.h"
-#include "cras_iodev.h"
-#include "cras_system_state.h"
-#include "cras_util.h"
-#include "utlist.h"
-
-/* Implementation of bluetooth hands-free profile iodev.
- * Members:
- *    base - The cras_iodev structure base class.
- *    device - The assciated bt_device.
- *    slc - Handle to the HFP service level connection.
- *    info - hfp_info taking care of SCO data read/write.
- *    drain_complete - Flag to indicate if valid samples are drained
- *        in no stream state. Only used for output.
- *    filled_zeros - Number of zero data in frames have been filled
- *        to buffer of hfp_info in no stream state. Only used for output
- */
-struct hfp_io {
-	struct cras_iodev base;
-	struct cras_bt_device *device;
-	struct hfp_slc_handle *slc;
-	struct hfp_info *info;
-	bool drain_complete;
-	unsigned int filled_zeros;
-};
-
-static int update_supported_formats(struct cras_iodev *iodev)
-{
-	struct hfp_io *hfpio = (struct hfp_io *)iodev;
-
-	free(iodev->supported_rates);
-	iodev->supported_rates = (size_t *)malloc(2 * sizeof(size_t));
-
-	/* 16 bit, mono, 8kHz for narrowband and 16KHz for wideband */
-	iodev->supported_rates[0] =
-		(hfp_slc_get_selected_codec(hfpio->slc) == HFP_CODEC_ID_MSBC) ?
-			16000 :
-			8000;
-	iodev->supported_rates[1] = 0;
-
-	free(iodev->supported_channel_counts);
-	iodev->supported_channel_counts = (size_t *)malloc(2 * sizeof(size_t));
-	iodev->supported_channel_counts[0] = 1;
-	iodev->supported_channel_counts[1] = 0;
-
-	free(iodev->supported_formats);
-	iodev->supported_formats =
-		(snd_pcm_format_t *)malloc(2 * sizeof(snd_pcm_format_t));
-	iodev->supported_formats[0] = SND_PCM_FORMAT_S16_LE;
-	iodev->supported_formats[1] = 0;
-
-	return 0;
-}
-
-static int no_stream(struct cras_iodev *iodev, int enable)
-{
-	struct hfp_io *hfpio = (struct hfp_io *)iodev;
-	struct timespec hw_tstamp;
-	unsigned int hw_level;
-	unsigned int level_target;
-
-	if (iodev->direction != CRAS_STREAM_OUTPUT)
-		return 0;
-
-	hw_level = iodev->frames_queued(iodev, &hw_tstamp);
-	if (enable) {
-		if (!hfpio->drain_complete && (hw_level <= hfpio->filled_zeros))
-			hfpio->drain_complete = 1;
-		hfpio->filled_zeros += hfp_fill_output_with_zeros(
-			hfpio->info, iodev->buffer_size);
-		return 0;
-	}
-
-	/* Leave no stream state.*/
-	level_target = iodev->min_cb_level;
-	if (hfpio->drain_complete) {
-		hfp_force_output_level(hfpio->info, level_target);
-	} else {
-		unsigned int valid_samples = 0;
-		if (hw_level > hfpio->filled_zeros)
-			valid_samples = hw_level - hfpio->filled_zeros;
-		level_target = MAX(level_target, valid_samples);
-
-		if (level_target > hw_level)
-			hfp_fill_output_with_zeros(hfpio->info,
-						   level_target - hw_level);
-		else
-			hfp_force_output_level(hfpio->info, level_target);
-	}
-	hfpio->drain_complete = 0;
-	hfpio->filled_zeros = 0;
-
-	return 0;
-}
-
-static int frames_queued(const struct cras_iodev *iodev,
-			 struct timespec *tstamp)
-{
-	struct hfp_io *hfpio = (struct hfp_io *)iodev;
-
-	if (!hfp_info_running(hfpio->info))
-		return -1;
-
-	/* Do not enable timestamp mechanism on HFP device because last time
-	 * stamp might be a long time ago and it is not really useful. */
-	clock_gettime(CLOCK_MONOTONIC_RAW, tstamp);
-	return hfp_buf_queued(hfpio->info, iodev->direction);
-}
-
-static int output_underrun(struct cras_iodev *iodev)
-{
-	/* Handle it the same way as cras_iodev_output_underrun(). */
-	return cras_iodev_fill_odev_zeros(iodev, iodev->min_cb_level);
-}
-
-static int configure_dev(struct cras_iodev *iodev)
-{
-	struct hfp_io *hfpio = (struct hfp_io *)iodev;
-	int sk, err, mtu;
-
-	/* Assert format is set before opening device. */
-	if (iodev->format == NULL)
-		return -EINVAL;
-
-	iodev->format->format = SND_PCM_FORMAT_S16_LE;
-	cras_iodev_init_audio_area(iodev, iodev->format->num_channels);
-
-	if (hfp_info_running(hfpio->info))
-		goto add_dev;
-
-	/*
-	 * Might require a codec negotiation before building the sco connection.
-	 */
-	hfp_slc_codec_connection_setup(hfpio->slc);
-
-	sk = cras_bt_device_sco_connect(hfpio->device,
-					hfp_slc_get_selected_codec(hfpio->slc));
-	if (sk < 0)
-		goto error;
-
-	mtu = cras_bt_device_sco_packet_size(
-		hfpio->device, sk, hfp_slc_get_selected_codec(hfpio->slc));
-
-	/* Start hfp_info */
-	err = hfp_info_start(sk, mtu, hfp_slc_get_selected_codec(hfpio->slc),
-			     hfpio->info);
-	if (err)
-		goto error;
-
-	hfpio->drain_complete = 0;
-	hfpio->filled_zeros = 0;
-add_dev:
-	hfp_info_add_iodev(hfpio->info, iodev->direction, iodev->format);
-	hfp_set_call_status(hfpio->slc, 1);
-
-	iodev->buffer_size = hfp_buf_size(hfpio->info, iodev->direction);
-
-	return 0;
-error:
-	syslog(LOG_ERR, "Failed to open HFP iodev");
-	return -1;
-}
-
-static int close_dev(struct cras_iodev *iodev)
-{
-	struct hfp_io *hfpio = (struct hfp_io *)iodev;
-
-	hfp_info_rm_iodev(hfpio->info, iodev->direction);
-	if (hfp_info_running(hfpio->info) && !hfp_info_has_iodev(hfpio->info)) {
-		hfp_info_stop(hfpio->info);
-		hfp_set_call_status(hfpio->slc, 0);
-	}
-
-	cras_iodev_free_format(iodev);
-	cras_iodev_free_audio_area(iodev);
-	return 0;
-}
-
-static void set_hfp_volume(struct cras_iodev *iodev)
-{
-	size_t volume;
-	struct hfp_io *hfpio = (struct hfp_io *)iodev;
-
-	volume = cras_system_get_volume();
-	if (iodev->active_node)
-		volume = cras_iodev_adjust_node_volume(iodev->active_node,
-						       volume);
-
-	hfp_event_speaker_gain(hfpio->slc, volume);
-}
-
-static int delay_frames(const struct cras_iodev *iodev)
-{
-	struct timespec tstamp;
-
-	return frames_queued(iodev, &tstamp);
-}
-
-static int get_buffer(struct cras_iodev *iodev, struct cras_audio_area **area,
-		      unsigned *frames)
-{
-	struct hfp_io *hfpio = (struct hfp_io *)iodev;
-	uint8_t *dst = NULL;
-
-	if (!hfp_info_running(hfpio->info))
-		return -1;
-
-	hfp_buf_acquire(hfpio->info, iodev->direction, &dst, frames);
-
-	iodev->area->frames = *frames;
-	/* HFP is mono only. */
-	iodev->area->channels[0].step_bytes =
-		cras_get_format_bytes(iodev->format);
-	iodev->area->channels[0].buf = dst;
-
-	*area = iodev->area;
-	return 0;
-}
-
-static int put_buffer(struct cras_iodev *iodev, unsigned nwritten)
-{
-	struct hfp_io *hfpio = (struct hfp_io *)iodev;
-
-	if (!hfp_info_running(hfpio->info))
-		return -1;
-
-	hfp_buf_release(hfpio->info, iodev->direction, nwritten);
-	return 0;
-}
-
-static int flush_buffer(struct cras_iodev *iodev)
-{
-	struct hfp_io *hfpio = (struct hfp_io *)iodev;
-	unsigned nframes;
-
-	if (iodev->direction == CRAS_STREAM_INPUT) {
-		nframes = hfp_buf_queued(hfpio->info, iodev->direction);
-		hfp_buf_release(hfpio->info, iodev->direction, nframes);
-	}
-	return 0;
-}
-
-static void update_active_node(struct cras_iodev *iodev, unsigned node_idx,
-			       unsigned dev_enabled)
-{
-}
-
-int hfp_iodev_is_hsp(struct cras_iodev *iodev)
-{
-	struct hfp_io *hfpio = (struct hfp_io *)iodev;
-	return hfp_slc_is_hsp(hfpio->slc);
-}
-
-void hfp_free_resources(struct hfp_io *hfpio)
-{
-	struct cras_ionode *node;
-	node = hfpio->base.active_node;
-	if (node) {
-		cras_iodev_rm_node(&hfpio->base, node);
-		free(node);
-	}
-	free(hfpio->base.supported_channel_counts);
-	free(hfpio->base.supported_rates);
-	free(hfpio->base.supported_formats);
-	cras_iodev_free_resources(&hfpio->base);
-}
-
-struct cras_iodev *hfp_iodev_create(enum CRAS_STREAM_DIRECTION dir,
-				    struct cras_bt_device *device,
-				    struct hfp_slc_handle *slc,
-				    enum cras_bt_device_profile profile,
-				    struct hfp_info *info)
-{
-	struct hfp_io *hfpio;
-	struct cras_iodev *iodev;
-	struct cras_ionode *node;
-	const char *name;
-
-	hfpio = (struct hfp_io *)calloc(1, sizeof(*hfpio));
-	if (!hfpio)
-		goto error;
-
-	iodev = &hfpio->base;
-	iodev->direction = dir;
-
-	hfpio->device = device;
-	hfpio->slc = slc;
-
-	/* Set iodev's name to device readable name or the address. */
-	name = cras_bt_device_name(device);
-	if (!name)
-		name = cras_bt_device_object_path(device);
-
-	snprintf(iodev->info.name, sizeof(iodev->info.name), "%s", name);
-	iodev->info.name[ARRAY_SIZE(iodev->info.name) - 1] = 0;
-	iodev->info.stable_id = cras_bt_device_get_stable_id(device);
-
-	iodev->configure_dev = configure_dev;
-	iodev->frames_queued = frames_queued;
-	iodev->delay_frames = delay_frames;
-	iodev->get_buffer = get_buffer;
-	iodev->put_buffer = put_buffer;
-	iodev->flush_buffer = flush_buffer;
-	iodev->no_stream = no_stream;
-	iodev->close_dev = close_dev;
-	iodev->update_supported_formats = update_supported_formats;
-	iodev->update_active_node = update_active_node;
-	iodev->set_volume = set_hfp_volume;
-	iodev->output_underrun = output_underrun;
-
-	node = (struct cras_ionode *)calloc(1, sizeof(*node));
-	node->dev = iodev;
-	strcpy(node->name, iodev->info.name);
-
-	node->plugged = 1;
-	/* If headset mic doesn't support the wideband speech, report a
-	 * different node type so UI can set different plug priority. */
-	node->type = CRAS_NODE_TYPE_BLUETOOTH;
-	if (!hfp_slc_get_wideband_speech_supported(hfpio->slc) &&
-	    (dir == CRAS_STREAM_INPUT))
-		node->type = CRAS_NODE_TYPE_BLUETOOTH_NB_MIC;
-
-	node->volume = 100;
-	gettimeofday(&node->plugged_time, NULL);
-
-	/* Prepare active node before append, so bt_io can extract correct
-	 * info from HFP iodev and node. */
-	cras_iodev_add_node(iodev, node);
-	cras_iodev_set_active_node(iodev, node);
-	cras_bt_device_append_iodev(device, iodev, profile);
-
-	hfpio->info = info;
-
-	/* Record max supported channels into cras_iodev_info. */
-	iodev->info.max_supported_channels = 1;
-
-	ewma_power_disable(&iodev->ewma);
-
-	return iodev;
-
-error:
-	if (hfpio) {
-		hfp_free_resources(hfpio);
-		free(hfpio);
-	}
-	return NULL;
-}
-
-void hfp_iodev_destroy(struct cras_iodev *iodev)
-{
-	struct hfp_io *hfpio = (struct hfp_io *)iodev;
-
-	cras_bt_device_rm_iodev(hfpio->device, iodev);
-	hfp_free_resources(hfpio);
-	free(hfpio);
-}
diff --git a/cras/src/server/cras_hfp_iodev.h b/cras/src/server/cras_hfp_iodev.h
deleted file mode 100644
index b50aa25..0000000
--- a/cras/src/server/cras_hfp_iodev.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_HFP_IODEV_H_
-#define CRAS_HFP_IODEV_H_
-
-#include "cras_bt_device.h"
-#include "cras_hfp_info.h"
-#include "cras_types.h"
-
-struct hfp_slc_handle;
-
-/*
- * Creates an hfp iodev.
- */
-struct cras_iodev *hfp_iodev_create(enum CRAS_STREAM_DIRECTION dir,
-				    struct cras_bt_device *device,
-				    struct hfp_slc_handle *slc,
-				    enum cras_bt_device_profile profile,
-				    struct hfp_info *info);
-
-void hfp_iodev_destroy(struct cras_iodev *iodev);
-
-/*
- * Returns if the iodev is running for a HSP connection. Note that
- * hfp_iodev is implemented for both HFP and HSP connection. And this
- * function allows caller to test if it falls to the rare case - HSP.
- */
-int hfp_iodev_is_hsp(struct cras_iodev *iodev);
-
-#endif /* CRAS_HFP_IODEV_H_ */
diff --git a/cras/src/server/cras_hfp_slc.c b/cras/src/server/cras_hfp_slc.c
deleted file mode 100644
index 28f73ed..0000000
--- a/cras/src/server/cras_hfp_slc.c
+++ /dev/null
@@ -1,1400 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <sys/socket.h>
-#include <syslog.h>
-
-#include "stdbool.h"
-
-#include "cras_bt_device.h"
-#include "cras_bt_log.h"
-#include "cras_observer.h"
-#include "cras_telephony.h"
-#include "cras_hfp_slc.h"
-#include "cras_server_metrics.h"
-#include "cras_system_state.h"
-#include "cras_tm.h"
-#include "cras_util.h"
-
-/* Message start and end with "\r\n". refer to spec 4.33. */
-#define AT_CMD(cmd) "\r\n" cmd "\r\n"
-
-/* The timeout between event reporting and HF indicator commands */
-#define HF_INDICATORS_TIMEOUT_MS 2000
-/* The sleep time before reading and processing the following AT commands during
- * codec connection setup.
- */
-#define CODEC_CONN_SLEEP_TIME_US 2000
-#define SLC_BUF_SIZE_BYTES 256
-
-/* Indicator update command response and indicator indices.
- * Note that indicator index starts from '1', index 0 is used for CRAS to record
- * if the event report has been enabled or not.
- */
-#define CRAS_INDICATOR_ENABLE_INDEX 0
-#define BATTERY_IND_INDEX 1
-#define SIGNAL_IND_INDEX 2
-#define SERVICE_IND_INDEX 3
-#define CALL_IND_INDEX 4
-#define CALLSETUP_IND_INDEX 5
-#define CALLHELD_IND_INDEX 6
-#define ROAM_IND_INDEX 7
-#define INDICATOR_IND_MAX 8
-#define INDICATOR_UPDATE_RSP                                                   \
-	"+CIND: "                                                              \
-	"(\"battchg\",(0-5)),"                                                 \
-	"(\"signal\",(0-5)),"                                                  \
-	"(\"service\",(0,1)),"                                                 \
-	"(\"call\",(0,1)),"                                                    \
-	"(\"callsetup\",(0-3)),"                                               \
-	"(\"callheld\",(0-2)),"                                                \
-	"(\"roam\",(0,1))"                                                     \
-	""
-/* Mode values for standard event reporting activation/deactivation AT
- * command AT+CMER. Used for indicator events reporting in HFP. */
-#define FORWARD_UNSOLICIT_RESULT_CODE 3
-
-/* Handle object to hold required info to initialize and maintain
- * an HFP service level connection.
- * Args:
- *    buf - Buffer hold received commands.
- *    buf_read_idx - Read index for buf.
- *    buf_write_idx - Write index for buf.
- *    rfcomm_fd - File descriptor for the established RFCOMM connection.
- *    init_cb - Callback to be triggered when an SLC is initialized.
- *    cli_active - Calling line identification notification is enabled or not.
- *    battery - Current battery level of AG stored in SLC.
- *    signal - Current signal strength of AG stored in SLC.
- *    service - Current service availability of AG stored in SLC.
- *    callheld - Current callheld status of AG stored in SLC.
- *    ind_event_reports - Activate statuses of indicator events reporting.
- *    ag_supported_features - Supported AG features bitmap.
- *    hf_supported_features - Bit map of HF supported features.
- *    hf_supports_battery_indicator - Bit map of battery indicator support of
- *        connected HF.
- *    hf_battery - Current battery level of HF reported by the HF. The data
- *    range should be 0 ~ 100. Use -1 for no battery level reported.
- *    preferred_codec - CVSD or mSBC based on the situation and strategy. This
- *        needs not to be equal to selected_codec because codec negotiation
- *        process may fail.
- *    selected_codec - The codec id defaults to HFP_CODEC_UNUSED and changes
- *        only if codec negotiation is supported and the negotiation flow
- *        has completed.
- *    telephony - A reference of current telephony handle.
- *    device - The associated bt device.
- */
-struct hfp_slc_handle {
-	char buf[SLC_BUF_SIZE_BYTES];
-	int buf_read_idx;
-	int buf_write_idx;
-	int is_hsp;
-	int rfcomm_fd;
-	hfp_slc_init_cb init_cb;
-	hfp_slc_disconnect_cb disconnect_cb;
-	int cli_active;
-	int battery;
-	int signal;
-	int service;
-	int callheld;
-	int ind_event_reports[INDICATOR_IND_MAX];
-	int ag_supported_features;
-	bool hf_codec_supported[HFP_MAX_CODECS];
-	int hf_supported_features;
-	int hf_supports_battery_indicator;
-	int hf_battery;
-	int preferred_codec;
-	int selected_codec;
-	struct cras_bt_device *device;
-	struct cras_timer *timer;
-
-	struct cras_telephony_handle *telephony;
-};
-
-/* AT command exchanges between AG(Audio gateway) and HF(Hands-free device) */
-struct at_command {
-	const char *cmd;
-	int (*callback)(struct hfp_slc_handle *handle, const char *cmd);
-};
-
-/* Sends a response or command to HF */
-static int hfp_send(struct hfp_slc_handle *handle, const char *buf)
-{
-	int written, err, len;
-
-	if (handle->rfcomm_fd < 0)
-		return -EIO;
-
-	len = strlen(buf);
-	written = 0;
-	while (written < len) {
-		err = write(handle->rfcomm_fd, buf + written, len - written);
-		if (err < 0)
-			return -errno;
-		written += err;
-	}
-
-	return 0;
-}
-
-/* Sends a response for indicator event reporting. */
-static int hfp_send_ind_event_report(struct hfp_slc_handle *handle,
-				     int ind_index, int value)
-{
-	char cmd[64];
-
-	if (handle->is_hsp ||
-	    !handle->ind_event_reports[CRAS_INDICATOR_ENABLE_INDEX] ||
-	    !handle->ind_event_reports[ind_index])
-		return 0;
-
-	snprintf(cmd, 64, AT_CMD("+CIEV: %d,%d"), ind_index, value);
-	return hfp_send(handle, cmd);
-}
-
-/* Sends calling line identification unsolicited result code and
- * standard call waiting notification. */
-static int hfp_send_calling_line_identification(struct hfp_slc_handle *handle,
-						const char *number, int type)
-{
-	char cmd[64];
-
-	if (handle->is_hsp)
-		return 0;
-
-	if (handle->telephony->call) {
-		snprintf(cmd, 64, AT_CMD("+CCWA: \"%s\",%d"), number, type);
-	} else {
-		snprintf(cmd, 64, AT_CMD("+CLIP: \"%s\",%d"), number, type);
-	}
-	return hfp_send(handle, cmd);
-}
-
-/* ATA command to accept an incoming call. Mandatory support per spec 4.13. */
-static int answer_call(struct hfp_slc_handle *handle, const char *cmd)
-{
-	int rc;
-	rc = hfp_send(handle, AT_CMD("OK"));
-	if (rc)
-		return rc;
-
-	return cras_telephony_event_answer_call();
-}
-
-/* AT+CCWA command to enable the "Call Waiting notification" function.
- * Mandatory support per spec 4.21. */
-static int call_waiting_notify(struct hfp_slc_handle *handle, const char *buf)
-{
-	return hfp_send(handle, AT_CMD("OK"));
-}
-
-/* AT+CLIP command to enable the "Calling Line Identification notification"
- * function. Mandatory per spec 4.23.
- */
-static int cli_notification(struct hfp_slc_handle *handle, const char *cmd)
-{
-	if (strlen(cmd) < 9) {
-		syslog(LOG_ERR, "%s: malformed command: '%s'", __func__, cmd);
-		return hfp_send(handle, AT_CMD("ERROR"));
-	}
-	handle->cli_active = (cmd[8] == '1');
-	return hfp_send(handle, AT_CMD("OK"));
-}
-
-/* ATDdd...dd command to place call with supplied number, or ATD>nnn...
- * command to dial the number stored at memory location. Mandatory per
- * spec 4.18 and 4.19.
- */
-static int dial_number(struct hfp_slc_handle *handle, const char *cmd)
-{
-	int rc, cmd_len;
-
-	cmd_len = strlen(cmd);
-	if (cmd_len < 4)
-		goto error_out;
-
-	if (cmd[3] == '>') {
-		/* Handle memory dial. Extract memory location from command
-		 * ATD>nnn...; and lookup. */
-		int memory_location;
-		memory_location = strtol(cmd + 4, NULL, 0);
-		if (handle->telephony->dial_number == NULL ||
-		    memory_location != 1)
-			return hfp_send(handle, AT_CMD("ERROR"));
-	} else {
-		/* ATDddddd; Store dial number to the only memory slot. */
-		cras_telephony_store_dial_number(cmd_len - 3 - 1, cmd + 3);
-	}
-
-	rc = hfp_send(handle, AT_CMD("OK"));
-	if (rc)
-		return rc;
-
-	handle->telephony->callsetup = 2;
-	return hfp_send_ind_event_report(handle, CALLSETUP_IND_INDEX, 2);
-
-error_out:
-	syslog(LOG_ERR, "%s: malformed command: '%s'", __func__, cmd);
-	return hfp_send(handle, AT_CMD("ERROR"));
-}
-
-/* AT+VTS command to generate a DTMF code. Mandatory per spec 4.27. */
-static int dtmf_tone(struct hfp_slc_handle *handle, const char *buf)
-{
-	return hfp_send(handle, AT_CMD("OK"));
-}
-
-/* Sends +BCS command to tell HF about our preferred codec. This shall
- * be called only if codec negotiation is supported.
- */
-static void select_preferred_codec(struct hfp_slc_handle *handle)
-{
-	char buf[64];
-	snprintf(buf, 64, AT_CMD("+BCS:%d"), handle->preferred_codec);
-	hfp_send(handle, buf);
-	BTLOG(btlog, BT_CODEC_SELECTION, 0, handle->preferred_codec);
-}
-
-/* Marks SLC handle as initialized and trigger HFP AG's init_cb. */
-static void initialize_slc_handle(struct cras_timer *timer, void *arg)
-{
-	struct hfp_slc_handle *handle = (struct hfp_slc_handle *)arg;
-	if (timer)
-		handle->timer = NULL;
-
-	if (handle->init_cb) {
-		handle->init_cb(handle);
-		handle->init_cb = NULL;
-	}
-}
-
-/* Handles the event that headset request to start a codec connection
- * procedure.
- */
-static int bluetooth_codec_connection(struct hfp_slc_handle *handle,
-				      const char *cmd)
-{
-	/* Reset current selected codec to force a new codec connection
-	 * procedure when the next hfp_slc_codec_connection_setup is called.
-	 */
-	handle->selected_codec = HFP_CODEC_UNUSED;
-	return hfp_send(handle, AT_CMD("OK"));
-}
-
-/* Handles the event that headset request to select specific codec. */
-static int bluetooth_codec_selection(struct hfp_slc_handle *handle,
-				     const char *cmd)
-{
-	char *tokens = strdup(cmd);
-	char *codec;
-	int id, err;
-
-	strtok(tokens, "=");
-	codec = strtok(NULL, ",");
-	if (!codec)
-		goto bcs_cmd_cleanup;
-	id = atoi(codec);
-	if ((id <= HFP_CODEC_UNUSED) || (id >= HFP_MAX_CODECS)) {
-		syslog(LOG_ERR, "%s: invalid codec id: '%s'", __func__, cmd);
-		free(tokens);
-		return hfp_send(handle, AT_CMD("ERROR"));
-	}
-
-	if (id != handle->preferred_codec)
-		syslog(LOG_WARNING, "%s: inconsistent codec id: '%s'", __func__,
-		       cmd);
-
-	BTLOG(btlog, BT_CODEC_SELECTION, 1, id);
-	handle->selected_codec = id;
-
-bcs_cmd_cleanup:
-	free(tokens);
-	err = hfp_send(handle, AT_CMD("OK"));
-	return err;
-}
-
-/*
- * AT+IPHONEACCEV command from HF to report state change.You can find details
- * of this command in the Accessory Design Guidelines for Apple Devices R11
- * section 16.1.
- */
-static int apple_accessory_state_change(struct hfp_slc_handle *handle,
-					const char *cmd)
-{
-	char *tokens, *num, *key, *val;
-	int i, level;
-
-	/* AT+IPHONEACCEV=Number of key/value pairs,key1,val1,key2,val2,...
-	 * Number of key/value pairs: The number of parameters coming next.
-	 * key: the type of change being reported:
-         *      1 = Battery Level
-         *      2 = Dock State
-         * val: the value of the change:
-         * Battery Level: string value between '0' and '9'
-         * Dock State: 0 = undocked, 1 = docked
-	 */
-	tokens = strdup(cmd);
-	strtok(tokens, "=");
-	num = strtok(NULL, ",");
-	if (!num) {
-		free(tokens);
-		return hfp_send(handle, AT_CMD("ERROR"));
-	}
-
-	for (i = 0; i < atoi(num); i++) {
-		key = strtok(NULL, ",");
-		val = strtok(NULL, ",");
-		if (!key || !val) {
-			syslog(LOG_WARNING,
-			       "IPHONEACCEV: Expected %d kv pairs but got %d",
-			       atoi(num), i);
-			break;
-		}
-
-		if (atoi(key) == 1) {
-			level = atoi(val);
-			if (level >= 0 && level < 10) {
-				cras_server_metrics_hfp_battery_report(
-					CRAS_HFP_BATTERY_INDICATOR_APPLE);
-				level = (level + 1) * 10;
-				if (handle->hf_battery != level) {
-					handle->hf_battery = level;
-					cras_observer_notify_bt_battery_changed(
-						cras_bt_device_address(
-							handle->device),
-						(uint32_t)(level));
-				}
-			} else {
-				syslog(LOG_ERR,
-				       "Get invalid battery status from cmd:%s",
-				       cmd);
-			}
-		}
-	}
-	free(tokens);
-	return hfp_send(handle, AT_CMD("OK"));
-}
-
-/*
- * AT+XAPL command from HF to enable Apple custom features. You can find details
- * of it in the Accessory Design Guidelines for Apple Devices R11 section 15.1.
- */
-static int apple_supported_features(struct hfp_slc_handle *handle,
-				    const char *cmd)
-{
-	char *tokens, *features;
-	int apple_features, err;
-	char buf[64];
-
-	/* AT+XAPL=<vendorID>-<productID>-<version>,<features>
-	 * Parse <features>, the only token we care about.
-	 */
-	tokens = strdup(cmd);
-	strtok(tokens, "=");
-
-	strtok(NULL, ",");
-	features = strtok(NULL, ",");
-	if (!features)
-		goto error_out;
-
-	apple_features = atoi(features);
-
-	if (apple_features & APL_BATTERY)
-		handle->hf_supports_battery_indicator |=
-			CRAS_HFP_BATTERY_INDICATOR_APPLE;
-
-	snprintf(buf, 64, AT_CMD("+XAPL=iPhone,%d"),
-		 CRAS_APL_SUPPORTED_FEATURES);
-	err = hfp_send(handle, buf);
-	if (err)
-		goto error_out;
-
-	err = hfp_send(handle, AT_CMD("OK"));
-	free(tokens);
-	return err;
-
-error_out:
-	syslog(LOG_ERR, "%s: malformed command: '%s'", __func__, cmd);
-	free(tokens);
-	return hfp_send(handle, AT_CMD("ERROR"));
-}
-
-/* Handles the event when headset reports its available codecs list. */
-static int available_codecs(struct hfp_slc_handle *handle, const char *cmd)
-{
-	char *tokens, *id_str;
-	int id;
-
-	for (id = 0; id < HFP_MAX_CODECS; id++)
-		handle->hf_codec_supported[id] = false;
-
-	tokens = strdup(cmd);
-	strtok(tokens, "=");
-	id_str = strtok(NULL, ",");
-	while (id_str) {
-		id = atoi(id_str);
-		if ((id > HFP_CODEC_UNUSED) && (id < HFP_MAX_CODECS)) {
-			handle->hf_codec_supported[id] = true;
-			BTLOG(btlog, BT_AVAILABLE_CODECS, 0, id);
-		}
-		id_str = strtok(NULL, ",");
-	}
-
-	if (hfp_slc_get_wideband_speech_supported(handle))
-		handle->preferred_codec = HFP_CODEC_ID_MSBC;
-	else
-		handle->preferred_codec = HFP_CODEC_ID_CVSD;
-
-	free(tokens);
-	return hfp_send(handle, AT_CMD("OK"));
-}
-
-/* AT+CMER command enables the registration status update function in AG.
- * The service level connection is consider initialized when successfully
- * responded OK to the AT+CMER command. Mandatory support per spec 4.4.
- */
-static int event_reporting(struct hfp_slc_handle *handle, const char *cmd)
-{
-	char *tokens, *mode, *tmp;
-	int err = 0;
-
-	/* AT+CMER=[<mode>[,<keyp>[,<disp>[,<ind> [,<bfr>]]]]]
-	 * Parse <ind>, the only token we care about.
-	 */
-	tokens = strdup(cmd);
-	strtok(tokens, "=");
-
-	mode = strtok(NULL, ",");
-	tmp = strtok(NULL, ",");
-	tmp = strtok(NULL, ",");
-	tmp = strtok(NULL, ",");
-
-	/* mode = 3 for forward unsolicited result codes.
-	 * AT+CMER=3,0,0,1 activates “indicator events reporting”.
-	 * The service level connection is considered established after
-	 * successfully responded with OK, regardless of the indicator
-	 * events reporting status.
-	 */
-	if (!mode || !tmp) {
-		syslog(LOG_ERR, "Invalid event reporting” cmd %s", cmd);
-		err = -EINVAL;
-		goto event_reporting_done;
-	}
-	if (atoi(mode) == FORWARD_UNSOLICIT_RESULT_CODE)
-		handle->ind_event_reports[CRAS_INDICATOR_ENABLE_INDEX] =
-			atoi(tmp);
-
-	err = hfp_send(handle, AT_CMD("OK"));
-	if (err) {
-		syslog(LOG_ERR, "Error sending response for command %s", cmd);
-		goto event_reporting_done;
-	}
-
-	/*
-	 * Wait for HF to retrieve information about HF indicators and consider
-	 * the Service Level Connection to be fully initialized, and thereby
-	 * established, if HF doesn't support HF indicators.
-	 */
-	if (hfp_slc_get_hf_hf_indicators_supported(handle))
-		handle->timer =
-			cras_tm_create_timer(cras_system_state_get_tm(),
-					     HF_INDICATORS_TIMEOUT_MS,
-					     initialize_slc_handle, handle);
-	/*
-	 * Otherwise, regard the Service Level Connection to be fully
-	 * initialized and ready for the potential codec negotiation.
-	 */
-	else
-		initialize_slc_handle(NULL, (void *)handle);
-
-event_reporting_done:
-	free(tokens);
-	return err;
-}
-
-/* AT+CMEE command to set the "Extended Audio Gateway Error Result Code".
- * Mandatory per spec 4.9.
- */
-static int extended_errors(struct hfp_slc_handle *handle, const char *buf)
-{
-	return hfp_send(handle, AT_CMD("OK"));
-}
-
-/* AT+CKPD command to handle the user initiated action from headset profile
- * device.
- */
-static int key_press(struct hfp_slc_handle *handle, const char *buf)
-{
-	hfp_send(handle, AT_CMD("OK"));
-
-	/* Release the call and connection. */
-	if (handle->telephony->call || handle->telephony->callsetup) {
-		cras_telephony_event_terminate_call();
-		handle->disconnect_cb(handle);
-		return -EIO;
-	}
-	return 0;
-}
-
-/* AT+BLDN command to re-dial the last number. Mandatory support
- * per spec 4.20.
- */
-static int last_dialed_number(struct hfp_slc_handle *handle, const char *buf)
-{
-	int rc;
-
-	if (!handle->telephony->dial_number)
-		return hfp_send(handle, AT_CMD("ERROR"));
-
-	rc = hfp_send(handle, AT_CMD("OK"));
-	if (rc)
-		return rc;
-
-	handle->telephony->callsetup = 2;
-	return hfp_send_ind_event_report(handle, CALLSETUP_IND_INDEX, 2);
-}
-
-/* AT+CLCC command to query list of current calls. Mandatory support
- * per spec 4.31.
- *
- * +CLCC: <idx>,<direction>,<status>,<mode>,<multiparty>
- */
-static int list_current_calls(struct hfp_slc_handle *handle, const char *cmd)
-{
-	char buf[64];
-
-	int idx = 1;
-	int rc;
-	/* Fake the call list base on callheld and call status
-	 * since we have no API exposed to manage call list.
-	 * This is a hack to pass qualification test which ask us to
-	 * handle the basic case that one call is active and
-	 * the other is on hold. */
-	if (handle->telephony->callheld) {
-		snprintf(buf, 64, AT_CMD("+CLCC: %d,1,1,0,0"), idx++);
-		rc = hfp_send(handle, buf);
-		if (rc)
-			return rc;
-	}
-
-	if (handle->telephony->call) {
-		snprintf(buf, 64, AT_CMD("+CLCC: %d,1,0,0,0"), idx++);
-		rc = hfp_send(handle, buf);
-		if (rc)
-			return rc;
-	}
-
-	return hfp_send(handle, AT_CMD("OK"));
-}
-
-/* AT+COPS command to query currently selected operator or set name format.
- * Mandatory support per spec 4.8.
- */
-static int operator_selection(struct hfp_slc_handle *handle, const char *buf)
-{
-	int rc;
-	if (buf[7] == '?') {
-		/* HF sends AT+COPS? command to find current network operator.
-		 * AG responds with +COPS:<mode>,<format>,<operator>, where
-		 * the mode=0 means automatic for network selection. If no
-		 * operator is selected, <format> and <operator> are omitted.
-		 */
-		rc = hfp_send(handle, AT_CMD("+COPS: 0"));
-		if (rc)
-			return rc;
-	}
-	return hfp_send(handle, AT_CMD("OK"));
-}
-
-/* The AT+CHLD command is used to control call hold, release, and multiparty
- * states.
- */
-static int call_hold(struct hfp_slc_handle *handle, const char *buf)
-{
-	int rc;
-
-	// Chrome OS doesn't yet support CHLD features but we need to reply
-	// the query with an empty feature list rather than "ERROR" to increase
-	// interoperability with certain devices (b/172413440).
-	if (strlen(buf) > 8 && buf[7] == '=' && buf[8] == '?') {
-		rc = hfp_send(handle, AT_CMD("+CHLD:"));
-		if (rc)
-			return rc;
-		return hfp_send(handle, AT_CMD("OK"));
-	}
-
-	return hfp_send(handle, AT_CMD("ERROR"));
-}
-
-/* AT+CIND command retrieves the supported indicator and its corresponding
- * range and order index or read current status of indicators. Mandatory
- * support per spec 4.2.
- */
-static int report_indicators(struct hfp_slc_handle *handle, const char *cmd)
-{
-	int err;
-	char buf[64];
-
-	if (strlen(cmd) < 8) {
-		syslog(LOG_ERR, "%s: malformed command: '%s'", __func__, cmd);
-		return hfp_send(handle, AT_CMD("ERROR"));
-	}
-
-	if (cmd[7] == '=') {
-		/* Indicator update test command "AT+CIND=?" */
-		err = hfp_send(handle, AT_CMD(INDICATOR_UPDATE_RSP));
-	} else {
-		/* Indicator update read command "AT+CIND?".
-		 * Respond with current status of AG indicators,
-		 * the values must be listed in the indicator order declared
-		 * in INDICATOR_UPDATE_RSP.
-		 * +CIND: <signal>,<service>,<call>,
-		 *        <callsetup>,<callheld>,<roam>
-		 */
-		snprintf(buf, 64, AT_CMD("+CIND: %d,%d,%d,%d,%d,%d,0"),
-			 handle->battery, handle->signal, handle->service,
-			 handle->telephony->call, handle->telephony->callsetup,
-			 handle->telephony->callheld);
-		err = hfp_send(handle, buf);
-	}
-
-	if (err < 0)
-		return err;
-
-	return hfp_send(handle, AT_CMD("OK"));
-}
-
-/* AT+BIA command to change the subset of indicators that shall be
- * sent by the AG.
- */
-static int indicator_activation(struct hfp_slc_handle *handle, const char *cmd)
-{
-	char *ptr;
-	int idx = BATTERY_IND_INDEX;
-
-	/* AT+BIA=[[<indrep 1>][,[<indrep 2>][,...[,[<indrep n>]]]]]
-	 * According to the spec:
-	 * - The indicator state can be omitted and the current reporting
-	 *   states of the indicator shall not change.
-	 *     Ex: AT+BIA=,1,,0
-	 *         Only the 2nd and 4th indicators may be affected.
-	 * - HF can provide fewer indicators than AG and states not provided
-	 *   shall not change.
-	 *     Ex: CRAS supports 7 indicators and gets AT+BIA=1,0,1
-	 *         Only the first three indicators may be affected.
-	 * - Call, Call Setup and Held Call are mandatory and should be always
-	 *   on no matter what state HF set.
-	 */
-	ptr = strchr(cmd, '=');
-	while (ptr && idx < INDICATOR_IND_MAX) {
-		if (idx != CALL_IND_INDEX && idx != CALLSETUP_IND_INDEX &&
-		    idx != CALLHELD_IND_INDEX) {
-			if (*(ptr + 1) == '1')
-				handle->ind_event_reports[idx] = 1;
-			else if (*(ptr + 1) == '0')
-				handle->ind_event_reports[idx] = 0;
-		}
-		ptr = strchr(ptr + 1, ',');
-		idx++;
-	}
-	return hfp_send(handle, AT_CMD("OK"));
-}
-
-/* AT+BIND command to report, query and activate Generic Status Indicators.
- * It is sent by the HF if both AG and HF support the HF indicator feature.
- */
-static int indicator_support(struct hfp_slc_handle *handle, const char *cmd)
-{
-	char *tokens, *key;
-	int err, cmd_len;
-
-	cmd_len = strlen(cmd);
-	if (cmd_len < 8)
-		goto error_out;
-
-	if (cmd[7] == '=') {
-		/* AT+BIND=? (Read AG supported indicators) */
-		if (cmd_len > 8 && cmd[8] == '?') {
-			/* +BIND: (<a>,<b>,<c>,...,<n>) (Response to AT+BIND=?)
-			 * <a> ... <n>: 0-65535, entered as decimal unsigned
-			 * integer values without leading zeros, referencing an
-			 * HF indicator assigned number.
-			 * 1 is for Enhanced Driver Status.
-			 * 2 is for Battery Level.
-			 * For the list of HF indicator assigned number, you can
-			 * check the  Bluetooth SIG Assigned Numbers web page.
-			 */
-			BTLOG(btlog, BT_HFP_HF_INDICATOR, 1, 0);
-			/* "2" is for HF Battery Level that we support. We don't
-			 * support "1" but this is a workaround for Pixel Buds 2
-			 * which expects this exact combination for battery
-			 * reporting (HFP 1.7 standard) to work. This workaround
-			 * is fine since we don't enable Safety Drive with
-			 * +BIND: 1,1 (b/172680041).
-			 */
-			err = hfp_send(handle, AT_CMD("+BIND: (1,2)"));
-			if (err < 0)
-				return err;
-		}
-		/* AT+BIND=<a>,<b>,...,<n>(List HF supported indicators) */
-		else {
-			tokens = strdup(cmd);
-			strtok(tokens, "=");
-			key = strtok(NULL, ",");
-			while (key != NULL) {
-				if (atoi(key) == 2)
-					handle->hf_supports_battery_indicator |=
-						CRAS_HFP_BATTERY_INDICATOR_HFP;
-				key = strtok(NULL, ",");
-			}
-			free(tokens);
-		}
-	}
-	/* AT+BIND? (Read AG enabled/disabled status of indicators) */
-	else if (cmd[7] == '?') {
-		/* +BIND: <a>,<state> (Unsolicited or Response to AT+BIND?)
-		 * This response enables the AG to notify the HF which HF
-		 * indicators are supported and their state, enabled or
-		 * disabled.
-		 * <a>: 1 or 2, referencing an HF indicator assigned number.
-		 * <state>: 0-1, entered as integer values, where
-		 * 0 = disabled, no value changes shall be sent for this
-		 * indicator
-		 * 1 = enabled, value changes may be sent for this indicator
-		 */
-
-		/* We don't support Enhanced Driver Status, so explicitly
-		 * disable it (b/172680041).
-		 */
-		err = hfp_send(handle, AT_CMD("+BIND: 1,0"));
-		if (err < 0)
-			return err;
-
-		BTLOG(btlog, BT_HFP_HF_INDICATOR, 0, 0);
-
-		err = hfp_send(handle, AT_CMD("+BIND: 2,1"));
-		if (err < 0)
-			return err;
-
-		err = hfp_send(handle, AT_CMD("OK"));
-		if (err)
-			return err;
-		/*
-		 * Consider the Service Level Connection to be fully initialized
-		 * and thereby established, after successfully responded with OK
-		 */
-		initialize_slc_handle(NULL, (void *)handle);
-		return 0;
-	} else {
-		goto error_out;
-	}
-	/* This OK reply is required after both +BIND AT commands. It also
-	 * covers the AT+BIND= <a>,<b>,...,<n> case.
-	 */
-	return hfp_send(handle, AT_CMD("OK"));
-
-error_out:
-	syslog(LOG_ERR, "%s: malformed command: '%s'", __func__, cmd);
-	return hfp_send(handle, AT_CMD("ERROR"));
-}
-
-/* AT+BIEV command reports updated values of enabled HF indicators to the AG.
- */
-static int indicator_state_change(struct hfp_slc_handle *handle,
-				  const char *cmd)
-{
-	char *tokens, *key, *val;
-	int level;
-	/* AT+BIEV= <assigned number>,<value> (Update value of indicator)
-	 * CRAS only supports battery level, which is with assigned number 2.
-	 * Battery level should range from 0 to 100 defined by the spec.
-	 */
-	tokens = strdup(cmd);
-	strtok(tokens, "=");
-	key = strtok(NULL, ",");
-	if (!key)
-		goto error_out;
-
-	if (atoi(key) == 2) {
-		val = strtok(NULL, ",");
-		if (!val)
-			goto error_out;
-		level = atoi(val);
-		if (level >= 0 && level <= 100) {
-			cras_server_metrics_hfp_battery_report(
-				CRAS_HFP_BATTERY_INDICATOR_HFP);
-			if (handle->hf_battery != level) {
-				handle->hf_battery = level;
-				cras_observer_notify_bt_battery_changed(
-					cras_bt_device_address(handle->device),
-					(uint32_t)(level));
-			}
-		} else {
-			syslog(LOG_ERR,
-			       "Get invalid battery status from cmd:%s", cmd);
-		}
-	} else {
-		goto error_out;
-	}
-
-	free(tokens);
-	return hfp_send(handle, AT_CMD("OK"));
-
-error_out:
-	syslog(LOG_WARNING, "%s: invalid command: '%s'", __func__, cmd);
-	free(tokens);
-	return hfp_send(handle, AT_CMD("ERROR"));
-}
-
-/* AT+VGM and AT+VGS command reports the current mic and speaker gain
- * level respectively. Optional support per spec 4.28.
- */
-static int signal_gain_setting(struct hfp_slc_handle *handle, const char *cmd)
-{
-	int gain;
-
-	if (strlen(cmd) < 8) {
-		syslog(LOG_ERR, "%s: malformed command: '%s'", __func__, cmd);
-		return hfp_send(handle, AT_CMD("ERROR"));
-	}
-
-	/* Map 0 to the smallest non-zero scale 6/100, and 15 to
-	 * 100/100 full. */
-	if (cmd[5] == 'S') {
-		gain = atoi(&cmd[7]);
-		if (gain < 0 || gain > 15) {
-			syslog(LOG_ERR,
-			       "signal_gain_setting: gain %d is not between 0 and 15",
-			       gain);
-			return hfp_send(handle, AT_CMD("ERROR"));
-		}
-		BTLOG(btlog, BT_HFP_UPDATE_SPEAKER_GAIN, gain, 0);
-		cras_bt_device_update_hardware_volume(handle->device,
-						      (gain + 1) * 100 / 16);
-	}
-
-	return hfp_send(handle, AT_CMD("OK"));
-}
-
-/* AT+CNUM command to query the subscriber number. Mandatory support
- * per spec 4.30.
- */
-static int subscriber_number(struct hfp_slc_handle *handle, const char *buf)
-{
-	return hfp_send(handle, AT_CMD("OK"));
-}
-
-/* AT+BRSF command notifies the HF(Hands-free device) supported features
- * and retrieves the AG(Audio gateway) supported features. Mandatory
- * support per spec 4.2.
- */
-static int supported_features(struct hfp_slc_handle *handle, const char *cmd)
-{
-	int err;
-	char response[128];
-	char *tokens, *features;
-
-	if (strlen(cmd) < 9) {
-		syslog(LOG_ERR, "%s: malformed command: '%s'", __func__, cmd);
-		return hfp_send(handle, AT_CMD("ERROR"));
-	}
-
-	tokens = strdup(cmd);
-	strtok(tokens, "=");
-	features = strtok(NULL, ",");
-	if (!features)
-		goto error_out;
-
-	handle->hf_supported_features = atoi(features);
-	BTLOG(btlog, BT_HFP_SUPPORTED_FEATURES, 0,
-	      handle->hf_supported_features);
-	free(tokens);
-
-	/* AT+BRSF=<feature> command received, ignore the HF supported feature
-	 * for now. Respond with +BRSF:<feature> to notify mandatory supported
-	 * features in AG(audio gateway).
-	 */
-	BTLOG(btlog, BT_HFP_SUPPORTED_FEATURES, 1,
-	      handle->ag_supported_features);
-	snprintf(response, 128, AT_CMD("+BRSF: %u"),
-		 handle->ag_supported_features);
-	err = hfp_send(handle, response);
-	if (err < 0)
-		return err;
-
-	return hfp_send(handle, AT_CMD("OK"));
-
-error_out:
-	free(tokens);
-	syslog(LOG_ERR, "%s: malformed command: '%s'", __func__, cmd);
-	return hfp_send(handle, AT_CMD("ERROR"));
-}
-
-int hfp_event_speaker_gain(struct hfp_slc_handle *handle, int gain)
-{
-	char command[128];
-
-	/* Normailize gain value to 0-15 */
-	gain = gain * 15 / 100;
-	BTLOG(btlog, BT_HFP_SET_SPEAKER_GAIN, gain, 0);
-	snprintf(command, 128, AT_CMD("+VGS=%d"), gain);
-
-	return hfp_send(handle, command);
-}
-
-/* AT+CHUP command to terminate current call. Mandatory support
- * per spec 4.15.
- */
-static int terminate_call(struct hfp_slc_handle *handle, const char *cmd)
-{
-	int rc;
-	rc = hfp_send(handle, AT_CMD("OK"));
-	if (rc)
-		return rc;
-
-	return cras_telephony_event_terminate_call();
-}
-
-/* AT+XEVENT is defined by Android to support vendor specific features.
- * Currently, the only known supported case for CrOS is the battery event sent
- * by some Plantronics headsets.
- */
-static int vendor_specific_features(struct hfp_slc_handle *handle,
-				    const char *cmd)
-{
-	char *tokens, *event, *level_str, *num_of_level_str;
-	int level, num_of_level;
-
-	tokens = strdup(cmd);
-	strtok(tokens, "=");
-	event = strtok(NULL, ",");
-	if (!event)
-		goto error_out;
-
-	/* AT+XEVENT=BATTERY,Level,NumberOfLevel,MinutesOfTalkTime,IsCharging
-	 * Level: The charge level with a zero-based integer.
-	 * NumberOfLevel: How many charging levels there are.
-	 * MinuteOfTalkTime: The estimated number of talk minutes remaining.
-	 * IsCharging: A 0 or 1 value.
-	 *
-	 * We only support the battery level and thus only care about the first
-	 * 3 arguments.
-	 */
-	if (!strncmp(event, "BATTERY", 7)) {
-		level_str = strtok(NULL, ",");
-		num_of_level_str = strtok(NULL, ",");
-		if (!level_str || !num_of_level_str)
-			goto error_out;
-
-		level = atoi(level_str);
-		num_of_level = atoi(num_of_level_str);
-		if (level < 0 || num_of_level <= 1 || level >= num_of_level)
-			goto error_out;
-
-		level = (int64_t)level * 100 / (num_of_level - 1);
-		if (handle->hf_battery != level) {
-			handle->hf_supports_battery_indicator |=
-				CRAS_HFP_BATTERY_INDICATOR_PLANTRONICS;
-			cras_server_metrics_hfp_battery_report(
-				CRAS_HFP_BATTERY_INDICATOR_PLANTRONICS);
-			handle->hf_battery = level;
-			cras_observer_notify_bt_battery_changed(
-				cras_bt_device_address(handle->device),
-				(uint32_t)(level));
-		}
-	}
-
-	free(tokens);
-	/* For Plantronic headsets, it is required to reply "OK" for the first
-	 * AT+XEVENT=USER-AGENT... command to tell the headset our support of
-	 * the xevent protocol. Otherwise, all following events including
-	 * BATTERY won't be sent.
-	 */
-	return hfp_send(handle, AT_CMD("OK"));
-
-error_out:
-	syslog(LOG_ERR, "%s: malformed vendor specific command: '%s'", __func__,
-	       cmd);
-	free(tokens);
-	return hfp_send(handle, AT_CMD("ERROR"));
-}
-
-/* AT commands to support in order to conform HFP specification.
- *
- * An initialized service level connection is the pre-condition for all
- * call related procedures. Note that for the call related commands,
- * we are good to just respond with a meaningless "OK".
- *
- * The procedure to establish a service level connection is described below:
- *
- * 1. HF notifies AG about its own supported features and AG responds
- * with its supported feature.
- *
- * HF(hands-free)                             AG(audio gateway)
- *                     AT+BRSF=<HF supported feature> -->
- *                 <-- +BRSF:<AG supported feature>
- *                 <-- OK
- *
- * 2. HF retrieves the information about the indicators supported in AG.
- *
- * HF(hands-free)                             AG(audio gateway)
- *                     AT+CIND=? -->
- *                 <-- +CIND:...
- *                 <-- OK
- *
- * 3. The HF requests the current status of the indicators in AG.
- *
- * HF(hands-free)                             AG(audio gateway)
- *                     AT+CIND -->
- *                 <-- +CIND:...
- *                 <-- OK
- *
- * 4. HF requests enabling indicator status update in the AG.
- *
- * HF(hands-free)                             AG(audio gateway)
- *                     AT+CMER= -->
- *                 <-- OK
- */
-static struct at_command at_commands[] = {
-	{ "ATA", answer_call },
-	{ "ATD", dial_number },
-	{ "AT+BAC", available_codecs },
-	{ "AT+BCC", bluetooth_codec_connection },
-	{ "AT+BCS", bluetooth_codec_selection },
-	{ "AT+BIA", indicator_activation },
-	{ "AT+BIEV", indicator_state_change },
-	{ "AT+BIND", indicator_support },
-	{ "AT+BLDN", last_dialed_number },
-	{ "AT+BRSF", supported_features },
-	{ "AT+CCWA", call_waiting_notify },
-	{ "AT+CHUP", terminate_call },
-	{ "AT+CIND", report_indicators },
-	{ "AT+CKPD", key_press },
-	{ "AT+CLCC", list_current_calls },
-	{ "AT+CLIP", cli_notification },
-	{ "AT+CMEE", extended_errors },
-	{ "AT+CMER", event_reporting },
-	{ "AT+CNUM", subscriber_number },
-	{ "AT+COPS", operator_selection },
-	{ "AT+IPHONEACCEV", apple_accessory_state_change },
-	{ "AT+VG", signal_gain_setting },
-	{ "AT+VTS", dtmf_tone },
-	{ "AT+XAPL", apple_supported_features },
-	{ "AT+XEVENT", vendor_specific_features },
-	{ "AT+CHLD", call_hold },
-	{ 0 }
-};
-
-static int handle_at_command(struct hfp_slc_handle *slc_handle, const char *cmd)
-{
-	struct at_command *atc;
-
-	for (atc = at_commands; atc->cmd; atc++)
-		if (!strncmp(cmd, atc->cmd, strlen(atc->cmd)))
-			return atc->callback(slc_handle, cmd);
-
-	syslog(LOG_DEBUG, "AT command %s not supported", cmd);
-	return hfp_send(slc_handle, AT_CMD("ERROR"));
-}
-
-int handle_at_command_for_test(struct hfp_slc_handle *slc_handle,
-			       const char *cmd)
-{
-	return handle_at_command(slc_handle, cmd);
-}
-
-static int process_at_commands(struct hfp_slc_handle *handle)
-{
-	ssize_t bytes_read;
-	int err;
-
-	bytes_read =
-		read(handle->rfcomm_fd, &handle->buf[handle->buf_write_idx],
-		     SLC_BUF_SIZE_BYTES - handle->buf_write_idx - 1);
-	if (bytes_read < 0)
-		return bytes_read;
-
-	handle->buf_write_idx += bytes_read;
-	handle->buf[handle->buf_write_idx] = '\0';
-
-	while (handle->buf_read_idx != handle->buf_write_idx) {
-		char *end_char;
-		end_char = strchr(&handle->buf[handle->buf_read_idx], '\r');
-		if (end_char == NULL)
-			break;
-
-		*end_char = '\0';
-		err = handle_at_command(handle,
-					&handle->buf[handle->buf_read_idx]);
-		if (err < 0)
-			return 0;
-
-		/* Shift the read index */
-		handle->buf_read_idx = 1 + end_char - handle->buf;
-		if (handle->buf_read_idx == handle->buf_write_idx) {
-			handle->buf_read_idx = 0;
-			handle->buf_write_idx = 0;
-		}
-	}
-
-	/* Handle the case when buffer is full and no command found. */
-	if (handle->buf_write_idx == SLC_BUF_SIZE_BYTES - 1) {
-		if (handle->buf_read_idx) {
-			memmove(handle->buf, &handle->buf[handle->buf_read_idx],
-				handle->buf_write_idx - handle->buf_read_idx);
-			handle->buf_write_idx -= handle->buf_read_idx;
-			handle->buf_read_idx = 0;
-		} else {
-			syslog(LOG_ERR,
-			       "Parse SLC command error, clean up buffer");
-			handle->buf_write_idx = 0;
-		}
-	}
-	return bytes_read;
-}
-
-static void slc_watch_callback(void *arg, int revents)
-{
-	struct hfp_slc_handle *handle = (struct hfp_slc_handle *)arg;
-	int err;
-
-	err = process_at_commands(handle);
-	if (err < 0) {
-		syslog(LOG_ERR, "Error reading slc command %s",
-		       strerror(errno));
-		cras_system_rm_select_fd(handle->rfcomm_fd);
-		handle->disconnect_cb(handle);
-	}
-	return;
-}
-
-/* Exported interfaces */
-
-struct hfp_slc_handle *hfp_slc_create(int fd, int is_hsp,
-				      int ag_supported_features,
-				      struct cras_bt_device *device,
-				      hfp_slc_init_cb init_cb,
-				      hfp_slc_disconnect_cb disconnect_cb)
-{
-	struct hfp_slc_handle *handle;
-	int i;
-
-	if (!disconnect_cb)
-		return NULL;
-
-	handle = (struct hfp_slc_handle *)calloc(1, sizeof(*handle));
-	if (!handle)
-		return NULL;
-
-	handle->rfcomm_fd = fd;
-	handle->is_hsp = is_hsp;
-	handle->ag_supported_features = ag_supported_features;
-	handle->hf_supported_features = 0;
-	handle->device = device;
-	handle->init_cb = init_cb;
-	handle->disconnect_cb = disconnect_cb;
-	handle->cli_active = 0;
-	handle->battery = 5;
-	handle->signal = 5;
-	handle->service = 1;
-	handle->ind_event_reports[CRAS_INDICATOR_ENABLE_INDEX] = 0;
-	for (i = BATTERY_IND_INDEX; i < INDICATOR_IND_MAX; i++)
-		handle->ind_event_reports[i] = 1;
-	handle->telephony = cras_telephony_get();
-	handle->preferred_codec = HFP_CODEC_ID_CVSD;
-	handle->selected_codec = HFP_CODEC_UNUSED;
-	handle->hf_supports_battery_indicator = CRAS_HFP_BATTERY_INDICATOR_NONE;
-	handle->hf_battery = -1;
-	cras_system_add_select_fd(handle->rfcomm_fd, slc_watch_callback, handle,
-				  POLLIN | POLLERR | POLLHUP);
-
-	return handle;
-}
-
-void hfp_slc_destroy(struct hfp_slc_handle *slc_handle)
-{
-	cras_system_rm_select_fd(slc_handle->rfcomm_fd);
-	if (slc_handle->timer)
-		cras_tm_cancel_timer(cras_system_state_get_tm(),
-				     slc_handle->timer);
-	close(slc_handle->rfcomm_fd);
-	free(slc_handle);
-}
-
-int hfp_slc_is_hsp(struct hfp_slc_handle *handle)
-{
-	return handle->is_hsp;
-}
-
-int hfp_slc_get_selected_codec(struct hfp_slc_handle *handle)
-{
-	/* If codec negotiation is not supported on HF, or the negotiation
-	 * process never completed. Fallback to the preffered codec. */
-	if (handle->selected_codec == HFP_CODEC_UNUSED)
-		return handle->preferred_codec;
-	else
-		return handle->selected_codec;
-}
-
-int hfp_slc_codec_connection_setup(struct hfp_slc_handle *handle)
-{
-	/* The time we wait for codec selection response. */
-	static struct timespec timeout = { 0, 100000000 };
-	struct pollfd poll_fd;
-	int rc = 0;
-	struct timespec ts = timeout;
-
-	/*
-	 * Codec negotiation is not required, if either AG or HF doesn't support
-	 * it or it has been done once.
-	 */
-	if (!hfp_slc_get_hf_codec_negotiation_supported(handle) ||
-	    !hfp_slc_get_ag_codec_negotiation_supported(handle) ||
-	    handle->selected_codec == handle->preferred_codec)
-		return 0;
-
-redo_codec_conn:
-	select_preferred_codec(handle);
-
-	poll_fd.fd = handle->rfcomm_fd;
-	poll_fd.events = POLLIN;
-
-	ts = timeout;
-	while (rc <= 0) {
-		rc = cras_poll(&poll_fd, 1, &ts, NULL);
-		if (rc == -ETIMEDOUT) {
-			/*
-	 		 * Catch the case that the first initial codec
-			 * negotiation timeout. At this point we're not sure
-			 * if HF is good with the preferred codec from AG.
-			 * Fallback to CVSD doesn't help because very likely
-			 * HF won't reply that either. The best thing we can
-			 * do is just leave a warning log.
-	 		 */
-			if (handle->selected_codec == HFP_CODEC_UNUSED) {
-				syslog(LOG_WARNING,
-				       "Proceed using codec %d without HF reply",
-				       handle->preferred_codec);
-			}
-			return rc;
-		}
-	}
-
-	if (rc > 0) {
-		do {
-			usleep(CODEC_CONN_SLEEP_TIME_US);
-			rc = process_at_commands(handle);
-		} while (rc == -EAGAIN);
-
-		if (rc <= 0)
-			return rc;
-		if (handle->selected_codec != handle->preferred_codec)
-			goto redo_codec_conn;
-	}
-
-	return 0;
-}
-
-int hfp_set_call_status(struct hfp_slc_handle *handle, int call)
-{
-	int old_call = handle->telephony->call;
-
-	if (old_call == call)
-		return 0;
-
-	handle->telephony->call = call;
-	return hfp_event_update_call(handle);
-}
-
-/* Procedure to setup a call when AG sees incoming call.
- *
- * HF(hands-free)                             AG(audio gateway)
- *                                                     <-- Incoming call
- *                 <-- +CIEV: (callsetup = 1)
- *                 <-- RING (ALERT)
- */
-int hfp_event_incoming_call(struct hfp_slc_handle *handle, const char *number,
-			    int type)
-{
-	int rc;
-
-	if (handle->is_hsp)
-		return 0;
-
-	if (handle->cli_active) {
-		rc = hfp_send_calling_line_identification(handle, number, type);
-		if (rc)
-			return rc;
-	}
-
-	if (handle->telephony->call)
-		return 0;
-	else
-		return hfp_send(handle, AT_CMD("RING"));
-}
-
-int hfp_event_update_call(struct hfp_slc_handle *handle)
-{
-	return hfp_send_ind_event_report(handle, CALL_IND_INDEX,
-					 handle->telephony->call);
-}
-
-int hfp_event_update_callsetup(struct hfp_slc_handle *handle)
-{
-	return hfp_send_ind_event_report(handle, CALLSETUP_IND_INDEX,
-					 handle->telephony->callsetup);
-}
-
-int hfp_event_update_callheld(struct hfp_slc_handle *handle)
-{
-	return hfp_send_ind_event_report(handle, CALLHELD_IND_INDEX,
-					 handle->telephony->callheld);
-}
-
-int hfp_event_set_battery(struct hfp_slc_handle *handle, int level)
-{
-	handle->battery = level;
-	return hfp_send_ind_event_report(handle, BATTERY_IND_INDEX, level);
-}
-
-int hfp_event_set_signal(struct hfp_slc_handle *handle, int level)
-{
-	handle->signal = level;
-	return hfp_send_ind_event_report(handle, SIGNAL_IND_INDEX, level);
-}
-
-int hfp_event_set_service(struct hfp_slc_handle *handle, int avail)
-{
-	/* Convert to 0 or 1.
-	 * Since the value must be either 1 or 0. (service presence or not) */
-	handle->service = !!avail;
-	return hfp_send_ind_event_report(handle, SERVICE_IND_INDEX, avail);
-}
-
-int hfp_slc_get_ag_codec_negotiation_supported(struct hfp_slc_handle *handle)
-{
-	return handle->ag_supported_features & AG_CODEC_NEGOTIATION;
-}
-
-int hfp_slc_get_hf_codec_negotiation_supported(struct hfp_slc_handle *handle)
-{
-	return handle->hf_supported_features & HF_CODEC_NEGOTIATION;
-}
-
-int hfp_slc_get_hf_hf_indicators_supported(struct hfp_slc_handle *handle)
-{
-	return handle->hf_supported_features & HF_HF_INDICATORS;
-}
-
-bool hfp_slc_get_wideband_speech_supported(struct hfp_slc_handle *handle)
-{
-	return hfp_slc_get_ag_codec_negotiation_supported(handle) &&
-	       hfp_slc_get_hf_codec_negotiation_supported(handle) &&
-	       handle->hf_codec_supported[HFP_CODEC_ID_MSBC];
-}
-
-int hfp_slc_get_hf_supports_battery_indicator(struct hfp_slc_handle *handle)
-{
-	return handle->hf_supports_battery_indicator;
-}
diff --git a/cras/src/server/cras_hfp_slc.h b/cras/src/server/cras_hfp_slc.h
deleted file mode 100644
index 99335ea..0000000
--- a/cras/src/server/cras_hfp_slc.h
+++ /dev/null
@@ -1,156 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_HFP_SLC_H_
-#define CRAS_HFP_SLC_H_
-
-struct hfp_slc_handle;
-struct cras_bt_device;
-
-/*
- * Hands-free HFP and AG supported features bits definition.
- * Per HFP 1.7.1 specification section 4.34.1, command
- * AT+BRSF (Bluetooth Retrieve Supported Features)
- */
-#define HF_EC_ANDOR_NR 0x0001
-#define HF_THREE_WAY_CALLING 0x0002
-#define HF_CLI_PRESENTATION_CAP 0x0004
-#define HF_VOICE_RECOGNITION 0x0008
-#define HF_REMOTE_VOLUME_CONTROL 0x0010
-#define HF_ENHANCED_CALL_STATUS 0x0020
-#define HF_ENHANCED_CALL_CONTROL 0x0040
-#define HF_CODEC_NEGOTIATION 0x0080
-#define HF_HF_INDICATORS 0x0100
-#define HF_ESCO_S4_T2_SETTINGS 0x0200
-
-#define AG_THREE_WAY_CALLING 0x0001
-#define AG_EC_ANDOR_NR 0x0002
-#define AG_VOICE_RECOGNITION 0x0004
-#define AG_INBAND_RINGTONE 0x0008
-#define AG_ATTACH_NUMBER_TO_VOICETAG 0x0010
-#define AG_REJECT_A_CALL 0x0020
-#define AG_ENHANCED_CALL_STATUS 0x0040
-#define AG_ENHANCED_CALL_CONTROL 0x0080
-#define AG_EXTENDED_ERROR_RESULT_CODES 0x0100
-#define AG_CODEC_NEGOTIATION 0x0200
-#define AG_HF_INDICATORS 0x0400
-#define AG_ESCO_S4_T2_SETTINGS 0x0800
-
-/*
- * Apple specific bluetooth commands that extend accessory capabilities.
- * Per Accessory Design Guidelines for Apple devices, command AT+XAPL
- */
-
-#define APL_RESERVED 0x01
-#define APL_BATTERY 0x02
-#define APL_DOCKED_OR_POWERED 0x04
-#define APL_SIRI 0x08
-#define APL_NOISE_REDUCTION 0x10
-
-#define CRAS_APL_SUPPORTED_FEATURES (APL_BATTERY)
-
-/* Codec ids for codec negotiation, per HFP 1.7.1 spec appendix B. */
-#define HFP_CODEC_UNUSED 0
-#define HFP_CODEC_ID_CVSD 1
-#define HFP_CODEC_ID_MSBC 2
-#define HFP_MAX_CODECS 3
-
-/* Hands-free HFP supported battery indicator bit definition.
- * This is currently only used for logging purpose. */
-#define CRAS_HFP_BATTERY_INDICATOR_NONE 0x0
-#define CRAS_HFP_BATTERY_INDICATOR_HFP 0x1
-#define CRAS_HFP_BATTERY_INDICATOR_APPLE 0x2
-#define CRAS_HFP_BATTERY_INDICATOR_PLANTRONICS 0x4
-
-/* Callback to call when service level connection initialized. */
-typedef int (*hfp_slc_init_cb)(struct hfp_slc_handle *handle);
-
-/* Callback to call when service level connection disconnected. */
-typedef int (*hfp_slc_disconnect_cb)(struct hfp_slc_handle *handle);
-
-/* Creates an hfp_slc_handle to poll the RFCOMM file descriptor
- * to read and handle received AT commands.
- * Args:
- *    fd - the rfcomm fd used to initialize service level connection
- *    is_hsp - if the slc handle is created for headset profile
- *    ag_supported_features - Supported AG features bitmap.
- *    device - The bt device associated with the created slc object
- *    init_cb - the callback function to be triggered when a service level
- *        connection is initialized.
- *    disconnect_cb - the callback function to be triggered when the service
- *        level connection is disconnected.
- */
-struct hfp_slc_handle *hfp_slc_create(int fd, int is_hsp,
-				      int ag_supported_features,
-				      struct cras_bt_device *device,
-				      hfp_slc_init_cb init_cb,
-				      hfp_slc_disconnect_cb disconnect_cb);
-
-/* Destroys an hfp_slc_handle. */
-void hfp_slc_destroy(struct hfp_slc_handle *handle);
-
-/* Returns true if this SLC is created for headset profile(HSP), false
- * means it's created for hands-free profile(HFP).
- */
-int hfp_slc_is_hsp(struct hfp_slc_handle *handle);
-
-/* Sets the call status to notify handsfree device. */
-int hfp_set_call_status(struct hfp_slc_handle *handle, int call);
-
-/* Fakes the incoming call event for qualification test. */
-int hfp_event_incoming_call(struct hfp_slc_handle *handle, const char *number,
-			    int type);
-
-/* Handles the call status changed event.
- * AG will send notification to HF accordingly. */
-int hfp_event_update_call(struct hfp_slc_handle *handle);
-
-/* Handles the call setup status changed event.
- * AG will send notification to HF accordingly. */
-int hfp_event_update_callsetup(struct hfp_slc_handle *handle);
-
-/* Handles the call held status changed event.
- * AG will send notification to HF accordingly. */
-int hfp_event_update_callheld(struct hfp_slc_handle *handle);
-
-/* Sets battery level which is required for qualification test. */
-int hfp_event_set_battery(struct hfp_slc_handle *handle, int value);
-
-/* Sets signal strength which is required for qualification test. */
-int hfp_event_set_signal(struct hfp_slc_handle *handle, int value);
-
-/* Sets service availability which is required for qualification test. */
-int hfp_event_set_service(struct hfp_slc_handle *handle, int value);
-
-/* Sets speaker gain value to headsfree device. */
-int hfp_event_speaker_gain(struct hfp_slc_handle *handle, int gain);
-
-/* Gets the selected codec for HFP, mSBC or CVSD. */
-int hfp_slc_get_selected_codec(struct hfp_slc_handle *handle);
-
-/* Gets if the remote HF supports codec negotiation. */
-int hfp_slc_get_hf_codec_negotiation_supported(struct hfp_slc_handle *handle);
-
-/* Gets if the remote HF supports HF indicator. */
-int hfp_slc_get_hf_hf_indicators_supported(struct hfp_slc_handle *handle);
-
-/* Gets if the HF side supports wideband speech. */
-bool hfp_slc_get_wideband_speech_supported(struct hfp_slc_handle *handle);
-
-/* Gets if the AG side supports codec negotiation. */
-int hfp_slc_get_ag_codec_negotiation_supported(struct hfp_slc_handle *handle);
-
-/* Gets an enum representing which spec the HF supports battery indicator.
- * Apple, HFP, none, or both. */
-int hfp_slc_get_hf_supports_battery_indicator(struct hfp_slc_handle *handle);
-
-/* Init the codec negotiation process if needed. */
-int hfp_slc_codec_connection_setup(struct hfp_slc_handle *handle);
-
-// Expose internal AT command handling for fuzzing.
-int handle_at_command_for_test(struct hfp_slc_handle *slc_handle,
-			       const char *cmd);
-
-#endif /* CRAS_HFP_SLC_H_ */
diff --git a/cras/src/server/cras_hotword_handler.c b/cras/src/server/cras_hotword_handler.c
deleted file mode 100644
index 055294a..0000000
--- a/cras/src/server/cras_hotword_handler.c
+++ /dev/null
@@ -1,64 +0,0 @@
-/* Copyright (c) 2017 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <stdint.h>
-#include <string.h>
-#include <syslog.h>
-
-#include "cras_main_message.h"
-#include "cras_observer.h"
-
-struct hotword_triggered_msg {
-	struct cras_main_message header;
-	int64_t tv_sec;
-	int64_t tv_nsec;
-};
-
-/* The following functions are called from audio thread. */
-
-static void init_hotword_triggered_msg(struct hotword_triggered_msg *msg)
-{
-	struct timespec now;
-
-	clock_gettime(CLOCK_MONOTONIC, &now);
-
-	memset(msg, 0, sizeof(*msg));
-	msg->header.type = CRAS_MAIN_HOTWORD_TRIGGERED;
-	msg->header.length = sizeof(*msg);
-	msg->tv_sec = now.tv_sec;
-	msg->tv_nsec = now.tv_nsec;
-}
-
-int cras_hotword_send_triggered_msg()
-{
-	struct hotword_triggered_msg msg;
-	int rc;
-
-	init_hotword_triggered_msg(&msg);
-
-	rc = cras_main_message_send((struct cras_main_message *)&msg);
-	if (rc < 0)
-		syslog(LOG_ERR, "Failed to send hotword triggered message!");
-
-	return rc;
-}
-
-/* The following functions are called from main thread. */
-
-static void handle_hotword_message(struct cras_main_message *msg, void *arg)
-{
-	struct hotword_triggered_msg *hotword_msg =
-		(struct hotword_triggered_msg *)msg;
-
-	cras_observer_notify_hotword_triggered(hotword_msg->tv_sec,
-					       hotword_msg->tv_nsec);
-}
-
-int cras_hotword_handler_init()
-{
-	cras_main_message_add_handler(CRAS_MAIN_HOTWORD_TRIGGERED,
-				      handle_hotword_message, NULL);
-	return 0;
-}
diff --git a/cras/src/server/cras_hotword_handler.h b/cras/src/server/cras_hotword_handler.h
deleted file mode 100644
index 48fc405..0000000
--- a/cras/src/server/cras_hotword_handler.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Copyright (c) 2017 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- *
- * The hotword handler is used to send a DBus signal when a hotword device is
- * triggered.
- *
- * cras_hotword_send_triggered_msg() is called from audio thread to send a
- * hotword message to main thread which in turn sends the DBus signal.
- *
- * cras_hotword_handler_init() is used to setup message handler in main thread
- * to handle the hotword message from audio thread.
- */
-
-#ifndef CRAS_HOTWORD_HANDLER_H_
-#define CRAS_HOTWORD_HANDLER_H_
-
-/* Send hotword triggered message. */
-int cras_hotword_send_triggered_msg();
-
-/* Initialize hotword handler. */
-int cras_hotword_handler_init();
-
-#endif /* CRAS_HOTWORD_HANDLER_H_ */
diff --git a/cras/src/server/cras_iodev.c b/cras/src/server/cras_iodev.c
deleted file mode 100644
index 651cef7..0000000
--- a/cras/src/server/cras_iodev.c
+++ /dev/null
@@ -1,1719 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <pthread.h>
-#include <stdbool.h>
-#include <stdlib.h>
-#include <sys/param.h>
-#include <sys/time.h>
-#include <syslog.h>
-#include <time.h>
-
-#include "audio_thread.h"
-#include "audio_thread_log.h"
-#include "buffer_share.h"
-#include "cras_audio_area.h"
-#include "cras_audio_thread_monitor.h"
-#include "cras_device_monitor.h"
-#include "cras_dsp.h"
-#include "cras_dsp_pipeline.h"
-#include "cras_fmt_conv.h"
-#include "cras_iodev.h"
-#include "cras_main_thread_log.h"
-#include "cras_iodev_list.h"
-#include "cras_mix.h"
-#include "cras_ramp.h"
-#include "cras_rstream.h"
-#include "cras_server_metrics.h"
-#include "cras_system_state.h"
-#include "cras_util.h"
-#include "dev_stream.h"
-#include "input_data.h"
-#include "utlist.h"
-#include "rate_estimator.h"
-#include "softvol_curve.h"
-
-static const float RAMP_UNMUTE_DURATION_SECS = 0.5;
-static const float RAMP_NEW_STREAM_DURATION_SECS = 0.01;
-static const float RAMP_MUTE_DURATION_SECS = 0.1;
-static const float RAMP_RESUME_MUTE_DURATION_SECS = 1;
-static const float RAMP_SWITCH_MUTE_DURATION_SECS = 0.5;
-static const float RAMP_VOLUME_CHANGE_DURATION_SECS = 0.1;
-
-/*
- * It is the lastest time for the device to wake up when it is in the normal
- * run state. It represents how many remaining frames in the device buffer.
- */
-static const struct timespec dev_normal_run_wake_up_time = {
-	0, 1 * 1000 * 1000 /* 1 msec. */
-};
-
-/*
- * It is the lastest time for the device to wake up when it is in the no stream
- * state. It represents how many remaining frames in the device buffer.
- */
-static const struct timespec dev_no_stream_wake_up_time = {
-	0, 5 * 1000 * 1000 /* 5 msec. */
-};
-
-/*
- * Check issu b/72496547 and commit message for the history of
- * rate estimator tuning.
- */
-static const struct timespec rate_estimation_window_sz = {
-	5, 0 /* 5 sec. */
-};
-static const double rate_estimation_smooth_factor = 0.3f;
-
-static void cras_iodev_alloc_dsp(struct cras_iodev *iodev);
-
-static int default_no_stream_playback(struct cras_iodev *odev)
-{
-	int rc;
-	unsigned int hw_level, fr_to_write;
-	unsigned int target_hw_level = odev->min_cb_level * 2;
-	struct timespec hw_tstamp;
-
-	/* The default action for no stream playback is to fill zeros. */
-	rc = cras_iodev_frames_queued(odev, &hw_tstamp);
-	if (rc < 0)
-		return rc;
-	hw_level = rc;
-
-	/* If underrun happened, handle underrun and get hw_level again. */
-	if (hw_level == 0) {
-		rc = cras_iodev_output_underrun(odev, hw_level, 0);
-		if (rc < 0)
-			return rc;
-
-		rc = cras_iodev_frames_queued(odev, &hw_tstamp);
-		if (rc < 0)
-			return rc;
-		hw_level = rc;
-	}
-
-	ATLOG(atlog, AUDIO_THREAD_ODEV_DEFAULT_NO_STREAMS, odev->info.idx,
-	      hw_level, target_hw_level);
-
-	fr_to_write = cras_iodev_buffer_avail(odev, hw_level);
-	if (hw_level <= target_hw_level) {
-		fr_to_write = MIN(target_hw_level - hw_level, fr_to_write);
-		return cras_iodev_fill_odev_zeros(odev, fr_to_write);
-	}
-	return 0;
-}
-
-static int cras_iodev_start(struct cras_iodev *iodev)
-{
-	int rc;
-	if (!cras_iodev_is_open(iodev))
-		return -EPERM;
-	if (!iodev->start) {
-		syslog(LOG_ERR,
-		       "start called on device %s not supporting start ops",
-		       iodev->info.name);
-		return -EINVAL;
-	}
-	rc = iodev->start(iodev);
-	if (rc)
-		return rc;
-	iodev->state = CRAS_IODEV_STATE_NORMAL_RUN;
-	return 0;
-}
-
-/* Gets the number of frames ready for this device to play.
- * It is the minimum number of available samples in dev_streams.
- */
-static unsigned int dev_playback_frames(struct cras_iodev *odev)
-{
-	struct dev_stream *curr;
-	int frames = 0;
-
-	DL_FOREACH (odev->streams, curr) {
-		int dev_frames;
-
-		/* Skip stream which hasn't started running yet. */
-		if (!dev_stream_is_running(curr))
-			continue;
-
-		/* If this is a single output dev stream, updates the latest
-		 * number of frames for playback. */
-		if (dev_stream_attached_devs(curr) == 1)
-			dev_stream_update_frames(curr);
-
-		dev_frames = dev_stream_playback_frames(curr);
-		/* Do not handle stream error or end of draining in this
-		 * function because they should be handled in write_streams. */
-		if (dev_frames < 0)
-			continue;
-		if (!dev_frames) {
-			if (cras_rstream_get_is_draining(curr->stream))
-				continue;
-			else
-				return 0;
-		}
-		if (frames == 0)
-			frames = dev_frames;
-		else
-			frames = MIN(dev_frames, frames);
-	}
-	return frames;
-}
-
-/* Let device enter/leave no stream playback.
- * Args:
- *    iodev[in] - The output device.
- *    enable[in] - 1 to enter no stream playback, 0 to leave.
- * Returns:
- *    0 on success. Negative error code on failure.
- */
-static int cras_iodev_no_stream_playback_transition(struct cras_iodev *odev,
-						    int enable)
-{
-	int rc;
-
-	if (odev->direction != CRAS_STREAM_OUTPUT)
-		return -EINVAL;
-
-	/* This function is for transition between normal run and
-	 * no stream run state.
-	 */
-	if ((odev->state != CRAS_IODEV_STATE_NORMAL_RUN) &&
-	    (odev->state != CRAS_IODEV_STATE_NO_STREAM_RUN))
-		return -EINVAL;
-
-	if (enable) {
-		ATLOG(atlog, AUDIO_THREAD_ODEV_NO_STREAMS, odev->info.idx, 0,
-		      0);
-	} else {
-		ATLOG(atlog, AUDIO_THREAD_ODEV_LEAVE_NO_STREAMS, odev->info.idx,
-		      0, 0);
-	}
-
-	rc = odev->no_stream(odev, enable);
-	if (rc < 0)
-		return rc;
-	if (enable)
-		odev->state = CRAS_IODEV_STATE_NO_STREAM_RUN;
-	else
-		odev->state = CRAS_IODEV_STATE_NORMAL_RUN;
-	return 0;
-}
-
-/* Determines if the output device should mute. It considers system mute,
- * system volume, and active node volume on the device. */
-static int output_should_mute(struct cras_iodev *odev)
-{
-	/* System mute has highest priority. */
-	if (cras_system_get_mute())
-		return 1;
-
-	/* consider system volume and active node volume. */
-	return cras_iodev_is_zero_volume(odev);
-}
-
-int cras_iodev_is_zero_volume(const struct cras_iodev *odev)
-{
-	size_t system_volume;
-	unsigned int adjusted_node_volume;
-
-	system_volume = cras_system_get_volume();
-	if (odev->active_node) {
-		adjusted_node_volume = cras_iodev_adjust_node_volume(
-			odev->active_node, system_volume);
-		return (adjusted_node_volume == 0);
-	}
-	return (system_volume == 0);
-}
-
-/* Output device state transition diagram:
- *
- *                           ----------------
- *  -------------<-----------| S0  Closed   |------<-------.
- *  |                        ----------------              |
- *  |                           |   iodev_list enables     |
- *  |                           |   device and adds to     |
- *  |                           V   audio thread           | iodev_list removes
- *  |                        ----------------              | device from
- *  |                        | S1  Open     |              | audio_thread and
- *  |                        ----------------              | closes device
- *  | Device with empty start       |                      |
- *  | ops transits into             | Sample is ready      |
- *  | no stream state right         V                      |
- *  | after open.            ----------------              |
- *  |                        | S2  Normal   |              |
- *  |                        ----------------              |
- *  |                           |        ^                 |
- *  |       There is no stream  |        | Sample is ready |
- *  |                           V        |                 |
- *  |                        ----------------              |
- *  ------------->-----------| S3 No Stream |------->------
- *                           ----------------
- *
- *  Device in open_devs can be in one of S1, S2, S3.
- *
- * cras_iodev_output_event_sample_ready change device state from S1 or S3 into
- * S2.
- */
-static int cras_iodev_output_event_sample_ready(struct cras_iodev *odev)
-{
-	if (odev->state == CRAS_IODEV_STATE_OPEN ||
-	    odev->state == CRAS_IODEV_STATE_NO_STREAM_RUN) {
-		/* Starts ramping up if device should not be muted.
-		 * Both mute and volume are taken into consideration.
-		 */
-		if (odev->ramp && !output_should_mute(odev)) {
-			cras_iodev_start_ramp(odev, odev->initial_ramp_request);
-		}
-	}
-
-	if (odev->state == CRAS_IODEV_STATE_OPEN) {
-		/* S1 => S2:
-		 * If device is not started yet, and there is sample ready from
-		 * stream, fill 1 min_cb_level of zeros first and fill sample
-		 * from stream later.
-		 * Starts the device here to finish state transition. */
-		cras_iodev_fill_odev_zeros(odev, odev->min_cb_level);
-		ATLOG(atlog, AUDIO_THREAD_ODEV_START, odev->info.idx,
-		      odev->min_cb_level, 0);
-		return cras_iodev_start(odev);
-	} else if (odev->state == CRAS_IODEV_STATE_NO_STREAM_RUN) {
-		/* S3 => S2:
-		 * Device in no stream state get sample ready. Leave no stream
-		 * state and transit to normal run state.*/
-		return cras_iodev_no_stream_playback_transition(odev, 0);
-	} else {
-		syslog(LOG_ERR,
-		       "Device %s in state %d received sample ready event",
-		       odev->info.name, odev->state);
-		return -EINVAL;
-	}
-	return 0;
-}
-
-/*
- * Exported Interface.
- */
-
-/* Finds the supported sample rate that best suits the requested rate, "rrate".
- * Exact matches have highest priority, then integer multiples, then the default
- * rate for the device. */
-static size_t get_best_rate(struct cras_iodev *iodev, size_t rrate)
-{
-	size_t i;
-	size_t best;
-
-	if (iodev->supported_rates[0] == 0) /* No rates supported */
-		return 0;
-
-	for (i = 0, best = 0; iodev->supported_rates[i] != 0; i++) {
-		if (rrate == iodev->supported_rates[i] && rrate >= 44100)
-			return rrate;
-		if (best == 0 && (rrate % iodev->supported_rates[i] == 0 ||
-				  iodev->supported_rates[i] % rrate == 0))
-			best = iodev->supported_rates[i];
-	}
-
-	if (best)
-		return best;
-	return iodev->supported_rates[0];
-}
-
-/* Finds the best match for the channel count.  The following match rules
- * will apply in order and return the value once matched:
- * 1. Match the exact given channel count.
- * 2. Match the preferred channel count.
- * 3. The first channel count in the list.
- */
-static size_t get_best_channel_count(struct cras_iodev *iodev, size_t count)
-{
-	static const size_t preferred_channel_count = 2;
-	size_t i;
-
-	assert(iodev->supported_channel_counts[0] != 0);
-
-	for (i = 0; iodev->supported_channel_counts[i] != 0; i++) {
-		if (iodev->supported_channel_counts[i] == count)
-			return count;
-	}
-
-	/* If provided count is not supported, search for preferred
-	 * channel count to which we're good at converting.
-	 */
-	for (i = 0; iodev->supported_channel_counts[i] != 0; i++) {
-		if (iodev->supported_channel_counts[i] ==
-		    preferred_channel_count)
-			return preferred_channel_count;
-	}
-
-	return iodev->supported_channel_counts[0];
-}
-
-/* finds the best match for the current format. If no exact match is
- * found, use the first. */
-static snd_pcm_format_t get_best_pcm_format(struct cras_iodev *iodev,
-					    snd_pcm_format_t fmt)
-{
-	size_t i;
-
-	for (i = 0; iodev->supported_formats[i] != 0; i++) {
-		if (fmt == iodev->supported_formats[i])
-			return fmt;
-	}
-
-	return iodev->supported_formats[0];
-}
-
-/* Applies the DSP to the samples for the iodev if applicable. */
-static int apply_dsp(struct cras_iodev *iodev, uint8_t *buf, size_t frames)
-{
-	struct cras_dsp_context *ctx;
-	struct pipeline *pipeline;
-	int rc;
-
-	ctx = iodev->dsp_context;
-	if (!ctx)
-		return 0;
-
-	pipeline = cras_dsp_get_pipeline(ctx);
-	if (!pipeline)
-		return 0;
-
-	rc = cras_dsp_pipeline_apply(pipeline, buf, iodev->format->format,
-				     frames);
-
-	cras_dsp_put_pipeline(ctx);
-	return rc;
-}
-
-static void cras_iodev_free_dsp(struct cras_iodev *iodev)
-{
-	if (iodev->dsp_context) {
-		cras_dsp_context_free(iodev->dsp_context);
-		iodev->dsp_context = NULL;
-	}
-}
-
-/* Modifies the number of channels in device format to the one that will be
- * presented to the device after any channel changes from the DSP. */
-static inline void adjust_dev_channel_for_dsp(const struct cras_iodev *iodev)
-{
-	struct cras_dsp_context *ctx = iodev->dsp_context;
-
-	if (!ctx || !cras_dsp_get_pipeline(ctx))
-		return;
-
-	if (iodev->direction == CRAS_STREAM_OUTPUT)
-		iodev->format->num_channels = cras_dsp_num_output_channels(ctx);
-	else
-		iodev->format->num_channels = cras_dsp_num_input_channels(ctx);
-
-	cras_dsp_put_pipeline(ctx);
-}
-
-/* Updates channel layout based on the number of channels set by a
- * client stream. Set a default value to format if the update call
- * fails.
- */
-static void update_channel_layout(struct cras_iodev *iodev)
-{
-	int rc;
-
-	if (iodev->update_channel_layout == NULL)
-		return;
-
-	rc = iodev->update_channel_layout(iodev);
-	if (rc < 0)
-		cras_audio_format_set_default_channel_layout(iodev->format);
-}
-
-/*
- * For the specified format, removes any channels from the channel layout that
- * are higher than the supported number of channels. Should be used when the
- * number of channels of the format been reduced.
- */
-static void trim_channel_layout(struct cras_audio_format *fmt)
-{
-	int i;
-	for (i = 0; i < CRAS_CH_MAX; i++)
-		if (fmt->channel_layout[i] >= fmt->num_channels)
-			fmt->channel_layout[i] = -1;
-}
-
-int cras_iodev_set_format(struct cras_iodev *iodev,
-			  const struct cras_audio_format *fmt)
-{
-	size_t actual_rate, actual_num_channels;
-	snd_pcm_format_t actual_format;
-	int rc;
-
-	/* Update supported formats on iodev before negotiating the final value
-	 * with what stream requested.
-	 */
-	if (iodev->update_supported_formats) {
-		rc = iodev->update_supported_formats(iodev);
-		if (rc) {
-			syslog(LOG_ERR, "Failed to update formats");
-			return rc;
-		}
-	}
-
-	/* If this device isn't already using a format, try to match the one
-	 * requested in "fmt". */
-	if (iodev->format == NULL) {
-		iodev->format = malloc(sizeof(struct cras_audio_format));
-		if (!iodev->format)
-			return -ENOMEM;
-		*iodev->format = *fmt;
-
-		/* Finds the actual rate of device before allocating DSP
-		 * because DSP needs to use the rate of device, not rate of
-		 * stream. */
-		actual_rate = get_best_rate(iodev, fmt->frame_rate);
-		iodev->format->frame_rate = actual_rate;
-
-		cras_iodev_alloc_dsp(iodev);
-		cras_iodev_update_dsp(iodev);
-		if (iodev->dsp_context)
-			adjust_dev_channel_for_dsp(iodev);
-
-		actual_num_channels = get_best_channel_count(
-			iodev, iodev->format->num_channels);
-		actual_format = get_best_pcm_format(iodev, fmt->format);
-		if (actual_rate == 0 || actual_num_channels == 0 ||
-		    actual_format == 0) {
-			/* No compatible frame rate found. */
-			rc = -EINVAL;
-			goto error;
-		}
-		iodev->format->format = actual_format;
-		if (iodev->format->num_channels != actual_num_channels) {
-			/* If the DSP for this device doesn't match, drop it. */
-			iodev->format->num_channels = actual_num_channels;
-			trim_channel_layout(iodev->format);
-			cras_iodev_free_dsp(iodev);
-		}
-
-		update_channel_layout(iodev);
-
-		if (!iodev->rate_est)
-			iodev->rate_est = rate_estimator_create(
-				actual_rate, &rate_estimation_window_sz,
-				rate_estimation_smooth_factor);
-		else
-			rate_estimator_reset_rate(iodev->rate_est, actual_rate);
-	}
-
-	return 0;
-
-error:
-	free(iodev->format);
-	iodev->format = NULL;
-	return rc;
-}
-
-/*
- * Configures the external dsp module and adds it to the existing dsp pipeline.
- */
-static void add_ext_dsp_module_to_pipeline(struct cras_iodev *iodev)
-{
-	struct pipeline *pipeline;
-
-	pipeline = iodev->dsp_context ?
-			   cras_dsp_get_pipeline(iodev->dsp_context) :
-			   NULL;
-
-	if (!pipeline) {
-		cras_iodev_alloc_dsp(iodev);
-		cras_dsp_load_mock_pipeline(iodev->dsp_context,
-					    iodev->format->num_channels);
-		pipeline = cras_dsp_get_pipeline(iodev->dsp_context);
-	}
-	/* dsp_context mutex locked. Now it's safe to modify dsp
-	 * pipeline resources. */
-
-	if (iodev->ext_dsp_module)
-		iodev->ext_dsp_module->configure(iodev->ext_dsp_module,
-						 iodev->buffer_size,
-						 iodev->format->num_channels,
-						 iodev->format->frame_rate);
-
-	cras_dsp_pipeline_set_sink_ext_module(pipeline, iodev->ext_dsp_module);
-
-	/* Unlock dsp_context mutex. */
-	cras_dsp_put_pipeline(iodev->dsp_context);
-}
-
-/*
- * Releases the ext_dsp_module if it ever added to iodev's dsp pipeline.
- */
-static void release_ext_dsp_module_from_pipeline(struct cras_iodev *iodev)
-{
-	struct pipeline *pipeline;
-
-	if (iodev->dsp_context == NULL)
-		return;
-
-	pipeline = cras_dsp_get_pipeline(iodev->dsp_context);
-	if (pipeline == NULL)
-		return;
-	/* dsp_context mutex locked. */
-
-	cras_dsp_pipeline_set_sink_ext_module(pipeline, NULL);
-
-	/* Unlock dsp_context mutex. */
-	cras_dsp_put_pipeline(iodev->dsp_context);
-}
-
-void cras_iodev_set_ext_dsp_module(struct cras_iodev *iodev,
-				   struct ext_dsp_module *ext)
-{
-	iodev->ext_dsp_module = ext;
-
-	if (!cras_iodev_is_open(iodev))
-		return;
-
-	if (iodev->ext_dsp_module)
-		add_ext_dsp_module_to_pipeline(iodev);
-	else
-		release_ext_dsp_module_from_pipeline(iodev);
-}
-
-void cras_iodev_update_dsp(struct cras_iodev *iodev)
-{
-	char swap_lr_disabled = 1;
-
-	if (!iodev->dsp_context)
-		return;
-
-	cras_dsp_set_variable_string(iodev->dsp_context, "dsp_name",
-				     iodev->dsp_name ?: "");
-
-	if (iodev->active_node && iodev->active_node->left_right_swapped)
-		swap_lr_disabled = 0;
-
-	cras_dsp_set_variable_boolean(iodev->dsp_context, "swap_lr_disabled",
-				      swap_lr_disabled);
-
-	cras_dsp_load_pipeline(iodev->dsp_context);
-}
-
-int cras_iodev_dsp_set_swap_mode_for_node(struct cras_iodev *iodev,
-					  struct cras_ionode *node, int enable)
-{
-	if (node->left_right_swapped == enable)
-		return 0;
-
-	/* Sets left_right_swapped property on the node. It will be used
-	 * when cras_iodev_update_dsp is called. */
-	node->left_right_swapped = enable;
-
-	/* Possibly updates dsp if the node is active on the device and there
-	 * is dsp context. If dsp context is not created yet,
-	 * cras_iodev_update_dsp returns right away. */
-	if (iodev->active_node == node)
-		cras_iodev_update_dsp(iodev);
-	return 0;
-}
-
-void cras_iodev_free_format(struct cras_iodev *iodev)
-{
-	free(iodev->format);
-	iodev->format = NULL;
-}
-
-void cras_iodev_init_audio_area(struct cras_iodev *iodev, int num_channels)
-{
-	if (iodev->area)
-		cras_iodev_free_audio_area(iodev);
-
-	iodev->area = cras_audio_area_create(num_channels);
-	cras_audio_area_config_channels(iodev->area, iodev->format);
-}
-
-void cras_iodev_free_audio_area(struct cras_iodev *iodev)
-{
-	if (!iodev->area)
-		return;
-
-	cras_audio_area_destroy(iodev->area);
-	iodev->area = NULL;
-}
-
-void cras_iodev_free_resources(struct cras_iodev *iodev)
-{
-	cras_iodev_free_dsp(iodev);
-	rate_estimator_destroy(iodev->rate_est);
-	if (iodev->ramp)
-		cras_ramp_destroy(iodev->ramp);
-}
-
-static void cras_iodev_alloc_dsp(struct cras_iodev *iodev)
-{
-	const char *purpose;
-
-	if (iodev->direction == CRAS_STREAM_OUTPUT)
-		purpose = "playback";
-	else
-		purpose = "capture";
-
-	cras_iodev_free_dsp(iodev);
-	iodev->dsp_context =
-		cras_dsp_context_new(iodev->format->frame_rate, purpose);
-}
-
-void cras_iodev_fill_time_from_frames(size_t frames, size_t frame_rate,
-				      struct timespec *ts)
-{
-	uint64_t to_play_usec;
-
-	ts->tv_sec = 0;
-	/* adjust sleep time to target our callback threshold */
-	to_play_usec = (uint64_t)frames * 1000000L / (uint64_t)frame_rate;
-
-	while (to_play_usec > 1000000) {
-		ts->tv_sec++;
-		to_play_usec -= 1000000;
-	}
-	ts->tv_nsec = to_play_usec * 1000;
-}
-
-/* This is called when a node is plugged/unplugged */
-void cras_iodev_set_node_plugged(struct cras_ionode *node, int plugged)
-{
-	if (node->plugged == plugged)
-		return;
-	node->plugged = plugged;
-	MAINLOG(main_log, MAIN_THREAD_NODE_PLUGGED, node->dev->info.idx,
-		plugged, 0);
-	if (plugged) {
-		gettimeofday(&node->plugged_time, NULL);
-	} else if (node == node->dev->active_node) {
-		/*
-		 * Remove normal and pinned streams, when node unplugged.
-		 * TODO(hychao): clean this up, per crbug.com/1006646
-		 */
-		cras_iodev_list_disable_dev(node->dev, true);
-	}
-	cras_iodev_list_notify_nodes_changed();
-}
-
-void cras_iodev_add_node(struct cras_iodev *iodev, struct cras_ionode *node)
-{
-	DL_APPEND(iodev->nodes, node);
-	cras_iodev_list_notify_nodes_changed();
-}
-
-void cras_iodev_rm_node(struct cras_iodev *iodev, struct cras_ionode *node)
-{
-	DL_DELETE(iodev->nodes, node);
-	cras_iodev_list_notify_nodes_changed();
-}
-
-void cras_iodev_set_active_node(struct cras_iodev *iodev,
-				struct cras_ionode *node)
-{
-	iodev->active_node = node;
-	cras_iodev_list_notify_active_node_changed(iodev->direction);
-}
-
-bool cras_iodev_is_aec_use_case(const struct cras_ionode *node)
-{
-	if ((node->type == CRAS_NODE_TYPE_INTERNAL_SPEAKER) ||
-	    (node->type == CRAS_NODE_TYPE_ECHO_REFERENCE))
-		return true;
-
-	if (node->type == CRAS_NODE_TYPE_MIC)
-		return (node->position == NODE_POSITION_INTERNAL) ||
-		       (node->position == NODE_POSITION_FRONT);
-
-	return false;
-}
-
-bool cras_iodev_is_on_internal_card(const struct cras_ionode *node)
-{
-	if (node->type == CRAS_NODE_TYPE_INTERNAL_SPEAKER)
-		return true;
-	if (node->type == CRAS_NODE_TYPE_HEADPHONE)
-		return true;
-	if (node->type == CRAS_NODE_TYPE_MIC)
-		return true;
-	return false;
-}
-
-float cras_iodev_get_software_volume_scaler(struct cras_iodev *iodev)
-{
-	unsigned int volume;
-
-	volume = cras_iodev_adjust_active_node_volume(iodev,
-						      cras_system_get_volume());
-
-	if (iodev->active_node && iodev->active_node->softvol_scalers)
-		return iodev->active_node->softvol_scalers[volume];
-	return softvol_get_scaler(volume);
-}
-
-float cras_iodev_get_software_gain_scaler(const struct cras_iodev *iodev)
-{
-	if (cras_iodev_software_volume_needed(iodev))
-		return convert_softvol_scaler_from_dB(
-			iodev->active_node->capture_gain);
-	return 1.0f;
-}
-
-int cras_iodev_get_valid_frames(struct cras_iodev *odev,
-				struct timespec *hw_tstamp)
-{
-	int rc;
-
-	if (odev->direction != CRAS_STREAM_OUTPUT)
-		return -EINVAL;
-
-	if (odev->get_valid_frames) {
-		rc = odev->get_valid_frames(odev, hw_tstamp);
-		if (rc < 0)
-			return rc;
-
-		if (rc < odev->min_buffer_level)
-			return 0;
-
-		return rc - odev->min_buffer_level;
-	} else {
-		return cras_iodev_frames_queued(odev, hw_tstamp);
-	}
-}
-
-int cras_iodev_add_stream(struct cras_iodev *iodev, struct dev_stream *stream)
-{
-	/*
-	 * For input stream, start stream right after adding stream.
-	 * For output stream, start stream after its first fetch such that it does not
-	 * block other existing streams.
-	 */
-	DL_APPEND(iodev->streams, stream);
-	if (!iodev->buf_state)
-		iodev->buf_state = buffer_share_create(iodev->buffer_size);
-	if (stream->stream->direction == CRAS_STREAM_INPUT)
-		cras_iodev_start_stream(iodev, stream);
-	return 0;
-}
-
-void cras_iodev_start_stream(struct cras_iodev *iodev,
-			     struct dev_stream *stream)
-{
-	unsigned int cb_threshold = dev_stream_cb_threshold(stream);
-
-	if (dev_stream_is_running(stream))
-		return;
-	/*
-	 * TRIGGER_ONLY streams do not want to receive data, so do not add them
-	 * to buffer_share, otherwise they'll affect other streams to receive.
-	 */
-	if (!(stream->stream->flags & TRIGGER_ONLY))
-		buffer_share_add_id(iodev->buf_state, stream->stream->stream_id,
-				    NULL);
-	iodev->min_cb_level = MIN(iodev->min_cb_level, cb_threshold);
-	iodev->max_cb_level = MAX(iodev->max_cb_level, cb_threshold);
-	iodev->largest_cb_level = MAX(iodev->largest_cb_level, cb_threshold);
-	dev_stream_set_running(stream);
-}
-
-struct dev_stream *cras_iodev_rm_stream(struct cras_iodev *iodev,
-					const struct cras_rstream *rstream)
-{
-	struct dev_stream *out;
-	struct dev_stream *ret = NULL;
-	unsigned int cb_threshold;
-	struct timespec earliest_next_cb_ts;
-	int set_earliest = 0;
-
-	iodev->min_cb_level = iodev->buffer_size / 2;
-	iodev->max_cb_level = 0;
-	DL_FOREACH (iodev->streams, out) {
-		if (out->stream == rstream) {
-			buffer_share_rm_id(iodev->buf_state,
-					   rstream->stream_id);
-			ret = out;
-			DL_DELETE(iodev->streams, out);
-			continue;
-		}
-		if (!dev_stream_is_running(out))
-			continue;
-		cb_threshold = dev_stream_cb_threshold(out);
-		iodev->min_cb_level = MIN(iodev->min_cb_level, cb_threshold);
-		iodev->max_cb_level = MAX(iodev->max_cb_level, cb_threshold);
-		if (!set_earliest) {
-			set_earliest = 1;
-			earliest_next_cb_ts = out->stream->next_cb_ts;
-		}
-		if (timespec_after(&earliest_next_cb_ts,
-				   &out->stream->next_cb_ts))
-			earliest_next_cb_ts = out->stream->next_cb_ts;
-	}
-
-	if (!iodev->streams) {
-		buffer_share_destroy(iodev->buf_state);
-		iodev->buf_state = NULL;
-		iodev->min_cb_level = iodev->buffer_size / 2;
-		/* Let output device transit into no stream state if it's
-		 * in normal run state now. Leave input device in normal
-		 * run state. */
-		if ((iodev->direction == CRAS_STREAM_OUTPUT) &&
-		    (iodev->state == CRAS_IODEV_STATE_NORMAL_RUN))
-			cras_iodev_no_stream_playback_transition(iodev, 1);
-	}
-
-	if (!set_earliest)
-		return ret;
-
-	DL_FOREACH (iodev->streams, out) {
-		if (!dev_stream_is_running(out))
-			out->stream->next_cb_ts = earliest_next_cb_ts;
-	}
-
-	return ret;
-}
-
-unsigned int cras_iodev_stream_offset(struct cras_iodev *iodev,
-				      struct dev_stream *stream)
-{
-	return buffer_share_id_offset(iodev->buf_state,
-				      stream->stream->stream_id);
-}
-
-void cras_iodev_stream_written(struct cras_iodev *iodev,
-			       struct dev_stream *stream, unsigned int nwritten)
-{
-	buffer_share_offset_update(iodev->buf_state, stream->stream->stream_id,
-				   nwritten);
-}
-
-unsigned int cras_iodev_all_streams_written(struct cras_iodev *iodev)
-{
-	if (!iodev->buf_state)
-		return 0;
-	return buffer_share_get_new_write_point(iodev->buf_state);
-}
-
-unsigned int cras_iodev_max_stream_offset(const struct cras_iodev *iodev)
-{
-	unsigned int max = 0;
-	struct dev_stream *curr;
-
-	DL_FOREACH (iodev->streams, curr) {
-		/* Skip stream which hasn't started running yet. */
-		if (!dev_stream_is_running(curr))
-			continue;
-
-		max = MAX(max, buffer_share_id_offset(iodev->buf_state,
-						      curr->stream->stream_id));
-	}
-
-	return max;
-}
-
-int cras_iodev_open(struct cras_iodev *iodev, unsigned int cb_level,
-		    const struct cras_audio_format *fmt)
-{
-	struct cras_loopback *loopback;
-	int rc;
-
-	if (iodev->pre_open_iodev_hook)
-		iodev->pre_open_iodev_hook();
-
-	DL_FOREACH (iodev->loopbacks, loopback) {
-		if (loopback->hook_control)
-			loopback->hook_control(true, loopback->cb_data);
-	}
-
-	if (iodev->open_dev) {
-		rc = iodev->open_dev(iodev);
-		if (rc)
-			return rc;
-	}
-
-	if (iodev->format == NULL) {
-		rc = cras_iodev_set_format(iodev, fmt);
-		if (rc) {
-			iodev->close_dev(iodev);
-			return rc;
-		}
-	}
-
-	rc = iodev->configure_dev(iodev);
-	if (rc < 0) {
-		iodev->close_dev(iodev);
-		return rc;
-	}
-
-	/*
-	 * Convert cb_level from input format to device format
-	 */
-	cb_level = cras_frames_at_rate(fmt->frame_rate, cb_level,
-				       iodev->format->frame_rate);
-	/* Make sure the min_cb_level doesn't get too large. */
-	iodev->min_cb_level = MIN(iodev->buffer_size / 2, cb_level);
-	iodev->max_cb_level = 0;
-	iodev->largest_cb_level = 0;
-	iodev->num_underruns = 0;
-
-	iodev->reset_request_pending = 0;
-	iodev->state = CRAS_IODEV_STATE_OPEN;
-	iodev->highest_hw_level = 0;
-	iodev->input_dsp_offset = 0;
-
-	ewma_power_init(&iodev->ewma, iodev->format->frame_rate);
-
-	if (iodev->direction == CRAS_STREAM_OUTPUT) {
-		/* If device supports start ops, device can be in open state.
-		 * Otherwise, device starts running right after opening. */
-		if (iodev->start) {
-			iodev->state = CRAS_IODEV_STATE_OPEN;
-		} else {
-			iodev->state = CRAS_IODEV_STATE_NO_STREAM_RUN;
-			cras_iodev_fill_odev_zeros(iodev, iodev->min_cb_level);
-		}
-	} else {
-		iodev->input_data = input_data_create(iodev);
-		/* If this is the echo reference dev, its ext_dsp_module will
-		 * be set to APM reverse module. Do not override it to its
-		 * input data. */
-		if (iodev->ext_dsp_module == NULL)
-			iodev->ext_dsp_module = &iodev->input_data->ext;
-
-		/* Input device starts running right after opening.
-		 * No stream state is only for output device. Input device
-		 * should be in normal run state. */
-		iodev->state = CRAS_IODEV_STATE_NORMAL_RUN;
-		/* Initialize the input_streaming flag to zero.*/
-		iodev->input_streaming = 0;
-
-		/*
-		 * The device specific gain scaler to be used in audio thread.
-		 * It's expected to stick to 1.0f if device has hardware gain
-		 * control. For alsa device, this gain value will be configured
-		 * based on UCM labels IntrinsicSensitivity.
-		 */
-		iodev->software_gain_scaler =
-			cras_iodev_get_software_gain_scaler(iodev);
-	}
-
-	add_ext_dsp_module_to_pipeline(iodev);
-	clock_gettime(CLOCK_MONOTONIC_RAW, &iodev->open_ts);
-
-	return 0;
-}
-
-enum CRAS_IODEV_STATE cras_iodev_state(const struct cras_iodev *iodev)
-{
-	return iodev->state;
-}
-
-int cras_iodev_close(struct cras_iodev *iodev)
-{
-	struct cras_loopback *loopback;
-	int rc;
-
-	if (!cras_iodev_is_open(iodev))
-		return 0;
-
-	if (iodev->active_node) {
-		cras_server_metrics_device_runtime(iodev);
-		cras_server_metrics_device_gain(iodev);
-		cras_server_metrics_device_volume(iodev);
-	}
-
-	if (iodev->input_data) {
-		if (iodev->ext_dsp_module == &iodev->input_data->ext)
-			iodev->ext_dsp_module = NULL;
-		input_data_destroy(&iodev->input_data);
-	}
-
-	rc = iodev->close_dev(iodev);
-	if (rc)
-		syslog(LOG_ERR, "Error closing dev %s, rc %d", iodev->info.name,
-		       rc);
-	iodev->state = CRAS_IODEV_STATE_CLOSE;
-	if (iodev->ramp)
-		cras_ramp_reset(iodev->ramp);
-
-	if (iodev->post_close_iodev_hook)
-		iodev->post_close_iodev_hook();
-
-	DL_FOREACH (iodev->loopbacks, loopback) {
-		if (loopback->hook_control)
-			loopback->hook_control(false, loopback->cb_data);
-	}
-
-	return 0;
-}
-
-int cras_iodev_put_input_buffer(struct cras_iodev *iodev)
-{
-	unsigned int min_frames;
-	unsigned int dsp_frames;
-	struct input_data *data = iodev->input_data;
-	int rc;
-
-	if (iodev->streams)
-		min_frames = buffer_share_get_new_write_point(iodev->buf_state);
-	else
-		min_frames = data->area->frames;
-
-	// Update the max number of frames has applied input dsp.
-	dsp_frames = MAX(iodev->input_frames_read, iodev->input_dsp_offset);
-	iodev->input_dsp_offset = dsp_frames - min_frames;
-
-	input_data_set_all_streams_read(data, min_frames);
-	rate_estimator_add_frames(iodev->rate_est, -min_frames);
-	rc = iodev->put_buffer(iodev, min_frames);
-	if (rc < 0)
-		return rc;
-	return min_frames;
-}
-
-int cras_iodev_put_output_buffer(struct cras_iodev *iodev, uint8_t *frames,
-				 unsigned int nframes, int *is_non_empty,
-				 struct cras_fmt_conv *remix_converter)
-{
-	const struct cras_audio_format *fmt = iodev->format;
-	struct cras_ramp_action ramp_action = {
-		.type = CRAS_RAMP_ACTION_NONE,
-		.scaler = 0.0f,
-		.increment = 0.0f,
-		.target = 1.0f,
-	};
-	float software_volume_scaler = 1.0;
-	int software_volume_needed = cras_iodev_software_volume_needed(iodev);
-	int rc;
-	struct cras_loopback *loopback;
-
-	/* Calculate whether the final output was non-empty, if requested. */
-	if (is_non_empty) {
-		const size_t bytes = nframes * cras_get_format_bytes(fmt);
-
-		/*
-		 * Speed up checking frames are all zeros using memcmp.
-		 * frames contains all zeros if both conditions are met:
-		 *  - frames[0] is 0.
-		 *  - frames[i] == frames[i+1] for i in [0, 1, ..., bytes - 2].
-		 */
-		*is_non_empty = bytes ? (*frames || memcmp(frames, frames + 1,
-							   bytes - 1)) :
-					0;
-	}
-
-	DL_FOREACH (iodev->loopbacks, loopback) {
-		if (loopback->type == LOOPBACK_POST_MIX_PRE_DSP)
-			loopback->hook_data(frames, nframes, iodev->format,
-					    loopback->cb_data);
-	}
-
-	ewma_power_calculate(&iodev->ewma, (int16_t *)frames,
-			     iodev->format->num_channels, nframes);
-
-	rc = apply_dsp(iodev, frames, nframes);
-	if (rc)
-		return rc;
-
-	DL_FOREACH (iodev->loopbacks, loopback) {
-		if (loopback->type == LOOPBACK_POST_DSP)
-			loopback->hook_data(frames, nframes, iodev->format,
-					    loopback->cb_data);
-	}
-
-	if (iodev->ramp) {
-		ramp_action = cras_ramp_get_current_action(iodev->ramp);
-	}
-
-	/* Mute samples if adjusted volume is 0 or system is muted, plus
-	 * that this device is not ramping. */
-	if (output_should_mute(iodev) &&
-	    ramp_action.type != CRAS_RAMP_ACTION_PARTIAL) {
-		const unsigned int frame_bytes = cras_get_format_bytes(fmt);
-		cras_mix_mute_buffer(frames, frame_bytes, nframes);
-	}
-
-	/* Compute scaler for software volume if needed. */
-	if (software_volume_needed) {
-		software_volume_scaler =
-			cras_iodev_get_software_volume_scaler(iodev);
-	}
-
-	if (ramp_action.type == CRAS_RAMP_ACTION_PARTIAL) {
-		/* Scale with increment for ramp and possibly
-		 * software volume using cras_scale_buffer_increment.*/
-		float starting_scaler = ramp_action.scaler;
-		float increment = ramp_action.increment;
-		float target = ramp_action.target;
-
-		if (software_volume_needed) {
-			starting_scaler *= software_volume_scaler;
-			increment *= software_volume_scaler;
-			target *= software_volume_scaler;
-		}
-
-		cras_scale_buffer_increment(fmt->format, frames, nframes,
-					    starting_scaler, increment, target,
-					    fmt->num_channels);
-		cras_ramp_update_ramped_frames(iodev->ramp, nframes);
-	} else if (!output_should_mute(iodev) && software_volume_needed) {
-		/* Just scale for software volume using
-		 * cras_scale_buffer. */
-		unsigned int nsamples = nframes * fmt->num_channels;
-		cras_scale_buffer(fmt->format, frames, nsamples,
-				  software_volume_scaler);
-	}
-
-	if (remix_converter)
-		cras_channel_remix_convert(remix_converter, iodev->format,
-					   frames, nframes);
-	if (iodev->rate_est)
-		rate_estimator_add_frames(iodev->rate_est, nframes);
-
-	return iodev->put_buffer(iodev, nframes);
-}
-
-int cras_iodev_get_input_buffer(struct cras_iodev *iodev, unsigned int *frames)
-{
-	const unsigned int frame_bytes = cras_get_format_bytes(iodev->format);
-	struct input_data *data = iodev->input_data;
-	int rc;
-	uint8_t *hw_buffer;
-	unsigned frame_requested = *frames;
-
-	rc = iodev->get_buffer(iodev, &data->area, frames);
-	if (rc < 0 || *frames == 0)
-		return rc;
-
-	if (*frames > frame_requested) {
-		syslog(LOG_ERR,
-		       "frames returned from get_buffer is greater than "
-		       "requested: %u > %u",
-		       *frames, frame_requested);
-		return -EINVAL;
-	}
-
-	iodev->input_frames_read = *frames;
-
-	/* TODO(hychao) - This assumes interleaved audio. */
-	hw_buffer = data->area->channels[0].buf;
-
-	/*
-	 * input_dsp_offset records the position where input dsp has applied to
-	 * last time. It's possible the requested |frames| count is smaller
-	 * than the tracked offset. That could happen when client stream uses
-	 * small buffer size and runs APM processing (which requires 10 ms
-	 * equivalent of data to process).
-	 * Only apply input dsp to the part of read buffer beyond where we've
-	 * already applied dsp.
-	 */
-	if (*frames > iodev->input_dsp_offset) {
-		rc = apply_dsp(iodev,
-			       hw_buffer +
-				       iodev->input_dsp_offset * frame_bytes,
-			       *frames - iodev->input_dsp_offset);
-		if (rc)
-			return rc;
-		ewma_power_calculate_area(
-			&iodev->ewma,
-			(int16_t *)(hw_buffer +
-				    iodev->input_dsp_offset * frame_bytes),
-			data->area, *frames - iodev->input_dsp_offset);
-	}
-
-	if (cras_system_get_capture_mute())
-		cras_mix_mute_buffer(hw_buffer, frame_bytes, *frames);
-
-	return rc;
-}
-
-int cras_iodev_get_output_buffer(struct cras_iodev *iodev,
-				 struct cras_audio_area **area,
-				 unsigned *frames)
-{
-	int rc;
-	unsigned frame_requested = *frames;
-
-	rc = iodev->get_buffer(iodev, area, frames);
-	if (*frames > frame_requested) {
-		syslog(LOG_ERR,
-		       "frames returned from get_buffer is greater than "
-		       "requested: %u > %u",
-		       *frames, frame_requested);
-		return -EINVAL;
-	}
-	return rc;
-}
-
-int cras_iodev_update_rate(struct cras_iodev *iodev, unsigned int level,
-			   struct timespec *level_tstamp)
-{
-	/* If output underruns, reset to avoid incorrect estimated rate. */
-	if ((iodev->direction == CRAS_STREAM_OUTPUT) && !level)
-		rate_estimator_reset_rate(iodev->rate_est,
-					  iodev->format->frame_rate);
-
-	return rate_estimator_check(iodev->rate_est, level, level_tstamp);
-}
-
-int cras_iodev_reset_rate_estimator(const struct cras_iodev *iodev)
-{
-	rate_estimator_reset_rate(iodev->rate_est, iodev->format->frame_rate);
-	return 0;
-}
-
-double cras_iodev_get_est_rate_ratio(const struct cras_iodev *iodev)
-{
-	return rate_estimator_get_rate(iodev->rate_est) /
-	       iodev->format->frame_rate;
-}
-
-int cras_iodev_get_dsp_delay(const struct cras_iodev *iodev)
-{
-	struct cras_dsp_context *ctx;
-	struct pipeline *pipeline;
-	int delay;
-
-	ctx = iodev->dsp_context;
-	if (!ctx)
-		return 0;
-
-	pipeline = cras_dsp_get_pipeline(ctx);
-	if (!pipeline)
-		return 0;
-
-	delay = cras_dsp_pipeline_get_delay(pipeline);
-
-	cras_dsp_put_pipeline(ctx);
-	return delay;
-}
-
-int cras_iodev_frames_queued(struct cras_iodev *iodev,
-			     struct timespec *hw_tstamp)
-{
-	int rc;
-
-	rc = iodev->frames_queued(iodev, hw_tstamp);
-	if (rc < 0)
-		return rc;
-
-	if (iodev->direction == CRAS_STREAM_INPUT) {
-		if (rc > 0)
-			iodev->input_streaming = 1;
-		return rc;
-	}
-
-	if (rc < iodev->min_buffer_level)
-		return 0;
-
-	return rc - iodev->min_buffer_level;
-}
-
-int cras_iodev_buffer_avail(struct cras_iodev *iodev, unsigned hw_level)
-{
-	if (iodev->direction == CRAS_STREAM_INPUT)
-		return hw_level;
-
-	if (hw_level + iodev->min_buffer_level > iodev->buffer_size)
-		return 0;
-
-	return iodev->buffer_size - iodev->min_buffer_level - hw_level;
-}
-
-int cras_iodev_fill_odev_zeros(struct cras_iodev *odev, unsigned int frames)
-{
-	struct cras_audio_area *area = NULL;
-	unsigned int frame_bytes, frames_written;
-	int rc;
-	uint8_t *buf;
-
-	if (odev->direction != CRAS_STREAM_OUTPUT)
-		return -EINVAL;
-
-	ATLOG(atlog, AUDIO_THREAD_FILL_ODEV_ZEROS, odev->info.idx, frames, 0);
-
-	frame_bytes = cras_get_format_bytes(odev->format);
-	while (frames > 0) {
-		frames_written = frames;
-		rc = cras_iodev_get_output_buffer(odev, &area, &frames_written);
-		if (rc < 0) {
-			syslog(LOG_ERR, "fill zeros fail: %d", rc);
-			return rc;
-		}
-
-		/* This assumes consecutive channel areas. */
-		buf = area->channels[0].buf;
-		memset(buf, 0, (size_t)frames_written * (size_t)frame_bytes);
-		cras_iodev_put_output_buffer(odev, buf, frames_written, NULL,
-					     NULL);
-		frames -= frames_written;
-	}
-
-	return 0;
-}
-
-int cras_iodev_output_underrun(struct cras_iodev *odev, unsigned int hw_level,
-			       unsigned int frames_written)
-{
-	ATLOG(atlog, AUDIO_THREAD_UNDERRUN, odev->info.idx, hw_level,
-	      frames_written);
-	odev->num_underruns++;
-	cras_audio_thread_event_underrun();
-	if (odev->output_underrun)
-		return odev->output_underrun(odev);
-	else
-		return cras_iodev_fill_odev_zeros(odev, odev->min_cb_level);
-}
-
-int cras_iodev_odev_should_wake(const struct cras_iodev *odev)
-{
-	if (odev->direction != CRAS_STREAM_OUTPUT)
-		return 0;
-
-	if (odev->is_free_running && odev->is_free_running(odev))
-		return 0;
-
-	/* Do not wake up for device not started yet. */
-	return (odev->state == CRAS_IODEV_STATE_NORMAL_RUN ||
-		odev->state == CRAS_IODEV_STATE_NO_STREAM_RUN);
-}
-
-unsigned int
-cras_iodev_default_frames_to_play_in_sleep(struct cras_iodev *odev,
-					   unsigned int *hw_level,
-					   struct timespec *hw_tstamp)
-{
-	int rc = cras_iodev_frames_queued(odev, hw_tstamp);
-	unsigned int level = (rc < 0) ? 0 : rc;
-	unsigned int wakeup_frames;
-	*hw_level = level;
-
-	if (odev->streams) {
-		/*
-		 * We have two cases in this scope. The first one is if there are frames
-		 * waiting to be played, audio thread will wake up when hw_level drops
-		 * to min_cb_level. This situation only happens when hardware buffer is
-		 * smaller than the client stream buffer. The second one is waking up
-		 * when hw_level drops to dev_normal_run_wake_up_time. It is a default
-		 * behavior. This wake up time is the bottom line to avoid underrun.
-		 * Normally, the audio thread does not wake up at that time because the
-		 * streams should wake it up before then.
-		 */
-		if (*hw_level > odev->min_cb_level && dev_playback_frames(odev))
-			return *hw_level - odev->min_cb_level;
-
-		wakeup_frames = cras_time_to_frames(
-			&dev_normal_run_wake_up_time, odev->format->frame_rate);
-		if (level > wakeup_frames)
-			return level - wakeup_frames;
-		else
-			return level;
-	}
-
-	/*
-	 * When this device has no stream, schedule audio thread to wake up when
-	 * hw_level drops to dev_no_stream_wake_up_time so audio thread can
-	 * fill zeros to it. We also need to consider min_cb_level in order to avoid
-	 * busyloop when device buffer size is smaller than wake up time.
-	 */
-	wakeup_frames = cras_time_to_frames(&dev_no_stream_wake_up_time,
-					    odev->format->frame_rate);
-	if (level > MIN(odev->min_cb_level, wakeup_frames))
-		return level - MIN(odev->min_cb_level, wakeup_frames);
-	else
-		return 0;
-}
-
-unsigned int cras_iodev_frames_to_play_in_sleep(struct cras_iodev *odev,
-						unsigned int *hw_level,
-						struct timespec *hw_tstamp)
-{
-	/* Use odev's own implementation, if not supported then fall back
-	 * to default behavior below. */
-	if (odev->frames_to_play_in_sleep)
-		return odev->frames_to_play_in_sleep(odev, hw_level, hw_tstamp);
-	else
-		return cras_iodev_default_frames_to_play_in_sleep(
-			odev, hw_level, hw_tstamp);
-}
-
-int cras_iodev_default_no_stream_playback(struct cras_iodev *odev, int enable)
-{
-	if (enable)
-		return default_no_stream_playback(odev);
-	return 0;
-}
-
-int cras_iodev_prepare_output_before_write_samples(struct cras_iodev *odev)
-{
-	int may_enter_normal_run;
-	enum CRAS_IODEV_STATE state;
-
-	if (odev->direction != CRAS_STREAM_OUTPUT)
-		return -EINVAL;
-
-	state = cras_iodev_state(odev);
-
-	may_enter_normal_run = (state == CRAS_IODEV_STATE_OPEN ||
-				state == CRAS_IODEV_STATE_NO_STREAM_RUN);
-
-	if (may_enter_normal_run && dev_playback_frames(odev))
-		return cras_iodev_output_event_sample_ready(odev);
-
-	/* no_stream ops is called every cycle in no_stream state. */
-	if (state == CRAS_IODEV_STATE_NO_STREAM_RUN)
-		return odev->no_stream(odev, 1);
-
-	return 0;
-}
-
-unsigned int cras_iodev_get_num_underruns(const struct cras_iodev *iodev)
-{
-	return iodev->num_underruns;
-}
-
-unsigned int cras_iodev_get_num_severe_underruns(const struct cras_iodev *iodev)
-{
-	if (iodev->get_num_severe_underruns)
-		return iodev->get_num_severe_underruns(iodev);
-	return 0;
-}
-
-int cras_iodev_reset_request(struct cras_iodev *iodev)
-{
-	/* Ignore requests if there is a pending request.
-	 * This function sends the request from audio thread to main
-	 * thread when audio thread finds a device is in a bad state
-	 * e.g. severe underrun. Before main thread receives the
-	 * request and resets device, audio thread might try to send
-	 * multiple requests because it finds device is still in bad
-	 * state. We should ignore requests in this cause. Otherwise,
-	 * main thread will reset device multiple times.
-	 * The flag is cleared in cras_iodev_open.
-	 * */
-	if (iodev->reset_request_pending)
-		return 0;
-	iodev->reset_request_pending = 1;
-	return cras_device_monitor_reset_device(iodev->info.idx);
-}
-
-static void ramp_down_mute_callback(void *data)
-{
-	struct cras_iodev *odev = (struct cras_iodev *)data;
-	cras_device_monitor_set_device_mute_state(odev->info.idx);
-}
-
-/* Used in audio thread. Check the docstrings of CRAS_IODEV_RAMP_REQUEST. */
-int cras_iodev_start_ramp(struct cras_iodev *odev,
-			  enum CRAS_IODEV_RAMP_REQUEST request)
-{
-	cras_ramp_cb cb = NULL;
-	void *cb_data = NULL;
-	int rc;
-	float from, to, duration_secs;
-
-	/* Ignores request if device is closed. */
-	if (!cras_iodev_is_open(odev))
-		return 0;
-
-	switch (request) {
-	case CRAS_IODEV_RAMP_REQUEST_UP_UNMUTE:
-		from = 0.0;
-		to = 1.0;
-		duration_secs = RAMP_UNMUTE_DURATION_SECS;
-		break;
-	case CRAS_IODEV_RAMP_REQUEST_UP_START_PLAYBACK:
-		from = 0.0;
-		to = 1.0;
-		duration_secs = RAMP_NEW_STREAM_DURATION_SECS;
-		break;
-	/* Unmute -> mute. Callback to set mute state should be called after
-	 * ramping is done. */
-	case CRAS_IODEV_RAMP_REQUEST_DOWN_MUTE:
-		from = 1.0;
-		to = 0.0;
-		duration_secs = RAMP_MUTE_DURATION_SECS;
-		cb = ramp_down_mute_callback;
-		cb_data = (void *)odev;
-		break;
-	case CRAS_IODEV_RAMP_REQUEST_RESUME_MUTE:
-		from = 0;
-		to = 0;
-		duration_secs = RAMP_RESUME_MUTE_DURATION_SECS;
-		odev->initial_ramp_request =
-			CRAS_IODEV_RAMP_REQUEST_UP_START_PLAYBACK;
-		break;
-	case CRAS_IODEV_RAMP_REQUEST_SWITCH_MUTE:
-		from = 0;
-		to = 0;
-		duration_secs = RAMP_SWITCH_MUTE_DURATION_SECS;
-		odev->initial_ramp_request =
-			CRAS_IODEV_RAMP_REQUEST_UP_START_PLAYBACK;
-		break;
-	default:
-		return -EINVAL;
-	}
-
-	/* Starts ramping. */
-	rc = cras_mute_ramp_start(odev->ramp, from, to,
-				  duration_secs * odev->format->frame_rate, cb,
-				  cb_data);
-
-	if (rc)
-		return rc;
-
-	/* Mute -> unmute case, unmute state should be set after ramping is
-	 * started so device can start playing with samples close to 0. */
-	if (request == CRAS_IODEV_RAMP_REQUEST_UP_UNMUTE)
-		cras_device_monitor_set_device_mute_state(odev->info.idx);
-
-	return 0;
-}
-
-int cras_iodev_start_volume_ramp(struct cras_iodev *odev,
-				 unsigned int old_volume,
-				 unsigned int new_volume)
-{
-	float old_scaler, new_scaler;
-	float from, to;
-
-	if (old_volume == new_volume)
-		return 0;
-	if (!cras_iodev_is_open(odev))
-		return 0;
-	if (!odev->format)
-		return -EINVAL;
-	if (odev->active_node && odev->active_node->softvol_scalers) {
-		old_scaler = odev->active_node->softvol_scalers[old_volume];
-		new_scaler = odev->active_node->softvol_scalers[new_volume];
-	} else {
-		old_scaler = softvol_get_scaler(old_volume);
-		new_scaler = softvol_get_scaler(new_volume);
-	}
-	if (new_scaler == 0.0) {
-		return -EINVAL;
-	}
-	/* We will soon set odev's volume to new_volume from old_volume.
-	 * Because we're using softvol, we were previously scaling our volume by
-	 * old_scaler. If we want to avoid a jump in volume, we need to start
-	 * our ramp so that (from * new_scaler) = old_scaler. */
-	from = old_scaler / new_scaler;
-	to = 1.0;
-
-	return cras_volume_ramp_start(odev->ramp, from, to,
-				      RAMP_VOLUME_CHANGE_DURATION_SECS *
-					      odev->format->frame_rate,
-				      NULL, NULL);
-}
-
-int cras_iodev_set_mute(struct cras_iodev *iodev)
-{
-	if (!cras_iodev_is_open(iodev))
-		return 0;
-
-	if (iodev->set_mute)
-		iodev->set_mute(iodev);
-	return 0;
-}
-
-void cras_iodev_update_highest_hw_level(struct cras_iodev *iodev,
-					unsigned int hw_level)
-{
-	/*
-	 * If the hw_level is unreasonably high and reach to the device's
-	 * buffer size, regard it as a device overrun.
-	 * In the normal status, the hw_level for should be between 1 to 2
-	 * largest_cb_level for an output device and 0 to 1 largest_cb_level
-	 * for an input device. Therefore, larger than 3 can be considered
-	 * unreasonable.
-	 */
-	if (hw_level == iodev->buffer_size &&
-	    iodev->largest_cb_level * 3 < iodev->buffer_size) {
-		ATLOG(atlog, AUDIO_THREAD_DEV_OVERRUN, iodev->info.idx,
-		      hw_level, 0);
-		/* Only log the event when the first time it happens. */
-		if (iodev->highest_hw_level != hw_level)
-			cras_audio_thread_event_dev_overrun();
-	}
-	iodev->highest_hw_level = MAX(iodev->highest_hw_level, hw_level);
-}
-
-/*
- * Makes an input device drop the given number of frames.
- * Args:
- *    iodev - The device.
- *    frames - How many frames will be dropped in a device.
- * Returns:
- *    The number of frames have been dropped. Negative error code on failure.
- */
-static int cras_iodev_drop_frames(struct cras_iodev *iodev, unsigned int frames)
-{
-	struct timespec hw_tstamp;
-	int i, rc;
-	unsigned int target_frames, dropped_frames = 0;
-
-	if (iodev->direction != CRAS_STREAM_INPUT)
-		return -EINVAL;
-
-	rc = cras_iodev_frames_queued(iodev, &hw_tstamp);
-	if (rc < 0)
-		return rc;
-
-	target_frames = MIN(frames, rc);
-
-	/*
-	 * Loop reading the buffer, at most twice. This is to cover when
-	 * circular buffer is at the end and returns partial of the target
-	 * frames.
-	 */
-	for (i = 0; (dropped_frames < target_frames) && (i < 2); i++) {
-		frames = target_frames - dropped_frames;
-		rc = iodev->get_buffer(iodev, &iodev->input_data->area,
-				       &frames);
-		if (rc < 0)
-			return rc;
-
-		rc = iodev->put_buffer(iodev, frames);
-		if (rc < 0)
-			return rc;
-		dropped_frames += frames;
-		/*
-		 * Tell rate estimator that some frames have been dropped to
-		 * avoid calculating the wrong rate.
-		 */
-		rate_estimator_add_frames(iodev->rate_est, -frames);
-	}
-
-	ATLOG(atlog, AUDIO_THREAD_DEV_DROP_FRAMES, iodev->info.idx,
-	      dropped_frames, 0);
-
-	return frames;
-}
-
-int cras_iodev_drop_frames_by_time(struct cras_iodev *iodev, struct timespec ts)
-{
-	int frames_to_set;
-	double est_rate;
-	int rc;
-
-	est_rate = iodev->format->frame_rate *
-		   cras_iodev_get_est_rate_ratio(iodev);
-	frames_to_set = cras_time_to_frames(&ts, est_rate);
-
-	rc = cras_iodev_drop_frames(iodev, frames_to_set);
-
-	return rc;
-}
-
-bool cras_iodev_support_noise_cancellation(const struct cras_iodev *iodev)
-{
-	if (iodev->direction != CRAS_STREAM_INPUT)
-		return false;
-
-	if (iodev->support_noise_cancellation)
-		return !!iodev->support_noise_cancellation(iodev);
-	return false;
-}
diff --git a/cras/src/server/cras_iodev.h b/cras/src/server/cras_iodev.h
deleted file mode 100644
index 18a0962..0000000
--- a/cras/src/server/cras_iodev.h
+++ /dev/null
@@ -1,850 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-/*
- * cras_iodev represents playback or capture devices on the system.  Each iodev
- * will attach to a thread to render or capture audio.  For playback, this
- * thread will gather audio from the streams that are attached to the device and
- * render the samples it gets to the iodev.  For capture the process is
- * reversed, the samples are pulled from the device and passed on to the
- * attached streams.
- */
-#ifndef CRAS_IODEV_H_
-#define CRAS_IODEV_H_
-
-#include <stdbool.h>
-
-#include "cras_dsp.h"
-#include "cras_iodev_info.h"
-#include "cras_messages.h"
-#include "ewma_power.h"
-
-struct buffer_share;
-struct cras_fmt_conv;
-struct cras_ramp;
-struct cras_rstream;
-struct cras_audio_area;
-struct cras_audio_format;
-struct audio_thread;
-struct cras_iodev;
-struct rate_estimator;
-
-/*
- * Type of callback function to execute when loopback sender transfers audio
- * to the receiver. For example, this is called in audio thread when playback
- * samples are mixed and about to write to hardware.
- * Args:
- *    frames - Loopback audio data from sender.
- *    nframes - Number loopback audio data in frames.
- *    fmt - Format of the loopback audio data.
- *    cb_data - Pointer to the loopback receiver.
- */
-typedef int (*loopback_hook_data_t)(const uint8_t *frames, unsigned int nframes,
-				    const struct cras_audio_format *fmt,
-				    void *cb_data);
-
-/*
- * Type of callback function to notify loopback receiver that the loopback path
- * starts or stops.
- * Args:
- *    start - True to notify receiver that loopback starts. False to notify
- *        loopback stops.
- *    cb_data - Pointer to the loopback receiver.
- */
-typedef int (*loopback_hook_control_t)(bool start, void *cb_data);
-
-/* Callback type for an iodev event. */
-typedef int (*iodev_hook_t)();
-
-/*
- * Holds the information of a receiver of loopback audio, used to register
- * with the sender of loopback audio. A sender keeps a list of cras_loopback
- * objects representing all the receivers.
- * Members:
- *    type - Pre-dsp loopback can be used for system loopback. Post-dsp
- *        loopback can be used for echo reference.
- *    hook_data - Callback used for playback samples after mixing, before or
- *        after applying DSP depends on the value of |type|.
- *    hook_control - Callback to notify receiver that loopback starts or stops.
- *    cb_data - Pointer to the loopback receiver, will be passing to hook functions.
- */
-struct cras_loopback {
-	enum CRAS_LOOPBACK_TYPE type;
-	loopback_hook_data_t hook_data;
-	loopback_hook_control_t hook_control;
-	void *cb_data;
-	struct cras_loopback *prev, *next;
-};
-
-/* State of an iodev.
- * no_stream state is only supported on output device.
- * Open state is only supported for device supporting start ops.
- */
-enum CRAS_IODEV_STATE {
-	CRAS_IODEV_STATE_CLOSE = 0,
-	CRAS_IODEV_STATE_OPEN = 1,
-	CRAS_IODEV_STATE_NORMAL_RUN = 2,
-	CRAS_IODEV_STATE_NO_STREAM_RUN = 3,
-};
-
-/* Holds an output/input node for this device.  An ionode is a control that
- * can be switched on and off such as headphones or speakers.
- * Members:
- *    dev - iodev which this node belongs to.
- *    idx - ionode index.
- *    plugged - true if the device is plugged.
- *    plugged_time - If plugged is true, this is the time it was attached.
- *    volume - per-node volume (0-100)
- *    capture_gain - Internal per-node capture gain/attenuation (in 100*dBFS)
- *        This is only used for CRAS internal tuning, no way to change by
- *        client.
- *    ui_gain_scaler - The adjustable gain scaler set by client.
- *    left_right_swapped - If left and right output channels are swapped.
- *    type - Type displayed to the user.
- *    position - Specify where on the system this node locates.
- *    name - Name displayed to the user.
- *    dsp_name - The "DspName" variable specified in the ucm config.
- *    active_hotword_model - name of the currently selected hotword model.
- *    softvol_scalers - pointer to software volume scalers.
- *    software_volume_needed - For output: True if the volume range of the node
- *      is smaller than desired. For input: True if this node needs software
- *      gain.
- *    intrinsic_sensitivity - The "IntrinsicSensitivity" in 0.01 dBFS/Pa
- *    specified in the ucm config.
- *    stable_id - id for node that doesn't change after unplug/plug.
- *    is_sco_pcm - Bool to indicate whether the ionode is for SCO over PCM.
- */
-struct cras_ionode {
-	struct cras_iodev *dev;
-	uint32_t idx;
-	int plugged;
-	struct timeval plugged_time;
-	unsigned int volume;
-	long capture_gain;
-	float ui_gain_scaler;
-	int left_right_swapped;
-	enum CRAS_NODE_TYPE type;
-	enum CRAS_NODE_POSITION position;
-	char name[CRAS_NODE_NAME_BUFFER_SIZE];
-	const char *dsp_name;
-	char active_hotword_model[CRAS_NODE_HOTWORD_MODEL_BUFFER_SIZE];
-	float *softvol_scalers;
-	int software_volume_needed;
-	long intrinsic_sensitivity;
-	unsigned int stable_id;
-	int is_sco_pcm;
-	struct cras_ionode *prev, *next;
-};
-
-/* An input or output device, that can have audio routed to/from it.
- * set_volume - Function to call if the system volume changes.
- * set_capture_gain - Function to call if active node's capture_gain changes.
- * set_mute - Function to call if the system mute state changes.
- * set_capture_mute - Function to call if the system capture mute state changes.
- * set_swap_mode_for_node - Function to call to set swap mode for the node.
- * open_dev - Opens the device.
- * configure_dev - Configures the device.
- * close_dev - Closes the device if it is open.
- * update_supported_formats - Refresh supported frame rates and channel counts.
- * frames_queued - The number of frames in the audio buffer, and fills tstamp
- *                 with the associated timestamp. The timestamp is {0, 0} when
- *                 the device hasn't started processing data (and on error).
- * delay_frames - The delay of the next sample in frames.
- * get_buffer - Returns a buffer to read/write to/from.
- * put_buffer - Marks a buffer from get_buffer as read/written.
- * flush_buffer - Flushes the buffer and return the number of frames flushed.
- * start - Starts running device. This is optionally supported on output device.
- *         If device supports this ops, device can be in CRAS_IODEV_STATE_OPEN
- *         state after being opened.
- *         If device does not support this ops, then device will be in
- *         CRAS_IODEV_STATE_NO_STREAM_RUN.
- * no_stream - (Optional) When there is no stream, we let device keep running
- *             for some time to save the time to open device for the next
- *             stream. This is the no stream state of an output device.
- *             The default action of no stream state is to fill zeros
- *             periodically. Device can implement this function to define
- *             its own optimization of entering/exiting no stream state.
- * is_free_running - (Optional) Checks if the device is in free running state.
- * output_underrun - (Optional) Handle output device underrun.
- * update_active_node - Update the active node when the selected device/node has
- *     changed.
- * update_channel_layout - Update the channel layout base on set iodev->format,
- *     expect the best available layout be filled to iodev->format.
- * set_hotword_model - Sets the hotword model to this iodev.
- * get_hotword_models - Gets a comma separated string of the list of supported
- *     hotword models of this iodev.
- * get_num_severe_underruns - Gets number of severe underrun recorded since
- *                            iodev was created.
- * get_valid_frames - Gets number of valid frames in device which have not
- *                    played yet. Valid frames does not include zero samples
- *                    we filled under no streams state.
- * frames_to_play_in_sleep - Returns the non-negative number of frames that
- *        audio thread can sleep before serving this playback dev the next time.
- *        Not implementing this ops means fall back to default behavior in
- *        cras_iodev_default_frames_to_play_in_sleep().
- * support_noise_cancellation - (Optional) Checks if the device supports noise
- *                              cancellation.
- * format - The audio format being rendered or captured to hardware.
- * rate_est - Rate estimator to estimate the actual device rate.
- * area - Information about how the samples are stored.
- * info - Unique identifier for this device (index and name).
- * nodes - The output or input nodes available for this device.
- * active_node - The current node being used for playback or capture.
- * direction - Input or Output.
- * supported_rates - Array of sample rates supported by device 0-terminated.
- * supported_channel_counts - List of number of channels supported by device.
- * supported_formats - List of audio formats (s16le, s32le) supported by device.
- * buffer_size - Size of the audio buffer in frames.
- * min_buffer_level - Extra frames to keep queued in addition to requested.
- * dsp_context - The context used for dsp processing on the audio data.
- * dsp_name - The "dsp_name" dsp variable specified in the ucm config.
- * echo_reference_dev - Used only for playback iodev. Pointer to the input
- *        iodev, which can be used to record what is playing out from this
- *        iodev. This will be used as the echo reference for echo cancellation.
- * is_enabled - True if this iodev is enabled, false otherwise.
- * software_volume_needed - True if volume control is not supported by hardware.
- * software_gain_scaler - Scaler value to apply to captured data. This can
- *     be different when active node changes. Configured when there's no
- *     hardware gain control.
- * streams - List of audio streams serviced by dev.
- * state - Device is in one of close, open, normal, or no_stream state defined
- *         in enum CRAS_IODEV_STATE.
- * min_cb_level - min callback level of any stream attached.
- * max_cb_level - max callback level of any stream attached.
- * highest_hw_level - The highest hardware level of the device.
- * largest_cb_level - The largest callback level of streams attached to this
- *                    device. The difference with max_cb_level is it takes all
- *                    streams into account even if they have been removed.
- * num_underruns - Number of times we have run out of data (playback only).
- * buf_state - If multiple streams are writing to this device, then this
- *     keeps track of how much each stream has written.
- * idle_timeout - The timestamp when to close the dev after being idle.
- * open_ts - The time when the device opened.
- * loopbacks - List of registered cras_loopback objects representing the
- *    receivers who wants a copy of the audio sending through this iodev.
- * pre_open_iodev_hook - Optional callback to call before iodev open.
- * post_close_iodev_hook - Optional callback to call after iodev close.
- * ext_dsp_module - External dsp module to process audio data in stream level
- *        after dsp_context.
- * reset_request_pending - The flag for pending reset request.
- * ramp - The cras_ramp struct to control ramping up/down at mute/unmute and
- *        start of playback.
- * input_streaming - For capture only. Indicate if input has started.
- * input_frames_read - The number of frames read from the device, but that
- *                     haven't been "put" yet.
- * input_dsp_offset - The number of frames in the HW buffer that have already
- *                    been processed by the input DSP.
- * input_data - Used to pass audio input data to streams with or without
- *              stream side processing.
- * initial_ramp_request - The value indicates which type of ramp the device
- * should perform when some samples are ready for playback.
- * ewma - The ewma instance to calculate iodev volume.
- */
-struct cras_iodev {
-	void (*set_volume)(struct cras_iodev *iodev);
-	void (*set_mute)(struct cras_iodev *iodev);
-	void (*set_capture_gain)(struct cras_iodev *iodev);
-	void (*set_capture_mute)(struct cras_iodev *iodev);
-	int (*set_swap_mode_for_node)(struct cras_iodev *iodev,
-				      struct cras_ionode *node, int enable);
-	int (*open_dev)(struct cras_iodev *iodev);
-	int (*configure_dev)(struct cras_iodev *iodev);
-	int (*close_dev)(struct cras_iodev *iodev);
-	int (*update_supported_formats)(struct cras_iodev *iodev);
-	int (*frames_queued)(const struct cras_iodev *iodev,
-			     struct timespec *tstamp);
-	int (*delay_frames)(const struct cras_iodev *iodev);
-	int (*get_buffer)(struct cras_iodev *iodev,
-			  struct cras_audio_area **area, unsigned *frames);
-	int (*put_buffer)(struct cras_iodev *iodev, unsigned nwritten);
-	int (*flush_buffer)(struct cras_iodev *iodev);
-	int (*start)(const struct cras_iodev *iodev);
-	int (*is_free_running)(const struct cras_iodev *iodev);
-	int (*output_underrun)(struct cras_iodev *iodev);
-	int (*no_stream)(struct cras_iodev *iodev, int enable);
-	void (*update_active_node)(struct cras_iodev *iodev, unsigned node_idx,
-				   unsigned dev_enabled);
-	int (*update_channel_layout)(struct cras_iodev *iodev);
-	int (*set_hotword_model)(struct cras_iodev *iodev,
-				 const char *model_name);
-	char *(*get_hotword_models)(struct cras_iodev *iodev);
-	unsigned int (*get_num_severe_underruns)(const struct cras_iodev *iodev);
-	int (*get_valid_frames)(struct cras_iodev *odev,
-				struct timespec *tstamp);
-	unsigned int (*frames_to_play_in_sleep)(struct cras_iodev *iodev,
-						unsigned int *hw_level,
-						struct timespec *hw_tstamp);
-	int (*support_noise_cancellation)(const struct cras_iodev *iodev);
-	struct cras_audio_format *format;
-	struct rate_estimator *rate_est;
-	struct cras_audio_area *area;
-	struct cras_iodev_info info;
-	struct cras_ionode *nodes;
-	struct cras_ionode *active_node;
-	enum CRAS_STREAM_DIRECTION direction;
-	size_t *supported_rates;
-	size_t *supported_channel_counts;
-	snd_pcm_format_t *supported_formats;
-	snd_pcm_uframes_t buffer_size;
-	unsigned int min_buffer_level;
-	struct cras_dsp_context *dsp_context;
-	const char *dsp_name;
-	struct cras_iodev *echo_reference_dev;
-	int is_enabled;
-	int software_volume_needed;
-	float software_gain_scaler;
-	struct dev_stream *streams;
-	enum CRAS_IODEV_STATE state;
-	unsigned int min_cb_level;
-	unsigned int max_cb_level;
-	unsigned int highest_hw_level;
-	unsigned int largest_cb_level;
-	unsigned int num_underruns;
-	struct buffer_share *buf_state;
-	struct timespec idle_timeout;
-	struct timespec open_ts;
-	struct cras_loopback *loopbacks;
-	iodev_hook_t pre_open_iodev_hook;
-	iodev_hook_t post_close_iodev_hook;
-	struct ext_dsp_module *ext_dsp_module;
-	int reset_request_pending;
-	struct cras_ramp *ramp;
-	int input_streaming;
-	unsigned int input_frames_read;
-	unsigned int input_dsp_offset;
-	unsigned int initial_ramp_request;
-	struct input_data *input_data;
-	struct ewma_power ewma;
-	struct cras_iodev *prev, *next;
-};
-
-/*
- * Ramp request used in cras_iodev_start_ramp.
- *
- * - CRAS_IODEV_RAMP_REQUEST_UP_UNMUTE: Mute->unmute.
- *   Change device to unmute state after ramping is stared,
- *                 that is, (a) in the plot.
- *
- *                                  ____
- *                            .... /
- *                      _____/
- *                          (a)
- *
- * - CRAS_IODEV_RAMP_REQUEST_DOWN_MUTE: Unmute->mute.
- *   Change device to mute state after ramping is done, that is,
- *                 (b) in the plot.
- *
- *                      _____
- *                           \....
- *                                \____
- *                                (b)
- *
- * - CRAS_IODEV_RAMP_REQUEST_UP_START_PLAYBACK: Ramping is requested because
- *   first sample of new stream is ready, there is no need to change mute/unmute
- *   state.
- *
- * - CRAS_IODEV_RAMP_REQUEST_RESUME_MUTE: To prevent popped noise, mute the
- *   device for RAMP_RESUME_MUTE_DURATION_SECS seconds on sample ready after
- *   resume if there were playback stream before suspend.
- *
- * - CRAS_IODEV_RAMP_REQUEST_SWITCH_MUTE: To prevent popped noise, mute the
- *   device for RAMP_SWITCH_MUTE_DURATION_SECS seconds on sample ready after
- *   device switch if there were playback stream before switch.
- *
- */
-
-enum CRAS_IODEV_RAMP_REQUEST {
-	CRAS_IODEV_RAMP_REQUEST_NONE = 0,
-	CRAS_IODEV_RAMP_REQUEST_UP_UNMUTE = 1,
-	CRAS_IODEV_RAMP_REQUEST_DOWN_MUTE = 2,
-	CRAS_IODEV_RAMP_REQUEST_UP_START_PLAYBACK = 3,
-	CRAS_IODEV_RAMP_REQUEST_RESUME_MUTE = 4,
-	CRAS_IODEV_RAMP_REQUEST_SWITCH_MUTE = 5,
-};
-
-/*
- * Utility functions to be used by iodev implementations.
- */
-
-/* Sets up the iodev for the given format if possible.  If the iodev can't
- * handle the requested format, format conversion will happen in dev_stream.
- * It also allocates a dsp context for the iodev.
- * Args:
- *    iodev - the iodev you want the format for.
- *    fmt - the desired format.
- */
-int cras_iodev_set_format(struct cras_iodev *iodev,
-			  const struct cras_audio_format *fmt);
-
-/* Clear the format previously set for this iodev.
- *
- * Args:
- *    iodev - the iodev you want to free the format.
- */
-void cras_iodev_free_format(struct cras_iodev *iodev);
-
-/* Initializes the audio area for this iodev.
- * Args:
- *    iodev - the iodev to init audio area
- *    num_channels - the total number of channels
- */
-void cras_iodev_init_audio_area(struct cras_iodev *iodev, int num_channels);
-
-/* Frees the audio area for this iodev.
- * Args:
- *    iodev - the iodev to free audio area
- */
-void cras_iodev_free_audio_area(struct cras_iodev *iodev);
-
-/* Free resources allocated for this iodev.
- *
- * Args:
- *    iodev - the iodev you want to free the resources for.
- */
-void cras_iodev_free_resources(struct cras_iodev *iodev);
-
-/* Fill timespec ts with the time to sleep based on the number of frames and
- * frame rate.
- * Args:
- *    frames - Number of frames in buffer..
- *    frame_rate - 44100, 48000, etc.
- *    ts - Filled with the time to sleep for.
- */
-void cras_iodev_fill_time_from_frames(size_t frames, size_t frame_rate,
-				      struct timespec *ts);
-
-/* Update the "dsp_name" dsp variable. This may cause the dsp pipeline to be
- * reloaded.
- * Args:
- *    iodev - device which the state changes.
- */
-void cras_iodev_update_dsp(struct cras_iodev *iodev);
-
-/* Sets swap mode on a node using dsp. This function can be called when
- * dsp pipline is not created yet. It will take effect when dsp pipeline
- * is created later. If there is dsp pipeline, this function causes the dsp
- * pipeline to be reloaded and swap mode takes effect right away.
- * Args:
- *    iodev - device to be changed for swap mode.
- *    node - the node to be changed for swap mode.
- *    enable - 1 to enable swap mode, 0 otherwise.
- * Returns:
- *    0 on success, error code on failure.
- */
-int cras_iodev_dsp_set_swap_mode_for_node(struct cras_iodev *iodev,
-					  struct cras_ionode *node, int enable);
-
-/* Handles a plug event happening on this node.
- * Args:
- *    node - ionode on which a plug event was detected.
- *    plugged - true if the device was plugged, false for unplugged.
- */
-void cras_ionode_plug_event(struct cras_ionode *node, int plugged);
-
-/* Returns true if node a is preferred over node b. */
-int cras_ionode_better(struct cras_ionode *a, struct cras_ionode *b);
-
-/* Sets the plugged state of a node. */
-void cras_iodev_set_node_plugged(struct cras_ionode *node, int plugged);
-
-/* Adds a node to the iodev's node list. */
-void cras_iodev_add_node(struct cras_iodev *iodev, struct cras_ionode *node);
-
-/* Removes a node from iodev's node list. */
-void cras_iodev_rm_node(struct cras_iodev *iodev, struct cras_ionode *node);
-
-/* Assign a node to be the active node of the device */
-void cras_iodev_set_active_node(struct cras_iodev *iodev,
-				struct cras_ionode *node);
-
-/* Checks if the node is the typical playback or capture option for AEC usage. */
-bool cras_iodev_is_aec_use_case(const struct cras_ionode *node);
-
-/* Checks if the node is a playback or capture node on internal card. */
-bool cras_iodev_is_on_internal_card(const struct cras_ionode *node);
-
-/* Adjust the system volume based on the volume of the given node. */
-static inline unsigned int
-cras_iodev_adjust_node_volume(const struct cras_ionode *node,
-			      unsigned int system_volume)
-{
-	unsigned int node_vol_offset = 100 - node->volume;
-
-	if (system_volume > node_vol_offset)
-		return system_volume - node_vol_offset;
-	else
-		return 0;
-}
-
-/* Get the volume scaler for the active node. */
-static inline unsigned int
-cras_iodev_adjust_active_node_volume(struct cras_iodev *iodev,
-				     unsigned int system_volume)
-{
-	if (!iodev->active_node)
-		return system_volume;
-
-	return cras_iodev_adjust_node_volume(iodev->active_node, system_volume);
-}
-
-/* Returns true if the active node of the iodev needs software volume. */
-static inline int
-cras_iodev_software_volume_needed(const struct cras_iodev *iodev)
-{
-	if (iodev->software_volume_needed)
-		return 1;
-
-	if (!iodev->active_node)
-		return 0;
-
-	if (iodev->active_node->intrinsic_sensitivity)
-		return 1;
-
-	return iodev->active_node->software_volume_needed;
-}
-
-static inline float
-cras_iodev_get_ui_gain_scaler(const struct cras_iodev *iodev)
-{
-	if (!iodev->active_node)
-		return 1.0f;
-	return iodev->active_node->ui_gain_scaler;
-}
-
-/* Gets the software gain scaler should be applied on the deivce.
- * Args:
- *    iodev - The device.
- * Returns:
- *    A scaler translated from system gain and active node gain.
- *    Returns 1.0 if software gain is not needed. */
-float cras_iodev_get_software_gain_scaler(const struct cras_iodev *iodev);
-
-/* Gets the software volume scaler of the iodev. The scaler should only be
- * applied if the device needs software volume. */
-float cras_iodev_get_software_volume_scaler(struct cras_iodev *iodev);
-
-/* Indicate that a stream has been added from the device. */
-int cras_iodev_add_stream(struct cras_iodev *iodev, struct dev_stream *stream);
-
-/* Indicate that a stream is taken into consideration of device's I/O. This
- * function is for output stream only. For input stream, it is already included
- * by add_stream function. */
-void cras_iodev_start_stream(struct cras_iodev *iodev,
-			     struct dev_stream *stream);
-
-/* Indicate that a stream has been removed from the device. */
-struct dev_stream *cras_iodev_rm_stream(struct cras_iodev *iodev,
-					const struct cras_rstream *stream);
-
-/* Get the offset of this stream into the dev's buffer. */
-unsigned int cras_iodev_stream_offset(struct cras_iodev *iodev,
-				      struct dev_stream *stream);
-
-/* Get the maximum offset of any stream into the dev's buffer. */
-unsigned int cras_iodev_max_stream_offset(const struct cras_iodev *iodev);
-
-/* Tell the device how many frames the given stream wrote. */
-void cras_iodev_stream_written(struct cras_iodev *iodev,
-			       struct dev_stream *stream,
-			       unsigned int nwritten);
-
-/* All streams have written what they can, update the write pointers and return
- * the amount that has been filled by all streams and can be comitted to the
- * device.
- */
-unsigned int cras_iodev_all_streams_written(struct cras_iodev *iodev);
-
-/* Return the state of an iodev. */
-enum CRAS_IODEV_STATE cras_iodev_state(const struct cras_iodev *iodev);
-
-/* Open an iodev, does setup and invokes the open_dev callback. */
-int cras_iodev_open(struct cras_iodev *iodev, unsigned int cb_level,
-		    const struct cras_audio_format *fmt);
-
-/* Open an iodev, does teardown and invokes the close_dev callback. */
-int cras_iodev_close(struct cras_iodev *iodev);
-
-/* Gets the available buffer to write/read audio.*/
-int cras_iodev_buffer_avail(struct cras_iodev *iodev, unsigned hw_level);
-
-/* Marks a buffer from get_buffer as read.
- * Args:
- *    iodev - The input device.
- * Returns:
- *    Number of frames to put sucessfully. Negative error code on failure.
- */
-int cras_iodev_put_input_buffer(struct cras_iodev *iodev);
-
-/* Marks a buffer from get_buffer as written. */
-int cras_iodev_put_output_buffer(struct cras_iodev *iodev, uint8_t *frames,
-				 unsigned int nframes, int *is_non_empty,
-				 struct cras_fmt_conv *remix_converter);
-
-/* Returns a buffer to read from.
- * Args:
- *    iodev - The device.
- *    frames - Filled with the number of frames that can be read/written.
- */
-int cras_iodev_get_input_buffer(struct cras_iodev *iodev, unsigned *frames);
-
-/* Returns a buffer to read from.
- * Args:
- *    iodev - The device.
- *    area - Filled with a pointer to the audio to read/write.
- *    frames - Filled with the number of frames that can be read/written.
- */
-int cras_iodev_get_output_buffer(struct cras_iodev *iodev,
-				 struct cras_audio_area **area,
-				 unsigned *frames);
-
-/* Update the estimated sample rate of the device. */
-int cras_iodev_update_rate(struct cras_iodev *iodev, unsigned int level,
-			   struct timespec *level_tstamp);
-
-/* Resets the rate estimator of the device. */
-int cras_iodev_reset_rate_estimator(const struct cras_iodev *iodev);
-
-/* Returns the rate of estimated frame rate and the claimed frame rate of
- * the device. */
-double cras_iodev_get_est_rate_ratio(const struct cras_iodev *iodev);
-
-/* Get the delay from DSP processing in frames. */
-int cras_iodev_get_dsp_delay(const struct cras_iodev *iodev);
-
-/* Returns the number of frames in the hardware buffer.
- * Args:
- *    iodev - The device.
- *    tstamp - The associated hardware time stamp.
- * Returns:
- *    Number of frames in the hardware buffer.
- *    Returns -EPIPE if there is severe underrun.
- */
-int cras_iodev_frames_queued(struct cras_iodev *iodev, struct timespec *tstamp);
-
-/* Get the delay for input/output in frames. */
-static inline int cras_iodev_delay_frames(const struct cras_iodev *iodev)
-{
-	return iodev->delay_frames(iodev) + cras_iodev_get_dsp_delay(iodev);
-}
-
-/* Returns if input iodev has started streaming. */
-static inline int cras_iodev_input_streaming(const struct cras_iodev *iodev)
-{
-	return iodev->input_streaming;
-}
-
-/* Returns true if the device is open. */
-static inline int cras_iodev_is_open(const struct cras_iodev *iodev)
-{
-	if (iodev && iodev->state != CRAS_IODEV_STATE_CLOSE)
-		return 1;
-	return 0;
-}
-
-/* Configure iodev to exit idle mode. */
-static inline void cras_iodev_exit_idle(struct cras_iodev *iodev)
-{
-	iodev->idle_timeout.tv_sec = 0;
-}
-
-/*
- * Sets the external dsp module for |iodev| and configures the module
- * accordingly if iodev is already open. This function should be called
- * in main thread.
- * Args:
- *    iodev - The iodev to hold the dsp module.
- *    ext - External dsp module to set to iodev. Pass NULL to release
- *        the ext_dsp_module already added to dsp pipeline.
- */
-void cras_iodev_set_ext_dsp_module(struct cras_iodev *iodev,
-				   struct ext_dsp_module *ext);
-
-/* Put 'frames' worth of zero samples into odev. */
-int cras_iodev_fill_odev_zeros(struct cras_iodev *odev, unsigned int frames);
-
-/*
- * The default implementation of frames_to_play_in_sleep ops, used when an
- * iodev doesn't have its own logic.
- * The default behavior is to calculate how log it takes for buffer level to
- * run to as low as min_buffer_level.
- */
-unsigned int
-cras_iodev_default_frames_to_play_in_sleep(struct cras_iodev *odev,
-					   unsigned int *hw_level,
-					   struct timespec *hw_tstamp);
-
-/* Gets the number of frames to play when audio thread sleeps.
- * Args:
- *    iodev[in] - The device.
- *    hw_level[out] - Pointer to number of frames in hardware.
- *    hw_tstamp[out] - Pointer to the timestamp for hw_level.
- * Returns:
- *    Number of frames to play in sleep for this output device.
- */
-unsigned int cras_iodev_frames_to_play_in_sleep(struct cras_iodev *odev,
-						unsigned int *hw_level,
-						struct timespec *hw_tstamp);
-
-/* Checks if audio thread should wake for this output device.
- * Args:
- *    iodev[in] - The output device.
- * Returns:
- *    1 if audio thread should wake for this output device. 0 otherwise.
- */
-int cras_iodev_odev_should_wake(const struct cras_iodev *odev);
-
-/* The default implementation of no_stream ops.
- * The default behavior is to fill some zeros when entering no stream state.
- * Note that when a device in no stream state enters into no stream state again,
- * device needs to fill some zeros again.
- * Do nothing to leave no stream state.
- * Args:
- *    iodev[in] - The output device.
- *    enable[in] - 1 to enter no stream playback, 0 to leave.
- * Returns:
- *    0 on success. Negative error code on failure.
- * */
-int cras_iodev_default_no_stream_playback(struct cras_iodev *odev, int enable);
-
-/* Get current state of iodev.
- * Args:
- *    iodev[in] - The device.
- * Returns:
- *    One of states defined in CRAS_IODEV_STATE.
- */
-enum CRAS_IODEV_STATE cras_iodev_state(const struct cras_iodev *iodev);
-
-/* Possibly transit state for output device.
- * Check if this output device needs to transit from open state/no_stream state
- * into normal run state. If device does not need transition and is still in
- * no stream state, call no_stream ops to do its work for one cycle.
- * Args:
- *    odev[in] - The output device.
- * Returns:
- *    0 on success. Negative error code on failure.
- */
-int cras_iodev_prepare_output_before_write_samples(struct cras_iodev *odev);
-
-/* Get number of underruns recorded so far.
- * Args:
- *    iodev[in] - The device.
- * Returns:
- *    An unsigned int for number of underruns recorded.
- */
-unsigned int cras_iodev_get_num_underruns(const struct cras_iodev *iodev);
-
-/* Get number of severe underruns recorded so far.
- * Args:
- *    iodev[in] - The device.
- * Returns:
- *    An unsigned int for number of severe underruns recorded since iodev
- *    was created.
- */
-unsigned int
-cras_iodev_get_num_severe_underruns(const struct cras_iodev *iodev);
-
-/* Get number of valid frames in the hardware buffer. The valid frames does
- * not include zero samples we filled with before.
- * Args:
- *    iodev[in] - The device.
- *    hw_tstamp[out] - Pointer to the timestamp for hw_level.
- * Returns:
- *    Number of valid frames in the hardware buffer.
- *    Negative error code on failure.
- */
-int cras_iodev_get_valid_frames(struct cras_iodev *iodev,
-				struct timespec *hw_tstamp);
-
-/* Request main thread to re-open device. This should be used in audio thread
- * when it finds device is in a bad state. The request will be ignored if
- * there is still a pending request.
- * Args:
- *    iodev[in] - The device.
- * Returns:
- *    0 on success. Negative error code on failure.
- */
-int cras_iodev_reset_request(struct cras_iodev *iodev);
-
-/* Handle output underrun.
- * Args:
- *    odev[in] - The output device.
- *    hw_level[in] - The current hw_level. Used in the debug log.
- *    frames_written[in] - The number of written frames. Used in the debug log.
- * Returns:
- *    0 on success. Negative error code on failure.
- */
-int cras_iodev_output_underrun(struct cras_iodev *odev, unsigned int hw_level,
-			       unsigned int frames_written);
-
-/* Start ramping samples up/down on a device.
- * Args:
- *    iodev[in] - The device.
- *    request[in] - The request type. Check the docstrings of
- *                  CRAS_IODEV_RAMP_REQUEST.
- * Returns:
- *    0 on success. Negative error code on failure.
- */
-int cras_iodev_start_ramp(struct cras_iodev *odev,
-			  enum CRAS_IODEV_RAMP_REQUEST request);
-
-/* Start ramping samples up/down on a device after a volume change.
- * Args:
- *    iodev[in] - The device.
- *    old_volume[in] - The previous volume percentage of the device.
- *    new_volume[in] - The new volume percentage of the device.
- * Returns:
- *    0 on success. Negative error code on failure.
- */
-int cras_iodev_start_volume_ramp(struct cras_iodev *odev,
-				 unsigned int old_volume,
-				 unsigned int new_volume);
-
-/* Set iodev to mute/unmute state.
- * Args:
- *    iodev[in] - The device.
- * Returns:
- *    0 on success. Negative error code on failure.
- */
-int cras_iodev_set_mute(struct cras_iodev *iodev);
-
-/*
- * Checks if an output iodev's volume is zero.
- * If there is an active node, check the adjusted node volume.
- * If there is no active node, check system volume.
- * Args:
- *    odev[in] - The device.
- * Returns:
- *    1 if device's volume is 0. 0 otherwise.
- */
-int cras_iodev_is_zero_volume(const struct cras_iodev *odev);
-
-/*
- * Updates the highest hardware level of the device.
- * Args:
- *    iodev - The device.
- */
-void cras_iodev_update_highest_hw_level(struct cras_iodev *iodev,
-					unsigned int hw_level);
-
-/*
- * Makes an input device drop the specific number of frames by given time.
- * Args:
- *    iodev - The device.
- *    ts - The time indicates how many frames will be dropped in a device.
- * Returns:
- *    The number of frames have been dropped. Negative error code on failure.
- */
-int cras_iodev_drop_frames_by_time(struct cras_iodev *iodev,
-				   struct timespec ts);
-
-/* Checks if an input device supports noise cancellation.
- * Args:
- *    iodev - The device.
- * Returns:
- *    True if device supports noise cancellation. False otherwise.
- */
-bool cras_iodev_support_noise_cancellation(const struct cras_iodev *iodev);
-
-#endif /* CRAS_IODEV_H_ */
diff --git a/cras/src/server/cras_iodev_list.c b/cras/src/server/cras_iodev_list.c
deleted file mode 100644
index b818c97..0000000
--- a/cras/src/server/cras_iodev_list.c
+++ /dev/null
@@ -1,1920 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <syslog.h>
-
-#include "audio_thread.h"
-#include "cras_empty_iodev.h"
-#include "cras_iodev.h"
-#include "cras_iodev_info.h"
-#include "cras_iodev_list.h"
-#include "cras_loopback_iodev.h"
-#include "cras_main_thread_log.h"
-#include "cras_observer.h"
-#include "cras_rstream.h"
-#include "cras_server.h"
-#include "cras_tm.h"
-#include "cras_types.h"
-#include "cras_system_state.h"
-#include "server_stream.h"
-#include "softvol_curve.h"
-#include "stream_list.h"
-#include "test_iodev.h"
-#include "utlist.h"
-
-const struct timespec idle_timeout_interval = { .tv_sec = 10, .tv_nsec = 0 };
-
-/* Linked list of available devices. */
-struct iodev_list {
-	struct cras_iodev *iodevs;
-	size_t size;
-};
-
-/* List of enabled input/output devices.
- *    dev - The device.
- *    init_timer - Timer for a delayed call to init this iodev.
- */
-struct enabled_dev {
-	struct cras_iodev *dev;
-	struct enabled_dev *prev, *next;
-};
-
-struct dev_init_retry {
-	int dev_idx;
-	struct cras_timer *init_timer;
-	struct dev_init_retry *next, *prev;
-};
-
-struct device_enabled_cb {
-	device_enabled_callback_t enabled_cb;
-	device_disabled_callback_t disabled_cb;
-	void *cb_data;
-	struct device_enabled_cb *next, *prev;
-};
-
-struct main_thread_event_log *main_log;
-
-/* Lists for devs[CRAS_STREAM_INPUT] and devs[CRAS_STREAM_OUTPUT]. */
-static struct iodev_list devs[CRAS_NUM_DIRECTIONS];
-/* The observer client iodev_list used to listen on various events. */
-static struct cras_observer_client *list_observer;
-/* Keep a list of enabled inputs and outputs. */
-static struct enabled_dev *enabled_devs[CRAS_NUM_DIRECTIONS];
-/* Keep an empty device per direction. */
-static struct cras_iodev *fallback_devs[CRAS_NUM_DIRECTIONS];
-/* Special empty device for hotword streams. */
-static struct cras_iodev *empty_hotword_dev;
-/* Loopback devices. */
-static struct cras_iodev *loopdev_post_mix;
-static struct cras_iodev *loopdev_post_dsp;
-/* List of pending device init retries. */
-static struct dev_init_retry *init_retries;
-
-/* Keep a constantly increasing index for iodevs. Index 0 is reserved
- * to mean "no device". */
-static uint32_t next_iodev_idx = MAX_SPECIAL_DEVICE_IDX;
-
-/* Call when a device is enabled or disabled. */
-struct device_enabled_cb *device_enable_cbs;
-
-/* Thread that handles audio input and output. */
-static struct audio_thread *audio_thread;
-/* List of all streams. */
-static struct stream_list *stream_list;
-/* Idle device timer. */
-static struct cras_timer *idle_timer;
-/* Flag to indicate that the stream list is disconnected from audio thread. */
-static int stream_list_suspended = 0;
-/* If init device failed, retry after 1 second. */
-static const unsigned int INIT_DEV_DELAY_MS = 1000;
-/* Flag to indicate that hotword streams are suspended. */
-static int hotword_suspended = 0;
-/* Flag to indicate that suspended hotword streams should be auto-resumed at
- * system resume. */
-static int hotword_auto_resume = 0;
-
-static void idle_dev_check(struct cras_timer *timer, void *data);
-
-static struct cras_iodev *find_dev(size_t dev_index)
-{
-	struct cras_iodev *dev;
-
-	DL_FOREACH (devs[CRAS_STREAM_OUTPUT].iodevs, dev)
-		if (dev->info.idx == dev_index)
-			return dev;
-
-	DL_FOREACH (devs[CRAS_STREAM_INPUT].iodevs, dev)
-		if (dev->info.idx == dev_index)
-			return dev;
-
-	return NULL;
-}
-
-static struct cras_ionode *find_node(struct cras_iodev *iodev,
-				     unsigned int node_idx)
-{
-	struct cras_ionode *node;
-	DL_SEARCH_SCALAR(iodev->nodes, node, idx, node_idx);
-	return node;
-}
-
-/* Adds a device to the list.  Used from add_input and add_output. */
-static int add_dev_to_list(struct cras_iodev *dev)
-{
-	struct cras_iodev *tmp;
-	uint32_t new_idx;
-	struct iodev_list *list = &devs[dev->direction];
-
-	DL_FOREACH (list->iodevs, tmp)
-		if (tmp == dev)
-			return -EEXIST;
-
-	dev->format = NULL;
-	dev->format = NULL;
-	dev->prev = dev->next = NULL;
-
-	/* Move to the next index and make sure it isn't taken. */
-	new_idx = next_iodev_idx;
-	while (1) {
-		if (new_idx < MAX_SPECIAL_DEVICE_IDX)
-			new_idx = MAX_SPECIAL_DEVICE_IDX;
-		DL_SEARCH_SCALAR(list->iodevs, tmp, info.idx, new_idx);
-		if (tmp == NULL)
-			break;
-		new_idx++;
-	}
-	dev->info.idx = new_idx;
-	next_iodev_idx = new_idx + 1;
-	list->size++;
-
-	syslog(LOG_INFO, "Adding %s dev at index %u.",
-	       dev->direction == CRAS_STREAM_OUTPUT ? "output" : "input",
-	       dev->info.idx);
-	DL_PREPEND(list->iodevs, dev);
-
-	cras_iodev_list_update_device_list();
-	return 0;
-}
-
-/* Removes a device to the list.  Used from rm_input and rm_output. */
-static int rm_dev_from_list(struct cras_iodev *dev)
-{
-	struct cras_iodev *tmp;
-
-	DL_FOREACH (devs[dev->direction].iodevs, tmp)
-		if (tmp == dev) {
-			if (cras_iodev_is_open(dev))
-				return -EBUSY;
-			DL_DELETE(devs[dev->direction].iodevs, dev);
-			devs[dev->direction].size--;
-			return 0;
-		}
-
-	/* Device not found. */
-	return -EINVAL;
-}
-
-/* Fills a dev_info array from the iodev_list. */
-static void fill_dev_list(struct iodev_list *list,
-			  struct cras_iodev_info *dev_info, size_t out_size)
-{
-	int i = 0;
-	struct cras_iodev *tmp;
-	DL_FOREACH (list->iodevs, tmp) {
-		memcpy(&dev_info[i], &tmp->info, sizeof(dev_info[0]));
-		i++;
-		if (i == out_size)
-			return;
-	}
-}
-
-static const char *node_type_to_str(struct cras_ionode *node)
-{
-	switch (node->type) {
-	case CRAS_NODE_TYPE_INTERNAL_SPEAKER:
-		return "INTERNAL_SPEAKER";
-	case CRAS_NODE_TYPE_HEADPHONE:
-		return "HEADPHONE";
-	case CRAS_NODE_TYPE_HDMI:
-		return "HDMI";
-	case CRAS_NODE_TYPE_HAPTIC:
-		return "HAPTIC";
-	case CRAS_NODE_TYPE_MIC:
-		switch (node->position) {
-		case NODE_POSITION_INTERNAL:
-			return "INTERNAL_MIC";
-		case NODE_POSITION_FRONT:
-			return "FRONT_MIC";
-		case NODE_POSITION_REAR:
-			return "REAR_MIC";
-		case NODE_POSITION_KEYBOARD:
-			return "KEYBOARD_MIC";
-		case NODE_POSITION_EXTERNAL:
-		default:
-			return "MIC";
-		}
-	case CRAS_NODE_TYPE_HOTWORD:
-		return "HOTWORD";
-	case CRAS_NODE_TYPE_LINEOUT:
-		return "LINEOUT";
-	case CRAS_NODE_TYPE_POST_MIX_PRE_DSP:
-		return "POST_MIX_LOOPBACK";
-	case CRAS_NODE_TYPE_POST_DSP:
-		return "POST_DSP_LOOPBACK";
-	case CRAS_NODE_TYPE_USB:
-		return "USB";
-	case CRAS_NODE_TYPE_BLUETOOTH:
-		return "BLUETOOTH";
-	case CRAS_NODE_TYPE_BLUETOOTH_NB_MIC:
-		return "BLUETOOTH_NB_MIC";
-	case CRAS_NODE_TYPE_FALLBACK_NORMAL:
-		return "FALLBACK_NORMAL";
-	case CRAS_NODE_TYPE_FALLBACK_ABNORMAL:
-		return "FALLBACK_ABNORMAL";
-	case CRAS_NODE_TYPE_ECHO_REFERENCE:
-		return "ECHO_REFERENCE";
-	case CRAS_NODE_TYPE_ALSA_LOOPBACK:
-		return "ALSA_LOOPBACK";
-	case CRAS_NODE_TYPE_UNKNOWN:
-	default:
-		return "UNKNOWN";
-	}
-}
-
-/* Fills an ionode_info array from the iodev_list. */
-static int fill_node_list(struct iodev_list *list,
-			  struct cras_ionode_info *node_info, size_t out_size)
-{
-	int i = 0;
-	struct cras_iodev *dev;
-	struct cras_ionode *node;
-	DL_FOREACH (list->iodevs, dev) {
-		DL_FOREACH (dev->nodes, node) {
-			node_info->iodev_idx = dev->info.idx;
-			node_info->ionode_idx = node->idx;
-			node_info->plugged = node->plugged;
-			node_info->plugged_time.tv_sec =
-				node->plugged_time.tv_sec;
-			node_info->plugged_time.tv_usec =
-				node->plugged_time.tv_usec;
-			node_info->active =
-				dev->is_enabled && (dev->active_node == node);
-			node_info->volume = node->volume;
-			node_info->capture_gain = node->capture_gain;
-			node_info->ui_gain_scaler = node->ui_gain_scaler;
-			node_info->left_right_swapped =
-				node->left_right_swapped;
-			node_info->stable_id = node->stable_id;
-			strcpy(node_info->name, node->name);
-			strcpy(node_info->active_hotword_model,
-			       node->active_hotword_model);
-			snprintf(node_info->type, sizeof(node_info->type), "%s",
-				 node_type_to_str(node));
-			node_info->type_enum = node->type;
-			node_info++;
-			i++;
-			if (i == out_size)
-				return i;
-		}
-	}
-	return i;
-}
-
-/* Copies the info for each device in the list to "list_out". */
-static int get_dev_list(struct iodev_list *list,
-			struct cras_iodev_info **list_out)
-{
-	struct cras_iodev_info *dev_info;
-
-	if (!list_out)
-		return list->size;
-
-	*list_out = NULL;
-	if (list->size == 0)
-		return 0;
-
-	dev_info = malloc(sizeof(*list_out[0]) * list->size);
-	if (dev_info == NULL)
-		return -ENOMEM;
-
-	fill_dev_list(list, dev_info, list->size);
-
-	*list_out = dev_info;
-	return list->size;
-}
-
-/* Called when the system volume changes.  Pass the current volume setting to
- * the default output if it is active. */
-static void sys_vol_change(void *context, int32_t volume)
-{
-	struct cras_iodev *dev;
-
-	DL_FOREACH (devs[CRAS_STREAM_OUTPUT].iodevs, dev) {
-		if (dev->set_volume && cras_iodev_is_open(dev))
-			dev->set_volume(dev);
-	}
-}
-
-/* Called when the system mute state changes.  Pass the current mute setting
- * to the default output if it is active. */
-static void sys_mute_change(void *context, int muted, int user_muted,
-			    int mute_locked)
-{
-	struct cras_iodev *dev;
-	int should_mute = muted || user_muted;
-
-	DL_FOREACH (devs[CRAS_STREAM_OUTPUT].iodevs, dev) {
-		if (!cras_iodev_is_open(dev)) {
-			/* For closed devices, just set its mute state. */
-			cras_iodev_set_mute(dev);
-		} else {
-			audio_thread_dev_start_ramp(
-				audio_thread, dev->info.idx,
-				(should_mute ?
-					 CRAS_IODEV_RAMP_REQUEST_DOWN_MUTE :
-					 CRAS_IODEV_RAMP_REQUEST_UP_UNMUTE));
-		}
-	}
-}
-
-static void remove_all_streams_from_dev(struct cras_iodev *dev)
-{
-	struct cras_rstream *rstream;
-
-	audio_thread_rm_open_dev(audio_thread, dev->direction, dev->info.idx);
-
-	DL_FOREACH (stream_list_get(stream_list), rstream) {
-		if (rstream->apm_list == NULL)
-			continue;
-		cras_apm_list_remove_apm(rstream->apm_list, dev);
-	}
-}
-
-/*
- * If output dev has an echo reference dev associated, add a server
- * stream to read audio data from it so APM can analyze.
- */
-static void possibly_enable_echo_reference(struct cras_iodev *dev)
-{
-	if (dev->direction != CRAS_STREAM_OUTPUT)
-		return;
-
-	if (dev->echo_reference_dev == NULL)
-		return;
-
-	server_stream_create(stream_list, dev->echo_reference_dev->info.idx,
-			     dev->format);
-}
-
-/*
- * If output dev has an echo reference dev associated, check if there
- * is server stream opened for it and remove it.
- */
-static void possibly_disable_echo_reference(struct cras_iodev *dev)
-{
-	if (dev->echo_reference_dev == NULL)
-		return;
-
-	server_stream_destroy(stream_list, dev->echo_reference_dev->info.idx);
-}
-
-/*
- * Removes all attached streams and close dev if it's opened.
- */
-static void close_dev(struct cras_iodev *dev)
-{
-	if (!cras_iodev_is_open(dev))
-		return;
-
-	MAINLOG(main_log, MAIN_THREAD_DEV_CLOSE, dev->info.idx, 0, 0);
-	remove_all_streams_from_dev(dev);
-	dev->idle_timeout.tv_sec = 0;
-	/* close echo ref first to avoid underrun in hardware */
-	possibly_disable_echo_reference(dev);
-	cras_iodev_close(dev);
-}
-
-static void idle_dev_check(struct cras_timer *timer, void *data)
-{
-	struct enabled_dev *edev;
-	struct timespec now;
-	struct timespec min_idle_expiration;
-	unsigned int num_idle_devs = 0;
-	unsigned int min_idle_timeout_ms;
-
-	clock_gettime(CLOCK_MONOTONIC_RAW, &now);
-	min_idle_expiration.tv_sec = 0;
-	min_idle_expiration.tv_nsec = 0;
-
-	DL_FOREACH (enabled_devs[CRAS_STREAM_OUTPUT], edev) {
-		if (edev->dev->idle_timeout.tv_sec == 0)
-			continue;
-		if (timespec_after(&now, &edev->dev->idle_timeout)) {
-			close_dev(edev->dev);
-			continue;
-		}
-		num_idle_devs++;
-		if (min_idle_expiration.tv_sec == 0 ||
-		    timespec_after(&min_idle_expiration,
-				   &edev->dev->idle_timeout))
-			min_idle_expiration = edev->dev->idle_timeout;
-	}
-
-	idle_timer = NULL;
-	if (!num_idle_devs)
-		return;
-	if (timespec_after(&now, &min_idle_expiration)) {
-		min_idle_timeout_ms = 0;
-	} else {
-		struct timespec timeout;
-		subtract_timespecs(&min_idle_expiration, &now, &timeout);
-		min_idle_timeout_ms = timespec_to_ms(&timeout);
-	}
-	/* Wake up when it is time to close the next idle device.  Sleep for a
-	 * minimum of 10 milliseconds. */
-	idle_timer = cras_tm_create_timer(cras_system_state_get_tm(),
-					  MAX(min_idle_timeout_ms, 10),
-					  idle_dev_check, NULL);
-}
-
-/*
- * Cancel pending init tries. Called at device initialization or when device
- * is disabled.
- */
-static void cancel_pending_init_retries(unsigned int dev_idx)
-{
-	struct dev_init_retry *retry;
-
-	DL_FOREACH (init_retries, retry) {
-		if (retry->dev_idx != dev_idx)
-			continue;
-		cras_tm_cancel_timer(cras_system_state_get_tm(),
-				     retry->init_timer);
-		DL_DELETE(init_retries, retry);
-		free(retry);
-	}
-}
-
-/* Open the device potentially filling the output with a pre buffer. */
-static int init_device(struct cras_iodev *dev, struct cras_rstream *rstream)
-{
-	int rc;
-
-	cras_iodev_exit_idle(dev);
-
-	if (cras_iodev_is_open(dev))
-		return 0;
-	cancel_pending_init_retries(dev->info.idx);
-	MAINLOG(main_log, MAIN_THREAD_DEV_INIT, dev->info.idx,
-		rstream->format.num_channels, rstream->format.frame_rate);
-
-	rc = cras_iodev_open(dev, rstream->cb_threshold, &rstream->format);
-	if (rc)
-		return rc;
-
-	rc = audio_thread_add_open_dev(audio_thread, dev);
-	if (rc)
-		cras_iodev_close(dev);
-
-	possibly_enable_echo_reference(dev);
-
-	return rc;
-}
-
-static void suspend_devs()
-{
-	struct enabled_dev *edev;
-	struct cras_rstream *rstream;
-
-	MAINLOG(main_log, MAIN_THREAD_SUSPEND_DEVS, 0, 0, 0);
-
-	DL_FOREACH (stream_list_get(stream_list), rstream) {
-		if (rstream->is_pinned) {
-			struct cras_iodev *dev;
-
-			/* Skip closing hotword stream in the first pass.
-			 * Closing an input device may resume hotword stream
-			 * with its post_close_iodev_hook so we should deal
-			 * with hotword stream in the second pass.
-			 */
-			if ((rstream->flags & HOTWORD_STREAM) == HOTWORD_STREAM)
-				continue;
-
-			dev = find_dev(rstream->pinned_dev_idx);
-			if (dev) {
-				audio_thread_disconnect_stream(audio_thread,
-							       rstream, dev);
-				if (!cras_iodev_list_dev_is_enabled(dev))
-					close_dev(dev);
-			}
-		} else {
-			audio_thread_disconnect_stream(audio_thread, rstream,
-						       NULL);
-		}
-	}
-	stream_list_suspended = 1;
-
-	DL_FOREACH (enabled_devs[CRAS_STREAM_OUTPUT], edev) {
-		close_dev(edev->dev);
-	}
-	DL_FOREACH (enabled_devs[CRAS_STREAM_INPUT], edev) {
-		close_dev(edev->dev);
-	}
-
-	/* Doing this check after all the other enabled iodevs are closed to
-	 * ensure preempted hotword streams obey the pause_at_suspend flag.
-	 */
-	if (cras_system_get_hotword_pause_at_suspend()) {
-		cras_iodev_list_suspend_hotword_streams();
-		hotword_auto_resume = 1;
-	}
-}
-
-static int stream_added_cb(struct cras_rstream *rstream);
-
-static void resume_devs()
-{
-	struct enabled_dev *edev;
-	struct cras_rstream *rstream;
-
-	int has_output_stream = 0;
-	stream_list_suspended = 0;
-
-	MAINLOG(main_log, MAIN_THREAD_RESUME_DEVS, 0, 0, 0);
-
-	/* Auto-resume based on the local flag in case the system state flag has
-	 * changed.
-	 */
-	if (hotword_auto_resume) {
-		cras_iodev_list_resume_hotword_stream();
-		hotword_auto_resume = 0;
-	}
-
-	/*
-	 * To remove the short popped noise caused by applications that can not
-	 * stop playback "right away" after resume, we mute all output devices
-	 * for a short time if there is any output stream.
-	 */
-	DL_FOREACH (stream_list_get(stream_list), rstream) {
-		if (rstream->direction == CRAS_STREAM_OUTPUT)
-			has_output_stream++;
-	}
-	if (has_output_stream) {
-		DL_FOREACH (enabled_devs[CRAS_STREAM_OUTPUT], edev) {
-			edev->dev->initial_ramp_request =
-				CRAS_IODEV_RAMP_REQUEST_RESUME_MUTE;
-		}
-	}
-
-	DL_FOREACH (stream_list_get(stream_list), rstream) {
-		if ((rstream->flags & HOTWORD_STREAM) == HOTWORD_STREAM)
-			continue;
-		stream_added_cb(rstream);
-	}
-}
-
-/* Called when the system audio is suspended or resumed. */
-void sys_suspend_change(void *arg, int suspended)
-{
-	if (suspended)
-		suspend_devs();
-	else
-		resume_devs();
-}
-
-/* Called when the system capture mute state changes.  Pass the current capture
- * mute setting to the default input if it is active. */
-static void sys_cap_mute_change(void *context, int muted, int mute_locked)
-{
-	struct cras_iodev *dev;
-
-	DL_FOREACH (devs[CRAS_STREAM_INPUT].iodevs, dev) {
-		if (dev->set_capture_mute && cras_iodev_is_open(dev))
-			dev->set_capture_mute(dev);
-	}
-}
-
-static int disable_device(struct enabled_dev *edev, bool force);
-static int enable_device(struct cras_iodev *dev);
-
-static void possibly_disable_fallback(enum CRAS_STREAM_DIRECTION dir)
-{
-	struct enabled_dev *edev;
-
-	DL_FOREACH (enabled_devs[dir], edev) {
-		if (edev->dev == fallback_devs[dir])
-			disable_device(edev, false);
-	}
-}
-
-/*
- * Possibly enables fallback device to handle streams.
- * dir - output or input.
- * error - true if enable fallback device because no other iodevs can be
- * initialized successfully.
- */
-static void possibly_enable_fallback(enum CRAS_STREAM_DIRECTION dir, bool error)
-{
-	if (fallback_devs[dir] == NULL)
-		return;
-
-	/*
-	 * The fallback device is a special device. It doesn't have a real
-	 * device to get a correct node type. Therefore, we need to set it by
-	 * ourselves, which indicates the reason to use this device.
-	 * NORMAL - Use it because of nodes changed.
-	 * ABNORMAL - Use it because there are no other usable devices.
-	 */
-	if (error)
-		syslog(LOG_ERR,
-		       "Enable fallback device because there are no other usable devices.");
-
-	fallback_devs[dir]->active_node->type =
-		error ? CRAS_NODE_TYPE_FALLBACK_ABNORMAL :
-			CRAS_NODE_TYPE_FALLBACK_NORMAL;
-	if (!cras_iodev_list_dev_is_enabled(fallback_devs[dir]))
-		enable_device(fallback_devs[dir]);
-}
-
-/*
- * Adds stream to one or more open iodevs. If the stream has processing effect
- * turned on, create new APM instance and add to the list. This makes sure the
- * time consuming APM creation happens in main thread.
- */
-static int add_stream_to_open_devs(struct cras_rstream *stream,
-				   struct cras_iodev **iodevs,
-				   unsigned int num_iodevs)
-{
-	int i;
-	if (stream->apm_list) {
-		for (i = 0; i < num_iodevs; i++)
-			cras_apm_list_add_apm(stream->apm_list, iodevs[i],
-					      iodevs[i]->format,
-					      cras_iodev_is_aec_use_case(
-						      iodevs[i]->active_node));
-	}
-	return audio_thread_add_stream(audio_thread, stream, iodevs,
-				       num_iodevs);
-}
-
-static int init_and_attach_streams(struct cras_iodev *dev)
-{
-	int rc;
-	enum CRAS_STREAM_DIRECTION dir = dev->direction;
-	struct cras_rstream *stream;
-	int dev_enabled = cras_iodev_list_dev_is_enabled(dev);
-
-	/* If called after suspend, for example bluetooth
-	 * profile switching, don't add back the stream list. */
-	if (stream_list_suspended)
-		return 0;
-
-	/* If there are active streams to attach to this device,
-	 * open it. */
-	DL_FOREACH (stream_list_get(stream_list), stream) {
-		bool can_attach = 0;
-
-		if (stream->direction != dir)
-			continue;
-		/*
-		 * For normal stream, if device is enabled by UI then it can
-		 * attach to this dev.
-		 */
-		if (!stream->is_pinned) {
-			can_attach = dev_enabled;
-		}
-		/*
-		 * If this is a pinned stream, attach it if its pinned dev id
-		 * matches this device or any fallback dev. Note that attaching
-		 * a pinned stream to fallback device is temporary. When the
-		 * fallback dev gets disabled in possibly_disable_fallback()
-		 * the check stream_list_has_pinned_stream() is key to allow
-		 * all streams to be removed from fallback and close it.
-		 */
-		else if ((stream->pinned_dev_idx == dev->info.idx) ||
-			 (SILENT_PLAYBACK_DEVICE == dev->info.idx) ||
-			 (SILENT_RECORD_DEVICE == dev->info.idx)) {
-			can_attach = 1;
-		}
-
-		if (!can_attach)
-			continue;
-
-		/*
-		 * Note that the stream list is descending ordered by channel
-		 * count, which guarantees the first attachable stream will have
-		 * the highest channel count.
-		 */
-		rc = init_device(dev, stream);
-		if (rc) {
-			syslog(LOG_ERR, "Enable %s failed, rc = %d",
-			       dev->info.name, rc);
-			return rc;
-		}
-		add_stream_to_open_devs(stream, &dev, 1);
-	}
-	return 0;
-}
-
-static void init_device_cb(struct cras_timer *timer, void *arg)
-{
-	int rc;
-	struct dev_init_retry *retry = (struct dev_init_retry *)arg;
-	struct cras_iodev *dev = find_dev(retry->dev_idx);
-
-	/*
-	 * First of all, remove retry record to avoid confusion to the
-	 * actual device init work.
-	 */
-	DL_DELETE(init_retries, retry);
-	free(retry);
-
-	if (!dev || cras_iodev_is_open(dev))
-		return;
-
-	rc = init_and_attach_streams(dev);
-	if (rc < 0)
-		syslog(LOG_ERR, "Init device retry failed");
-	else
-		possibly_disable_fallback(dev->direction);
-}
-
-static int schedule_init_device_retry(struct cras_iodev *dev)
-{
-	struct dev_init_retry *retry;
-	struct cras_tm *tm = cras_system_state_get_tm();
-
-	retry = (struct dev_init_retry *)calloc(1, sizeof(*retry));
-	if (!retry)
-		return -ENOMEM;
-
-	retry->dev_idx = dev->info.idx;
-	retry->init_timer = cras_tm_create_timer(tm, INIT_DEV_DELAY_MS,
-						 init_device_cb, retry);
-	DL_APPEND(init_retries, retry);
-	return 0;
-}
-
-static int init_pinned_device(struct cras_iodev *dev,
-			      struct cras_rstream *rstream)
-{
-	int rc;
-
-	cras_iodev_exit_idle(dev);
-
-	if (audio_thread_is_dev_open(audio_thread, dev))
-		return 0;
-
-	/* Make sure the active node is configured properly, it could be
-	 * disabled when last normal stream removed. */
-	dev->update_active_node(dev, dev->active_node->idx, 1);
-
-	/* Negative EAGAIN code indicates dev will be opened later. */
-	rc = init_device(dev, rstream);
-	if (rc)
-		return rc;
-	return 0;
-}
-
-/*
- * Close device enabled by pinned stream. Since it's NOT in the enabled
- * dev list, make sure update_active_node() is called to correctly
- * configure the ALSA UCM or BT profile state.
- */
-static int close_pinned_device(struct cras_iodev *dev)
-{
-	close_dev(dev);
-	dev->update_active_node(dev, dev->active_node->idx, 0);
-	return 0;
-}
-
-static struct cras_iodev *find_pinned_device(struct cras_rstream *rstream)
-{
-	struct cras_iodev *dev;
-	if (!rstream->is_pinned)
-		return NULL;
-
-	dev = find_dev(rstream->pinned_dev_idx);
-
-	if ((rstream->flags & HOTWORD_STREAM) != HOTWORD_STREAM)
-		return dev;
-
-	/* Double check node type for hotword stream */
-	if (dev && dev->active_node->type != CRAS_NODE_TYPE_HOTWORD) {
-		syslog(LOG_ERR, "Hotword stream pinned to invalid dev %u",
-		       dev->info.idx);
-		return NULL;
-	}
-
-	return hotword_suspended ? empty_hotword_dev : dev;
-}
-
-static int pinned_stream_added(struct cras_rstream *rstream)
-{
-	struct cras_iodev *dev;
-	int rc;
-
-	/* Check that the target device is valid for pinned streams. */
-	dev = find_pinned_device(rstream);
-	if (!dev)
-		return -EINVAL;
-
-	rc = init_pinned_device(dev, rstream);
-	if (rc) {
-		syslog(LOG_INFO, "init_pinned_device failed, rc %d", rc);
-		return schedule_init_device_retry(dev);
-	}
-
-	return add_stream_to_open_devs(rstream, &dev, 1);
-}
-
-static int stream_added_cb(struct cras_rstream *rstream)
-{
-	struct enabled_dev *edev;
-	struct cras_iodev *iodevs[10];
-	unsigned int num_iodevs;
-	int rc;
-	bool iodev_reopened;
-
-	if (stream_list_suspended)
-		return 0;
-
-	MAINLOG(main_log, MAIN_THREAD_STREAM_ADDED, rstream->stream_id,
-		rstream->direction, rstream->buffer_frames);
-
-	if (rstream->is_pinned)
-		return pinned_stream_added(rstream);
-
-	/* Add the new stream to all enabled iodevs at once to avoid offset
-	 * in shm level between different ouput iodevs. */
-	num_iodevs = 0;
-	iodev_reopened = false;
-	DL_FOREACH (enabled_devs[rstream->direction], edev) {
-		if (num_iodevs >= ARRAY_SIZE(iodevs)) {
-			syslog(LOG_ERR, "too many enabled devices");
-			break;
-		}
-
-		if (cras_iodev_is_open(edev->dev) &&
-		    (rstream->format.num_channels >
-		     edev->dev->format->num_channels) &&
-		    (rstream->format.num_channels <=
-		     edev->dev->info.max_supported_channels)) {
-			/* Re-open the device with the format of the attached
-			 * stream if it has higher channel count than the
-			 * current format of the device, and doesn't exceed the
-			 * max_supported_channels of the device.
-			 * Fallback device will be transciently enabled during
-			 * the device re-opening.
-			 */
-			MAINLOG(main_log, MAIN_THREAD_DEV_REOPEN,
-				rstream->format.num_channels,
-				edev->dev->format->num_channels,
-				edev->dev->format->frame_rate);
-			syslog(LOG_INFO, "re-open %s for higher channel count",
-			       edev->dev->info.name);
-			possibly_enable_fallback(rstream->direction, false);
-			cras_iodev_list_suspend_dev(edev->dev->info.idx);
-			cras_iodev_list_resume_dev(edev->dev->info.idx);
-			possibly_disable_fallback(rstream->direction);
-			iodev_reopened = true;
-		} else {
-			rc = init_device(edev->dev, rstream);
-			if (rc) {
-				/* Error log but don't return error here, because
-				 * stopping audio could block video playback.
-				 */
-				syslog(LOG_ERR, "Init %s failed, rc = %d",
-				       edev->dev->info.name, rc);
-				schedule_init_device_retry(edev->dev);
-				continue;
-			}
-
-			iodevs[num_iodevs++] = edev->dev;
-		}
-	}
-	if (num_iodevs) {
-		rc = add_stream_to_open_devs(rstream, iodevs, num_iodevs);
-		if (rc) {
-			syslog(LOG_ERR, "adding stream to thread fail");
-			return rc;
-		}
-	} else if (!iodev_reopened) {
-		/* Enable fallback device if no other iodevs can be initialized
-		 * or re-opened successfully.
-		 * For error codes like EAGAIN and ENOENT, a new iodev will be
-		 * enabled soon so streams are going to route there. As for the
-		 * rest of the error cases, silence will be played or recorded
-		 * so client won't be blocked.
-		 * The enabled fallback device will be disabled when
-		 * cras_iodev_list_select_node() is called to re-select the
-		 * active node.
-		 */
-		possibly_enable_fallback(rstream->direction, true);
-	}
-	return 0;
-}
-
-static int possibly_close_enabled_devs(enum CRAS_STREAM_DIRECTION dir)
-{
-	struct enabled_dev *edev;
-	const struct cras_rstream *s;
-
-	/* Check if there are still default streams attached. */
-	DL_FOREACH (stream_list_get(stream_list), s) {
-		if (s->direction == dir && !s->is_pinned)
-			return 0;
-	}
-
-	/* No more default streams, close any device that doesn't have a stream
-	 * pinned to it. */
-	DL_FOREACH (enabled_devs[dir], edev) {
-		if (stream_list_has_pinned_stream(stream_list,
-						  edev->dev->info.idx))
-			continue;
-		if (dir == CRAS_STREAM_INPUT) {
-			close_dev(edev->dev);
-			continue;
-		}
-		/* Allow output devs to drain before closing. */
-		clock_gettime(CLOCK_MONOTONIC_RAW, &edev->dev->idle_timeout);
-		add_timespecs(&edev->dev->idle_timeout, &idle_timeout_interval);
-		idle_dev_check(NULL, NULL);
-	}
-
-	return 0;
-}
-
-static void pinned_stream_removed(struct cras_rstream *rstream)
-{
-	struct cras_iodev *dev;
-
-	dev = find_pinned_device(rstream);
-	if (!dev)
-		return;
-	if (!cras_iodev_list_dev_is_enabled(dev) &&
-	    !stream_list_has_pinned_stream(stream_list, dev->info.idx))
-		close_pinned_device(dev);
-}
-
-/* Returns the number of milliseconds left to drain this stream.  This is passed
- * directly from the audio thread. */
-static int stream_removed_cb(struct cras_rstream *rstream)
-{
-	enum CRAS_STREAM_DIRECTION direction = rstream->direction;
-	int rc;
-
-	rc = audio_thread_drain_stream(audio_thread, rstream);
-	if (rc)
-		return rc;
-
-	MAINLOG(main_log, MAIN_THREAD_STREAM_REMOVED, rstream->stream_id, 0, 0);
-
-	if (rstream->is_pinned)
-		pinned_stream_removed(rstream);
-
-	possibly_close_enabled_devs(direction);
-
-	return 0;
-}
-
-static int enable_device(struct cras_iodev *dev)
-{
-	int rc;
-	struct enabled_dev *edev;
-	enum CRAS_STREAM_DIRECTION dir = dev->direction;
-	struct device_enabled_cb *callback;
-
-	DL_FOREACH (enabled_devs[dir], edev) {
-		if (edev->dev == dev)
-			return -EEXIST;
-	}
-
-	edev = calloc(1, sizeof(*edev));
-	edev->dev = dev;
-	DL_APPEND(enabled_devs[dir], edev);
-	dev->is_enabled = 1;
-
-	rc = init_and_attach_streams(dev);
-	if (rc < 0) {
-		syslog(LOG_INFO, "Enable device fail, rc %d", rc);
-		schedule_init_device_retry(dev);
-		return rc;
-	}
-
-	DL_FOREACH (device_enable_cbs, callback)
-		callback->enabled_cb(dev, callback->cb_data);
-
-	return 0;
-}
-
-/* Set `force to true to flush any pinned streams before closing the device. */
-static int disable_device(struct enabled_dev *edev, bool force)
-{
-	struct cras_iodev *dev = edev->dev;
-	enum CRAS_STREAM_DIRECTION dir = dev->direction;
-	struct cras_rstream *stream;
-	struct device_enabled_cb *callback;
-
-	MAINLOG(main_log, MAIN_THREAD_DEV_DISABLE, dev->info.idx, force, 0);
-	/*
-	 * Remove from enabled dev list. However this dev could have a stream
-	 * pinned to it, only cancel pending init timers when force flag is set.
-	 */
-	DL_DELETE(enabled_devs[dir], edev);
-	free(edev);
-	dev->is_enabled = 0;
-	if (force) {
-		cancel_pending_init_retries(dev->info.idx);
-	}
-	/* If there's a pinned stream exists, simply disconnect all the normal
-	 * streams off this device and return. */
-	else if (stream_list_has_pinned_stream(stream_list, dev->info.idx)) {
-		DL_FOREACH (stream_list_get(stream_list), stream) {
-			if (stream->direction != dev->direction)
-				continue;
-			if (stream->is_pinned)
-				continue;
-			audio_thread_disconnect_stream(audio_thread, stream,
-						       dev);
-		}
-		return 0;
-	}
-
-	DL_FOREACH (device_enable_cbs, callback)
-		callback->disabled_cb(dev, callback->cb_data);
-	close_dev(dev);
-	dev->update_active_node(dev, dev->active_node->idx, 0);
-
-	return 0;
-}
-
-/*
- * Exported Interface.
- */
-
-void cras_iodev_list_init()
-{
-	struct cras_observer_ops observer_ops;
-
-	memset(&observer_ops, 0, sizeof(observer_ops));
-	observer_ops.output_volume_changed = sys_vol_change;
-	observer_ops.output_mute_changed = sys_mute_change;
-	observer_ops.capture_mute_changed = sys_cap_mute_change;
-	observer_ops.suspend_changed = sys_suspend_change;
-	list_observer = cras_observer_add(&observer_ops, NULL);
-	idle_timer = NULL;
-
-	main_log = main_thread_event_log_init();
-
-	/* Create the audio stream list for the system. */
-	stream_list =
-		stream_list_create(stream_added_cb, stream_removed_cb,
-				   cras_rstream_create, cras_rstream_destroy,
-				   cras_system_state_get_tm());
-
-	/* Add an empty device so there is always something to play to or
-	 * capture from. */
-	fallback_devs[CRAS_STREAM_OUTPUT] = empty_iodev_create(
-		CRAS_STREAM_OUTPUT, CRAS_NODE_TYPE_FALLBACK_NORMAL);
-	fallback_devs[CRAS_STREAM_INPUT] = empty_iodev_create(
-		CRAS_STREAM_INPUT, CRAS_NODE_TYPE_FALLBACK_NORMAL);
-	enable_device(fallback_devs[CRAS_STREAM_OUTPUT]);
-	enable_device(fallback_devs[CRAS_STREAM_INPUT]);
-
-	empty_hotword_dev =
-		empty_iodev_create(CRAS_STREAM_INPUT, CRAS_NODE_TYPE_HOTWORD);
-
-	/* Create loopback devices. */
-	loopdev_post_mix = loopback_iodev_create(LOOPBACK_POST_MIX_PRE_DSP);
-	loopdev_post_dsp = loopback_iodev_create(LOOPBACK_POST_DSP);
-
-	audio_thread = audio_thread_create();
-	if (!audio_thread) {
-		syslog(LOG_ERR, "Fatal: audio thread init");
-		exit(-ENOMEM);
-	}
-	audio_thread_start(audio_thread);
-
-	cras_iodev_list_update_device_list();
-}
-
-void cras_iodev_list_deinit()
-{
-	audio_thread_destroy(audio_thread);
-	loopback_iodev_destroy(loopdev_post_dsp);
-	loopback_iodev_destroy(loopdev_post_mix);
-	empty_iodev_destroy(empty_hotword_dev);
-	empty_iodev_destroy(fallback_devs[CRAS_STREAM_INPUT]);
-	empty_iodev_destroy(fallback_devs[CRAS_STREAM_OUTPUT]);
-	stream_list_destroy(stream_list);
-	main_thread_event_log_deinit(main_log);
-	if (list_observer) {
-		cras_observer_remove(list_observer);
-		list_observer = NULL;
-	}
-}
-
-int cras_iodev_list_dev_is_enabled(const struct cras_iodev *dev)
-{
-	struct enabled_dev *edev;
-
-	DL_FOREACH (enabled_devs[dev->direction], edev) {
-		if (edev->dev == dev)
-			return 1;
-	}
-
-	return 0;
-}
-
-void cras_iodev_list_enable_dev(struct cras_iodev *dev)
-{
-	possibly_disable_fallback(dev->direction);
-	/* Enable ucm setting of active node. */
-	dev->update_active_node(dev, dev->active_node->idx, 1);
-	enable_device(dev);
-	cras_iodev_list_notify_active_node_changed(dev->direction);
-}
-
-void cras_iodev_list_add_active_node(enum CRAS_STREAM_DIRECTION dir,
-				     cras_node_id_t node_id)
-{
-	struct cras_iodev *new_dev;
-	new_dev = find_dev(dev_index_of(node_id));
-	if (!new_dev || new_dev->direction != dir)
-		return;
-
-	MAINLOG(main_log, MAIN_THREAD_ADD_ACTIVE_NODE, new_dev->info.idx, 0, 0);
-
-	/* If the new dev is already enabled but its active node needs to be
-	 * changed. Disable new dev first, update active node, and then
-	 * re-enable it again.
-	 */
-	if (cras_iodev_list_dev_is_enabled(new_dev)) {
-		if (node_index_of(node_id) == new_dev->active_node->idx)
-			return;
-		else
-			cras_iodev_list_disable_dev(new_dev, true);
-	}
-
-	new_dev->update_active_node(new_dev, node_index_of(node_id), 1);
-	cras_iodev_list_enable_dev(new_dev);
-}
-
-/*
- * Disables device which may or may not be in enabled_devs list.
- */
-void cras_iodev_list_disable_dev(struct cras_iodev *dev, bool force_close)
-{
-	struct enabled_dev *edev, *edev_to_disable = NULL;
-
-	int is_the_only_enabled_device = 1;
-
-	DL_FOREACH (enabled_devs[dev->direction], edev) {
-		if (edev->dev == dev)
-			edev_to_disable = edev;
-		else
-			is_the_only_enabled_device = 0;
-	}
-
-	/*
-	 * Disables the device for these two cases:
-	 * 1. Disable a device in the enabled_devs list.
-	 * 2. Force close a device that is not in the enabled_devs list,
-	 *    but it is running a pinned stream.
-	 */
-	if (!edev_to_disable) {
-		if (force_close)
-			close_pinned_device(dev);
-		return;
-	}
-
-	/* If the device to be closed is the only enabled device, we should
-	 * enable the fallback device first then disable the target
-	 * device. */
-	if (is_the_only_enabled_device && fallback_devs[dev->direction])
-		enable_device(fallback_devs[dev->direction]);
-
-	disable_device(edev_to_disable, force_close);
-
-	cras_iodev_list_notify_active_node_changed(dev->direction);
-	return;
-}
-
-void cras_iodev_list_suspend_dev(unsigned int dev_idx)
-{
-	struct cras_iodev *dev = find_dev(dev_idx);
-
-	if (!dev)
-		return;
-
-	/* Remove all streams including the pinned streams, and close
-	 * this iodev. */
-	close_dev(dev);
-	dev->update_active_node(dev, dev->active_node->idx, 0);
-}
-
-void cras_iodev_list_resume_dev(unsigned int dev_idx)
-{
-	struct cras_iodev *dev = find_dev(dev_idx);
-	int rc;
-
-	if (!dev)
-		return;
-
-	dev->update_active_node(dev, dev->active_node->idx, 1);
-	rc = init_and_attach_streams(dev);
-	if (rc == 0) {
-		/* If dev initialize succeeded and this is not a pinned device,
-		 * disable the silent fallback device because it's just
-		 * unnecessary. */
-		if (!stream_list_has_pinned_stream(stream_list, dev_idx))
-			possibly_disable_fallback(dev->direction);
-	} else {
-		syslog(LOG_INFO, "Enable dev fail at resume, rc %d", rc);
-		schedule_init_device_retry(dev);
-	}
-}
-
-void cras_iodev_list_set_dev_mute(unsigned int dev_idx)
-{
-	struct cras_iodev *dev;
-
-	dev = find_dev(dev_idx);
-	if (!dev)
-		return;
-
-	cras_iodev_set_mute(dev);
-}
-
-void cras_iodev_list_rm_active_node(enum CRAS_STREAM_DIRECTION dir,
-				    cras_node_id_t node_id)
-{
-	struct cras_iodev *dev;
-
-	dev = find_dev(dev_index_of(node_id));
-	if (!dev)
-		return;
-
-	cras_iodev_list_disable_dev(dev, false);
-}
-
-int cras_iodev_list_add_output(struct cras_iodev *output)
-{
-	int rc;
-
-	if (output->direction != CRAS_STREAM_OUTPUT)
-		return -EINVAL;
-
-	rc = add_dev_to_list(output);
-	if (rc)
-		return rc;
-
-	MAINLOG(main_log, MAIN_THREAD_ADD_TO_DEV_LIST, output->info.idx,
-		CRAS_STREAM_OUTPUT, 0);
-	return 0;
-}
-
-int cras_iodev_list_add_input(struct cras_iodev *input)
-{
-	int rc;
-
-	if (input->direction != CRAS_STREAM_INPUT)
-		return -EINVAL;
-
-	rc = add_dev_to_list(input);
-	if (rc)
-		return rc;
-
-	MAINLOG(main_log, MAIN_THREAD_ADD_TO_DEV_LIST, input->info.idx,
-		CRAS_STREAM_INPUT, 0);
-	return 0;
-}
-
-int cras_iodev_list_rm_output(struct cras_iodev *dev)
-{
-	int res;
-
-	/* Retire the current active output device before removing it from
-	 * list, otherwise it could be busy and remain in the list.
-	 */
-	cras_iodev_list_disable_dev(dev, true);
-	res = rm_dev_from_list(dev);
-	if (res == 0)
-		cras_iodev_list_update_device_list();
-	return res;
-}
-
-int cras_iodev_list_rm_input(struct cras_iodev *dev)
-{
-	int res;
-
-	/* Retire the current active input device before removing it from
-	 * list, otherwise it could be busy and remain in the list.
-	 */
-	cras_iodev_list_disable_dev(dev, true);
-	res = rm_dev_from_list(dev);
-	if (res == 0)
-		cras_iodev_list_update_device_list();
-	return res;
-}
-
-int cras_iodev_list_get_outputs(struct cras_iodev_info **list_out)
-{
-	return get_dev_list(&devs[CRAS_STREAM_OUTPUT], list_out);
-}
-
-int cras_iodev_list_get_inputs(struct cras_iodev_info **list_out)
-{
-	return get_dev_list(&devs[CRAS_STREAM_INPUT], list_out);
-}
-
-struct cras_iodev *
-cras_iodev_list_get_first_enabled_iodev(enum CRAS_STREAM_DIRECTION direction)
-{
-	struct enabled_dev *edev = enabled_devs[direction];
-
-	return edev ? edev->dev : NULL;
-}
-
-struct cras_iodev *
-cras_iodev_list_get_sco_pcm_iodev(enum CRAS_STREAM_DIRECTION direction)
-{
-	struct cras_iodev *dev;
-	struct cras_ionode *node;
-
-	DL_FOREACH (devs[direction].iodevs, dev) {
-		DL_FOREACH (dev->nodes, node) {
-			if (node->is_sco_pcm)
-				return dev;
-		}
-	}
-
-	return NULL;
-}
-
-cras_node_id_t
-cras_iodev_list_get_active_node_id(enum CRAS_STREAM_DIRECTION direction)
-{
-	struct enabled_dev *edev = enabled_devs[direction];
-
-	if (!edev || !edev->dev || !edev->dev->active_node)
-		return 0;
-
-	return cras_make_node_id(edev->dev->info.idx,
-				 edev->dev->active_node->idx);
-}
-
-void cras_iodev_list_update_device_list()
-{
-	struct cras_server_state *state;
-
-	state = cras_system_state_update_begin();
-	if (!state)
-		return;
-
-	state->num_output_devs = devs[CRAS_STREAM_OUTPUT].size;
-	state->num_input_devs = devs[CRAS_STREAM_INPUT].size;
-	fill_dev_list(&devs[CRAS_STREAM_OUTPUT], &state->output_devs[0],
-		      CRAS_MAX_IODEVS);
-	fill_dev_list(&devs[CRAS_STREAM_INPUT], &state->input_devs[0],
-		      CRAS_MAX_IODEVS);
-
-	state->num_output_nodes =
-		fill_node_list(&devs[CRAS_STREAM_OUTPUT],
-			       &state->output_nodes[0], CRAS_MAX_IONODES);
-	state->num_input_nodes =
-		fill_node_list(&devs[CRAS_STREAM_INPUT], &state->input_nodes[0],
-			       CRAS_MAX_IONODES);
-
-	cras_system_state_update_complete();
-}
-
-/* Look up the first hotword stream and the device it pins to. */
-int find_hotword_stream_dev(struct cras_iodev **dev,
-			    struct cras_rstream **stream)
-{
-	DL_FOREACH (stream_list_get(stream_list), *stream) {
-		if (((*stream)->flags & HOTWORD_STREAM) != HOTWORD_STREAM)
-			continue;
-
-		*dev = find_dev((*stream)->pinned_dev_idx);
-		if (*dev == NULL)
-			return -ENOENT;
-		break;
-	}
-	return 0;
-}
-
-/* Suspend/resume hotword streams functions are used to provide seamless
- * experience to cras clients when there's hardware limitation about concurrent
- * DSP and normal recording. The empty hotword iodev is used to hold all
- * hotword streams during suspend, so client side will not know about the
- * transition, and can still remove or add streams. At resume, the real hotword
- * device will be initialized and opened again to re-arm the DSP.
- */
-int cras_iodev_list_suspend_hotword_streams()
-{
-	struct cras_iodev *hotword_dev;
-	struct cras_rstream *stream = NULL;
-	int rc;
-
-	rc = find_hotword_stream_dev(&hotword_dev, &stream);
-	if (rc)
-		return rc;
-
-	if (stream == NULL) {
-		hotword_suspended = 1;
-		return 0;
-	}
-	/* Move all existing hotword streams to the empty hotword iodev. */
-	init_pinned_device(empty_hotword_dev, stream);
-	DL_FOREACH (stream_list_get(stream_list), stream) {
-		if ((stream->flags & HOTWORD_STREAM) != HOTWORD_STREAM)
-			continue;
-		if (stream->pinned_dev_idx != hotword_dev->info.idx) {
-			syslog(LOG_ERR,
-			       "Failed to suspend hotword stream on dev %u",
-			       stream->pinned_dev_idx);
-			continue;
-		}
-
-		audio_thread_disconnect_stream(audio_thread, stream,
-					       hotword_dev);
-		audio_thread_add_stream(audio_thread, stream,
-					&empty_hotword_dev, 1);
-	}
-	close_pinned_device(hotword_dev);
-	hotword_suspended = 1;
-	return 0;
-}
-
-int cras_iodev_list_resume_hotword_stream()
-{
-	struct cras_iodev *hotword_dev;
-	struct cras_rstream *stream = NULL;
-	int rc;
-
-	rc = find_hotword_stream_dev(&hotword_dev, &stream);
-	if (rc)
-		return rc;
-
-	if (stream == NULL) {
-		hotword_suspended = 0;
-		return 0;
-	}
-	/* Move all existing hotword streams to the real hotword iodev. */
-	init_pinned_device(hotword_dev, stream);
-	DL_FOREACH (stream_list_get(stream_list), stream) {
-		if ((stream->flags & HOTWORD_STREAM) != HOTWORD_STREAM)
-			continue;
-		if (stream->pinned_dev_idx != hotword_dev->info.idx) {
-			syslog(LOG_ERR,
-			       "Fail to resume hotword stream on dev %u",
-			       stream->pinned_dev_idx);
-			continue;
-		}
-
-		audio_thread_disconnect_stream(audio_thread, stream,
-					       empty_hotword_dev);
-		audio_thread_add_stream(audio_thread, stream, &hotword_dev, 1);
-	}
-	close_pinned_device(empty_hotword_dev);
-	hotword_suspended = 0;
-	return 0;
-}
-
-char *cras_iodev_list_get_hotword_models(cras_node_id_t node_id)
-{
-	struct cras_iodev *dev = NULL;
-
-	dev = find_dev(dev_index_of(node_id));
-	if (!dev || !dev->get_hotword_models ||
-	    (dev->active_node->type != CRAS_NODE_TYPE_HOTWORD))
-		return NULL;
-
-	return dev->get_hotword_models(dev);
-}
-
-int cras_iodev_list_set_hotword_model(cras_node_id_t node_id,
-				      const char *model_name)
-{
-	int ret;
-	struct cras_iodev *dev = find_dev(dev_index_of(node_id));
-	if (!dev || !dev->get_hotword_models ||
-	    (dev->active_node->type != CRAS_NODE_TYPE_HOTWORD))
-		return -EINVAL;
-
-	ret = dev->set_hotword_model(dev, model_name);
-	if (!ret)
-		strncpy(dev->active_node->active_hotword_model, model_name,
-			sizeof(dev->active_node->active_hotword_model) - 1);
-	return ret;
-}
-
-void cras_iodev_list_notify_nodes_changed()
-{
-	cras_observer_notify_nodes();
-}
-
-void cras_iodev_list_notify_active_node_changed(
-	enum CRAS_STREAM_DIRECTION direction)
-{
-	cras_observer_notify_active_node(
-		direction, cras_iodev_list_get_active_node_id(direction));
-}
-
-void cras_iodev_list_select_node(enum CRAS_STREAM_DIRECTION direction,
-				 cras_node_id_t node_id)
-{
-	struct cras_iodev *new_dev = NULL;
-	struct enabled_dev *edev;
-	int new_node_already_enabled = 0;
-	struct cras_rstream *rstream;
-	int has_output_stream = 0;
-	int rc;
-
-	/* find the devices for the id. */
-	new_dev = find_dev(dev_index_of(node_id));
-
-	MAINLOG(main_log, MAIN_THREAD_SELECT_NODE, dev_index_of(node_id), 0, 0);
-
-	/* Do nothing if the direction is mismatched. The new_dev == NULL case
-	   could happen if node_id is 0 (no selection), or the client tries
-	   to select a non-existing node (maybe it's unplugged just before
-	   the client selects it). We will just behave like there is no selected
-	   node. */
-	if (new_dev && new_dev->direction != direction)
-		return;
-
-	/* Determine whether the new device and node are already enabled - if
-	 * they are, the selection algorithm should avoid disabling the new
-	 * device. */
-	DL_FOREACH (enabled_devs[direction], edev) {
-		if (edev->dev == new_dev &&
-		    edev->dev->active_node->idx == node_index_of(node_id)) {
-			new_node_already_enabled = 1;
-			break;
-		}
-	}
-
-	/* Enable fallback device during the transition so client will not be
-	 * blocked in this duration, which is as long as 300 ms on some boards
-	 * before new device is opened.
-	 * Note that the fallback node is not needed if the new node is already
-	 * enabled - the new node will remain enabled. */
-	if (!new_node_already_enabled)
-		possibly_enable_fallback(direction, false);
-
-	DL_FOREACH (enabled_devs[direction], edev) {
-		/* Don't disable fallback devices. */
-		if (edev->dev == fallback_devs[direction])
-			continue;
-		/*
-		 * Disable enabled device if it's not the new one, use non-force
-		 * disable call so we don't interrupt existing pinned streams on
-		 * it.
-		 */
-		if (edev->dev != new_dev) {
-			disable_device(edev, false);
-		}
-		/*
-		 * Otherwise if this happens to be the new device but about to
-		 * select to a different node (on the same dev). Force disable
-		 * this device to avoid any pinned stream occupies it in audio
-		 * thread and cause problem in later update_active_node call.
-		 */
-		else if (!new_node_already_enabled) {
-			disable_device(edev, true);
-		}
-	}
-
-	if (new_dev && !new_node_already_enabled) {
-		new_dev->update_active_node(new_dev, node_index_of(node_id), 1);
-
-		/* To reduce the popped noise of active device change, mute
-		 * new_dev's for RAMP_SWITCH_MUTE_DURATION_SECS s.
-		 */
-		DL_FOREACH (stream_list_get(stream_list), rstream) {
-			if (rstream->direction == CRAS_STREAM_OUTPUT)
-				has_output_stream++;
-		}
-		if (direction == CRAS_STREAM_OUTPUT && has_output_stream) {
-			new_dev->initial_ramp_request =
-				CRAS_IODEV_RAMP_REQUEST_SWITCH_MUTE;
-		}
-
-		rc = enable_device(new_dev);
-		if (rc == 0) {
-			/* Disable fallback device after new device is enabled.
-			 * Leave the fallback device enabled if new_dev failed
-			 * to open, or the new_dev == NULL case. */
-			possibly_disable_fallback(direction);
-		}
-	}
-
-	cras_iodev_list_notify_active_node_changed(direction);
-}
-
-static int set_node_plugged(struct cras_iodev *iodev, unsigned int node_idx,
-			    int plugged)
-{
-	struct cras_ionode *node;
-
-	node = find_node(iodev, node_idx);
-	if (!node)
-		return -EINVAL;
-	cras_iodev_set_node_plugged(node, plugged);
-	return 0;
-}
-
-static int set_node_volume(struct cras_iodev *iodev, unsigned int node_idx,
-			   int volume)
-{
-	struct cras_ionode *node;
-
-	node = find_node(iodev, node_idx);
-	if (!node)
-		return -EINVAL;
-
-	if (iodev->ramp && cras_iodev_software_volume_needed(iodev) &&
-	    !cras_system_get_mute())
-		cras_iodev_start_volume_ramp(iodev, node->volume, volume);
-
-	node->volume = volume;
-	if (iodev->set_volume)
-		iodev->set_volume(iodev);
-	cras_iodev_list_notify_node_volume(node);
-	MAINLOG(main_log, MAIN_THREAD_OUTPUT_NODE_VOLUME, iodev->info.idx,
-		volume, 0);
-	return 0;
-}
-
-static int set_node_capture_gain(struct cras_iodev *iodev,
-				 unsigned int node_idx, int value)
-{
-	struct cras_ionode *node;
-	int db_scale;
-
-	node = find_node(iodev, node_idx);
-	if (!node)
-		return -EINVAL;
-
-	/* Assert value in range 0 - 100. */
-	if (value < 0)
-		value = 0;
-	if (value > 100)
-		value = 100;
-
-	/* Linear maps (0, 50) to (-4000, 0) and (50, 100) to (0, 2000) dBFS.
-	 * Calculate and store corresponding scaler in ui_gain_scaler. */
-	db_scale = (value > 50) ? 40 : 80;
-	node->ui_gain_scaler =
-		convert_softvol_scaler_from_dB((value - 50) * db_scale);
-
-	if (iodev->set_capture_gain)
-		iodev->set_capture_gain(iodev);
-	cras_iodev_list_notify_node_capture_gain(node);
-	MAINLOG(main_log, MAIN_THREAD_INPUT_NODE_GAIN, iodev->info.idx, value,
-		0);
-	return 0;
-}
-
-static int set_node_left_right_swapped(struct cras_iodev *iodev,
-				       unsigned int node_idx,
-				       int left_right_swapped)
-{
-	struct cras_ionode *node;
-	int rc;
-
-	if (!iodev->set_swap_mode_for_node)
-		return -EINVAL;
-	node = find_node(iodev, node_idx);
-	if (!node)
-		return -EINVAL;
-
-	rc = iodev->set_swap_mode_for_node(iodev, node, left_right_swapped);
-	if (rc) {
-		syslog(LOG_ERR, "Failed to set swap mode on node %s to %d",
-		       node->name, left_right_swapped);
-		return rc;
-	}
-	node->left_right_swapped = left_right_swapped;
-	cras_iodev_list_notify_node_left_right_swapped(node);
-	return 0;
-}
-
-int cras_iodev_list_set_node_attr(cras_node_id_t node_id, enum ionode_attr attr,
-				  int value)
-{
-	struct cras_iodev *iodev;
-	int rc = 0;
-
-	iodev = find_dev(dev_index_of(node_id));
-	if (!iodev)
-		return -EINVAL;
-
-	switch (attr) {
-	case IONODE_ATTR_PLUGGED:
-		rc = set_node_plugged(iodev, node_index_of(node_id), value);
-		break;
-	case IONODE_ATTR_VOLUME:
-		rc = set_node_volume(iodev, node_index_of(node_id), value);
-		break;
-	case IONODE_ATTR_CAPTURE_GAIN:
-		rc = set_node_capture_gain(iodev, node_index_of(node_id),
-					   value);
-		break;
-	case IONODE_ATTR_SWAP_LEFT_RIGHT:
-		rc = set_node_left_right_swapped(iodev, node_index_of(node_id),
-						 value);
-		break;
-	default:
-		return -EINVAL;
-	}
-
-	return rc;
-}
-
-void cras_iodev_list_notify_node_volume(struct cras_ionode *node)
-{
-	cras_node_id_t id = cras_make_node_id(node->dev->info.idx, node->idx);
-	cras_iodev_list_update_device_list();
-	cras_observer_notify_output_node_volume(id, node->volume);
-}
-
-void cras_iodev_list_notify_node_left_right_swapped(struct cras_ionode *node)
-{
-	cras_node_id_t id = cras_make_node_id(node->dev->info.idx, node->idx);
-	cras_iodev_list_update_device_list();
-	cras_observer_notify_node_left_right_swapped(id,
-						     node->left_right_swapped);
-}
-
-void cras_iodev_list_notify_node_capture_gain(struct cras_ionode *node)
-{
-	cras_node_id_t id = cras_make_node_id(node->dev->info.idx, node->idx);
-	cras_iodev_list_update_device_list();
-	cras_observer_notify_input_node_gain(id, node->capture_gain);
-}
-
-void cras_iodev_list_add_test_dev(enum TEST_IODEV_TYPE type)
-{
-	if (type != TEST_IODEV_HOTWORD)
-		return;
-	test_iodev_create(CRAS_STREAM_INPUT, type);
-}
-
-void cras_iodev_list_test_dev_command(unsigned int iodev_idx,
-				      enum CRAS_TEST_IODEV_CMD command,
-				      unsigned int data_len,
-				      const uint8_t *data)
-{
-	struct cras_iodev *dev = find_dev(iodev_idx);
-
-	if (!dev)
-		return;
-
-	test_iodev_command(dev, command, data_len, data);
-}
-
-struct audio_thread *cras_iodev_list_get_audio_thread()
-{
-	return audio_thread;
-}
-
-struct stream_list *cras_iodev_list_get_stream_list()
-{
-	return stream_list;
-}
-
-int cras_iodev_list_set_device_enabled_callback(
-	device_enabled_callback_t enabled_cb,
-	device_disabled_callback_t disabled_cb, void *cb_data)
-{
-	struct device_enabled_cb *callback;
-
-	DL_FOREACH (device_enable_cbs, callback) {
-		if (callback->cb_data != cb_data)
-			continue;
-
-		DL_DELETE(device_enable_cbs, callback);
-		free(callback);
-	}
-
-	if (enabled_cb && disabled_cb) {
-		callback = (struct device_enabled_cb *)calloc(
-			1, sizeof(*callback));
-		callback->enabled_cb = enabled_cb;
-		callback->disabled_cb = disabled_cb;
-		callback->cb_data = cb_data;
-		DL_APPEND(device_enable_cbs, callback);
-	}
-
-	return 0;
-}
-
-void cras_iodev_list_register_loopback(enum CRAS_LOOPBACK_TYPE loopback_type,
-				       unsigned int output_dev_idx,
-				       loopback_hook_data_t hook_data,
-				       loopback_hook_control_t hook_control,
-				       unsigned int loopback_dev_idx)
-{
-	struct cras_iodev *iodev = find_dev(output_dev_idx);
-	struct cras_iodev *loopback_dev;
-	struct cras_loopback *loopback;
-	bool dev_open;
-
-	if (iodev == NULL) {
-		syslog(LOG_ERR, "Output dev %u not found for loopback",
-		       output_dev_idx);
-		return;
-	}
-
-	loopback_dev = find_dev(loopback_dev_idx);
-	if (loopback_dev == NULL) {
-		syslog(LOG_ERR, "Loopback dev %u not found", loopback_dev_idx);
-		return;
-	}
-
-	dev_open = cras_iodev_is_open(iodev);
-
-	loopback = (struct cras_loopback *)calloc(1, sizeof(*loopback));
-	if (NULL == loopback) {
-		syslog(LOG_ERR, "Not enough memory for loopback");
-		return;
-	}
-
-	loopback->type = loopback_type;
-	loopback->hook_data = hook_data;
-	loopback->hook_control = hook_control;
-	loopback->cb_data = loopback_dev;
-	if (loopback->hook_control && dev_open)
-		loopback->hook_control(true, loopback->cb_data);
-
-	DL_APPEND(iodev->loopbacks, loopback);
-}
-
-void cras_iodev_list_unregister_loopback(enum CRAS_LOOPBACK_TYPE type,
-					 unsigned int output_dev_idx,
-					 unsigned int loopback_dev_idx)
-{
-	struct cras_iodev *iodev = find_dev(output_dev_idx);
-	struct cras_iodev *loopback_dev;
-	struct cras_loopback *loopback;
-
-	if (iodev == NULL)
-		return;
-
-	loopback_dev = find_dev(loopback_dev_idx);
-	if (loopback_dev == NULL)
-		return;
-
-	DL_FOREACH (iodev->loopbacks, loopback) {
-		if ((loopback->cb_data == loopback_dev) &&
-		    (loopback->type == type)) {
-			DL_DELETE(iodev->loopbacks, loopback);
-			free(loopback);
-		}
-	}
-}
-
-void cras_iodev_list_reset_for_noise_cancellation()
-{
-	struct cras_iodev *dev;
-	bool enabled = cras_system_get_noise_cancellation_enabled();
-
-	DL_FOREACH (devs[CRAS_STREAM_INPUT].iodevs, dev) {
-		if (!cras_iodev_is_open(dev) ||
-		    !cras_iodev_support_noise_cancellation(dev))
-			continue;
-		syslog(LOG_INFO, "Re-open %s for %s noise cancellation",
-		       dev->info.name, enabled ? "enabling" : "disabling");
-		possibly_enable_fallback(CRAS_STREAM_INPUT, false);
-		cras_iodev_list_suspend_dev(dev->info.idx);
-		cras_iodev_list_resume_dev(dev->info.idx);
-		possibly_disable_fallback(CRAS_STREAM_INPUT);
-	}
-}
-
-void cras_iodev_list_reset()
-{
-	struct enabled_dev *edev;
-
-	DL_FOREACH (enabled_devs[CRAS_STREAM_OUTPUT], edev) {
-		DL_DELETE(enabled_devs[CRAS_STREAM_OUTPUT], edev);
-		free(edev);
-	}
-	enabled_devs[CRAS_STREAM_OUTPUT] = NULL;
-	DL_FOREACH (enabled_devs[CRAS_STREAM_INPUT], edev) {
-		DL_DELETE(enabled_devs[CRAS_STREAM_INPUT], edev);
-		free(edev);
-	}
-	enabled_devs[CRAS_STREAM_INPUT] = NULL;
-	devs[CRAS_STREAM_OUTPUT].iodevs = NULL;
-	devs[CRAS_STREAM_INPUT].iodevs = NULL;
-	devs[CRAS_STREAM_OUTPUT].size = 0;
-	devs[CRAS_STREAM_INPUT].size = 0;
-}
diff --git a/cras/src/server/cras_iodev_list.h b/cras/src/server/cras_iodev_list.h
deleted file mode 100644
index d6e9ba5..0000000
--- a/cras/src/server/cras_iodev_list.h
+++ /dev/null
@@ -1,285 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-/*
- * IO list manages the list of inputs and outputs available.
- */
-#ifndef CRAS_IODEV_LIST_H_
-#define CRAS_IODEV_LIST_H_
-
-#include <stdbool.h>
-#include <stdint.h>
-
-#include "cras_iodev.h"
-#include "cras_types.h"
-
-struct cras_rclient;
-struct stream_list;
-
-/* Device enabled/disabled callback. */
-typedef void (*device_enabled_callback_t)(struct cras_iodev *dev,
-					  void *cb_data);
-typedef void (*device_disabled_callback_t)(struct cras_iodev *dev,
-					   void *cb_data);
-
-/* Initialize the list of iodevs. */
-void cras_iodev_list_init();
-
-/* Clean up any resources used by iodev. */
-void cras_iodev_list_deinit();
-
-/* Adds an output to the output list.
- * Args:
- *    output - the output to add.
- * Returns:
- *    0 on success, negative error on failure.
- */
-int cras_iodev_list_add_output(struct cras_iodev *output);
-
-/* Adds an input to the input list.
- * Args:
- *    input - the input to add.
- * Returns:
- *    0 on success, negative error on failure.
- */
-int cras_iodev_list_add_input(struct cras_iodev *input);
-
-/* Removes an output from the output list.
- * Args:
- *    output - the output to remove.
- * Returns:
- *    0 on success, negative error on failure.
- */
-int cras_iodev_list_rm_output(struct cras_iodev *output);
-
-/* Removes an input from the input list.
- * Args:
- *    output - the input to remove.
- * Returns:
- *    0 on success, negative error on failure.
- */
-int cras_iodev_list_rm_input(struct cras_iodev *input);
-
-/* Gets a list of outputs. Callee must free the list when finished.  If list_out
- * is NULL, this function can be used to return the number of outputs.
- * Args:
- *    list_out - This will be set to the malloc'd area containing the list of
- *        devices.  Ignored if NULL.
- * Returns:
- *    The number of devices on the list.
- */
-int cras_iodev_list_get_outputs(struct cras_iodev_info **list_out);
-
-/* Gets a list of inputs. Callee must free the list when finished.  If list_out
- * is NULL, this function can be used to return the number of inputs.
- * Args:
- *    list_out - This will be set to the malloc'd area containing the list of
- *        devices.  Ignored if NULL.
- * Returns:
- *    The number of devices on the list.
- */
-int cras_iodev_list_get_inputs(struct cras_iodev_info **list_out);
-
-/* Returns the first enabled device.
- * Args:
- *    direction - Playback or capture.
- * Returns:
- *    Pointer to the first enabled device of direction.
- */
-struct cras_iodev *
-cras_iodev_list_get_first_enabled_iodev(enum CRAS_STREAM_DIRECTION direction);
-
-/* Returns SCO PCM device.
- * Args:
- *    direction - Playback or capture.
- * Returns:
- *    Pointer to the SCO PCM device of direction.
- */
-struct cras_iodev *
-cras_iodev_list_get_sco_pcm_iodev(enum CRAS_STREAM_DIRECTION direction);
-
-/* Returns the active node id.
- * Args:
- *    direction - Playback or capture.
- * Returns:
- *    The id of the active node.
- */
-cras_node_id_t
-cras_iodev_list_get_active_node_id(enum CRAS_STREAM_DIRECTION direction);
-
-/* Stores the following data to the shared memory server state region:
- * (1) device list
- * (2) node list
- * (3) selected nodes
- */
-void cras_iodev_list_update_device_list();
-
-/* Stores the node list in the shared memory server state region. */
-void cras_iodev_list_update_node_list();
-
-/* Gets the supported hotword models of an ionode. Caller should free
- * the returned string after use. */
-char *cras_iodev_list_get_hotword_models(cras_node_id_t node_id);
-
-/* Sets the desired hotword model to an ionode. */
-int cras_iodev_list_set_hotword_model(cras_node_id_t id,
-				      const char *model_name);
-
-/* Notify that nodes are added/removed. */
-void cras_iodev_list_notify_nodes_changed();
-
-/* Notify that active node is changed for the given direction.
- * Args:
- *    direction - Direction of the node.
- */
-void cras_iodev_list_notify_active_node_changed(
-	enum CRAS_STREAM_DIRECTION direction);
-
-/* Sets an attribute of an ionode on a device.
- * Args:
- *    id - the id of the ionode.
- *    node_index - Index of the ionode on the device.
- *    attr - the attribute we want to change.
- *    value - the value we want to set.
- */
-int cras_iodev_list_set_node_attr(cras_node_id_t id, enum ionode_attr attr,
-				  int value);
-
-/* Select a node as the preferred node.
- * Args:
- *    direction - Playback or capture.
- *    node_id - the id of the ionode to be selected. As a special case, if
- *        node_id is 0, don't select any node in this direction.
- */
-void cras_iodev_list_select_node(enum CRAS_STREAM_DIRECTION direction,
-				 cras_node_id_t node_id);
-
-/*
- * Checks if an iodev is enabled. By enabled we mean all default streams will
- * be routed to this iodev.
- */
-int cras_iodev_list_dev_is_enabled(const struct cras_iodev *dev);
-
-/* Enables an iodev. If the fallback device was already enabled, this
- * call will disable it. */
-void cras_iodev_list_enable_dev(struct cras_iodev *dev);
-
-/*
- * Suspends the connection of all types of stream attached to given iodev.
- * This call doesn't disable the given iodev.
- */
-void cras_iodev_list_suspend_dev(unsigned int dev_idx);
-
-/*
- * Resumes the connection of all types of stream attached to given iodev.
- * This call doesn't enable the given dev.
- */
-void cras_iodev_list_resume_dev(unsigned int dev_idx);
-
-/*
- * Sets mute state to device of given index.
- * Args:
- *    dev_idx - Index of the device to set mute state.
- */
-void cras_iodev_list_set_dev_mute(unsigned int dev_idx);
-
-/*
- * Disables an iodev. If this is the last device to disable, the
- * fallback devices will be enabled accordingly.
- * Set `foce_close` to true if the device must be closed regardless of having
- * pinned streams attached.
- */
-void cras_iodev_list_disable_dev(struct cras_iodev *dev, bool force_close);
-
-/* Adds a node to the active devices list.
- * Args:
- *    direction - Playback or capture.
- *    node_id - The id of the ionode to be added.
- */
-void cras_iodev_list_add_active_node(enum CRAS_STREAM_DIRECTION direction,
-				     cras_node_id_t node_id);
-
-/* Removes a node from the active devices list.
- * Args:
- *    direction - Playback or capture.
- *    node_id - The id of the ionode to be removed.
- */
-void cras_iodev_list_rm_active_node(enum CRAS_STREAM_DIRECTION direction,
-				    cras_node_id_t node_id);
-
-/* Returns 1 if the node is selected, 0 otherwise. */
-int cras_iodev_list_node_selected(struct cras_ionode *node);
-
-/* Notify the current volume of the given node. */
-void cras_iodev_list_notify_node_volume(struct cras_ionode *node);
-
-/* Notify the current capture gain of the given node. */
-void cras_iodev_list_notify_node_capture_gain(struct cras_ionode *node);
-
-/* Notify the current left right channel swapping state of the given node. */
-void cras_iodev_list_notify_node_left_right_swapped(struct cras_ionode *node);
-
-/* Handles the adding and removing of test iodevs. */
-void cras_iodev_list_add_test_dev(enum TEST_IODEV_TYPE type);
-
-/* Handles sending a command to a test iodev. */
-void cras_iodev_list_test_dev_command(unsigned int iodev_idx,
-				      enum CRAS_TEST_IODEV_CMD command,
-				      unsigned int data_len,
-				      const uint8_t *data);
-
-/* Gets the audio thread used by the devices. */
-struct audio_thread *cras_iodev_list_get_audio_thread();
-
-/* Gets the list of all active audio streams attached to devices. */
-struct stream_list *cras_iodev_list_get_stream_list();
-
-/* Sets the function to call when a device is enabled or disabled. */
-int cras_iodev_list_set_device_enabled_callback(
-	device_enabled_callback_t enabled_cb,
-	device_disabled_callback_t disabled_cb, void *cb_data);
-
-/* Registers loopback to an output device.
- * Args:
- *    loopback_type - Pre or post software DSP.
- *    output_dev_idx - Index of the target output device.
- *    hook_data - Callback function to process loopback data.
- *    hook_start - Callback for starting or stopping loopback.
- *    loopback_dev_idx - Index of the loopback device that
- *        listens for output data.
- */
-void cras_iodev_list_register_loopback(enum CRAS_LOOPBACK_TYPE loopback_type,
-				       unsigned int output_dev_idx,
-				       loopback_hook_data_t hook_data,
-				       loopback_hook_control_t hook_start,
-				       unsigned int loopback_dev_idx);
-
-/* Unregisters loopback from an output device by matching
- * loopback type and loopback device index.
- * Args:
- *    loopback_type - Pre or post software DSP.
- *    output_dev_idx - Index of the target output device.
- *    loopback_dev_idx - Index of the loopback device that
- *        listens for output data.
- */
-void cras_iodev_list_unregister_loopback(enum CRAS_LOOPBACK_TYPE loopback_type,
-					 unsigned int output_dev_idx,
-					 unsigned int loopback_dev_idx);
-
-/* Suspends all hotwording streams. */
-int cras_iodev_list_suspend_hotword_streams();
-
-/* Resumes all hotwording streams. */
-int cras_iodev_list_resume_hotword_stream();
-
-/* Sets the state of noise cancellation for input devices which supports noise
- * cancellation by suspend, enable/disable, then resume.
- */
-void cras_iodev_list_reset_for_noise_cancellation();
-
-/* For unit test only. */
-void cras_iodev_list_reset();
-
-#endif /* CRAS_IODEV_LIST_H_ */
diff --git a/cras/src/server/cras_loopback_iodev.c b/cras/src/server/cras_loopback_iodev.c
deleted file mode 100644
index cf3ba4a..0000000
--- a/cras/src/server/cras_loopback_iodev.c
+++ /dev/null
@@ -1,362 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <pthread.h>
-#include <sys/param.h>
-#include <syslog.h>
-
-#include "audio_thread_log.h"
-#include "byte_buffer.h"
-#include "cras_audio_area.h"
-#include "cras_config.h"
-#include "cras_iodev.h"
-#include "cras_iodev_list.h"
-#include "cras_types.h"
-#include "cras_util.h"
-#include "sfh.h"
-#include "utlist.h"
-
-#define LOOPBACK_BUFFER_SIZE 8192
-
-static const char *loopdev_names[LOOPBACK_NUM_TYPES] = {
-	"Post Mix Pre DSP Loopback",
-	"Post DSP Loopback",
-};
-
-static size_t loopback_supported_rates[] = { 48000, 0 };
-
-static size_t loopback_supported_channel_counts[] = { 2, 0 };
-
-static snd_pcm_format_t loopback_supported_formats[] = {
-	SND_PCM_FORMAT_S16_LE,
-	0,
-};
-
-/* loopack iodev.  Keep state of a loopback device.
- *    loopback_type - Pre-dsp or post-dsp.
- *    read_frames - Frames of audio data read since last dev start.
- *    started - True to indicate the target device is running, otherwise false.
- *    dev_start_time - The timestamp of the last call to configure_dev.
- *    sample_buffer - Pointer to sample buffer.
- *    sender_idx - Index of the output device to read loopback audio.
- */
-struct loopback_iodev {
-	struct cras_iodev base;
-	enum CRAS_LOOPBACK_TYPE loopback_type;
-	uint64_t read_frames;
-	bool started;
-	struct timespec dev_start_time;
-	struct byte_buffer *sample_buffer;
-	unsigned int sender_idx;
-};
-
-static int sample_hook_start(bool start, void *cb_data)
-{
-	struct loopback_iodev *loopdev = (struct loopback_iodev *)cb_data;
-	loopdev->started = start;
-	return 0;
-}
-
-/*
- * Called in the put buffer function of the sender that hooked to.
- *
- * Returns:
- *   Number of frames copied to the sample buffer in the hook.
- */
-static int sample_hook(const uint8_t *frames, unsigned int nframes,
-		       const struct cras_audio_format *fmt, void *cb_data)
-{
-	struct loopback_iodev *loopdev = (struct loopback_iodev *)cb_data;
-	struct byte_buffer *sbuf = loopdev->sample_buffer;
-	unsigned int frame_bytes = cras_get_format_bytes(fmt);
-	unsigned int frames_to_copy, bytes_to_copy, frames_copied = 0;
-	int i;
-
-	for (i = 0; i < 2; i++) {
-		frames_to_copy = MIN(buf_writable(sbuf) / frame_bytes, nframes);
-		if (!frames_to_copy)
-			break;
-
-		bytes_to_copy = frames_to_copy * frame_bytes;
-		memcpy(buf_write_pointer(sbuf), frames, bytes_to_copy);
-		buf_increment_write(sbuf, bytes_to_copy);
-		frames += bytes_to_copy;
-		nframes -= frames_to_copy;
-		frames_copied += frames_to_copy;
-	}
-
-	ATLOG(atlog, AUDIO_THREAD_LOOPBACK_SAMPLE_HOOK, nframes + frames_copied,
-	      frames_copied, 0);
-
-	return frames_copied;
-}
-
-static void update_first_output_to_loopback(struct loopback_iodev *loopdev)
-{
-	struct cras_iodev *edev;
-
-	/* Register loopback hook onto first enabled iodev. */
-	edev = cras_iodev_list_get_first_enabled_iodev(CRAS_STREAM_OUTPUT);
-	if (edev) {
-		loopdev->sender_idx = edev->info.idx;
-		cras_iodev_list_register_loopback(
-			loopdev->loopback_type, loopdev->sender_idx,
-			sample_hook, sample_hook_start, loopdev->base.info.idx);
-	}
-}
-
-static void device_enabled_hook(struct cras_iodev *iodev, void *cb_data)
-{
-	struct loopback_iodev *loopdev = (struct loopback_iodev *)cb_data;
-
-	if (iodev->direction != CRAS_STREAM_OUTPUT)
-		return;
-
-	update_first_output_to_loopback(loopdev);
-}
-
-static void device_disabled_hook(struct cras_iodev *iodev, void *cb_data)
-{
-	struct loopback_iodev *loopdev = (struct loopback_iodev *)cb_data;
-
-	if (loopdev->sender_idx != iodev->info.idx)
-		return;
-
-	/* Unregister loopback hook from disabled iodev. */
-	cras_iodev_list_unregister_loopback(loopdev->loopback_type,
-					    loopdev->sender_idx,
-					    loopdev->base.info.idx);
-	update_first_output_to_loopback(loopdev);
-}
-
-/*
- * iodev callbacks.
- */
-
-static int frames_queued(const struct cras_iodev *iodev,
-			 struct timespec *hw_tstamp)
-{
-	struct loopback_iodev *loopdev = (struct loopback_iodev *)iodev;
-	struct byte_buffer *sbuf = loopdev->sample_buffer;
-	unsigned int frame_bytes = cras_get_format_bytes(iodev->format);
-
-	if (!loopdev->started) {
-		unsigned int frames_since_start, frames_to_fill, bytes_to_fill;
-
-		frames_since_start = cras_frames_since_time(
-			&loopdev->dev_start_time, iodev->format->frame_rate);
-		frames_to_fill =
-			frames_since_start > loopdev->read_frames ?
-				frames_since_start - loopdev->read_frames :
-				0;
-		frames_to_fill =
-			MIN(buf_writable(sbuf) / frame_bytes, frames_to_fill);
-		if (frames_to_fill > 0) {
-			bytes_to_fill = frames_to_fill * frame_bytes;
-			memset(buf_write_pointer(sbuf), 0, bytes_to_fill);
-			buf_increment_write(sbuf, bytes_to_fill);
-		}
-	}
-	clock_gettime(CLOCK_MONOTONIC_RAW, hw_tstamp);
-	return buf_queued(sbuf) / frame_bytes;
-}
-
-static int delay_frames(const struct cras_iodev *iodev)
-{
-	struct timespec tstamp;
-
-	return frames_queued(iodev, &tstamp);
-}
-
-static int close_record_dev(struct cras_iodev *iodev)
-{
-	struct loopback_iodev *loopdev = (struct loopback_iodev *)iodev;
-	struct byte_buffer *sbuf = loopdev->sample_buffer;
-
-	cras_iodev_free_format(iodev);
-	cras_iodev_free_audio_area(iodev);
-	buf_reset(sbuf);
-
-	cras_iodev_list_unregister_loopback(loopdev->loopback_type,
-					    loopdev->sender_idx,
-					    loopdev->base.info.idx);
-	loopdev->sender_idx = NO_DEVICE;
-	cras_iodev_list_set_device_enabled_callback(NULL, NULL, (void *)iodev);
-
-	return 0;
-}
-
-static int configure_record_dev(struct cras_iodev *iodev)
-{
-	struct loopback_iodev *loopdev = (struct loopback_iodev *)iodev;
-	struct cras_iodev *edev;
-
-	cras_iodev_init_audio_area(iodev, iodev->format->num_channels);
-	clock_gettime(CLOCK_MONOTONIC_RAW, &loopdev->dev_start_time);
-	loopdev->read_frames = 0;
-	loopdev->started = 0;
-
-	edev = cras_iodev_list_get_first_enabled_iodev(CRAS_STREAM_OUTPUT);
-	if (edev) {
-		loopdev->sender_idx = edev->info.idx;
-		cras_iodev_list_register_loopback(
-			loopdev->loopback_type, loopdev->sender_idx,
-			sample_hook, sample_hook_start, iodev->info.idx);
-	}
-	cras_iodev_list_set_device_enabled_callback(
-		device_enabled_hook, device_disabled_hook, (void *)iodev);
-
-	return 0;
-}
-
-static int get_record_buffer(struct cras_iodev *iodev,
-			     struct cras_audio_area **area, unsigned *frames)
-{
-	struct loopback_iodev *loopdev = (struct loopback_iodev *)iodev;
-	struct byte_buffer *sbuf = loopdev->sample_buffer;
-	unsigned int frame_bytes = cras_get_format_bytes(iodev->format);
-	unsigned int avail_frames = buf_readable(sbuf) / frame_bytes;
-
-	ATLOG(atlog, AUDIO_THREAD_LOOPBACK_GET, *frames, avail_frames, 0);
-
-	*frames = MIN(avail_frames, *frames);
-	iodev->area->frames = *frames;
-	cras_audio_area_config_buf_pointers(iodev->area, iodev->format,
-					    buf_read_pointer(sbuf));
-	*area = iodev->area;
-
-	return 0;
-}
-
-static int put_record_buffer(struct cras_iodev *iodev, unsigned nframes)
-{
-	struct loopback_iodev *loopdev = (struct loopback_iodev *)iodev;
-	struct byte_buffer *sbuf = loopdev->sample_buffer;
-	unsigned int frame_bytes = cras_get_format_bytes(iodev->format);
-
-	buf_increment_read(sbuf, (size_t)nframes * (size_t)frame_bytes);
-	loopdev->read_frames += nframes;
-	ATLOG(atlog, AUDIO_THREAD_LOOPBACK_PUT, nframes, 0, 0);
-	return 0;
-}
-
-static int flush_record_buffer(struct cras_iodev *iodev)
-{
-	struct loopback_iodev *loopdev = (struct loopback_iodev *)iodev;
-	struct byte_buffer *sbuf = loopdev->sample_buffer;
-	unsigned int queued_bytes = buf_queued(sbuf);
-	buf_increment_read(sbuf, queued_bytes);
-	loopdev->read_frames = 0;
-	return 0;
-}
-
-static void update_active_node(struct cras_iodev *iodev, unsigned node_idx,
-			       unsigned dev_enabled)
-{
-}
-
-static struct cras_iodev *create_loopback_iodev(enum CRAS_LOOPBACK_TYPE type)
-{
-	struct loopback_iodev *loopback_iodev;
-	struct cras_iodev *iodev;
-
-	loopback_iodev = calloc(1, sizeof(*loopback_iodev));
-	if (loopback_iodev == NULL)
-		return NULL;
-
-	loopback_iodev->sample_buffer = byte_buffer_create(1024 * 16 * 4);
-	if (loopback_iodev->sample_buffer == NULL) {
-		free(loopback_iodev);
-		return NULL;
-	}
-
-	loopback_iodev->loopback_type = type;
-
-	iodev = &loopback_iodev->base;
-	iodev->direction = CRAS_STREAM_INPUT;
-	snprintf(iodev->info.name, ARRAY_SIZE(iodev->info.name), "%s",
-		 loopdev_names[type]);
-	iodev->info.name[ARRAY_SIZE(iodev->info.name) - 1] = '\0';
-	iodev->info.stable_id =
-		SuperFastHash(iodev->info.name, strlen(iodev->info.name),
-			      strlen(iodev->info.name));
-
-	iodev->supported_rates = loopback_supported_rates;
-	iodev->supported_channel_counts = loopback_supported_channel_counts;
-	iodev->supported_formats = loopback_supported_formats;
-	iodev->buffer_size = LOOPBACK_BUFFER_SIZE;
-
-	iodev->frames_queued = frames_queued;
-	iodev->delay_frames = delay_frames;
-	iodev->update_active_node = update_active_node;
-	iodev->configure_dev = configure_record_dev;
-	iodev->close_dev = close_record_dev;
-	iodev->get_buffer = get_record_buffer;
-	iodev->put_buffer = put_record_buffer;
-	iodev->flush_buffer = flush_record_buffer;
-
-	/*
-	 * Record max supported channels into cras_iodev_info.
-	 * The value is the max of loopback_supported_channel_counts.
-	 */
-	iodev->info.max_supported_channels = 2;
-
-	return iodev;
-}
-
-/*
- * Exported Interface.
- */
-
-struct cras_iodev *loopback_iodev_create(enum CRAS_LOOPBACK_TYPE type)
-{
-	struct cras_iodev *iodev;
-	struct cras_ionode *node;
-	enum CRAS_NODE_TYPE node_type;
-
-	switch (type) {
-	case LOOPBACK_POST_MIX_PRE_DSP:
-		node_type = CRAS_NODE_TYPE_POST_MIX_PRE_DSP;
-		break;
-	case LOOPBACK_POST_DSP:
-		node_type = CRAS_NODE_TYPE_POST_DSP;
-		break;
-	default:
-		return NULL;
-	}
-
-	iodev = create_loopback_iodev(type);
-	if (iodev == NULL)
-		return NULL;
-
-	/* Create an empty ionode */
-	node = (struct cras_ionode *)calloc(1, sizeof(*node));
-	node->dev = iodev;
-	node->type = node_type;
-	node->plugged = 1;
-	node->volume = 100;
-	node->ui_gain_scaler = 1.0f;
-	node->stable_id = iodev->info.stable_id;
-	node->software_volume_needed = 0;
-	strcpy(node->name, loopdev_names[type]);
-	cras_iodev_add_node(iodev, node);
-	cras_iodev_set_active_node(iodev, node);
-
-	cras_iodev_list_add_input(iodev);
-
-	return iodev;
-}
-
-void loopback_iodev_destroy(struct cras_iodev *iodev)
-{
-	struct loopback_iodev *loopdev = (struct loopback_iodev *)iodev;
-	struct byte_buffer *sbuf = loopdev->sample_buffer;
-
-	cras_iodev_list_rm_input(iodev);
-	free(iodev->nodes);
-
-	byte_buffer_destroy(&sbuf);
-	free(loopdev);
-}
diff --git a/cras/src/server/cras_loopback_iodev.h b/cras/src/server/cras_loopback_iodev.h
deleted file mode 100644
index 7cc5da8..0000000
--- a/cras/src/server/cras_loopback_iodev.h
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_LOOPBACK_IO_H_
-#define CRAS_LOOPBACK_IO_H_
-
-#include "cras_types.h"
-
-struct cras_iodev;
-
-/* Initializes loopback iodevs.  loopback iodevs provide the ability to
- * capture exactly what is being output by the system.
- */
-struct cras_iodev *loopback_iodev_create(enum CRAS_LOOPBACK_TYPE type);
-
-/* Destroys loopback_iodevs created with loopback_iodev_create. */
-void loopback_iodev_destroy(struct cras_iodev *loopdev);
-
-#endif /* CRAS_LOOPBACK_IO_H_ */
diff --git a/cras/src/server/cras_main_message.c b/cras/src/server/cras_main_message.c
deleted file mode 100644
index b88e400..0000000
--- a/cras/src/server/cras_main_message.c
+++ /dev/null
@@ -1,117 +0,0 @@
-/* Copyright 2015 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <syslog.h>
-
-#include "cras_main_message.h"
-#include "cras_system_state.h"
-#include "cras_util.h"
-
-/* Callback to handle specific type of main thread message. */
-struct cras_main_msg_callback {
-	enum CRAS_MAIN_MESSAGE_TYPE type;
-	cras_message_callback callback;
-	void *callback_data;
-	struct cras_main_msg_callback *prev, *next;
-};
-
-static int main_msg_fds[2];
-static struct cras_main_msg_callback *main_msg_callbacks;
-
-int cras_main_message_add_handler(enum CRAS_MAIN_MESSAGE_TYPE type,
-				  cras_message_callback callback,
-				  void *callback_data)
-{
-	struct cras_main_msg_callback *msg_cb;
-
-	DL_FOREACH (main_msg_callbacks, msg_cb) {
-		if (msg_cb->type == type) {
-			syslog(LOG_ERR, "Main message type %u already exists",
-			       type);
-			return -EEXIST;
-		}
-	}
-
-	msg_cb = (struct cras_main_msg_callback *)calloc(1, sizeof(*msg_cb));
-	msg_cb->type = type;
-	msg_cb->callback = callback;
-	msg_cb->callback_data = callback_data;
-
-	DL_APPEND(main_msg_callbacks, msg_cb);
-	return 0;
-}
-
-int cras_main_message_send(struct cras_main_message *msg)
-{
-	int err;
-
-	err = write(main_msg_fds[1], msg, msg->length);
-	if (err < 0) {
-		syslog(LOG_ERR, "Failed to send main message, type %u",
-		       msg->type);
-		return err;
-	}
-	return 0;
-}
-
-static int read_main_message(int msg_fd, uint8_t *buf, size_t max_len)
-{
-	int to_read, nread, rc;
-	struct cras_main_message *msg = (struct cras_main_message *)buf;
-
-	nread = read(msg_fd, buf, sizeof(msg->length));
-	if (nread < 0)
-		return nread;
-	if (msg->length > max_len)
-		return -ENOMEM;
-
-	to_read = msg->length - nread;
-	rc = read(msg_fd, &buf[0] + nread, to_read);
-	if (rc < 0)
-		return rc;
-	return 0;
-}
-
-static void handle_main_messages(void *arg, int revents)
-{
-	uint8_t buf[256];
-	int rc;
-	struct cras_main_msg_callback *main_msg_cb;
-	struct cras_main_message *msg = (struct cras_main_message *)buf;
-
-	rc = read_main_message(main_msg_fds[0], buf, sizeof(buf));
-	if (rc < 0) {
-		syslog(LOG_ERR, "Failed to read main message");
-		return;
-	}
-
-	DL_FOREACH (main_msg_callbacks, main_msg_cb) {
-		if (main_msg_cb->type == msg->type) {
-			main_msg_cb->callback(msg, main_msg_cb->callback_data);
-			break;
-		}
-	}
-}
-
-void cras_main_message_init()
-{
-	int rc;
-
-	rc = pipe(main_msg_fds);
-	if (rc < 0) {
-		syslog(LOG_ERR, "Fatal: main message init");
-		exit(-ENOMEM);
-	}
-
-	/* When full it's preferred to get error instead of blocked. */
-	cras_make_fd_nonblocking(main_msg_fds[0]);
-	cras_make_fd_nonblocking(main_msg_fds[1]);
-
-	cras_system_add_select_fd(main_msg_fds[0], handle_main_messages, NULL,
-				  POLLIN);
-}
diff --git a/cras/src/server/cras_main_message.h b/cras/src/server/cras_main_message.h
deleted file mode 100644
index fd63488..0000000
--- a/cras/src/server/cras_main_message.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/* Copyright 2015 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_MAIN_MESSAGE_H_
-#define CRAS_MAIN_MESSAGE_H_
-
-#include <stdio.h>
-
-#include "utlist.h"
-
-/* The types of message main thread can handle. */
-enum CRAS_MAIN_MESSAGE_TYPE {
-	/* Audio thread -> main thread */
-	CRAS_MAIN_A2DP,
-	CRAS_MAIN_AUDIO_THREAD_EVENT,
-	CRAS_MAIN_BT,
-	CRAS_MAIN_METRICS,
-	CRAS_MAIN_MONITOR_DEVICE,
-	CRAS_MAIN_HOTWORD_TRIGGERED,
-	CRAS_MAIN_NON_EMPTY_AUDIO_STATE,
-};
-
-/* Structure of the header of the message handled by main thread.
- * Args:
- *    length - Size of the whole message.
- *    type - Type of the message.
- */
-struct cras_main_message {
-	size_t length;
-	enum CRAS_MAIN_MESSAGE_TYPE type;
-};
-
-/* Callback function to handle main thread message. */
-typedef void (*cras_message_callback)(struct cras_main_message *msg, void *arg);
-
-/* Sends a message to main thread. */
-int cras_main_message_send(struct cras_main_message *msg);
-
-/* Registers the handler function for specific type of message. */
-int cras_main_message_add_handler(enum CRAS_MAIN_MESSAGE_TYPE type,
-				  cras_message_callback callback,
-				  void *callback_data);
-
-/* Initialize the message handling mechanism in main thread. */
-void cras_main_message_init();
-
-#endif /* CRAS_MAIN_MESSAGE_H_ */
diff --git a/cras/src/server/cras_main_thread_log.h b/cras/src/server/cras_main_thread_log.h
deleted file mode 100644
index 1d92585..0000000
--- a/cras/src/server/cras_main_thread_log.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/* Copyright 2020 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_MAIN_THREAD_LOG_H_
-#define CRAS_MAIN_THREAD_LOG_H_
-
-#include <stdint.h>
-
-#include "cras_types.h"
-
-#define CRAS_MAIN_THREAD_LOGGING 1
-
-#if (CRAS_MAIN_THREAD_LOGGING)
-#define MAINLOG(log, event, data1, data2, data3)                               \
-	main_thread_event_log_data(log, event, data1, data2, data3);
-#else
-#define MAINLOG(log, event, data1, data2, data3)
-#endif
-
-extern struct main_thread_event_log *main_log;
-
-static inline struct main_thread_event_log *main_thread_event_log_init()
-{
-	struct main_thread_event_log *log;
-	log = (struct main_thread_event_log *)calloc(
-		1, sizeof(struct main_thread_event_log));
-	if (!log)
-		return NULL;
-
-	log->len = MAIN_THREAD_EVENT_LOG_SIZE;
-	return log;
-}
-
-static inline void
-main_thread_event_log_deinit(struct main_thread_event_log *log)
-{
-	if (log)
-		free(log);
-}
-
-static inline void main_thread_event_log_data(struct main_thread_event_log *log,
-					      enum MAIN_THREAD_LOG_EVENTS event,
-					      uint32_t data1, uint32_t data2,
-					      uint32_t data3)
-{
-	struct timespec now;
-
-	if (!log)
-		return;
-
-	clock_gettime(CLOCK_MONOTONIC_RAW, &now);
-	log->log[log->write_pos].tag_sec =
-		(event << 24) | ((now.tv_sec % 86400) & 0x00ffffff);
-	log->log[log->write_pos].nsec = now.tv_nsec;
-	log->log[log->write_pos].data1 = data1;
-	log->log[log->write_pos].data2 = data2;
-	log->log[log->write_pos].data3 = data3;
-	log->write_pos++;
-	log->write_pos %= MAIN_THREAD_EVENT_LOG_SIZE;
-}
-
-#endif /* CRAS_MAIN_THREAD_LOG_H_ */
diff --git a/cras/src/server/cras_mix.c b/cras/src/server/cras_mix.c
deleted file mode 100644
index ffe556b..0000000
--- a/cras/src/server/cras_mix.c
+++ /dev/null
@@ -1,78 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <stdint.h>
-
-#include "cras_system_state.h"
-#include "cras_mix.h"
-#include "cras_mix_ops.h"
-
-static const struct cras_mix_ops *ops = &mixer_ops;
-
-static const struct cras_mix_ops *get_mixer_ops(unsigned int cpu_flags)
-{
-#if defined HAVE_FMA
-	if (cpu_flags & CPU_X86_FMA)
-		return &mixer_ops_fma;
-#endif
-#if defined HAVE_AVX2
-	if (cpu_flags & CPU_X86_AVX2)
-		return &mixer_ops_avx2;
-#endif
-#if defined HAVE_AVX
-	if (cpu_flags & CPU_X86_AVX)
-		return &mixer_ops_avx;
-#endif
-#if defined HAVE_SSE42
-	if (cpu_flags & CPU_X86_SSE4_2)
-		return &mixer_ops_sse42;
-#endif
-
-	/* default C implementation */
-	return &mixer_ops;
-}
-
-void cras_mix_init(unsigned int flags)
-{
-	ops = get_mixer_ops(flags);
-}
-
-/*
- * Exported Interface
- */
-
-void cras_scale_buffer_increment(snd_pcm_format_t fmt, uint8_t *buff,
-				 unsigned int frame, float scaler,
-				 float increment, float target, int channel)
-{
-	ops->scale_buffer_increment(fmt, buff, frame * channel, scaler,
-				    increment, target, channel);
-}
-
-void cras_scale_buffer(snd_pcm_format_t fmt, uint8_t *buff, unsigned int count,
-		       float scaler)
-{
-	ops->scale_buffer(fmt, buff, count, scaler);
-}
-
-void cras_mix_add(snd_pcm_format_t fmt, uint8_t *dst, uint8_t *src,
-		  unsigned int count, unsigned int index, int mute,
-		  float mix_vol)
-{
-	ops->add(fmt, dst, src, count, index, mute, mix_vol);
-}
-
-void cras_mix_add_scale_stride(snd_pcm_format_t fmt, uint8_t *dst, uint8_t *src,
-			       unsigned int count, unsigned int dst_stride,
-			       unsigned int src_stride, float scaler)
-{
-	ops->add_scale_stride(fmt, dst, src, count, dst_stride, src_stride,
-			      scaler);
-}
-
-size_t cras_mix_mute_buffer(uint8_t *dst, size_t frame_bytes, size_t count)
-{
-	return ops->mute_buffer(dst, frame_bytes, count);
-}
diff --git a/cras/src/server/cras_mix.h b/cras/src/server/cras_mix.h
deleted file mode 100644
index 5c21df9..0000000
--- a/cras/src/server/cras_mix.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef _CRAS_MIX_H
-#define _CRAS_MIX_H
-
-#include "cras_types.h"
-
-struct cras_audio_shm;
-
-/* SIMD optimisation flags */
-#define CPU_X86_SSE4_2 1
-#define CPU_X86_AVX 2
-#define CPU_X86_AVX2 4
-#define CPU_X86_FMA 8
-
-void cras_mix_init(unsigned int flags);
-
-/* Scale the given buffer with the provided scaler and increment.
- * Args:
- *    fmt - The format (SND_PCM_FORMAT_*)
- *    buff - Buffer of samples to scale.
- *    frame - The number of frames to render.
- *    scaler - Amount to scale samples (0.0 - 1.0).
- *    increment - The increment(+/-) of scaler at each frame. The scaler after
- *                increasing/decreasing will be clipped at target.
- *    target - The value at which to clip the scaler.
- *    channel - Number of samples in a frame.
- */
-void cras_scale_buffer_increment(snd_pcm_format_t fmt, uint8_t *buff,
-				 unsigned int frame, float scaler,
-				 float increment, float target, int channel);
-
-/* Scale the given buffer with the provided scaler.
- * Args:
- *    fmt - The format (SND_PCM_FORMAT_*)
- *    buff - Buffer of samples to scale.
- *    scaler - Amount to scale samples (0.0 - 1.0).
- *    count - The number of samples to render, on return holds the number
- *        actually mixed.
- */
-void cras_scale_buffer(snd_pcm_format_t fmt, uint8_t *buff, unsigned int count,
-		       float scaler);
-
-/* Add src buffer to dst, scaling and setting mute.
- * Args:
- *    fmt - The format (SND_PCM_FORMAT_*)
- *    dst - Buffer of samples to mix to.
- *    src - Buffer of samples to mix from.
- *    count - The number of samples to mix.
- *    index - If zero this is the first buffer written to dst.
- *    mute - Is the stream providing the buffer muted.
- *    mix_vol - Scaler for the buffer to be mixed.
- */
-void cras_mix_add(snd_pcm_format_t fmt, uint8_t *dst, uint8_t *src,
-		  unsigned int count, unsigned int index, int mute,
-		  float mix_vol);
-
-/* Add src buffer to dst with independent channel strides.
- * Args:
- *    fmt - The format (SND_PCM_FORMAT_*)
- *    dst - Buffer of samples to mix to.
- *    src - Buffer of samples to mix from.
- *    count - The number of samples to mix.
- *    dst_stride - Stride between channel samples in dst in bytes.
- *    src_stride - Stride between channel samples in src in bytes.
- *    scaler - Amount to scale samples.
- */
-void cras_mix_add_scale_stride(snd_pcm_format_t fmt, uint8_t *dst, uint8_t *src,
-			       unsigned int count, unsigned int dst_stride,
-			       unsigned int src_stride, float scaler);
-
-/* Mutes the given buffer.
- * Args:
- *    num_channel - Number of channels in data.
- *    frame_bytes - number of bytes in a frame.
- *    count - The number of frames to render.
- */
-size_t cras_mix_mute_buffer(uint8_t *dst, size_t frame_bytes, size_t count);
-
-#endif /* _CRAS_MIX_H */
diff --git a/cras/src/server/cras_mix_ops.c b/cras/src/server/cras_mix_ops.c
deleted file mode 100644
index 2425f09..0000000
--- a/cras/src/server/cras_mix_ops.c
+++ /dev/null
@@ -1,850 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <stdint.h>
-
-#include "cras_system_state.h"
-#include "cras_mix_ops.h"
-
-#define MAX_VOLUME_TO_SCALE 0.9999999
-#define MIN_VOLUME_TO_SCALE 0.0000001
-
-/* function suffixes for SIMD ops */
-#ifdef OPS_SSE42
-#define OPS(a) a##_sse42
-#elif OPS_AVX
-#define OPS(a) a##_avx
-#elif OPS_AVX2
-#define OPS(a) a##_avx2
-#elif OPS_FMA
-#define OPS(a) a##_fma
-#else
-#define OPS(a) a
-#endif
-
-/* Checks if the scaler needs a scaling operation.
- * We skip scaling for scaler too close to 1.0.
- * Note that this is not subjected to MAX_VOLUME_TO_SCALE
- * and MIN_VOLUME_TO_SCALE. */
-static inline int need_to_scale(float scaler)
-{
-	return (scaler < 0.99 || scaler > 1.01);
-}
-
-/*
- * Signed 16 bit little endian functions.
- */
-
-static void cras_mix_add_clip_s16_le(int16_t *dst, const int16_t *src,
-				     size_t count)
-{
-	int32_t sum;
-	size_t i;
-
-	for (i = 0; i < count; i++) {
-		sum = dst[i] + src[i];
-		if (sum > INT16_MAX)
-			sum = INT16_MAX;
-		else if (sum < INT16_MIN)
-			sum = INT16_MIN;
-		dst[i] = sum;
-	}
-}
-
-/* Adds src into dst, after scaling by vol.
- * Just hard limits to the min and max S16 value, can be improved later. */
-static void scale_add_clip_s16_le(int16_t *dst, const int16_t *src,
-				  size_t count, float vol)
-{
-	int32_t sum;
-	size_t i;
-
-	if (vol > MAX_VOLUME_TO_SCALE)
-		return cras_mix_add_clip_s16_le(dst, src, count);
-
-	for (i = 0; i < count; i++) {
-		sum = dst[i] + (int16_t)(src[i] * vol);
-		if (sum > INT16_MAX)
-			sum = INT16_MAX;
-		else if (sum < INT16_MIN)
-			sum = INT16_MIN;
-		dst[i] = sum;
-	}
-}
-
-/* Adds the first stream to the mix.  Don't need to mix, just setup to the new
- * values. If volume is 1.0, just memcpy. */
-static void copy_scaled_s16_le(int16_t *dst, const int16_t *src, size_t count,
-			       float volume_scaler)
-{
-	int i;
-
-	if (volume_scaler > MAX_VOLUME_TO_SCALE) {
-		memcpy(dst, src, count * sizeof(*src));
-		return;
-	}
-
-	for (i = 0; i < count; i++)
-		dst[i] = src[i] * volume_scaler;
-}
-
-static void cras_scale_buffer_inc_s16_le(uint8_t *buffer, unsigned int count,
-					 float scaler, float increment,
-					 float target, int step)
-{
-	int i = 0, j;
-	int16_t *out = (int16_t *)buffer;
-
-	if (scaler < MIN_VOLUME_TO_SCALE && increment < 0) {
-		memset(out, 0, count * sizeof(*out));
-		return;
-	}
-
-	while (i + step <= count) {
-		for (j = 0; j < step; j++) {
-			float applied_scaler = scaler;
-
-			if ((applied_scaler > target && increment > 0) ||
-			    (applied_scaler < target && increment < 0))
-				applied_scaler = target;
-
-			if (applied_scaler > MAX_VOLUME_TO_SCALE) {
-			} else if (applied_scaler < MIN_VOLUME_TO_SCALE) {
-				out[i] = 0;
-			} else {
-				out[i] *= applied_scaler;
-			}
-			i++;
-		}
-		scaler += increment;
-	}
-}
-
-static void cras_scale_buffer_s16_le(uint8_t *buffer, unsigned int count,
-				     float scaler)
-{
-	int i;
-	int16_t *out = (int16_t *)buffer;
-
-	if (scaler > MAX_VOLUME_TO_SCALE)
-		return;
-
-	if (scaler < MIN_VOLUME_TO_SCALE) {
-		memset(out, 0, count * sizeof(*out));
-		return;
-	}
-
-	for (i = 0; i < count; i++)
-		out[i] *= scaler;
-}
-
-static void cras_mix_add_s16_le(uint8_t *dst, uint8_t *src, unsigned int count,
-				unsigned int index, int mute, float mix_vol)
-{
-	int16_t *out = (int16_t *)dst;
-	int16_t *in = (int16_t *)src;
-
-	if (mute || (mix_vol < MIN_VOLUME_TO_SCALE)) {
-		if (index == 0)
-			memset(out, 0, count * sizeof(*out));
-		return;
-	}
-
-	if (index == 0)
-		return copy_scaled_s16_le(out, in, count, mix_vol);
-
-	scale_add_clip_s16_le(out, in, count, mix_vol);
-}
-
-static void cras_mix_add_scale_stride_s16_le(uint8_t *dst, uint8_t *src,
-					     unsigned int dst_stride,
-					     unsigned int src_stride,
-					     unsigned int count, float scaler)
-{
-	unsigned int i;
-
-	/* optimise the loops for vectorization */
-	if (dst_stride == src_stride && dst_stride == 2) {
-		for (i = 0; i < count; i++) {
-			int32_t sum;
-			if (need_to_scale(scaler))
-				sum = *(int16_t *)dst +
-				      *(int16_t *)src * scaler;
-			else
-				sum = *(int16_t *)dst + *(int16_t *)src;
-			if (sum > INT16_MAX)
-				sum = INT16_MAX;
-			else if (sum < INT16_MIN)
-				sum = INT16_MIN;
-			*(int16_t *)dst = sum;
-			dst += 2;
-			src += 2;
-		}
-	} else if (dst_stride == src_stride && dst_stride == 4) {
-		for (i = 0; i < count; i++) {
-			int32_t sum;
-			if (need_to_scale(scaler))
-				sum = *(int16_t *)dst +
-				      *(int16_t *)src * scaler;
-			else
-				sum = *(int16_t *)dst + *(int16_t *)src;
-			if (sum > INT16_MAX)
-				sum = INT16_MAX;
-			else if (sum < INT16_MIN)
-				sum = INT16_MIN;
-			*(int16_t *)dst = sum;
-			dst += 4;
-			src += 4;
-		}
-	} else {
-		for (i = 0; i < count; i++) {
-			int32_t sum;
-			if (need_to_scale(scaler))
-				sum = *(int16_t *)dst +
-				      *(int16_t *)src * scaler;
-			else
-				sum = *(int16_t *)dst + *(int16_t *)src;
-			if (sum > INT16_MAX)
-				sum = INT16_MAX;
-			else if (sum < INT16_MIN)
-				sum = INT16_MIN;
-			*(int16_t *)dst = sum;
-			dst += dst_stride;
-			src += src_stride;
-		}
-	}
-}
-
-/*
- * Signed 24 bit little endian functions.
- */
-
-static int32_t scale_s24_le(int32_t value, float scaler)
-{
-	value = ((uint32_t)(value & 0x00ffffff)) << 8;
-	value *= scaler;
-	return (value >> 8) & 0x00ffffff;
-}
-
-static void cras_mix_add_clip_s24_le(int32_t *dst, const int32_t *src,
-				     size_t count)
-{
-	int32_t sum;
-	size_t i;
-
-	for (i = 0; i < count; i++) {
-		sum = dst[i] + src[i];
-		if (sum > 0x007fffff)
-			sum = 0x007fffff;
-		else if (sum < (int32_t)0xff800000)
-			sum = (int32_t)0xff800000;
-		dst[i] = sum;
-	}
-}
-
-/* Adds src into dst, after scaling by vol.
- * Just hard limits to the min and max S24 value, can be improved later. */
-static void scale_add_clip_s24_le(int32_t *dst, const int32_t *src,
-				  size_t count, float vol)
-{
-	int32_t sum;
-	size_t i;
-
-	if (vol > MAX_VOLUME_TO_SCALE)
-		return cras_mix_add_clip_s24_le(dst, src, count);
-
-	for (i = 0; i < count; i++) {
-		sum = dst[i] + (int32_t)(src[i] * vol);
-		if (sum > 0x007fffff)
-			sum = 0x007fffff;
-		else if (sum < (int32_t)0xff800000)
-			sum = (int32_t)0xff800000;
-		dst[i] = sum;
-	}
-}
-
-/* Adds the first stream to the mix.  Don't need to mix, just setup to the new
- * values. If volume is 1.0, just memcpy. */
-static void copy_scaled_s24_le(int32_t *dst, const int32_t *src, size_t count,
-			       float volume_scaler)
-{
-	int i;
-
-	if (volume_scaler > MAX_VOLUME_TO_SCALE) {
-		memcpy(dst, src, count * sizeof(*src));
-		return;
-	}
-
-	for (i = 0; i < count; i++)
-		dst[i] = scale_s24_le(src[i], volume_scaler);
-}
-
-static void cras_scale_buffer_inc_s24_le(uint8_t *buffer, unsigned int count,
-					 float scaler, float increment,
-					 float target, int step)
-{
-	int i = 0, j;
-	int32_t *out = (int32_t *)buffer;
-
-	if (scaler < MIN_VOLUME_TO_SCALE && increment < 0) {
-		memset(out, 0, count * sizeof(*out));
-		return;
-	}
-
-	while (i + step <= count) {
-		for (j = 0; j < step; j++) {
-			float applied_scaler = scaler;
-
-			if ((applied_scaler > target && increment > 0) ||
-			    (applied_scaler < target && increment < 0))
-				applied_scaler = target;
-
-			if (applied_scaler > MAX_VOLUME_TO_SCALE) {
-			} else if (applied_scaler < MIN_VOLUME_TO_SCALE) {
-				out[i] = 0;
-			} else {
-				out[i] = scale_s24_le(out[i], applied_scaler);
-			}
-			i++;
-		}
-		scaler += increment;
-	}
-}
-
-static void cras_scale_buffer_s24_le(uint8_t *buffer, unsigned int count,
-				     float scaler)
-{
-	int i;
-	int32_t *out = (int32_t *)buffer;
-
-	if (scaler > MAX_VOLUME_TO_SCALE)
-		return;
-
-	if (scaler < MIN_VOLUME_TO_SCALE) {
-		memset(out, 0, count * sizeof(*out));
-		return;
-	}
-
-	for (i = 0; i < count; i++)
-		out[i] = scale_s24_le(out[i], scaler);
-}
-
-static void cras_mix_add_s24_le(uint8_t *dst, uint8_t *src, unsigned int count,
-				unsigned int index, int mute, float mix_vol)
-{
-	int32_t *out = (int32_t *)dst;
-	int32_t *in = (int32_t *)src;
-
-	if (mute || (mix_vol < MIN_VOLUME_TO_SCALE)) {
-		if (index == 0)
-			memset(out, 0, count * sizeof(*out));
-		return;
-	}
-
-	if (index == 0)
-		return copy_scaled_s24_le(out, in, count, mix_vol);
-
-	scale_add_clip_s24_le(out, in, count, mix_vol);
-}
-
-static void cras_mix_add_scale_stride_s24_le(uint8_t *dst, uint8_t *src,
-					     unsigned int dst_stride,
-					     unsigned int src_stride,
-					     unsigned int count, float scaler)
-{
-	unsigned int i;
-
-	/* optimise the loops for vectorization */
-	if (dst_stride == src_stride && dst_stride == 4) {
-		for (i = 0; i < count; i++) {
-			int32_t sum;
-			if (need_to_scale(scaler))
-				sum = *(int32_t *)dst +
-				      scale_s24_le(*(int32_t *)src, scaler);
-			else
-				sum = *(int32_t *)dst + *(int32_t *)src;
-			if (sum > 0x007fffff)
-				sum = 0x007fffff;
-			else if (sum < (int32_t)0xff800000)
-				sum = (int32_t)0xff800000;
-			*(int32_t *)dst = sum;
-			dst += 4;
-			src += 4;
-		}
-	} else {
-		for (i = 0; i < count; i++) {
-			int32_t sum;
-			if (need_to_scale(scaler))
-				sum = *(int32_t *)dst +
-				      scale_s24_le(*(int32_t *)src, scaler);
-			else
-				sum = *(int32_t *)dst + *(int32_t *)src;
-			if (sum > 0x007fffff)
-				sum = 0x007fffff;
-			else if (sum < (int32_t)0xff800000)
-				sum = (int32_t)0xff800000;
-			*(int32_t *)dst = sum;
-			dst += dst_stride;
-			src += src_stride;
-		}
-	}
-}
-
-/*
- * Signed 32 bit little endian functions.
- */
-
-static void cras_mix_add_clip_s32_le(int32_t *dst, const int32_t *src,
-				     size_t count)
-{
-	int64_t sum;
-	size_t i;
-
-	for (i = 0; i < count; i++) {
-		sum = (int64_t)dst[i] + (int64_t)src[i];
-		if (sum > INT32_MAX)
-			sum = INT32_MAX;
-		else if (sum < INT32_MIN)
-			sum = INT32_MIN;
-		dst[i] = sum;
-	}
-}
-
-/* Adds src into dst, after scaling by vol.
- * Just hard limits to the min and max S32 value, can be improved later. */
-static void scale_add_clip_s32_le(int32_t *dst, const int32_t *src,
-				  size_t count, float vol)
-{
-	int64_t sum;
-	size_t i;
-
-	if (vol > MAX_VOLUME_TO_SCALE)
-		return cras_mix_add_clip_s32_le(dst, src, count);
-
-	for (i = 0; i < count; i++) {
-		sum = (int64_t)dst[i] + (int64_t)(src[i] * vol);
-		if (sum > INT32_MAX)
-			sum = INT32_MAX;
-		else if (sum < INT32_MIN)
-			sum = INT32_MIN;
-		dst[i] = sum;
-	}
-}
-
-/* Adds the first stream to the mix.  Don't need to mix, just setup to the new
- * values. If volume is 1.0, just memcpy. */
-static void copy_scaled_s32_le(int32_t *dst, const int32_t *src, size_t count,
-			       float volume_scaler)
-{
-	int i;
-
-	if (volume_scaler > MAX_VOLUME_TO_SCALE) {
-		memcpy(dst, src, count * sizeof(*src));
-		return;
-	}
-
-	for (i = 0; i < count; i++)
-		dst[i] = src[i] * volume_scaler;
-}
-
-static void cras_scale_buffer_inc_s32_le(uint8_t *buffer, unsigned int count,
-					 float scaler, float increment,
-					 float target, int step)
-{
-	int i = 0, j;
-	int32_t *out = (int32_t *)buffer;
-
-	if (scaler < MIN_VOLUME_TO_SCALE && increment < 0) {
-		memset(out, 0, count * sizeof(*out));
-		return;
-	}
-
-	while (i + step <= count) {
-		for (j = 0; j < step; j++) {
-			float applied_scaler = scaler;
-
-			if ((applied_scaler > target && increment > 0) ||
-			    (applied_scaler < target && increment < 0))
-				applied_scaler = target;
-
-			if (applied_scaler > MAX_VOLUME_TO_SCALE) {
-			} else if (applied_scaler < MIN_VOLUME_TO_SCALE) {
-				out[i] = 0;
-			} else {
-				out[i] *= applied_scaler;
-			}
-			i++;
-		}
-		scaler += increment;
-	}
-}
-
-static void cras_scale_buffer_s32_le(uint8_t *buffer, unsigned int count,
-				     float scaler)
-{
-	int i;
-	int32_t *out = (int32_t *)buffer;
-
-	if (scaler > MAX_VOLUME_TO_SCALE)
-		return;
-
-	if (scaler < MIN_VOLUME_TO_SCALE) {
-		memset(out, 0, count * sizeof(*out));
-		return;
-	}
-
-	for (i = 0; i < count; i++)
-		out[i] *= scaler;
-}
-
-static void cras_mix_add_s32_le(uint8_t *dst, uint8_t *src, unsigned int count,
-				unsigned int index, int mute, float mix_vol)
-{
-	int32_t *out = (int32_t *)dst;
-	int32_t *in = (int32_t *)src;
-
-	if (mute || (mix_vol < MIN_VOLUME_TO_SCALE)) {
-		if (index == 0)
-			memset(out, 0, count * sizeof(*out));
-		return;
-	}
-
-	if (index == 0)
-		return copy_scaled_s32_le(out, in, count, mix_vol);
-
-	scale_add_clip_s32_le(out, in, count, mix_vol);
-}
-
-static void cras_mix_add_scale_stride_s32_le(uint8_t *dst, uint8_t *src,
-					     unsigned int dst_stride,
-					     unsigned int src_stride,
-					     unsigned int count, float scaler)
-{
-	unsigned int i;
-
-	/* optimise the loops for vectorization */
-	if (dst_stride == src_stride && dst_stride == 4) {
-		for (i = 0; i < count; i++) {
-			int64_t sum;
-			if (need_to_scale(scaler))
-				sum = *(int32_t *)dst +
-				      *(int32_t *)src * scaler;
-			else
-				sum = *(int32_t *)dst + *(int32_t *)src;
-			if (sum > INT32_MAX)
-				sum = INT32_MAX;
-			else if (sum < INT32_MIN)
-				sum = INT32_MIN;
-			*(int32_t *)dst = sum;
-			dst += 4;
-			src += 4;
-		}
-	} else {
-		for (i = 0; i < count; i++) {
-			int64_t sum;
-			if (need_to_scale(scaler))
-				sum = *(int32_t *)dst +
-				      *(int32_t *)src * scaler;
-			else
-				sum = *(int32_t *)dst + *(int32_t *)src;
-			if (sum > INT32_MAX)
-				sum = INT32_MAX;
-			else if (sum < INT32_MIN)
-				sum = INT32_MIN;
-			*(int32_t *)dst = sum;
-			dst += dst_stride;
-			src += src_stride;
-		}
-	}
-}
-
-/*
- * Signed 24 bit little endian in three bytes functions.
- */
-
-/* Convert 3bytes Signed 24bit integer to a Signed 32bit integer.
- * Just a helper function. */
-static inline void convert_single_s243le_to_s32le(int32_t *dst,
-						  const uint8_t *src)
-{
-	*dst = 0;
-	memcpy((uint8_t *)dst + 1, src, 3);
-}
-
-static inline void convert_single_s32le_to_s243le(uint8_t *dst,
-						  const int32_t *src)
-{
-	memcpy(dst, (uint8_t *)src + 1, 3);
-}
-
-static void cras_mix_add_clip_s24_3le(uint8_t *dst, const uint8_t *src,
-				      size_t count)
-{
-	int64_t sum;
-	int32_t dst_frame;
-	int32_t src_frame;
-	size_t i;
-
-	for (i = 0; i < count; i++, dst += 3, src += 3) {
-		convert_single_s243le_to_s32le(&dst_frame, dst);
-		convert_single_s243le_to_s32le(&src_frame, src);
-		sum = (int64_t)dst_frame + (int64_t)src_frame;
-		if (sum > INT32_MAX)
-			sum = INT32_MAX;
-		else if (sum < INT32_MIN)
-			sum = INT32_MIN;
-		dst_frame = (int32_t)sum;
-		convert_single_s32le_to_s243le(dst, &dst_frame);
-	}
-}
-
-/* Adds src into dst, after scaling by vol.
- * Just hard limits to the min and max S24 value, can be improved later. */
-static void scale_add_clip_s24_3le(uint8_t *dst, const uint8_t *src,
-				   size_t count, float vol)
-{
-	int64_t sum;
-	int32_t dst_frame;
-	int32_t src_frame;
-	size_t i;
-
-	if (vol > MAX_VOLUME_TO_SCALE)
-		return cras_mix_add_clip_s24_3le(dst, src, count);
-
-	for (i = 0; i < count; i++, dst += 3, src += 3) {
-		convert_single_s243le_to_s32le(&dst_frame, dst);
-		convert_single_s243le_to_s32le(&src_frame, src);
-		sum = (int64_t)dst_frame + (int64_t)(src_frame * vol);
-		if (sum > INT32_MAX)
-			sum = INT32_MAX;
-		else if (sum < INT32_MIN)
-			sum = INT32_MIN;
-		dst_frame = (int32_t)sum;
-		convert_single_s32le_to_s243le(dst, &dst_frame);
-	}
-}
-
-/* Adds the first stream to the mix.  Don't need to mix, just setup to the new
- * values. If volume is 1.0, just memcpy. */
-static void copy_scaled_s24_3le(uint8_t *dst, const uint8_t *src, size_t count,
-				float volume_scaler)
-{
-	int32_t frame;
-	size_t i;
-
-	if (volume_scaler > MAX_VOLUME_TO_SCALE) {
-		memcpy(dst, src, 3 * count * sizeof(*src));
-		return;
-	}
-
-	for (i = 0; i < count; i++, dst += 3, src += 3) {
-		convert_single_s243le_to_s32le(&frame, src);
-		frame *= volume_scaler;
-		convert_single_s32le_to_s243le(dst, &frame);
-	}
-}
-
-static void cras_scale_buffer_inc_s24_3le(uint8_t *buffer, unsigned int count,
-					  float scaler, float increment,
-					  float target, int step)
-{
-	int32_t frame;
-	int i = 0, j;
-
-	if (scaler < MIN_VOLUME_TO_SCALE && increment < 0) {
-		memset(buffer, 0, 3 * count * sizeof(*buffer));
-		return;
-	}
-
-	while (i + step <= count) {
-		for (j = 0; j < step; j++) {
-			float applied_scaler = scaler;
-
-			if ((applied_scaler > target && increment > 0) ||
-			    (applied_scaler < target && increment < 0))
-				applied_scaler = target;
-
-			convert_single_s243le_to_s32le(&frame, buffer);
-
-			if (applied_scaler > MAX_VOLUME_TO_SCALE) {
-			} else if (applied_scaler < MIN_VOLUME_TO_SCALE) {
-				frame = 0;
-			} else {
-				frame *= applied_scaler;
-			}
-
-			convert_single_s32le_to_s243le(buffer, &frame);
-
-			i++;
-			buffer += 3;
-		}
-		scaler += increment;
-	}
-}
-
-static void cras_scale_buffer_s24_3le(uint8_t *buffer, unsigned int count,
-				      float scaler)
-{
-	int32_t frame;
-	int i;
-
-	if (scaler > MAX_VOLUME_TO_SCALE)
-		return;
-
-	if (scaler < MIN_VOLUME_TO_SCALE) {
-		memset(buffer, 0, 3 * count * sizeof(*buffer));
-		return;
-	}
-
-	for (i = 0; i < count; i++, buffer += 3) {
-		convert_single_s243le_to_s32le(&frame, buffer);
-		frame *= scaler;
-		convert_single_s32le_to_s243le(buffer, &frame);
-	}
-}
-
-static void cras_mix_add_s24_3le(uint8_t *dst, uint8_t *src, unsigned int count,
-				 unsigned int index, int mute, float mix_vol)
-{
-	uint8_t *out = dst;
-	uint8_t *in = src;
-
-	if (mute || (mix_vol < MIN_VOLUME_TO_SCALE)) {
-		if (index == 0)
-			memset(out, 0, 3 * count * sizeof(*out));
-		return;
-	}
-
-	if (index == 0)
-		return copy_scaled_s24_3le(out, in, count, mix_vol);
-
-	scale_add_clip_s24_3le(out, in, count, mix_vol);
-}
-
-static void cras_mix_add_scale_stride_s24_3le(uint8_t *dst, uint8_t *src,
-					      unsigned int dst_stride,
-					      unsigned int src_stride,
-					      unsigned int count, float scaler)
-{
-	unsigned int i;
-	int64_t sum;
-	int32_t dst_frame;
-	int32_t src_frame;
-
-	for (i = 0; i < count; i++) {
-		convert_single_s243le_to_s32le(&dst_frame, dst);
-		convert_single_s243le_to_s32le(&src_frame, src);
-		if (need_to_scale(scaler))
-			sum = (int64_t)dst_frame + (int64_t)src_frame * scaler;
-		else
-			sum = (int64_t)dst_frame + (int64_t)src_frame;
-		if (sum > INT32_MAX)
-			sum = INT32_MAX;
-		else if (sum < INT32_MIN)
-			sum = INT32_MIN;
-		dst_frame = (int32_t)sum;
-		convert_single_s32le_to_s243le(dst, &dst_frame);
-		dst += dst_stride;
-		src += src_stride;
-	}
-}
-
-static void scale_buffer_increment(snd_pcm_format_t fmt, uint8_t *buff,
-				   unsigned int count, float scaler,
-				   float increment, float target, int step)
-{
-	switch (fmt) {
-	case SND_PCM_FORMAT_S16_LE:
-		return cras_scale_buffer_inc_s16_le(buff, count, scaler,
-						    increment, target, step);
-	case SND_PCM_FORMAT_S24_LE:
-		return cras_scale_buffer_inc_s24_le(buff, count, scaler,
-						    increment, target, step);
-	case SND_PCM_FORMAT_S32_LE:
-		return cras_scale_buffer_inc_s32_le(buff, count, scaler,
-						    increment, target, step);
-	case SND_PCM_FORMAT_S24_3LE:
-		return cras_scale_buffer_inc_s24_3le(buff, count, scaler,
-						     increment, target, step);
-	default:
-		break;
-	}
-}
-
-static void scale_buffer(snd_pcm_format_t fmt, uint8_t *buff,
-			 unsigned int count, float scaler)
-{
-	switch (fmt) {
-	case SND_PCM_FORMAT_S16_LE:
-		return cras_scale_buffer_s16_le(buff, count, scaler);
-	case SND_PCM_FORMAT_S24_LE:
-		return cras_scale_buffer_s24_le(buff, count, scaler);
-	case SND_PCM_FORMAT_S32_LE:
-		return cras_scale_buffer_s32_le(buff, count, scaler);
-	case SND_PCM_FORMAT_S24_3LE:
-		return cras_scale_buffer_s24_3le(buff, count, scaler);
-	default:
-		break;
-	}
-}
-
-static void mix_add(snd_pcm_format_t fmt, uint8_t *dst, uint8_t *src,
-		    unsigned int count, unsigned int index, int mute,
-		    float mix_vol)
-{
-	switch (fmt) {
-	case SND_PCM_FORMAT_S16_LE:
-		return cras_mix_add_s16_le(dst, src, count, index, mute,
-					   mix_vol);
-	case SND_PCM_FORMAT_S24_LE:
-		return cras_mix_add_s24_le(dst, src, count, index, mute,
-					   mix_vol);
-	case SND_PCM_FORMAT_S32_LE:
-		return cras_mix_add_s32_le(dst, src, count, index, mute,
-					   mix_vol);
-	case SND_PCM_FORMAT_S24_3LE:
-		return cras_mix_add_s24_3le(dst, src, count, index, mute,
-					    mix_vol);
-	default:
-		break;
-	}
-}
-
-static void mix_add_scale_stride(snd_pcm_format_t fmt, uint8_t *dst,
-				 uint8_t *src, unsigned int count,
-				 unsigned int dst_stride,
-				 unsigned int src_stride, float scaler)
-{
-	switch (fmt) {
-	case SND_PCM_FORMAT_S16_LE:
-		return cras_mix_add_scale_stride_s16_le(
-			dst, src, dst_stride, src_stride, count, scaler);
-	case SND_PCM_FORMAT_S24_LE:
-		return cras_mix_add_scale_stride_s24_le(
-			dst, src, dst_stride, src_stride, count, scaler);
-	case SND_PCM_FORMAT_S32_LE:
-		return cras_mix_add_scale_stride_s32_le(
-			dst, src, dst_stride, src_stride, count, scaler);
-	case SND_PCM_FORMAT_S24_3LE:
-		return cras_mix_add_scale_stride_s24_3le(
-			dst, src, dst_stride, src_stride, count, scaler);
-	default:
-		break;
-	}
-}
-
-static size_t mix_mute_buffer(uint8_t *dst, size_t frame_bytes, size_t count)
-{
-	memset(dst, 0, count * frame_bytes);
-	return count;
-}
-
-const struct cras_mix_ops OPS(mixer_ops) = {
-	.scale_buffer = scale_buffer,
-	.scale_buffer_increment = scale_buffer_increment,
-	.add = mix_add,
-	.add_scale_stride = mix_add_scale_stride,
-	.mute_buffer = mix_mute_buffer,
-};
diff --git a/cras/src/server/cras_mix_ops.h b/cras/src/server/cras_mix_ops.h
deleted file mode 100644
index 1fac6f3..0000000
--- a/cras/src/server/cras_mix_ops.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_MIX_OPS_H_
-#define CRAS_MIX_OPS_H_
-
-#include <stdint.h>
-
-#include "cras_system_state.h"
-
-extern const struct cras_mix_ops mixer_ops;
-extern const struct cras_mix_ops mixer_ops_sse42;
-extern const struct cras_mix_ops mixer_ops_avx;
-extern const struct cras_mix_ops mixer_ops_avx2;
-extern const struct cras_mix_ops mixer_ops_fma;
-
-/* Struct containing ops to implement mix/scale on a buffer of samples.
- * Different architecture can provide different implementations and wraps
- * the implementations into cras_mix_ops.
- * Different sample formats will be handled by different implementations.
- * The usage of each operation is explained in cras_mix.h
- *
- * Members:
- *   scale_buffer_increment: See cras_scale_buffer_increment.
- *   scale_buffer: See cras_scale_buffer.
- *   add: See cras_mix_add.
- *   add_scale_stride: See cras_mix_add_scale_stride.
- *   mute_buffer: cras_mix_mute_buffer.
- */
-struct cras_mix_ops {
-	void (*scale_buffer_increment)(snd_pcm_format_t fmt, uint8_t *buff,
-				       unsigned int count, float scaler,
-				       float increment, float target, int step);
-	void (*scale_buffer)(snd_pcm_format_t fmt, uint8_t *buff,
-			     unsigned int count, float scaler);
-	void (*add)(snd_pcm_format_t fmt, uint8_t *dst, uint8_t *src,
-		    unsigned int count, unsigned int index, int mute,
-		    float mix_vol);
-	void (*add_scale_stride)(snd_pcm_format_t fmt, uint8_t *dst,
-				 uint8_t *src, unsigned int count,
-				 unsigned int dst_stride,
-				 unsigned int src_stride, float scaler);
-	size_t (*mute_buffer)(uint8_t *dst, size_t frame_bytes, size_t count);
-};
-#endif
diff --git a/cras/src/server/cras_non_empty_audio_handler.c b/cras/src/server/cras_non_empty_audio_handler.c
deleted file mode 100644
index 313149f..0000000
--- a/cras/src/server/cras_non_empty_audio_handler.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/* Copyright 2017 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <stdint.h>
-#include <string.h>
-#include <syslog.h>
-
-#include "cras_main_message.h"
-#include "cras_observer.h"
-#include "cras_system_state.h"
-
-struct non_empty_audio_msg {
-	struct cras_main_message header;
-	int32_t non_empty;
-};
-
-/* The following functions are called from audio thread. */
-
-static void init_non_empty_audio_msg(struct non_empty_audio_msg *msg)
-{
-	memset(msg, 0, sizeof(*msg));
-	msg->header.type = CRAS_MAIN_NON_EMPTY_AUDIO_STATE;
-	msg->header.length = sizeof(*msg);
-}
-
-int cras_non_empty_audio_send_msg(int32_t non_empty)
-{
-	struct non_empty_audio_msg msg;
-	int rc;
-
-	init_non_empty_audio_msg(&msg);
-	msg.non_empty = non_empty;
-
-	rc = cras_main_message_send((struct cras_main_message *)&msg);
-	if (rc < 0)
-		syslog(LOG_ERR, "Failed to send non-empty audio message!");
-
-	return rc;
-}
-
-/* The following functions are called from main thread. */
-
-static void handle_non_empty_audio_message(struct cras_main_message *msg,
-					   void *arg)
-{
-	struct non_empty_audio_msg *audio_msg =
-		(struct non_empty_audio_msg *)msg;
-
-	cras_system_state_set_non_empty_status(audio_msg->non_empty);
-	cras_observer_notify_non_empty_audio_state_changed(
-		audio_msg->non_empty);
-}
-
-int cras_non_empty_audio_handler_init()
-{
-	cras_main_message_add_handler(CRAS_MAIN_NON_EMPTY_AUDIO_STATE,
-				      handle_non_empty_audio_message, NULL);
-	return 0;
-}
\ No newline at end of file
diff --git a/cras/src/server/cras_non_empty_audio_handler.h b/cras/src/server/cras_non_empty_audio_handler.h
deleted file mode 100644
index dac6b22..0000000
--- a/cras/src/server/cras_non_empty_audio_handler.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/* Copyright 2018 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- *
- * The non-empty audio state handler is used to send a DBus signal when the
- * system-level non-empty audio state changes.
- *
- * cras_non_empty_audio_msg() is called from audio thread to update the
- * non-empty audio state in the main thread, which in turn sends the DBus
- * signal.
- *
- * cras_non_empty_audio_handler_init() is used to setup the message handler
- * in the main thread to handle the non-empty audiomessage from audio thread.
- */
-
-#ifndef CRAS_NON_EMPTY_AUDIO_HANDLER_H_
-#define CRAS_NON_EMPTY_AUDIO_HANDLER_H_
-
-/* Send non-empty audio state message. */
-int cras_non_empty_audio_send_msg(int32_t non_empty);
-
-/* Initialize non-empty audio handler. */
-int cras_non_empty_audio_handler_init();
-
-#endif /* CRAS_NON_EMPTY_AUDIO_HANDLER_H_ */
diff --git a/cras/src/server/cras_observer.c b/cras/src/server/cras_observer.c
deleted file mode 100644
index 0f17dc9..0000000
--- a/cras/src/server/cras_observer.c
+++ /dev/null
@@ -1,634 +0,0 @@
-/* Copyright 2016 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include "cras_observer.h"
-
-#include "cras_alert.h"
-#include "cras_iodev_list.h"
-#include "cras_types.h"
-#include "utlist.h"
-
-struct cras_observer_client {
-	struct cras_observer_ops ops;
-	void *context;
-	struct cras_observer_client *next, *prev;
-};
-
-struct cras_observer_alerts {
-	struct cras_alert *output_volume;
-	struct cras_alert *output_mute;
-	struct cras_alert *capture_gain;
-	struct cras_alert *capture_mute;
-	struct cras_alert *nodes;
-	struct cras_alert *active_node;
-	struct cras_alert *output_node_volume;
-	struct cras_alert *node_left_right_swapped;
-	struct cras_alert *input_node_gain;
-	struct cras_alert *suspend_changed;
-	struct cras_alert *hotword_triggered;
-	/* If all events for active streams went through a single alert then
-         * we might miss some because the alert code does not send every
-         * alert message. To ensure that the event sent contains the correct
-         * number of active streams per direction, make the alerts
-         * per-direciton. */
-	struct cras_alert *num_active_streams[CRAS_NUM_DIRECTIONS];
-	struct cras_alert *non_empty_audio_state_changed;
-	struct cras_alert *bt_battery_changed;
-	struct cras_alert *num_input_streams_with_permission;
-};
-
-struct cras_observer_server {
-	struct cras_observer_alerts alerts;
-	struct cras_observer_client *clients;
-};
-
-struct cras_observer_alert_data_volume {
-	int32_t volume;
-};
-
-struct cras_observer_alert_data_mute {
-	int muted;
-	int user_muted;
-	int mute_locked;
-};
-
-struct cras_observer_alert_data_active_node {
-	enum CRAS_STREAM_DIRECTION direction;
-	cras_node_id_t node_id;
-};
-
-struct cras_observer_alert_data_node_volume {
-	cras_node_id_t node_id;
-	int32_t volume;
-};
-
-struct cras_observer_alert_data_node_lr_swapped {
-	cras_node_id_t node_id;
-	int swapped;
-};
-
-struct cras_observer_alert_data_suspend {
-	int suspended;
-};
-
-struct cras_observer_alert_data_streams {
-	enum CRAS_STREAM_DIRECTION direction;
-	uint32_t num_active_streams;
-};
-
-struct cras_observer_alert_data_input_streams {
-	uint32_t num_input_streams[CRAS_NUM_CLIENT_TYPE];
-};
-
-struct cras_observer_alert_data_hotword_triggered {
-	int64_t tv_sec;
-	int64_t tv_nsec;
-};
-
-struct cras_observer_non_empty_audio_state {
-	int non_empty;
-};
-
-struct cras_observer_alert_data_bt_battery_changed {
-	const char *address;
-	uint32_t level;
-};
-
-/* Global observer instance. */
-static struct cras_observer_server *g_observer;
-
-/* Empty observer ops. */
-static struct cras_observer_ops g_empty_ops;
-
-/*
- * Alert handlers for delayed callbacks.
- */
-
-static void output_volume_alert(void *arg, void *data)
-{
-	struct cras_observer_client *client;
-	struct cras_observer_alert_data_volume *volume_data =
-		(struct cras_observer_alert_data_volume *)data;
-
-	DL_FOREACH (g_observer->clients, client) {
-		if (client->ops.output_volume_changed)
-			client->ops.output_volume_changed(client->context,
-							  volume_data->volume);
-	}
-}
-
-static void output_mute_alert(void *arg, void *data)
-{
-	struct cras_observer_client *client;
-	struct cras_observer_alert_data_mute *mute_data =
-		(struct cras_observer_alert_data_mute *)data;
-
-	DL_FOREACH (g_observer->clients, client) {
-		if (client->ops.output_mute_changed)
-			client->ops.output_mute_changed(client->context,
-							mute_data->muted,
-							mute_data->user_muted,
-							mute_data->mute_locked);
-	}
-}
-
-static void capture_gain_alert(void *arg, void *data)
-{
-	struct cras_observer_client *client;
-	struct cras_observer_alert_data_volume *volume_data =
-		(struct cras_observer_alert_data_volume *)data;
-
-	DL_FOREACH (g_observer->clients, client) {
-		if (client->ops.capture_gain_changed)
-			client->ops.capture_gain_changed(client->context,
-							 volume_data->volume);
-	}
-}
-
-static void capture_mute_alert(void *arg, void *data)
-{
-	struct cras_observer_client *client;
-	struct cras_observer_alert_data_mute *mute_data =
-		(struct cras_observer_alert_data_mute *)data;
-
-	DL_FOREACH (g_observer->clients, client) {
-		if (client->ops.capture_mute_changed)
-			client->ops.capture_mute_changed(
-				client->context, mute_data->muted,
-				mute_data->mute_locked);
-	}
-}
-
-static void nodes_prepare(struct cras_alert *alert)
-{
-	cras_iodev_list_update_device_list();
-}
-
-static void nodes_alert(void *arg, void *data)
-{
-	struct cras_observer_client *client;
-
-	DL_FOREACH (g_observer->clients, client) {
-		if (client->ops.nodes_changed)
-			client->ops.nodes_changed(client->context);
-	}
-}
-
-static void active_node_alert(void *arg, void *data)
-{
-	struct cras_observer_client *client;
-	struct cras_observer_alert_data_active_node *node_data =
-		(struct cras_observer_alert_data_active_node *)data;
-
-	DL_FOREACH (g_observer->clients, client) {
-		if (client->ops.active_node_changed)
-			client->ops.active_node_changed(client->context,
-							node_data->direction,
-							node_data->node_id);
-	}
-}
-
-static void output_node_volume_alert(void *arg, void *data)
-{
-	struct cras_observer_client *client;
-	struct cras_observer_alert_data_node_volume *node_data =
-		(struct cras_observer_alert_data_node_volume *)data;
-
-	DL_FOREACH (g_observer->clients, client) {
-		if (client->ops.output_node_volume_changed)
-			client->ops.output_node_volume_changed(
-				client->context, node_data->node_id,
-				node_data->volume);
-	}
-}
-
-static void node_left_right_swapped_alert(void *arg, void *data)
-{
-	struct cras_observer_client *client;
-	struct cras_observer_alert_data_node_lr_swapped *node_data =
-		(struct cras_observer_alert_data_node_lr_swapped *)data;
-
-	DL_FOREACH (g_observer->clients, client) {
-		if (client->ops.node_left_right_swapped_changed)
-			client->ops.node_left_right_swapped_changed(
-				client->context, node_data->node_id,
-				node_data->swapped);
-	}
-}
-
-static void input_node_gain_alert(void *arg, void *data)
-{
-	struct cras_observer_client *client;
-	struct cras_observer_alert_data_node_volume *node_data =
-		(struct cras_observer_alert_data_node_volume *)data;
-
-	DL_FOREACH (g_observer->clients, client) {
-		if (client->ops.input_node_gain_changed)
-			client->ops.input_node_gain_changed(client->context,
-							    node_data->node_id,
-							    node_data->volume);
-	}
-}
-
-static void suspend_changed_alert(void *arg, void *data)
-{
-	struct cras_observer_client *client;
-	struct cras_observer_alert_data_suspend *suspend_data =
-		(struct cras_observer_alert_data_suspend *)data;
-
-	DL_FOREACH (g_observer->clients, client) {
-		if (client->ops.suspend_changed)
-			client->ops.suspend_changed(client->context,
-						    suspend_data->suspended);
-	}
-}
-
-static void num_active_streams_alert(void *arg, void *data)
-{
-	struct cras_observer_client *client;
-	struct cras_observer_alert_data_streams *streams_data =
-		(struct cras_observer_alert_data_streams *)data;
-
-	DL_FOREACH (g_observer->clients, client) {
-		if (client->ops.num_active_streams_changed)
-			client->ops.num_active_streams_changed(
-				client->context, streams_data->direction,
-				streams_data->num_active_streams);
-	}
-}
-
-static void num_input_streams_with_permission_alert(void *arg, void *data)
-{
-	struct cras_observer_client *client;
-	struct cras_observer_alert_data_input_streams *input_streams_data =
-		(struct cras_observer_alert_data_input_streams *)data;
-
-	DL_FOREACH (g_observer->clients, client) {
-		if (client->ops.num_input_streams_with_permission_changed)
-			client->ops.num_input_streams_with_permission_changed(
-				client->context,
-				input_streams_data->num_input_streams);
-	}
-}
-
-static void hotword_triggered_alert(void *arg, void *data)
-{
-	struct cras_observer_client *client;
-	struct cras_observer_alert_data_hotword_triggered *triggered_data =
-		(struct cras_observer_alert_data_hotword_triggered *)data;
-
-	DL_FOREACH (g_observer->clients, client) {
-		if (client->ops.hotword_triggered)
-			client->ops.hotword_triggered(client->context,
-						      triggered_data->tv_sec,
-						      triggered_data->tv_nsec);
-	}
-}
-
-static void non_empty_audio_state_changed_alert(void *arg, void *data)
-{
-	struct cras_observer_client *client;
-	struct cras_observer_non_empty_audio_state *non_empty_audio_data =
-		(struct cras_observer_non_empty_audio_state *)data;
-
-	DL_FOREACH (g_observer->clients, client) {
-		if (client->ops.non_empty_audio_state_changed) {
-			client->ops.non_empty_audio_state_changed(
-				client->context,
-				non_empty_audio_data->non_empty);
-		}
-	}
-}
-
-static void bt_battery_changed_alert(void *arg, void *data)
-{
-	struct cras_observer_client *client;
-	struct cras_observer_alert_data_bt_battery_changed *triggered_data =
-		(struct cras_observer_alert_data_bt_battery_changed *)data;
-
-	DL_FOREACH (g_observer->clients, client) {
-		if (client->ops.bt_battery_changed)
-			client->ops.bt_battery_changed(client->context,
-						       triggered_data->address,
-						       triggered_data->level);
-	}
-}
-
-static int cras_observer_server_set_alert(struct cras_alert **alert,
-					  cras_alert_cb cb,
-					  cras_alert_prepare prepare,
-					  unsigned int flags)
-{
-	*alert = cras_alert_create(prepare, flags);
-	if (!*alert)
-		return -ENOMEM;
-	return cras_alert_add_callback(*alert, cb, NULL);
-}
-
-#define CRAS_OBSERVER_SET_ALERT(alert, prepare, flags)                         \
-	do {                                                                   \
-		rc = cras_observer_server_set_alert(&g_observer->alerts.alert, \
-						    alert##_alert, prepare,    \
-						    flags);                    \
-		if (rc)                                                        \
-			goto error;                                            \
-	} while (0)
-
-#define CRAS_OBSERVER_SET_ALERT_WITH_DIRECTION(alert, direction)               \
-	do {                                                                   \
-		rc = cras_observer_server_set_alert(                           \
-			&g_observer->alerts.alert[direction], alert##_alert,   \
-			NULL, 0);                                              \
-		if (rc)                                                        \
-			goto error;                                            \
-	} while (0)
-
-/*
- * Public interface
- */
-
-int cras_observer_server_init()
-{
-	int rc;
-
-	memset(&g_empty_ops, 0, sizeof(g_empty_ops));
-	g_observer = (struct cras_observer_server *)calloc(
-		1, sizeof(struct cras_observer_server));
-	if (!g_observer)
-		return -ENOMEM;
-
-	CRAS_OBSERVER_SET_ALERT(output_volume, NULL, 0);
-	CRAS_OBSERVER_SET_ALERT(output_mute, NULL, 0);
-	CRAS_OBSERVER_SET_ALERT(capture_gain, NULL, 0);
-	CRAS_OBSERVER_SET_ALERT(capture_mute, NULL, 0);
-	CRAS_OBSERVER_SET_ALERT(nodes, nodes_prepare, 0);
-	CRAS_OBSERVER_SET_ALERT(active_node, nodes_prepare,
-				CRAS_ALERT_FLAG_KEEP_ALL_DATA);
-	CRAS_OBSERVER_SET_ALERT(output_node_volume, NULL, 0);
-	CRAS_OBSERVER_SET_ALERT(node_left_right_swapped, NULL, 0);
-	CRAS_OBSERVER_SET_ALERT(input_node_gain, NULL, 0);
-	CRAS_OBSERVER_SET_ALERT(suspend_changed, NULL, 0);
-	CRAS_OBSERVER_SET_ALERT(hotword_triggered, NULL, 0);
-	CRAS_OBSERVER_SET_ALERT(non_empty_audio_state_changed, NULL, 0);
-	CRAS_OBSERVER_SET_ALERT(bt_battery_changed, NULL, 0);
-	CRAS_OBSERVER_SET_ALERT(num_input_streams_with_permission, NULL, 0);
-
-	CRAS_OBSERVER_SET_ALERT_WITH_DIRECTION(num_active_streams,
-					       CRAS_STREAM_OUTPUT);
-	CRAS_OBSERVER_SET_ALERT_WITH_DIRECTION(num_active_streams,
-					       CRAS_STREAM_INPUT);
-	CRAS_OBSERVER_SET_ALERT_WITH_DIRECTION(num_active_streams,
-					       CRAS_STREAM_POST_MIX_PRE_DSP);
-
-	return 0;
-
-error:
-	cras_observer_server_free();
-	return rc;
-}
-
-void cras_observer_server_free()
-{
-	if (!g_observer)
-		return;
-	cras_alert_destroy(g_observer->alerts.output_volume);
-	cras_alert_destroy(g_observer->alerts.output_mute);
-	cras_alert_destroy(g_observer->alerts.capture_gain);
-	cras_alert_destroy(g_observer->alerts.capture_mute);
-	cras_alert_destroy(g_observer->alerts.nodes);
-	cras_alert_destroy(g_observer->alerts.active_node);
-	cras_alert_destroy(g_observer->alerts.output_node_volume);
-	cras_alert_destroy(g_observer->alerts.node_left_right_swapped);
-	cras_alert_destroy(g_observer->alerts.input_node_gain);
-	cras_alert_destroy(g_observer->alerts.suspend_changed);
-	cras_alert_destroy(g_observer->alerts.hotword_triggered);
-	cras_alert_destroy(g_observer->alerts.non_empty_audio_state_changed);
-	cras_alert_destroy(g_observer->alerts.bt_battery_changed);
-	cras_alert_destroy(
-		g_observer->alerts.num_input_streams_with_permission);
-	cras_alert_destroy(
-		g_observer->alerts.num_active_streams[CRAS_STREAM_OUTPUT]);
-	cras_alert_destroy(
-		g_observer->alerts.num_active_streams[CRAS_STREAM_INPUT]);
-	cras_alert_destroy(
-		g_observer->alerts
-			.num_active_streams[CRAS_STREAM_POST_MIX_PRE_DSP]);
-	free(g_observer);
-	g_observer = NULL;
-}
-
-int cras_observer_ops_are_empty(const struct cras_observer_ops *ops)
-{
-	return memcmp(ops, &g_empty_ops, sizeof(*ops)) == 0;
-}
-
-void cras_observer_get_ops(const struct cras_observer_client *client,
-			   struct cras_observer_ops *ops)
-{
-	if (!ops)
-		return;
-	if (!client)
-		memset(ops, 0, sizeof(*ops));
-	else
-		memcpy(ops, &client->ops, sizeof(*ops));
-}
-
-void cras_observer_set_ops(struct cras_observer_client *client,
-			   const struct cras_observer_ops *ops)
-{
-	if (!client)
-		return;
-	if (!ops)
-		memset(&client->ops, 0, sizeof(client->ops));
-	else
-		memcpy(&client->ops, ops, sizeof(client->ops));
-}
-
-struct cras_observer_client *
-cras_observer_add(const struct cras_observer_ops *ops, void *context)
-{
-	struct cras_observer_client *client;
-
-	client = (struct cras_observer_client *)calloc(1, sizeof(*client));
-	if (!client)
-		return NULL;
-	client->context = context;
-	DL_APPEND(g_observer->clients, client);
-	cras_observer_set_ops(client, ops);
-	return client;
-}
-
-void cras_observer_remove(struct cras_observer_client *client)
-{
-	if (!client)
-		return;
-	DL_DELETE(g_observer->clients, client);
-	free(client);
-}
-
-/*
- * Public interface for notifiers.
- */
-
-void cras_observer_notify_output_volume(int32_t volume)
-{
-	struct cras_observer_alert_data_volume data;
-
-	data.volume = volume;
-	cras_alert_pending_data(g_observer->alerts.output_volume, &data,
-				sizeof(data));
-}
-
-void cras_observer_notify_output_mute(int muted, int user_muted,
-				      int mute_locked)
-{
-	struct cras_observer_alert_data_mute data;
-
-	data.muted = muted;
-	data.user_muted = user_muted;
-	data.mute_locked = mute_locked;
-	cras_alert_pending_data(g_observer->alerts.output_mute, &data,
-				sizeof(data));
-}
-
-void cras_observer_notify_capture_gain(int32_t gain)
-{
-	struct cras_observer_alert_data_volume data;
-
-	data.volume = gain;
-	cras_alert_pending_data(g_observer->alerts.capture_gain, &data,
-				sizeof(data));
-}
-
-void cras_observer_notify_capture_mute(int muted, int mute_locked)
-{
-	struct cras_observer_alert_data_mute data;
-
-	data.muted = muted;
-	data.user_muted = 0;
-	data.mute_locked = mute_locked;
-	cras_alert_pending_data(g_observer->alerts.capture_mute, &data,
-				sizeof(data));
-}
-
-void cras_observer_notify_nodes(void)
-{
-	cras_alert_pending(g_observer->alerts.nodes);
-}
-
-void cras_observer_notify_active_node(enum CRAS_STREAM_DIRECTION dir,
-				      cras_node_id_t node_id)
-{
-	struct cras_observer_alert_data_active_node data;
-
-	data.direction = dir;
-	data.node_id = node_id;
-	cras_alert_pending_data(g_observer->alerts.active_node, &data,
-				sizeof(data));
-}
-
-void cras_observer_notify_output_node_volume(cras_node_id_t node_id,
-					     int32_t volume)
-{
-	struct cras_observer_alert_data_node_volume data;
-
-	data.node_id = node_id;
-	data.volume = volume;
-	cras_alert_pending_data(g_observer->alerts.output_node_volume, &data,
-				sizeof(data));
-}
-
-void cras_observer_notify_node_left_right_swapped(cras_node_id_t node_id,
-						  int swapped)
-{
-	struct cras_observer_alert_data_node_lr_swapped data;
-
-	data.node_id = node_id;
-	data.swapped = swapped;
-	cras_alert_pending_data(g_observer->alerts.node_left_right_swapped,
-				&data, sizeof(data));
-}
-
-void cras_observer_notify_input_node_gain(cras_node_id_t node_id, int32_t gain)
-{
-	struct cras_observer_alert_data_node_volume data;
-
-	data.node_id = node_id;
-	data.volume = gain;
-	cras_alert_pending_data(g_observer->alerts.input_node_gain, &data,
-				sizeof(data));
-}
-
-void cras_observer_notify_suspend_changed(int suspended)
-{
-	struct cras_observer_alert_data_suspend data;
-
-	data.suspended = suspended;
-	cras_alert_pending_data(g_observer->alerts.suspend_changed, &data,
-				sizeof(data));
-}
-
-void cras_observer_notify_num_active_streams(enum CRAS_STREAM_DIRECTION dir,
-					     uint32_t num_active_streams)
-{
-	struct cras_observer_alert_data_streams data;
-	struct cras_alert *alert;
-
-	data.direction = dir;
-	data.num_active_streams = num_active_streams;
-	alert = g_observer->alerts.num_active_streams[dir];
-	if (!alert)
-		return;
-
-	cras_alert_pending_data(alert, &data, sizeof(data));
-}
-
-void cras_observer_notify_input_streams_with_permission(
-	uint32_t num_input_streams[CRAS_NUM_CLIENT_TYPE])
-{
-	struct cras_observer_alert_data_input_streams data;
-	struct cras_alert *alert;
-
-	memcpy(&data.num_input_streams, num_input_streams,
-	       sizeof(*num_input_streams) * CRAS_NUM_CLIENT_TYPE);
-	alert = g_observer->alerts.num_input_streams_with_permission;
-	if (!alert)
-		return;
-
-	cras_alert_pending_data(alert, &data, sizeof(data));
-}
-
-void cras_observer_notify_hotword_triggered(int64_t tv_sec, int64_t tv_nsec)
-{
-	struct cras_observer_alert_data_hotword_triggered data;
-
-	data.tv_sec = tv_sec;
-	data.tv_nsec = tv_nsec;
-	cras_alert_pending_data(g_observer->alerts.hotword_triggered, &data,
-				sizeof(data));
-}
-
-void cras_observer_notify_non_empty_audio_state_changed(int non_empty)
-{
-	struct cras_observer_non_empty_audio_state data;
-
-	data.non_empty = non_empty;
-
-	cras_alert_pending_data(
-		g_observer->alerts.non_empty_audio_state_changed, &data,
-		sizeof(data));
-}
-
-void cras_observer_notify_bt_battery_changed(const char *address,
-					     uint32_t level)
-{
-	struct cras_observer_alert_data_bt_battery_changed data;
-
-	data.address = address;
-	data.level = level;
-
-	cras_alert_pending_data(g_observer->alerts.bt_battery_changed, &data,
-				sizeof(data));
-}
diff --git a/cras/src/server/cras_observer.h b/cras/src/server/cras_observer.h
deleted file mode 100644
index 2dd013b..0000000
--- a/cras/src/server/cras_observer.h
+++ /dev/null
@@ -1,109 +0,0 @@
-/* Copyright 2016 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_OBSERVER_H
-#define CRAS_OBSERVER_H
-
-#include "cras_observer_ops.h"
-
-struct cras_observer_client;
-
-/* Add an observer.
- * Args:
- *    ops - Set callback function pointers in the operations that should be
- *          called for state changes, or NULL otherwise.
- *    context - Context pointer passed to the callbacks.
- * Returns:
- *    Valid pointer to the client reference, or NULL on memory allocation
- *    error.
- */
-struct cras_observer_client *
-cras_observer_add(const struct cras_observer_ops *ops, void *context);
-
-/* Retrieve the observed state changes.
- * Args:
- *    client - The client to query.
- *    ops - Filled with the current values in the callback table.
- */
-void cras_observer_get_ops(const struct cras_observer_client *client,
-			   struct cras_observer_ops *ops);
-
-/* Update the observed state changes.
- * Args:
- *    client - The client to modify.
- *    ops - Set callback function pointers in the operations that should be
- *          called for state changes, or NULL otherwise.
- */
-void cras_observer_set_ops(struct cras_observer_client *client,
-			   const struct cras_observer_ops *ops);
-
-/* Returns non-zero if the given ops are empty. */
-int cras_observer_ops_are_empty(const struct cras_observer_ops *ops);
-
-/* Remove this observer client.
- * Args:
- *    client - The client to remove.
- */
-void cras_observer_remove(struct cras_observer_client *client);
-
-/* Initialize the observer server. */
-int cras_observer_server_init();
-
-/* Destroy the observer server. */
-void cras_observer_server_free();
-
-/* Notify observers of output volume change. */
-void cras_observer_notify_output_volume(int32_t volume);
-
-/* Notify observers of output mute change. */
-void cras_observer_notify_output_mute(int muted, int user_muted,
-				      int mute_locked);
-
-/* Notify observers of capture gain change. */
-void cras_observer_notify_capture_gain(int32_t gain);
-
-/* Notify observers of capture mute change. */
-void cras_observer_notify_capture_mute(int muted, int mute_locked);
-
-/* Notify observers of a nodes list change. */
-void cras_observer_notify_nodes(void);
-
-/* Notify observers of active output node change. */
-void cras_observer_notify_active_node(enum CRAS_STREAM_DIRECTION dir,
-				      cras_node_id_t node_id);
-
-/* Notify observers of output node volume change. */
-void cras_observer_notify_output_node_volume(cras_node_id_t node_id,
-					     int32_t volume);
-
-/* Notify observers of node left-right swap change. */
-void cras_observer_notify_node_left_right_swapped(cras_node_id_t node_id,
-						  int swapped);
-
-/* Notify observers of input node gain change. */
-void cras_observer_notify_input_node_gain(cras_node_id_t node_id, int32_t gain);
-
-/* Notify observers of suspend state changed. */
-void cras_observer_notify_suspend_changed(int suspended);
-
-/* Notify observers of the number of active streams. */
-void cras_observer_notify_num_active_streams(enum CRAS_STREAM_DIRECTION dir,
-					     uint32_t num_active_streams);
-
-/* Notify observers of the number of input streams with permission. */
-void cras_observer_notify_input_streams_with_permission(
-	uint32_t num_input_streams[CRAS_NUM_CLIENT_TYPE]);
-
-/* Notify observers of the timestamp when hotword triggered. */
-void cras_observer_notify_hotword_triggered(int64_t tv_sec, int64_t tv_nsec);
-
-/* Notify observers the non-empty audio state changed. */
-void cras_observer_notify_non_empty_audio_state_changed(int active);
-
-/* Notify observers the bluetooth headset battery level changed. */
-void cras_observer_notify_bt_battery_changed(const char *address,
-					     uint32_t level);
-
-#endif /* CRAS_OBSERVER_H */
diff --git a/cras/src/server/cras_playback_rclient.c b/cras/src/server/cras_playback_rclient.c
deleted file mode 100644
index 54a75db..0000000
--- a/cras/src/server/cras_playback_rclient.c
+++ /dev/null
@@ -1,35 +0,0 @@
-/* Copyright 2019 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <syslog.h>
-
-#include "cras_iodev_list.h"
-#include "cras_messages.h"
-#include "cras_observer.h"
-#include "cras_rclient.h"
-#include "cras_rclient_util.h"
-#include "cras_rstream.h"
-#include "cras_types.h"
-#include "cras_util.h"
-
-/* Declarations of cras_rclient operators for cras_playback_rclient. */
-static const struct cras_rclient_ops cras_playback_rclient_ops = {
-	.handle_message_from_client = rclient_handle_message_from_client,
-	.send_message_to_client = rclient_send_message_to_client,
-	.destroy = rclient_destroy,
-};
-
-/*
- * Exported Functions.
- */
-
-/* Creates a client structure and sends a message back informing the client that
- * the connection has succeeded. */
-struct cras_rclient *cras_playback_rclient_create(int fd, size_t id)
-{
-	return rclient_generic_create(
-		fd, id, &cras_playback_rclient_ops,
-		cras_stream_direction_mask(CRAS_STREAM_OUTPUT));
-}
diff --git a/cras/src/server/cras_playback_rclient.h b/cras/src/server/cras_playback_rclient.h
deleted file mode 100644
index 37f03cf..0000000
--- a/cras/src/server/cras_playback_rclient.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/* Copyright 2019 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_PLAYBACK_RCLIENT_H_
-#define CRAS_PLAYBACK_RCLIENT_H_
-
-struct cras_rclient;
-
-/* Creates a playback rclient structure.
- * Args:
- *    fd - The file descriptor used for communication with the client.
- *    id - Unique identifier for this client.
- * Returns:
- *    A pointer to the newly created rclient on success, NULL on failure.
- */
-struct cras_rclient *cras_playback_rclient_create(int fd, size_t id);
-
-#endif /* CRAS_PLAYBACK_RCLIENT_H_ */
diff --git a/cras/src/server/cras_ramp.c b/cras/src/server/cras_ramp.c
deleted file mode 100644
index f027204..0000000
--- a/cras/src/server/cras_ramp.c
+++ /dev/null
@@ -1,136 +0,0 @@
-/* Copyright 2016 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <syslog.h>
-
-#include "cras_ramp.h"
-
-/*
- * Struct to hold ramping information.
- * Members:
- *   state: Current state. One of CRAS_RAMP_STATE.
- *   ramped_frames: Number of frames that have passed after starting ramping.
- *   duration_frames: The targeted number of frames for whole ramping duration.
- *   increment: The scaler increment that should be added to scaler for
- *              every frame.
- *   start_scaler: The initial scaler.
- *   cb: Callback function to call after ramping is done.
- *   cb_data: Data passed to cb.
- */
-struct cras_ramp {
-	int active;
-	int ramped_frames;
-	int duration_frames;
-	float increment;
-	float start_scaler;
-	float target;
-	void (*cb)(void *data);
-	void *cb_data;
-};
-
-void cras_ramp_destroy(struct cras_ramp *ramp)
-{
-	free(ramp);
-}
-
-struct cras_ramp *cras_ramp_create()
-{
-	struct cras_ramp *ramp;
-	ramp = (struct cras_ramp *)malloc(sizeof(*ramp));
-	if (ramp == NULL) {
-		return NULL;
-	}
-	cras_ramp_reset(ramp);
-	return ramp;
-}
-
-int cras_ramp_reset(struct cras_ramp *ramp)
-{
-	ramp->active = 0;
-	ramp->ramped_frames = 0;
-	ramp->duration_frames = 0;
-	ramp->increment = 0;
-	ramp->start_scaler = 1.0;
-	ramp->target = 1.0;
-	return 0;
-}
-
-int cras_ramp_start(struct cras_ramp *ramp, int mute_ramp, float from, float to,
-		    int duration_frames, cras_ramp_cb cb, void *cb_data)
-{
-	struct cras_ramp_action action;
-
-	if (!ramp)
-		return -EINVAL;
-
-	/* if from == to == 0 means we want to mute for duration_frames */
-	if (from == to && from != 0)
-		return 0;
-
-	/* Get current scaler position so it can serve as new start scaler. */
-	action = cras_ramp_get_current_action(ramp);
-	if (action.type == CRAS_RAMP_ACTION_INVALID)
-		return -EINVAL;
-
-	/* Set initial scaler to current scaler so ramping up/down can be
-         * smoothly switched. */
-	ramp->active = 1;
-	if (action.type == CRAS_RAMP_ACTION_NONE) {
-		ramp->start_scaler = from;
-	} else {
-		/* If this a mute ramp, we want to match the previous multiplier
-		 * so that there is not a jump in the audio. Otherwise, we are
-		 * applying a volume ramp so we need to multiply |from| by the
-		 * previous scaler so that we can stack volume ramps. */
-		ramp->start_scaler = action.scaler;
-		if (!mute_ramp)
-			ramp->start_scaler *= from;
-	}
-	ramp->increment = (to - ramp->start_scaler) / duration_frames;
-	ramp->target = to;
-	ramp->ramped_frames = 0;
-	ramp->duration_frames = duration_frames;
-	ramp->cb = cb;
-	ramp->cb_data = cb_data;
-	return 0;
-}
-
-struct cras_ramp_action
-cras_ramp_get_current_action(const struct cras_ramp *ramp)
-{
-	struct cras_ramp_action action;
-
-	if (ramp->ramped_frames < 0) {
-		action.type = CRAS_RAMP_ACTION_INVALID;
-		action.scaler = 1.0;
-		action.increment = 0.0;
-		action.target = 1.0;
-	} else if (ramp->active) {
-		action.type = CRAS_RAMP_ACTION_PARTIAL;
-		action.scaler = ramp->start_scaler +
-				ramp->ramped_frames * ramp->increment;
-		action.increment = ramp->increment;
-		action.target = ramp->target;
-	} else {
-		action.type = CRAS_RAMP_ACTION_NONE;
-		action.scaler = 1.0;
-		action.increment = 0.0;
-		action.target = 1.0;
-	}
-	return action;
-}
-
-int cras_ramp_update_ramped_frames(struct cras_ramp *ramp, int num_frames)
-{
-	if (!ramp->active)
-		return -EINVAL;
-	ramp->ramped_frames += num_frames;
-	if (ramp->ramped_frames >= ramp->duration_frames) {
-		ramp->active = 0;
-		if (ramp->cb)
-			ramp->cb(ramp->cb_data);
-	}
-	return 0;
-}
diff --git a/cras/src/server/cras_ramp.h b/cras/src/server/cras_ramp.h
deleted file mode 100644
index 077e9be..0000000
--- a/cras/src/server/cras_ramp.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/* Copyright 2016 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_RAMP_H_
-#define CRAS_RAMP_H_
-
-#include "cras_iodev.h"
-
-struct cras_ramp;
-
-/*
- * Infomation telling user how to do ramping.
- * action CRAS_RAMP_ACTION_NONE: No scale should be applied.
- * action CRAS_RAMP_ACTION_PARTIAL: scale sample by sample starting from scaler
- *                                  and increase increment for each sample.
- * action CRAS_RAMP_ACTION_INVALID: There is an error in cras_ramp.
- */
-enum CRAS_RAMP_ACTION_TYPE {
-	CRAS_RAMP_ACTION_NONE,
-	CRAS_RAMP_ACTION_PARTIAL,
-	CRAS_RAMP_ACTION_INVALID,
-};
-
-/*
- * Struct to hold current ramping action for user.
- * Members:
- *   type: See CRAS_RAMP_ACTION_TYPE.
- *   scaler: The initial scaler to be applied.
- *   increment: The scaler increment that should be added to scaler for every
- *              frame.
- */
-struct cras_ramp_action {
-	enum CRAS_RAMP_ACTION_TYPE type;
-	float scaler;
-	float increment;
-	float target;
-};
-
-typedef void (*cras_ramp_cb)(void *arg);
-
-/* Creates a ramp. */
-struct cras_ramp *cras_ramp_create();
-
-/* Destroys a ramp. */
-void cras_ramp_destroy(struct cras_ramp *ramp);
-
-/* Ramps the scaler between from and to for duration_frames frames.
- * Args:
- *   ramp[in]: The ramp struct to start.
- *   mute_ramp[in]: Is this ramp a mute->unmute or unmute->mute ramp.
- *   from[in]: The scaler value to ramp from.
- *   to[in]: The scaler value to ramp to.
- *   duration_frames[in]: Ramp duration in frames.
- *   cb[in]: The callback function to call after ramping is done. User can set
- *           cb to turn off speaker/headphone switch after ramping down
- *           is done.
- *   cb_data[in]: The data passed to callback function.
- * Returns:
- *   0 on success; negative error code on failure.
- */
-int cras_ramp_start(struct cras_ramp *ramp, int mute_ramp, float from, float to,
-		    int duration_frames, cras_ramp_cb cb, void *cb_data);
-
-/* Convenience wrappers for cras_ramp_start */
-static inline int cras_mute_ramp_start(struct cras_ramp *ramp, float from,
-				       float to, int duration_frames,
-				       cras_ramp_cb cb, void *cb_data)
-{
-	return cras_ramp_start(ramp, 1, from, to, duration_frames, cb, cb_data);
-}
-
-static inline int cras_volume_ramp_start(struct cras_ramp *ramp, float from,
-					 float to, int duration_frames,
-					 cras_ramp_cb cb, void *cb_data)
-{
-	return cras_ramp_start(ramp, 0, from, to, duration_frames, cb, cb_data);
-}
-
-/* Resets ramp and cancels current ramping. */
-int cras_ramp_reset(struct cras_ramp *ramp);
-
-/* Gets current ramp action. */
-struct cras_ramp_action
-cras_ramp_get_current_action(const struct cras_ramp *ramp);
-
-/* Updates number of samples that went through ramping. */
-int cras_ramp_update_ramped_frames(struct cras_ramp *ramp, int num_frames);
-
-#endif /* CRAS_RAMP_H_ */
diff --git a/cras/src/server/cras_rclient.c b/cras/src/server/cras_rclient.c
deleted file mode 100644
index d2646e7..0000000
--- a/cras/src/server/cras_rclient.c
+++ /dev/null
@@ -1,101 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <assert.h>
-#include <stdlib.h>
-#include <syslog.h>
-
-#include "audio_thread.h"
-#include "cras_apm_list.h"
-#include "cras_bt_log.h"
-#include "cras_capture_rclient.h"
-#include "cras_config.h"
-#include "cras_control_rclient.h"
-#include "cras_dsp.h"
-#include "cras_iodev.h"
-#include "cras_iodev_list.h"
-#include "cras_messages.h"
-#include "cras_observer.h"
-#include "cras_playback_rclient.h"
-#include "cras_rclient.h"
-#include "cras_rstream.h"
-#include "cras_server_metrics.h"
-#include "cras_system_state.h"
-#include "cras_types.h"
-#include "cras_unified_rclient.h"
-#include "cras_util.h"
-#include "stream_list.h"
-#include "utlist.h"
-
-/* Removes all streams that the client owns and destroys it. */
-void cras_rclient_destroy(struct cras_rclient *client)
-{
-	client->ops->destroy(client);
-}
-
-/* Entry point for handling a message from the client.  Called from the main
- * server context. */
-int cras_rclient_buffer_from_client(struct cras_rclient *client,
-				    const uint8_t *buf, size_t buf_len,
-				    int *fds, int num_fds)
-{
-	struct cras_server_message *msg = (struct cras_server_message *)buf;
-
-	if (buf_len < sizeof(*msg))
-		return -EINVAL;
-	if (msg->length != buf_len)
-		return -EINVAL;
-	return client->ops->handle_message_from_client(client, msg, fds,
-						       num_fds);
-}
-
-/* Sends a message to the client. */
-int cras_rclient_send_message(const struct cras_rclient *client,
-			      const struct cras_client_message *msg, int *fds,
-			      unsigned int num_fds)
-{
-	return client->ops->send_message_to_client(client, msg, fds, num_fds);
-}
-
-static void cras_rclient_set_client_type(struct cras_rclient *client,
-					 enum CRAS_CLIENT_TYPE client_type)
-{
-	client->client_type = client_type;
-}
-
-struct cras_rclient *cras_rclient_create(int fd, size_t id,
-					 enum CRAS_CONNECTION_TYPE conn_type)
-{
-	struct cras_rclient *client;
-	if (!cras_validate_connection_type(conn_type))
-		goto error;
-
-	switch (conn_type) {
-	case CRAS_CONTROL:
-		return cras_control_rclient_create(fd, id);
-	case CRAS_PLAYBACK:
-		return cras_playback_rclient_create(fd, id);
-	case CRAS_CAPTURE:
-		return cras_capture_rclient_create(fd, id);
-	case CRAS_VMS_LEGACY:
-		return cras_playback_rclient_create(fd, id);
-	case CRAS_VMS_UNIFIED:
-		return cras_unified_rclient_create(fd, id);
-	case CRAS_PLUGIN_PLAYBACK:
-		client = cras_playback_rclient_create(fd, id);
-		cras_rclient_set_client_type(client, CRAS_CLIENT_TYPE_PLUGIN);
-		return client;
-	case CRAS_PLUGIN_UNIFIED:
-		client = cras_unified_rclient_create(fd, id);
-		cras_rclient_set_client_type(client, CRAS_CLIENT_TYPE_PLUGIN);
-		return client;
-	default:
-		goto error;
-	}
-
-error:
-	syslog(LOG_ERR, "unsupported connection type");
-	return NULL;
-}
diff --git a/cras/src/server/cras_rclient.h b/cras/src/server/cras_rclient.h
deleted file mode 100644
index 3a3988c..0000000
--- a/cras/src/server/cras_rclient.h
+++ /dev/null
@@ -1,98 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-/*
- * A remote client to the server.
- */
-#ifndef CRAS_RCLIENT_H_
-#define CRAS_RCLIENT_H_
-
-#include "cras_types.h"
-
-struct cras_client_message;
-struct cras_message;
-struct cras_server_message;
-
-/* An attached client.
- *  id - The id of the client.
- *  fd - Connection for client communication.
- *  ops - cras_rclient_ops for the cras_rclient.
- *  supported_directions - Bit mask for supported stream directions.
- *  client_type - Client type of this rclient. If this is set to value other
- *                than CRAS_CLIENT_TYPE_UNKNOWN, rclient will overwrite incoming
- *                messages' client type.
- */
-struct cras_rclient {
-	struct cras_observer_client *observer;
-	size_t id;
-	int fd;
-	const struct cras_rclient_ops *ops;
-	int supported_directions;
-	enum CRAS_CLIENT_TYPE client_type;
-};
-
-/* Operations for cras_rclient.
- * handle_message_from_client - Entry point for handling a message from the
- * corresponded client.
- * send_message_to_client - Method for sending message to the corresponded
- * client.
- * destroy - Method to destroy and free the cras_rclient.
- */
-struct cras_rclient_ops {
-	int (*handle_message_from_client)(struct cras_rclient *,
-					  const struct cras_server_message *,
-					  int *fds, unsigned int num_fds);
-	int (*send_message_to_client)(const struct cras_rclient *,
-				      const struct cras_client_message *,
-				      int *fds, unsigned int num_fds);
-	void (*destroy)(struct cras_rclient *);
-};
-
-/* Creates an rclient structure.
- * Args:
- *    fd - The file descriptor used for communication with the client.
- *    id - Unique identifier for this client.
- *    conn_type - Client connection type.
- * Returns:
- *    A pointer to the newly created rclient on success, NULL on failure.
- */
-struct cras_rclient *cras_rclient_create(int fd, size_t id,
-					 enum CRAS_CONNECTION_TYPE conn_type);
-
-/* Destroys an rclient created with "cras_rclient_create".
- * Args:
- *    client - The client to destroy.
- */
-void cras_rclient_destroy(struct cras_rclient *client);
-
-/* Handles a received buffer from the client.
- * Args:
- *    client - The client that received this message.
- *    buf - The raw byte buffer the client sent. It should contain a valid
- *      cras_server_message.
- *    buf_len - The length of |buf|.
- *    fds - Array of valid file descriptors sent by the remote client.
- *    num_fds - Length of |fds|.
- * Returns:
- *    0 on success, otherwise a negative error code.
- */
-int cras_rclient_buffer_from_client(struct cras_rclient *client,
-				    const uint8_t *buf, size_t buf_len,
-				    int *fds, int num_fds);
-
-/* Sends a message to the client.
- * Args:
- *    client - The client to send the message to.
- *    msg - The message to send.
- *    fds - Array of file descriptors or null
- *    num_fds - Number of entries in the fds array.
- * Returns:
- *    number of bytes written on success, otherwise a negative error code.
- */
-int cras_rclient_send_message(const struct cras_rclient *client,
-			      const struct cras_client_message *msg, int *fds,
-			      unsigned int num_fds);
-
-#endif /* CRAS_RCLIENT_H_ */
diff --git a/cras/src/server/cras_rclient_util.c b/cras/src/server/cras_rclient_util.c
deleted file mode 100644
index 0af9886..0000000
--- a/cras/src/server/cras_rclient_util.c
+++ /dev/null
@@ -1,316 +0,0 @@
-/* Copyright 2019 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <syslog.h>
-
-#include "cras_iodev_list.h"
-#include "cras_messages.h"
-#include "cras_observer.h"
-#include "cras_rclient.h"
-#include "cras_rclient_util.h"
-#include "cras_rstream.h"
-#include "cras_server_metrics.h"
-#include "cras_system_state.h"
-#include "cras_tm.h"
-#include "cras_types.h"
-#include "cras_util.h"
-#include "stream_list.h"
-
-int rclient_send_message_to_client(const struct cras_rclient *client,
-				   const struct cras_client_message *msg,
-				   int *fds, unsigned int num_fds)
-{
-	return cras_send_with_fds(client->fd, (const void *)msg, msg->length,
-				  fds, num_fds);
-}
-
-void rclient_destroy(struct cras_rclient *client)
-{
-	cras_observer_remove(client->observer);
-	stream_list_rm_all_client_streams(cras_iodev_list_get_stream_list(),
-					  client);
-	free(client);
-}
-
-int rclient_validate_message_fds(const struct cras_server_message *msg,
-				 int *fds, unsigned int num_fds)
-{
-	switch (msg->id) {
-	case CRAS_SERVER_CONNECT_STREAM:
-		if (num_fds > 2)
-			goto error;
-		break;
-	case CRAS_SERVER_SET_AEC_DUMP:
-		if (num_fds > 1)
-			goto error;
-		break;
-	default:
-		if (num_fds > 0)
-			goto error;
-		break;
-	}
-
-	return 0;
-
-error:
-	syslog(LOG_ERR, "Message %d should not have %u fds attached.", msg->id,
-	       num_fds);
-	return -EINVAL;
-}
-
-static int
-rclient_validate_stream_connect_message(const struct cras_rclient *client,
-					const struct cras_connect_message *msg)
-{
-	if (!cras_valid_stream_id(msg->stream_id, client->id)) {
-		syslog(LOG_ERR,
-		       "stream_connect: invalid stream_id: %x for "
-		       "client: %zx.\n",
-		       msg->stream_id, client->id);
-		return -EINVAL;
-	}
-
-	int direction = cras_stream_direction_mask(msg->direction);
-	if (direction < 0 || !(client->supported_directions & direction)) {
-		syslog(LOG_ERR,
-		       "stream_connect: invalid stream direction: %x for "
-		       "client: %zx.\n",
-		       msg->direction, client->id);
-		return -EINVAL;
-	}
-
-	if (!cras_validate_client_type(msg->client_type)) {
-		syslog(LOG_ERR,
-		       "stream_connect: invalid stream client_type: %x for "
-		       "client: %zx.\n",
-		       msg->client_type, client->id);
-	}
-	return 0;
-}
-
-static int rclient_validate_stream_connect_fds(int audio_fd, int client_shm_fd,
-					       size_t client_shm_size)
-{
-	/* check audio_fd is valid. */
-	if (audio_fd < 0) {
-		syslog(LOG_ERR, "Invalid audio fd in stream connect.\n");
-		return -EBADF;
-	}
-
-	/* check client_shm_fd is valid if client wants to use client shm. */
-	if (client_shm_size > 0 && client_shm_fd < 0) {
-		syslog(LOG_ERR,
-		       "client_shm_fd must be valid if client_shm_size > 0.\n");
-		return -EBADF;
-	} else if (client_shm_size == 0 && client_shm_fd >= 0) {
-		syslog(LOG_ERR,
-		       "client_shm_fd can be valid only if client_shm_size > 0.\n");
-		return -EINVAL;
-	}
-	return 0;
-}
-
-int rclient_validate_stream_connect_params(
-	const struct cras_rclient *client,
-	const struct cras_connect_message *msg, int audio_fd, int client_shm_fd)
-{
-	int rc;
-
-	rc = rclient_validate_stream_connect_message(client, msg);
-	if (rc)
-		return rc;
-
-	rc = rclient_validate_stream_connect_fds(audio_fd, client_shm_fd,
-						 msg->client_shm_size);
-	if (rc)
-		return rc;
-
-	return 0;
-}
-
-int rclient_handle_client_stream_connect(struct cras_rclient *client,
-					 const struct cras_connect_message *msg,
-					 int aud_fd, int client_shm_fd)
-{
-	struct cras_rstream *stream;
-	struct cras_client_stream_connected stream_connected;
-	struct cras_client_message *reply;
-	struct cras_audio_format remote_fmt;
-	struct cras_rstream_config stream_config;
-	int rc, header_fd, samples_fd;
-	size_t samples_size;
-	int stream_fds[2];
-
-	rc = rclient_validate_stream_connect_params(client, msg, aud_fd,
-						    client_shm_fd);
-	remote_fmt = unpack_cras_audio_format(&msg->format);
-	if (rc == 0 && !cras_audio_format_valid(&remote_fmt)) {
-		rc = -EINVAL;
-	}
-	if (rc) {
-		if (client_shm_fd >= 0)
-			close(client_shm_fd);
-		if (aud_fd >= 0)
-			close(aud_fd);
-		goto reply_err;
-	}
-
-	/* When full, getting an error is preferable to blocking. */
-	cras_make_fd_nonblocking(aud_fd);
-
-	stream_config = cras_rstream_config_init_with_message(
-		client, msg, &aud_fd, &client_shm_fd, &remote_fmt);
-	/* Overwrite client_type if client->client_type is set. */
-	if (client->client_type != CRAS_CLIENT_TYPE_UNKNOWN)
-		stream_config.client_type = client->client_type;
-	rc = stream_list_add(cras_iodev_list_get_stream_list(), &stream_config,
-			     &stream);
-	if (rc)
-		goto cleanup_config;
-
-	detect_rtc_stream_pair(cras_iodev_list_get_stream_list(), stream);
-
-	/* Tell client about the stream setup. */
-	syslog(LOG_DEBUG, "Send connected for stream %x\n", msg->stream_id);
-
-	// Check that shm size is at most UINT32_MAX for non-shm streams.
-	samples_size = cras_rstream_get_samples_shm_size(stream);
-	if (samples_size > UINT32_MAX && stream_config.client_shm_fd < 0) {
-		syslog(LOG_ERR,
-		       "Non client-provided shm stream has samples shm larger "
-		       "than uint32_t: %zu",
-		       samples_size);
-		if (aud_fd >= 0)
-			close(aud_fd);
-		rc = -EINVAL;
-		goto cleanup_config;
-	}
-	cras_fill_client_stream_connected(&stream_connected, 0, /* No error. */
-					  msg->stream_id, &remote_fmt,
-					  samples_size,
-					  cras_rstream_get_effects(stream));
-	reply = &stream_connected.header;
-
-	rc = cras_rstream_get_shm_fds(stream, &header_fd, &samples_fd);
-	if (rc)
-		goto cleanup_config;
-
-	stream_fds[0] = header_fd;
-	/* If we're using client-provided shm, samples_fd here refers to the
-	 * same shm area as client_shm_fd */
-	stream_fds[1] = samples_fd;
-
-	rc = client->ops->send_message_to_client(client, reply, stream_fds, 2);
-	if (rc < 0) {
-		syslog(LOG_ERR, "Failed to send connected messaged\n");
-		stream_list_rm(cras_iodev_list_get_stream_list(),
-			       stream->stream_id);
-		goto cleanup_config;
-	}
-
-	/* Cleanup local object explicitly. */
-	cras_rstream_config_cleanup(&stream_config);
-	return 0;
-
-cleanup_config:
-	cras_rstream_config_cleanup(&stream_config);
-
-reply_err:
-	/* Send the error code to the client. */
-	cras_fill_client_stream_connected(&stream_connected, rc, msg->stream_id,
-					  &remote_fmt, 0, msg->effects);
-	reply = &stream_connected.header;
-	client->ops->send_message_to_client(client, reply, NULL, 0);
-
-	return rc;
-}
-
-/* Handles messages from the client requesting that a stream be removed from the
- * server. */
-int rclient_handle_client_stream_disconnect(
-	struct cras_rclient *client,
-	const struct cras_disconnect_stream_message *msg)
-{
-	if (!cras_valid_stream_id(msg->stream_id, client->id)) {
-		syslog(LOG_ERR,
-		       "stream_disconnect: invalid stream_id: %x for "
-		       "client: %zx.\n",
-		       msg->stream_id, client->id);
-		return -EINVAL;
-	}
-	return stream_list_rm(cras_iodev_list_get_stream_list(),
-			      msg->stream_id);
-}
-
-/* Creates a client structure and sends a message back informing the client that
- * the connection has succeeded. */
-struct cras_rclient *rclient_generic_create(int fd, size_t id,
-					    const struct cras_rclient_ops *ops,
-					    int supported_directions)
-{
-	struct cras_rclient *client;
-	struct cras_client_connected msg;
-	int state_fd;
-
-	client = (struct cras_rclient *)calloc(1, sizeof(struct cras_rclient));
-	if (!client)
-		return NULL;
-
-	client->fd = fd;
-	client->id = id;
-	client->ops = ops;
-	client->supported_directions = supported_directions;
-
-	cras_fill_client_connected(&msg, client->id);
-	state_fd = cras_sys_state_shm_fd();
-	client->ops->send_message_to_client(client, &msg.header, &state_fd, 1);
-
-	return client;
-}
-
-/* A generic entry point for handling a message from the client. Called from
- * the main server context. */
-int rclient_handle_message_from_client(struct cras_rclient *client,
-				       const struct cras_server_message *msg,
-				       int *fds, unsigned int num_fds)
-{
-	int rc = 0;
-	assert(client && msg);
-
-	rc = rclient_validate_message_fds(msg, fds, num_fds);
-	if (rc < 0) {
-		for (int i = 0; i < (int)num_fds; i++)
-			if (fds[i] >= 0)
-				close(fds[i]);
-		return rc;
-	}
-	int fd = num_fds > 0 ? fds[0] : -1;
-
-	switch (msg->id) {
-	case CRAS_SERVER_CONNECT_STREAM: {
-		int client_shm_fd = num_fds > 1 ? fds[1] : -1;
-		if (MSG_LEN_VALID(msg, struct cras_connect_message)) {
-			rclient_handle_client_stream_connect(
-				client,
-				(const struct cras_connect_message *)msg, fd,
-				client_shm_fd);
-		} else {
-			return -EINVAL;
-		}
-		break;
-	}
-	case CRAS_SERVER_DISCONNECT_STREAM:
-		if (!MSG_LEN_VALID(msg, struct cras_disconnect_stream_message))
-			return -EINVAL;
-		rclient_handle_client_stream_disconnect(
-			client,
-			(const struct cras_disconnect_stream_message *)msg);
-		break;
-	default:
-		break;
-	}
-
-	return rc;
-}
diff --git a/cras/src/server/cras_rclient_util.h b/cras/src/server/cras_rclient_util.h
deleted file mode 100644
index 089c2ec..0000000
--- a/cras/src/server/cras_rclient_util.h
+++ /dev/null
@@ -1,125 +0,0 @@
-/* Copyright 2019 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-/*
- * Common utility functions for rclients.
- */
-#ifndef CRAS_RCLIENT_UTIL_H_
-#define CRAS_RCLIENT_UTIL_H_
-
-#define MSG_LEN_VALID(msg, type) ((msg)->length >= sizeof(type))
-
-struct cras_connect_message;
-struct cras_rclient;
-struct cras_rclient_message;
-struct cras_rstream_config;
-struct cras_server_message;
-
-/* Sends a message to the client. */
-int rclient_send_message_to_client(const struct cras_rclient *client,
-				   const struct cras_client_message *msg,
-				   int *fds, unsigned int num_fds);
-
-/* Removes all streams that the client owns and destroys it. */
-void rclient_destroy(struct cras_rclient *client);
-
-/* Checks if the number of incoming fds matches the needs of the message from
- * client.
- *
- * Args:
- *   msg - The cras_server_message from client.
- *   fds - The array for incoming fds from client.
- *   num_fds - The number of fds from client.
- *
- * Returns:
- *   0 on success. Or negative value if the number of fds is invalid.
- */
-int rclient_validate_message_fds(const struct cras_server_message *msg,
-				 int *fds, unsigned int num_fds);
-
-/* Checks if the incoming stream connect message contains
- * - stream_id matches client->id.
- * - direction supported by the client.
- *
- * Args:
- *   client - The cras_rclient which gets the message.
- *   msg - cras_connect_message from client.
- *   audio_fd - Audio fd from client.
- *   client_shm_fd - client shared memory fd from client. It can be -1.
- *
- * Returns:
- *   0 on success, negative error on failure.
- */
-int rclient_validate_stream_connect_params(
-	const struct cras_rclient *client,
-	const struct cras_connect_message *msg, int audio_fd,
-	int client_shm_fd);
-
-/* Handles a message from the client to connect a new stream
- *
- * Args:
- *   client - The cras_rclient which gets the message.
- *   msg - The cras_connect_message from client.
- *   aud_fd - The audio fd comes from client. Its ownership will be taken.
- *   client_shm_fd - The client_shm_fd from client. Its ownership will be taken.
- *
- * Returns:
- *   0 on success, negative error on failure.
- */
-int rclient_handle_client_stream_connect(struct cras_rclient *client,
-					 const struct cras_connect_message *msg,
-					 int aud_fd, int client_shm_fd);
-
-/* Handles messages from the client requesting that a stream be removed from the
- * server.
- *
- * Args:
- *   client - The cras_rclient which gets the message.
- *   msg - The cras_disconnect_stream_message from client.
- *
- * Returns:
- *   0 on success, negative error on failure.
- */
-int rclient_handle_client_stream_disconnect(
-	struct cras_rclient *client,
-	const struct cras_disconnect_stream_message *msg);
-
-/* Generic rclient create function for different types of rclients.
- * Creates a client structure and sends a message back informing the client
- * that the connection has succeeded.
- *
- * Args:
- *    fd - The file descriptor used for communication with the client.
- *    id - Unique identifier for this client.
- *    ops - cras_rclient_ops pointer for the client.
- *    supported_directions - supported directions for the this rclient.
- * Returns:
- *    A pointer to the newly created rclient on success, NULL on failure.
- */
-struct cras_rclient *rclient_generic_create(int fd, size_t id,
-					    const struct cras_rclient_ops *ops,
-					    int supported_directions);
-
-/* Generic handle_message_from_client function for different types of rlicnets.
- * Supports only stream connect and stream disconnect messages.
- *
- * If the message from clients has incorrect length (truncated message), return
- * an error up to CRAS server.
- * If the message from clients has invalid content, should return the errors to
- * clients by send_message_to_client and return 0 here.
- *
- * Args:
- *   client - The cras_rclient which gets the message.
- *   msg - The cras_server_message from client.
- *   fds - The array for incoming fds from client.
- *   num_fds - The number of fds from client.
- * Returns:
- *   0 on success, negative error on failure.
- */
-int rclient_handle_message_from_client(struct cras_rclient *client,
-				       const struct cras_server_message *msg,
-				       int *fds, unsigned int num_fds);
-
-#endif /* CRAS_RCLIENT_UTIL_H_ */
diff --git a/cras/src/server/cras_rstream.c b/cras/src/server/cras_rstream.c
deleted file mode 100644
index 3c0a0ce..0000000
--- a/cras/src/server/cras_rstream.c
+++ /dev/null
@@ -1,560 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <fcntl.h>
-#include <stdint.h>
-#include <sys/mman.h>
-#include <sys/types.h>
-#include <syslog.h>
-
-#include "cras_audio_area.h"
-#include "cras_config.h"
-#include "cras_messages.h"
-#include "cras_rclient.h"
-#include "cras_rstream.h"
-#include "cras_server_metrics.h"
-#include "cras_shm.h"
-#include "cras_types.h"
-#include "cras_system_state.h"
-
-static bool cras_rstream_config_is_client_shm_stream(
-	const struct cras_rstream_config *config)
-{
-	return config && config->client_shm_fd >= 0 &&
-	       config->client_shm_size > 0;
-}
-
-/* Setup the shared memory area used for audio samples. config->client_shm_fd
- * must be closed after calling this function.
- */
-static inline int setup_shm_area(struct cras_rstream *stream,
-				 struct cras_rstream_config *config)
-{
-	const struct cras_audio_format *fmt = &stream->format;
-	char header_name[NAME_MAX];
-	char samples_name[NAME_MAX];
-	struct cras_shm_info header_info, samples_info;
-	uint32_t frame_bytes, used_size;
-	int rc;
-	bool client_shm_stream =
-		cras_rstream_config_is_client_shm_stream(config);
-
-	if (stream->shm) {
-		/* already setup */
-		return -EEXIST;
-	}
-
-	snprintf(header_name, sizeof(header_name),
-		 "/cras-%d-stream-%08x-header", getpid(), stream->stream_id);
-
-	rc = cras_shm_info_init(header_name, cras_shm_header_size(),
-				&header_info);
-	if (rc)
-		return rc;
-
-	frame_bytes = snd_pcm_format_physical_width(fmt->format) / 8 *
-		      fmt->num_channels;
-	used_size = stream->buffer_frames * frame_bytes;
-
-	if (client_shm_stream) {
-		rc = cras_shm_info_init_with_fd(config->client_shm_fd,
-						config->client_shm_size,
-						&samples_info);
-	} else {
-		snprintf(samples_name, sizeof(samples_name),
-			 "/cras-%d-stream-%08x-samples", getpid(),
-			 stream->stream_id);
-		rc = cras_shm_info_init(
-			samples_name,
-			cras_shm_calculate_samples_size(used_size),
-			&samples_info);
-	}
-	if (rc) {
-		cras_shm_info_cleanup(&header_info);
-		return rc;
-	}
-
-	int samples_prot = 0;
-	if (stream->direction == CRAS_STREAM_OUTPUT)
-		samples_prot = PROT_READ;
-	else
-		samples_prot = PROT_WRITE;
-
-	rc = cras_audio_shm_create(&header_info, &samples_info, samples_prot,
-				   &stream->shm);
-	if (rc)
-		return rc;
-
-	cras_shm_set_frame_bytes(stream->shm, frame_bytes);
-	cras_shm_set_used_size(stream->shm, used_size);
-	if (client_shm_stream) {
-		for (int i = 0; i < 2; i++)
-			cras_shm_set_buffer_offset(stream->shm, i,
-						   config->buffer_offsets[i]);
-	}
-
-	stream->audio_area =
-		cras_audio_area_create(stream->format.num_channels);
-	cras_audio_area_config_channels(stream->audio_area, &stream->format);
-
-	return 0;
-}
-
-static inline int buffer_meets_size_limit(size_t buffer_size, size_t rate)
-{
-	return (buffer_size < (CRAS_MAX_BUFFER_TIME_IN_S * rate)) &&
-	       (buffer_size > (CRAS_MIN_BUFFER_TIME_IN_US * rate) / 1000000);
-}
-
-/* Verifies that the given stream parameters are valid. */
-static int verify_rstream_parameters(const struct cras_rstream_config *config,
-				     struct cras_rstream *const *stream_out)
-{
-	const struct cras_audio_format *format = config->format;
-
-	if (stream_out == NULL) {
-		syslog(LOG_ERR, "rstream: stream_out can't be NULL\n");
-		return -EINVAL;
-	}
-	if (format == NULL) {
-		syslog(LOG_ERR, "rstream: format can't be NULL\n");
-		return -EINVAL;
-	}
-	if (format->frame_rate < 4000 || format->frame_rate > 192000) {
-		syslog(LOG_ERR, "rstream: invalid frame_rate %zu\n",
-		       format->frame_rate);
-		return -EINVAL;
-	}
-	/*
-	 * Valid buffer settings:
-	 *   Frames in 1ms <= cb_threshold <= buffer_frames <= Frames in 10s.
-	 */
-	if (!buffer_meets_size_limit(config->buffer_frames,
-				     format->frame_rate)) {
-		syslog(LOG_ERR, "rstream: invalid buffer_frames %zu\n",
-		       config->buffer_frames);
-		return -EINVAL;
-	}
-	if (!buffer_meets_size_limit(config->cb_threshold,
-				     format->frame_rate) ||
-	    config->cb_threshold > config->buffer_frames) {
-		syslog(LOG_ERR, "rstream: invalid cb_threshold %zu\n",
-		       config->cb_threshold);
-		return -EINVAL;
-	}
-	if (format->num_channels < 0 || format->num_channels > CRAS_CH_MAX) {
-		syslog(LOG_ERR, "rstream: invalid num_channels %zu\n",
-		       format->num_channels);
-		return -EINVAL;
-	}
-	if ((format->format != SND_PCM_FORMAT_S16_LE) &&
-	    (format->format != SND_PCM_FORMAT_S32_LE) &&
-	    (format->format != SND_PCM_FORMAT_U8) &&
-	    (format->format != SND_PCM_FORMAT_S24_LE)) {
-		syslog(LOG_ERR, "rstream: format %d not supported\n",
-		       format->format);
-		return -EINVAL;
-	}
-	if (config->direction != CRAS_STREAM_OUTPUT &&
-	    config->direction != CRAS_STREAM_INPUT) {
-		syslog(LOG_ERR, "rstream: Invalid direction.\n");
-		return -EINVAL;
-	}
-	if (config->stream_type < CRAS_STREAM_TYPE_DEFAULT ||
-	    config->stream_type >= CRAS_STREAM_NUM_TYPES) {
-		syslog(LOG_ERR, "rstream: Invalid stream type.\n");
-		return -EINVAL;
-	}
-	if (config->client_type < CRAS_CLIENT_TYPE_UNKNOWN ||
-	    config->client_type >= CRAS_NUM_CLIENT_TYPE) {
-		syslog(LOG_ERR, "rstream: Invalid client type.\n");
-		return -EINVAL;
-	}
-	if ((config->client_shm_size > 0 && config->client_shm_fd < 0) ||
-	    (config->client_shm_size == 0 && config->client_shm_fd >= 0)) {
-		syslog(LOG_ERR, "rstream: invalid client-provided shm info\n");
-		return -EINVAL;
-	}
-	if (cras_rstream_config_is_client_shm_stream(config) &&
-	    (config->buffer_offsets[0] > config->client_shm_size ||
-	     config->buffer_offsets[1] > config->client_shm_size)) {
-		syslog(LOG_ERR,
-		       "rstream: initial buffer offsets are outside shm area\n");
-		return -EINVAL;
-	}
-
-	return 0;
-}
-
-/*
- * Setting pending reply is only needed inside this module.
- */
-static void set_pending_reply(struct cras_rstream *stream)
-{
-	cras_shm_set_callback_pending(stream->shm, 1);
-}
-
-/*
- * Clearing pending reply is only needed inside this module.
- */
-static void clear_pending_reply(struct cras_rstream *stream)
-{
-	cras_shm_set_callback_pending(stream->shm, 0);
-}
-
-/*
- * Reads one response of audio request from client.
- * Args:
- *   stream[in]: A pointer to cras_rstream.
- *   msg[out]: A pointer to audio_message to hold the message.
- * Returns:
- *   Number of bytes read from the socket.
- *   A negative error code if read fails or the message from client
- *   has errors.
- */
-static int get_audio_request_reply(const struct cras_rstream *stream,
-				   struct audio_message *msg)
-{
-	int rc;
-
-	rc = read(stream->fd, msg, sizeof(*msg));
-	if (rc < 0)
-		return -errno;
-	if (rc == 0)
-		return rc;
-	if (msg->error < 0)
-		return msg->error;
-	return rc;
-}
-
-/*
- * Reads and handles one audio message from client.
- * Returns:
- *   Number of bytes read from the socket.
- *   A negative error code if read fails or the message from client
- *   has errors.
- */
-static int read_and_handle_client_message(struct cras_rstream *stream)
-{
-	struct audio_message msg;
-	int rc;
-
-	rc = get_audio_request_reply(stream, &msg);
-	if (rc <= 0) {
-		clear_pending_reply(stream);
-		return rc;
-	}
-
-	/*
-	 * Got client reply that data in the input stream is captured.
-	 */
-	if (stream->direction == CRAS_STREAM_INPUT &&
-	    msg.id == AUDIO_MESSAGE_DATA_CAPTURED) {
-		clear_pending_reply(stream);
-	}
-
-	/*
-	 * Got client reply that data for output stream is ready in shm.
-	 */
-	if (stream->direction == CRAS_STREAM_OUTPUT &&
-	    msg.id == AUDIO_MESSAGE_DATA_READY) {
-		clear_pending_reply(stream);
-	}
-
-	return rc;
-}
-
-/* Exported functions */
-
-int cras_rstream_create(struct cras_rstream_config *config,
-			struct cras_rstream **stream_out)
-{
-	struct cras_rstream *stream;
-	int rc;
-
-	rc = verify_rstream_parameters(config, stream_out);
-	if (rc < 0)
-		return rc;
-
-	stream = calloc(1, sizeof(*stream));
-	if (stream == NULL)
-		return -ENOMEM;
-
-	stream->stream_id = config->stream_id;
-	stream->stream_type = config->stream_type;
-	stream->client_type = config->client_type;
-	stream->direction = config->direction;
-	stream->flags = config->flags;
-	stream->format = *config->format;
-	stream->buffer_frames = config->buffer_frames;
-	stream->cb_threshold = config->cb_threshold;
-	stream->client = config->client;
-	stream->shm = NULL;
-	stream->main_dev.dev_id = NO_DEVICE;
-	stream->main_dev.dev_ptr = NULL;
-	stream->num_missed_cb = 0;
-	stream->is_pinned = (config->dev_idx != NO_DEVICE);
-	stream->pinned_dev_idx = config->dev_idx;
-	ewma_power_init(&stream->ewma, stream->format.frame_rate);
-
-	rc = setup_shm_area(stream, config);
-	if (rc < 0) {
-		syslog(LOG_ERR, "failed to setup shm %d\n", rc);
-		free(stream);
-		return rc;
-	}
-
-	stream->fd = config->audio_fd;
-	config->audio_fd = -1;
-	stream->buf_state = buffer_share_create(stream->buffer_frames);
-	stream->apm_list =
-		(stream->direction == CRAS_STREAM_INPUT) ?
-			cras_apm_list_create(stream, config->effects) :
-			NULL;
-
-	syslog(LOG_DEBUG, "stream %x frames %zu, cb_thresh %zu",
-	       config->stream_id, config->buffer_frames, config->cb_threshold);
-	*stream_out = stream;
-
-	cras_system_state_stream_added(stream->direction, stream->client_type);
-
-	clock_gettime(CLOCK_MONOTONIC_RAW, &stream->start_ts);
-
-	cras_server_metrics_stream_create(config);
-
-	return 0;
-}
-
-void cras_rstream_destroy(struct cras_rstream *stream)
-{
-	cras_server_metrics_stream_destroy(stream);
-	cras_system_state_stream_removed(stream->direction,
-					 stream->client_type);
-	close(stream->fd);
-	cras_audio_shm_destroy(stream->shm);
-	cras_audio_area_destroy(stream->audio_area);
-	buffer_share_destroy(stream->buf_state);
-	if (stream->apm_list)
-		cras_apm_list_destroy(stream->apm_list);
-	free(stream);
-}
-
-unsigned int cras_rstream_get_effects(const struct cras_rstream *stream)
-{
-	return stream->apm_list ? cras_apm_list_get_effects(stream->apm_list) :
-				  0;
-}
-
-struct cras_audio_format *
-cras_rstream_post_processing_format(const struct cras_rstream *stream,
-				    void *dev_ptr)
-{
-	struct cras_apm *apm;
-
-	apm = cras_apm_list_get_active_apm((void *)stream, dev_ptr);
-	if (NULL == apm)
-		return NULL;
-	return cras_apm_list_get_format(apm);
-}
-
-void cras_rstream_record_fetch_interval(struct cras_rstream *rstream,
-					const struct timespec *now)
-{
-	struct timespec ts;
-
-	if (rstream->last_fetch_ts.tv_sec || rstream->last_fetch_ts.tv_nsec) {
-		subtract_timespecs(now, &rstream->last_fetch_ts, &ts);
-		if (timespec_after(&ts, &rstream->longest_fetch_interval))
-			rstream->longest_fetch_interval = ts;
-	}
-}
-
-static void init_audio_message(struct audio_message *msg,
-			       enum CRAS_AUDIO_MESSAGE_ID id, uint32_t frames)
-{
-	memset(msg, 0, sizeof(*msg));
-	msg->id = id;
-	msg->frames = frames;
-}
-
-int cras_rstream_request_audio(struct cras_rstream *stream,
-			       const struct timespec *now)
-{
-	struct audio_message msg;
-	int rc;
-
-	/* Only request samples from output streams. */
-	if (stream->direction != CRAS_STREAM_OUTPUT)
-		return 0;
-
-	stream->last_fetch_ts = *now;
-
-	init_audio_message(&msg, AUDIO_MESSAGE_REQUEST_DATA,
-			   stream->cb_threshold);
-	rc = write(stream->fd, &msg, sizeof(msg));
-	if (rc < 0)
-		return -errno;
-
-	set_pending_reply(stream);
-
-	return rc;
-}
-
-int cras_rstream_audio_ready(struct cras_rstream *stream, size_t count)
-{
-	struct audio_message msg;
-	int rc;
-
-	cras_shm_buffer_write_complete(stream->shm);
-
-	/* Mark shm as used. */
-	if (stream_is_server_only(stream)) {
-		cras_shm_buffer_read_current(stream->shm, count);
-		return 0;
-	}
-
-	init_audio_message(&msg, AUDIO_MESSAGE_DATA_READY, count);
-	rc = write(stream->fd, &msg, sizeof(msg));
-	if (rc < 0)
-		return -errno;
-
-	set_pending_reply(stream);
-
-	return rc;
-}
-
-void cras_rstream_dev_attach(struct cras_rstream *rstream, unsigned int dev_id,
-			     void *dev_ptr)
-{
-	if (buffer_share_add_id(rstream->buf_state, dev_id, dev_ptr) == 0)
-		rstream->num_attached_devs++;
-
-	/* TODO(hychao): Handle main device assignment for complicated
-	 * routing case.
-	 */
-	if (rstream->main_dev.dev_id == NO_DEVICE) {
-		rstream->main_dev.dev_id = dev_id;
-		rstream->main_dev.dev_ptr = dev_ptr;
-	}
-}
-
-void cras_rstream_dev_detach(struct cras_rstream *rstream, unsigned int dev_id)
-{
-	if (buffer_share_rm_id(rstream->buf_state, dev_id) == 0)
-		rstream->num_attached_devs--;
-
-	if (rstream->main_dev.dev_id == dev_id) {
-		int i;
-		struct id_offset *o;
-
-		/* Choose the first device id as a main device. */
-		rstream->main_dev.dev_id = NO_DEVICE;
-		rstream->main_dev.dev_ptr = NULL;
-		for (i = 0; i < rstream->buf_state->id_sz; i++) {
-			o = &rstream->buf_state->wr_idx[i];
-			if (o->used) {
-				rstream->main_dev.dev_id = o->id;
-				rstream->main_dev.dev_ptr = o->data;
-				break;
-			}
-		}
-	}
-}
-
-void cras_rstream_dev_offset_update(struct cras_rstream *rstream,
-				    unsigned int frames, unsigned int dev_id)
-{
-	buffer_share_offset_update(rstream->buf_state, dev_id, frames);
-}
-
-void cras_rstream_update_input_write_pointer(struct cras_rstream *rstream)
-{
-	unsigned int nwritten =
-		buffer_share_get_new_write_point(rstream->buf_state);
-
-	cras_shm_buffer_written(rstream->shm, nwritten);
-}
-
-void cras_rstream_update_output_read_pointer(struct cras_rstream *rstream)
-{
-	size_t nfr = 0;
-	uint8_t *src;
-	unsigned int nwritten =
-		buffer_share_get_new_write_point(rstream->buf_state);
-
-	/* Retrieve the read pointer |src| start from which to calculate
-	 * the EWMA power. */
-	src = cras_shm_get_readable_frames(rstream->shm, 0, &nfr);
-	ewma_power_calculate(&rstream->ewma, (int16_t *)src,
-			     rstream->format.num_channels, nwritten);
-	cras_shm_buffer_read(rstream->shm, nwritten);
-}
-
-unsigned int cras_rstream_dev_offset(const struct cras_rstream *rstream,
-				     unsigned int dev_id)
-{
-	return buffer_share_id_offset(rstream->buf_state, dev_id);
-}
-
-void cras_rstream_update_queued_frames(struct cras_rstream *rstream)
-{
-	rstream->queued_frames =
-		MIN(cras_shm_get_frames(rstream->shm), rstream->buffer_frames);
-}
-
-unsigned int cras_rstream_playable_frames(struct cras_rstream *rstream,
-					  unsigned int dev_id)
-{
-	return rstream->queued_frames -
-	       cras_rstream_dev_offset(rstream, dev_id);
-}
-
-float cras_rstream_get_volume_scaler(struct cras_rstream *rstream)
-{
-	return cras_shm_get_volume_scaler(rstream->shm);
-}
-
-uint8_t *cras_rstream_get_readable_frames(struct cras_rstream *rstream,
-					  unsigned int offset, size_t *frames)
-{
-	return cras_shm_get_readable_frames(rstream->shm, offset, frames);
-}
-
-int cras_rstream_get_mute(const struct cras_rstream *rstream)
-{
-	return cras_shm_get_mute(rstream->shm);
-}
-
-int cras_rstream_is_pending_reply(const struct cras_rstream *stream)
-{
-	return cras_shm_callback_pending(stream->shm);
-}
-
-int cras_rstream_flush_old_audio_messages(struct cras_rstream *stream)
-{
-	struct pollfd pollfd;
-	int err;
-
-	if (!stream->fd)
-		return 0;
-
-	if (stream_is_server_only(stream))
-		return 0;
-
-	pollfd.fd = stream->fd;
-	pollfd.events = POLLIN;
-
-	do {
-		err = poll(&pollfd, 1, 0);
-		if (pollfd.revents & POLLIN) {
-			err = read_and_handle_client_message(stream);
-		}
-	} while (err > 0);
-
-	if (err < 0)
-		syslog(LOG_ERR, "Error reading msg from client: rc: %d", err);
-
-	return 0;
-}
diff --git a/cras/src/server/cras_rstream.h b/cras/src/server/cras_rstream.h
deleted file mode 100644
index d57c13b..0000000
--- a/cras/src/server/cras_rstream.h
+++ /dev/null
@@ -1,325 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-/*
- * Remote Stream - An audio steam from/to a client.
- */
-#ifndef CRAS_RSTREAM_H_
-#define CRAS_RSTREAM_H_
-
-#include "buffer_share.h"
-#include "cras_apm_list.h"
-#include "cras_shm.h"
-#include "cras_types.h"
-#include "cras_rstream_config.h"
-#include "ewma_power.h"
-
-struct cras_connect_message;
-struct cras_rclient;
-struct dev_mix;
-
-/* Holds informations about the main active device.
- * Members:
- *    dev_id - id of the main device.
- *    dev_ptr - pointer to the main device.
- */
-struct main_dev_info {
-	int dev_id;
-	void *dev_ptr;
-};
-
-/* cras_rstream is used to manage an active audio stream from
- * a client.  Each client can have any number of open streams for
- * playing or recording.
- * Members:
- *    stream_id - identifier for this stream.
- *    stream_type - not used.
- *    client_type - The client type of this stream, like Chrome, ARC++.
- *    direction - input or output.
- *    flags - Indicative of what special handling is needed.
- *    fd - Socket for requesting and sending audio buffer events.
- *    buffer_frames - Buffer size in frames.
- *    cb_threshold - Callback client when this much is left.
- *    main_dev_info - The info of the main device this stream attaches to.
- *    is_draining - The stream is draining and waiting to be removed.
- *    client - The client who uses this stream.
- *    shm - shared memory
- *    audio_area - space for playback/capture audio
- *    format - format of the stream
- *    next_cb_ts - Next callback time for this stream.
- *    sleep_interval_ts - Time between audio callbacks.
- *    last_fetch_ts - The time of the last stream fetch.
- *    longest_fetch_interval_ts - Longest interval between two fetches.
- *    start_ts - The time when the stream started.
- *    first_missed_cb_ts - The time when the first missed callback happens.
- *    buf_state - State of the buffer from all devices for this stream.
- *    apm_list - List of audio processing module instances.
- *    ewma - The ewma instance to calculate stream volume.
- *    num_attached_devs - Number of iodevs this stream has attached to.
- *    num_missed_cb - Number of callback schedules have been missed.
- *    queued_frames - Cached value of the number of queued frames in shm.
- *    is_pinned - True if the stream is a pinned stream, false otherwise.
- *    pinned_dev_idx - device the stream is pinned, 0 if none.
- *    triggered - True if already notified TRIGGER_ONLY stream, false otherwise.
- */
-struct cras_rstream {
-	cras_stream_id_t stream_id;
-	enum CRAS_STREAM_TYPE stream_type;
-	enum CRAS_CLIENT_TYPE client_type;
-	enum CRAS_STREAM_DIRECTION direction;
-	uint32_t flags;
-	int fd;
-	size_t buffer_frames;
-	size_t cb_threshold;
-	int is_draining;
-	struct main_dev_info main_dev;
-	struct cras_rclient *client;
-	struct cras_audio_shm *shm;
-	struct cras_audio_area *audio_area;
-	struct cras_audio_format format;
-	struct timespec next_cb_ts;
-	struct timespec sleep_interval_ts;
-	struct timespec last_fetch_ts;
-	struct timespec longest_fetch_interval;
-	struct timespec start_ts;
-	struct timespec first_missed_cb_ts;
-	struct buffer_share *buf_state;
-	struct cras_apm_list *apm_list;
-	struct ewma_power ewma;
-	int num_attached_devs;
-	int num_missed_cb;
-	int queued_frames;
-	int is_pinned;
-	uint32_t pinned_dev_idx;
-	int triggered;
-	struct cras_rstream *prev, *next;
-};
-
-/* Creates an rstream.
- * Args:
- *    config - Params for configuration of the new rstream. It's a mutable
- *             borrow.
- *    stream_out - Filled with the newly created stream pointer.
- * Returns:
- *    0 on success, EINVAL if an invalid argument is passed, or ENOMEM if out of
- *    memory.
- */
-int cras_rstream_create(struct cras_rstream_config *config,
-			struct cras_rstream **stream_out);
-
-/* Destroys an rstream. */
-void cras_rstream_destroy(struct cras_rstream *stream);
-
-/* Gets the id of the stream */
-static inline cras_stream_id_t
-cras_rstream_id(const struct cras_rstream *stream)
-{
-	return stream->stream_id;
-}
-
-/* Gets the total buffer size in frames for the given client stream. */
-static inline size_t
-cras_rstream_get_buffer_frames(const struct cras_rstream *stream)
-{
-	return stream->buffer_frames;
-}
-
-/* Gets the callback threshold in frames for the given client stream. */
-static inline size_t
-cras_rstream_get_cb_threshold(const struct cras_rstream *stream)
-{
-	return stream->cb_threshold;
-}
-
-/* Gets the max write size for the stream. */
-static inline size_t
-cras_rstream_get_max_write_frames(const struct cras_rstream *stream)
-{
-	if (stream->flags & BULK_AUDIO_OK)
-		return cras_rstream_get_buffer_frames(stream);
-	return cras_rstream_get_cb_threshold(stream);
-}
-
-/* Gets the stream type of this stream. */
-static inline enum CRAS_STREAM_TYPE
-cras_rstream_get_type(const struct cras_rstream *stream)
-{
-	return stream->stream_type;
-}
-
-/* Gets the direction (input/output/loopback) of the stream. */
-static inline enum CRAS_STREAM_DIRECTION
-cras_rstream_get_direction(const struct cras_rstream *stream)
-{
-	return stream->direction;
-}
-
-/* Gets the format for the stream. */
-static inline void cras_rstream_set_format(struct cras_rstream *stream,
-					   const struct cras_audio_format *fmt)
-{
-	stream->format = *fmt;
-}
-
-/* Sets the format for the stream. */
-static inline int cras_rstream_get_format(const struct cras_rstream *stream,
-					  struct cras_audio_format *fmt)
-{
-	*fmt = stream->format;
-	return 0;
-}
-
-/* Gets the fd to be used to poll this client for audio. */
-static inline int cras_rstream_get_audio_fd(const struct cras_rstream *stream)
-{
-	return stream->fd;
-}
-
-/* Gets the is_draning flag. */
-static inline int
-cras_rstream_get_is_draining(const struct cras_rstream *stream)
-{
-	return stream->is_draining;
-}
-
-/* Sets the is_draning flag. */
-static inline void cras_rstream_set_is_draining(struct cras_rstream *stream,
-						int is_draining)
-{
-	stream->is_draining = is_draining;
-}
-
-/* Gets the shm fds used for the stream shm */
-static inline int cras_rstream_get_shm_fds(const struct cras_rstream *stream,
-					   int *header_fd, int *samples_fd)
-{
-	if (!header_fd || !samples_fd)
-		return -EINVAL;
-
-	*header_fd = stream->shm->header_info.fd;
-	*samples_fd = stream->shm->samples_info.fd;
-
-	return 0;
-}
-
-/* Gets the size of the shm area used for samples for this stream. */
-static inline size_t
-cras_rstream_get_samples_shm_size(const struct cras_rstream *stream)
-{
-	return cras_shm_samples_size(stream->shm);
-}
-
-/* Gets shared memory region for this stream. */
-static inline struct cras_audio_shm *
-cras_rstream_shm(struct cras_rstream *stream)
-{
-	return stream->shm;
-}
-
-/* Checks if the stream uses an output device. */
-static inline int stream_uses_output(const struct cras_rstream *s)
-{
-	return cras_stream_uses_output_hw(s->direction);
-}
-
-/* Checks if the stream uses an input device. */
-static inline int stream_uses_input(const struct cras_rstream *s)
-{
-	return cras_stream_uses_input_hw(s->direction);
-}
-
-static inline int stream_is_server_only(const struct cras_rstream *s)
-{
-	return s->flags & SERVER_ONLY;
-}
-
-/* Gets the enabled effects of this stream. */
-unsigned int cras_rstream_get_effects(const struct cras_rstream *stream);
-
-/* Gets the format of data after stream specific processing. */
-struct cras_audio_format *
-cras_rstream_post_processing_format(const struct cras_rstream *stream,
-				    void *dev_ptr);
-
-/* Checks how much time has passed since last stream fetch and records
- * the longest fetch interval. */
-void cras_rstream_record_fetch_interval(struct cras_rstream *rstream,
-					const struct timespec *now);
-
-/* Requests min_req frames from the client. */
-int cras_rstream_request_audio(struct cras_rstream *stream,
-			       const struct timespec *now);
-
-/* Tells a capture client that count frames are ready. */
-int cras_rstream_audio_ready(struct cras_rstream *stream, size_t count);
-
-/* Let the rstream know when a device is added or removed. */
-void cras_rstream_dev_attach(struct cras_rstream *rstream, unsigned int dev_id,
-			     void *dev_ptr);
-void cras_rstream_dev_detach(struct cras_rstream *rstream, unsigned int dev_id);
-
-static inline void *cras_rstream_dev_ptr(struct cras_rstream *rstream,
-					 unsigned int dev_id)
-{
-	return buffer_share_get_data(rstream->buf_state, dev_id);
-}
-
-/* A device using this stream has read or written samples. */
-void cras_rstream_dev_offset_update(struct cras_rstream *rstream,
-				    unsigned int frames, unsigned int dev_id);
-
-void cras_rstream_update_input_write_pointer(struct cras_rstream *rstream);
-void cras_rstream_update_output_read_pointer(struct cras_rstream *rstream);
-
-unsigned int cras_rstream_dev_offset(const struct cras_rstream *rstream,
-				     unsigned int dev_id);
-
-static inline unsigned int cras_rstream_level(struct cras_rstream *rstream)
-{
-	const struct cras_audio_shm *shm = cras_rstream_shm(rstream);
-	return cras_shm_frames_written(shm);
-}
-
-static inline int cras_rstream_input_level_met(struct cras_rstream *rstream)
-{
-	const struct cras_audio_shm *shm = cras_rstream_shm(rstream);
-	return cras_shm_frames_written(shm) >= rstream->cb_threshold;
-}
-
-/* Updates the number of queued frames in shm. The queued frames should be
- * updated everytime before calling cras_rstream_playable_frames.
- */
-void cras_rstream_update_queued_frames(struct cras_rstream *rstream);
-
-/* Returns the number of playable samples in shm for the given device id. */
-unsigned int cras_rstream_playable_frames(struct cras_rstream *rstream,
-					  unsigned int dev_id);
-
-/* Returns the volume scaler for this stream. */
-float cras_rstream_get_volume_scaler(struct cras_rstream *rstream);
-
-/* Returns a pointer to readable frames, fills frames with the number of frames
- * available. */
-uint8_t *cras_rstream_get_readable_frames(struct cras_rstream *rstream,
-					  unsigned int offset, size_t *frames);
-
-/* Returns non-zero if the stream is muted. */
-int cras_rstream_get_mute(const struct cras_rstream *rstream);
-
-/*
- * Returns non-zero if the stream is pending a reply from client.
- * - For playback, stream is waiting for AUDIO_MESSAGE_DATA_READY message from
- *   client.
- * - For capture, stream is waiting for AUDIO_MESSAGE_DATA_CAPTURED message
- *   from client.
- */
-int cras_rstream_is_pending_reply(const struct cras_rstream *stream);
-
-/*
- * Reads any pending audio message from the socket.
- */
-int cras_rstream_flush_old_audio_messages(struct cras_rstream *stream);
-
-#endif /* CRAS_RSTREAM_H_ */
diff --git a/cras/src/server/cras_rstream_config.c b/cras/src/server/cras_rstream_config.c
deleted file mode 100644
index c5cd9c5..0000000
--- a/cras/src/server/cras_rstream_config.c
+++ /dev/null
@@ -1,77 +0,0 @@
-/* Copyright 2020 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <fcntl.h>
-#include <stdint.h>
-#include <sys/mman.h>
-#include <sys/types.h>
-#include <syslog.h>
-
-#include "cras_audio_area.h"
-#include "cras_config.h"
-#include "cras_messages.h"
-#include "cras_rclient.h"
-#include "cras_rstream.h"
-#include "cras_rstream_config.h"
-#include "cras_server_metrics.h"
-#include "cras_shm.h"
-#include "cras_types.h"
-#include "cras_system_state.h"
-
-void cras_rstream_config_init(
-	struct cras_rclient *client, cras_stream_id_t stream_id,
-	enum CRAS_STREAM_TYPE stream_type, enum CRAS_CLIENT_TYPE client_type,
-	enum CRAS_STREAM_DIRECTION direction, uint32_t dev_idx, uint32_t flags,
-	uint32_t effects, const struct cras_audio_format *format,
-	size_t buffer_frames, size_t cb_threshold, int *audio_fd,
-	int *client_shm_fd, size_t client_shm_size,
-	const uint64_t buffer_offsets[2],
-	struct cras_rstream_config *stream_config)
-{
-	stream_config->stream_id = stream_id;
-	stream_config->stream_type = stream_type;
-	stream_config->client_type = client_type;
-	stream_config->direction = direction;
-	stream_config->dev_idx = dev_idx;
-	stream_config->flags = flags;
-	stream_config->effects = effects;
-	stream_config->format = format;
-	stream_config->buffer_frames = buffer_frames;
-	stream_config->cb_threshold = cb_threshold;
-	stream_config->audio_fd = *audio_fd;
-	*audio_fd = -1;
-	stream_config->client_shm_fd = *client_shm_fd;
-	*client_shm_fd = -1;
-	stream_config->client_shm_size = client_shm_size;
-	stream_config->buffer_offsets[0] = buffer_offsets[0];
-	stream_config->buffer_offsets[1] = buffer_offsets[1];
-	stream_config->client = client;
-}
-
-struct cras_rstream_config cras_rstream_config_init_with_message(
-	struct cras_rclient *client, const struct cras_connect_message *msg,
-	int *aud_fd, int *client_shm_fd,
-	const struct cras_audio_format *remote_fmt)
-{
-	struct cras_rstream_config stream_config;
-
-	const uint64_t buffer_offsets[2] = { msg->buffer_offsets[0],
-					     msg->buffer_offsets[1] };
-	cras_rstream_config_init(client, msg->stream_id, msg->stream_type,
-				 msg->client_type, msg->direction, msg->dev_idx,
-				 msg->flags, msg->effects, remote_fmt,
-				 msg->buffer_frames, msg->cb_threshold, aud_fd,
-				 client_shm_fd, msg->client_shm_size,
-				 buffer_offsets, &stream_config);
-	return stream_config;
-}
-
-void cras_rstream_config_cleanup(struct cras_rstream_config *stream_config)
-{
-	if (stream_config->audio_fd >= 0)
-		close(stream_config->audio_fd);
-	if (stream_config->client_shm_fd >= 0)
-		close(stream_config->client_shm_fd);
-}
diff --git a/cras/src/server/cras_rstream_config.h b/cras/src/server/cras_rstream_config.h
deleted file mode 100644
index 4d3713c..0000000
--- a/cras/src/server/cras_rstream_config.h
+++ /dev/null
@@ -1,101 +0,0 @@
-/* Copyright 2020 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-/*
- * Remote Stream Configuration
- */
-#ifndef CRAS_RSTREAM_CONFIG_H_
-#define CRAS_RSTREAM_CONFIG_H_
-
-#include "buffer_share.h"
-#include "cras_shm.h"
-#include "cras_types.h"
-
-struct cras_connect_message;
-struct dev_mix;
-
-/* Config for creating an rstream.
- *    stream_type - CRAS_STREAM_TYPE.
- *    client_type - CRAS_CLIENT_TYPE.
- *    direction - CRAS_STREAM_OUTPUT or CRAS_STREAM_INPUT.
- *    dev_idx - Pin to this device if != NO_DEVICE.
- *    flags - Any special handling for this stream.
- *    effects - Bit map of effects to be enabled on this stream.
- *    format - The audio format the stream wishes to use.
- *    buffer_frames - Total number of audio frames to buffer.
- *    cb_threshold - # of frames when to request more from the client.
- *    audio_fd - The fd to read/write audio signals to. May be -1 for server
- *               stream. Some functions may mutably borrow the config and move
- *               the fd ownership.
- *    client_shm_fd - The shm fd to use to back the samples area. May be -1.
- *                    Some functions may dup this fd while borrowing the config.
- *    client_shm_size - The size of shm area backed by client_shm_fd.
- *    buffer_offsets - Initial values for buffer_offset for a client shm stream.
- *    client - The client that owns this stream.
- */
-struct cras_rstream_config {
-	cras_stream_id_t stream_id;
-	enum CRAS_STREAM_TYPE stream_type;
-	enum CRAS_CLIENT_TYPE client_type;
-	enum CRAS_STREAM_DIRECTION direction;
-	uint32_t dev_idx;
-	uint32_t flags;
-	uint32_t effects;
-	const struct cras_audio_format *format;
-	size_t buffer_frames;
-	size_t cb_threshold;
-	int audio_fd;
-	int client_shm_fd;
-	size_t client_shm_size;
-	uint32_t buffer_offsets[2];
-	struct cras_rclient *client;
-};
-
-/* Fills cras_rstream_config with given parameters.
- *
- * Args:
- *   audio_fd - The audio fd pointer from client. Its ownership will be moved to
- *              stream_config.
- *   client_shm_fd - The shared memory fd pointer for samples from client. Its
- *                   ownership will be moved to stream_config.
- *   Other args - See comments in struct cras_rstream_config.
- */
-void cras_rstream_config_init(
-	struct cras_rclient *client, cras_stream_id_t stream_id,
-	enum CRAS_STREAM_TYPE stream_type, enum CRAS_CLIENT_TYPE client_type,
-	enum CRAS_STREAM_DIRECTION direction, uint32_t dev_idx, uint32_t flags,
-	uint32_t effects, const struct cras_audio_format *format,
-	size_t buffer_frames, size_t cb_threshold, int *audio_fd,
-	int *client_shm_fd, size_t client_shm_size,
-	const uint64_t buffer_offsets[2],
-	struct cras_rstream_config *stream_config);
-
-/* Fills cras_rstream_config with given parameters and a cras_connect_message.
- *
- * Args:
- *   client - The rclient which handles the connect message.
- *   msg - The cras_connect_message from client.
- *   aud_fd - The audio fd pointer from client. Its ownership will be moved to
- *            stream_config.
- *   client_shm_fd - The shared memory fd pointer for samples from client. Its
- *                   ownership will be moved to stream_config.
- *   remote_format - The remote_format for the config.
- *
- * Returns a cras_rstream_config struct filled in with params from the message.
- */
-struct cras_rstream_config cras_rstream_config_init_with_message(
-	struct cras_rclient *client, const struct cras_connect_message *msg,
-	int *aud_fd, int *client_shm_fd,
-	const struct cras_audio_format *remote_format);
-
-/* Cleans up given cras_rstream_config. All fds inside the config will be
- * closed.
- *
- * Args:
- *   stream_config - The config to be cleaned up.
- */
-void cras_rstream_config_cleanup(struct cras_rstream_config *stream_config);
-
-#endif /* CRAS_RSTREAM_CONFIG_H_ */
diff --git a/cras/src/server/cras_server.c b/cras/src/server/cras_server.c
deleted file mode 100644
index 5f2ce63..0000000
--- a/cras/src/server/cras_server.c
+++ /dev/null
@@ -1,720 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#define _GNU_SOURCE /* Needed for Linux socket credential passing. */
-
-#ifdef CRAS_DBUS
-#include <dbus/dbus.h>
-#endif
-#include <errno.h>
-#include <poll.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/param.h>
-#include <sys/select.h>
-#include <sys/socket.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <sys/un.h>
-#include <syslog.h>
-#include <unistd.h>
-
-#ifdef CRAS_DBUS
-#include "cras_a2dp_endpoint.h"
-#include "cras_bt_manager.h"
-#include "cras_bt_device.h"
-#include "cras_bt_player.h"
-#include "cras_dbus.h"
-#include "cras_dbus_control.h"
-#include "cras_hfp_ag_profile.h"
-#include "cras_telephony.h"
-#endif
-#include "cras_alert.h"
-#include "cras_audio_thread_monitor.h"
-#include "cras_config.h"
-#include "cras_device_monitor.h"
-#include "cras_hotword_handler.h"
-#include "cras_iodev_list.h"
-#include "cras_main_message.h"
-#include "cras_messages.h"
-#include "cras_metrics.h"
-#include "cras_non_empty_audio_handler.h"
-#include "cras_observer.h"
-#include "cras_rclient.h"
-#include "cras_server.h"
-#include "cras_server_metrics.h"
-#include "cras_system_state.h"
-#include "cras_tm.h"
-#include "cras_types.h"
-#include "cras_udev.h"
-#include "cras_util.h"
-#include "cras_mix.h"
-#include "utlist.h"
-
-/* Store a list of clients that are attached to the server.
- * Members:
- *    id - Unique identifier for this client.
- *    fd - socket file descriptor used to communicate with client.
- *    ucred - Process, user, and group ID of the client.
- *    client - rclient to handle messages from this client.
- *    pollfd - Pointer to struct pollfd for this callback.
- */
-struct attached_client {
-	size_t id;
-	int fd;
-	struct ucred ucred;
-	struct cras_rclient *client;
-	struct pollfd *pollfd;
-	struct attached_client *next, *prev;
-};
-
-/* Stores file descriptors to callback mappings for clients. Callback/fd/data
- * args are registered by clients.  When fd is ready, the callback will be
- * called on the main server thread and the callback data will be passed back to
- * it.  This allows the use of the main server loop instead of spawning a thread
- * to watch file descriptors.  The client can then read or write the fd.
- * Members:
- *    fd - The file descriptor passed to select.
- *    callback - The funciton to call when fd is ready.
- *    callback_data - Pointer passed to the callback.
- *    pollfd - Pointer to struct pollfd for this callback.
- *    events - The events to poll for.
- */
-struct client_callback {
-	int select_fd;
-	void (*callback)(void *data, int revents);
-	void *callback_data;
-	struct pollfd *pollfd;
-	int deleted;
-	int events;
-	struct client_callback *prev, *next;
-};
-
-/* Stores callback function and argument data to be executed later. */
-struct system_task {
-	void (*callback)(void *);
-	void *callback_data;
-	struct system_task *next, *prev;
-};
-
-/* A structure wraps data related to server socket. */
-struct server_socket {
-	struct sockaddr_un addr;
-	int fd;
-	enum CRAS_CONNECTION_TYPE type;
-};
-
-/* Local server data. */
-struct server_data {
-	struct attached_client *clients_head;
-	size_t num_clients;
-	struct client_callback *client_callbacks;
-	struct system_task *system_tasks;
-	size_t num_client_callbacks;
-	size_t next_client_id;
-	struct server_socket server_sockets[CRAS_NUM_CONN_TYPE];
-} server_instance;
-
-/* Cleanup a given server_socket */
-static void server_socket_cleanup(struct server_socket *socket)
-{
-	if (socket && socket->fd >= 0) {
-		close(socket->fd);
-		socket->fd = -1;
-		unlink(socket->addr.sun_path);
-	}
-}
-
-/* Remove a client from the list and destroy it.  Calling rclient_destroy will
- * also free all the streams owned by the client */
-static void remove_client(struct attached_client *client)
-{
-	close(client->fd);
-	DL_DELETE(server_instance.clients_head, client);
-	server_instance.num_clients--;
-	cras_rclient_destroy(client->client);
-	free(client);
-}
-
-/* This is called when "select" indicates that the client has written data to
- * the socket.  Read out one message and pass it to the client message handler.
- */
-static void handle_message_from_client(struct attached_client *client)
-{
-	uint8_t buf[CRAS_SERV_MAX_MSG_SIZE];
-	int nread;
-	unsigned int num_fds = 2;
-	int fds[num_fds];
-
-	nread = cras_recv_with_fds(client->fd, buf, sizeof(buf), fds, &num_fds);
-	if (nread < 0)
-		goto read_error;
-	if (cras_rclient_buffer_from_client(client->client, buf, nread, fds,
-					    num_fds) < 0)
-		goto read_error;
-	return;
-
-read_error:
-	for (int i = 0; i < num_fds; i++)
-		if (fds[i] >= 0)
-			close(fds[i]);
-	switch (nread) {
-	case 0:
-		break;
-	default:
-		syslog(LOG_DEBUG, "read err [%d] '%s', removing client %zu",
-		       -nread, strerror(-nread), client->id);
-		break;
-	}
-	remove_client(client);
-}
-
-/* Discovers and fills in info about the client that can be obtained from the
- * socket. The pid of the attaching client identifies it in logs. */
-static void fill_client_info(struct attached_client *client)
-{
-	socklen_t ucred_length = sizeof(client->ucred);
-
-	if (getsockopt(client->fd, SOL_SOCKET, SO_PEERCRED, &client->ucred,
-		       &ucred_length))
-		syslog(LOG_INFO, "Failed to get client socket info\n");
-}
-
-/* Fills the server_state with the current list of attached clients. */
-static void send_client_list_to_clients(struct server_data *serv)
-{
-	struct attached_client *c;
-	struct cras_attached_client_info *info;
-	struct cras_server_state *state;
-	unsigned i;
-
-	state = cras_system_state_update_begin();
-	if (!state)
-		return;
-
-	state->num_attached_clients =
-		MIN(CRAS_MAX_ATTACHED_CLIENTS, serv->num_clients);
-
-	info = state->client_info;
-	i = 0;
-	DL_FOREACH (serv->clients_head, c) {
-		info->id = c->id;
-		info->pid = c->ucred.pid;
-		info->uid = c->ucred.uid;
-		info->gid = c->ucred.gid;
-		info++;
-		if (++i == CRAS_MAX_ATTACHED_CLIENTS)
-			break;
-	}
-
-	cras_system_state_update_complete();
-}
-
-/* Handles requests from a client to attach to the server.  Create a local
- * structure to track the client, assign it a unique id and let it attach */
-static void handle_new_connection(struct server_socket *server_socket)
-{
-	int connection_fd;
-	struct attached_client *poll_client;
-	socklen_t address_length;
-
-	poll_client = malloc(sizeof(struct attached_client));
-	if (poll_client == NULL) {
-		syslog(LOG_ERR, "Allocating poll_client");
-		return;
-	}
-
-	memset(&address_length, 0, sizeof(address_length));
-	connection_fd = accept(server_socket->fd,
-			       (struct sockaddr *)&server_socket->addr,
-			       &address_length);
-	if (connection_fd < 0) {
-		syslog(LOG_ERR, "connecting");
-		free(poll_client);
-		return;
-	}
-
-	/* find next available client id */
-	while (1) {
-		struct attached_client *out;
-		DL_SEARCH_SCALAR(server_instance.clients_head, out, id,
-				 server_instance.next_client_id);
-		poll_client->id = server_instance.next_client_id;
-		server_instance.next_client_id++;
-		if (out == NULL)
-			break;
-	}
-
-	/* When full, getting an error is preferable to blocking. */
-	cras_make_fd_nonblocking(connection_fd);
-
-	poll_client->fd = connection_fd;
-	poll_client->next = NULL;
-	poll_client->pollfd = NULL;
-	fill_client_info(poll_client);
-
-	poll_client->client = cras_rclient_create(
-		connection_fd, poll_client->id, server_socket->type);
-	if (poll_client->client == NULL) {
-		syslog(LOG_ERR, "failed to create client");
-		goto error;
-	}
-
-	DL_APPEND(server_instance.clients_head, poll_client);
-	server_instance.num_clients++;
-	/* Send a current list of available inputs and outputs. */
-	cras_iodev_list_update_device_list();
-	send_client_list_to_clients(&server_instance);
-	return;
-error:
-	close(connection_fd);
-	free(poll_client);
-	return;
-}
-
-/* Add a file descriptor to be passed to select in the main loop. This is
- * registered with system state so that it is called when any client asks to
- * have a callback triggered based on an fd being readable. */
-static int add_select_fd(int fd, void (*cb)(void *data, int events),
-			 void *callback_data, int events, void *server_data)
-{
-	struct client_callback *new_cb;
-	struct client_callback *client_cb;
-	struct server_data *serv;
-
-	serv = (struct server_data *)server_data;
-	if (serv == NULL)
-		return -EINVAL;
-
-	/* Check if fd already exists. */
-	DL_FOREACH (serv->client_callbacks, client_cb)
-		if (client_cb->select_fd == fd && !client_cb->deleted)
-			return -EEXIST;
-
-	new_cb = (struct client_callback *)calloc(1, sizeof(*new_cb));
-	if (new_cb == NULL)
-		return -ENOMEM;
-
-	new_cb->select_fd = fd;
-	new_cb->callback = cb;
-	new_cb->callback_data = callback_data;
-	new_cb->deleted = 0;
-	new_cb->events = events;
-	new_cb->pollfd = NULL;
-
-	DL_APPEND(serv->client_callbacks, new_cb);
-	server_instance.num_client_callbacks++;
-	return 0;
-}
-
-/* Removes a file descriptor to be passed to select in the main loop. This is
- * registered with system state so that it is called when any client asks to
- * remove a callback added with add_select_fd. */
-static void rm_select_fd(int fd, void *server_data)
-{
-	struct server_data *serv;
-	struct client_callback *client_cb;
-
-	serv = (struct server_data *)server_data;
-	if (serv == NULL)
-		return;
-
-	DL_FOREACH (serv->client_callbacks, client_cb)
-		if (client_cb->select_fd == fd)
-			client_cb->deleted = 1;
-}
-
-/* Creates a new task entry and append to system_tasks list, which will be
- * executed in main loop later without wait time.
- */
-static int add_task(void (*cb)(void *data), void *callback_data,
-		    void *server_data)
-{
-	struct server_data *serv;
-	struct system_task *new_task;
-
-	serv = (struct server_data *)server_data;
-	if (serv == NULL)
-		return -EINVAL;
-
-	new_task = (struct system_task *)calloc(1, sizeof(*new_task));
-	if (new_task == NULL)
-		return -ENOMEM;
-
-	new_task->callback = cb;
-	new_task->callback_data = callback_data;
-
-	DL_APPEND(serv->system_tasks, new_task);
-	return 0;
-}
-
-/* Cleans up the file descriptor list removing items deleted during the main
- * loop iteration. */
-static void cleanup_select_fds(void *server_data)
-{
-	struct server_data *serv;
-	struct client_callback *client_cb;
-
-	serv = (struct server_data *)server_data;
-	if (serv == NULL)
-		return;
-
-	DL_FOREACH (serv->client_callbacks, client_cb)
-		if (client_cb->deleted) {
-			DL_DELETE(serv->client_callbacks, client_cb);
-			server_instance.num_client_callbacks--;
-			free(client_cb);
-		}
-}
-
-/* Checks that at least two outputs are present (one will be the "empty"
- * default device. */
-void check_output_exists(struct cras_timer *t, void *data)
-{
-	if (cras_iodev_list_get_outputs(NULL) < 2)
-		cras_metrics_log_event(kNoCodecsFoundMetric);
-}
-
-#if defined(__amd64__)
-/* CPU detection - probaby best to move this elsewhere */
-static void cpuid(unsigned int *eax, unsigned int *ebx, unsigned int *ecx,
-		  unsigned int *edx, unsigned int op)
-{
-	// clang-format off
-	__asm__ __volatile__ (
-		"cpuid"
-		: "=a" (*eax),
-		  "=b" (*ebx),
-		  "=c" (*ecx),
-		  "=d" (*edx)
-		: "a" (op), "c" (0)
-	);
-	// clang-format on
-}
-
-static unsigned int cpu_x86_flags(void)
-{
-	unsigned int eax, ebx, ecx, edx, id;
-	unsigned int cpu_flags = 0;
-
-	cpuid(&id, &ebx, &ecx, &edx, 0);
-
-	if (id >= 1) {
-		cpuid(&eax, &ebx, &ecx, &edx, 1);
-
-		if (ecx & (1 << 20))
-			cpu_flags |= CPU_X86_SSE4_2;
-
-		if (ecx & (1 << 28))
-			cpu_flags |= CPU_X86_AVX;
-
-		if (ecx & (1 << 12))
-			cpu_flags |= CPU_X86_FMA;
-	}
-
-	if (id >= 7) {
-		cpuid(&eax, &ebx, &ecx, &edx, 7);
-
-		if (ebx & (1 << 5))
-			cpu_flags |= CPU_X86_AVX2;
-	}
-
-	return cpu_flags;
-}
-#endif
-
-int cpu_get_flags(void)
-{
-#if defined(__amd64__)
-	return cpu_x86_flags();
-#endif
-	return 0;
-}
-
-/*
- * Exported Interface.
- */
-
-int cras_server_init()
-{
-	/* Log to syslog. */
-	openlog("cras_server", LOG_PID, LOG_USER);
-
-	server_instance.next_client_id = RESERVED_CLIENT_IDS;
-
-	/* Initialize global observer. */
-	cras_observer_server_init();
-
-	/* init mixer with CPU capabilities */
-	cras_mix_init(cpu_get_flags());
-
-	/* Allow clients to register callbacks for file descriptors.
-	 * add_select_fd and rm_select_fd will add and remove file descriptors
-	 * from the list that are passed to select in the main loop below. */
-	cras_system_set_select_handler(add_select_fd, rm_select_fd,
-				       &server_instance);
-	cras_system_set_add_task_handler(add_task, &server_instance);
-	cras_main_message_init();
-
-	/* Initializes all server_sockets */
-	for (int conn_type = 0; conn_type < CRAS_NUM_CONN_TYPE; conn_type++) {
-		server_instance.server_sockets[conn_type].fd = -1;
-	}
-
-	return 0;
-}
-
-/*
- * Creates a server socket with given connection type and listens on it.
- * The socket_file will be created under cras_config_get_system_socket_file_dir
- * with permission=0770. The socket_fd will be listened with parameter
- * backlog=5.
- *
- * Returns 0 on success and leaves the created fd and the address information
- * in server_socket.
- * When error occurs, the created fd will be closed and the file path will be
- * unlinked and returns negative error code.
- */
-static int create_and_listen_server_socket(enum CRAS_CONNECTION_TYPE conn_type,
-					   struct server_socket *server_socket)
-{
-	int socket_fd = -1;
-	int rc = 0;
-	struct sockaddr_un *addr = &server_socket->addr;
-
-	socket_fd = socket(PF_UNIX, SOCK_SEQPACKET, 0);
-	if (socket_fd < 0) {
-		syslog(LOG_ERR, "Main server socket failed.");
-		rc = socket_fd;
-		goto error;
-	}
-
-	memset(addr, 0, sizeof(*addr));
-	addr->sun_family = AF_UNIX;
-	rc = cras_fill_socket_path(conn_type, addr->sun_path);
-	if (rc < 0)
-		goto error;
-	unlink(addr->sun_path);
-
-	/* Linux quirk: calling fchmod before bind, sets the permissions of the
-	 * file created by bind, leaving no window for it to be modified. Start
-	 * with very restricted permissions. */
-	rc = fchmod(socket_fd, 0700);
-	if (rc < 0)
-		goto error;
-
-	rc = bind(socket_fd, (struct sockaddr *)addr,
-		  sizeof(struct sockaddr_un));
-	if (rc < 0) {
-		syslog(LOG_ERR, "Bind to server socket failed.");
-		rc = -errno;
-		goto error;
-	}
-
-	/* Let other members in our group play audio through this socket. */
-	rc = chmod(addr->sun_path, 0770);
-	if (rc < 0)
-		goto error;
-
-	if (listen(socket_fd, 5) != 0) {
-		syslog(LOG_ERR, "Listen on server socket failed.");
-		rc = -errno;
-		goto error;
-	}
-
-	server_socket->fd = socket_fd;
-	server_socket->type = conn_type;
-	return 0;
-error:
-	if (socket_fd >= 0) {
-		close(socket_fd);
-		unlink(addr->sun_path);
-	}
-	return rc;
-}
-
-/* Cleans up all server_socket in server_instance */
-static void cleanup_server_sockets()
-{
-	for (int conn_type = 0; conn_type < CRAS_NUM_CONN_TYPE; conn_type++) {
-		server_socket_cleanup(
-			&server_instance.server_sockets[conn_type]);
-	}
-}
-
-int cras_server_run(unsigned int profile_disable_mask)
-{
-	static const unsigned int OUTPUT_CHECK_MS = 5 * 1000;
-#ifdef CRAS_DBUS
-	DBusConnection *dbus_conn;
-#endif
-	int rc = 0;
-	struct attached_client *elm;
-	struct client_callback *client_cb;
-	struct system_task *tasks;
-	struct system_task *system_task;
-	struct cras_tm *tm;
-	struct timespec ts, *poll_timeout;
-	int timers_active;
-	struct pollfd *pollfds;
-	unsigned int pollfds_size = 32;
-	unsigned int num_pollfds, poll_size_needed;
-
-	pollfds = malloc(sizeof(*pollfds) * pollfds_size);
-
-	cras_udev_start_sound_subsystem_monitor();
-#ifdef CRAS_DBUS
-	cras_bt_device_start_monitor();
-#endif
-
-	cras_server_metrics_init();
-
-	cras_device_monitor_init();
-
-	cras_hotword_handler_init();
-
-	cras_non_empty_audio_handler_init();
-
-	cras_audio_thread_monitor_init();
-
-#ifdef CRAS_DBUS
-	dbus_threads_init_default();
-	dbus_conn = cras_dbus_connect_system_bus();
-	if (dbus_conn) {
-		cras_bt_start(dbus_conn);
-		if (!(profile_disable_mask & CRAS_SERVER_PROFILE_MASK_HFP))
-			cras_hfp_ag_profile_create(dbus_conn);
-		if (!(profile_disable_mask & CRAS_SERVER_PROFILE_MASK_HSP))
-			cras_hsp_ag_profile_create(dbus_conn);
-		cras_telephony_start(dbus_conn);
-		if (!(profile_disable_mask & CRAS_SERVER_PROFILE_MASK_A2DP))
-			cras_a2dp_endpoint_create(dbus_conn);
-		cras_bt_player_create(dbus_conn);
-		cras_dbus_control_start(dbus_conn);
-	}
-#endif
-
-	for (int conn_type = 0; conn_type < CRAS_NUM_CONN_TYPE; conn_type++) {
-		rc = create_and_listen_server_socket(
-			conn_type, &server_instance.server_sockets[conn_type]);
-		if (rc < 0)
-			goto bail;
-	}
-
-	tm = cras_system_state_get_tm();
-	if (!tm) {
-		syslog(LOG_ERR, "Getting timer manager.");
-		rc = -ENOMEM;
-		goto bail;
-	}
-
-	/* After a delay, make sure there is at least one real output device. */
-	cras_tm_create_timer(tm, OUTPUT_CHECK_MS, check_output_exists, 0);
-
-	/* Main server loop - client callbacks are run from this context. */
-	while (1) {
-		poll_size_needed = CRAS_NUM_CONN_TYPE +
-				   server_instance.num_clients +
-				   server_instance.num_client_callbacks;
-		if (poll_size_needed > pollfds_size) {
-			pollfds_size = 2 * poll_size_needed;
-			pollfds = realloc(pollfds,
-					  sizeof(*pollfds) * pollfds_size);
-		}
-
-		for (int conn_type = 0; conn_type < CRAS_NUM_CONN_TYPE;
-		     conn_type++) {
-			pollfds[conn_type].fd =
-				server_instance.server_sockets[conn_type].fd;
-			pollfds[conn_type].events = POLLIN;
-		}
-		num_pollfds = CRAS_NUM_CONN_TYPE;
-
-		DL_FOREACH (server_instance.clients_head, elm) {
-			pollfds[num_pollfds].fd = elm->fd;
-			pollfds[num_pollfds].events = POLLIN;
-			elm->pollfd = &pollfds[num_pollfds];
-			num_pollfds++;
-		}
-		DL_FOREACH (server_instance.client_callbacks, client_cb) {
-			if (client_cb->deleted)
-				continue;
-			pollfds[num_pollfds].fd = client_cb->select_fd;
-			pollfds[num_pollfds].events = client_cb->events;
-			client_cb->pollfd = &pollfds[num_pollfds];
-			num_pollfds++;
-		}
-
-		tasks = server_instance.system_tasks;
-		server_instance.system_tasks = NULL;
-		DL_FOREACH (tasks, system_task) {
-			system_task->callback(system_task->callback_data);
-			DL_DELETE(tasks, system_task);
-			free(system_task);
-		}
-
-		timers_active = cras_tm_get_next_timeout(tm, &ts);
-
-		/*
-		 * If new client task has been scheduled, no need to wait
-		 * for timeout, just do another loop to execute them.
-		 */
-		if (server_instance.system_tasks)
-			poll_timeout = NULL;
-		else
-			poll_timeout = timers_active ? &ts : NULL;
-
-		rc = ppoll(pollfds, num_pollfds, poll_timeout, NULL);
-		if (rc < 0)
-			continue;
-
-		cras_tm_call_callbacks(tm);
-
-		/* Check for new connections. */
-		for (int conn_type = 0; conn_type < CRAS_NUM_CONN_TYPE;
-		     conn_type++) {
-			if (pollfds[conn_type].revents & POLLIN)
-				handle_new_connection(
-					&server_instance
-						 .server_sockets[conn_type]);
-		}
-
-		/* Check if there are messages pending for any clients. */
-		DL_FOREACH (server_instance.clients_head, elm)
-			if (elm->pollfd && elm->pollfd->revents & POLLIN)
-				handle_message_from_client(elm);
-		/* Check any client-registered fd/callback pairs. */
-		DL_FOREACH (server_instance.client_callbacks, client_cb)
-			if (!client_cb->deleted && client_cb->pollfd &&
-			    (client_cb->pollfd->revents & client_cb->events))
-				client_cb->callback(client_cb->callback_data,
-						    client_cb->pollfd->revents);
-
-		cleanup_select_fds(&server_instance);
-
-#ifdef CRAS_DBUS
-		if (dbus_conn)
-			cras_dbus_dispatch(dbus_conn);
-#endif
-
-		cras_alert_process_all_pending_alerts();
-	}
-
-bail:
-	cleanup_server_sockets();
-	free(pollfds);
-	cras_observer_server_free();
-	return rc;
-}
-
-void cras_server_send_to_all_clients(const struct cras_client_message *msg)
-{
-	struct attached_client *client;
-
-	DL_FOREACH (server_instance.clients_head, client)
-		cras_rclient_send_message(client->client, msg, NULL, 0);
-}
diff --git a/cras/src/server/cras_server.h b/cras/src/server/cras_server.h
deleted file mode 100644
index a7dfa63..0000000
--- a/cras/src/server/cras_server.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-/*
- * The CRAS server instance.
- */
-#ifndef CRAS_SERVER_H_
-#define CRAS_SERVER_H_
-
-/*
- * Bitmask for cras_server_run() argument profile_disable_mask
- */
-#define CRAS_SERVER_PROFILE_MASK_HFP (1 << 0)
-#define CRAS_SERVER_PROFILE_MASK_HSP (1 << 1)
-#define CRAS_SERVER_PROFILE_MASK_A2DP (1 << 2)
-
-/* Reserver client id 0-15 for internal server usage. */
-#define RESERVED_CLIENT_IDS 16
-#define SERVER_STREAM_CLIENT_ID 0
-
-struct cras_client_message;
-
-/* Initialize some server setup. Mainly to add the select handler first
- * so that client callbacks can be registered before server start running.
- */
-int cras_server_init();
-
-/* Runs the CRAS server.  Open the main socket and begin listening for
- * connections and for messages from clients that have connected.
- */
-int cras_server_run(unsigned int profile_disable_mask);
-
-/* Send a message to all attached clients. */
-void cras_server_send_to_all_clients(const struct cras_client_message *msg);
-
-#endif /* CRAS_SERVER_H_ */
diff --git a/cras/src/server/cras_server_metrics.c b/cras/src/server/cras_server_metrics.c
deleted file mode 100644
index 7e48710..0000000
--- a/cras/src/server/cras_server_metrics.c
+++ /dev/null
@@ -1,1326 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <errno.h>
-#include <math.h>
-#include <stdio.h>
-#include <string.h>
-#include <syslog.h>
-
-#ifdef CRAS_DBUS
-#include "cras_bt_io.h"
-#endif
-#include "cras_iodev.h"
-#include "cras_metrics.h"
-#include "cras_main_message.h"
-#include "cras_rstream.h"
-#include "cras_server_metrics.h"
-#include "cras_system_state.h"
-
-#define METRICS_NAME_BUFFER_SIZE 100
-
-const char kBusyloop[] = "Cras.Busyloop";
-const char kBusyloopLength[] = "Cras.BusyloopLength";
-const char kDeviceTypeInput[] = "Cras.DeviceTypeInput";
-const char kDeviceTypeOutput[] = "Cras.DeviceTypeOutput";
-const char kDeviceGain[] = "Cras.DeviceGain";
-const char kDeviceVolume[] = "Cras.DeviceVolume";
-const char kFetchDelayMilliSeconds[] = "Cras.FetchDelayMilliSeconds";
-const char kHighestDeviceDelayInput[] = "Cras.HighestDeviceDelayInput";
-const char kHighestDeviceDelayOutput[] = "Cras.HighestDeviceDelayOutput";
-const char kHighestInputHardwareLevel[] = "Cras.HighestInputHardwareLevel";
-const char kHighestOutputHardwareLevel[] = "Cras.HighestOutputHardwareLevel";
-const char kMissedCallbackFirstTimeInput[] =
-	"Cras.MissedCallbackFirstTimeInput";
-const char kMissedCallbackFirstTimeOutput[] =
-	"Cras.MissedCallbackFirstTimeOutput";
-const char kMissedCallbackFrequencyInput[] =
-	"Cras.MissedCallbackFrequencyInput";
-const char kMissedCallbackFrequencyOutput[] =
-	"Cras.MissedCallbackFrequencyOutput";
-const char kMissedCallbackFrequencyAfterReschedulingInput[] =
-	"Cras.MissedCallbackFrequencyAfterReschedulingInput";
-const char kMissedCallbackFrequencyAfterReschedulingOutput[] =
-	"Cras.MissedCallbackFrequencyAfterReschedulingOutput";
-const char kMissedCallbackSecondTimeInput[] =
-	"Cras.MissedCallbackSecondTimeInput";
-const char kMissedCallbackSecondTimeOutput[] =
-	"Cras.MissedCallbackSecondTimeOutput";
-const char kNoCodecsFoundMetric[] = "Cras.NoCodecsFoundAtBoot";
-const char kStreamCallbackThreshold[] = "Cras.StreamCallbackThreshold";
-const char kStreamClientTypeInput[] = "Cras.StreamClientTypeInput";
-const char kStreamClientTypeOutput[] = "Cras.StreamClientTypeOutput";
-const char kStreamFlags[] = "Cras.StreamFlags";
-const char kStreamEffects[] = "Cras.StreamEffects";
-const char kStreamRuntime[] = "Cras.StreamRuntime";
-const char kStreamSamplingFormat[] = "Cras.StreamSamplingFormat";
-const char kStreamSamplingRate[] = "Cras.StreamSamplingRate";
-const char kUnderrunsPerDevice[] = "Cras.UnderrunsPerDevice";
-const char kHfpScoConnectionError[] = "Cras.HfpScoConnectionError";
-const char kHfpBatteryIndicatorSupported[] =
-	"Cras.HfpBatteryIndicatorSupported";
-const char kHfpBatteryReport[] = "Cras.HfpBatteryReport";
-const char kHfpWidebandSpeechSupported[] = "Cras.HfpWidebandSpeechSupported";
-const char kHfpWidebandSpeechPacketLoss[] = "Cras.HfpWidebandSpeechPacketLoss";
-const char kHfpWidebandSpeechSelectedCodec[] =
-	"Cras.kHfpWidebandSpeechSelectedCodec";
-
-/*
- * Records missed callback frequency only when the runtime of stream is larger
- * than the threshold.
- */
-const double MISSED_CB_FREQUENCY_SECONDS_MIN = 10.0;
-
-const time_t CRAS_METRICS_SHORT_PERIOD_THRESHOLD_SECONDS = 600;
-const time_t CRAS_METRICS_LONG_PERIOD_THRESHOLD_SECONDS = 3600;
-
-static const char *get_timespec_period_str(struct timespec ts)
-{
-	if (ts.tv_sec < CRAS_METRICS_SHORT_PERIOD_THRESHOLD_SECONDS)
-		return "ShortPeriod";
-	if (ts.tv_sec < CRAS_METRICS_LONG_PERIOD_THRESHOLD_SECONDS)
-		return "MediumPeriod";
-	return "LongPeriod";
-}
-
-/* Type of metrics to log. */
-enum CRAS_SERVER_METRICS_TYPE {
-	BT_BATTERY_INDICATOR_SUPPORTED,
-	BT_BATTERY_REPORT,
-	BT_SCO_CONNECTION_ERROR,
-	BT_WIDEBAND_PACKET_LOSS,
-	BT_WIDEBAND_SUPPORTED,
-	BT_WIDEBAND_SELECTED_CODEC,
-	BUSYLOOP,
-	BUSYLOOP_LENGTH,
-	DEVICE_GAIN,
-	DEVICE_RUNTIME,
-	DEVICE_VOLUME,
-	HIGHEST_DEVICE_DELAY_INPUT,
-	HIGHEST_DEVICE_DELAY_OUTPUT,
-	HIGHEST_INPUT_HW_LEVEL,
-	HIGHEST_OUTPUT_HW_LEVEL,
-	LONGEST_FETCH_DELAY,
-	MISSED_CB_FIRST_TIME_INPUT,
-	MISSED_CB_FIRST_TIME_OUTPUT,
-	MISSED_CB_FREQUENCY_INPUT,
-	MISSED_CB_FREQUENCY_OUTPUT,
-	MISSED_CB_FREQUENCY_AFTER_RESCHEDULING_INPUT,
-	MISSED_CB_FREQUENCY_AFTER_RESCHEDULING_OUTPUT,
-	MISSED_CB_SECOND_TIME_INPUT,
-	MISSED_CB_SECOND_TIME_OUTPUT,
-	NUM_UNDERRUNS,
-	STREAM_CONFIG,
-	STREAM_RUNTIME
-};
-
-enum CRAS_METRICS_DEVICE_TYPE {
-	/* Output devices. */
-	CRAS_METRICS_DEVICE_INTERNAL_SPEAKER,
-	CRAS_METRICS_DEVICE_HEADPHONE,
-	CRAS_METRICS_DEVICE_HDMI,
-	CRAS_METRICS_DEVICE_HAPTIC,
-	CRAS_METRICS_DEVICE_LINEOUT,
-	/* Input devices. */
-	CRAS_METRICS_DEVICE_INTERNAL_MIC,
-	CRAS_METRICS_DEVICE_FRONT_MIC,
-	CRAS_METRICS_DEVICE_REAR_MIC,
-	CRAS_METRICS_DEVICE_KEYBOARD_MIC,
-	CRAS_METRICS_DEVICE_MIC,
-	CRAS_METRICS_DEVICE_HOTWORD,
-	CRAS_METRICS_DEVICE_POST_MIX_LOOPBACK,
-	CRAS_METRICS_DEVICE_POST_DSP_LOOPBACK,
-	/* Devices supporting input and output function. */
-	CRAS_METRICS_DEVICE_USB,
-	CRAS_METRICS_DEVICE_A2DP,
-	CRAS_METRICS_DEVICE_HFP,
-	CRAS_METRICS_DEVICE_HSP,
-	CRAS_METRICS_DEVICE_BLUETOOTH,
-	CRAS_METRICS_DEVICE_BLUETOOTH_NB_MIC,
-	CRAS_METRICS_DEVICE_NO_DEVICE,
-	CRAS_METRICS_DEVICE_NORMAL_FALLBACK,
-	CRAS_METRICS_DEVICE_ABNORMAL_FALLBACK,
-	CRAS_METRICS_DEVICE_SILENT_HOTWORD,
-	CRAS_METRICS_DEVICE_UNKNOWN,
-	CRAS_METRICS_DEVICE_BLUETOOTH_WB_MIC,
-	CRAS_METRICS_DEVICE_ALSA_LOOPBACK,
-};
-
-struct cras_server_metrics_stream_config {
-	enum CRAS_STREAM_DIRECTION direction;
-	unsigned cb_threshold;
-	unsigned flags;
-	unsigned effects;
-	int format;
-	unsigned rate;
-	enum CRAS_CLIENT_TYPE client_type;
-};
-
-struct cras_server_metrics_device_data {
-	enum CRAS_METRICS_DEVICE_TYPE type;
-	enum CRAS_STREAM_DIRECTION direction;
-	struct timespec runtime;
-	unsigned value;
-};
-
-struct cras_server_metrics_stream_data {
-	enum CRAS_CLIENT_TYPE client_type;
-	enum CRAS_STREAM_TYPE stream_type;
-	enum CRAS_STREAM_DIRECTION direction;
-	struct timespec runtime;
-};
-
-struct cras_server_metrics_timespec_data {
-	struct timespec runtime;
-	unsigned count;
-};
-
-union cras_server_metrics_data {
-	unsigned value;
-	struct cras_server_metrics_stream_config stream_config;
-	struct cras_server_metrics_device_data device_data;
-	struct cras_server_metrics_stream_data stream_data;
-	struct cras_server_metrics_timespec_data timespec_data;
-};
-
-/*
- * Make sure the size of message in the acceptable range. Otherwise, it may
- * be split into mutiple packets while sending.
- */
-static_assert(sizeof(union cras_server_metrics_data) <= 256,
-	      "The size is too large.");
-
-struct cras_server_metrics_message {
-	struct cras_main_message header;
-	enum CRAS_SERVER_METRICS_TYPE metrics_type;
-	union cras_server_metrics_data data;
-};
-
-static void init_server_metrics_msg(struct cras_server_metrics_message *msg,
-				    enum CRAS_SERVER_METRICS_TYPE type,
-				    union cras_server_metrics_data data)
-{
-	memset(msg, 0, sizeof(*msg));
-	msg->header.type = CRAS_MAIN_METRICS;
-	msg->header.length = sizeof(*msg);
-	msg->metrics_type = type;
-	msg->data = data;
-}
-
-static void handle_metrics_message(struct cras_main_message *msg, void *arg);
-
-/* The wrapper function of cras_main_message_send. */
-static int cras_server_metrics_message_send(struct cras_main_message *msg)
-{
-	/* If current function is in the main thread, call handler directly. */
-	if (cras_system_state_in_main_thread()) {
-		handle_metrics_message(msg, NULL);
-		return 0;
-	}
-	return cras_main_message_send(msg);
-}
-
-static inline const char *
-metrics_device_type_str(enum CRAS_METRICS_DEVICE_TYPE device_type)
-{
-	switch (device_type) {
-	case CRAS_METRICS_DEVICE_INTERNAL_SPEAKER:
-		return "InternalSpeaker";
-	case CRAS_METRICS_DEVICE_HEADPHONE:
-		return "Headphone";
-	case CRAS_METRICS_DEVICE_HDMI:
-		return "HDMI";
-	case CRAS_METRICS_DEVICE_HAPTIC:
-		return "Haptic";
-	case CRAS_METRICS_DEVICE_LINEOUT:
-		return "Lineout";
-	/* Input devices. */
-	case CRAS_METRICS_DEVICE_INTERNAL_MIC:
-		return "InternalMic";
-	case CRAS_METRICS_DEVICE_FRONT_MIC:
-		return "FrontMic";
-	case CRAS_METRICS_DEVICE_REAR_MIC:
-		return "RearMic";
-	case CRAS_METRICS_DEVICE_KEYBOARD_MIC:
-		return "KeyboardMic";
-	case CRAS_METRICS_DEVICE_MIC:
-		return "Mic";
-	case CRAS_METRICS_DEVICE_HOTWORD:
-		return "Hotword";
-	case CRAS_METRICS_DEVICE_POST_MIX_LOOPBACK:
-		return "PostMixLoopback";
-	case CRAS_METRICS_DEVICE_POST_DSP_LOOPBACK:
-		return "PostDspLoopback";
-	/* Devices supporting input and output function. */
-	case CRAS_METRICS_DEVICE_USB:
-		return "USB";
-	case CRAS_METRICS_DEVICE_A2DP:
-		return "A2DP";
-	case CRAS_METRICS_DEVICE_HFP:
-		return "HFP";
-	case CRAS_METRICS_DEVICE_HSP:
-		return "HSP";
-	case CRAS_METRICS_DEVICE_BLUETOOTH:
-		return "Bluetooth";
-	case CRAS_METRICS_DEVICE_BLUETOOTH_NB_MIC:
-		return "BluetoothNarrowBandMic";
-	case CRAS_METRICS_DEVICE_BLUETOOTH_WB_MIC:
-		return "BluetoothWideBandMic";
-	case CRAS_METRICS_DEVICE_NO_DEVICE:
-		return "NoDevice";
-	case CRAS_METRICS_DEVICE_ALSA_LOOPBACK:
-		return "AlsaLoopback";
-	/* Other fallback devices. */
-	case CRAS_METRICS_DEVICE_NORMAL_FALLBACK:
-		return "NormalFallback";
-	case CRAS_METRICS_DEVICE_ABNORMAL_FALLBACK:
-		return "AbnormalFallback";
-	case CRAS_METRICS_DEVICE_SILENT_HOTWORD:
-		return "SilentHotword";
-	case CRAS_METRICS_DEVICE_UNKNOWN:
-		return "Unknown";
-	default:
-		return "InvalidType";
-	}
-}
-
-static inline const char *
-metrics_client_type_str(enum CRAS_CLIENT_TYPE client_type)
-{
-	switch (client_type) {
-	case CRAS_CLIENT_TYPE_UNKNOWN:
-		return "Unknown";
-	case CRAS_CLIENT_TYPE_LEGACY:
-		return "Legacy";
-	case CRAS_CLIENT_TYPE_TEST:
-		return "Test";
-	case CRAS_CLIENT_TYPE_PCM:
-		return "PCM";
-	case CRAS_CLIENT_TYPE_CHROME:
-		return "Chrome";
-	case CRAS_CLIENT_TYPE_ARC:
-		return "ARC";
-	case CRAS_CLIENT_TYPE_CROSVM:
-		return "CrOSVM";
-	case CRAS_CLIENT_TYPE_SERVER_STREAM:
-		return "ServerStream";
-	case CRAS_CLIENT_TYPE_LACROS:
-		return "LaCrOS";
-	case CRAS_CLIENT_TYPE_PLUGIN:
-		return "PluginVM";
-	case CRAS_CLIENT_TYPE_ARCVM:
-		return "ARCVM";
-	default:
-		return "InvalidType";
-	}
-}
-
-static inline const char *
-metrics_stream_type_str(enum CRAS_STREAM_TYPE stream_type)
-{
-	switch (stream_type) {
-	case CRAS_STREAM_TYPE_DEFAULT:
-		return "Default";
-	case CRAS_STREAM_TYPE_MULTIMEDIA:
-		return "Multimedia";
-	case CRAS_STREAM_TYPE_VOICE_COMMUNICATION:
-		return "VoiceCommunication";
-	case CRAS_STREAM_TYPE_SPEECH_RECOGNITION:
-		return "SpeechRecognition";
-	case CRAS_STREAM_TYPE_PRO_AUDIO:
-		return "ProAudio";
-	case CRAS_STREAM_TYPE_ACCESSIBILITY:
-		return "Accessibility";
-	default:
-		return "InvalidType";
-	}
-}
-
-static enum CRAS_METRICS_DEVICE_TYPE
-get_metrics_device_type(struct cras_iodev *iodev)
-{
-	/* Check whether it is a special device. */
-	if (iodev->info.idx < MAX_SPECIAL_DEVICE_IDX) {
-		switch (iodev->info.idx) {
-		case NO_DEVICE:
-			syslog(LOG_ERR, "The invalid device has been used.");
-			return CRAS_METRICS_DEVICE_NO_DEVICE;
-		case SILENT_RECORD_DEVICE:
-		case SILENT_PLAYBACK_DEVICE:
-			if (iodev->active_node->type ==
-			    CRAS_NODE_TYPE_FALLBACK_NORMAL)
-				return CRAS_METRICS_DEVICE_NORMAL_FALLBACK;
-			else
-				return CRAS_METRICS_DEVICE_ABNORMAL_FALLBACK;
-		case SILENT_HOTWORD_DEVICE:
-			return CRAS_METRICS_DEVICE_SILENT_HOTWORD;
-		}
-	}
-
-	switch (iodev->active_node->type) {
-	case CRAS_NODE_TYPE_INTERNAL_SPEAKER:
-		return CRAS_METRICS_DEVICE_INTERNAL_SPEAKER;
-	case CRAS_NODE_TYPE_HEADPHONE:
-		return CRAS_METRICS_DEVICE_HEADPHONE;
-	case CRAS_NODE_TYPE_HDMI:
-		return CRAS_METRICS_DEVICE_HDMI;
-	case CRAS_NODE_TYPE_HAPTIC:
-		return CRAS_METRICS_DEVICE_HAPTIC;
-	case CRAS_NODE_TYPE_LINEOUT:
-		return CRAS_METRICS_DEVICE_LINEOUT;
-	case CRAS_NODE_TYPE_MIC:
-		switch (iodev->active_node->position) {
-		case NODE_POSITION_INTERNAL:
-			return CRAS_METRICS_DEVICE_INTERNAL_MIC;
-		case NODE_POSITION_FRONT:
-			return CRAS_METRICS_DEVICE_FRONT_MIC;
-		case NODE_POSITION_REAR:
-			return CRAS_METRICS_DEVICE_REAR_MIC;
-		case NODE_POSITION_KEYBOARD:
-			return CRAS_METRICS_DEVICE_KEYBOARD_MIC;
-		case NODE_POSITION_EXTERNAL:
-		default:
-			return CRAS_METRICS_DEVICE_MIC;
-		}
-	case CRAS_NODE_TYPE_HOTWORD:
-		return CRAS_METRICS_DEVICE_HOTWORD;
-	case CRAS_NODE_TYPE_POST_MIX_PRE_DSP:
-		return CRAS_METRICS_DEVICE_POST_MIX_LOOPBACK;
-	case CRAS_NODE_TYPE_POST_DSP:
-		return CRAS_METRICS_DEVICE_POST_DSP_LOOPBACK;
-	case CRAS_NODE_TYPE_USB:
-		return CRAS_METRICS_DEVICE_USB;
-	case CRAS_NODE_TYPE_BLUETOOTH: {
-#ifdef CRAS_DBUS
-		enum cras_bt_device_profile profile =
-			cras_bt_io_profile_to_log(iodev);
-		switch (profile) {
-		case CRAS_BT_DEVICE_PROFILE_A2DP_SOURCE:
-			return CRAS_METRICS_DEVICE_A2DP;
-		case CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY:
-			/* HFP narrow band has its own node type so we know
-			 * this is wideband mic for sure. */
-			return (iodev->direction == CRAS_STREAM_INPUT) ?
-				       CRAS_METRICS_DEVICE_BLUETOOTH_WB_MIC :
-				       CRAS_METRICS_DEVICE_HFP;
-		case CRAS_BT_DEVICE_PROFILE_HSP_AUDIOGATEWAY:
-			return CRAS_METRICS_DEVICE_HSP;
-		default:
-			break;
-		}
-#endif
-		return CRAS_METRICS_DEVICE_BLUETOOTH;
-	}
-	case CRAS_NODE_TYPE_BLUETOOTH_NB_MIC:
-		return CRAS_METRICS_DEVICE_BLUETOOTH_NB_MIC;
-	case CRAS_NODE_TYPE_ALSA_LOOPBACK:
-		return CRAS_METRICS_DEVICE_ALSA_LOOPBACK;
-	case CRAS_NODE_TYPE_UNKNOWN:
-	default:
-		return CRAS_METRICS_DEVICE_UNKNOWN;
-	}
-}
-
-/*
- * Logs metrics for each group it belongs to. The UMA does not merge subgroups
- * automatically so we need to log them separately.
- *
- * For example, if we call this function with argument (3, 48000,
- * Cras.StreamSamplingRate, Input, Chrome), it will send 48000 to below
- * metrics:
- * Cras.StreamSamplingRate.Input.Chrome
- * Cras.StreamSamplingRate.Input
- * Cras.StreamSamplingRate
- */
-static void log_sparse_histogram_each_level(int num, int sample, ...)
-{
-	char metrics_name[METRICS_NAME_BUFFER_SIZE] = {};
-	va_list valist;
-	int i, len = 0;
-
-	va_start(valist, sample);
-
-	for (i = 0; i < num && len < METRICS_NAME_BUFFER_SIZE; i++) {
-		int metric_len =
-			snprintf(metrics_name + len,
-				 METRICS_NAME_BUFFER_SIZE - len, "%s%s",
-				 i ? "." : "", va_arg(valist, char *));
-		// Exit early on error or running out of bufferspace. Avoids
-		// logging partial or corrupted strings.
-		if (metric_len < 0 ||
-		    metric_len > METRICS_NAME_BUFFER_SIZE - len)
-			break;
-		len += metric_len;
-		cras_metrics_log_sparse_histogram(metrics_name, sample);
-	}
-
-	va_end(valist);
-}
-
-static void log_histogram_each_level(int num, int sample, int min, int max,
-				     int nbuckets, ...)
-{
-	char metrics_name[METRICS_NAME_BUFFER_SIZE] = {};
-	va_list valist;
-	int i, len = 0;
-
-	va_start(valist, nbuckets);
-
-	for (i = 0; i < num && len < METRICS_NAME_BUFFER_SIZE; i++) {
-		int metric_len =
-			snprintf(metrics_name + len,
-				 METRICS_NAME_BUFFER_SIZE - len, "%s%s",
-				 i ? "." : "", va_arg(valist, char *));
-		// Exit early on error or running out of bufferspace. Avoids
-		// logging partial or corrupted strings.
-		if (metric_len < 0 ||
-		    metric_len > METRICS_NAME_BUFFER_SIZE - len)
-			break;
-		len += metric_len;
-		cras_metrics_log_histogram(metrics_name, sample, min, max,
-					   nbuckets);
-	}
-
-	va_end(valist);
-}
-
-int cras_server_metrics_hfp_sco_connection_error(
-	enum CRAS_METRICS_BT_SCO_ERROR_TYPE type)
-{
-	struct cras_server_metrics_message msg;
-	union cras_server_metrics_data data;
-	int err;
-
-	data.value = type;
-	init_server_metrics_msg(&msg, BT_SCO_CONNECTION_ERROR, data);
-
-	err = cras_server_metrics_message_send(
-		(struct cras_main_message *)&msg);
-	if (err < 0) {
-		syslog(LOG_ERR, "Failed to send metrics message: "
-				"BT_SCO_CONNECTION_ERROR");
-		return err;
-	}
-	return 0;
-}
-
-int cras_server_metrics_hfp_battery_indicator(int battery_indicator_support)
-{
-	struct cras_server_metrics_message msg;
-	union cras_server_metrics_data data;
-	int err;
-
-	data.value = battery_indicator_support;
-	init_server_metrics_msg(&msg, BT_BATTERY_INDICATOR_SUPPORTED, data);
-
-	err = cras_server_metrics_message_send(
-		(struct cras_main_message *)&msg);
-	if (err < 0) {
-		syslog(LOG_ERR, "Failed to send metrics message: "
-				"BT_BATTERY_INDICATOR_SUPPORTED");
-		return err;
-	}
-	return 0;
-}
-
-int cras_server_metrics_hfp_battery_report(int battery_report)
-{
-	struct cras_server_metrics_message msg;
-	union cras_server_metrics_data data;
-	int err;
-
-	data.value = battery_report;
-	init_server_metrics_msg(&msg, BT_BATTERY_REPORT, data);
-
-	err = cras_server_metrics_message_send(
-		(struct cras_main_message *)&msg);
-	if (err < 0) {
-		syslog(LOG_ERR, "Failed to send metrics message: "
-				"BT_BATTERY_REPORT");
-		return err;
-	}
-	return 0;
-}
-
-int cras_server_metrics_hfp_packet_loss(float packet_loss_ratio)
-{
-	struct cras_server_metrics_message msg;
-	union cras_server_metrics_data data;
-	int err;
-
-	/* Percentage is too coarse for packet loss, so we use number of bad
-	 * packets per thousand packets instead. */
-	data.value = (unsigned)(round(packet_loss_ratio * 1000));
-	init_server_metrics_msg(&msg, BT_WIDEBAND_PACKET_LOSS, data);
-
-	err = cras_server_metrics_message_send(
-		(struct cras_main_message *)&msg);
-	if (err < 0) {
-		syslog(LOG_ERR,
-		       "Failed to send metrics message: BT_WIDEBAND_PACKET_LOSS");
-		return err;
-	}
-	return 0;
-}
-
-int cras_server_metrics_hfp_wideband_support(bool supported)
-{
-	struct cras_server_metrics_message msg;
-	union cras_server_metrics_data data;
-	int err;
-
-	data.value = supported;
-	init_server_metrics_msg(&msg, BT_WIDEBAND_SUPPORTED, data);
-
-	err = cras_server_metrics_message_send(
-		(struct cras_main_message *)&msg);
-	if (err < 0) {
-		syslog(LOG_ERR,
-		       "Failed to send metrics message: BT_WIDEBAND_SUPPORTED");
-		return err;
-	}
-	return 0;
-}
-
-int cras_server_metrics_hfp_wideband_selected_codec(int codec)
-{
-	struct cras_server_metrics_message msg;
-	union cras_server_metrics_data data;
-	int err;
-
-	data.value = codec;
-	init_server_metrics_msg(&msg, BT_WIDEBAND_SELECTED_CODEC, data);
-
-	err = cras_server_metrics_message_send(
-		(struct cras_main_message *)&msg);
-	if (err < 0) {
-		syslog(LOG_ERR, "Failed to send metrics message: "
-				"BT_WIDEBAND_SELECTED_CODEC");
-		return err;
-	}
-	return 0;
-}
-
-int cras_server_metrics_device_runtime(struct cras_iodev *iodev)
-{
-	struct cras_server_metrics_message msg;
-	union cras_server_metrics_data data;
-	struct timespec now;
-	int err;
-
-	data.device_data.type = get_metrics_device_type(iodev);
-	data.device_data.direction = iodev->direction;
-	clock_gettime(CLOCK_MONOTONIC_RAW, &now);
-	subtract_timespecs(&now, &iodev->open_ts, &data.device_data.runtime);
-
-	init_server_metrics_msg(&msg, DEVICE_RUNTIME, data);
-
-	err = cras_server_metrics_message_send(
-		(struct cras_main_message *)&msg);
-	if (err < 0) {
-		syslog(LOG_ERR,
-		       "Failed to send metrics message: DEVICE_RUNTIME");
-		return err;
-	}
-
-	return 0;
-}
-
-int cras_server_metrics_device_gain(struct cras_iodev *iodev)
-{
-	struct cras_server_metrics_message msg;
-	union cras_server_metrics_data data;
-	int err;
-
-	if (iodev->direction == CRAS_STREAM_OUTPUT)
-		return 0;
-
-	data.device_data.type = get_metrics_device_type(iodev);
-	data.device_data.value =
-		(unsigned)100 * iodev->active_node->ui_gain_scaler;
-
-	init_server_metrics_msg(&msg, DEVICE_GAIN, data);
-
-	err = cras_server_metrics_message_send(
-		(struct cras_main_message *)&msg);
-	if (err < 0) {
-		syslog(LOG_ERR, "Failed to send metrics message: DEVICE_GAIN");
-		return err;
-	}
-
-	return 0;
-}
-
-int cras_server_metrics_device_volume(struct cras_iodev *iodev)
-{
-	struct cras_server_metrics_message msg;
-	union cras_server_metrics_data data;
-	int err;
-
-	if (iodev->direction == CRAS_STREAM_INPUT)
-		return 0;
-
-	data.device_data.type = get_metrics_device_type(iodev);
-	data.device_data.value = iodev->active_node->volume;
-
-	init_server_metrics_msg(&msg, DEVICE_VOLUME, data);
-
-	err = cras_server_metrics_message_send(
-		(struct cras_main_message *)&msg);
-	if (err < 0) {
-		syslog(LOG_ERR,
-		       "Failed to send metrics message: DEVICE_VOLUME");
-		return err;
-	}
-
-	return 0;
-}
-
-int cras_server_metrics_highest_device_delay(
-	unsigned int hw_level, unsigned int largest_cb_level,
-	enum CRAS_STREAM_DIRECTION direction)
-{
-	struct cras_server_metrics_message msg;
-	union cras_server_metrics_data data;
-	int err;
-
-	if (largest_cb_level == 0) {
-		syslog(LOG_ERR,
-		       "Failed to record device delay: devided by zero");
-		return -1;
-	}
-
-	/*
-	 * Because the latency depends on the callback threshold of streams, it
-	 * should be calculated as dividing the highest hardware level by largest
-	 * callback threshold of streams. For output device, this value should fall
-	 * around 2 because CRAS 's scheduling maintain device buffer level around
-	 * 1~2 minimum callback level. For input device, this value should be around
-	 * 1 because the device buffer level is around 0~1 minimum callback level.
-	 * Besides, UMA cannot record float so this ratio is multiplied by 1000.
-	 */
-	data.value = hw_level * 1000 / largest_cb_level;
-
-	switch (direction) {
-	case CRAS_STREAM_INPUT:
-		init_server_metrics_msg(&msg, HIGHEST_DEVICE_DELAY_INPUT, data);
-		break;
-	case CRAS_STREAM_OUTPUT:
-		init_server_metrics_msg(&msg, HIGHEST_DEVICE_DELAY_OUTPUT,
-					data);
-		break;
-	default:
-		return 0;
-	}
-
-	err = cras_server_metrics_message_send(
-		(struct cras_main_message *)&msg);
-	if (err < 0) {
-		syslog(LOG_ERR,
-		       "Failed to send metrics message: HIGHEST_DEVICE_DELAY");
-		return err;
-	}
-
-	return 0;
-}
-
-int cras_server_metrics_highest_hw_level(unsigned hw_level,
-					 enum CRAS_STREAM_DIRECTION direction)
-{
-	struct cras_server_metrics_message msg;
-	union cras_server_metrics_data data;
-	int err;
-
-	data.value = hw_level;
-
-	switch (direction) {
-	case CRAS_STREAM_INPUT:
-		init_server_metrics_msg(&msg, HIGHEST_INPUT_HW_LEVEL, data);
-		break;
-	case CRAS_STREAM_OUTPUT:
-		init_server_metrics_msg(&msg, HIGHEST_OUTPUT_HW_LEVEL, data);
-		break;
-	default:
-		return 0;
-	}
-
-	err = cras_server_metrics_message_send(
-		(struct cras_main_message *)&msg);
-	if (err < 0) {
-		syslog(LOG_ERR,
-		       "Failed to send metrics message: HIGHEST_HW_LEVEL");
-		return err;
-	}
-
-	return 0;
-}
-
-/* Logs longest fetch delay of a stream. */
-int cras_server_metrics_longest_fetch_delay(const struct cras_rstream *stream)
-{
-	struct cras_server_metrics_message msg;
-	union cras_server_metrics_data data;
-	int err;
-
-	data.stream_data.client_type = stream->client_type;
-	data.stream_data.stream_type = stream->stream_type;
-	data.stream_data.direction = stream->direction;
-
-	/*
-	 * There is no delay when the sleep_interval_ts larger than the
-	 * longest_fetch_interval.
-	 */
-	if (!timespec_after(&stream->longest_fetch_interval,
-			    &stream->sleep_interval_ts)) {
-		data.stream_data.runtime.tv_sec = 0;
-		data.stream_data.runtime.tv_nsec = 0;
-	} else {
-		subtract_timespecs(&stream->longest_fetch_interval,
-				   &stream->sleep_interval_ts,
-				   &data.stream_data.runtime);
-	}
-
-	init_server_metrics_msg(&msg, LONGEST_FETCH_DELAY, data);
-	err = cras_server_metrics_message_send(
-		(struct cras_main_message *)&msg);
-	if (err < 0) {
-		syslog(LOG_ERR,
-		       "Failed to send metrics message: LONGEST_FETCH_DELAY");
-		return err;
-	}
-
-	return 0;
-}
-
-int cras_server_metrics_num_underruns(unsigned num_underruns)
-{
-	struct cras_server_metrics_message msg;
-	union cras_server_metrics_data data;
-	int err;
-
-	data.value = num_underruns;
-	init_server_metrics_msg(&msg, NUM_UNDERRUNS, data);
-	err = cras_server_metrics_message_send(
-		(struct cras_main_message *)&msg);
-	if (err < 0) {
-		syslog(LOG_ERR,
-		       "Failed to send metrics message: NUM_UNDERRUNS");
-		return err;
-	}
-
-	return 0;
-}
-
-/* Logs the frequency of missed callback. */
-static int
-cras_server_metrics_missed_cb_frequency(const struct cras_rstream *stream)
-{
-	struct cras_server_metrics_message msg;
-	union cras_server_metrics_data data;
-	struct timespec now, time_since;
-	double seconds, frequency;
-	int err;
-
-	clock_gettime(CLOCK_MONOTONIC_RAW, &now);
-	subtract_timespecs(&now, &stream->start_ts, &time_since);
-	seconds = (double)time_since.tv_sec + time_since.tv_nsec / 1000000000.0;
-
-	/* Ignore streams which do not have enough runtime. */
-	if (seconds < MISSED_CB_FREQUENCY_SECONDS_MIN)
-		return 0;
-
-	/* Compute how many callbacks are missed in a day. */
-	frequency = (double)stream->num_missed_cb * 86400.0 / seconds;
-	data.value = (unsigned)(round(frequency) + 1e-9);
-
-	if (stream->direction == CRAS_STREAM_INPUT)
-		init_server_metrics_msg(&msg, MISSED_CB_FREQUENCY_INPUT, data);
-	else
-		init_server_metrics_msg(&msg, MISSED_CB_FREQUENCY_OUTPUT, data);
-
-	err = cras_server_metrics_message_send(
-		(struct cras_main_message *)&msg);
-	if (err < 0) {
-		syslog(LOG_ERR,
-		       "Failed to send metrics message: MISSED_CB_FREQUENCY");
-		return err;
-	}
-
-	/*
-	 * If missed callback happened at least once, also record frequncy after
-	 * rescheduling.
-	 */
-	if (!stream->num_missed_cb)
-		return 0;
-
-	subtract_timespecs(&now, &stream->first_missed_cb_ts, &time_since);
-	seconds = (double)time_since.tv_sec + time_since.tv_nsec / 1000000000.0;
-
-	/* Compute how many callbacks are missed in a day. */
-	frequency = (double)(stream->num_missed_cb - 1) * 86400.0 / seconds;
-	data.value = (unsigned)(round(frequency) + 1e-9);
-
-	if (stream->direction == CRAS_STREAM_INPUT) {
-		init_server_metrics_msg(
-			&msg, MISSED_CB_FREQUENCY_AFTER_RESCHEDULING_INPUT,
-			data);
-	} else {
-		init_server_metrics_msg(
-			&msg, MISSED_CB_FREQUENCY_AFTER_RESCHEDULING_OUTPUT,
-			data);
-	}
-
-	err = cras_server_metrics_message_send(
-		(struct cras_main_message *)&msg);
-	if (err < 0) {
-		syslog(LOG_ERR,
-		       "Failed to send metrics message: MISSED_CB_FREQUENCY");
-		return err;
-	}
-
-	return 0;
-}
-
-/*
- * Logs the duration between stream starting time and the first missed
- * callback.
- */
-static int
-cras_server_metrics_missed_cb_first_time(const struct cras_rstream *stream)
-{
-	struct cras_server_metrics_message msg;
-	union cras_server_metrics_data data;
-	struct timespec time_since;
-	int err;
-
-	subtract_timespecs(&stream->first_missed_cb_ts, &stream->start_ts,
-			   &time_since);
-	data.value = (unsigned)time_since.tv_sec;
-
-	if (stream->direction == CRAS_STREAM_INPUT) {
-		init_server_metrics_msg(&msg, MISSED_CB_FIRST_TIME_INPUT, data);
-	} else {
-		init_server_metrics_msg(&msg, MISSED_CB_FIRST_TIME_OUTPUT,
-					data);
-	}
-	err = cras_server_metrics_message_send(
-		(struct cras_main_message *)&msg);
-	if (err < 0) {
-		syslog(LOG_ERR, "Failed to send metrics message: "
-				"MISSED_CB_FIRST_TIME");
-		return err;
-	}
-
-	return 0;
-}
-
-/* Logs the duration between the first and the second missed callback events. */
-static int
-cras_server_metrics_missed_cb_second_time(const struct cras_rstream *stream)
-{
-	struct cras_server_metrics_message msg;
-	union cras_server_metrics_data data;
-	struct timespec now, time_since;
-	int err;
-
-	clock_gettime(CLOCK_MONOTONIC_RAW, &now);
-	subtract_timespecs(&now, &stream->first_missed_cb_ts, &time_since);
-	data.value = (unsigned)time_since.tv_sec;
-
-	if (stream->direction == CRAS_STREAM_INPUT) {
-		init_server_metrics_msg(&msg, MISSED_CB_SECOND_TIME_INPUT,
-					data);
-	} else {
-		init_server_metrics_msg(&msg, MISSED_CB_SECOND_TIME_OUTPUT,
-					data);
-	}
-	err = cras_server_metrics_message_send(
-		(struct cras_main_message *)&msg);
-	if (err < 0) {
-		syslog(LOG_ERR, "Failed to send metrics message: "
-				"MISSED_CB_SECOND_TIME");
-		return err;
-	}
-
-	return 0;
-}
-
-int cras_server_metrics_missed_cb_event(struct cras_rstream *stream)
-{
-	int rc = 0;
-
-	stream->num_missed_cb += 1;
-	if (stream->num_missed_cb == 1)
-		clock_gettime(CLOCK_MONOTONIC_RAW, &stream->first_missed_cb_ts);
-
-	/* Do not record missed cb if the stream has these flags. */
-	if (stream->flags & (BULK_AUDIO_OK | USE_DEV_TIMING | TRIGGER_ONLY))
-		return 0;
-
-	/* Only record the first and the second events. */
-	if (stream->num_missed_cb == 1)
-		rc = cras_server_metrics_missed_cb_first_time(stream);
-	else if (stream->num_missed_cb == 2)
-		rc = cras_server_metrics_missed_cb_second_time(stream);
-
-	return rc;
-}
-
-/* Logs the stream configurations from clients. */
-static int
-cras_server_metrics_stream_config(const struct cras_rstream_config *config)
-{
-	struct cras_server_metrics_message msg;
-	union cras_server_metrics_data data;
-	int err;
-
-	data.stream_config.direction = config->direction;
-	data.stream_config.cb_threshold = (unsigned)config->cb_threshold;
-	data.stream_config.flags = (unsigned)config->flags;
-	data.stream_config.effects = (unsigned)config->effects;
-	data.stream_config.format = (int)config->format->format;
-	data.stream_config.rate = (unsigned)config->format->frame_rate;
-	data.stream_config.client_type = config->client_type;
-
-	init_server_metrics_msg(&msg, STREAM_CONFIG, data);
-	err = cras_server_metrics_message_send(
-		(struct cras_main_message *)&msg);
-	if (err < 0) {
-		syslog(LOG_ERR,
-		       "Failed to send metrics message: STREAM_CONFIG");
-		return err;
-	}
-
-	return 0;
-}
-
-/* Logs runtime of a stream. */
-int cras_server_metrics_stream_runtime(const struct cras_rstream *stream)
-{
-	struct cras_server_metrics_message msg;
-	union cras_server_metrics_data data;
-	struct timespec now;
-	int err;
-
-	data.stream_data.client_type = stream->client_type;
-	data.stream_data.stream_type = stream->stream_type;
-	data.stream_data.direction = stream->direction;
-	clock_gettime(CLOCK_MONOTONIC_RAW, &now);
-	subtract_timespecs(&now, &stream->start_ts, &data.stream_data.runtime);
-
-	init_server_metrics_msg(&msg, STREAM_RUNTIME, data);
-
-	err = cras_server_metrics_message_send(
-		(struct cras_main_message *)&msg);
-	if (err < 0) {
-		syslog(LOG_ERR,
-		       "Failed to send metrics message: STREAM_RUNTIME");
-		return err;
-	}
-
-	return 0;
-}
-
-int cras_server_metrics_stream_create(const struct cras_rstream_config *config)
-{
-	return cras_server_metrics_stream_config(config);
-}
-
-int cras_server_metrics_stream_destroy(const struct cras_rstream *stream)
-{
-	int rc;
-	rc = cras_server_metrics_missed_cb_frequency(stream);
-	if (rc < 0)
-		return rc;
-	rc = cras_server_metrics_stream_runtime(stream);
-	if (rc < 0)
-		return rc;
-	return cras_server_metrics_longest_fetch_delay(stream);
-}
-
-int cras_server_metrics_busyloop(struct timespec *ts, unsigned count)
-{
-	struct cras_server_metrics_message msg;
-	union cras_server_metrics_data data;
-	int err;
-
-	data.timespec_data.runtime = *ts;
-	data.timespec_data.count = count;
-
-	init_server_metrics_msg(&msg, BUSYLOOP, data);
-
-	err = cras_server_metrics_message_send(
-		(struct cras_main_message *)&msg);
-	if (err < 0) {
-		syslog(LOG_ERR, "Failed to send metrics message: BUSYLOOP");
-		return err;
-	}
-	return 0;
-}
-
-int cras_server_metrics_busyloop_length(unsigned length)
-{
-	struct cras_server_metrics_message msg;
-	union cras_server_metrics_data data;
-	int err;
-
-	data.value = length;
-
-	init_server_metrics_msg(&msg, BUSYLOOP_LENGTH, data);
-
-	err = cras_server_metrics_message_send(
-		(struct cras_main_message *)&msg);
-	if (err < 0) {
-		syslog(LOG_ERR,
-		       "Failed to send metrics message: BUSYLOOP_LENGTH");
-		return err;
-	}
-	return 0;
-}
-
-static void metrics_device_runtime(struct cras_server_metrics_device_data data)
-{
-	char metrics_name[METRICS_NAME_BUFFER_SIZE];
-
-	snprintf(metrics_name, METRICS_NAME_BUFFER_SIZE,
-		 "Cras.%sDevice%sRuntime",
-		 data.direction == CRAS_STREAM_INPUT ? "Input" : "Output",
-		 metrics_device_type_str(data.type));
-	cras_metrics_log_histogram(metrics_name, (unsigned)data.runtime.tv_sec,
-				   0, 10000, 20);
-
-	/* Logs the usage of each device. */
-	if (data.direction == CRAS_STREAM_INPUT)
-		cras_metrics_log_sparse_histogram(kDeviceTypeInput, data.type);
-	else
-		cras_metrics_log_sparse_histogram(kDeviceTypeOutput, data.type);
-}
-
-static void metrics_device_gain(struct cras_server_metrics_device_data data)
-{
-	char metrics_name[METRICS_NAME_BUFFER_SIZE];
-
-	snprintf(metrics_name, METRICS_NAME_BUFFER_SIZE, "%s.%s", kDeviceGain,
-		 metrics_device_type_str(data.type));
-	cras_metrics_log_histogram(metrics_name, data.value, 0, 2000, 20);
-}
-
-static void metrics_device_volume(struct cras_server_metrics_device_data data)
-{
-	char metrics_name[METRICS_NAME_BUFFER_SIZE];
-
-	snprintf(metrics_name, METRICS_NAME_BUFFER_SIZE, "%s.%s", kDeviceVolume,
-		 metrics_device_type_str(data.type));
-	cras_metrics_log_histogram(metrics_name, data.value, 0, 100, 20);
-}
-
-static void
-metrics_longest_fetch_delay(struct cras_server_metrics_stream_data data)
-{
-	int fetch_delay_msec =
-		data.runtime.tv_sec * 1000 + data.runtime.tv_nsec / 1000000;
-	log_histogram_each_level(3, fetch_delay_msec, 0, 10000, 20,
-				 kFetchDelayMilliSeconds,
-				 metrics_client_type_str(data.client_type),
-				 metrics_stream_type_str(data.stream_type));
-}
-
-static void metrics_stream_runtime(struct cras_server_metrics_stream_data data)
-{
-	log_histogram_each_level(
-		4, (int)data.runtime.tv_sec, 0, 10000, 20, kStreamRuntime,
-		data.direction == CRAS_STREAM_INPUT ? "Input" : "Output",
-		metrics_client_type_str(data.client_type),
-		metrics_stream_type_str(data.stream_type));
-}
-
-static void metrics_busyloop(struct cras_server_metrics_timespec_data data)
-{
-	char metrics_name[METRICS_NAME_BUFFER_SIZE];
-
-	snprintf(metrics_name, METRICS_NAME_BUFFER_SIZE, "%s.%s", kBusyloop,
-		 get_timespec_period_str(data.runtime));
-
-	cras_metrics_log_histogram(metrics_name, data.count, 0, 1000, 20);
-}
-
-static void
-metrics_stream_config(struct cras_server_metrics_stream_config config)
-{
-	const char *direction;
-
-	if (config.direction == CRAS_STREAM_INPUT)
-		direction = "Input";
-	else
-		direction = "Output";
-
-	/* Logs stream callback threshold. */
-	log_sparse_histogram_each_level(
-		3, config.cb_threshold, kStreamCallbackThreshold, direction,
-		metrics_client_type_str(config.client_type));
-
-	/* Logs stream flags. */
-	log_sparse_histogram_each_level(
-		3, config.flags, kStreamFlags, direction,
-		metrics_client_type_str(config.client_type));
-
-	/* Logs stream effects. */
-	log_sparse_histogram_each_level(
-		3, config.effects, kStreamEffects, direction,
-		metrics_client_type_str(config.client_type));
-
-	/* Logs stream sampling format. */
-	log_sparse_histogram_each_level(
-		3, config.format, kStreamSamplingFormat, direction,
-		metrics_client_type_str(config.client_type));
-
-	/* Logs stream sampling rate. */
-	log_sparse_histogram_each_level(
-		3, config.rate, kStreamSamplingRate, direction,
-		metrics_client_type_str(config.client_type));
-
-	/* Logs stream client type. */
-	if (config.direction == CRAS_STREAM_INPUT)
-		cras_metrics_log_sparse_histogram(kStreamClientTypeInput,
-						  config.client_type);
-	else
-		cras_metrics_log_sparse_histogram(kStreamClientTypeOutput,
-						  config.client_type);
-}
-
-static void handle_metrics_message(struct cras_main_message *msg, void *arg)
-{
-	struct cras_server_metrics_message *metrics_msg =
-		(struct cras_server_metrics_message *)msg;
-	switch (metrics_msg->metrics_type) {
-	case BT_SCO_CONNECTION_ERROR:
-		cras_metrics_log_sparse_histogram(kHfpScoConnectionError,
-						  metrics_msg->data.value);
-		break;
-	case BT_BATTERY_INDICATOR_SUPPORTED:
-		cras_metrics_log_sparse_histogram(kHfpBatteryIndicatorSupported,
-						  metrics_msg->data.value);
-		break;
-	case BT_BATTERY_REPORT:
-		cras_metrics_log_sparse_histogram(kHfpBatteryReport,
-						  metrics_msg->data.value);
-		break;
-	case BT_WIDEBAND_PACKET_LOSS:
-		cras_metrics_log_histogram(kHfpWidebandSpeechPacketLoss,
-					   metrics_msg->data.value, 0, 1000,
-					   20);
-		break;
-	case BT_WIDEBAND_SUPPORTED:
-		cras_metrics_log_sparse_histogram(kHfpWidebandSpeechSupported,
-						  metrics_msg->data.value);
-		break;
-	case BT_WIDEBAND_SELECTED_CODEC:
-		cras_metrics_log_sparse_histogram(
-			kHfpWidebandSpeechSelectedCodec,
-			metrics_msg->data.value);
-		break;
-	case DEVICE_GAIN:
-		metrics_device_gain(metrics_msg->data.device_data);
-		break;
-	case DEVICE_RUNTIME:
-		metrics_device_runtime(metrics_msg->data.device_data);
-		break;
-	case DEVICE_VOLUME:
-		metrics_device_volume(metrics_msg->data.device_data);
-		break;
-	case HIGHEST_DEVICE_DELAY_INPUT:
-		cras_metrics_log_histogram(kHighestDeviceDelayInput,
-					   metrics_msg->data.value, 1, 10000,
-					   20);
-		break;
-	case HIGHEST_DEVICE_DELAY_OUTPUT:
-		cras_metrics_log_histogram(kHighestDeviceDelayOutput,
-					   metrics_msg->data.value, 1, 10000,
-					   20);
-		break;
-	case HIGHEST_INPUT_HW_LEVEL:
-		cras_metrics_log_histogram(kHighestInputHardwareLevel,
-					   metrics_msg->data.value, 1, 10000,
-					   20);
-		break;
-	case HIGHEST_OUTPUT_HW_LEVEL:
-		cras_metrics_log_histogram(kHighestOutputHardwareLevel,
-					   metrics_msg->data.value, 1, 10000,
-					   20);
-		break;
-	case LONGEST_FETCH_DELAY:
-		metrics_longest_fetch_delay(metrics_msg->data.stream_data);
-		break;
-	case MISSED_CB_FIRST_TIME_INPUT:
-		cras_metrics_log_histogram(kMissedCallbackFirstTimeInput,
-					   metrics_msg->data.value, 0, 90000,
-					   20);
-		break;
-	case MISSED_CB_FIRST_TIME_OUTPUT:
-		cras_metrics_log_histogram(kMissedCallbackFirstTimeOutput,
-					   metrics_msg->data.value, 0, 90000,
-					   20);
-		break;
-	case MISSED_CB_FREQUENCY_INPUT:
-		cras_metrics_log_histogram(kMissedCallbackFrequencyInput,
-					   metrics_msg->data.value, 0, 90000,
-					   20);
-		break;
-	case MISSED_CB_FREQUENCY_OUTPUT:
-		cras_metrics_log_histogram(kMissedCallbackFrequencyOutput,
-					   metrics_msg->data.value, 0, 90000,
-					   20);
-		break;
-	case MISSED_CB_FREQUENCY_AFTER_RESCHEDULING_INPUT:
-		cras_metrics_log_histogram(
-			kMissedCallbackFrequencyAfterReschedulingInput,
-			metrics_msg->data.value, 0, 90000, 20);
-		break;
-	case MISSED_CB_FREQUENCY_AFTER_RESCHEDULING_OUTPUT:
-		cras_metrics_log_histogram(
-			kMissedCallbackFrequencyAfterReschedulingOutput,
-			metrics_msg->data.value, 0, 90000, 20);
-		break;
-	case MISSED_CB_SECOND_TIME_INPUT:
-		cras_metrics_log_histogram(kMissedCallbackSecondTimeInput,
-					   metrics_msg->data.value, 0, 90000,
-					   20);
-		break;
-	case MISSED_CB_SECOND_TIME_OUTPUT:
-		cras_metrics_log_histogram(kMissedCallbackSecondTimeOutput,
-					   metrics_msg->data.value, 0, 90000,
-					   20);
-		break;
-	case NUM_UNDERRUNS:
-		cras_metrics_log_histogram(kUnderrunsPerDevice,
-					   metrics_msg->data.value, 0, 1000,
-					   10);
-		break;
-	case STREAM_CONFIG:
-		metrics_stream_config(metrics_msg->data.stream_config);
-		break;
-	case STREAM_RUNTIME:
-		metrics_stream_runtime(metrics_msg->data.stream_data);
-		break;
-	case BUSYLOOP:
-		metrics_busyloop(metrics_msg->data.timespec_data);
-		break;
-	case BUSYLOOP_LENGTH:
-		cras_metrics_log_histogram(
-			kBusyloopLength, metrics_msg->data.value, 0, 1000, 50);
-		break;
-	default:
-		syslog(LOG_ERR, "Unknown metrics type %u",
-		       metrics_msg->metrics_type);
-		break;
-	}
-}
-
-int cras_server_metrics_init()
-{
-	cras_main_message_add_handler(CRAS_MAIN_METRICS, handle_metrics_message,
-				      NULL);
-	return 0;
-}
diff --git a/cras/src/server/cras_server_metrics.h b/cras/src/server/cras_server_metrics.h
deleted file mode 100644
index e845808..0000000
--- a/cras/src/server/cras_server_metrics.h
+++ /dev/null
@@ -1,88 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_SERVER_METRICS_H_
-#define CRAS_SERVER_METRICS_H_
-
-#include <stdbool.h>
-
-#include "cras_iodev.h"
-#include "cras_rstream.h"
-
-extern const char kNoCodecsFoundMetric[];
-
-enum CRAS_METRICS_BT_SCO_ERROR_TYPE {
-	CRAS_METRICS_SCO_SKT_SUCCESS = 0,
-	CRAS_METRICS_SCO_SKT_CONNECT_ERROR = 1,
-	CRAS_METRICS_SCO_SKT_OPEN_ERROR = 2,
-	CRAS_METRICS_SCO_SKT_POLL_TIMEOUT = 3,
-	CRAS_METRICS_SCO_SKT_POLL_ERR_HUP = 4,
-};
-
-/* Logs the error type happens when setting up SCO connection. This is mainly
- * used to track whether the setup of SCO connection succeeds and the frequency
- * of different errors. This will also be used to track if our fixes for these
- * errors address the issues we find.
- */
-int cras_server_metrics_hfp_sco_connection_error(
-	enum CRAS_METRICS_BT_SCO_ERROR_TYPE type);
-
-/* Logs an enum representing which spec does HFP headset supports battery
- * indicator. Apple, HFP, none or both. */
-int cras_server_metrics_hfp_battery_indicator(int battery_indicator_support);
-
-/* Logs an enum representing the spec through which the battery level change
- * event reported. Apple or HFP.*/
-int cras_server_metrics_hfp_battery_report(int battery_report);
-
-/* Logs if connected HFP headset supports wideband speech. */
-int cras_server_metrics_hfp_wideband_support(bool supported);
-
-/* Logs the selected codec in HFP wideband connection. */
-int cras_server_metrics_hfp_wideband_selected_codec(int codec);
-
-/* Logs the number of packet loss per 1000 packets under HFP capture. */
-int cras_server_metrics_hfp_packet_loss(float packet_loss_ratio);
-
-/* Logs runtime of a device. */
-int cras_server_metrics_device_runtime(struct cras_iodev *iodev);
-
-/* Logs the gain of a device. */
-int cras_server_metrics_device_gain(struct cras_iodev *iodev);
-
-/* Logs the volume of a device. */
-int cras_server_metrics_device_volume(struct cras_iodev *iodev);
-
-/* Logs the highest delay time of a device. */
-int cras_server_metrics_highest_device_delay(
-	unsigned int hw_level, unsigned int largest_cb_level,
-	enum CRAS_STREAM_DIRECTION direction);
-
-/* Logs the highest hardware level of a device. */
-int cras_server_metrics_highest_hw_level(unsigned hw_level,
-					 enum CRAS_STREAM_DIRECTION direction);
-
-/* Logs the number of underruns of a device. */
-int cras_server_metrics_num_underruns(unsigned num_underruns);
-
-/* Logs the missed callback event. */
-int cras_server_metrics_missed_cb_event(struct cras_rstream *stream);
-
-/* Logs information when a stream creates. */
-int cras_server_metrics_stream_create(const struct cras_rstream_config *config);
-
-/* Logs information when a stream destroys. */
-int cras_server_metrics_stream_destroy(const struct cras_rstream *stream);
-
-/* Logs the number of busyloops for different time periods. */
-int cras_server_metrics_busyloop(struct timespec *ts, unsigned count);
-
-/* Logs the length of busyloops. */
-int cras_server_metrics_busyloop_length(unsigned length);
-
-/* Initialize metrics logging stuff. */
-int cras_server_metrics_init();
-
-#endif /* CRAS_SERVER_METRICS_H_ */
diff --git a/cras/src/server/cras_system_state.c b/cras/src/server/cras_system_state.c
deleted file mode 100644
index 366afb5..0000000
--- a/cras/src/server/cras_system_state.c
+++ /dev/null
@@ -1,714 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <errno.h>
-#include <fcntl.h>
-#include <pthread.h>
-#include <string.h>
-#include <stdlib.h>
-#include <sys/mman.h>
-#include <sys/param.h>
-#include <sys/stat.h>
-#include <syslog.h>
-
-#include "cras_alsa_card.h"
-#include "cras_alert.h"
-#include "cras_board_config.h"
-#include "cras_config.h"
-#include "cras_device_blocklist.h"
-#include "cras_iodev_list.h"
-#include "cras_observer.h"
-#include "cras_shm.h"
-#include "cras_system_state.h"
-#include "cras_tm.h"
-#include "cras_types.h"
-#include "cras_util.h"
-#include "utlist.h"
-
-struct card_list {
-	struct cras_alsa_card *card;
-	struct card_list *prev, *next;
-};
-
-struct name_list {
-	char name[NAME_MAX];
-	struct name_list *prev, *next;
-};
-
-/* The system state.
- * Members:
- *    exp_state - The exported system state shared with clients.
- *    shm_name - Name of posix shm region for exported state.
- *    shm_fd - fd for shm area of system_state struct.
- *    shm_fd_ro - fd for shm area of system_state struct, opened read-only.
- *        This copy is to dup and pass to clients.
- *    shm_size - Size of the shm area.
- *    device_config_dir - Directory of device configs where volume curves live.
- *    internal_ucm_suffix - The suffix to append to internal card name to
- *        control which ucm config file to load.
- *    device_blocklist - Blocklist of device the server will ignore.
- *    cards - A list of active sound cards in the system.
- *    update_lock - Protects the update_count, as audio threads can update the
- *      stream count.
- *    tm - The system-wide timer manager.
- *    add_task - Function to handle adding a task for main thread to execute.
- *    task_data - Data to be passed to add_task handler function.
- *    main_thread_tid - The thread id of the main thread.
- *    bt_fix_a2dp_packet_size - The flag to override A2DP packet size set by
- *      Blueetoh peer devices to a smaller default value.
- */
-static struct {
-	struct cras_server_state *exp_state;
-	char shm_name[NAME_MAX];
-	int shm_fd;
-	int shm_fd_ro;
-	size_t shm_size;
-	const char *device_config_dir;
-	const char *internal_ucm_suffix;
-	struct name_list *ignore_suffix_cards;
-	struct cras_device_blocklist *device_blocklist;
-	struct card_list *cards;
-	pthread_mutex_t update_lock;
-	struct cras_tm *tm;
-	/* Select loop callback registration. */
-	int (*fd_add)(int fd, void (*cb)(void *data, int events), void *cb_data,
-		      int events, void *select_data);
-	void (*fd_rm)(int fd, void *select_data);
-	void *select_data;
-	int (*add_task)(void (*callback)(void *data), void *callback_data,
-			void *task_data);
-	void *task_data;
-	struct cras_audio_thread_snapshot_buffer snapshot_buffer;
-	pthread_t main_thread_tid;
-	bool bt_fix_a2dp_packet_size;
-} state;
-
-/* The string format is CARD1,CARD2,CARD3. Divide it into a list. */
-void init_ignore_suffix_cards(char *str)
-{
-	struct name_list *card;
-	char *ptr;
-
-	state.ignore_suffix_cards = NULL;
-
-	if (str == NULL)
-		return;
-
-	ptr = strtok(str, ",");
-	while (ptr != NULL) {
-		card = (struct name_list *)calloc(1, sizeof(*card));
-		if (!card) {
-			syslog(LOG_ERR, "Failed to call calloc: %d", errno);
-			return;
-		}
-		strncpy(card->name, ptr, NAME_MAX - 1);
-		DL_APPEND(state.ignore_suffix_cards, card);
-		ptr = strtok(NULL, ",");
-	}
-}
-
-void deinit_ignore_suffix_cards()
-{
-	struct name_list *card;
-	DL_FOREACH (state.ignore_suffix_cards, card) {
-		DL_DELETE(state.ignore_suffix_cards, card);
-		free(card);
-	}
-}
-
-/*
- * Exported Interface.
- */
-
-void cras_system_state_init(const char *device_config_dir, const char *shm_name,
-			    int rw_shm_fd, int ro_shm_fd,
-			    struct cras_server_state *exp_state,
-			    size_t exp_state_size)
-{
-	struct cras_board_config board_config;
-	int rc;
-
-	assert(sizeof(*exp_state) == exp_state_size);
-	state.shm_size = sizeof(*exp_state);
-
-	strncpy(state.shm_name, shm_name, sizeof(state.shm_name));
-	state.shm_name[sizeof(state.shm_name) - 1] = '\0';
-	state.shm_fd = rw_shm_fd;
-	state.shm_fd_ro = ro_shm_fd;
-
-	/* Read board config. */
-	memset(&board_config, 0, sizeof(board_config));
-	cras_board_config_get(device_config_dir, &board_config);
-
-	/* Initial system state. */
-	exp_state->state_version = CRAS_SERVER_STATE_VERSION;
-	exp_state->volume = CRAS_MAX_SYSTEM_VOLUME;
-	exp_state->mute = 0;
-	exp_state->mute_locked = 0;
-	exp_state->suspended = 0;
-	exp_state->capture_mute = 0;
-	exp_state->capture_mute_locked = 0;
-	exp_state->min_volume_dBFS = DEFAULT_MIN_VOLUME_DBFS;
-	exp_state->max_volume_dBFS = DEFAULT_MAX_VOLUME_DBFS;
-	exp_state->num_streams_attached = 0;
-	exp_state->default_output_buffer_size =
-		board_config.default_output_buffer_size;
-	exp_state->aec_supported = board_config.aec_supported;
-	exp_state->aec_group_id = board_config.aec_group_id;
-	exp_state->bt_wbs_enabled = board_config.bt_wbs_enabled;
-	exp_state->deprioritize_bt_wbs_mic =
-		board_config.deprioritize_bt_wbs_mic;
-	exp_state->noise_cancellation_enabled = 0;
-	exp_state->hotword_pause_at_suspend =
-		board_config.hotword_pause_at_suspend;
-
-	if ((rc = pthread_mutex_init(&state.update_lock, 0) != 0)) {
-		syslog(LOG_ERR, "Fatal: system state mutex init");
-		exit(rc);
-	}
-
-	state.exp_state = exp_state;
-
-	/* Directory for volume curve configs.
-	 * Note that device_config_dir does not affect device blocklist.
-	 * Device blocklist is common to all boards so we do not need
-	 * to change device blocklist at run time. */
-	state.device_config_dir = device_config_dir;
-	state.internal_ucm_suffix = NULL;
-	init_ignore_suffix_cards(board_config.ucm_ignore_suffix);
-	free(board_config.ucm_ignore_suffix);
-
-	state.tm = cras_tm_init();
-	if (!state.tm) {
-		syslog(LOG_ERR, "Fatal: system state timer init");
-		exit(-ENOMEM);
-	}
-
-	/* Read config file for blocklisted devices. */
-	state.device_blocklist =
-		cras_device_blocklist_create(CRAS_CONFIG_FILE_DIR);
-
-	/* Initialize snapshot buffer memory */
-	memset(&state.snapshot_buffer, 0,
-	       sizeof(struct cras_audio_thread_snapshot_buffer));
-
-	/* Save thread id of the main thread. */
-	state.main_thread_tid = pthread_self();
-
-	state.bt_fix_a2dp_packet_size = false;
-}
-
-void cras_system_state_set_internal_ucm_suffix(const char *internal_ucm_suffix)
-{
-	state.internal_ucm_suffix = internal_ucm_suffix;
-}
-
-void cras_system_state_deinit()
-{
-	/* Free any resources used.  This prevents unit tests from leaking. */
-
-	cras_device_blocklist_destroy(state.device_blocklist);
-
-	cras_tm_deinit(state.tm);
-
-	if (state.exp_state) {
-		munmap(state.exp_state, state.shm_size);
-		cras_shm_close_unlink(state.shm_name, state.shm_fd);
-		if (state.shm_fd_ro != state.shm_fd)
-			close(state.shm_fd_ro);
-	}
-
-	deinit_ignore_suffix_cards();
-	pthread_mutex_destroy(&state.update_lock);
-}
-
-void cras_system_set_volume(size_t volume)
-{
-	if (volume > CRAS_MAX_SYSTEM_VOLUME)
-		syslog(LOG_DEBUG, "system volume set out of range %zu", volume);
-
-	state.exp_state->volume = MIN(volume, CRAS_MAX_SYSTEM_VOLUME);
-	cras_observer_notify_output_volume(state.exp_state->volume);
-}
-
-size_t cras_system_get_volume()
-{
-	return state.exp_state->volume;
-}
-
-void cras_system_notify_mute(void)
-{
-	cras_observer_notify_output_mute(state.exp_state->mute,
-					 state.exp_state->user_mute,
-					 state.exp_state->mute_locked);
-}
-
-void cras_system_set_user_mute(int mute)
-{
-	int current_mute = cras_system_get_mute();
-
-	if (state.exp_state->user_mute == !!mute)
-		return;
-
-	state.exp_state->user_mute = !!mute;
-
-	if (current_mute == (mute || state.exp_state->mute))
-		return;
-
-	cras_system_notify_mute();
-}
-
-void cras_system_set_mute(int mute)
-{
-	int current_mute = cras_system_get_mute();
-
-	if (state.exp_state->mute_locked)
-		return;
-
-	if (state.exp_state->mute == !!mute)
-		return;
-
-	state.exp_state->mute = !!mute;
-
-	if (current_mute == (mute || state.exp_state->user_mute))
-		return;
-
-	cras_system_notify_mute();
-}
-
-void cras_system_set_mute_locked(int locked)
-{
-	if (state.exp_state->mute_locked == !!locked)
-		return;
-
-	state.exp_state->mute_locked = !!locked;
-}
-
-int cras_system_get_mute()
-{
-	return state.exp_state->mute || state.exp_state->user_mute;
-}
-
-int cras_system_get_user_mute()
-{
-	return state.exp_state->user_mute;
-}
-
-int cras_system_get_system_mute()
-{
-	return state.exp_state->mute;
-}
-
-int cras_system_get_mute_locked()
-{
-	return state.exp_state->mute_locked;
-}
-
-void cras_system_notify_capture_mute(void)
-{
-	cras_observer_notify_capture_mute(state.exp_state->capture_mute,
-					  state.exp_state->capture_mute_locked);
-}
-
-void cras_system_set_capture_mute(int mute)
-{
-	if (state.exp_state->capture_mute_locked)
-		return;
-
-	state.exp_state->capture_mute = !!mute;
-	cras_system_notify_capture_mute();
-}
-
-void cras_system_set_capture_mute_locked(int locked)
-{
-	state.exp_state->capture_mute_locked = !!locked;
-	cras_system_notify_capture_mute();
-}
-
-int cras_system_get_capture_mute()
-{
-	return state.exp_state->capture_mute;
-}
-
-int cras_system_get_capture_mute_locked()
-{
-	return state.exp_state->capture_mute_locked;
-}
-
-int cras_system_get_suspended()
-{
-	return state.exp_state->suspended;
-}
-
-void cras_system_set_suspended(int suspended)
-{
-	state.exp_state->suspended = suspended;
-	cras_observer_notify_suspend_changed(suspended);
-	cras_alert_process_all_pending_alerts();
-}
-
-void cras_system_set_volume_limits(long min, long max)
-{
-	state.exp_state->min_volume_dBFS = min;
-	state.exp_state->max_volume_dBFS = max;
-}
-
-long cras_system_get_min_volume()
-{
-	return state.exp_state->min_volume_dBFS;
-}
-
-long cras_system_get_max_volume()
-{
-	return state.exp_state->max_volume_dBFS;
-}
-
-int cras_system_get_default_output_buffer_size()
-{
-	return state.exp_state->default_output_buffer_size;
-}
-
-int cras_system_get_aec_supported()
-{
-	return state.exp_state->aec_supported;
-}
-
-int cras_system_get_aec_group_id()
-{
-	return state.exp_state->aec_group_id;
-}
-
-void cras_system_set_bt_wbs_enabled(bool enabled)
-{
-	state.exp_state->bt_wbs_enabled = enabled;
-}
-
-bool cras_system_get_bt_wbs_enabled()
-{
-	return !!state.exp_state->bt_wbs_enabled;
-}
-
-bool cras_system_get_deprioritize_bt_wbs_mic()
-{
-	return !!state.exp_state->deprioritize_bt_wbs_mic;
-}
-
-void cras_system_set_bt_fix_a2dp_packet_size_enabled(bool enabled)
-{
-	state.bt_fix_a2dp_packet_size = enabled;
-}
-
-bool cras_system_get_bt_fix_a2dp_packet_size_enabled()
-{
-	return state.bt_fix_a2dp_packet_size;
-}
-
-void cras_system_set_noise_cancellation_enabled(bool enabled)
-{
-	/* When the flag is toggled, propagate to all iodevs immediately. */
-	if (cras_system_get_noise_cancellation_enabled() != enabled) {
-		state.exp_state->noise_cancellation_enabled = enabled;
-		cras_iodev_list_reset_for_noise_cancellation();
-	}
-}
-
-bool cras_system_get_noise_cancellation_enabled()
-{
-	return !!state.exp_state->noise_cancellation_enabled;
-}
-
-bool cras_system_check_ignore_ucm_suffix(const char *card_name)
-{
-	/* Check the general case: ALSA Loopback card "Loopback". */
-	if (!strcmp("Loopback", card_name))
-		return true;
-
-	/* Check board-specific ignore ucm suffix cards. */
-	struct name_list *card;
-	DL_FOREACH (state.ignore_suffix_cards, card) {
-		if (!strcmp(card->name, card_name))
-			return true;
-	}
-	return false;
-}
-
-bool cras_system_get_hotword_pause_at_suspend()
-{
-	return !!state.exp_state->hotword_pause_at_suspend;
-}
-
-void cras_system_set_hotword_pause_at_suspend(bool pause)
-{
-	state.exp_state->hotword_pause_at_suspend = pause;
-}
-
-int cras_system_add_alsa_card(struct cras_alsa_card_info *alsa_card_info)
-{
-	struct card_list *card;
-	struct cras_alsa_card *alsa_card;
-	unsigned card_index;
-
-	if (alsa_card_info == NULL)
-		return -EINVAL;
-
-	card_index = alsa_card_info->card_index;
-
-	DL_FOREACH (state.cards, card) {
-		if (card_index == cras_alsa_card_get_index(card->card))
-			return -EEXIST;
-	}
-	alsa_card =
-		cras_alsa_card_create(alsa_card_info, state.device_config_dir,
-				      state.device_blocklist,
-				      state.internal_ucm_suffix);
-	if (alsa_card == NULL)
-		return -ENOMEM;
-	card = calloc(1, sizeof(*card));
-	if (card == NULL)
-		return -ENOMEM;
-	card->card = alsa_card;
-	DL_APPEND(state.cards, card);
-	return 0;
-}
-
-int cras_system_remove_alsa_card(size_t alsa_card_index)
-{
-	struct card_list *card;
-
-	DL_FOREACH (state.cards, card) {
-		if (alsa_card_index == cras_alsa_card_get_index(card->card))
-			break;
-	}
-	if (card == NULL)
-		return -EINVAL;
-	DL_DELETE(state.cards, card);
-	cras_alsa_card_destroy(card->card);
-	free(card);
-	return 0;
-}
-
-int cras_system_alsa_card_exists(unsigned alsa_card_index)
-{
-	struct card_list *card;
-
-	DL_FOREACH (state.cards, card)
-		if (alsa_card_index == cras_alsa_card_get_index(card->card))
-			return 1;
-	return 0;
-}
-
-int cras_system_set_select_handler(
-	int (*add)(int fd, void (*callback)(void *data, int events),
-		   void *callback_data, int events, void *select_data),
-	void (*rm)(int fd, void *select_data), void *select_data)
-{
-	if (state.fd_add != NULL || state.fd_rm != NULL)
-		return -EEXIST;
-	state.fd_add = add;
-	state.fd_rm = rm;
-	state.select_data = select_data;
-	return 0;
-}
-
-int cras_system_add_select_fd(int fd, void (*callback)(void *data, int revents),
-			      void *callback_data, int events)
-{
-	if (state.fd_add == NULL)
-		return -EINVAL;
-	return state.fd_add(fd, callback, callback_data, events,
-			    state.select_data);
-}
-
-int cras_system_set_add_task_handler(int (*add_task)(void (*cb)(void *data),
-						     void *callback_data,
-						     void *task_data),
-				     void *task_data)
-{
-	if (state.add_task != NULL)
-		return -EEXIST;
-
-	state.add_task = add_task;
-	state.task_data = task_data;
-	return 0;
-}
-
-int cras_system_add_task(void (*callback)(void *data), void *callback_data)
-{
-	if (state.add_task == NULL)
-		return -EINVAL;
-
-	return state.add_task(callback, callback_data, state.task_data);
-}
-
-void cras_system_rm_select_fd(int fd)
-{
-	if (state.fd_rm != NULL)
-		state.fd_rm(fd, state.select_data);
-}
-
-void cras_system_state_stream_added(enum CRAS_STREAM_DIRECTION direction,
-				    enum CRAS_CLIENT_TYPE client_type)
-{
-	struct cras_server_state *s;
-
-	s = cras_system_state_update_begin();
-	if (!s)
-		return;
-
-	s->num_active_streams[direction]++;
-	s->num_streams_attached++;
-	if (direction == CRAS_STREAM_INPUT) {
-		s->num_input_streams_with_permission[client_type]++;
-		cras_observer_notify_input_streams_with_permission(
-			s->num_input_streams_with_permission);
-	}
-
-	cras_system_state_update_complete();
-	cras_observer_notify_num_active_streams(
-		direction, s->num_active_streams[direction]);
-}
-
-void cras_system_state_stream_removed(enum CRAS_STREAM_DIRECTION direction,
-				      enum CRAS_CLIENT_TYPE client_type)
-{
-	struct cras_server_state *s;
-	unsigned i, sum;
-
-	s = cras_system_state_update_begin();
-	if (!s)
-		return;
-
-	sum = 0;
-	for (i = 0; i < CRAS_NUM_DIRECTIONS; i++)
-		sum += s->num_active_streams[i];
-
-	/* Set the last active time when removing the final stream. */
-	if (sum == 1)
-		cras_clock_gettime(CLOCK_MONOTONIC_RAW,
-				   &s->last_active_stream_time);
-	s->num_active_streams[direction]--;
-	if (direction == CRAS_STREAM_INPUT) {
-		s->num_input_streams_with_permission[client_type]--;
-		cras_observer_notify_input_streams_with_permission(
-			s->num_input_streams_with_permission);
-	}
-
-	cras_system_state_update_complete();
-	cras_observer_notify_num_active_streams(
-		direction, s->num_active_streams[direction]);
-}
-
-unsigned cras_system_state_get_active_streams()
-{
-	unsigned i, sum;
-	sum = 0;
-	for (i = 0; i < CRAS_NUM_DIRECTIONS; i++)
-		sum += state.exp_state->num_active_streams[i];
-	return sum;
-}
-
-unsigned cras_system_state_get_active_streams_by_direction(
-	enum CRAS_STREAM_DIRECTION direction)
-{
-	return state.exp_state->num_active_streams[direction];
-}
-
-void cras_system_state_get_input_streams_with_permission(
-	uint32_t num_input_streams[CRAS_NUM_CLIENT_TYPE])
-{
-	unsigned type;
-	for (type = 0; type < CRAS_NUM_CLIENT_TYPE; ++type)
-		num_input_streams[type] =
-			state.exp_state->num_input_streams_with_permission[type];
-}
-
-void cras_system_state_get_last_stream_active_time(struct cras_timespec *ts)
-{
-	*ts = state.exp_state->last_active_stream_time;
-}
-
-int cras_system_state_get_output_devs(const struct cras_iodev_info **devs)
-{
-	*devs = state.exp_state->output_devs;
-	return state.exp_state->num_output_devs;
-}
-
-int cras_system_state_get_input_devs(const struct cras_iodev_info **devs)
-{
-	*devs = state.exp_state->input_devs;
-	return state.exp_state->num_input_devs;
-}
-
-int cras_system_state_get_output_nodes(const struct cras_ionode_info **nodes)
-{
-	*nodes = state.exp_state->output_nodes;
-	return state.exp_state->num_output_nodes;
-}
-
-int cras_system_state_get_input_nodes(const struct cras_ionode_info **nodes)
-{
-	*nodes = state.exp_state->input_nodes;
-	return state.exp_state->num_input_nodes;
-}
-
-void cras_system_state_set_non_empty_status(int non_empty)
-{
-	state.exp_state->non_empty_status = non_empty;
-}
-
-int cras_system_state_get_non_empty_status()
-{
-	return state.exp_state->non_empty_status;
-}
-
-struct cras_server_state *cras_system_state_update_begin()
-{
-	if (pthread_mutex_lock(&state.update_lock)) {
-		syslog(LOG_ERR, "Failed to lock stream mutex");
-		return NULL;
-	}
-
-	__sync_fetch_and_add(&state.exp_state->update_count, 1);
-	return state.exp_state;
-}
-
-void cras_system_state_update_complete()
-{
-	__sync_fetch_and_add(&state.exp_state->update_count, 1);
-	pthread_mutex_unlock(&state.update_lock);
-}
-
-struct cras_server_state *cras_system_state_get_no_lock()
-{
-	return state.exp_state;
-}
-
-key_t cras_sys_state_shm_fd()
-{
-	return state.shm_fd_ro;
-}
-
-struct cras_tm *cras_system_state_get_tm()
-{
-	return state.tm;
-}
-
-void cras_system_state_dump_snapshots()
-{
-	memcpy(&state.exp_state->snapshot_buffer, &state.snapshot_buffer,
-	       sizeof(struct cras_audio_thread_snapshot_buffer));
-}
-
-void cras_system_state_add_snapshot(struct cras_audio_thread_snapshot *snapshot)
-{
-	state.snapshot_buffer.snapshots[state.snapshot_buffer.pos++] =
-		(*snapshot);
-	state.snapshot_buffer.pos %= CRAS_MAX_AUDIO_THREAD_SNAPSHOTS;
-}
-
-int cras_system_state_in_main_thread()
-{
-	return pthread_self() == state.main_thread_tid;
-}
diff --git a/cras/src/server/cras_system_state.h b/cras/src/server/cras_system_state.h
deleted file mode 100644
index bd09395..0000000
--- a/cras/src/server/cras_system_state.h
+++ /dev/null
@@ -1,365 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- *
- * Handles various system-level settings.
- *
- * Volume:  The system volume is represented as a value from 0 to 100.  This
- * number will be interpreted by the output device and applied to the hardware.
- * The value will be mapped to dB by the active device as it will know its curve
- * the best.
- */
-
-#ifndef CRAS_SYSTEM_STATE_H_
-#define CRAS_SYSTEM_STATE_H_
-
-#include <stdbool.h>
-#include <stddef.h>
-
-#include "cras_types.h"
-
-#define CRAS_MAX_SYSTEM_VOLUME 100
-#define DEFAULT_CAPTURE_GAIN 2000 /* 20dB of gain. */
-/* Default to -6 dBFS as 90% of CrOS boards use microphone with -26dBFS
- * sensitivity under 94dB SPL @ 1kHz and we generally added 20dB gain to it.
- * This is a temporary value that should be refined when the standard process
- * measuring intrinsic sensitivity is built. */
-#define DEFAULT_CAPTURE_VOLUME_DBFS -600
-/* Default to 1--dB of range for playback and capture. */
-#define DEFAULT_MIN_VOLUME_DBFS -10000
-#define DEFAULT_MAX_VOLUME_DBFS 0
-#define DEFAULT_MIN_CAPTURE_GAIN -5000
-#define DEFAULT_MAX_CAPTURE_GAIN 5000
-
-struct cras_tm;
-
-/* Initialize system settings.
- *
- * Args:
- *    device_config_dir - Directory for device configs where volume curves live.
- *    shm_name - Name of the shared memory region used to store the state.
- *    rw_shm_fd - FD of the shm region.
- *    ro_shm_fd - FD of the shm region opened RO for sharing with clients.
- *    exp_state - Shared memory region for storing state.
- *    exp_state_size - Size of |exp_state|.
- */
-void cras_system_state_init(const char *device_config_dir, const char *shm_name,
-			    int rw_shm_fd, int ro_shm_fd,
-			    struct cras_server_state *exp_state,
-			    size_t exp_state_size);
-void cras_system_state_deinit();
-
-/* Sets the suffix string to control which UCM config fo load. */
-void cras_system_state_set_internal_ucm_suffix(const char *internal_ucm_suffix);
-
-/* Sets the system volume.  Will be applied by the active device. */
-void cras_system_set_volume(size_t volume);
-/* Gets the current system volume. */
-size_t cras_system_get_volume();
-
-/* Gets the current system capture volume. As we remove the support of setting
- * system capture gain, it should always be DEFAULT_CAPTURE_GAIN now. */
-long cras_system_get_capture_gain();
-
-/* Sets if the system is muted by the user. */
-void cras_system_set_user_mute(int muted);
-/* Sets if the system is muted for . */
-void cras_system_set_mute(int muted);
-/* Sets if the system muting is locked or not. */
-void cras_system_set_mute_locked(int locked);
-/* Gets the current mute state of the system. */
-int cras_system_get_mute();
-/* Gets the current user mute state. */
-int cras_system_get_user_mute();
-/* Gets the current system mute state. */
-int cras_system_get_system_mute();
-/* Gets if the system muting is locked or not. */
-int cras_system_get_mute_locked();
-
-/* Gets the suspend state of audio. */
-int cras_system_get_suspended();
-
-/* Sets the suspend state of audio.
- * Args:
- *    suspend - True for suspend, false for resume.
- */
-void cras_system_set_suspended(int suspend);
-
-/* Sets if the system capture path is muted or not. */
-void cras_system_set_capture_mute(int muted);
-/* Sets if the system capture path muting is locked or not. */
-void cras_system_set_capture_mute_locked(int locked);
-/* Gets the current mute state of the system capture path. */
-int cras_system_get_capture_mute();
-/* Gets if the system capture path muting is locked or not. */
-int cras_system_get_capture_mute_locked();
-
-/* Sets the value in dB of the MAX and MIN volume settings.  This will allow
- * clients to query what range of control is available.  Both arguments are
- * specified as dB * 100.
- * Args:
- *     min - dB value when volume = 1 (0 mutes).
- *     max - dB value when volume = CRAS_MAX_SYSTEM_VOLUME
- */
-void cras_system_set_volume_limits(long min, long max);
-/* Returns the dB value when volume = 1, in dB * 100. */
-long cras_system_get_min_volume();
-/* Returns the dB value when volume = CRAS_MAX_SYSTEM_VOLUME, in dB * 100. */
-long cras_system_get_max_volume();
-
-/* Returns the default value of output buffer size in frames. */
-int cras_system_get_default_output_buffer_size();
-
-/* Returns if system aec is supported. */
-int cras_system_get_aec_supported();
-
-/* Returns the system aec group id is available. */
-int cras_system_get_aec_group_id();
-
-/* Sets the flag to enable or disable bluetooth wideband speech feature. */
-void cras_system_set_bt_wbs_enabled(bool enabled);
-
-/* Gets the elable flag of bluetooth wideband speech feature. */
-bool cras_system_get_bt_wbs_enabled();
-
-/*
- * Returns if Bluetooth WBS mic should be deprioritized for selecting
- * as default audio input option.
- */
-bool cras_system_get_deprioritize_bt_wbs_mic();
-
-/* Sets the flag to enable or disable Bluetooth fixed A2DP packet size. */
-void cras_system_set_bt_fix_a2dp_packet_size_enabled(bool enabled);
-
-/* Gets the flag of Bluetooth fixed A2DP packet size. */
-bool cras_system_get_bt_fix_a2dp_packet_size_enabled();
-
-/* Sets the flag to enable or disable Noise Cancellation. */
-void cras_system_set_noise_cancellation_enabled(bool enabled);
-
-/* Gets the flag of Noise Cancellation. */
-bool cras_system_get_noise_cancellation_enabled();
-
-/* Checks if the card ignores the ucm suffix. */
-bool cras_system_check_ignore_ucm_suffix(const char *card_name);
-
-/* Returns true if hotword detection is paused at system suspend. */
-bool cras_system_get_hotword_pause_at_suspend();
-
-/* Sets whether to pause hotword detection at system suspend. */
-void cras_system_set_hotword_pause_at_suspend(bool pause);
-
-/* Adds a card at the given index to the system.  When a new card is found
- * (through a udev event notification) this will add the card to the system,
- * causing its devices to become available for playback/capture.
- * Args:
- *    alsa_card_info - Info about the alsa card (Index, type, etc.).
- * Returns:
- *    0 on success, negative error on failure (Can't create or card already
- *    exists).
- */
-int cras_system_add_alsa_card(struct cras_alsa_card_info *alsa_card_info);
-
-/* Removes a card.  When a device is removed this will do the cleanup.  Device
- * at index must have been added using cras_system_add_alsa_card().
- * Args:
- *    alsa_card_index - Index ALSA uses to refer to the card.  The X in "hw:X".
- * Returns:
- *    0 on success, negative error on failure (Can't destroy or card doesn't
- *    exist).
- */
-int cras_system_remove_alsa_card(size_t alsa_card_index);
-
-/* Checks if an alsa card has been added to the system.
- * Args:
- *    alsa_card_index - Index ALSA uses to refer to the card.  The X in "hw:X".
- * Returns:
- *    1 if the card has already been added, 0 if not.
- */
-int cras_system_alsa_card_exists(unsigned alsa_card_index);
-
-/* Poll interface provides a way of getting a callback when 'select'
- * returns for a given file descriptor.
- */
-
-/* Register the function to use to inform the select loop about new
- * file descriptors and callbacks.
- * Args:
- *    add - The function to call when a new fd is added.
- *    rm - The function to call when a new fd is removed.
- *    select_data - Additional value passed back to add and remove.
- * Returns:
- *    0 on success, or -EBUSY if there is already a registered handler.
- */
-int cras_system_set_select_handler(
-	int (*add)(int fd, void (*callback)(void *data, int revents),
-		   void *callback_data, int events, void *select_data),
-	void (*rm)(int fd, void *select_data), void *select_data);
-
-/* Adds the fd and callback pair.  When select indicates that fd is readable,
- * the callback will be called.
- * Args:
- *    fd - The file descriptor to pass to select(2).
- *    callback - The callback to call when fd is ready.
- *    callback_data - Value passed back to the callback.
- *    events - The events to poll for.
- * Returns:
- *    0 on success or a negative error code on failure.
- */
-int cras_system_add_select_fd(int fd, void (*callback)(void *data, int revents),
-			      void *callback_data, int events);
-
-/* Removes the fd from the list of fds that are passed to select.
- * Args:
- *    fd - The file descriptor to remove from the list.
- */
-void cras_system_rm_select_fd(int fd);
-
-/*
- * Register the function to use to add a task for main thread to execute.
- * Args:
- *    add_task - The function to call when new task is added.
- *    task_data - Additional data to pass back to add_task.
- * Returns:
- *    0 on success, or -EEXIST if there's already a registered handler.
- */
-int cras_system_set_add_task_handler(int (*add_task)(void (*cb)(void *data),
-						     void *callback_data,
-						     void *task_data),
-				     void *task_data);
-
-/*
- * Adds a task callback and data pair, to be executed in the next main thread
- * loop without additional wait time.
- * Args:
- *    callback - The function to execute.
- *    callback_data - The data to be passed to callback when executed.
- * Returns:
- *    0 on success, or -EINVAL if there's no handler for adding task.
- */
-int cras_system_add_task(void (*callback)(void *data), void *callback_data);
-
-/* Signals that an audio input or output stream has been added to the system.
- * This allows the count of active streams can be used to notice when the audio
- * subsystem is idle.
- * Args:
- *   direction - Directions of audio streams.
- *   client_type - CRAS_CLIENT_TYPE of the audio stream.
- */
-void cras_system_state_stream_added(enum CRAS_STREAM_DIRECTION direction,
-				    enum CRAS_CLIENT_TYPE client_type);
-
-/* Signals that an audio input or output stream has been removed from the
- * system.  This allows the count of active streams can be used to notice when
- * the audio subsystem is idle.
- * Args:
- *   direction - Directions of audio stream.
- *   client_type - CRAS_CLIENT_TYPE of the audio stream.
- */
-void cras_system_state_stream_removed(enum CRAS_STREAM_DIRECTION direction,
-				      enum CRAS_CLIENT_TYPE client_type);
-
-/* Returns the number of active playback and capture streams. */
-unsigned cras_system_state_get_active_streams();
-
-/* Returns the number of active streams with given direction.
- * Args:
- *   direction - Directions of audio stream.
- */
-unsigned cras_system_state_get_active_streams_by_direction(
-	enum CRAS_STREAM_DIRECTION direction);
-
-/* Returns the number of input streams with permission per CRAS_CLIENT_TYPE.
- *
- * Returns:
- *   num_input_streams - An array with length = CRAS_NUM_CLIENT_TYPE and each
- *                        element is the number of the current input
- *                        streams with permission in each client type.
- */
-void cras_system_state_get_input_streams_with_permission(
-	uint32_t num_input_streams[CRAS_NUM_CLIENT_TYPE]);
-
-/* Fills ts with the time the last stream was removed from the system, the time
- * the stream count went to zero.
- */
-void cras_system_state_get_last_stream_active_time(struct cras_timespec *ts);
-
-/* Returns output devices information.
- * Args:
- *    devs - returns the array of output devices information.
- * Returns:
- *    number of output devices.
- */
-int cras_system_state_get_output_devs(const struct cras_iodev_info **devs);
-
-/* Returns input devices information.
- * Args:
- *    devs - returns the array of input devices information.
- * Returns:
- *    number of input devices.
- */
-int cras_system_state_get_input_devs(const struct cras_iodev_info **devs);
-
-/* Returns output nodes information.
- * Args:
- *    nodes - returns the array of output nodes information.
- * Returns:
- *    number of output nodes.
- */
-int cras_system_state_get_output_nodes(const struct cras_ionode_info **nodes);
-
-/* Returns input nodes information.
- * Args:
- *    nodes - returns the array of input nodes information.
- * Returns:
- *    number of input nodes.
- */
-int cras_system_state_get_input_nodes(const struct cras_ionode_info **nodes);
-
-/*
- * Sets the non-empty audio status.
- */
-void cras_system_state_set_non_empty_status(int non_empty);
-
-/*
- * Returns the non-empty audio status.
- */
-int cras_system_state_get_non_empty_status();
-
-/* Returns a pointer to the current system state that is shared with clients.
- * This also 'locks' the structure by incrementing the update count to an odd
- * value.
- */
-struct cras_server_state *cras_system_state_update_begin();
-
-/* Unlocks the system state structure that was updated after calling
- * cras_system_state_update_begin by again incrementing the update count.
- */
-void cras_system_state_update_complete();
-
-/* Gets a pointer to the system state without locking it.  Only used for debug
- * log.  Don't add calls to this function. */
-struct cras_server_state *cras_system_state_get_no_lock();
-
-/* Returns the shm fd for the server_state structure. */
-key_t cras_sys_state_shm_fd();
-
-/* Returns the timer manager. */
-struct cras_tm *cras_system_state_get_tm();
-
-/*
- * Add snapshot to snapshot buffer in system state
- */
-void cras_system_state_add_snapshot(struct cras_audio_thread_snapshot *);
-
-/*
- * Dump snapshots from system state to shared memory with client
- */
-void cras_system_state_dump_snapshots();
-
-/*
- * Returns true if in the main thread.
- */
-int cras_system_state_in_main_thread();
-
-#endif /* CRAS_SYSTEM_STATE_H_ */
diff --git a/cras/src/server/cras_telephony.c b/cras/src/server/cras_telephony.c
deleted file mode 100644
index 805fb13..0000000
--- a/cras/src/server/cras_telephony.c
+++ /dev/null
@@ -1,455 +0,0 @@
-/* Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <string.h>
-#include <stdlib.h>
-#include <syslog.h>
-
-#include <dbus/dbus.h>
-
-#include "cras_telephony.h"
-#include "cras_hfp_ag_profile.h"
-#include "cras_hfp_slc.h"
-
-#define CRAS_TELEPHONY_INTERFACE "org.chromium.cras.Telephony"
-#define CRAS_TELEPHONY_OBJECT_PATH "/org/chromium/cras/telephony"
-#define TELEPHONY_INTROSPECT_XML                                               \
-	DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE                              \
-	"<node>\n"                                                             \
-	"  <interface name=\"" CRAS_TELEPHONY_INTERFACE "\">\n"                \
-	"    <method name=\"AnswerCall\">\n"                                   \
-	"    </method>\n"                                                      \
-	"    <method name=\"IncomingCall\">\n"                                 \
-	"      <arg name=\"value\" type=\"s\" direction=\"in\"/>\n"            \
-	"    </method>\n"                                                      \
-	"    <method name=\"TerminateCall\">\n"                                \
-	"    </method>\n"                                                      \
-	"    <method name=\"SetBatteryLevel\">\n"                              \
-	"      <arg name=\"value\" type=\"i\" direction=\"in\"/>\n"            \
-	"    </method>\n"                                                      \
-	"    <method name=\"SetSignalStrength\">\n"                            \
-	"      <arg name=\"value\" type=\"i\" direction=\"in\"/>\n"            \
-	"    </method>\n"                                                      \
-	"    <method name=\"SetServiceAvailability\">\n"                       \
-	"      <arg name=\"value\" type=\"i\" direction=\"in\"/>\n"            \
-	"    </method>\n"                                                      \
-	"    <method name=\"SetDialNumber\">\n"                                \
-	"      <arg name=\"value\" type=\"s\" direction=\"in\"/>\n"            \
-	"    </method>\n"                                                      \
-	"    <method name=\"SetCallheld\">\n"                                  \
-	"      <arg name=\"value\" type=\"i\" direction=\"in\"/>\n"            \
-	"    </method>\n"                                                      \
-	"    <method name=\"SetCallsetup\">\n"                                 \
-	"      <arg name=\"value\" type=\"i\" direction=\"in\"/>\n"            \
-	"    </method>\n"                                                      \
-	"    <method name=\"SetCall\">\n"                                      \
-	"      <arg name=\"value\" type=\"i\" direction=\"in\"/>\n"            \
-	"    </method>\n"                                                      \
-	"  </interface>\n"                                                     \
-	"  <interface name=\"" DBUS_INTERFACE_INTROSPECTABLE "\">\n"           \
-	"    <method name=\"Introspect\">\n"                                   \
-	"      <arg name=\"data\" type=\"s\" direction=\"out\"/>\n"            \
-	"    </method>\n"                                                      \
-	"  </interface>\n"                                                     \
-	"</node>\n"
-
-static struct cras_telephony_handle telephony_handle;
-
-/* Helper to extract a single argument from a DBus message. */
-static DBusHandlerResult get_single_arg(DBusMessage *message, int dbus_type,
-					void *arg)
-{
-	DBusError dbus_error;
-
-	dbus_error_init(&dbus_error);
-
-	if (!dbus_message_get_args(message, &dbus_error, dbus_type, arg,
-				   DBUS_TYPE_INVALID)) {
-		syslog(LOG_WARNING, "Bad method received: %s",
-		       dbus_error.message);
-		dbus_error_free(&dbus_error);
-		return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-	}
-
-	return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-/* Helper to send an empty reply. */
-static void send_empty_reply(DBusConnection *conn, DBusMessage *message)
-{
-	DBusMessage *reply;
-	dbus_uint32_t serial = 0;
-
-	reply = dbus_message_new_method_return(message);
-	if (!reply)
-		return;
-
-	dbus_connection_send(conn, reply, &serial);
-
-	dbus_message_unref(reply);
-}
-
-static DBusHandlerResult handle_incoming_call(DBusConnection *conn,
-					      DBusMessage *message, void *arg)
-{
-	struct hfp_slc_handle *handle;
-	DBusHandlerResult rc;
-	const char *number;
-
-	rc = get_single_arg(message, DBUS_TYPE_STRING, &number);
-	if (rc != DBUS_HANDLER_RESULT_HANDLED)
-		return rc;
-
-	handle = cras_hfp_ag_get_active_handle();
-
-	telephony_handle.callsetup = 1;
-
-	if (handle) {
-		hfp_event_update_callsetup(handle);
-		hfp_event_incoming_call(handle, number, 129);
-	}
-
-	send_empty_reply(conn, message);
-	return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult handle_terminate_call(DBusConnection *conn,
-					       DBusMessage *message, void *arg)
-{
-	cras_telephony_event_terminate_call();
-
-	send_empty_reply(conn, message);
-	return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult handle_answer_call(DBusConnection *conn,
-					    DBusMessage *message, void *arg)
-{
-	cras_telephony_event_answer_call();
-
-	send_empty_reply(conn, message);
-	return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult handle_set_dial_number(DBusConnection *conn,
-						DBusMessage *message, void *arg)
-{
-	DBusHandlerResult rc;
-	const char *number;
-
-	rc = get_single_arg(message, DBUS_TYPE_STRING, &number);
-	if (rc != DBUS_HANDLER_RESULT_HANDLED)
-		return rc;
-
-	cras_telephony_store_dial_number(strlen(number), number);
-
-	send_empty_reply(conn, message);
-	return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult handle_set_battery(DBusConnection *conn,
-					    DBusMessage *message, void *arg)
-{
-	struct hfp_slc_handle *handle;
-	DBusHandlerResult rc;
-	int value;
-
-	rc = get_single_arg(message, DBUS_TYPE_INT32, &value);
-	if (rc != DBUS_HANDLER_RESULT_HANDLED)
-		return rc;
-
-	handle = cras_hfp_ag_get_active_handle();
-	if (handle)
-		hfp_event_set_battery(handle, value);
-
-	send_empty_reply(conn, message);
-	return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult handle_set_signal(DBusConnection *conn,
-					   DBusMessage *message, void *arg)
-{
-	struct hfp_slc_handle *handle;
-	DBusHandlerResult rc;
-	int value;
-
-	rc = get_single_arg(message, DBUS_TYPE_INT32, &value);
-	if (rc != DBUS_HANDLER_RESULT_HANDLED)
-		return rc;
-
-	handle = cras_hfp_ag_get_active_handle();
-	if (handle)
-		hfp_event_set_signal(handle, value);
-
-	send_empty_reply(conn, message);
-	return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult handle_set_service(DBusConnection *conn,
-					    DBusMessage *message, void *arg)
-{
-	struct hfp_slc_handle *handle;
-	DBusHandlerResult rc;
-	int value;
-
-	rc = get_single_arg(message, DBUS_TYPE_INT32, &value);
-	if (rc != DBUS_HANDLER_RESULT_HANDLED)
-		return rc;
-
-	handle = cras_hfp_ag_get_active_handle();
-	if (handle)
-		hfp_event_set_service(handle, value);
-
-	send_empty_reply(conn, message);
-	return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult handle_set_callheld(DBusConnection *conn,
-					     DBusMessage *message, void *arg)
-{
-	struct hfp_slc_handle *handle;
-	DBusHandlerResult rc;
-	int value;
-
-	rc = get_single_arg(message, DBUS_TYPE_INT32, &value);
-	if (rc != DBUS_HANDLER_RESULT_HANDLED)
-		return rc;
-
-	telephony_handle.callheld = value;
-	handle = cras_hfp_ag_get_active_handle();
-	if (handle)
-		hfp_event_update_callheld(handle);
-
-	send_empty_reply(conn, message);
-	return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult handle_set_callsetup(DBusConnection *conn,
-					      DBusMessage *message, void *arg)
-{
-	struct hfp_slc_handle *handle;
-	DBusHandlerResult rc;
-	int value;
-
-	rc = get_single_arg(message, DBUS_TYPE_INT32, &value);
-	if (rc != DBUS_HANDLER_RESULT_HANDLED)
-		return rc;
-
-	telephony_handle.callsetup = value;
-	handle = cras_hfp_ag_get_active_handle();
-	if (handle)
-		hfp_event_update_callsetup(handle);
-
-	send_empty_reply(conn, message);
-	return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult handle_set_call(DBusConnection *conn,
-					 DBusMessage *message, void *arg)
-{
-	struct hfp_slc_handle *handle;
-	DBusHandlerResult rc;
-	int value;
-
-	rc = get_single_arg(message, DBUS_TYPE_INT32, &value);
-	if (rc != DBUS_HANDLER_RESULT_HANDLED)
-		return rc;
-
-	telephony_handle.call = value;
-	handle = cras_hfp_ag_get_active_handle();
-	if (handle)
-		hfp_event_update_call(handle);
-
-	send_empty_reply(conn, message);
-	return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-/* Handle incoming messages. */
-static DBusHandlerResult
-handle_telephony_message(DBusConnection *conn, DBusMessage *message, void *arg)
-{
-	syslog(LOG_ERR, "Telephony message: %s %s %s",
-	       dbus_message_get_path(message),
-	       dbus_message_get_interface(message),
-	       dbus_message_get_member(message));
-
-	if (dbus_message_is_method_call(message, DBUS_INTERFACE_INTROSPECTABLE,
-					"Introspect")) {
-		DBusMessage *reply;
-		const char *xml = TELEPHONY_INTROSPECT_XML;
-
-		reply = dbus_message_new_method_return(message);
-		if (!reply)
-			return DBUS_HANDLER_RESULT_NEED_MEMORY;
-		if (!dbus_message_append_args(reply, DBUS_TYPE_STRING, &xml,
-					      DBUS_TYPE_INVALID))
-			return DBUS_HANDLER_RESULT_NEED_MEMORY;
-		if (!dbus_connection_send(conn, reply, NULL))
-			return DBUS_HANDLER_RESULT_NEED_MEMORY;
-
-		dbus_message_unref(reply);
-		return DBUS_HANDLER_RESULT_HANDLED;
-	} else if (dbus_message_is_method_call(
-			   message, CRAS_TELEPHONY_INTERFACE, "IncomingCall")) {
-		return handle_incoming_call(conn, message, arg);
-	} else if (dbus_message_is_method_call(message,
-					       CRAS_TELEPHONY_INTERFACE,
-					       "TerminateCall")) {
-		return handle_terminate_call(conn, message, arg);
-	} else if (dbus_message_is_method_call(
-			   message, CRAS_TELEPHONY_INTERFACE, "AnswerCall")) {
-		return handle_answer_call(conn, message, arg);
-	} else if (dbus_message_is_method_call(message,
-					       CRAS_TELEPHONY_INTERFACE,
-					       "SetDialNumber")) {
-		return handle_set_dial_number(conn, message, arg);
-	} else if (dbus_message_is_method_call(message,
-					       CRAS_TELEPHONY_INTERFACE,
-					       "SetBatteryLevel")) {
-		return handle_set_battery(conn, message, arg);
-	} else if (dbus_message_is_method_call(message,
-					       CRAS_TELEPHONY_INTERFACE,
-					       "SetSignalStrength")) {
-		return handle_set_signal(conn, message, arg);
-	} else if (dbus_message_is_method_call(message,
-					       CRAS_TELEPHONY_INTERFACE,
-					       "SetServiceAvailability")) {
-		return handle_set_service(conn, message, arg);
-	} else if (dbus_message_is_method_call(
-			   message, CRAS_TELEPHONY_INTERFACE, "SetCallheld")) {
-		return handle_set_callheld(conn, message, arg);
-	} else if (dbus_message_is_method_call(
-			   message, CRAS_TELEPHONY_INTERFACE, "SetCallsetup")) {
-		return handle_set_callsetup(conn, message, arg);
-	} else if (dbus_message_is_method_call(
-			   message, CRAS_TELEPHONY_INTERFACE, "SetCall")) {
-		return handle_set_call(conn, message, arg);
-	}
-
-	return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-}
-
-/* Exported Interface */
-
-void cras_telephony_start(DBusConnection *conn)
-{
-	static const DBusObjectPathVTable control_vtable = {
-		.message_function = handle_telephony_message,
-	};
-
-	DBusError dbus_error;
-
-	telephony_handle.dbus_conn = conn;
-	dbus_connection_ref(telephony_handle.dbus_conn);
-
-	if (!dbus_connection_register_object_path(
-		    conn, CRAS_TELEPHONY_OBJECT_PATH, &control_vtable,
-		    &dbus_error)) {
-		syslog(LOG_ERR, "Couldn't register telephony control: %s: %s",
-		       CRAS_TELEPHONY_OBJECT_PATH, dbus_error.message);
-		dbus_error_free(&dbus_error);
-		return;
-	}
-}
-
-void cras_telephony_stop()
-{
-	if (!telephony_handle.dbus_conn)
-		return;
-
-	dbus_connection_unregister_object_path(telephony_handle.dbus_conn,
-					       CRAS_TELEPHONY_OBJECT_PATH);
-	dbus_connection_unref(telephony_handle.dbus_conn);
-	telephony_handle.dbus_conn = NULL;
-}
-
-struct cras_telephony_handle *cras_telephony_get()
-{
-	return &telephony_handle;
-}
-
-/* Procedure to answer a call from AG.
- *
- * HF(hands-free)                             AG(audio gateway)
- *                                                     <-- Call answered
- *                 <-- +CIEV: (call = 1)
- *                 <-- +CIEV: (callsetup = 0)
- */
-int cras_telephony_event_answer_call()
-{
-	int rc;
-
-	struct hfp_slc_handle *handle;
-
-	handle = cras_hfp_ag_get_active_handle();
-
-	if (telephony_handle.call == 0) {
-		telephony_handle.call = 1;
-		if (handle) {
-			rc = hfp_event_update_call(handle);
-			if (rc)
-				return rc;
-		}
-	}
-
-	telephony_handle.callsetup = 0;
-	if (handle) {
-		rc = hfp_event_update_callsetup(handle);
-		if (rc)
-			return rc;
-	}
-
-	return 0;
-}
-
-/* Procedure to terminate a call from AG.
- *
- * HF(hands-free)                             AG(audio gateway)
- *                                                     <-- Call dropped
- *                 <-- +CIEV: (call = 0)
- */
-int cras_telephony_event_terminate_call()
-{
-	int rc;
-	struct hfp_slc_handle *handle;
-
-	handle = cras_hfp_ag_get_active_handle();
-
-	if (telephony_handle.call) {
-		telephony_handle.call = 0;
-		if (handle) {
-			rc = hfp_event_update_call(handle);
-			if (rc)
-				return rc;
-		}
-	}
-	if (telephony_handle.callsetup) {
-		telephony_handle.callsetup = 0;
-		if (handle) {
-			rc = hfp_event_update_callsetup(handle);
-			if (rc)
-				return rc;
-		}
-	}
-	return 0;
-}
-
-void cras_telephony_store_dial_number(int len, const char *number)
-{
-	if (telephony_handle.dial_number != NULL) {
-		free(telephony_handle.dial_number);
-		telephony_handle.dial_number = NULL;
-	}
-
-	if (len == 0)
-		return;
-
-	telephony_handle.dial_number =
-		(char *)calloc(len + 1, sizeof(*telephony_handle.dial_number));
-	strncpy(telephony_handle.dial_number, number, len);
-
-	syslog(LOG_ERR, "store dial_number: \"%s\"",
-	       telephony_handle.dial_number);
-}
diff --git a/cras/src/server/cras_telephony.h b/cras/src/server/cras_telephony.h
deleted file mode 100644
index 7c0a6c5..0000000
--- a/cras/src/server/cras_telephony.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/* Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_TELEPHONY_H_
-#define CRAS_TELEPHONY_H_
-
-#include <dbus/dbus.h>
-
-/* Handle object to hold required info to handle telephony status which
- * is required for responsing HFP query commands.
- * Args:
- *    call - standard call status indicator, where
- *        0: no call active
- *        1: call is active
- *    callsetup - call set up status indicator.
- *        0: not currently in call set up
- *        1: an incoming call prcess ongoing
- *        2: an outgoing call set up is ongoing
- *    callhold - call hold status indicator.
- *        0: no call hold
- *        1: call is placed on hold or active/held calls swapped
- *           (The AG has both and active AND a held call)
- *        2: call on hold, no active call
- *    dial_number - phone number, used on fake memory storage and last phone
- *    number storage.
- *    dbus_conn - dus connetion which is used in whole telephony module.
- */
-struct cras_telephony_handle {
-	int call;
-	int callsetup;
-	int callheld;
-	char *dial_number;
-
-	DBusConnection *dbus_conn;
-};
-
-void cras_telephony_start(DBusConnection *conn);
-
-void cras_telephony_stop();
-
-struct cras_telephony_handle *cras_telephony_get();
-
-/* Stores dial number in telephony module. */
-void cras_telephony_store_dial_number(int len, const char *num);
-
-/* Handles answer call event from dbus or HF */
-int cras_telephony_event_answer_call();
-
-/* Handles answer call event from dbus or HF */
-int cras_telephony_event_terminate_call();
-
-#endif /* CRAS_TELEPHONY_H_ */
diff --git a/cras/src/server/cras_tm.c b/cras/src/server/cras_tm.c
deleted file mode 100644
index c215fdc..0000000
--- a/cras/src/server/cras_tm.c
+++ /dev/null
@@ -1,149 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include "cras_types.h"
-#include "cras_util.h"
-#include "utlist.h"
-
-#include <time.h>
-
-/* Represents an armed timer.
- * Members:
- *    ts - timespec at which the timer should fire.
- *    cb - Callback to call when the timer expires.
- *    cb_data - Data passed to the callback.
- */
-struct cras_timer {
-	struct timespec ts;
-	void (*cb)(struct cras_timer *t, void *data);
-	void *cb_data;
-	struct cras_timer *next, *prev;
-};
-
-/* Timer Manager, keeps a list of active timers. */
-struct cras_tm {
-	struct cras_timer *timers;
-};
-
-/* Local Functions. */
-
-/* Adds ms milliseconds to ts. */
-static inline void add_ms_ts(struct timespec *ts, unsigned int ms)
-{
-	if (ms >= 1000) {
-		ts->tv_sec += ms / 1000;
-		ms %= 1000;
-	}
-	ts->tv_nsec += ms * 1000000L;
-	if (ts->tv_nsec >= 1000000000L) {
-		ts->tv_sec += ts->tv_nsec / 1000000000L;
-		ts->tv_nsec %= 1000000000L;
-	}
-}
-
-/* Checks if timespec a is less than b. */
-static inline int timespec_sooner(const struct timespec *a,
-				  const struct timespec *b)
-{
-	return (a->tv_sec < b->tv_sec ||
-		(a->tv_sec == b->tv_sec && a->tv_nsec <= b->tv_nsec));
-}
-
-/* Exported Interface. */
-
-struct cras_timer *cras_tm_create_timer(struct cras_tm *tm, unsigned int ms,
-					void (*cb)(struct cras_timer *t,
-						   void *data),
-					void *cb_data)
-{
-	struct cras_timer *t;
-
-	t = calloc(1, sizeof(*t));
-	if (!t)
-		return NULL;
-
-	t->cb = cb;
-	t->cb_data = cb_data;
-
-	clock_gettime(CLOCK_MONOTONIC_RAW, &t->ts);
-	add_ms_ts(&t->ts, ms);
-
-	DL_APPEND(tm->timers, t);
-
-	return t;
-}
-
-void cras_tm_cancel_timer(struct cras_tm *tm, struct cras_timer *t)
-{
-	DL_DELETE(tm->timers, t);
-	free(t);
-}
-
-struct cras_tm *cras_tm_init()
-{
-	return calloc(1, sizeof(struct cras_tm));
-}
-
-void cras_tm_deinit(struct cras_tm *tm)
-{
-	struct cras_timer *t;
-
-	DL_FOREACH (tm->timers, t) {
-		DL_DELETE(tm->timers, t);
-		free(t);
-	}
-	free(tm);
-}
-
-int cras_tm_get_next_timeout(const struct cras_tm *tm, struct timespec *ts)
-{
-	struct cras_timer *t;
-	struct timespec now;
-	struct timespec *min;
-
-	if (!tm->timers)
-		return 0;
-
-	min = &tm->timers->ts;
-	DL_FOREACH (tm->timers, t)
-		if (timespec_sooner(&t->ts, min))
-			min = &t->ts;
-
-	clock_gettime(CLOCK_MONOTONIC_RAW, &now);
-
-	if (timespec_sooner(min, &now)) {
-		/* Timer already expired. */
-		ts->tv_sec = ts->tv_nsec = 0;
-		return 1;
-	}
-
-	subtract_timespecs(min, &now, ts);
-	return 1;
-}
-
-void cras_tm_call_callbacks(struct cras_tm *tm)
-{
-	struct timespec now;
-	struct cras_timer *t, *next;
-
-	clock_gettime(CLOCK_MONOTONIC_RAW, &now);
-
-	/* Don't use DL_FOREACH to iterate timers because in each loop the
-	 * next timer pointer is stored for later access but it could be
-	 * cancelled and freed in current timer's callback causing invalid
-	 * memory access. */
-	t = tm->timers;
-	while (t) {
-		next = t->next;
-		if (timespec_sooner(&t->ts, &now)) {
-			t->cb(t, t->cb_data);
-			/* Update next timer because it could have been modified
-			 * in t->cb(). */
-			next = t->next;
-			cras_tm_cancel_timer(tm, t);
-		}
-		t = next;
-	}
-}
diff --git a/cras/src/server/cras_tm.h b/cras/src/server/cras_tm.h
deleted file mode 100644
index 4cc37ac..0000000
--- a/cras/src/server/cras_tm.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_TM_H_
-#define CRAS_TM_H_
-
-/* cras_timer provides an interface to register a function to be called at a
- * later time.  This interface should be used from the main thread only, it is
- * not thread safe.
- */
-
-struct cras_tm; /* timer manager */
-struct cras_timer;
-
-/* Creates a timer.  Must later be removed with cras_rm_cancel_timer.
- * Args:
- *    tm - Timer manager.
- *    ms - Call 'cb' in ms milliseconds.
- *    cb - The callback to call at timeout.
- *    cb_data - Passed to the callback when it is run.
- * Returns:
- *    Pointer to a newly allocated timer, passed timer to cras_tm_cancel_timer
- *    to cancel before it fires.
- */
-struct cras_timer *cras_tm_create_timer(struct cras_tm *tm, unsigned int ms,
-					void (*cb)(struct cras_timer *t,
-						   void *data),
-					void *cb_data);
-
-/* Deletes a timer returned from cras_tm_create_timer. */
-void cras_tm_cancel_timer(struct cras_tm *tm, struct cras_timer *t);
-
-/* Interface for system to create the timer manager. */
-struct cras_tm *cras_tm_init();
-
-/* Interface for system to destroy the timer manager. */
-void cras_tm_deinit(struct cras_tm *tm);
-
-/* Get the amount of time before the next timer expires. ts is set to an
- * the amount of time before the next timer expires (0 if already past due).
- * Args:
- *    tm - Timer manager.
- *    ts - Filled with time before next event.
- * Returns:
- *    0 if no timers are active, 1 if they are.
- */
-int cras_tm_get_next_timeout(const struct cras_tm *tm, struct timespec *ts);
-
-/* Calls any expired timers. */
-void cras_tm_call_callbacks(struct cras_tm *tm);
-
-#endif /* CRAS_TM_H_ */
diff --git a/cras/src/server/cras_udev.c b/cras/src/server/cras_udev.c
deleted file mode 100644
index 16f0e3b..0000000
--- a/cras/src/server/cras_udev.c
+++ /dev/null
@@ -1,426 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-#include <assert.h>
-#include <libudev.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <errno.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <regex.h>
-#include <syslog.h>
-
-#include "cras_system_state.h"
-#include "cras_types.h"
-#include "cras_util.h"
-#include "cras_checksum.h"
-
-struct udev_callback_data {
-	struct udev_monitor *mon;
-	struct udev *udev;
-	int fd;
-};
-
-static unsigned is_action(const char *desired, const char *actual)
-	__attribute__((nonnull(1)));
-
-/* Matches Alsa sound device entries generated by udev.  For
- * example:
- *
- *   /devices/pci0000:00/0000:00:1b.0/sound/card1/pcmC1D0p
- *
- * We want to be able to extract:
- *
- *   o The card number
- *   o The device number
- *   o If it's 'playback' (p) or 'capture' (c). (It may not be both.)
- *
- * Given the example above, the following matches should occur:
- *
- *
- *   |                        A                           |
- *                                                   BBCCCD
- *   /devices/pci0000:00/0000:00:1b.0/sound/card1/pcmC1D10p
- *
- * A: The whole regex will be matched.
- * B: The card.
- * C: The device.
- * D: 'p' (playback) or 'c' (capture)
- *
- * The order of the offsets in the 'pmatch' buffer does not appear
- * to match with the documentation:
- *
- *     Each rm_so element that is not -1 indicates the start
- *     offset of the next largest substring match within the
- *     string.
- *
- * But are, instead, filled in the same order presented in the
- * string.  To alleviate possible issudes, the 'C' (card) and 'D'
- * (device) identifying characters are included in the result.
- */
-static const char pcm_regex_string[] = "^.*pcm(C[0-9]+)(D[0-9]+)([pc])";
-static regex_t pcm_regex;
-
-/* Card regex is similar to above, but only has one field -- the card. The
- * format is the same with the exception of the leaf node being of the form:
- *
- *  /devices/...../card0
- *
- * Where 0 is the card number and the only thing we care about in
- * this case.
- */
-
-static const char card_regex_string[] = "^.*/card([0-9]+)";
-static regex_t card_regex;
-
-static char const *const subsystem = "sound";
-static const unsigned int MAX_DESC_NAME_LEN = 256;
-
-static unsigned is_action(const char *desired, const char *actual)
-{
-	return actual != NULL && strcmp(desired, actual) == 0;
-}
-
-static unsigned is_action_change(const char *action)
-{
-	return is_action("change", action);
-}
-
-static unsigned is_action_remove(const char *action)
-{
-	return is_action("remove", action);
-}
-
-static unsigned is_internal_bus(const char *bus)
-{
-	return (bus != NULL &&
-		(strcmp(bus, "pci") == 0 || strcmp(bus, "platform") == 0));
-}
-
-static unsigned is_external_bus(const char *bus)
-{
-	return (bus != NULL && (strcmp(bus, "usb") == 0));
-}
-
-static unsigned is_internal_device(struct udev_device *dev)
-{
-	struct udev_device *parent = udev_device_get_parent(dev);
-	while (parent != NULL) {
-		const char *name = udev_device_get_subsystem(parent);
-
-		if (name != NULL) {
-			if (is_external_bus(name))
-				return 0;
-			else if (is_internal_bus(name))
-				return 1;
-		}
-		parent = udev_device_get_parent(parent);
-	}
-	return 0;
-}
-
-static unsigned is_card_device(struct udev_device *dev, unsigned *internal,
-			       unsigned *card_number, const char **sysname)
-{
-	regmatch_t m[2];
-	const char *devpath = udev_device_get_devpath(dev);
-
-	if (devpath != NULL &&
-	    regexec(&card_regex, devpath, ARRAY_SIZE(m), m, 0) == 0) {
-		*sysname = udev_device_get_sysname(dev);
-		*internal = is_internal_device(dev);
-		*card_number = (unsigned)atoi(&devpath[m[1].rm_so]);
-		return 1;
-	}
-
-	return 0;
-}
-
-static void set_factory_default(unsigned card_number)
-{
-	static const char alsactl[] = "/usr/sbin/alsactl";
-	static const char asound_state[] = "/etc/asound.state";
-	char cmd_buf[128];
-	struct stat stat_buf;
-	int r;
-
-	if (stat(asound_state, &stat_buf) == 0) {
-		syslog(LOG_INFO, "%s: init card '%u' to factory default",
-		       __FUNCTION__, card_number);
-		r = snprintf(cmd_buf, ARRAY_SIZE(cmd_buf),
-			     "%s --file %s restore %u", alsactl, asound_state,
-			     card_number);
-		cmd_buf[ARRAY_SIZE(cmd_buf) - 1] = '\0';
-		r = system(cmd_buf);
-		if (r != 0)
-			syslog(LOG_ERR,
-			       "%s: failed to init card '%d' "
-			       "to factory default.  Failure: %d.  Command: %s",
-			       __FUNCTION__, card_number, r, cmd_buf);
-	}
-}
-
-static inline void udev_delay_for_alsa()
-{
-	/* Provide a small delay so that the udev message can
-	 * propogate throughout the whole system, and Alsa can set up
-	 * the new device.  Without a small delay, an error of the
-	 * form:
-	 *
-	 *    Fail opening control hw:?
-	 *
-	 * will be produced by cras_alsa_card_create().
-	 */
-	usleep(125000); /* 0.125 second */
-}
-
-/* Reads the "descriptors" file of the usb device and returns the
- * checksum of the contents. Returns 0 if the file can not be read */
-static uint32_t calculate_desc_checksum(struct udev_device *dev)
-{
-	char path[MAX_DESC_NAME_LEN];
-	struct stat stat_buf;
-	int fd;
-	unsigned char *buf = NULL;
-	int buf_size = 0;
-	int read_size;
-	ssize_t n;
-	uint32_t result;
-
-	if (snprintf(path, sizeof(path), "%s/descriptors",
-		     udev_device_get_syspath(dev)) >= sizeof(path)) {
-		syslog(LOG_ERR, "failed to build path");
-		return 0;
-	}
-
-	if (stat(path, &stat_buf) < 0) {
-		syslog(LOG_ERR, "failed to stat file %s: %s", path,
-		       strerror(errno));
-		return 0;
-	}
-
-	fd = open(path, O_RDONLY);
-	if (fd < 0) {
-		syslog(LOG_ERR, "failed to open file %s: %s", path,
-		       strerror(errno));
-		return 0;
-	}
-
-	read_size = 0;
-	while (read_size < stat_buf.st_size) {
-		if (read_size == buf_size) {
-			if (buf_size == 0)
-				buf_size = 256;
-			else
-				buf_size *= 2;
-			uint8_t *new_buf = realloc(buf, buf_size);
-			if (new_buf == NULL) {
-				syslog(LOG_ERR, "no memory to read file %s",
-				       path);
-				goto bail;
-			}
-			buf = new_buf;
-		}
-		n = read(fd, buf + read_size, buf_size - read_size);
-		if (n == 0)
-			break;
-		if (n < 0) {
-			syslog(LOG_ERR, "failed to read file %s", path);
-			goto bail;
-		}
-		read_size += n;
-	}
-
-	close(fd);
-	result = crc32_checksum(buf, read_size);
-	free(buf);
-	return result;
-bail:
-	close(fd);
-	free(buf);
-	return 0;
-}
-
-static void fill_usb_card_info(struct cras_alsa_card_info *card_info,
-			       struct udev_device *dev)
-{
-	const char *sysattr;
-	struct udev_device *parent_dev =
-		udev_device_get_parent_with_subsystem_devtype(dev, "usb",
-							      "usb_device");
-	if (!parent_dev)
-		return;
-
-	sysattr = udev_device_get_sysattr_value(parent_dev, "idVendor");
-	if (sysattr)
-		card_info->usb_vendor_id = strtol(sysattr, NULL, 16);
-	sysattr = udev_device_get_sysattr_value(parent_dev, "idProduct");
-	if (sysattr)
-		card_info->usb_product_id = strtol(sysattr, NULL, 16);
-	sysattr = udev_device_get_sysattr_value(parent_dev, "serial");
-	if (sysattr) {
-		strncpy(card_info->usb_serial_number, sysattr,
-			USB_SERIAL_NUMBER_BUFFER_SIZE - 1);
-		card_info->usb_serial_number[USB_SERIAL_NUMBER_BUFFER_SIZE - 1] =
-			'\0';
-	}
-
-	card_info->usb_desc_checksum = calculate_desc_checksum(parent_dev);
-
-	syslog(LOG_INFO,
-	       "USB card: vendor:%04x, product:%04x, serial num:%s, "
-	       "checksum:%08x",
-	       card_info->usb_vendor_id, card_info->usb_product_id,
-	       card_info->usb_serial_number, card_info->usb_desc_checksum);
-}
-
-static void device_add_alsa(struct udev_device *dev, const char *sysname,
-			    unsigned card, unsigned internal)
-{
-	struct cras_alsa_card_info card_info;
-	memset(&card_info, 0, sizeof(card_info));
-
-	udev_delay_for_alsa();
-	card_info.card_index = card;
-	if (internal) {
-		card_info.card_type = ALSA_CARD_TYPE_INTERNAL;
-	} else {
-		card_info.card_type = ALSA_CARD_TYPE_USB;
-		fill_usb_card_info(&card_info, dev);
-	}
-
-	cras_system_add_alsa_card(&card_info);
-}
-
-void device_remove_alsa(const char *sysname, unsigned card)
-{
-	udev_delay_for_alsa();
-	cras_system_remove_alsa_card(card);
-}
-
-static int udev_sound_initialized(struct udev_device *dev)
-{
-	/* udev will set SOUND_INITALIZED=1 for the main card node when the
-	 * system has already been initialized, i.e. when cras is restarted
-	 * on an already running system.
-	 */
-	const char *s;
-
-	s = udev_device_get_property_value(dev, "SOUND_INITIALIZED");
-	if (s)
-		return 1;
-
-	return 0;
-}
-
-static void change_udev_device_if_alsa_device(struct udev_device *dev)
-{
-	/* If the device, 'dev' is an alsa device, add it to the set of
-	 * devices available for I/O.  Mark it as the active device.
-	 */
-	unsigned internal;
-	unsigned card_number;
-	const char *sysname;
-
-	if (is_card_device(dev, &internal, &card_number, &sysname) &&
-	    udev_sound_initialized(dev) &&
-	    !cras_system_alsa_card_exists(card_number)) {
-		if (internal)
-			set_factory_default(card_number);
-		device_add_alsa(dev, sysname, card_number, internal);
-	}
-}
-
-static void remove_device_if_card(struct udev_device *dev)
-{
-	unsigned internal;
-	unsigned card_number;
-	const char *sysname;
-
-	if (is_card_device(dev, &internal, &card_number, &sysname))
-		device_remove_alsa(sysname, card_number);
-}
-
-static void enumerate_devices(struct udev_callback_data *data)
-{
-	struct udev_enumerate *enumerate = udev_enumerate_new(data->udev);
-	struct udev_list_entry *dl;
-	struct udev_list_entry *dev_list_entry;
-
-	udev_enumerate_add_match_subsystem(enumerate, subsystem);
-	udev_enumerate_scan_devices(enumerate);
-	dl = udev_enumerate_get_list_entry(enumerate);
-
-	udev_list_entry_foreach(dev_list_entry, dl)
-	{
-		const char *path = udev_list_entry_get_name(dev_list_entry);
-		struct udev_device *dev =
-			udev_device_new_from_syspath(data->udev, path);
-
-		change_udev_device_if_alsa_device(dev);
-		udev_device_unref(dev);
-	}
-	udev_enumerate_unref(enumerate);
-}
-
-static void udev_sound_subsystem_callback(void *arg, int revents)
-{
-	struct udev_callback_data *data = (struct udev_callback_data *)arg;
-	struct udev_device *dev;
-
-	dev = udev_monitor_receive_device(data->mon);
-	if (dev) {
-		const char *action = udev_device_get_action(dev);
-
-		if (is_action_change(action))
-			change_udev_device_if_alsa_device(dev);
-		else if (is_action_remove(action))
-			remove_device_if_card(dev);
-		udev_device_unref(dev);
-	} else
-		syslog(LOG_WARNING,
-		       "%s (internal error): "
-		       "No device obtained",
-		       __FUNCTION__);
-}
-
-static void compile_regex(regex_t *regex, const char *str)
-{
-	int r = regcomp(regex, str, REG_EXTENDED);
-	assert(r == 0);
-}
-
-static struct udev_callback_data udev_data;
-void cras_udev_start_sound_subsystem_monitor()
-{
-	int r;
-
-	udev_data.udev = udev_new();
-	assert(udev_data.udev != NULL);
-	udev_data.mon = udev_monitor_new_from_netlink(udev_data.udev, "udev");
-
-	udev_monitor_filter_add_match_subsystem_devtype(udev_data.mon,
-							subsystem, NULL);
-	udev_monitor_enable_receiving(udev_data.mon);
-	udev_data.fd = udev_monitor_get_fd(udev_data.mon);
-
-	r = cras_system_add_select_fd(udev_data.fd,
-				      udev_sound_subsystem_callback, &udev_data,
-				      POLLIN);
-	assert(r == 0);
-	compile_regex(&pcm_regex, pcm_regex_string);
-	compile_regex(&card_regex, card_regex_string);
-
-	enumerate_devices(&udev_data);
-}
-
-void cras_udev_stop_sound_subsystem_monitor()
-{
-	udev_unref(udev_data.udev);
-	regfree(&pcm_regex);
-	regfree(&card_regex);
-}
diff --git a/cras/src/server/cras_udev.h b/cras/src/server/cras_udev.h
deleted file mode 100644
index 7a90ea7..0000000
--- a/cras/src/server/cras_udev.h
+++ /dev/null
@@ -1,12 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_UDEV_H_
-#define CRAS_UDEV_H_
-
-void cras_udev_start_sound_subsystem_monitor();
-void cras_udev_stop_sound_subsystem_monitor();
-
-#endif /* CRAS_UDEV_H_ */
diff --git a/cras/src/server/cras_unified_rclient.c b/cras/src/server/cras_unified_rclient.c
deleted file mode 100644
index cdb7b47..0000000
--- a/cras/src/server/cras_unified_rclient.c
+++ /dev/null
@@ -1,37 +0,0 @@
-/* Copyright 2020 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <syslog.h>
-
-#include "cras_iodev_list.h"
-#include "cras_messages.h"
-#include "cras_observer.h"
-#include "cras_rclient.h"
-#include "cras_rclient_util.h"
-#include "cras_rstream.h"
-#include "cras_types.h"
-#include "cras_util.h"
-
-/* Declarations of cras_rclient operators for cras_unified_rclient. */
-static const struct cras_rclient_ops cras_unified_rclient_ops = {
-	.handle_message_from_client = rclient_handle_message_from_client,
-	.send_message_to_client = rclient_send_message_to_client,
-	.destroy = rclient_destroy,
-};
-
-/*
- * Exported Functions.
- */
-
-/* Creates a client structure and sends a message back informing the client that
- * the connection has succeeded. */
-struct cras_rclient *cras_unified_rclient_create(int fd, size_t id)
-{
-	int supported_directions =
-		cras_stream_direction_mask(CRAS_STREAM_OUTPUT) |
-		cras_stream_direction_mask(CRAS_STREAM_INPUT);
-	return rclient_generic_create(fd, id, &cras_unified_rclient_ops,
-				      supported_directions);
-}
diff --git a/cras/src/server/cras_unified_rclient.h b/cras/src/server/cras_unified_rclient.h
deleted file mode 100644
index 19973f8..0000000
--- a/cras/src/server/cras_unified_rclient.h
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Copyright 2020 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_UNIFIED_RCLIENT_H_
-#define CRAS_UNIFIED_RCLIENT_H_
-
-struct cras_rclient;
-
-/* Creates a unified rclient structure. This client supports only playback
- * and capture functions but not control features.
- * Args:
- *    fd - The file descriptor used for communication with the client.
- *    id - Unique identifier for this client.
- * Returns:
- *    A pointer to the newly created rclient on success, NULL on failure.
- */
-struct cras_rclient *cras_unified_rclient_create(int fd, size_t id);
-
-#endif /* CRAS_UNIFIED_RCLIENT_H_ */
diff --git a/cras/src/server/cras_utf8.c b/cras/src/server/cras_utf8.c
deleted file mode 100644
index ebb8a89..0000000
--- a/cras/src/server/cras_utf8.c
+++ /dev/null
@@ -1,182 +0,0 @@
-/* Copyright 2016 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <stdlib.h>
-#include <stdint.h>
-#include <sys/types.h>
-
-#ifdef CRAS_DBUS
-#include <dbus/dbus.h>
-#endif
-
-#include "cras_utf8.h"
-#include "cras_util.h"
-
-static const uint8_t kUTF8ByteOrderMask[3] = { 0xef, 0xbb, 0xbf };
-
-typedef struct u8range {
-	uint8_t min;
-	uint8_t max;
-} u8range_t;
-
-static const u8range_t kUTF8TwoByteSeq[] = {
-	{ 0xc2, 0xdf },
-	{ 0x80, 0xbf },
-	{ 0, 0 },
-};
-
-static const u8range_t kUTF8ByteSeqE0[] = {
-	{ 0xe0, 0xe0 },
-	{ 0xa0, 0xbf },
-	{ 0x80, 0xbf },
-	{ 0, 0 },
-};
-
-static const u8range_t kUTF8ByteSeqE1EC[] = {
-	{ 0xe1, 0xec },
-	{ 0x80, 0xbf },
-	{ 0x80, 0xbf },
-	{ 0, 0 },
-};
-
-static const u8range_t kUTF8ByteSeqED[] = {
-	{ 0xed, 0xed },
-	{ 0x80, 0x9f },
-	{ 0x80, 0xbf },
-	{ 0, 0 },
-};
-
-static const u8range_t kUTF8ByteSeqEEEF[] = {
-	{ 0xee, 0xef },
-	{ 0x80, 0xbf },
-	{ 0x80, 0xbf },
-	{ 0, 0 },
-};
-
-static const u8range_t kUTF8ByteSeqF0[] = {
-	{ 0xf0, 0xf0 }, { 0x90, 0xbf }, { 0x80, 0xbf },
-	{ 0x80, 0xbf }, { 0, 0 },
-};
-
-static const u8range_t kUTF8ByteSeqF1F3[] = {
-	{ 0xf1, 0xf3 }, { 0x80, 0xbf }, { 0x80, 0xbf },
-	{ 0x80, 0xbf }, { 0, 0 },
-};
-
-static const u8range_t kUTF8ByteSeqF4[] = {
-	{ 0xf4, 0xf4 }, { 0x80, 0x8f }, { 0x80, 0xbf },
-	{ 0x80, 0xbf }, { 0, 0 },
-};
-
-static const u8range_t kUTF8NullRange[] = { { 0, 0 } };
-
-typedef struct utf8seq {
-	const u8range_t *ranges;
-} utf8seq_t;
-
-static const utf8seq_t kUTF8Sequences[] = {
-	{ kUTF8TwoByteSeq },  { kUTF8ByteSeqE0 },   { kUTF8ByteSeqE1EC },
-	{ kUTF8ByteSeqED },   { kUTF8ByteSeqEEEF }, { kUTF8ByteSeqF0 },
-	{ kUTF8ByteSeqF1F3 }, { kUTF8ByteSeqF4 },   { kUTF8NullRange }
-};
-
-int valid_utf8_string(const char *string, size_t *bad_pos)
-{
-	int bom_chars = 0;
-	uint8_t byte;
-	const char *pos = string;
-	int ret = 1;
-	const utf8seq_t *seq = NULL;
-	const u8range_t *range = NULL;
-
-	if (!pos) {
-		ret = 0;
-		goto error;
-	}
-
-	while ((byte = (uint8_t) * (pos++))) {
-		if (!range || range->min == 0) {
-			if (byte < 128) {
-				/* Ascii character. */
-				continue;
-			}
-
-			if (bom_chars < ARRAY_SIZE(kUTF8ByteOrderMask)) {
-				if (byte == kUTF8ByteOrderMask[bom_chars]) {
-					bom_chars++;
-					continue;
-				} else {
-					/* Characters not matching BOM.
-					 * Rewind and assume that there is
-					 * no BOM. */
-					bom_chars =
-						ARRAY_SIZE(kUTF8ByteOrderMask);
-					pos = string;
-					continue;
-				}
-			}
-
-			/* Find the matching sequence of characters by
-			 * matching the first character in the sequence.
-			 */
-			seq = kUTF8Sequences;
-			while (seq->ranges->min != 0) {
-				if (byte >= seq->ranges->min &&
-				    byte <= seq->ranges->max) {
-					/* Matching sequence. */
-					break;
-				}
-				seq++;
-			}
-
-			if (seq->ranges->min == 0) {
-				/* Could not find a matching sequence. */
-				ret = 0;
-				goto error;
-			}
-
-			/* Found the appropriate sequence. */
-			range = seq->ranges + 1;
-			continue;
-		}
-
-		if (byte >= range->min && byte <= range->max) {
-			range++;
-			continue;
-		}
-
-		/* This character doesn't belong in UTF8. */
-		ret = 0;
-		goto error;
-	}
-
-	if (range && range->min != 0) {
-		/* Stopped in the middle of a sequence. */
-		ret = 0;
-	}
-
-error:
-	if (bad_pos)
-		*bad_pos = pos - string - 1;
-	return ret;
-}
-
-#ifdef CRAS_DBUS
-/* Use the DBus implementation if available to ensure that the UTF-8
- * sequences match those expected by the DBus implementation. */
-
-int is_utf8_string(const char *string)
-{
-	return !!dbus_validate_utf8(string, NULL);
-}
-
-#else
-
-int is_utf8_string(const char *string)
-{
-	return valid_utf8_string(string, NULL);
-}
-
-#endif
diff --git a/cras/src/server/cras_utf8.h b/cras/src/server/cras_utf8.h
deleted file mode 100644
index b4625fb..0000000
--- a/cras/src/server/cras_utf8.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/* Copyright 2016 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <sys/types.h>
-
-/* Checks if a string is valid UTF-8.
- *
- * Supports 1 to 4 character UTF-8 sequences. Passes tests here:
- *    https://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt
- *
- * Exceptions: The following unicode non-characters are allowed:
- *    U+FFFE, U+FFFF, U+FDD0 - U+FDEF, U+nFFFE (n = 1 - 10),
- *    U+nFFFD (n = 1 - 10).
- *
- * Args:
- *    string[in] - a string.
- *    bad_pos[out] - position of the first bad character.
- *
- * Returns:
- *    1 if it is a vlid utf-8 string. 0 otherwise.
- *    bad_pos contains the strlen() of the string if it is
- *    valid.
- */
-int valid_utf8_string(const char *string, size_t *bad_pos);
-
-/* Checks if a string is a valid utf-8 string.
- *
- * Args:
- *    string[in] - a string.
- *
- * Returns:
- *    1 if it is a valid utf-8 string. 0 otherwise.
- */
-int is_utf8_string(const char *string);
diff --git a/cras/src/server/cras_volume_curve.c b/cras/src/server/cras_volume_curve.c
deleted file mode 100644
index a866122..0000000
--- a/cras/src/server/cras_volume_curve.c
+++ /dev/null
@@ -1,80 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <stddef.h>
-#include <stdlib.h>
-#include <sys/param.h>
-
-#include "cras_util.h"
-#include "cras_volume_curve.h"
-
-/* Simple curve with configurable max volume and volume step. */
-struct stepped_curve {
-	struct cras_volume_curve curve;
-	long max_vol;
-	long step;
-};
-
-static long get_dBFS_step(const struct cras_volume_curve *curve, size_t volume)
-{
-	const struct stepped_curve *c = (const struct stepped_curve *)curve;
-	return c->max_vol - (c->step * (MAX_VOLUME - volume));
-}
-
-/* Curve that has each step explicitly called out by value. */
-struct explicit_curve {
-	struct cras_volume_curve curve;
-	long dB_values[NUM_VOLUME_STEPS];
-};
-
-static long get_dBFS_explicit(const struct cras_volume_curve *curve,
-			      size_t volume)
-{
-	const struct explicit_curve *c = (const struct explicit_curve *)curve;
-
-	/* Limit volume to (0, MAX_VOLUME). */
-	volume = MIN(MAX_VOLUME, MAX(0, volume));
-	return c->dB_values[volume];
-}
-
-/*
- * Exported Interface.
- */
-
-struct cras_volume_curve *cras_volume_curve_create_default()
-{
-	/* Default to max volume of 0dBFS, and a step of 0.5dBFS. */
-	return cras_volume_curve_create_simple_step(0, 50);
-}
-
-struct cras_volume_curve *cras_volume_curve_create_simple_step(long max_volume,
-							       long volume_step)
-{
-	struct stepped_curve *curve;
-	curve = (struct stepped_curve *)calloc(1, sizeof(*curve));
-	if (curve == NULL)
-		return NULL;
-	curve->curve.get_dBFS = get_dBFS_step;
-	curve->max_vol = max_volume;
-	curve->step = volume_step;
-	return &curve->curve;
-}
-
-struct cras_volume_curve *
-cras_volume_curve_create_explicit(long dB_values[NUM_VOLUME_STEPS])
-{
-	struct explicit_curve *curve;
-	curve = (struct explicit_curve *)calloc(1, sizeof(*curve));
-	if (curve == NULL)
-		return NULL;
-	curve->curve.get_dBFS = get_dBFS_explicit;
-	memcpy(curve->dB_values, dB_values, sizeof(curve->dB_values));
-	return &curve->curve;
-}
-
-void cras_volume_curve_destroy(struct cras_volume_curve *curve)
-{
-	free(curve);
-}
diff --git a/cras/src/server/cras_volume_curve.h b/cras/src/server/cras_volume_curve.h
deleted file mode 100644
index c3b0ee6..0000000
--- a/cras/src/server/cras_volume_curve.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_VOLUME_CURVE_H_
-#define CRAS_VOLUME_CURVE_H_
-
-#define MAX_VOLUME 100
-#define NUM_VOLUME_STEPS (MAX_VOLUME + 1) /* 0-100 inclusive. */
-
-/* Holds the function that converts from a volume index to a dBFS value. */
-struct cras_volume_curve {
-	/* Function to convert from index to dBFS value.
-	 * Args:
-	 *    curve - A curve from cras_volume_curve_create_* functions.
-	 *    volume - The volume level from 0 to 100.
-	 * Returns:
-	 *    The volume to apply in dB * 100.  This value will normally be
-	 *    negative and is means dB down from full scale.
-	 */
-	long (*get_dBFS)(const struct cras_volume_curve *curve, size_t volume);
-};
-
-/* Creates a system-default volume curve. The default curve maps one volume step
- * to 1 dB down.
- * Returns null on error, or the new volume curve on success.
- */
-struct cras_volume_curve *cras_volume_curve_create_default();
-
-/* Creates a volume curve with a specified max volume and step.
- * Args:
- *    max_volume - Maximum volume allowed in dBFS.
- *    volume_step - Number of dB to change for one volume tick.
- */
-struct cras_volume_curve *
-cras_volume_curve_create_simple_step(long max_volume, long volume_step);
-
-/* Creates a volume curve with each step's dB value called out.
- * Args:
- *    dB_values - Each element specifies what the volume should be set to (in
- *      dB) for the volume at that index.
- * Returns:
- *    A volume curve pointer that should  be passed to
- *    cras_volume_curve_destroy() when it is no longer needed. If there is an
- *    error NULL will be returned.
- */
-struct cras_volume_curve *
-cras_volume_curve_create_explicit(long dB_values[101]);
-
-/* Destroys a curve created with cras_volume_curve_create_*.
- * Args:
- *    curve - The curve to destroy.
- */
-void cras_volume_curve_destroy(struct cras_volume_curve *curve);
-
-#endif /* CRAS_VOLUME_CURVE_H_ */
diff --git a/cras/src/server/dev_io.c b/cras/src/server/dev_io.c
deleted file mode 100644
index b311b22..0000000
--- a/cras/src/server/dev_io.c
+++ /dev/null
@@ -1,1583 +0,0 @@
-/* Copyright 2017 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <poll.h>
-#include <stdbool.h>
-#include <syslog.h>
-
-#include "audio_thread_log.h"
-#include "cras_audio_area.h"
-#include "cras_audio_thread_monitor.h"
-#include "cras_device_monitor.h"
-#include "cras_iodev.h"
-#include "cras_non_empty_audio_handler.h"
-#include "cras_rstream.h"
-#include "cras_server_metrics.h"
-#include "dev_stream.h"
-#include "input_data.h"
-#include "polled_interval_checker.h"
-#include "rate_estimator.h"
-#include "utlist.h"
-
-#include "dev_io.h"
-
-static const struct timespec playback_wake_fuzz_ts = {
-	0, 500 * 1000 /* 500 usec. */
-};
-
-/* The maximum time to wait before checking the device's non-empty status. */
-static const int NON_EMPTY_UPDATE_INTERVAL_SEC = 5;
-
-/*
- * The minimum number of consecutive seconds of empty audio that must be
- * played before a device is considered to be playing empty audio.
- */
-static const int MIN_EMPTY_PERIOD_SEC = 30;
-
-/*
- * When the hw_level is less than this time, do not drop frames.
- * (unit: millisecond).
- * TODO(yuhsuan): Reduce the threshold when we create the other overrun op for
- * boards which captures a lot of frames at one time.
- * e.g. Input devices on grunt reads 1024 frames each time.
- */
-static const int DROP_FRAMES_THRESHOLD_MS = 50;
-
-/* The number of devices playing/capturing non-empty stream(s). */
-static int non_empty_device_count = 0;
-
-/* The timestamp of last EIO error time. */
-static struct timespec last_io_err_time = { 0, 0 };
-
-/* The gap time to avoid repeated error close request to main thread. */
-static const int ERROR_CLOSE_GAP_TIME_SECS = 10;
-
-/* Gets the main device which the stream is attached to. */
-static inline struct cras_iodev *get_main_dev(const struct dev_stream *stream)
-{
-	return (struct cras_iodev *)stream->stream->main_dev.dev_ptr;
-}
-
-/* Updates the estimated sample rate of open device to all attached
- * streams.
- */
-static void update_estimated_rate(struct open_dev *adev,
-				  struct open_dev *odev_list,
-				  bool self_rate_need_update)
-{
-	struct cras_iodev *main_dev;
-	struct cras_iodev *dev = adev->dev;
-	struct cras_iodev *tracked_dev = NULL;
-	struct dev_stream *dev_stream;
-	double dev_rate_ratio;
-	double main_dev_rate_ratio;
-
-	/*
-	 * If there is an output device on the same sound card running with the same
-	 * sampling rate, use the rate of that output device for this device.
-	 */
-	if (dev->direction == CRAS_STREAM_INPUT &&
-	    cras_iodev_is_on_internal_card(dev->active_node)) {
-		struct open_dev *odev;
-		DL_FOREACH (odev_list, odev) {
-			if (!cras_iodev_is_on_internal_card(
-				    odev->dev->active_node))
-				continue;
-			if (odev->dev->format->frame_rate !=
-			    dev->format->frame_rate)
-				continue;
-			tracked_dev = odev->dev;
-			break;
-		}
-	}
-
-	/*
-	 * Self-owned rate esimator does not need to udpate rate. There is no tracked
-	 * output device. So there is no need to update.
-	 */
-	if (!self_rate_need_update && !tracked_dev)
-		return;
-
-	DL_FOREACH (dev->streams, dev_stream) {
-		main_dev = get_main_dev(dev_stream);
-		if (main_dev == NULL) {
-			syslog(LOG_ERR, "Fail to find main open dev.");
-			continue;
-		}
-
-		if (tracked_dev) {
-			dev_rate_ratio =
-				cras_iodev_get_est_rate_ratio(tracked_dev);
-			main_dev_rate_ratio = dev_rate_ratio;
-		} else {
-			dev_rate_ratio = cras_iodev_get_est_rate_ratio(dev);
-			main_dev_rate_ratio =
-				cras_iodev_get_est_rate_ratio(main_dev);
-		}
-
-		dev_stream_set_dev_rate(dev_stream, dev->format->frame_rate,
-					dev_rate_ratio, main_dev_rate_ratio,
-					adev->coarse_rate_adjust);
-	}
-}
-
-/*
- * Counts the number of devices which are currently playing/capturing non-empty
- * audio.
- */
-static inline int count_non_empty_dev(struct open_dev *adevs)
-{
-	int count = 0;
-	struct open_dev *adev;
-	DL_FOREACH (adevs, adev) {
-		if (!adev->empty_pi || !pic_interval_elapsed(adev->empty_pi))
-			count++;
-	}
-	return count;
-}
-
-int dev_io_check_non_empty_state_transition(struct open_dev *adevs)
-{
-	int new_non_empty_dev_count = count_non_empty_dev(adevs);
-
-	// If we have transitioned to or from a state with 0 non-empty devices,
-	// notify the main thread to update system state.
-	if ((non_empty_device_count == 0) != (new_non_empty_dev_count == 0))
-		cras_non_empty_audio_send_msg(new_non_empty_dev_count > 0 ? 1 :
-									    0);
-
-	non_empty_device_count = new_non_empty_dev_count;
-	return non_empty_device_count > 0;
-}
-
-/* Checks whether it is time to fetch. */
-static bool is_time_to_fetch(const struct dev_stream *dev_stream,
-			     struct timespec now)
-{
-	const struct timespec *next_cb_ts;
-	next_cb_ts = dev_stream_next_cb_ts(dev_stream);
-	if (!next_cb_ts)
-		return 0;
-
-	/*
-	 * Check if it's time to get more data from this stream.
-	 * Allow for waking up a little early.
-	 */
-	add_timespecs(&now, &playback_wake_fuzz_ts);
-	if (timespec_after(&now, next_cb_ts))
-		return 1;
-
-	return 0;
-}
-
-/* The log only accepts uint32 arguments, so the float power
- * must be written as bits and assumed to have a float when
- * parsing the log.
- */
-static uint32_t get_ewma_power_as_int(struct ewma_power *ewma)
-{
-	uint32_t pow_as_int = 0;
-
-	if (sizeof(uint32_t) == sizeof(float))
-		memcpy(&pow_as_int, &ewma->power, sizeof(uint32_t));
-	return pow_as_int;
-}
-
-/* Asks any stream with room for more data. Sets the time stamp for all streams.
- * Args:
- *    adev - The output device streams are attached to.
- * Returns:
- *    0 on success, negative error on failure. If failed, can assume that all
- *    streams have been removed from the device.
- */
-static int fetch_streams(struct open_dev *adev)
-{
-	struct dev_stream *dev_stream;
-	struct cras_iodev *odev = adev->dev;
-	int rc;
-	int delay;
-
-	delay = cras_iodev_delay_frames(odev);
-	if (delay < 0)
-		return delay;
-
-	DL_FOREACH (adev->dev->streams, dev_stream) {
-		struct cras_rstream *rstream = dev_stream->stream;
-		struct cras_audio_shm *shm = cras_rstream_shm(rstream);
-		struct timespec now;
-
-		clock_gettime(CLOCK_MONOTONIC_RAW, &now);
-
-		if (dev_stream_is_pending_reply(dev_stream)) {
-			dev_stream_flush_old_audio_messages(dev_stream);
-			cras_rstream_record_fetch_interval(dev_stream->stream,
-							   &now);
-		}
-
-		if (!dev_stream_is_running(dev_stream))
-			continue;
-
-		if (!is_time_to_fetch(dev_stream, now))
-			continue;
-
-		if (cras_shm_get_frames(shm) < 0)
-			cras_rstream_set_is_draining(rstream, 1);
-
-		if (cras_rstream_get_is_draining(dev_stream->stream))
-			continue;
-
-		/*
-		 * Skip fetching if client still has not replied yet.
-		 */
-		if (cras_rstream_is_pending_reply(rstream)) {
-			ATLOG(atlog, AUDIO_THREAD_STREAM_FETCH_PENDING,
-			      cras_rstream_id(rstream), 0, 0);
-			continue;
-		}
-
-		/*
-		 * Skip fetching if there are enough frames in shared memory.
-		 */
-		if (!cras_shm_is_buffer_available(shm)) {
-			ATLOG(atlog, AUDIO_THREAD_STREAM_SKIP_CB,
-			      cras_rstream_id(rstream),
-			      shm->header->write_offset[0],
-			      shm->header->write_offset[1]);
-			dev_stream_update_next_wake_time(dev_stream);
-			cras_server_metrics_missed_cb_event(dev_stream->stream);
-			continue;
-		}
-
-		dev_stream_set_delay(dev_stream, delay);
-
-		ATLOG(atlog, AUDIO_THREAD_FETCH_STREAM, rstream->stream_id,
-		      cras_rstream_get_cb_threshold(rstream),
-		      get_ewma_power_as_int(&rstream->ewma));
-
-		rc = dev_stream_request_playback_samples(dev_stream, &now);
-		if (rc < 0) {
-			syslog(LOG_ERR, "fetch err: %d for %x", rc,
-			       cras_rstream_id(rstream));
-			cras_rstream_set_is_draining(rstream, 1);
-		}
-	}
-
-	return 0;
-}
-
-/* Gets the max delay frames of open input devices. */
-static int input_delay_frames(struct open_dev *adevs)
-{
-	struct open_dev *adev;
-	int delay;
-	int max_delay = 0;
-
-	DL_FOREACH (adevs, adev) {
-		if (!cras_iodev_is_open(adev->dev))
-			continue;
-		delay = cras_iodev_delay_frames(adev->dev);
-		if (delay < 0)
-			return delay;
-		if (delay > max_delay)
-			max_delay = delay;
-	}
-	return max_delay;
-}
-
-/* Sets the stream delay.
- * Args:
- *    adev[in] - The device to capture from.
- */
-static unsigned int set_stream_delay(struct open_dev *adev)
-{
-	struct dev_stream *stream;
-	int delay;
-
-	/* TODO(dgreid) - Setting delay from last dev only. */
-	delay = input_delay_frames(adev);
-
-	DL_FOREACH (adev->dev->streams, stream) {
-		if (stream->stream->flags & TRIGGER_ONLY)
-			continue;
-
-		dev_stream_set_delay(stream, delay);
-	}
-
-	return 0;
-}
-
-/* Gets the minimum amount of space available for writing across all streams.
- * Args:
- *    adev[in] - The device to capture from.
- *    write_limit[in] - Initial limit to number of frames to capture.
- *    limit_stream[out] - The pointer to the pointer of stream which
- *                        causes capture limit.
- *                        Output NULL if there is no stream that causes
- *                        capture limit less than the initial limit.
- */
-static unsigned int get_stream_limit(struct open_dev *adev,
-				     unsigned int write_limit,
-				     struct dev_stream **limit_stream)
-{
-	struct cras_rstream *rstream;
-	struct cras_audio_shm *shm;
-	struct dev_stream *stream;
-	unsigned int avail;
-
-	*limit_stream = NULL;
-
-	DL_FOREACH (adev->dev->streams, stream) {
-		rstream = stream->stream;
-		if (rstream->flags & TRIGGER_ONLY)
-			continue;
-
-		shm = cras_rstream_shm(rstream);
-		if (cras_shm_check_write_overrun(shm))
-			ATLOG(atlog, AUDIO_THREAD_READ_OVERRUN,
-			      adev->dev->info.idx, rstream->stream_id,
-			      shm->header->num_overruns);
-		avail = dev_stream_capture_avail(stream);
-		if (avail < write_limit) {
-			write_limit = avail;
-			*limit_stream = stream;
-		}
-	}
-
-	return write_limit;
-}
-
-/*
- * The minimum wake time for a input device, which is 5ms. It's only used by
- * function get_input_dev_max_wake_ts.
- */
-static const struct timespec min_input_dev_wake_ts = {
-	0, 5 * 1000 * 1000 /* 5 ms. */
-};
-
-/*
- * Get input device maximum sleep time, which is the approximate time that the
- * device will have hw_level = buffer_size / 2 samples. Some devices have
- * capture period = 2 so the audio_thread should wake up and consume some
- * samples from hardware at that time. To prevent busy loop occurs, the returned
- * sleep time should be >= 5ms.
- *
- * Returns: 0 on success negative error on device failure.
- */
-static int get_input_dev_max_wake_ts(struct open_dev *adev,
-				     unsigned int curr_level,
-				     struct timespec *res_ts)
-{
-	struct timespec dev_wake_ts, now;
-	unsigned int dev_rate, half_buffer_size, target_frames;
-
-	if (!adev || !adev->dev || !adev->dev->format ||
-	    !adev->dev->format->frame_rate || !adev->dev->buffer_size)
-		return -EINVAL;
-
-	*res_ts = min_input_dev_wake_ts;
-
-	dev_rate = adev->dev->format->frame_rate;
-	half_buffer_size = adev->dev->buffer_size / 2;
-	if (curr_level < half_buffer_size)
-		target_frames = half_buffer_size - curr_level;
-	else
-		target_frames = 0;
-
-	cras_frames_to_time(target_frames, dev_rate, &dev_wake_ts);
-
-	if (timespec_after(&dev_wake_ts, res_ts)) {
-		*res_ts = dev_wake_ts;
-	}
-
-	clock_gettime(CLOCK_MONOTONIC_RAW, &now);
-	add_timespecs(res_ts, &now);
-	return 0;
-}
-
-/* Returns whether a device can drop samples. */
-static bool input_devices_can_drop_samples(struct cras_iodev *iodev)
-{
-	if (!cras_iodev_is_open(iodev))
-		return false;
-	if (!iodev->streams)
-		return false;
-	if (!iodev->active_node ||
-	    iodev->active_node->type == CRAS_NODE_TYPE_HOTWORD ||
-	    iodev->active_node->type == CRAS_NODE_TYPE_POST_MIX_PRE_DSP ||
-	    iodev->active_node->type == CRAS_NODE_TYPE_POST_DSP)
-		return false;
-	return true;
-}
-
-/*
- * Set wake_ts for this device to be the earliest wake up time for
- * dev_streams. Default value for adev->wake_ts will be now + 20s even if
- * any error occurs in this function.
- * Args:
- *    adev - The input device.
- *    need_to_drop - The pointer to store whether we need to drop samples from
- *                   a device in order to keep the lower hw_level.
- * Returns:
- *    0 on success. Negative error code on failure.
- */
-static int set_input_dev_wake_ts(struct open_dev *adev, bool *need_to_drop)
-{
-	int rc;
-	struct timespec level_tstamp, wake_time_out, min_ts, now, dev_wake_ts;
-	unsigned int curr_level, cap_limit;
-	struct dev_stream *stream;
-	struct dev_stream *cap_limit_stream;
-
-	/* Limit the sleep time to 20 seconds. */
-	min_ts.tv_sec = 20;
-	min_ts.tv_nsec = 0;
-	clock_gettime(CLOCK_MONOTONIC_RAW, &now);
-	add_timespecs(&min_ts, &now);
-	/* Set default value for device wake_ts. */
-	adev->wake_ts = min_ts;
-
-	rc = cras_iodev_frames_queued(adev->dev, &level_tstamp);
-	if (rc < 0)
-		return rc;
-	curr_level = rc;
-	if (!timespec_is_nonzero(&level_tstamp))
-		clock_gettime(CLOCK_MONOTONIC_RAW, &level_tstamp);
-
-	/*
-	 * Drop frames from all devices if any device meets these requirements:
-	 * 1. The hw_level is larger than largest_cb_level * 1.5 or larger than
-	 *    buffer_size * 0.5.
-	 * 2. The time of those frames is larger than DROP_FRAMES_THRESHOLD_MS.
-	 */
-	if (input_devices_can_drop_samples(adev->dev) &&
-	    (rc >= adev->dev->largest_cb_level * 1.5 ||
-	     rc >= adev->dev->buffer_size * 0.5) &&
-	    cras_frames_to_ms(rc, adev->dev->format->frame_rate) >=
-		    DROP_FRAMES_THRESHOLD_MS)
-		*need_to_drop = true;
-
-	cap_limit = get_stream_limit(adev, UINT_MAX, &cap_limit_stream);
-
-	/*
-	 * Loop through streams to find the earliest time audio thread
-	 * should wake up.
-	 */
-	DL_FOREACH (adev->dev->streams, stream) {
-		wake_time_out = min_ts;
-		rc = dev_stream_wake_time(stream, curr_level, &level_tstamp,
-					  cap_limit, cap_limit_stream == stream,
-					  &wake_time_out);
-
-		/*
-		 * rc > 0 means there is no need to set wake up time for this
-		 * stream.
-		 */
-		if (rc > 0)
-			continue;
-
-		if (rc < 0)
-			return rc;
-
-		if (timespec_after(&min_ts, &wake_time_out)) {
-			min_ts = wake_time_out;
-		}
-	}
-
-	/* If there's no room in streams, don't bother schedule wake for more
-	 * input data. */
-	if (adev->dev->active_node &&
-	    adev->dev->active_node->type != CRAS_NODE_TYPE_HOTWORD &&
-	    cap_limit) {
-		rc = get_input_dev_max_wake_ts(adev, curr_level, &dev_wake_ts);
-		if (rc < 0) {
-			syslog(LOG_ERR,
-			       "Failed to call get_input_dev_max_wake_ts."
-			       "rc = %d",
-			       rc);
-		} else if (timespec_after(&min_ts, &dev_wake_ts)) {
-			min_ts = dev_wake_ts;
-		}
-	}
-
-	adev->wake_ts = min_ts;
-	return rc;
-}
-
-/* Read samples from an input device to the specified stream.
- * Args:
- *    adev - The device to capture samples from.
- * Returns 0 on success.
- */
-static int capture_to_streams(struct open_dev *adev, struct open_dev *odev_list)
-{
-	struct cras_iodev *idev = adev->dev;
-	snd_pcm_uframes_t remainder, hw_level, cap_limit;
-	struct timespec hw_tstamp;
-	int rc;
-	struct dev_stream *cap_limit_stream;
-	struct dev_stream *stream;
-
-	DL_FOREACH (adev->dev->streams, stream)
-		dev_stream_flush_old_audio_messages(stream);
-
-	rc = cras_iodev_frames_queued(idev, &hw_tstamp);
-	if (rc < 0)
-		return rc;
-	hw_level = rc;
-
-	cras_iodev_update_highest_hw_level(idev, hw_level);
-
-	ATLOG(atlog, AUDIO_THREAD_READ_AUDIO_TSTAMP, idev->info.idx,
-	      hw_tstamp.tv_sec, hw_tstamp.tv_nsec);
-	if (timespec_is_nonzero(&hw_tstamp)) {
-		bool self_rate_need_update;
-
-		if (hw_level < idev->min_cb_level / 2)
-			adev->coarse_rate_adjust = 1;
-		else if (hw_level > idev->max_cb_level * 2)
-			adev->coarse_rate_adjust = -1;
-		else
-			adev->coarse_rate_adjust = 0;
-
-		/*
-		 * This values means whether the rate estimator in the device
-		 * wants to update estimated rate.
-		 */
-		self_rate_need_update =
-			!!cras_iodev_update_rate(idev, hw_level, &hw_tstamp);
-
-		/*
-		 * Always calls update_estimated_rate so that new output rate
-		 * has a chance to propagate to input. In update_estimated_rate,
-		 * it will decide whether the new rate is from self rate estimator
-		 * or from the tracked output device.
-		 */
-		update_estimated_rate(adev, odev_list, self_rate_need_update);
-	}
-
-	cap_limit = get_stream_limit(adev, hw_level, &cap_limit_stream);
-	set_stream_delay(adev);
-
-	remainder = MIN(hw_level, cap_limit);
-
-	ATLOG(atlog, AUDIO_THREAD_READ_AUDIO, idev->info.idx, hw_level,
-	      remainder);
-
-	if (cras_iodev_state(idev) != CRAS_IODEV_STATE_NORMAL_RUN)
-		return 0;
-
-	while (remainder > 0) {
-		struct cras_audio_area *area = NULL;
-		unsigned int nread, total_read;
-
-		nread = remainder;
-
-		rc = cras_iodev_get_input_buffer(idev, &nread);
-		if (rc < 0 || nread == 0)
-			return rc;
-
-		DL_FOREACH (adev->dev->streams, stream) {
-			unsigned int this_read;
-			unsigned int area_offset;
-			float software_gain_scaler;
-
-			if ((stream->stream->flags & TRIGGER_ONLY) &&
-			    stream->stream->triggered)
-				continue;
-
-			input_data_get_for_stream(idev->input_data,
-						  stream->stream,
-						  idev->buf_state, &area,
-						  &area_offset);
-
-			/*
-			 * The UI gain scaler should always take effect.
-			 * input_data will decide if stream and iodev internal
-			 * software gains should be used or not, based on use
-			 * case.
-			 */
-			software_gain_scaler =
-				cras_iodev_get_ui_gain_scaler(idev) *
-				input_data_get_software_gain_scaler(
-					idev->input_data,
-					idev->software_gain_scaler,
-					stream->stream);
-
-			this_read =
-				dev_stream_capture(stream, area, area_offset,
-						   software_gain_scaler);
-
-			input_data_put_for_stream(idev->input_data,
-						  stream->stream,
-						  idev->buf_state, this_read);
-		}
-
-		rc = cras_iodev_put_input_buffer(idev);
-		if (rc < 0)
-			return rc;
-
-		total_read = rc;
-		remainder -= nread;
-
-		if (total_read < nread)
-			break;
-	}
-
-	ATLOG(atlog, AUDIO_THREAD_READ_AUDIO_DONE, remainder,
-	      get_ewma_power_as_int(&idev->ewma), 0);
-
-	return 0;
-}
-
-/* Fill the buffer with samples from the attached streams.
- * Args:
- *    odevs - The list of open output devices, provided so streams can be
- *            removed from all devices on error.
- *    adev - The device to write to.
- *    dst - The buffer to put the samples in (returned from snd_pcm_mmap_begin)
- *    write_limit - The maximum number of frames to write to dst.
- *
- * Returns:
- *    The number of frames rendered on success.
- *    This number of frames is the minimum of the amount of frames each stream
- *    could provide which is the maximum that can currently be rendered.
- */
-static unsigned int write_streams(struct open_dev **odevs,
-				  struct open_dev *adev, uint8_t *dst,
-				  size_t write_limit)
-{
-	struct cras_iodev *odev = adev->dev;
-	struct dev_stream *curr;
-	unsigned int max_offset = 0;
-	unsigned int frame_bytes = cras_get_format_bytes(odev->format);
-	unsigned int num_playing = 0;
-	unsigned int drain_limit = write_limit;
-
-	/* Mix as much as we can, the minimum fill level of any stream. */
-	max_offset = cras_iodev_max_stream_offset(odev);
-
-	/* Mix as much as we can, the minimum fill level of any stream. */
-	DL_FOREACH (adev->dev->streams, curr) {
-		int dev_frames;
-
-		/* Skip stream which hasn't started running yet. */
-		if (!dev_stream_is_running(curr))
-			continue;
-
-		/* If this is a single output dev stream, updates the latest
-		 * number of frames for playback. */
-		if (dev_stream_attached_devs(curr) == 1)
-			dev_stream_update_frames(curr);
-
-		dev_frames = dev_stream_playback_frames(curr);
-		if (dev_frames < 0) {
-			dev_io_remove_stream(odevs, curr->stream, NULL);
-			continue;
-		}
-		ATLOG(atlog, AUDIO_THREAD_WRITE_STREAMS_STREAM,
-		      curr->stream->stream_id, dev_frames,
-		      dev_stream_is_pending_reply(curr));
-		if (cras_rstream_get_is_draining(curr->stream)) {
-			drain_limit = MIN((size_t)dev_frames, drain_limit);
-			if (!dev_frames)
-				dev_io_remove_stream(odevs, curr->stream, NULL);
-		} else {
-			write_limit = MIN((size_t)dev_frames, write_limit);
-			num_playing++;
-		}
-	}
-
-	if (!num_playing)
-		write_limit = drain_limit;
-
-	if (write_limit > max_offset)
-		memset(dst + max_offset * frame_bytes, 0,
-		       (write_limit - max_offset) * frame_bytes);
-
-	ATLOG(atlog, AUDIO_THREAD_WRITE_STREAMS_MIX, write_limit, max_offset,
-	      0);
-
-	DL_FOREACH (adev->dev->streams, curr) {
-		unsigned int offset;
-		int nwritten;
-
-		if (!dev_stream_is_running(curr))
-			continue;
-
-		offset = cras_iodev_stream_offset(odev, curr);
-		if (offset >= write_limit)
-			continue;
-		nwritten = dev_stream_mix(curr, odev->format,
-					  dst + frame_bytes * offset,
-					  write_limit - offset);
-
-		if (nwritten < 0) {
-			dev_io_remove_stream(odevs, curr->stream, NULL);
-			continue;
-		}
-
-		cras_iodev_stream_written(odev, curr, nwritten);
-	}
-
-	write_limit = cras_iodev_all_streams_written(odev);
-
-	ATLOG(atlog, AUDIO_THREAD_WRITE_STREAMS_MIXED, write_limit, 0, 0);
-
-	return write_limit;
-}
-
-/* Update next wake up time of the device.
- * Args:
- *    adev[in] - The device to update to.
- *    hw_level[out] - Pointer to number of frames in hardware.
- */
-void update_dev_wakeup_time(struct open_dev *adev, unsigned int *hw_level)
-{
-	struct timespec now;
-	struct timespec sleep_time;
-	double est_rate;
-	unsigned int frames_to_play_in_sleep;
-
-	clock_gettime(CLOCK_MONOTONIC_RAW, &now);
-
-	frames_to_play_in_sleep = cras_iodev_frames_to_play_in_sleep(
-		adev->dev, hw_level, &adev->wake_ts);
-	if (!timespec_is_nonzero(&adev->wake_ts))
-		adev->wake_ts = now;
-
-	if (cras_iodev_state(adev->dev) == CRAS_IODEV_STATE_NORMAL_RUN)
-		cras_iodev_update_highest_hw_level(adev->dev, *hw_level);
-
-	est_rate = adev->dev->format->frame_rate *
-		   cras_iodev_get_est_rate_ratio(adev->dev);
-
-	ATLOG(atlog, AUDIO_THREAD_SET_DEV_WAKE, adev->dev->info.idx, *hw_level,
-	      frames_to_play_in_sleep);
-
-	cras_frames_to_time_precise(frames_to_play_in_sleep, est_rate,
-				    &sleep_time);
-
-	add_timespecs(&adev->wake_ts, &sleep_time);
-
-	ATLOG(atlog, AUDIO_THREAD_DEV_SLEEP_TIME, adev->dev->info.idx,
-	      adev->wake_ts.tv_sec, adev->wake_ts.tv_nsec);
-}
-
-/* Returns 0 on success negative error on device failure. */
-int write_output_samples(struct open_dev **odevs, struct open_dev *adev,
-			 struct cras_fmt_conv *output_converter)
-{
-	struct cras_iodev *odev = adev->dev;
-	unsigned int hw_level;
-	struct timespec hw_tstamp;
-	unsigned int frames, fr_to_req;
-	snd_pcm_sframes_t written;
-	snd_pcm_uframes_t total_written = 0;
-	int rc;
-	int non_empty = 0;
-	int *non_empty_ptr = NULL;
-	uint8_t *dst = NULL;
-	struct cras_audio_area *area = NULL;
-
-	/* Possibly fill zeros for no_stream state and possibly transit state.
-	 */
-	rc = cras_iodev_prepare_output_before_write_samples(odev);
-	if (rc < 0) {
-		syslog(LOG_ERR, "Failed to prepare output dev for write");
-		return rc;
-	}
-
-	if (cras_iodev_state(odev) != CRAS_IODEV_STATE_NORMAL_RUN)
-		return 0;
-
-	rc = cras_iodev_frames_queued(odev, &hw_tstamp);
-	if (rc < 0)
-		return rc;
-	hw_level = rc;
-
-	ATLOG(atlog, AUDIO_THREAD_FILL_AUDIO_TSTAMP, adev->dev->info.idx,
-	      hw_tstamp.tv_sec, hw_tstamp.tv_nsec);
-	if (timespec_is_nonzero(&hw_tstamp)) {
-		if (hw_level < odev->min_cb_level / 2)
-			adev->coarse_rate_adjust = 1;
-		else if (hw_level > odev->max_cb_level * 2)
-			adev->coarse_rate_adjust = -1;
-		else
-			adev->coarse_rate_adjust = 0;
-
-		if (cras_iodev_update_rate(odev, hw_level, &hw_tstamp))
-			update_estimated_rate(adev, NULL, true);
-	}
-	ATLOG(atlog, AUDIO_THREAD_FILL_AUDIO, adev->dev->info.idx, hw_level,
-	      odev->min_cb_level);
-
-	/* Don't request more than hardware can hold. Note that min_buffer_level
-	 * has been subtracted from the actual hw_level so we need to take it
-	 * into account here. */
-	fr_to_req = cras_iodev_buffer_avail(odev, hw_level);
-
-	/* Have to loop writing to the device, will be at most 2 loops, this
-	 * only happens when the circular buffer is at the end and returns us a
-	 * partial area to write to from mmap_begin */
-	while (total_written < fr_to_req) {
-		frames = fr_to_req - total_written;
-		rc = cras_iodev_get_output_buffer(odev, &area, &frames);
-		if (rc < 0)
-			return rc;
-
-		/* TODO(dgreid) - This assumes interleaved audio. */
-		dst = area->channels[0].buf;
-		written = write_streams(odevs, adev, dst, frames);
-		if (written < (snd_pcm_sframes_t)frames)
-			/* Got all the samples from client that we can, but it
-			 * won't fill the request. */
-			fr_to_req = 0; /* break out after committing samples */
-
-		// This interval is lazily initialized once per device.
-		// Note that newly opened devices are considered non-empty
-		// (until their status is updated through the normal flow).
-		if (!adev->non_empty_check_pi) {
-			adev->non_empty_check_pi = pic_polled_interval_create(
-				NON_EMPTY_UPDATE_INTERVAL_SEC);
-		}
-
-		// If we were empty last iteration, or the sampling interval
-		// has elapsed, check for emptiness.
-		if (adev->empty_pi ||
-		    pic_interval_elapsed(adev->non_empty_check_pi)) {
-			non_empty_ptr = &non_empty;
-			pic_interval_reset(adev->non_empty_check_pi);
-		}
-
-		rc = cras_iodev_put_output_buffer(
-			odev, dst, written, non_empty_ptr, output_converter);
-
-		if (rc < 0)
-			return rc;
-		total_written += written;
-
-		if (non_empty && adev->empty_pi) {
-			// We're not empty, but we were previously.
-			// Reset the empty period.
-			pic_polled_interval_destroy(&adev->empty_pi);
-		}
-
-		if (non_empty_ptr && !non_empty && !adev->empty_pi)
-			// We checked for emptiness, we were empty, and we
-			// previously weren't. Start the empty period.
-			adev->empty_pi = pic_polled_interval_create(
-				MIN_EMPTY_PERIOD_SEC);
-	}
-
-	ATLOG(atlog, AUDIO_THREAD_FILL_AUDIO_DONE, hw_level, total_written,
-	      get_ewma_power_as_int(&odev->ewma));
-
-	return total_written;
-}
-
-/*
- * Chooses the smallest difference between hw_level and min_cb_level as the
- * drop time.
- */
-static void get_input_devices_drop_time(struct open_dev *idev_list,
-					struct timespec *reset_ts)
-{
-	struct open_dev *adev;
-	struct cras_iodev *iodev;
-	struct timespec tmp;
-	struct timespec hw_tstamp;
-	double est_rate;
-	unsigned int target_level;
-	bool is_set = false;
-	int rc;
-
-	DL_FOREACH (idev_list, adev) {
-		iodev = adev->dev;
-		if (!input_devices_can_drop_samples(iodev))
-			continue;
-
-		rc = cras_iodev_frames_queued(iodev, &hw_tstamp);
-		if (rc < 0) {
-			syslog(LOG_ERR, "Get frames from device %d, rc = %d",
-			       iodev->info.idx, rc);
-			continue;
-		}
-
-		target_level = iodev->min_cb_level;
-		if (rc <= target_level) {
-			reset_ts->tv_sec = 0;
-			reset_ts->tv_nsec = 0;
-			return;
-		}
-		est_rate = iodev->format->frame_rate *
-			   cras_iodev_get_est_rate_ratio(iodev);
-		cras_frames_to_time(rc - target_level, est_rate, &tmp);
-
-		if (!is_set || timespec_after(reset_ts, &tmp)) {
-			*reset_ts = tmp;
-			is_set = true;
-		}
-	}
-}
-
-/*
- * Drop samples from all input devices.
- */
-static void dev_io_drop_samples(struct open_dev *idev_list)
-{
-	struct open_dev *adev;
-	struct timespec drop_time = {};
-	int rc;
-
-	get_input_devices_drop_time(idev_list, &drop_time);
-	ATLOG(atlog, AUDIO_THREAD_CAPTURE_DROP_TIME, drop_time.tv_sec,
-	      drop_time.tv_nsec, 0);
-
-	if (timespec_is_zero(&drop_time))
-		return;
-
-	DL_FOREACH (idev_list, adev) {
-		if (!input_devices_can_drop_samples(adev->dev))
-			continue;
-
-		rc = cras_iodev_drop_frames_by_time(adev->dev, drop_time);
-		if (rc < 0) {
-			syslog(LOG_ERR,
-			       "Failed to drop frames from device %d, rc = %d",
-			       adev->dev->info.idx, rc);
-			continue;
-		}
-	}
-
-	cras_audio_thread_event_drop_samples();
-
-	return;
-}
-
-/*
- * Public funcitons.
- */
-
-int dev_io_send_captured_samples(struct open_dev *idev_list)
-{
-	struct open_dev *adev;
-	bool need_to_drop = false;
-	int rc;
-
-	// TODO(dgreid) - once per rstream, not once per dev_stream.
-	DL_FOREACH (idev_list, adev) {
-		struct dev_stream *stream;
-
-		if (!cras_iodev_is_open(adev->dev))
-			continue;
-
-		/* Post samples to rstream if there are enough samples. */
-		DL_FOREACH (adev->dev->streams, stream) {
-			dev_stream_capture_update_rstream(stream);
-		}
-
-		/* Set wake_ts for this device. */
-		rc = set_input_dev_wake_ts(adev, &need_to_drop);
-		if (rc < 0)
-			return rc;
-	}
-
-	if (need_to_drop)
-		dev_io_drop_samples(idev_list);
-
-	return 0;
-}
-
-static void handle_dev_err(int err_rc, struct open_dev **odevs,
-			   struct open_dev *adev)
-{
-	struct timespec diff, now;
-	if (err_rc == -EPIPE) {
-		/* Handle severe underrun. */
-		ATLOG(atlog, AUDIO_THREAD_SEVERE_UNDERRUN, adev->dev->info.idx,
-		      0, 0);
-		cras_iodev_reset_request(adev->dev);
-		cras_audio_thread_event_severe_underrun();
-	} else if (err_rc == -EIO) {
-		syslog(LOG_WARNING, "I/O err, reseting %s dev %s",
-		       adev->dev->direction == CRAS_STREAM_OUTPUT ? "output" :
-								    "input",
-		       adev->dev->info.name);
-		clock_gettime(CLOCK_REALTIME, &now);
-		subtract_timespecs(&now, &last_io_err_time, &diff);
-		if ((last_io_err_time.tv_sec == 0 &&
-		     last_io_err_time.tv_nsec == 0) ||
-		    diff.tv_sec > ERROR_CLOSE_GAP_TIME_SECS)
-			cras_iodev_reset_request(adev->dev);
-		else
-			cras_device_monitor_error_close(adev->dev->info.idx);
-
-		last_io_err_time = now;
-	} else {
-		syslog(LOG_ERR, "Dev %s err %d", adev->dev->info.name, err_rc);
-	}
-	/* Device error, remove it. */
-	dev_io_rm_open_dev(odevs, adev);
-}
-
-int dev_io_capture(struct open_dev **list, struct open_dev **olist)
-{
-	struct open_dev *idev_list = *list;
-	struct open_dev *odev_list = *olist;
-	struct open_dev *adev;
-	int rc;
-
-	DL_FOREACH (idev_list, adev) {
-		if (!cras_iodev_is_open(adev->dev))
-			continue;
-		rc = capture_to_streams(adev, odev_list);
-		if (rc < 0)
-			handle_dev_err(rc, list, adev);
-	}
-
-	return 0;
-}
-
-/* If it is the time to fetch, start dev_stream. */
-static void dev_io_check_dev_stream_start(struct open_dev *adev)
-{
-	struct dev_stream *dev_stream;
-	struct timespec now;
-	clock_gettime(CLOCK_MONOTONIC_RAW, &now);
-
-	DL_FOREACH (adev->dev->streams, dev_stream) {
-		if (!is_time_to_fetch(dev_stream, now))
-			continue;
-		if (!dev_stream_is_running(dev_stream))
-			cras_iodev_start_stream(adev->dev, dev_stream);
-	}
-}
-
-void dev_io_playback_fetch(struct open_dev *odev_list)
-{
-	struct open_dev *adev;
-
-	/* Check whether it is the time to start dev_stream before fetching. */
-	DL_FOREACH (odev_list, adev) {
-		if (!cras_iodev_is_open(adev->dev))
-			continue;
-		dev_io_check_dev_stream_start(adev);
-	}
-
-	DL_FOREACH (odev_list, adev) {
-		if (!cras_iodev_is_open(adev->dev))
-			continue;
-		fetch_streams(adev);
-	}
-}
-
-int dev_io_playback_write(struct open_dev **odevs,
-			  struct cras_fmt_conv *output_converter)
-{
-	struct open_dev *adev;
-	struct dev_stream *curr;
-	int rc;
-	unsigned int hw_level, total_written;
-
-	/* For multiple output case, update the number of queued frames in shm
-	 * of all streams before starting write output samples. */
-	adev = *odevs;
-	if (adev && adev->next) {
-		DL_FOREACH (*odevs, adev) {
-			DL_FOREACH (adev->dev->streams, curr)
-				dev_stream_update_frames(curr);
-		}
-	}
-
-	DL_FOREACH (*odevs, adev) {
-		if (!cras_iodev_is_open(adev->dev))
-			continue;
-
-		rc = write_output_samples(odevs, adev, output_converter);
-		if (rc < 0) {
-			handle_dev_err(rc, odevs, adev);
-		} else {
-			total_written = rc;
-
-			/*
-			 * Skip the underrun check and device wake up time update if
-			 * device should not wake up.
-			 */
-			if (!cras_iodev_odev_should_wake(adev->dev))
-				continue;
-
-			/*
-			 * Update device wake up time and get the new hardware
-			 * level.
-			 */
-			update_dev_wakeup_time(adev, &hw_level);
-
-			/*
-			 * If new hardware level is less than or equal to the
-			 * written frames, we can suppose underrun happened. But
-			 * keep in mind there may have a false positive. If
-			 * hardware level changed just after frames being
-			 * written, we may get hw_level <= total_written here
-			 * without underrun happened. However, we can still
-			 * treat it as underrun because it is an abnormal state
-			 * we should handle it.
-			 */
-			if (hw_level <= total_written) {
-				rc = cras_iodev_output_underrun(
-					adev->dev, hw_level, total_written);
-				if (rc < 0) {
-					handle_dev_err(rc, odevs, adev);
-				} else {
-					update_dev_wakeup_time(adev, &hw_level);
-				}
-			}
-		}
-	}
-
-	/* TODO(dgreid) - once per rstream, not once per dev_stream. */
-	DL_FOREACH (*odevs, adev) {
-		struct dev_stream *stream;
-		if (!cras_iodev_is_open(adev->dev))
-			continue;
-		DL_FOREACH (adev->dev->streams, stream) {
-			dev_stream_playback_update_rstream(stream);
-		}
-	}
-
-	return 0;
-}
-
-static void update_longest_wake(struct open_dev *dev_list,
-				const struct timespec *ts)
-{
-	struct open_dev *adev;
-	struct timespec wake_interval;
-
-	DL_FOREACH (dev_list, adev) {
-		if (adev->dev->streams == NULL)
-			continue;
-		/*
-		 * Calculate longest wake only when there's stream attached
-		 * and the last wake time has been set.
-		 */
-		if (adev->last_wake.tv_sec) {
-			subtract_timespecs(ts, &adev->last_wake,
-					   &wake_interval);
-			if (timespec_after(&wake_interval, &adev->longest_wake))
-				adev->longest_wake = wake_interval;
-		}
-		adev->last_wake = *ts;
-	}
-}
-
-void dev_io_run(struct open_dev **odevs, struct open_dev **idevs,
-		struct cras_fmt_conv *output_converter)
-{
-	struct timespec now;
-
-	clock_gettime(CLOCK_MONOTONIC_RAW, &now);
-	pic_update_current_time();
-	update_longest_wake(*odevs, &now);
-	update_longest_wake(*idevs, &now);
-
-	dev_io_playback_fetch(*odevs);
-	dev_io_capture(idevs, odevs);
-	dev_io_send_captured_samples(*idevs);
-	dev_io_playback_write(odevs, output_converter);
-}
-
-static int input_adev_ignore_wake(const struct open_dev *adev)
-{
-	if (!cras_iodev_is_open(adev->dev))
-		return 1;
-
-	if (!adev->dev->active_node)
-		return 1;
-
-	if (adev->dev->active_node->type == CRAS_NODE_TYPE_HOTWORD &&
-	    !cras_iodev_input_streaming(adev->dev))
-		return 1;
-
-	return 0;
-}
-
-int dev_io_next_input_wake(struct open_dev **idevs, struct timespec *min_ts)
-{
-	struct open_dev *adev;
-	int ret = 0; /* The total number of devices to wait on. */
-
-	DL_FOREACH (*idevs, adev) {
-		if (input_adev_ignore_wake(adev))
-			continue;
-		ret++;
-		ATLOG(atlog, AUDIO_THREAD_DEV_SLEEP_TIME, adev->dev->info.idx,
-		      adev->wake_ts.tv_sec, adev->wake_ts.tv_nsec);
-		if (timespec_after(min_ts, &adev->wake_ts))
-			*min_ts = adev->wake_ts;
-	}
-
-	return ret;
-}
-
-/* Fills the time that the next stream needs to be serviced. */
-static int get_next_stream_wake_from_list(struct dev_stream *streams,
-					  struct timespec *min_ts)
-{
-	struct dev_stream *dev_stream;
-	int ret = 0; /* The total number of streams to wait on. */
-
-	DL_FOREACH (streams, dev_stream) {
-		const struct timespec *next_cb_ts;
-
-		if (cras_rstream_get_is_draining(dev_stream->stream))
-			continue;
-
-		if (cras_rstream_is_pending_reply(dev_stream->stream))
-			continue;
-
-		next_cb_ts = dev_stream_next_cb_ts(dev_stream);
-		if (!next_cb_ts)
-			continue;
-
-		ATLOG(atlog, AUDIO_THREAD_STREAM_SLEEP_TIME,
-		      dev_stream->stream->stream_id, next_cb_ts->tv_sec,
-		      next_cb_ts->tv_nsec);
-		if (timespec_after(min_ts, next_cb_ts))
-			*min_ts = *next_cb_ts;
-		ret++;
-	}
-
-	return ret;
-}
-
-int dev_io_next_output_wake(struct open_dev **odevs, struct timespec *min_ts)
-{
-	struct open_dev *adev;
-	int ret = 0;
-
-	DL_FOREACH (*odevs, adev)
-		ret += get_next_stream_wake_from_list(adev->dev->streams,
-						      min_ts);
-
-	DL_FOREACH (*odevs, adev) {
-		if (!cras_iodev_odev_should_wake(adev->dev))
-			continue;
-
-		ret++;
-		if (timespec_after(min_ts, &adev->wake_ts))
-			*min_ts = adev->wake_ts;
-	}
-
-	return ret;
-}
-
-struct open_dev *dev_io_find_open_dev(struct open_dev *odev_list,
-				      unsigned int dev_idx)
-{
-	struct open_dev *odev;
-	DL_FOREACH (odev_list, odev)
-		if (odev->dev->info.idx == dev_idx)
-			return odev;
-	return NULL;
-}
-
-void dev_io_rm_open_dev(struct open_dev **odev_list, struct open_dev *dev_to_rm)
-{
-	struct open_dev *odev;
-	struct dev_stream *dev_stream;
-
-	/* Do nothing if dev_to_rm wasn't already in the active dev list. */
-	DL_FOREACH (*odev_list, odev) {
-		if (odev == dev_to_rm)
-			break;
-	}
-	if (!odev)
-		return;
-
-	DL_DELETE(*odev_list, dev_to_rm);
-
-	/* Metrics logs the number of underruns of this device. */
-	cras_server_metrics_num_underruns(
-		cras_iodev_get_num_underruns(dev_to_rm->dev));
-
-	/* Metrics logs the delay of this device. */
-	cras_server_metrics_highest_device_delay(
-		dev_to_rm->dev->highest_hw_level,
-		dev_to_rm->dev->largest_cb_level, dev_to_rm->dev->direction);
-
-	/* Metrics logs the highest_hw_level of this device. */
-	cras_server_metrics_highest_hw_level(dev_to_rm->dev->highest_hw_level,
-					     dev_to_rm->dev->direction);
-
-	dev_io_check_non_empty_state_transition(*odev_list);
-
-	ATLOG(atlog, AUDIO_THREAD_DEV_REMOVED, dev_to_rm->dev->info.idx, 0, 0);
-
-	DL_FOREACH (dev_to_rm->dev->streams, dev_stream) {
-		cras_iodev_rm_stream(dev_to_rm->dev, dev_stream->stream);
-		dev_stream_destroy(dev_stream);
-	}
-
-	if (dev_to_rm->empty_pi)
-		pic_polled_interval_destroy(&dev_to_rm->empty_pi);
-	if (dev_to_rm->non_empty_check_pi)
-		pic_polled_interval_destroy(&dev_to_rm->non_empty_check_pi);
-	free(dev_to_rm);
-}
-
-static void delete_stream_from_dev(struct cras_iodev *dev,
-				   struct cras_rstream *stream)
-{
-	struct dev_stream *out;
-
-	out = cras_iodev_rm_stream(dev, stream);
-	if (out)
-		dev_stream_destroy(out);
-}
-
-/*
- * Finds a matched input stream from open device list.
- * The definition of the matched streams: Two streams having
- * the same sampling rate and the same cb_threshold.
- * This means their sleep time intervals should be very close
- * if we neglect device estimated rate.
- */
-static struct dev_stream *
-find_matched_input_stream(const struct cras_rstream *out_stream,
-			  struct open_dev *odev_list)
-{
-	struct open_dev *odev;
-	struct dev_stream *dev_stream;
-	size_t out_rate = out_stream->format.frame_rate;
-	size_t out_cb_threshold = cras_rstream_get_cb_threshold(out_stream);
-
-	DL_FOREACH (odev_list, odev) {
-		DL_FOREACH (odev->dev->streams, dev_stream) {
-			if (dev_stream->stream->format.frame_rate != out_rate)
-				continue;
-			if (cras_rstream_get_cb_threshold(dev_stream->stream) !=
-			    out_cb_threshold)
-				continue;
-			return dev_stream;
-		}
-	}
-	return NULL;
-}
-
-static bool
-find_matched_input_stream_next_cb_ts(const struct cras_rstream *stream,
-				     struct open_dev *odev_list,
-				     const struct timespec **next_cb_ts,
-				     const struct timespec **sleep_interval_ts)
-{
-	struct dev_stream *dev_stream =
-		find_matched_input_stream(stream, odev_list);
-	if (dev_stream) {
-		*next_cb_ts = dev_stream_next_cb_ts(dev_stream);
-		*sleep_interval_ts = dev_stream_sleep_interval_ts(dev_stream);
-		return *next_cb_ts != NULL;
-	}
-	return false;
-}
-
-int dev_io_append_stream(struct open_dev **odevs, struct open_dev **idevs,
-			 struct cras_rstream *stream,
-			 struct cras_iodev **iodevs, unsigned int num_iodevs)
-{
-	struct open_dev **dev_list;
-	struct open_dev *open_dev;
-	struct cras_iodev *dev;
-	struct dev_stream *out;
-	struct timespec init_cb_ts;
-	const struct timespec *init_sleep_interval_ts = NULL;
-	struct timespec extra_sleep;
-	const struct timespec *stream_ts;
-	unsigned int i;
-	bool cb_ts_set = false;
-	int level;
-	int rc = 0;
-
-	if (stream->direction == CRAS_STREAM_OUTPUT)
-		dev_list = odevs;
-	else
-		dev_list = idevs;
-
-	for (i = 0; i < num_iodevs; i++) {
-		DL_SEARCH_SCALAR(*dev_list, open_dev, dev, iodevs[i]);
-		if (!open_dev)
-			continue;
-
-		dev = iodevs[i];
-		DL_SEARCH_SCALAR(dev->streams, out, stream, stream);
-		if (out)
-			continue;
-
-		/*
-		 * When dev transitions from no stream to the 1st stream, reset
-		 * last_wake and longest_wake so it can start over the tracking.
-		 */
-		if (dev->streams == NULL) {
-			open_dev->last_wake.tv_sec = 0;
-			open_dev->last_wake.tv_nsec = 0;
-			open_dev->longest_wake.tv_sec = 0;
-			open_dev->longest_wake.tv_nsec = 0;
-		}
-
-		/*
-		 * When the first input stream is added, flush the input buffer
-		 * so that we can read from multiple input devices of the same
-		 * buffer level.
-		 */
-		if ((stream->direction == CRAS_STREAM_INPUT) && !dev->streams) {
-			int num_flushed = dev->flush_buffer(dev);
-			if (num_flushed < 0) {
-				rc = num_flushed;
-				break;
-			}
-		}
-
-		/*
-		 * For output, if open device already has stream, get the earliest next
-		 * callback time from these streams to align with. Otherwise, check whether
-		 * there are remaining frames in the device. Set the initial callback time to
-		 * the time when hw_level of device is close to min_cb_level.
-		 * If next callback time is too far from now, it will block writing and
-		 * lower hardware level. Else if we fetch the new stream immediately, it
-		 * may cause device buffer level stack up.
-		 */
-		if (stream->direction == CRAS_STREAM_OUTPUT) {
-			/*
-			 * If there is a matched input stream, find its next cb time.
-			 * Use that as the initial cb time for this output stream.
-			 */
-			const struct timespec *in_stream_ts;
-			const struct timespec *in_stream_sleep_interval_ts;
-			bool found_matched_input;
-			found_matched_input =
-				find_matched_input_stream_next_cb_ts(
-					stream, *idevs, &in_stream_ts,
-					&in_stream_sleep_interval_ts);
-			if (found_matched_input) {
-				init_cb_ts = *in_stream_ts;
-				init_sleep_interval_ts =
-					in_stream_sleep_interval_ts;
-			} else {
-				DL_FOREACH (dev->streams, out) {
-					stream_ts = dev_stream_next_cb_ts(out);
-					if (stream_ts &&
-					    (!cb_ts_set ||
-					     timespec_after(&init_cb_ts,
-							    stream_ts))) {
-						init_cb_ts = *stream_ts;
-						cb_ts_set = true;
-					}
-				}
-				if (!cb_ts_set) {
-					level = cras_iodev_get_valid_frames(
-						dev, &init_cb_ts);
-					if (level < 0) {
-						syslog(LOG_ERR,
-						       "Failed to set output init_cb_ts, rc = %d",
-						       level);
-						rc = -EINVAL;
-						break;
-					}
-					level -= cras_frames_at_rate(
-						stream->format.frame_rate,
-						cras_rstream_get_cb_threshold(
-							stream),
-						dev->format->frame_rate);
-					if (level < 0)
-						level = 0;
-					cras_frames_to_time(
-						level, dev->format->frame_rate,
-						&extra_sleep);
-					add_timespecs(&init_cb_ts,
-						      &extra_sleep);
-				}
-			}
-		} else {
-			/*
-			 * For input streams, because audio thread can calculate wake up time
-			 * by hw_level of input device, set the first cb_ts to zero. The stream
-			 * will wake up when it gets enough samples to post. The next_cb_ts will
-			 * be updated after its first post.
-			 *
-			 * TODO(yuhsuan) - Align the new stream fetch time to avoid getting a large
-			 * delay. If a new stream with smaller block size starts when the hardware
-			 * level is high, the hardware level will keep high after removing other
-			 * old streams.
-			 */
-			init_cb_ts.tv_sec = 0;
-			init_cb_ts.tv_nsec = 0;
-		}
-
-		out = dev_stream_create(stream, dev->info.idx, dev->format, dev,
-					&init_cb_ts, init_sleep_interval_ts);
-		if (!out) {
-			rc = -EINVAL;
-			break;
-		}
-
-		cras_iodev_add_stream(dev, out);
-
-		/*
-		 * For multiple inputs case, if the new stream is not the first
-		 * one to append, copy the 1st stream's offset to it so that
-		 * future read offsets can be aligned across all input streams
-		 * to avoid the deadlock scenario when multiple streams reading
-		 * from multiple devices.
-		 */
-		if ((stream->direction == CRAS_STREAM_INPUT) &&
-		    (dev->streams != out)) {
-			unsigned int offset =
-				cras_iodev_stream_offset(dev, dev->streams);
-			if (offset > stream->cb_threshold)
-				offset = stream->cb_threshold;
-			cras_iodev_stream_written(dev, out, offset);
-
-			offset = cras_rstream_dev_offset(dev->streams->stream,
-							 dev->info.idx);
-			if (offset > stream->cb_threshold)
-				offset = stream->cb_threshold;
-			cras_rstream_dev_offset_update(stream, offset,
-						       dev->info.idx);
-		}
-		ATLOG(atlog, AUDIO_THREAD_STREAM_ADDED, stream->stream_id,
-		      dev->info.idx, 0);
-	}
-
-	if (rc) {
-		DL_FOREACH (*dev_list, open_dev) {
-			dev = open_dev->dev;
-			DL_SEARCH_SCALAR(dev->streams, out, stream, stream);
-			if (!out)
-				continue;
-
-			cras_iodev_rm_stream(dev, stream);
-			dev_stream_destroy(out);
-		}
-	}
-
-	return rc;
-}
-
-int dev_io_remove_stream(struct open_dev **dev_list,
-			 struct cras_rstream *stream, struct cras_iodev *dev)
-{
-	struct open_dev *open_dev;
-
-	ATLOG(atlog, AUDIO_THREAD_STREAM_REMOVED, stream->stream_id, 0, 0);
-
-	if (dev == NULL) {
-		DL_FOREACH (*dev_list, open_dev) {
-			delete_stream_from_dev(open_dev->dev, stream);
-		}
-	} else {
-		delete_stream_from_dev(dev, stream);
-	}
-
-	return 0;
-}
diff --git a/cras/src/server/dev_io.h b/cras/src/server/dev_io.h
deleted file mode 100644
index ca71a80..0000000
--- a/cras/src/server/dev_io.h
+++ /dev/null
@@ -1,113 +0,0 @@
-/* Copyright 2017 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- *
- * `dev_io` Handles playback to and capture from open devices.  It runs only on
- * the audio thread.
- */
-
-#ifndef DEV_IO_H_
-#define DEV_IO_H_
-
-#include "cras_iodev.h"
-#include "cras_types.h"
-#include "polled_interval_checker.h"
-
-/*
- * Open input/output devices.
- *    dev - The device.
- *    last_wake - The last timestamp audio thread woke up and there is stream
- *        on this open device.
- *    longest_wake - The longest time between consecutive audio thread wakes
- *        in this open_dev's life cycle.
- *    wake_ts - When callback is needed to avoid xrun.
- *    last_non_empty_ts - The last time we know the device played/captured
- *        non-empty (zero) audio.
- *    coarse_rate_adjust - Hack for when the sample rate needs heavy correction.
- */
-struct open_dev {
-	struct cras_iodev *dev;
-	struct timespec last_wake;
-	struct timespec longest_wake;
-	struct timespec wake_ts;
-	struct polled_interval *non_empty_check_pi;
-	struct polled_interval *empty_pi;
-	int coarse_rate_adjust;
-	struct open_dev *prev, *next;
-};
-
-/*
- * Fetches streams from each device in `odev_list`.
- *    odev_list - The list of open devices.
- */
-void dev_io_playback_fetch(struct open_dev *odev_list);
-
-/*
- * Writes the samples fetched from the streams to the playback devices.
- *    odev_list - The list of open devices.  Devices will be removed when
- *                writing returns an error.
- */
-int dev_io_playback_write(struct open_dev **odevs,
-			  struct cras_fmt_conv *output_converter);
-
-/* Only public for testing. */
-int write_output_samples(struct open_dev **odevs, struct open_dev *adev,
-			 struct cras_fmt_conv *output_converter);
-
-/*
- * Captures samples from each device in the list.
- *    list - Pointer to the list of input devices.  Devices that fail to read
- *           will be removed from the list.
- *    olist - Pointer to the list of output devices.
- */
-int dev_io_capture(struct open_dev **list, struct open_dev **olist);
-
-/*
- * Send samples that have been captured to their streams.
- */
-int dev_io_send_captured_samples(struct open_dev *idev_list);
-
-/* Reads and/or writes audio samples from/to the devices. */
-void dev_io_run(struct open_dev **odevs, struct open_dev **idevs,
-		struct cras_fmt_conv *output_converter);
-
-/*
- * Checks the non-empty device state in active output lists and return
- * if there's at least one non-empty device.
- */
-int dev_io_check_non_empty_state_transition(struct open_dev *adevs);
-
-/*
- * Fills min_ts with the next time the system should wake to service input.
- * Returns the number of devices waiting.
- */
-int dev_io_next_input_wake(struct open_dev **idevs, struct timespec *min_ts);
-
-/*
- * Fills min_ts with the next time the system should wake to service output.
- * Returns the number of devices waiting.
- */
-int dev_io_next_output_wake(struct open_dev **odevs, struct timespec *min_ts);
-
-/*
- * Removes a device from a list of devices.
- *    odev_list - A pointer to the list to modify.
- *    dev_to_rm - Find this device in the list and remove it.
- */
-void dev_io_rm_open_dev(struct open_dev **odev_list,
-			struct open_dev *dev_to_rm);
-
-/* Returns a pointer to an open_dev if it is in the list, otherwise NULL. */
-struct open_dev *dev_io_find_open_dev(struct open_dev *odev_list,
-				      unsigned int dev_idx);
-
-/* Append a new stream to a specified set of iodevs. */
-int dev_io_append_stream(struct open_dev **odevs, struct open_dev **idevs,
-			 struct cras_rstream *stream,
-			 struct cras_iodev **iodevs, unsigned int num_iodevs);
-
-/* Remove a stream from the provided list of devices. */
-int dev_io_remove_stream(struct open_dev **dev_list,
-			 struct cras_rstream *stream, struct cras_iodev *dev);
-
-#endif /* DEV_IO_H_ */
diff --git a/cras/src/server/dev_stream.c b/cras/src/server/dev_stream.c
deleted file mode 100644
index be5a6da..0000000
--- a/cras/src/server/dev_stream.c
+++ /dev/null
@@ -1,782 +0,0 @@
-/* Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <syslog.h>
-
-#include "audio_thread_log.h"
-#include "byte_buffer.h"
-#include "cras_fmt_conv.h"
-#include "dev_stream.h"
-#include "cras_audio_area.h"
-#include "cras_mix.h"
-#include "cras_server_metrics.h"
-#include "cras_shm.h"
-
-/* Adjust device's sample rate by this step faster or slower. Used
- * to make sure multiple active device has stable buffer level.
- */
-static const int coarse_rate_adjust_step = 3;
-
-/*
- * Allow capture callback to fire this much earlier than the scheduled
- * next_cb_ts to avoid an extra wake of audio thread.
- */
-static const struct timespec capture_callback_fuzz_ts = {
-	.tv_sec = 0,
-	.tv_nsec = 1000000, /* 1 ms. */
-};
-
-/*
- * Returns the size in frames that a format converter must allocate for its
- * temporary buffers to be able to convert the specified number of stream
- * frames to or from the corresponding number of device frames, at the
- * specified device rate.
- */
-unsigned int max_frames_for_conversion(unsigned int stream_frames,
-				       unsigned int stream_rate,
-				       unsigned int device_rate)
-{
-	/*
-	 * There are multiple temp buffers in the format converter,
-	 * which are all the same size. Some of these contain audio
-	 * in the source sample rate, and others in the converted
-	 * sample rate. We need to make sure the converter is large
-	 * enough to hold either.
-	 */
-	return MAX(
-		       // Number of stream frames does not require conversion.
-		       stream_frames,
-		       // Calculate corresponding number of frames at device rate.
-		       cras_frames_at_rate(stream_rate, stream_frames,
-					   device_rate))
-	       /*
-	        * Add 1 because the linear resampler's frame rate
-	        * conversion does this, and is used to calculate
-	        * how many frames to read from the device.
-	        * See linear_resampler_{in,out}_frames_to_{out,in}(..)
-	        */
-	       + 1;
-}
-
-struct dev_stream *dev_stream_create(struct cras_rstream *stream,
-				     unsigned int dev_id,
-				     const struct cras_audio_format *dev_fmt,
-				     void *dev_ptr, struct timespec *cb_ts,
-				     const struct timespec *sleep_interval_ts)
-{
-	struct dev_stream *out;
-	struct cras_audio_format *stream_fmt = &stream->format;
-	int rc = 0;
-	unsigned int max_frames, dev_frames, buf_bytes;
-	const struct cras_audio_format *ofmt;
-
-	out = calloc(1, sizeof(*out));
-	out->dev_id = dev_id;
-	out->stream = stream;
-	out->dev_rate = dev_fmt->frame_rate;
-	out->is_running = 0;
-
-	max_frames = max_frames_for_conversion(stream->buffer_frames,
-					       stream_fmt->frame_rate,
-					       dev_fmt->frame_rate);
-
-	if (stream->direction == CRAS_STREAM_OUTPUT) {
-		rc = config_format_converter(&out->conv, stream->direction,
-					     stream_fmt, dev_fmt, max_frames);
-	} else {
-		/*
-		 * For input, take into account the stream specific processing
-		 * like AEC. APM exists only in input path, and has no dependency
-		 * to dev_stream. Starts APM in dev_stream's constructor just to
-		 * align with its life cycle, and then gets the post processing
-		 * format to configure format converter.
-		 */
-		cras_apm_list_start_apm(stream->apm_list, dev_ptr);
-		ofmt = cras_rstream_post_processing_format(stream, dev_ptr) ?:
-			       dev_fmt,
-		rc = config_format_converter(&out->conv, stream->direction,
-					     ofmt, stream_fmt, max_frames);
-	}
-	if (rc) {
-		free(out);
-		return NULL;
-	}
-
-	ofmt = cras_fmt_conv_out_format(out->conv);
-
-	dev_frames =
-		(stream->direction == CRAS_STREAM_OUTPUT) ?
-			cras_fmt_conv_in_frames_to_out(out->conv,
-						       stream->buffer_frames) :
-			cras_fmt_conv_out_frames_to_in(out->conv,
-						       stream->buffer_frames);
-
-	out->conv_buffer_size_frames =
-		2 * MAX(dev_frames, stream->buffer_frames);
-
-	/* Create conversion buffer and area using the output format
-	 * of the format converter. Note that this format might not be
-	 * identical to stream_fmt for capture. */
-	buf_bytes = out->conv_buffer_size_frames * cras_get_format_bytes(ofmt);
-	out->conv_buffer = byte_buffer_create(buf_bytes);
-	out->conv_area = cras_audio_area_create(ofmt->num_channels);
-
-	/* Use sleep interval hint from argument if it is provided */
-	if (sleep_interval_ts) {
-		stream->sleep_interval_ts = *sleep_interval_ts;
-	} else {
-		cras_frames_to_time(cras_rstream_get_cb_threshold(stream),
-				    stream_fmt->frame_rate,
-				    &stream->sleep_interval_ts);
-	}
-
-	stream->next_cb_ts = *cb_ts;
-
-	/* Sets up the stream & dev pair. */
-	cras_rstream_dev_attach(stream, dev_id, dev_ptr);
-
-	return out;
-}
-
-void dev_stream_destroy(struct dev_stream *dev_stream)
-{
-	void *dev_ptr =
-		cras_rstream_dev_ptr(dev_stream->stream, dev_stream->dev_id);
-	/* Stops the APM and then unlink the dev stream pair. */
-	cras_apm_list_stop_apm(dev_stream->stream->apm_list, dev_ptr);
-	cras_rstream_dev_detach(dev_stream->stream, dev_stream->dev_id);
-	if (dev_stream->conv) {
-		cras_audio_area_destroy(dev_stream->conv_area);
-		cras_fmt_conv_destroy(&dev_stream->conv);
-		byte_buffer_destroy(&dev_stream->conv_buffer);
-	}
-	free(dev_stream);
-}
-
-void dev_stream_set_dev_rate(struct dev_stream *dev_stream,
-			     unsigned int dev_rate, double dev_rate_ratio,
-			     double main_rate_ratio, int coarse_rate_adjust)
-{
-	if (dev_stream->dev_id == dev_stream->stream->main_dev.dev_id) {
-		cras_fmt_conv_set_linear_resample_rates(dev_stream->conv,
-							dev_rate, dev_rate);
-		cras_frames_to_time_precise(
-			cras_rstream_get_cb_threshold(dev_stream->stream),
-			dev_stream->stream->format.frame_rate * dev_rate_ratio,
-			&dev_stream->stream->sleep_interval_ts);
-	} else {
-		double new_rate = dev_rate * dev_rate_ratio / main_rate_ratio +
-				  coarse_rate_adjust_step * coarse_rate_adjust;
-		cras_fmt_conv_set_linear_resample_rates(dev_stream->conv,
-							dev_rate, new_rate);
-	}
-}
-
-int dev_stream_mix(struct dev_stream *dev_stream,
-		   const struct cras_audio_format *fmt, uint8_t *dst,
-		   unsigned int num_to_write)
-{
-	struct cras_rstream *rstream = dev_stream->stream;
-	uint8_t *src;
-	uint8_t *target = dst;
-	unsigned int fr_written, fr_read;
-	unsigned int buffer_offset;
-	int fr_in_buf;
-	unsigned int num_samples;
-	size_t frames = 0;
-	unsigned int dev_frames;
-	float mix_vol;
-
-	fr_in_buf = dev_stream_playback_frames(dev_stream);
-	if (fr_in_buf <= 0)
-		return fr_in_buf;
-	if (fr_in_buf < num_to_write)
-		num_to_write = fr_in_buf;
-
-	buffer_offset = cras_rstream_dev_offset(rstream, dev_stream->dev_id);
-
-	/* Stream volume scaler. */
-	mix_vol = cras_rstream_get_volume_scaler(dev_stream->stream);
-
-	fr_written = 0;
-	fr_read = 0;
-	while (fr_written < num_to_write) {
-		unsigned int read_frames;
-		src = cras_rstream_get_readable_frames(
-			rstream, buffer_offset + fr_read, &frames);
-		if (frames == 0)
-			break;
-		if (cras_fmt_conversion_needed(dev_stream->conv)) {
-			read_frames = frames;
-			dev_frames = cras_fmt_conv_convert_frames(
-				dev_stream->conv, src,
-				dev_stream->conv_buffer->bytes, &read_frames,
-				num_to_write - fr_written);
-			src = dev_stream->conv_buffer->bytes;
-		} else {
-			dev_frames = MIN(frames, num_to_write - fr_written);
-			read_frames = dev_frames;
-		}
-		num_samples = dev_frames * fmt->num_channels;
-		cras_mix_add(fmt->format, target, src, num_samples, 1,
-			     cras_rstream_get_mute(rstream), mix_vol);
-		target += dev_frames * cras_get_format_bytes(fmt);
-		fr_written += dev_frames;
-		fr_read += read_frames;
-	}
-
-	cras_rstream_dev_offset_update(rstream, fr_read, dev_stream->dev_id);
-	ATLOG(atlog, AUDIO_THREAD_DEV_STREAM_MIX, fr_written, fr_read, 0);
-
-	return fr_written;
-}
-
-/* Copy from the captured buffer to the temporary format converted buffer. */
-static unsigned int capture_with_fmt_conv(struct dev_stream *dev_stream,
-					  const uint8_t *source_samples,
-					  unsigned int num_frames)
-{
-	const struct cras_audio_format *source_format;
-	const struct cras_audio_format *dst_format;
-	uint8_t *buffer;
-	unsigned int total_read = 0;
-	unsigned int write_frames;
-	unsigned int read_frames;
-	unsigned int source_frame_bytes;
-	unsigned int dst_frame_bytes;
-
-	source_format = cras_fmt_conv_in_format(dev_stream->conv);
-	source_frame_bytes = cras_get_format_bytes(source_format);
-	dst_format = cras_fmt_conv_out_format(dev_stream->conv);
-	dst_frame_bytes = cras_get_format_bytes(dst_format);
-
-	dev_stream->conv_area->num_channels = dst_format->num_channels;
-
-	while (total_read < num_frames) {
-		buffer = buf_write_pointer_size(dev_stream->conv_buffer,
-						&write_frames);
-		write_frames /= dst_frame_bytes;
-		if (write_frames == 0)
-			break;
-
-		read_frames = num_frames - total_read;
-		write_frames = cras_fmt_conv_convert_frames(
-			dev_stream->conv, source_samples, buffer, &read_frames,
-			write_frames);
-		total_read += read_frames;
-		source_samples += read_frames * source_frame_bytes;
-		buf_increment_write(dev_stream->conv_buffer,
-				    (size_t)write_frames *
-					    (size_t)dst_frame_bytes);
-	}
-
-	return total_read;
-}
-
-/* Copy from the converted buffer to the stream shm.  These have the same format
- * at this point. */
-static unsigned int
-capture_copy_converted_to_stream(struct dev_stream *dev_stream,
-				 struct cras_rstream *rstream,
-				 float software_gain_scaler)
-{
-	struct cras_audio_shm *shm;
-	uint8_t *stream_samples;
-	uint8_t *converted_samples;
-	unsigned int num_frames;
-	unsigned int total_written = 0;
-	unsigned int write_frames;
-	unsigned int frame_bytes;
-	unsigned int offset;
-	const struct cras_audio_format *fmt;
-
-	shm = cras_rstream_shm(rstream);
-
-	fmt = cras_fmt_conv_out_format(dev_stream->conv);
-	frame_bytes = cras_get_format_bytes(fmt);
-
-	offset = cras_rstream_dev_offset(rstream, dev_stream->dev_id);
-
-	stream_samples = cras_shm_get_writeable_frames(
-		shm, cras_rstream_get_cb_threshold(rstream),
-		&rstream->audio_area->frames);
-	num_frames = MIN(rstream->audio_area->frames - offset,
-			 buf_queued(dev_stream->conv_buffer) / frame_bytes);
-
-	ATLOG(atlog, AUDIO_THREAD_CONV_COPY, shm->header->write_buf_idx,
-	      rstream->audio_area->frames, offset);
-
-	while (total_written < num_frames) {
-		converted_samples = buf_read_pointer_size(
-			dev_stream->conv_buffer, &write_frames);
-		write_frames /= frame_bytes;
-		write_frames = MIN(write_frames, num_frames - total_written);
-
-		cras_audio_area_config_buf_pointers(dev_stream->conv_area, fmt,
-						    converted_samples);
-		cras_audio_area_config_channels(dev_stream->conv_area, fmt);
-		dev_stream->conv_area->frames = write_frames;
-
-		cras_audio_area_config_buf_pointers(
-			rstream->audio_area, &rstream->format, stream_samples);
-
-		cras_audio_area_copy(rstream->audio_area, offset,
-				     &rstream->format, dev_stream->conv_area, 0,
-				     software_gain_scaler);
-
-		buf_increment_read(dev_stream->conv_buffer,
-				   (size_t)write_frames * (size_t)frame_bytes);
-		total_written += write_frames;
-		cras_rstream_dev_offset_update(rstream, write_frames,
-					       dev_stream->dev_id);
-		offset = cras_rstream_dev_offset(rstream, dev_stream->dev_id);
-	}
-
-	ATLOG(atlog, AUDIO_THREAD_CAPTURE_WRITE, rstream->stream_id,
-	      total_written, cras_shm_frames_written(shm));
-	return total_written;
-}
-
-unsigned int dev_stream_capture(struct dev_stream *dev_stream,
-				const struct cras_audio_area *area,
-				unsigned int area_offset,
-				float software_gain_scaler)
-{
-	struct cras_rstream *rstream = dev_stream->stream;
-	struct cras_audio_shm *shm;
-	uint8_t *stream_samples;
-	unsigned int nread;
-
-	/* Check if format conversion is needed. */
-	if (cras_fmt_conversion_needed(dev_stream->conv)) {
-		unsigned int format_bytes, fr_to_capture;
-
-		fr_to_capture = dev_stream_capture_avail(dev_stream);
-		fr_to_capture = MIN(fr_to_capture, area->frames - area_offset);
-
-		format_bytes = cras_get_format_bytes(
-			cras_fmt_conv_in_format(dev_stream->conv));
-		nread = capture_with_fmt_conv(
-			dev_stream,
-			area->channels[0].buf + area_offset * format_bytes,
-			fr_to_capture);
-
-		capture_copy_converted_to_stream(dev_stream, rstream,
-						 software_gain_scaler);
-	} else {
-		unsigned int offset =
-			cras_rstream_dev_offset(rstream, dev_stream->dev_id);
-
-		/* Set up the shm area and copy to it. */
-		shm = cras_rstream_shm(rstream);
-		stream_samples = cras_shm_get_writeable_frames(
-			shm, cras_rstream_get_cb_threshold(rstream),
-			&rstream->audio_area->frames);
-		cras_audio_area_config_buf_pointers(
-			rstream->audio_area, &rstream->format, stream_samples);
-
-		nread = cras_audio_area_copy(rstream->audio_area, offset,
-					     &rstream->format, area,
-					     area_offset, software_gain_scaler);
-
-		ATLOG(atlog, AUDIO_THREAD_CAPTURE_WRITE, rstream->stream_id,
-		      nread, cras_shm_frames_written(shm));
-		cras_rstream_dev_offset_update(rstream, nread,
-					       dev_stream->dev_id);
-	}
-
-	return nread;
-}
-
-int dev_stream_attached_devs(const struct dev_stream *dev_stream)
-{
-	return dev_stream->stream->num_attached_devs;
-}
-
-void dev_stream_update_frames(const struct dev_stream *dev_stream)
-{
-	cras_rstream_update_queued_frames(dev_stream->stream);
-}
-
-int dev_stream_playback_frames(const struct dev_stream *dev_stream)
-{
-	int frames;
-
-	frames = cras_rstream_playable_frames(dev_stream->stream,
-					      dev_stream->dev_id);
-	if (frames < 0)
-		return frames;
-
-	if (!dev_stream->conv)
-		return frames;
-
-	return cras_fmt_conv_in_frames_to_out(dev_stream->conv, frames);
-}
-
-unsigned int dev_stream_cb_threshold(const struct dev_stream *dev_stream)
-{
-	const struct cras_rstream *rstream = dev_stream->stream;
-	unsigned int cb_threshold = cras_rstream_get_cb_threshold(rstream);
-
-	if (rstream->direction == CRAS_STREAM_OUTPUT)
-		return cras_fmt_conv_in_frames_to_out(dev_stream->conv,
-						      cb_threshold);
-	else
-		return cras_fmt_conv_out_frames_to_in(dev_stream->conv,
-						      cb_threshold);
-}
-
-unsigned int dev_stream_capture_avail(const struct dev_stream *dev_stream)
-{
-	struct cras_audio_shm *shm;
-	struct cras_rstream *rstream = dev_stream->stream;
-	unsigned int frames_avail;
-	unsigned int conv_buf_level;
-	unsigned int format_bytes;
-	unsigned int wlimit;
-	unsigned int dev_offset =
-		cras_rstream_dev_offset(rstream, dev_stream->dev_id);
-
-	shm = cras_rstream_shm(rstream);
-
-	wlimit = cras_rstream_get_max_write_frames(rstream);
-	wlimit -= dev_offset;
-	cras_shm_get_writeable_frames(shm, wlimit, &frames_avail);
-
-	if (!dev_stream->conv)
-		return frames_avail;
-
-	format_bytes = cras_get_format_bytes(
-		cras_fmt_conv_out_format(dev_stream->conv));
-
-	/* Sample rate conversion may cause some sample left in conv_buffer
-	 * take this buffer into account. */
-	conv_buf_level = buf_queued(dev_stream->conv_buffer) / format_bytes;
-	if (frames_avail <= conv_buf_level)
-		return 0;
-	else
-		frames_avail -= conv_buf_level;
-
-	frames_avail =
-		MIN(frames_avail,
-		    buf_available(dev_stream->conv_buffer) / format_bytes);
-
-	return cras_fmt_conv_out_frames_to_in(dev_stream->conv, frames_avail);
-}
-
-/* TODO(dgreid) remove this hack to reset the time if needed. */
-static void check_next_wake_time(struct dev_stream *dev_stream)
-{
-	struct cras_rstream *rstream = dev_stream->stream;
-	struct timespec now;
-
-	clock_gettime(CLOCK_MONOTONIC_RAW, &now);
-	if (timespec_after(&now, &rstream->next_cb_ts)) {
-		rstream->next_cb_ts = now;
-		add_timespecs(&rstream->next_cb_ts,
-			      &rstream->sleep_interval_ts);
-		ATLOG(atlog, AUDIO_THREAD_STREAM_RESCHEDULE, rstream->stream_id,
-		      rstream->next_cb_ts.tv_sec, rstream->next_cb_ts.tv_nsec);
-		cras_server_metrics_missed_cb_event(rstream);
-	}
-}
-
-void dev_stream_update_next_wake_time(struct dev_stream *dev_stream)
-{
-	struct cras_rstream *rstream = dev_stream->stream;
-
-	/*
-	 * The empty next_cb_ts means it is the first time update for input stream.
-	 * Initialize next_cb_ts without recording missed callback.
-	 */
-	if (rstream->direction == CRAS_STREAM_INPUT &&
-	    !timespec_is_nonzero(&rstream->next_cb_ts)) {
-		clock_gettime(CLOCK_MONOTONIC_RAW, &rstream->next_cb_ts);
-		add_timespecs(&rstream->next_cb_ts,
-			      &rstream->sleep_interval_ts);
-		return;
-	}
-	/* Update next callback time according to perfect schedule. */
-	add_timespecs(&rstream->next_cb_ts, &rstream->sleep_interval_ts);
-	/* Reset schedule if the schedule is missed. */
-	check_next_wake_time(dev_stream);
-}
-
-int dev_stream_playback_update_rstream(struct dev_stream *dev_stream)
-{
-	cras_rstream_update_output_read_pointer(dev_stream->stream);
-	return 0;
-}
-
-static int late_enough_for_capture_callback(struct dev_stream *dev_stream)
-{
-	struct timespec now;
-	struct cras_rstream *rstream = dev_stream->stream;
-	clock_gettime(CLOCK_MONOTONIC_RAW, &now);
-	add_timespecs(&now, &capture_callback_fuzz_ts);
-	return timespec_after(&now, &rstream->next_cb_ts);
-}
-
-int dev_stream_capture_update_rstream(struct dev_stream *dev_stream)
-{
-	struct cras_rstream *rstream = dev_stream->stream;
-	unsigned int frames_ready = cras_rstream_get_cb_threshold(rstream);
-	int rc;
-
-	if ((rstream->flags & TRIGGER_ONLY) && rstream->triggered)
-		return 0;
-
-	cras_rstream_update_input_write_pointer(rstream);
-
-	/*
-	 * For stream without BULK_AUDIO_OK flag, if it isn't time for
-	 * this stream then skip it.
-	 */
-	if (!(rstream->flags & BULK_AUDIO_OK) &&
-	    !late_enough_for_capture_callback(dev_stream))
-		return 0;
-
-	/* If there is not enough data for one callback, skip it. */
-	if (!cras_rstream_input_level_met(rstream))
-		return 0;
-
-	/* Enough data for this stream. */
-	if (rstream->flags & BULK_AUDIO_OK)
-		frames_ready = cras_rstream_level(rstream);
-
-	ATLOG(atlog, AUDIO_THREAD_CAPTURE_POST, rstream->stream_id,
-	      frames_ready, rstream->shm->header->read_buf_idx);
-
-	rc = cras_rstream_audio_ready(rstream, frames_ready);
-
-	if (rc < 0)
-		return rc;
-
-	if (rstream->flags & TRIGGER_ONLY)
-		rstream->triggered = 1;
-
-	dev_stream_update_next_wake_time(dev_stream);
-
-	return 0;
-}
-
-void cras_set_playback_timestamp(size_t frame_rate, size_t frames,
-				 struct cras_timespec *ts)
-{
-	cras_clock_gettime(CLOCK_MONOTONIC_RAW, ts);
-
-	/* For playback, want now + samples left to be played.
-	 * ts = time next written sample will be played to DAC,
-	 */
-	ts->tv_nsec += frames * 1000000000ULL / frame_rate;
-	while (ts->tv_nsec > 1000000000ULL) {
-		ts->tv_sec++;
-		ts->tv_nsec -= 1000000000ULL;
-	}
-}
-
-void cras_set_capture_timestamp(size_t frame_rate, size_t frames,
-				struct cras_timespec *ts)
-{
-	long tmp;
-
-	cras_clock_gettime(CLOCK_MONOTONIC_RAW, ts);
-
-	/* For capture, now - samples left to be read.
-	 * ts = time next sample to be read was captured at ADC.
-	 */
-	tmp = frames * (1000000000L / frame_rate);
-	while (tmp > 1000000000L) {
-		tmp -= 1000000000L;
-		ts->tv_sec--;
-	}
-	if (ts->tv_nsec >= tmp)
-		ts->tv_nsec -= tmp;
-	else {
-		tmp -= ts->tv_nsec;
-		ts->tv_nsec = 1000000000L - tmp;
-		ts->tv_sec--;
-	}
-}
-
-void dev_stream_set_delay(const struct dev_stream *dev_stream,
-			  unsigned int delay_frames)
-{
-	struct cras_rstream *rstream = dev_stream->stream;
-	struct cras_audio_shm *shm;
-	unsigned int stream_frames;
-
-	if (rstream->direction == CRAS_STREAM_OUTPUT) {
-		shm = cras_rstream_shm(rstream);
-		stream_frames = cras_fmt_conv_out_frames_to_in(dev_stream->conv,
-							       delay_frames);
-		cras_set_playback_timestamp(rstream->format.frame_rate,
-					    stream_frames +
-						    cras_shm_get_frames(shm),
-					    &shm->header->ts);
-	} else {
-		shm = cras_rstream_shm(rstream);
-		stream_frames = cras_fmt_conv_in_frames_to_out(dev_stream->conv,
-							       delay_frames);
-		if (cras_shm_frames_written(shm) == 0)
-			cras_set_capture_timestamp(rstream->format.frame_rate,
-						   stream_frames,
-						   &shm->header->ts);
-	}
-}
-
-int dev_stream_request_playback_samples(struct dev_stream *dev_stream,
-					const struct timespec *now)
-{
-	int rc;
-
-	rc = cras_rstream_request_audio(dev_stream->stream, now);
-	if (rc < 0)
-		return rc;
-
-	dev_stream_update_next_wake_time(dev_stream);
-
-	return 0;
-}
-
-int dev_stream_poll_stream_fd(const struct dev_stream *dev_stream)
-{
-	const struct cras_rstream *stream = dev_stream->stream;
-
-	/* For streams which rely on dev level timing, we should
-	 * let client response wake audio thread up. */
-	if (stream_uses_input(stream) && (stream->flags & USE_DEV_TIMING) &&
-	    cras_rstream_is_pending_reply(stream))
-		return stream->fd;
-
-	if (!stream_uses_output(stream) ||
-	    !cras_rstream_is_pending_reply(stream) ||
-	    cras_rstream_get_is_draining(stream))
-		return -1;
-
-	return stream->fd;
-}
-
-/*
- * Gets proper wake up time for an input stream. It considers both
- * time for samples to reach one callback level, and the time for next callback.
- * Returns:
- *   0 on success; negavite error code on failure. A positive value if
- *   there is no need to set wake up time for this stream.
- */
-static int get_input_wake_time(struct dev_stream *dev_stream,
-			       unsigned int curr_level,
-			       struct timespec *level_tstamp,
-			       unsigned int cap_limit, int is_cap_limit_stream,
-			       struct timespec *wake_time_out)
-{
-	struct cras_rstream *rstream = dev_stream->stream;
-	struct timespec time_for_sample;
-	int needed_frames_from_device;
-
-	needed_frames_from_device = dev_stream_capture_avail(dev_stream);
-
-	/*
-	 * If this stream is not cap_limit stream, and it needs more
-	 * frames than the capture limit from audio thread, don't bother
-	 * re-calculating the wake time for it because
-	 * |needed_frames_from_device| cannot be all copied to shm until
-	 * the cap_limit stream get its samples in shm read by client
-	 * and relieve the cap_limit.
-	 *
-	 * Note that we need to know whether this stream is cap_limit
-	 * stream here because the client of cap_limit stream may read
-	 * the data from shm during this time window, and cause
-	 * needed_frames_from_device to be greater than cap_limit which
-	 * was calculated before.
-	 */
-	if (!is_cap_limit_stream && needed_frames_from_device > cap_limit)
-		return 1;
-
-	/*
-	 * For capture stream using device timing, the flow would be:
-	 * 1. Device has less than one cb_threshold of data.
-	 * 2. Device has a large chunk of data that client needs to consume
-	 *    in multiple cycles.
-	 * 3. Audio thread sends one block to client and goes to sleep.
-	 * 4. Client sends reply to wake up audio thread.
-	 * 5. Repeat 3 and 4 until there is less than one cb_threshold of data.
-	 * 6. Goes to 1.
-	 *
-	 * In 1, we schedule the next wake up time based on the needed frames.
-	 * This is needed to poll the samples from device.
-	 *
-	 * In 3, we do not schedule a wake up time for this stream.
-	 * We let reply from client wakes up audio thread to send next
-	 * cb_threshold of data.
-	 *
-	 * TODO(cychiang) Do we want to actually block sending data to client
-	 * until client replies ? Or control the scheduling of wake up time
-	 * is enough ?
-	 *
-	 */
-	if ((rstream->flags & USE_DEV_TIMING) &&
-	    cras_rstream_is_pending_reply(rstream))
-		return 1;
-
-	*wake_time_out = rstream->next_cb_ts;
-
-	/*
-	 * If current frames in the device can provide needed amount for stream,
-	 * there is no need to wait.
-	 */
-	if (curr_level >= needed_frames_from_device)
-		needed_frames_from_device = 0;
-	else
-		needed_frames_from_device -= curr_level;
-
-	cras_frames_to_time(needed_frames_from_device, dev_stream->dev_rate,
-			    &time_for_sample);
-
-	add_timespecs(&time_for_sample, level_tstamp);
-
-	/* Select the time that is later so both sample and time conditions
-	 * are met. */
-	if (timespec_after(&time_for_sample, &rstream->next_cb_ts))
-		*wake_time_out = time_for_sample;
-	/* Using device timing means the stream neglects next callback time. */
-	if (rstream->flags & USE_DEV_TIMING)
-		*wake_time_out = time_for_sample;
-
-	ATLOG(atlog, AUDIO_THREAD_STREAM_SLEEP_TIME,
-	      dev_stream->stream->stream_id, wake_time_out->tv_sec,
-	      wake_time_out->tv_nsec);
-
-	return 0;
-}
-
-int dev_stream_wake_time(struct dev_stream *dev_stream, unsigned int curr_level,
-			 struct timespec *level_tstamp, unsigned int cap_limit,
-			 int is_cap_limit_stream,
-			 struct timespec *wake_time_out)
-{
-	if (dev_stream->stream->direction == CRAS_STREAM_OUTPUT) {
-		/*
-                 * TODO(cychiang) Implement the method for output stream.
-		 * The logic should be similar to what
-		 * get_next_stream_wake_from_list in audio_thread.c is doing.
-		 */
-		return -EINVAL;
-	}
-
-	return get_input_wake_time(dev_stream, curr_level, level_tstamp,
-				   cap_limit, is_cap_limit_stream,
-				   wake_time_out);
-}
-
-int dev_stream_is_pending_reply(const struct dev_stream *dev_stream)
-{
-	return cras_rstream_is_pending_reply(dev_stream->stream);
-}
-
-int dev_stream_flush_old_audio_messages(struct dev_stream *dev_stream)
-{
-	return cras_rstream_flush_old_audio_messages(dev_stream->stream);
-}
diff --git a/cras/src/server/dev_stream.h b/cras/src/server/dev_stream.h
deleted file mode 100644
index 6b34d5d..0000000
--- a/cras/src/server/dev_stream.h
+++ /dev/null
@@ -1,234 +0,0 @@
-/* Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- *
- * The dev_stream structure is used for mapping streams to a device.  In
- * addition to the rstream, other mixing information is stored here.
- */
-
-#ifndef DEV_STREAM_H_
-#define DEV_STREAM_H_
-
-#include <stdint.h>
-#include <sys/time.h>
-
-#include "cras_types.h"
-#include "cras_rstream.h"
-
-struct cras_audio_area;
-struct cras_fmt_conv;
-struct cras_iodev;
-
-/*
- * Linked list of streams of audio from/to a client.
- * Args:
- *    dev_id - Index of the hw device.
- *    stream - The rstream attached to a device.
- *    conv - Sample rate or format converter.
- *    conv_buffer - The buffer for converter if needed.
- *    conv_buffer_size_frames - Size of conv_buffer in frames.
- *    dev_rate - Sampling rate of device. This is set when dev_stream is
- *               created.
- *    is_running - For input stream, it should be set to true after it is added
- *                 into device. For output stream, it should be set to true
- *                 just before its first fetch to avoid affecting other existing
- *                 streams.
- */
-struct dev_stream {
-	unsigned int dev_id;
-	struct cras_rstream *stream;
-	struct cras_fmt_conv *conv;
-	struct byte_buffer *conv_buffer;
-	struct cras_audio_area *conv_area;
-	unsigned int conv_buffer_size_frames;
-	size_t dev_rate;
-	struct dev_stream *prev, *next;
-	int is_running;
-};
-
-/*
- * Creates a dev_stream.
- *
- * Args:
- *    stream - The associated rstream.
- *    dev_id - Index of the device.
- *    dev_fmt - The format of the device.
- *    dev_ptr - A pointer to the device
- *    cb_ts - A pointer to the initial callback time.
- *    sleep_interval_ts - A pointer to the initial sleep interval.
- *        Set to null to calculate the value from device rate and block size.
- *        Note that we need this argument so that output device sleep interval
- *        can use input device sleep interval in the beginning to have perfect
- *        alignment in WebRTC use case.
- * Returns the pointer to the created dev_stream.
- */
-struct dev_stream *dev_stream_create(struct cras_rstream *stream,
-				     unsigned int dev_id,
-				     const struct cras_audio_format *dev_fmt,
-				     void *dev_ptr, struct timespec *cb_ts,
-				     const struct timespec *sleep_interval_ts);
-void dev_stream_destroy(struct dev_stream *dev_stream);
-
-/*
- * Update the estimated sample rate of the device. For multiple active
- * devices case, the linear resampler will be configured by the estimated
- * rate ration of the main device and the current active device the
- * rstream attaches to.
- *
- * Args:
- *    dev_stream - The structure holding the stream.
- *    dev_rate - The sample rate device is using.
- *    dev_rate_ratio - The ratio of estimated rate and used rate.
- *    main_rate_ratio - The ratio of estimated rate and used rate of
- *        main device.
- *    coarse_rate_adjust - The flag to indicate the direction device
- *        sample rate should adjust to.
- */
-void dev_stream_set_dev_rate(struct dev_stream *dev_stream,
-			     unsigned int dev_rate, double dev_rate_ratio,
-			     double main_rate_ratio, int coarse_rate_adjust);
-
-/*
- * Renders count frames from shm into dst.  Updates count if anything is
- * written. If it's muted and the only stream zero memory.
- * Args:
- *    dev_stream - The struct holding the stream to mix.
- *    format - The format of the audio device.
- *    dst - The destination buffer for mixing.
- *    num_to_write - The number of frames written.
- */
-int dev_stream_mix(struct dev_stream *dev_stream,
-		   const struct cras_audio_format *fmt, uint8_t *dst,
-		   unsigned int num_to_write);
-
-/*
- * Reads froms from the source into the dev_stream.
- * Args:
- *    dev_stream - The struct holding the stream to mix to.
- *    area - The area to copy audio from.
- *    area_offset - The offset at which to start reading from area.
- *    software_gain_scaler - The software gain scaler.
- */
-unsigned int dev_stream_capture(struct dev_stream *dev_stream,
-				const struct cras_audio_area *area,
-				unsigned int area_offset,
-				float software_gain_scaler);
-
-/* Returns the number of iodevs this stream has attached to. */
-int dev_stream_attached_devs(const struct dev_stream *dev_stream);
-
-/* Updates the number of queued frames in dev_stream. */
-void dev_stream_update_frames(const struct dev_stream *dev_stream);
-
-/*
- * Returns the number of playback frames queued in shared memory.  This is a
- * post-format-conversion number.  If the stream is 24k with 10 frames queued
- * and the device is playing at 48k, 20 will be returned.
- */
-int dev_stream_playback_frames(const struct dev_stream *dev_stream);
-
-/*
- * Returns the number of frames free to be written to in a capture stream.  This
- * number is also post format conversion, similar to playback_frames above.
- */
-unsigned int dev_stream_capture_avail(const struct dev_stream *dev_stream);
-
-/*
- * Returns the callback threshold, if necesary converted from a stream frame
- * count to a device frame count.
- */
-unsigned int dev_stream_cb_threshold(const struct dev_stream *dev_stream);
-
-/* Update next callback time for the stream. */
-void dev_stream_update_next_wake_time(struct dev_stream *dev_stream);
-
-/*
- * If enough samples have been captured, post them to the client.
- * TODO(dgreid) - see if this function can be eliminated.
- */
-int dev_stream_capture_update_rstream(struct dev_stream *dev_stream);
-
-/* Updates the read buffer pointers for the stream. */
-int dev_stream_playback_update_rstream(struct dev_stream *dev_stream);
-
-/* Fill ts with the time the playback sample will be played. */
-void cras_set_playback_timestamp(size_t frame_rate, size_t frames,
-				 struct cras_timespec *ts);
-
-/* Fill ts with the time the capture sample was recorded. */
-void cras_set_capture_timestamp(size_t frame_rate, size_t frames,
-				struct cras_timespec *ts);
-
-/* Fill shm ts with the time the playback sample will be played or the capture
- * sample was captured depending on the direction of the stream.
- * Args:
- *    delay_frames - The delay reproted by the device, in frames at the device's
- *      sample rate.
- */
-void dev_stream_set_delay(const struct dev_stream *dev_stream,
-			  unsigned int delay_frames);
-
-/* Ask the client for cb_threshold samples of audio to play. */
-int dev_stream_request_playback_samples(struct dev_stream *dev_stream,
-					const struct timespec *now);
-
-/*
- * Gets the wake up time for a dev_stream.
- * For an input stream, it considers both needed samples and proper time
- * interval between each callbacks.
- * Args:
- *   dev_stream[in]: The dev_stream to check wake up time.
- *   curr_level[in]: The current level of device.
- *   level_tstamp[in]: The time stamp when getting current level of device.
- *   cap_limit[in]: The number of frames that can be captured across all
- *                  streams.
- *   is_cap_limit_stream[in]: 1 if this stream is causing cap_limit.
- *   wake_time_out[out]: A timespec for wake up time.
- * Returns:
- *   0 on success; negative error code on failure.
- *   A positive value if there is no need to set wake up time for this stream.
- */
-int dev_stream_wake_time(struct dev_stream *dev_stream, unsigned int curr_level,
-			 struct timespec *level_tstamp, unsigned int cap_limit,
-			 int is_cap_limit_stream,
-			 struct timespec *wake_time_out);
-
-/*
- * Returns a non-negative fd if the fd is expecting a message and should be
- * added to the list of descriptors to poll.
- */
-int dev_stream_poll_stream_fd(const struct dev_stream *dev_stream);
-
-static inline int dev_stream_is_running(struct dev_stream *dev_stream)
-{
-	return dev_stream->is_running;
-}
-
-static inline void dev_stream_set_running(struct dev_stream *dev_stream)
-{
-	dev_stream->is_running = 1;
-}
-
-static inline const struct timespec *
-dev_stream_next_cb_ts(const struct dev_stream *dev_stream)
-{
-	if (dev_stream->stream->flags & USE_DEV_TIMING)
-		return NULL;
-
-	return &dev_stream->stream->next_cb_ts;
-}
-
-static inline const struct timespec *
-dev_stream_sleep_interval_ts(struct dev_stream *dev_stream)
-{
-	return &dev_stream->stream->sleep_interval_ts;
-}
-
-int dev_stream_is_pending_reply(const struct dev_stream *dev_stream);
-
-/*
- * Reads any pending audio message from the socket.
- */
-int dev_stream_flush_old_audio_messages(struct dev_stream *dev_stream);
-
-#endif /* DEV_STREAM_H_ */
diff --git a/cras/src/server/ewma_power.c b/cras/src/server/ewma_power.c
deleted file mode 100644
index 5270ef0..0000000
--- a/cras/src/server/ewma_power.c
+++ /dev/null
@@ -1,81 +0,0 @@
-/* Copyright 2020 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include "ewma_power.h"
-#include "math.h"
-
-/* One sample per 1ms. */
-#define EWMA_SAMPLE_RATE 1000
-
-/* Smooth factor for EWMA, 1 - expf(-1.0/(rate * 0.01))
- * where the 0.01 corresponds to 10ms interval that is chosen and
- * being used in Chrome for a long time.
- * Here the |rate| is set to the down sampled EWMA_SAMPLE_RATE and
- * whenever it changes the calculated |smooth_factor| should be updated
- * accordingly.
- */
-const static float smooth_factor = 0.095;
-
-void ewma_power_disable(struct ewma_power *ewma)
-{
-	ewma->enabled = 0;
-}
-
-void ewma_power_init(struct ewma_power *ewma, unsigned int rate)
-{
-	ewma->enabled = 1;
-	ewma->power_set = 0;
-	ewma->step_fr = rate / EWMA_SAMPLE_RATE;
-}
-
-void ewma_power_calculate(struct ewma_power *ewma, const int16_t *buf,
-			  unsigned int channels, unsigned int size)
-{
-	int i, ch;
-	float power, f;
-
-	if (!ewma->enabled)
-		return;
-	for (i = 0; i < size; i += ewma->step_fr * channels) {
-		power = 0.0f;
-		for (ch = 0; ch < channels; ch++) {
-			f = buf[i + ch] / 32768.0f;
-			power += f * f / channels;
-		}
-		if (!ewma->power_set) {
-			ewma->power = power;
-			ewma->power_set = 1;
-		} else {
-			ewma->power = smooth_factor * power +
-				      (1 - smooth_factor) * ewma->power;
-		}
-	}
-}
-
-void ewma_power_calculate_area(struct ewma_power *ewma, const int16_t *buf,
-			       struct cras_audio_area *area, unsigned int size)
-{
-	int i, ch;
-	float power, f;
-
-	if (!ewma->enabled)
-		return;
-	for (i = 0; i < size; i += ewma->step_fr * area->num_channels) {
-		power = 0.0f;
-		for (ch = 0; ch < area->num_channels; ch++) {
-			if (area->channels[ch].ch_set == 0)
-				continue;
-			f = buf[i + ch] / 32768.0f;
-			power += f * f / area->num_channels;
-		}
-		if (!ewma->power_set) {
-			ewma->power = power;
-			ewma->power_set = 1;
-		} else {
-			ewma->power = smooth_factor * power +
-				      (1 - smooth_factor) * ewma->power;
-		}
-	}
-}
diff --git a/cras/src/server/ewma_power.h b/cras/src/server/ewma_power.h
deleted file mode 100644
index 78d2e50..0000000
--- a/cras/src/server/ewma_power.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/* Copyright 2020 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef EWMA_POWER_H_
-#define EWMA_POWER_H_
-
-#include <stdbool.h>
-#include <stdint.h>
-
-#include "cras_audio_area.h"
-
-/*
- * The exponentially weighted moving average power module used to
- * calculate the energe level in audio stream.
- * Members:
- *    power_set - Flag to note if the first power value has set.
- *    enabled - Flag to enable ewma calculation. Set to false to
- *        make all calculations no-ops.
- *    power - The power value.
- *    step_fr - How many frames to sample one for EWMA calculation.
- */
-struct ewma_power {
-	bool power_set;
-	bool enabled;
-	float power;
-	unsigned int step_fr;
-};
-
-/*
- * Disables the ewma instance.
- */
-void ewma_power_disable(struct ewma_power *ewma);
-
-/*
- * Initializes the ewma_power object.
- * Args:
- *    ewma - The ewma_power object to initialize.
- *    rate - The sample rate of the audio data that the ewma object
- *        will calculate power from.
- */
-void ewma_power_init(struct ewma_power *ewma, unsigned int rate);
-
-/*
- * Feeds an audio buffer to ewma_power object to calculate the
- * latest power value.
- * Args:
- *    ewma - The ewma_power object to calculate power.
- *    buf - Pointer to the audio data.
- *    channels - Number of channels of the audio data.
- *    size - Length in frames of the audio data.
- */
-void ewma_power_calculate(struct ewma_power *ewma, const int16_t *buf,
-			  unsigned int channels, unsigned int size);
-
-/*
- * Feeds non-interleaved audio data to ewma_power to calculate the
- * latest power value. This is similar to ewma_power_calculate but
- * accepts cras_audio_area.
- */
-void ewma_power_calculate_area(struct ewma_power *ewma, const int16_t *buf,
-			       struct cras_audio_area *area, unsigned int size);
-
-#endif /* EWMA_POWER_H_ */
diff --git a/cras/src/server/float_buffer.h b/cras/src/server/float_buffer.h
deleted file mode 100644
index ba3523d..0000000
--- a/cras/src/server/float_buffer.h
+++ /dev/null
@@ -1,126 +0,0 @@
-/* Copyright 2018 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef FLOAT_BUFFER_H_
-#define FLOAT_BUFFER_H_
-
-#include "byte_buffer.h"
-
-/*
- * Circular buffer storing deinterleaved floating point data.
- * Members:
- *    fp - Pointer to be filled wtih read/write position of the buffer.
- *    num_channels - Number of channels.
- */
-struct float_buffer {
-	struct byte_buffer *buf;
-	float **fp;
-	unsigned int num_channels;
-};
-
-/*
- * Creates an float_buffer.
- * Args:
- *    max_size - The max number of frames this buffer may store.
- *    num_channels - Number of channels of the deinterleaved data.
- */
-static inline struct float_buffer *
-float_buffer_create(unsigned int max_size, unsigned int num_channels)
-{
-	struct float_buffer *b;
-
-	b = (struct float_buffer *)calloc(1, sizeof(*b));
-
-	b->num_channels = num_channels;
-	b->fp = (float **)malloc(num_channels * sizeof(float *));
-	b->buf = (struct byte_buffer *)calloc(
-		1, sizeof(struct byte_buffer) +
-			   sizeof(float) * max_size * num_channels);
-	b->buf->max_size = max_size;
-	b->buf->used_size = max_size;
-	return b;
-}
-
-/* Destroys the float buffer. */
-static inline void float_buffer_destroy(struct float_buffer **b)
-{
-	if (*b == NULL)
-		return;
-
-	byte_buffer_destroy(&(*b)->buf);
-	free((*b)->fp);
-	free(*b);
-	*b = NULL;
-}
-
-/* Gets the write pointer of given float_buffer. */
-static inline float *const *float_buffer_write_pointer(struct float_buffer *b)
-{
-	unsigned int i;
-	float *data = (float *)b->buf->bytes;
-
-	for (i = 0; i < b->num_channels; i++, data += b->buf->max_size)
-		b->fp[i] = data + b->buf->write_idx;
-	return b->fp;
-}
-
-/* Gets the number of frames can write to the float_buffer. */
-static inline unsigned int float_buffer_writable(struct float_buffer *b)
-{
-	return buf_writable(b->buf);
-}
-
-/* Marks |nwritten| of frames as written to float_buffer. */
-static inline void float_buffer_written(struct float_buffer *b,
-					unsigned int nwritten)
-{
-	buf_increment_write(b->buf, nwritten);
-}
-
-/* Gets the read pointer of given float_buffer. */
-static inline float *const *float_buffer_read_pointer(struct float_buffer *b,
-						      unsigned int offset,
-						      unsigned int *readable)
-{
-	unsigned int i;
-	float *data = (float *)b->buf->bytes;
-	unsigned int nread = buf_readable(b->buf);
-
-	if (offset >= buf_queued(b->buf)) {
-		*readable = 0;
-		offset = 0;
-	} else if (offset >= nread) {
-		/* wraps */
-		offset = offset + b->buf->read_idx - b->buf->max_size;
-		*readable = MIN(*readable, b->buf->write_idx - offset);
-	} else {
-		*readable = MIN(*readable, nread - offset);
-		offset += b->buf->read_idx;
-	}
-
-	for (i = 0; i < b->num_channels; i++, data += b->buf->max_size)
-		b->fp[i] = data + offset;
-	return b->fp;
-}
-
-/* Gets the buffer level in frames queued in float_buffer. */
-static inline unsigned int float_buffer_level(struct float_buffer *b)
-{
-	return buf_queued(b->buf);
-}
-
-/* Resets float_buffer to initial state. */
-static inline void float_buffer_reset(struct float_buffer *b)
-{
-	buf_reset(b->buf);
-}
-
-/* Marks |nread| frames as read in float_buffer. */
-static inline void float_buffer_read(struct float_buffer *b, unsigned int nread)
-{
-	buf_increment_read(b->buf, nread);
-}
-
-#endif /* FLOAT_BUFFER_H_ */
diff --git a/cras/src/server/iniparser_wrapper.h b/cras/src/server/iniparser_wrapper.h
deleted file mode 100644
index 89a213b..0000000
--- a/cras/src/server/iniparser_wrapper.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/* Copyright 2017 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-#ifndef INIPARSER_WRAPPER_H_
-#define INIPARSER_WRAPPER_H_
-
-#ifdef HAVE_INIPARSER_INIPARSER_H
-#include <iniparser/iniparser.h>
-#else
-#include <iniparser.h>
-#endif
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <unistd.h>
-
-/* Allocate 63 chars + 1 for null where declared. */
-#define MAX_INI_NAME_LENGTH 63
-#define MAX_INI_KEY_LENGTH 63 /* names like "output_source:output_0" */
-
-static inline dictionary *iniparser_load_wrapper(const char *ini_name)
-{
-	struct stat st;
-	int rc = stat(ini_name, &st);
-	if (rc < 0)
-		return NULL;
-	return iniparser_load(ini_name);
-}
-
-#endif /* INIPARSER_WRAPPER_H_ */
diff --git a/cras/src/server/input_data.c b/cras/src/server/input_data.c
deleted file mode 100644
index cc0f10b..0000000
--- a/cras/src/server/input_data.c
+++ /dev/null
@@ -1,210 +0,0 @@
-/* Copyright 2018 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <syslog.h>
-
-#include "buffer_share.h"
-#include "cras_audio_area.h"
-#include "cras_dsp_pipeline.h"
-#include "cras_mix.h"
-#include "cras_rstream.h"
-#include "cras_system_state.h"
-#include "dsp_util.h"
-#include "input_data.h"
-#include "utlist.h"
-
-void input_data_run(struct ext_dsp_module *ext, unsigned int nframes)
-{
-	struct input_data *data = (struct input_data *)ext;
-	float *const *wp;
-	int i;
-	unsigned int writable;
-	unsigned int offset = 0;
-
-	while (nframes) {
-		writable = float_buffer_writable(data->fbuffer);
-		writable = MIN(nframes, writable);
-		if (!writable) {
-			syslog(LOG_ERR,
-			       "Not enough space to process input data");
-			break;
-		}
-		wp = float_buffer_write_pointer(data->fbuffer);
-		for (i = 0; i < data->fbuffer->num_channels; i++)
-			memcpy(wp[i], ext->ports[i] + offset,
-			       writable * sizeof(float));
-
-		float_buffer_written(data->fbuffer, writable);
-		nframes -= writable;
-		offset += writable;
-	}
-}
-
-void input_data_configure(struct ext_dsp_module *ext, unsigned int buffer_size,
-			  unsigned int num_channels, unsigned int rate)
-{
-	struct input_data *data = (struct input_data *)ext;
-
-	if (data->fbuffer)
-		float_buffer_destroy(&data->fbuffer);
-	data->fbuffer = float_buffer_create(buffer_size, num_channels);
-}
-
-struct input_data *input_data_create(void *dev_ptr)
-{
-	struct input_data *data = (struct input_data *)calloc(1, sizeof(*data));
-
-	data->dev_ptr = dev_ptr;
-
-	data->ext.run = input_data_run;
-	data->ext.configure = input_data_configure;
-
-	return data;
-}
-
-void input_data_destroy(struct input_data **data)
-{
-	if ((*data)->fbuffer)
-		float_buffer_destroy(&(*data)->fbuffer);
-	free(*data);
-	*data = NULL;
-}
-
-void input_data_set_all_streams_read(struct input_data *data,
-				     unsigned int nframes)
-{
-	if (!data->fbuffer)
-		return;
-
-	if (float_buffer_level(data->fbuffer) < nframes) {
-		syslog(LOG_ERR,
-		       "All streams read %u frames exceeds %u"
-		       " in input_data's buffer",
-		       nframes, float_buffer_level(data->fbuffer));
-		float_buffer_reset(data->fbuffer);
-		return;
-	}
-	float_buffer_read(data->fbuffer, nframes);
-}
-
-/*
- * The logic is not trivial to return the cras_audio_area and offset for
- * a input stream to read. The buffer position and length of a bunch of
- * input member variables are described below.
- *
- *                          hw_ptr                 appl_ptr
- * a. buffer of input device: |------------------------|
- * b. fbuffer of input data:         |<--------------->|
- * c. stream offset of input data:         |<--------->|
- *    stream offset of input data:                |<-->|
- *    stream offset of input data:     |<------------->|
- * d. audio area of input data:          |<----------->|
- *
- * One thing to keep in mind is, the offset could exceed the size of
- * buffer to read. It's not intuitive though why the stream offset would
- * exceed buffer size. Check this example:
- *
- * Idev gets input buffer 500 frames. One stream read 400, while the other
- * stream read 100. We track stream offset [0, 300] after both stream
- * consumes 100 frames. In the next wake up, audio thread asks idev to
- * get 250 frames. Now the input data holds audio area containing 250 frames
- * of audio as queried, while its float buffer contains 400 frames of audio
- * deinterleaved from last wake up.
- *
- * Wake up at T0:
- *                        hw_ptr                        appl_ptr
- * Input audio area         |-------------------------------|
- * deinterleave float       |-------------------------------|
- * Stream 1 read                                     |------|
- * Stream 2 read                    |-----------------------|
- *
- * Wake up at T1:
-                          hw_ptr                 appl_ptr
- * Input audio area                     |------------|
- * deinterleave float       |------------------------|
- * Stream 1 offset                                   |
- * Stream 2 offset                  |----------------|
- *
- * Case 1:
- * A normal input stream, of read offset 0, about to read from device.
- * We shall return the exact audio area from idev, and set read offset to 0.
- *
- * Case 2:
- * A normal input stream, of read offset 300, about to read from device.
- * We shall return the exact audio area from idev but clip read offset to 250.
- *
- * Case 3:
- * An APM Stream of read offset 300, would like to read the deinterleaved
- * float buffer. We shall let APM process the float buffer from offset 300.
- * Don't bother clip read offset in this case, because fbuffer contains
- * the deepest deinterleaved audio data ever read from idev.
- */
-int input_data_get_for_stream(struct input_data *data,
-			      struct cras_rstream *stream,
-			      struct buffer_share *offsets,
-			      struct cras_audio_area **area,
-			      unsigned int *offset)
-{
-	int apm_processed;
-	struct cras_apm *apm;
-	int stream_offset = buffer_share_id_offset(offsets, stream->stream_id);
-
-	apm = cras_apm_list_get_active_apm(stream, data->dev_ptr);
-	if (apm == NULL) {
-		/*
-		 * Case 1 and 2 from above example.
-		 */
-		*area = data->area;
-		*offset = MIN(stream_offset, data->area->frames);
-	} else {
-		/*
-		 * Case 3 from above example.
-		 */
-		apm_processed = cras_apm_list_process(apm, data->fbuffer,
-						      stream_offset);
-		if (apm_processed < 0) {
-			cras_apm_list_remove_apm(stream->apm_list, apm);
-			return 0;
-		}
-		buffer_share_offset_update(offsets, stream->stream_id,
-					   apm_processed);
-		*area = cras_apm_list_get_processed(apm);
-		*offset = 0;
-	}
-
-	return 0;
-}
-
-int input_data_put_for_stream(struct input_data *data,
-			      struct cras_rstream *stream,
-			      struct buffer_share *offsets, unsigned int frames)
-{
-	struct cras_apm *apm =
-		cras_apm_list_get_active_apm(stream, data->dev_ptr);
-
-	if (apm)
-		cras_apm_list_put_processed(apm, frames);
-	else
-		buffer_share_offset_update(offsets, stream->stream_id, frames);
-
-	return 0;
-}
-
-float input_data_get_software_gain_scaler(struct input_data *data,
-					  float idev_sw_gain_scaler,
-					  struct cras_rstream *stream)
-{
-	struct cras_apm *apm;
-	/*
-	 * APM has more advanced gain control mechanism. If it is using tuned
-	 * settings, give APM total control of the captured samples without
-	 * additional gain scaler at all.
-	 */
-	apm = cras_apm_list_get_active_apm(stream, data->dev_ptr);
-	if (apm && cras_apm_list_get_use_tuned_settings(apm))
-		return 1.0f;
-
-	return idev_sw_gain_scaler * cras_rstream_get_volume_scaler(stream);
-}
diff --git a/cras/src/server/input_data.h b/cras/src/server/input_data.h
deleted file mode 100644
index 7ac80be..0000000
--- a/cras/src/server/input_data.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/* Copyright 2018 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef INPUT_DATA_H_
-#define INPUT_DATA_H_
-
-#include "cras_dsp_pipeline.h"
-#include "float_buffer.h"
-
-/*
- * Structure holding the information used when a chunk of input buffer
- * is accessed by multiple streams with different properties and
- * processing requirements.
- * Member:
- *    ext - Provides interface to read and process buffer in dsp pipeline.
- *    dev_ptr - Pointer to the associated input iodev.
- *    area - The audio area used for deinterleaved data copy.
- *    fbuffer - Floating point buffer from input device.
- */
-struct input_data {
-	struct ext_dsp_module ext;
-	void *dev_ptr;
-	struct cras_audio_area *area;
-	struct float_buffer *fbuffer;
-};
-
-/*
- * Creates an input_data instance for input iodev.
- * Args:
- *    dev_ptr - Pointer to the associated input device.
- */
-struct input_data *input_data_create(void *dev_ptr);
-
-/* Destroys an input_data instance. */
-void input_data_destroy(struct input_data **data);
-
-/* Sets how many frames in buffer has been read by all input streams. */
-void input_data_set_all_streams_read(struct input_data *data,
-				     unsigned int nframes);
-
-/*
- * Gets an audio area for |stream| to read data from. An input_data may be
- * accessed by multiple streams while some requires processing, the
- * |offsets| arguments helps track the offset value each stream has read
- * into |data|.
- * Args:
- *    data - The input data to get audio area from.
- *    stream - The stream that reads data.
- *    offsets - Structure holding the mapping from stream to the offset value
- *        of how many frames each stream has read into input buffer.
- *    area - To be filled with a pointer to an audio area struct for stream to
- *        read data.
- *    offset - To be filled with the samples offset in |area| that |stream|
- *        should start reading.
- */
-int input_data_get_for_stream(struct input_data *data,
-			      struct cras_rstream *stream,
-			      struct buffer_share *offsets,
-			      struct cras_audio_area **area,
-			      unsigned int *offset);
-
-/*
- * Marks |frames| of audio data as read by |stream|.
- * Args:
- *    data - The input_data to mark frames has been read by |stream|.
- *    stream - The stream that has read audio data.
- *    offsets - Structure holding the mapping from stream to the offset value
- *        of how many frames each stream has read into input buffer.
- *    frames - Number of frames |stream| has read.
- */
-int input_data_put_for_stream(struct input_data *data,
-			      struct cras_rstream *stream,
-			      struct buffer_share *offsets,
-			      unsigned int frames);
-
-/*
- * The software gain scaler of input path consist of two parts:
- * (1) The device gain scaler used when lack of hardware gain control.
- * Configured by the IntrinsicSensitivity label in alsa UCM config.
- * (2) The gain scaler in cras_rstream set by app, for example the AGC
- * module in Chrome.
- * Args:
- *    data - The input data that holds pointer to APM instance.
- *    idev_sw_agin_scaler - The gain scaler configured on input iodev.
- *    stream - To provide stream layer software gain.
- * Returns:
- *    1.0 if tuned APM in use, otherwise |iodev gain| * |cras_rstream gain|
- */
-float input_data_get_software_gain_scaler(struct input_data *data,
-					  float idev_sw_gain_scaler,
-					  struct cras_rstream *stream);
-
-#endif /* INPUT_DATA_H_ */
diff --git a/cras/src/server/linear_resampler.c b/cras/src/server/linear_resampler.c
deleted file mode 100644
index ed2b6d6..0000000
--- a/cras/src/server/linear_resampler.c
+++ /dev/null
@@ -1,171 +0,0 @@
-/* Copyright (c) 2014 The Chromium OS Author. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include "cras_audio_area.h"
-#include "cras_util.h"
-#include "linear_resampler.h"
-
-/* A linear resampler.
- * Members:
- *    num_channels - The number of channles in once frames.
- *    format_bytes - The size of one frame in bytes.
- *    src_offset - The accumulated offset for resampled src data.
- *    dst_offset - The accumulated offset for resampled dst data.
- *    to_times_100 - The numerator of the rate factor used for SRC.
- *    from_times_100 - The denominator of the rate factor used for SRC.
- *    f - The rate factor used for linear resample.
- */
-struct linear_resampler {
-	unsigned int num_channels;
-	unsigned int format_bytes;
-	unsigned int src_offset;
-	unsigned int dst_offset;
-	unsigned int to_times_100;
-	unsigned int from_times_100;
-	float f;
-};
-
-struct linear_resampler *linear_resampler_create(unsigned int num_channels,
-						 unsigned int format_bytes,
-						 float src_rate, float dst_rate)
-{
-	struct linear_resampler *lr;
-
-	lr = (struct linear_resampler *)calloc(1, sizeof(*lr));
-	if (!lr)
-		return NULL;
-	lr->num_channels = num_channels;
-	lr->format_bytes = format_bytes;
-
-	linear_resampler_set_rates(lr, src_rate, dst_rate);
-
-	return lr;
-}
-
-void linear_resampler_destroy(struct linear_resampler *lr)
-{
-	if (lr)
-		free(lr);
-}
-
-void linear_resampler_set_rates(struct linear_resampler *lr, float from,
-				float to)
-{
-	lr->f = (float)to / from;
-	lr->to_times_100 = to * 100;
-	lr->from_times_100 = from * 100;
-	lr->src_offset = 0;
-	lr->dst_offset = 0;
-}
-
-/* Assuming the linear resampler transforms X frames of input buffer into
- * Y frames of output buffer. The resample method requires the last output
- * buffer at Y-1 be interpolated from input buffer in range (X-d, X-1) as
- * illustrated.
- *    Input Index:    ...      X-1 <--floor--|   X
- *    Output Index:   ... Y-1   |--ceiling-> Y
- *
- * That said, the calculation between input and output frames is based on
- * equations X-1 = floor(Y/f) and Y = ceil((X-1)*f).  Note that in any case
- * when the resampled frames number isn't sufficient to consume the first
- * buffer at input or output offset(index 0), always count as one buffer
- * used so the intput/output offset can always increment.
- */
-unsigned int linear_resampler_out_frames_to_in(struct linear_resampler *lr,
-					       unsigned int frames)
-{
-	float in_frames;
-	if (frames == 0)
-		return 0;
-
-	in_frames = (float)(lr->dst_offset + frames) / lr->f;
-	if ((in_frames > lr->src_offset))
-		return 1 + (unsigned int)(in_frames - lr->src_offset);
-	else
-		return 1;
-}
-
-unsigned int linear_resampler_in_frames_to_out(struct linear_resampler *lr,
-					       unsigned int frames)
-{
-	float out_frames;
-	if (frames == 0)
-		return 0;
-
-	out_frames = lr->f * (lr->src_offset + frames - 1);
-	if (out_frames > lr->dst_offset)
-		return 1 + (unsigned int)(out_frames - lr->dst_offset);
-	else
-		return 1;
-}
-
-int linear_resampler_needed(struct linear_resampler *lr)
-{
-	return lr->from_times_100 != lr->to_times_100;
-}
-
-unsigned int linear_resampler_resample(struct linear_resampler *lr,
-				       uint8_t *src, unsigned int *src_frames,
-				       uint8_t *dst, unsigned dst_frames)
-{
-	int ch;
-	unsigned int src_idx = 0;
-	unsigned int dst_idx = 0;
-	float src_pos;
-	int16_t *in, *out;
-
-	/* Check for corner cases so that we can assume both src_idx and
-	 * dst_idx are valid with value 0 in the loop below. */
-	if (dst_frames == 0 || *src_frames == 0) {
-		*src_frames = 0;
-		return 0;
-	}
-
-	for (dst_idx = 0; dst_idx <= dst_frames; dst_idx++) {
-		src_pos = (float)(lr->dst_offset + dst_idx) / lr->f;
-		if (src_pos > lr->src_offset)
-			src_pos -= lr->src_offset;
-		else
-			src_pos = 0;
-		src_idx = (unsigned int)src_pos;
-
-		if (src_pos > *src_frames - 1 || dst_idx >= dst_frames) {
-			if (src_pos > *src_frames - 1)
-				src_idx = *src_frames - 1;
-			/* When this loop stops, dst_idx is always at the last
-			 * used index incremented by 1. */
-			break;
-		}
-
-		in = (int16_t *)(src + src_idx * lr->format_bytes);
-		out = (int16_t *)(dst + dst_idx * lr->format_bytes);
-
-		/* Don't do linear interpolcation if src_pos falls on the
-		 * last index. */
-		if (src_idx == *src_frames - 1) {
-			for (ch = 0; ch < lr->num_channels; ch++)
-				out[ch] = in[ch];
-		} else {
-			for (ch = 0; ch < lr->num_channels; ch++) {
-				out[ch] = in[ch] +
-					  (src_pos - src_idx) *
-						  (in[lr->num_channels + ch] -
-						   in[ch]);
-			}
-		}
-	}
-
-	*src_frames = src_idx + 1;
-
-	lr->src_offset += *src_frames;
-	lr->dst_offset += dst_idx;
-	while ((lr->src_offset > lr->from_times_100) &&
-	       (lr->dst_offset > lr->to_times_100)) {
-		lr->src_offset -= lr->from_times_100;
-		lr->dst_offset -= lr->to_times_100;
-	}
-
-	return dst_idx;
-}
diff --git a/cras/src/server/linear_resampler.h b/cras/src/server/linear_resampler.h
deleted file mode 100644
index 25eff2b..0000000
--- a/cras/src/server/linear_resampler.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/* Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef LINEAR_RESAMPLER_H_
-#define LINEAR_RESAMPLER_H_
-
-struct linear_resampler;
-
-/* Creates a linear resampler.
- * Args:
- *    num_channels - The number of channels in each frames.
- *    format_bytes - The length of one frame in bytes.
- *    src_rate - The source rate to resample from.
- *    dst_rate - The destination rate to resample to.
- */
-struct linear_resampler *linear_resampler_create(unsigned int num_channels,
-						 unsigned int format_bytes,
-						 float src_rate,
-						 float dst_rate);
-
-/* Sets the rates for the linear resampler.
- * Args:
- *    from - The rate to resample from.
- *    to - The rate to resample to.
- */
-void linear_resampler_set_rates(struct linear_resampler *lr, float from,
-				float to);
-
-/* Converts the frames count from output rate to input rate. */
-unsigned int linear_resampler_out_frames_to_in(struct linear_resampler *lr,
-					       unsigned int frames);
-
-/* Converts the frames count from input rate to output rate. */
-unsigned int linear_resampler_in_frames_to_out(struct linear_resampler *lr,
-					       unsigned int frames);
-
-/* Returns true if SRC is needed, otherwise return false. */
-int linear_resampler_needed(struct linear_resampler *lr);
-
-/* Run linear resample for audio samples.
- * Args:
- *    lr - The linear resampler.
- *    src - The input buffer.
- *    src_frames - The number of frames of input buffer.
- *    dst - The output buffer.
- *    dst_frames - The number of frames of output buffer.
- */
-unsigned int linear_resampler_resample(struct linear_resampler *lr,
-				       uint8_t *src, unsigned int *src_frames,
-				       uint8_t *dst, unsigned dst_frames);
-
-/* Destroy a linear resampler. */
-void linear_resampler_destroy(struct linear_resampler *lr);
-
-#endif /* LINEAR_RESAMPLER_H_ */
diff --git a/cras/src/server/polled_interval_checker.c b/cras/src/server/polled_interval_checker.c
deleted file mode 100644
index 37f9368..0000000
--- a/cras/src/server/polled_interval_checker.c
+++ /dev/null
@@ -1,53 +0,0 @@
-/* Copyright 2018 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include "cras_util.h"
-#include "polled_interval_checker.h"
-
-struct polled_interval {
-	struct timespec last_interval_start_ts;
-	int interval_sec;
-};
-
-static struct timespec now;
-
-static inline int
-get_sec_since_last_active(const struct timespec *last_active_ts)
-{
-	struct timespec diff;
-	subtract_timespecs(&now, last_active_ts, &diff);
-	return diff.tv_sec;
-}
-
-void pic_update_current_time()
-{
-	clock_gettime(CLOCK_MONOTONIC_RAW, &now);
-}
-
-struct polled_interval *pic_polled_interval_create(int interval_sec)
-{
-	struct polled_interval *pi;
-	pi = malloc(sizeof(*pi));
-	pi->last_interval_start_ts = now;
-	pi->interval_sec = interval_sec;
-	return pi;
-}
-
-void pic_polled_interval_destroy(struct polled_interval **interval)
-{
-	free(*interval);
-	*interval = NULL;
-}
-
-int pic_interval_elapsed(const struct polled_interval *pi)
-{
-	return get_sec_since_last_active(&pi->last_interval_start_ts) >=
-	       pi->interval_sec;
-}
-
-void pic_interval_reset(struct polled_interval *pi)
-{
-	pi->last_interval_start_ts = now;
-}
\ No newline at end of file
diff --git a/cras/src/server/polled_interval_checker.h b/cras/src/server/polled_interval_checker.h
deleted file mode 100644
index 1b4619d..0000000
--- a/cras/src/server/polled_interval_checker.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/* Copyright 2018 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef POLLED_ACTIVITY_CHECKER_H_
-#define POLLED_ACTIVITY_CHECKER_H_
-
-#include <time.h>
-
-/* Represents a time interval, in seconds, which can be checked periodically. */
-struct polled_interval;
-
-/*
- * Creates a new polled_interval, of the specified duration. The interval will
- * first elapse interval_sec after it was created.
- *
- * Call pic_update_current_time() shortly before this function.
- */
-struct polled_interval *pic_polled_interval_create(int interval_sec);
-
-/*
- * Destroys the specified polled_interval, and set's the pointer to it to NULL.
- */
-void pic_polled_interval_destroy(struct polled_interval **interval);
-
-/*
- * Whether the interval's duration has elapsed (since the interval was created
- * or reset).
- *
- * Call pic_update_current_time() shortly before this function.
- */
-int pic_interval_elapsed(const struct polled_interval *interval);
-
-/*
- * Resets the interval; it will elapse it's specified duration from now.
- *
- * Call pic_update_current_time() shortly before this function.
- */
-void pic_interval_reset(struct polled_interval *pi);
-
-/*
- * Updates the current time, which is used in all other pic_* functions (which
- * will never update the current time). This update is pulled out separately to
- * allow the caller to control when and how often the time is updated.
- */
-void pic_update_current_time();
-
-#endif /* POLLED_ACTIVITY_CHECKER_H_ */
\ No newline at end of file
diff --git a/cras/src/server/rust/.gitignore b/cras/src/server/rust/.gitignore
deleted file mode 100644
index 2f7896d..0000000
--- a/cras/src/server/rust/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-target/
diff --git a/cras/src/server/rust/Cargo.toml b/cras/src/server/rust/Cargo.toml
deleted file mode 100644
index afebda8..0000000
--- a/cras/src/server/rust/Cargo.toml
+++ /dev/null
@@ -1,17 +0,0 @@
-[package]
-name = "cras_rust"
-version = "0.1.0"
-authors = ["The Chromium OS Authors"]
-edition = "2018"
-
-[lib]
-path = "src/rate_estimator.rs"
-crate-type = ["staticlib"]
-
-[dependencies]
-libc = "0.2.44"
-
-[profile.release]
-lto = true
-panic = "abort"
-overflow-checks = true
diff --git a/cras/src/server/rust/binding_generator/Cargo.toml b/cras/src/server/rust/binding_generator/Cargo.toml
deleted file mode 100644
index 1ec7348..0000000
--- a/cras/src/server/rust/binding_generator/Cargo.toml
+++ /dev/null
@@ -1,8 +0,0 @@
-[package]
-name = "binding_generator"
-version = "0.1.0"
-authors = ["The Chromium OS Authors"]
-edition = "2018"
-
-[dependencies]
-cbindgen = "*"
diff --git a/cras/src/server/rust/binding_generator/src/main.rs b/cras/src/server/rust/binding_generator/src/main.rs
deleted file mode 100644
index f780396..0000000
--- a/cras/src/server/rust/binding_generator/src/main.rs
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2019 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-extern crate cbindgen;
-
-use cbindgen::Builder;
-
-const HEADER: &str = "// Copyright 2019 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Generated from files in cras/src/server/rust/src in adhd.";
-
-fn main() {
-    Builder::new()
-        .with_src("../src/rate_estimator.rs")
-        .rename_item("RateEstimator", "rate_estimator")
-        .rename_item("timespec", "struct timespec")
-        .with_no_includes()
-        .with_sys_include("time.h")
-        .with_include_guard("RATE_ESTIMATOR_H_")
-        .with_language(cbindgen::Language::C)
-        .with_header(HEADER)
-        .generate()
-        .expect("Unable to generate bindings")
-        .write_to_file("../src/headers/rate_estimator.h");
-}
diff --git a/cras/src/server/rust/src/headers/rate_estimator.h b/cras/src/server/rust/src/headers/rate_estimator.h
deleted file mode 100644
index 3ac9cfa..0000000
--- a/cras/src/server/rust/src/headers/rate_estimator.h
+++ /dev/null
@@ -1,85 +0,0 @@
-// Copyright 2019 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Generated from files in cras/src/server/rust/src in adhd.
-
-#ifndef RATE_ESTIMATOR_H_
-#define RATE_ESTIMATOR_H_
-
-#include <time.h>
-
-/**
- * An estimator holding the required information to determine the actual frame
- * rate of an audio device.
- *
- * # Members
- *    * `last_level` - Buffer level of the audio device at last check time.
- *    * `level_diff` - Number of frames written to or read from audio device
- *                     since the last check time. Rate estimator will use this
- *                     change plus the difference of buffer level to derive the
- *                     number of frames audio device has actually processed.
- *    * `window_start` - The start time of the current window.
- *    * `window_size` - The size of the window.
- *    * `window_frames` - The number of frames accumulated in current window.
- *    * `lsq` - The helper used to estimate sample rate.
- *    * `smooth_factor` - A scaling factor used to average the previous and new
- *                        rate estimates to ensure that estimates do not change
- *                        too quickly.
- *    * `estimated_rate` - The estimated rate at which samples are consumed.
- */
-typedef struct rate_estimator rate_estimator;
-
-/**
- * # Safety
- *
- * To use this function safely, `re` must be a pointer returned from
- * rate_estimator_create, or null.
- */
-void rate_estimator_add_frames(rate_estimator *re, int frames);
-
-/**
- * # Safety
- *
- * To use this function safely, `re` must be a pointer returned from
- * rate_estimator_create, or null, and `now` must be a valid pointer to a
- * timespec.
- */
-int32_t rate_estimator_check(rate_estimator *re, int level,
-			     const struct timespec *now);
-
-/**
- * # Safety
- *
- * To use this function safely, `window_size` must be a valid pointer to a
- * timespec.
- */
-rate_estimator *rate_estimator_create(unsigned int rate,
-				      const struct timespec *window_size,
-				      double smooth_factor);
-
-/**
- * # Safety
- *
- * To use this function safely, `re` must be a pointer returned from
- * rate_estimator_create, or null.
- */
-void rate_estimator_destroy(rate_estimator *re);
-
-/**
- * # Safety
- *
- * To use this function safely, `re` must be a pointer returned from
- * rate_estimator_create, or null.
- */
-double rate_estimator_get_rate(const rate_estimator *re);
-
-/**
- * # Safety
- *
- * To use this function safely, `re` must be a pointer returned from
- * rate_estimator_create, or null.
- */
-void rate_estimator_reset_rate(rate_estimator *re, unsigned int rate);
-
-#endif /* RATE_ESTIMATOR_H_ */
diff --git a/cras/src/server/rust/src/rate_estimator.rs b/cras/src/server/rust/src/rate_estimator.rs
deleted file mode 100644
index 585f346..0000000
--- a/cras/src/server/rust/src/rate_estimator.rs
+++ /dev/null
@@ -1,188 +0,0 @@
-// Copyright 2019 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-pub mod rate_estimator_bindings;
-
-use std::error;
-use std::fmt;
-use std::time::Duration;
-
-#[derive(Debug)]
-pub enum Error {
-    InvalidSmoothFactor(f64),
-}
-
-impl error::Error for Error {}
-
-impl fmt::Display for Error {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        use Error::*;
-        match self {
-            InvalidSmoothFactor(sf) => write!(f, "Smooth factor {} is not between 0.0 and 1.0", sf),
-        }
-    }
-}
-
-type Result<T> = std::result::Result<T, Error>;
-
-const MAX_RATE_SKEW: f64 = 100.0;
-
-/// Hold information to calculate linear least square from
-/// several (x, y) samples.
-#[derive(Debug, Default)]
-struct LeastSquares {
-    sum_x: f64,
-    sum_y: f64,
-    sum_xy: f64,
-    sum_x2: f64,
-    num_samples: u32,
-}
-
-impl LeastSquares {
-    fn new() -> Self {
-        Self::default()
-    }
-
-    fn add_sample(&mut self, x: f64, y: f64) {
-        self.sum_x += x;
-        self.sum_y += y;
-        self.sum_xy += x * y;
-        self.sum_x2 += x * x;
-        self.num_samples += 1;
-    }
-
-    fn best_fit_slope(&self) -> f64 {
-        let num = self.num_samples as f64 * self.sum_xy - self.sum_x * self.sum_y;
-        let den = self.num_samples as f64 * self.sum_x2 - self.sum_x * self.sum_x;
-        num / den
-    }
-}
-
-/// An estimator holding the required information to determine the actual frame
-/// rate of an audio device.
-///
-/// # Members
-///    * `last_level` - Buffer level of the audio device at last check time.
-///    * `level_diff` - Number of frames written to or read from audio device
-///                     since the last check time. Rate estimator will use this
-///                     change plus the difference of buffer level to derive the
-///                     number of frames audio device has actually processed.
-///    * `window_start` - The start time of the current window.
-///    * `window_size` - The size of the window.
-///    * `window_frames` - The number of frames accumulated in current window.
-///    * `lsq` - The helper used to estimate sample rate.
-///    * `smooth_factor` - A scaling factor used to average the previous and new
-///                        rate estimates to ensure that estimates do not change
-///                        too quickly.
-///    * `estimated_rate` - The estimated rate at which samples are consumed.
-pub struct RateEstimator {
-    last_level: i32,
-    level_diff: i32,
-    window_start: Option<Duration>,
-    window_size: Duration,
-    window_frames: u32,
-    lsq: LeastSquares,
-    smooth_factor: f64,
-    estimated_rate: f64,
-}
-
-impl RateEstimator {
-    /// Creates a rate estimator.
-    ///
-    /// # Arguments
-    ///    * `rate` - The initial value to estimate rate from.
-    ///    * `window_size` - The window size of the rate estimator.
-    ///    * `smooth_factor` - The coefficient used to calculate moving average
-    ///                        from old estimated rate values. Must be between
-    ///                        0.0 and 1.0
-    ///
-    /// # Errors
-    ///    * If `smooth_factor` is not between 0.0 and 1.0
-    pub fn try_new(rate: u32, window_size: Duration, smooth_factor: f64) -> Result<Self> {
-        if smooth_factor < 0.0 || smooth_factor > 1.0 {
-            return Err(Error::InvalidSmoothFactor(smooth_factor));
-        }
-
-        Ok(RateEstimator {
-            last_level: 0,
-            level_diff: 0,
-            window_start: None,
-            window_size,
-            window_frames: 0,
-            lsq: LeastSquares::new(),
-            smooth_factor,
-            estimated_rate: rate as f64,
-        })
-    }
-
-    /// Resets the estimated rate
-    ///
-    /// Reset the estimated rate to `rate`, and erase all collected data.
-    pub fn reset_rate(&mut self, rate: u32) {
-        self.last_level = 0;
-        self.level_diff = 0;
-        self.window_start = None;
-        self.window_frames = 0;
-        self.lsq = LeastSquares::new();
-        self.estimated_rate = rate as f64;
-    }
-
-    /// Adds additional frames transmitted to/from audio device.
-    ///
-    /// # Arguments
-    ///    * `frames` - The number of frames written to the device.  For input,
-    ///                 this should be negative to indicate how many samples
-    ///                 were read.
-    pub fn add_frames(&mut self, frames: i32) {
-        self.level_diff += frames;
-    }
-
-    /// Gets the estimated rate.
-    pub fn get_estimated_rate(&self) -> f64 {
-        self.estimated_rate
-    }
-
-    /// Check the timestamp and buffer level difference since last check time,
-    /// and use them as a new sample to update the estimated rate.
-    ///
-    /// # Arguments
-    ///    * `level` - The current buffer level of audio device.
-    ///    * `now` - The time at which this function is called.
-    ///
-    /// # Returns
-    ///    True if the estimated rate is updated and window is reset,
-    ///    otherwise false.
-    pub fn update_estimated_rate(&mut self, level: i32, now: Duration) -> bool {
-        let start = match self.window_start {
-            None => {
-                self.window_start = Some(now);
-                return false;
-            }
-            Some(t) => t,
-        };
-
-        let delta = match now.checked_sub(start) {
-            Some(d) => d,
-            None => return false,
-        };
-        self.window_frames += (self.last_level - level + self.level_diff).abs() as u32;
-        self.level_diff = 0;
-        self.last_level = level;
-
-        let secs = (delta.as_secs() as f64) + delta.subsec_nanos() as f64 / 1_000_000_000.0;
-        self.lsq.add_sample(secs, self.window_frames as f64);
-        if delta > self.window_size && self.lsq.num_samples > 1 {
-            let rate = self.lsq.best_fit_slope();
-            if (self.estimated_rate - rate).abs() < MAX_RATE_SKEW {
-                self.estimated_rate =
-                    rate * (1.0 - self.smooth_factor) + self.estimated_rate * self.smooth_factor;
-            }
-            self.lsq = LeastSquares::new();
-            self.window_start = Some(now);
-            self.window_frames = 0;
-            return true;
-        }
-        false
-    }
-}
diff --git a/cras/src/server/rust/src/rate_estimator_bindings.rs b/cras/src/server/rust/src/rate_estimator_bindings.rs
deleted file mode 100644
index 3073ba7..0000000
--- a/cras/src/server/rust/src/rate_estimator_bindings.rs
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright 2019 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-use std::time::Duration;
-
-use libc;
-
-use crate::RateEstimator;
-
-/// # Safety
-///
-/// To use this function safely, `window_size` must be a valid pointer to a
-/// timespec.
-#[no_mangle]
-pub unsafe extern "C" fn rate_estimator_create(
-    rate: libc::c_uint,
-    window_size: *const libc::timespec,
-    smooth_factor: libc::c_double,
-) -> *mut RateEstimator {
-    if window_size.is_null() {
-        return std::ptr::null_mut::<RateEstimator>();
-    }
-
-    let ts = &*window_size;
-    let window = Duration::new(ts.tv_sec as u64, ts.tv_nsec as u32);
-
-    match RateEstimator::try_new(rate, window, smooth_factor) {
-        Ok(re) => Box::into_raw(Box::new(re)),
-        Err(_) => std::ptr::null_mut::<RateEstimator>(),
-    }
-}
-
-/// # Safety
-///
-/// To use this function safely, `re` must be a pointer returned from
-/// rate_estimator_create, or null.
-#[no_mangle]
-pub unsafe extern "C" fn rate_estimator_destroy(re: *mut RateEstimator) {
-    if re.is_null() {
-        return;
-    }
-
-    drop(Box::from_raw(re));
-}
-
-/// # Safety
-///
-/// To use this function safely, `re` must be a pointer returned from
-/// rate_estimator_create, or null.
-#[no_mangle]
-pub unsafe extern "C" fn rate_estimator_add_frames(re: *mut RateEstimator, frames: libc::c_int) {
-    if re.is_null() {
-        return;
-    }
-
-    (*re).add_frames(frames)
-}
-
-/// # Safety
-///
-/// To use this function safely, `re` must be a pointer returned from
-/// rate_estimator_create, or null, and `now` must be a valid pointer to a
-/// timespec.
-#[no_mangle]
-pub unsafe extern "C" fn rate_estimator_check(
-    re: *mut RateEstimator,
-    level: libc::c_int,
-    now: *const libc::timespec,
-) -> i32 {
-    if re.is_null() || now.is_null() {
-        return 0;
-    }
-
-    let ts = &*now;
-    if ts.tv_sec < 0 || ts.tv_nsec < 0 {
-        return 0;
-    }
-    let secs = ts.tv_sec as u64 + (ts.tv_nsec / 1_000_000_000) as u64;
-    let nsecs = (ts.tv_nsec % 1_000_000_000) as u32;
-    let now = Duration::new(secs, nsecs);
-
-    (*re).update_estimated_rate(level, now) as i32
-}
-
-/// # Safety
-///
-/// To use this function safely, `re` must be a pointer returned from
-/// rate_estimator_create, or null.
-#[no_mangle]
-pub unsafe extern "C" fn rate_estimator_get_rate(re: *const RateEstimator) -> libc::c_double {
-    if re.is_null() {
-        return 0.0;
-    }
-
-    (*re).get_estimated_rate()
-}
-
-/// # Safety
-///
-/// To use this function safely, `re` must be a pointer returned from
-/// rate_estimator_create, or null.
-#[no_mangle]
-pub unsafe extern "C" fn rate_estimator_reset_rate(re: *mut RateEstimator, rate: libc::c_uint) {
-    if re.is_null() {
-        return;
-    }
-
-    (*re).reset_rate(rate)
-}
diff --git a/cras/src/server/server_stream.c b/cras/src/server/server_stream.c
deleted file mode 100644
index 36d5496..0000000
--- a/cras/src/server/server_stream.c
+++ /dev/null
@@ -1,87 +0,0 @@
-/* Copyright 2018 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <syslog.h>
-
-#include "cras_rstream.h"
-#include "cras_server.h"
-#include "cras_system_state.h"
-#include "cras_types.h"
-#include "server_stream.h"
-#include "stream_list.h"
-
-/* Parameters used for server stream. */
-static unsigned int server_stream_block_size = 480;
-
-/*
- * Information of a stream created by server. Currently only
- * one server stream is allowed, for echo reference use.
- */
-static struct cras_rstream_config *stream_config;
-
-/* Actually create the server stream and add to stream list. */
-static void server_stream_add_cb(void *data)
-{
-	struct stream_list *stream_list = (struct stream_list *)data;
-	struct cras_rstream *stream;
-
-	if (!stream_config)
-		return;
-
-	stream_list_add(stream_list, stream_config, &stream);
-}
-
-void server_stream_create(struct stream_list *stream_list, unsigned int dev_idx,
-			  struct cras_audio_format *format)
-{
-	int audio_fd = -1;
-	int client_shm_fd = -1;
-	uint64_t buffer_offsets[2] = { 0, 0 };
-
-	if (stream_config) {
-		syslog(LOG_ERR, "server stream already exists, dev %u",
-		       stream_config->dev_idx);
-		return;
-	}
-
-	stream_config =
-		(struct cras_rstream_config *)calloc(1, sizeof(*stream_config));
-	cras_rstream_config_init(
-		/*client=*/NULL, cras_get_stream_id(SERVER_STREAM_CLIENT_ID, 0),
-		CRAS_STREAM_TYPE_DEFAULT, CRAS_CLIENT_TYPE_SERVER_STREAM,
-		CRAS_STREAM_INPUT, dev_idx,
-		/*flags=*/SERVER_ONLY,
-		/*effects=*/0, format, server_stream_block_size,
-		server_stream_block_size, &audio_fd, &client_shm_fd,
-		/*client_shm_size=*/0, buffer_offsets, stream_config);
-
-	/* Schedule add stream in next main thread loop. */
-	cras_system_add_task(server_stream_add_cb, stream_list);
-}
-
-static void server_stream_rm_cb(void *data)
-{
-	struct stream_list *stream_list = (struct stream_list *)data;
-
-	if (stream_config == NULL)
-		return;
-
-	if (stream_list_rm(stream_list, stream_config->stream_id))
-		syslog(LOG_ERR, "Server stream %x no longer exist",
-		       stream_config->stream_id);
-
-	free(stream_config);
-	stream_config = NULL;
-}
-
-void server_stream_destroy(struct stream_list *stream_list,
-			   unsigned int dev_idx)
-{
-	if (!stream_config || stream_config->dev_idx != dev_idx) {
-		syslog(LOG_ERR, "No server stream to destroy");
-		return;
-	}
-	server_stream_rm_cb(stream_list);
-}
diff --git a/cras/src/server/server_stream.h b/cras/src/server/server_stream.h
deleted file mode 100644
index e1eb8e1..0000000
--- a/cras/src/server/server_stream.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/* Copyright 2018 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef SERVER_STREAM_H_
-#define SERVER_STREAM_H_
-
-struct stream_list;
-
-/*
- * Asynchronously creates a server stream pinned to device of given idx.
- * Args:
- *    stream_list - List of stream to add new server stream to.
- *    dev_idx - The id of the device that new server stream will pin to.
- */
-void server_stream_create(struct stream_list *stream_list, unsigned int dev_idx,
-			  struct cras_audio_format *format);
-
-/*
- * Asynchronously destroys existing server stream pinned to device of given idx.
- * Args:
- *    stream_list - List of stream to look up server stream.
- *    dev_idx - The device id that target server stream is pinned to.
- **/
-void server_stream_destroy(struct stream_list *stream_list,
-			   unsigned int dev_idx);
-
-#endif /* SERVER_STREAM_H_ */
diff --git a/cras/src/server/softvol_curve.c b/cras/src/server/softvol_curve.c
deleted file mode 100644
index e4467ef..0000000
--- a/cras/src/server/softvol_curve.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <stddef.h>
-#include <stdlib.h>
-
-#include "cras_volume_curve.h"
-#include "softvol_curve.h"
-
-/* This is a ramp that increases 0.5dB per step, for a total range of 50dB. */
-const float softvol_scalers[101] = {
-	0.003162, /* volume 0 */
-	0.003350, 0.003548, 0.003758, 0.003981, 0.004217, 0.004467, 0.004732,
-	0.005012, 0.005309, 0.005623, 0.005957, 0.006310, 0.006683, 0.007079,
-	0.007499, 0.007943, 0.008414, 0.008913, 0.009441, 0.010000, 0.010593,
-	0.011220, 0.011885, 0.012589, 0.013335, 0.014125, 0.014962, 0.015849,
-	0.016788, 0.017783, 0.018836, 0.019953, 0.021135, 0.022387, 0.023714,
-	0.025119, 0.026607, 0.028184, 0.029854, 0.031623, 0.033497, 0.035481,
-	0.037584, 0.039811, 0.042170, 0.044668, 0.047315, 0.050119, 0.053088,
-	0.056234, 0.059566, 0.063096, 0.066834, 0.070795, 0.074989, 0.079433,
-	0.084140, 0.089125, 0.094406, 0.100000, 0.105925, 0.112202, 0.118850,
-	0.125893, 0.133352, 0.141254, 0.149624, 0.158489, 0.167880, 0.177828,
-	0.188365, 0.199526, 0.211349, 0.223872, 0.237137, 0.251189, 0.266073,
-	0.281838, 0.298538, 0.316228, 0.334965, 0.354813, 0.375837, 0.398107,
-	0.421697, 0.446684, 0.473151, 0.501187, 0.530884, 0.562341, 0.595662,
-	0.630957, 0.668344, 0.707946, 0.749894, 0.794328, 0.841395, 0.891251,
-	0.944061, 1.000000, /* volume 100 */
-};
-
-float *softvol_build_from_curve(const struct cras_volume_curve *curve)
-{
-	float *scalers;
-	unsigned int volume;
-
-	if (!curve)
-		return NULL;
-
-	scalers = (float *)malloc(NUM_VOLUME_STEPS * sizeof(float));
-	if (!scalers)
-		return NULL;
-
-	/* When software volume is used, it is assumed all volume curve values
-	 * are relative to 0 dBFS when converting to scale. If a positive dBFS
-	 * value is specified in curve config, it will be treated as invalid
-	 * and clip to 1.0 in scale.
-	 */
-	for (volume = 0; volume <= MAX_VOLUME; volume++) {
-		scalers[volume] = convert_softvol_scaler_from_dB(
-			curve->get_dBFS(curve, volume));
-		if (scalers[volume] > 1.0)
-			scalers[volume] = 1.0;
-		/* Clip scalers so that all values are non-zero to make volume
-		 * ramping simpler. Because of how mix_ops treats small values,
-		 * this should be effectively the same as a 0 value. */
-		else if (scalers[volume] < 1e-7)
-			scalers[volume] = 1e-7;
-	}
-
-	return scalers;
-}
diff --git a/cras/src/server/softvol_curve.h b/cras/src/server/softvol_curve.h
deleted file mode 100644
index 4fc2f40..0000000
--- a/cras/src/server/softvol_curve.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef SOFTVOL_CURVE_H_
-#define SOFTVOL_CURVE_H_
-
-#include <math.h>
-
-#define LOG_10 2.302585
-
-struct cras_volume_curve;
-
-extern const float softvol_scalers[101];
-
-/* Returns the volume scaler in the soft volume curve for the given index. */
-static inline float softvol_get_scaler(unsigned int volume_index)
-{
-	return softvol_scalers[volume_index];
-}
-
-/* convert dBFS to softvol scaler */
-static inline float convert_softvol_scaler_from_dB(long dBFS)
-{
-	return expf(LOG_10 * dBFS / 2000);
-}
-
-/* Builds software volume scalers from volume curve. */
-float *softvol_build_from_curve(const struct cras_volume_curve *curve);
-
-#endif /* SOFTVOL_CURVE_H_ */
diff --git a/cras/src/server/stream_list.c b/cras/src/server/stream_list.c
deleted file mode 100644
index 04ef9fe..0000000
--- a/cras/src/server/stream_list.c
+++ /dev/null
@@ -1,188 +0,0 @@
-/* Copyright 2015 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <syslog.h>
-#include "cras_rstream.h"
-#include "cras_tm.h"
-#include "cras_types.h"
-#include "stream_list.h"
-#include "utlist.h"
-
-/*
- * If the time difference of two streams is short than 10s, they may be the RTC
- * streams.
- */
-static const struct timespec RTC_STREAM_THRESHOLD = { 10, 0 };
-
-struct stream_list {
-	struct cras_rstream *streams;
-	struct cras_rstream *streams_to_delete;
-	stream_callback *stream_added_cb;
-	stream_callback *stream_removed_cb;
-	stream_create_func *stream_create_cb;
-	stream_destroy_func *stream_destroy_cb;
-	struct cras_tm *timer_manager;
-	struct cras_timer *drain_timer;
-};
-
-static void delete_streams(struct cras_timer *timer, void *data)
-{
-	struct cras_rstream *to_delete;
-	struct stream_list *list = (struct stream_list *)data;
-	int max_drain_delay = 0;
-
-	DL_FOREACH (list->streams_to_delete, to_delete) {
-		int drain_delay;
-
-		drain_delay = list->stream_removed_cb(to_delete);
-		if (drain_delay) {
-			max_drain_delay = MAX(max_drain_delay, drain_delay);
-			continue;
-		}
-		DL_DELETE(list->streams_to_delete, to_delete);
-		list->stream_destroy_cb(to_delete);
-	}
-
-	list->drain_timer = NULL;
-	if (max_drain_delay)
-		list->drain_timer =
-			cras_tm_create_timer(list->timer_manager,
-					     MAX(max_drain_delay, 10),
-					     delete_streams, list);
-}
-
-/*
- * Exported Interface
- */
-
-struct stream_list *stream_list_create(stream_callback *add_cb,
-				       stream_callback *rm_cb,
-				       stream_create_func *create_cb,
-				       stream_destroy_func *destroy_cb,
-				       struct cras_tm *timer_manager)
-{
-	struct stream_list *list = calloc(1, sizeof(struct stream_list));
-
-	list->stream_added_cb = add_cb;
-	list->stream_removed_cb = rm_cb;
-	list->stream_create_cb = create_cb;
-	list->stream_destroy_cb = destroy_cb;
-	list->timer_manager = timer_manager;
-	return list;
-}
-
-void stream_list_destroy(struct stream_list *list)
-{
-	free(list);
-}
-
-struct cras_rstream *stream_list_get(struct stream_list *list)
-{
-	return list->streams;
-}
-
-int stream_list_add(struct stream_list *list,
-		    struct cras_rstream_config *stream_config,
-		    struct cras_rstream **stream)
-{
-	int rc;
-	struct cras_rstream *next_stream;
-
-	rc = list->stream_create_cb(stream_config, stream);
-	if (rc)
-		return rc;
-
-	/* Keep stream list in descending order by channel count. */
-	DL_FOREACH (list->streams, next_stream) {
-		if ((*stream)->format.num_channels >=
-		    next_stream->format.num_channels)
-			break;
-	}
-	DL_INSERT(list->streams, next_stream, *stream);
-	rc = list->stream_added_cb(*stream);
-	if (rc) {
-		DL_DELETE(list->streams, *stream);
-		list->stream_destroy_cb(*stream);
-	}
-
-	return rc;
-}
-
-int stream_list_rm(struct stream_list *list, cras_stream_id_t id)
-{
-	struct cras_rstream *to_remove;
-
-	DL_SEARCH_SCALAR(list->streams, to_remove, stream_id, id);
-	if (!to_remove)
-		return -EINVAL;
-	DL_DELETE(list->streams, to_remove);
-	DL_APPEND(list->streams_to_delete, to_remove);
-	if (list->drain_timer) {
-		cras_tm_cancel_timer(list->timer_manager, list->drain_timer);
-		list->drain_timer = NULL;
-	}
-	delete_streams(NULL, list);
-
-	return 0;
-}
-
-int stream_list_rm_all_client_streams(struct stream_list *list,
-				      struct cras_rclient *rclient)
-{
-	struct cras_rstream *to_remove;
-	int rc = 0;
-
-	DL_FOREACH (list->streams, to_remove) {
-		if (to_remove->client == rclient) {
-			DL_DELETE(list->streams, to_remove);
-			DL_APPEND(list->streams_to_delete, to_remove);
-		}
-	}
-	if (list->drain_timer) {
-		cras_tm_cancel_timer(list->timer_manager, list->drain_timer);
-		list->drain_timer = NULL;
-	}
-	delete_streams(NULL, list);
-
-	return rc;
-}
-
-bool stream_list_has_pinned_stream(struct stream_list *list,
-				   unsigned int dev_idx)
-{
-	struct cras_rstream *rstream;
-	DL_FOREACH (list->streams, rstream) {
-		if (!rstream->is_pinned)
-			continue;
-		if (rstream->pinned_dev_idx == dev_idx)
-			return true;
-	}
-	return false;
-}
-
-void detect_rtc_stream_pair(struct stream_list *list,
-			    struct cras_rstream *stream)
-{
-	struct cras_rstream *next_stream;
-	if (stream->cb_threshold != 480)
-		return;
-	if (stream->client_type != CRAS_CLIENT_TYPE_CHROME &&
-	    stream->client_type != CRAS_CLIENT_TYPE_LACROS)
-		return;
-	DL_FOREACH (list->streams, next_stream) {
-		if (next_stream->cb_threshold == 480 &&
-		    next_stream->direction != stream->direction &&
-		    next_stream->client_type == stream->client_type &&
-		    timespec_diff_shorter_than(&stream->start_ts,
-					       &next_stream->start_ts,
-					       &RTC_STREAM_THRESHOLD)) {
-			stream->stream_type =
-				CRAS_STREAM_TYPE_VOICE_COMMUNICATION;
-			next_stream->stream_type =
-				CRAS_STREAM_TYPE_VOICE_COMMUNICATION;
-			return;
-		}
-	}
-}
diff --git a/cras/src/server/stream_list.h b/cras/src/server/stream_list.h
deleted file mode 100644
index a527bc9..0000000
--- a/cras/src/server/stream_list.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/* Copyright 2015 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <stdbool.h>
-
-#include "cras_types.h"
-#include "utlist.h"
-
-struct cras_rclient;
-struct cras_rstream;
-struct cras_rstream_config;
-struct cras_audio_format;
-struct stream_list;
-
-typedef int(stream_callback)(struct cras_rstream *rstream);
-/* This function will mutably borrow stream_config. */
-typedef int(stream_create_func)(struct cras_rstream_config *stream_config,
-				struct cras_rstream **rstream);
-typedef void(stream_destroy_func)(struct cras_rstream *rstream);
-
-struct stream_list *stream_list_create(stream_callback *add_cb,
-				       stream_callback *rm_cb,
-				       stream_create_func *create_cb,
-				       stream_destroy_func *destroy_cb,
-				       struct cras_tm *timer_manager);
-
-void stream_list_destroy(struct stream_list *list);
-
-struct cras_rstream *stream_list_get(struct stream_list *list);
-
-/* Creates a cras_rstream from cras_rstream_config and inserts the cras_rstream
- * to stream_list in descending order by channel count.
- *
- * Args:
- *   list - stream_list to add streams.
- *   stream_config - A mutable borrow of cras_rstream_config.
- *   stream - A pointer to place created cras_rstream.
- *
- * Returns:
- *   0 on success. Negative error code on failure.
- */
-int stream_list_add(struct stream_list *list,
-		    struct cras_rstream_config *stream_config,
-		    struct cras_rstream **stream);
-
-int stream_list_rm(struct stream_list *list, cras_stream_id_t id);
-
-int stream_list_rm_all_client_streams(struct stream_list *list,
-				      struct cras_rclient *rclient);
-
-/*
- * Checks if there is a stream pinned to the given device.
- */
-bool stream_list_has_pinned_stream(struct stream_list *list,
-				   unsigned int dev_idx);
-
-/*
- * Detects whether there is a RTC stream pair based on these rules:
- * 1. The cb_threshold is 480.
- * 2. The direction of two streams are opposite.
- * 3. Two streams are from the same client. (Chrome or LaCrOS)
- * 4. The start time of two streams are close enough. (shorter than 1s)
- * If all rules are passed, set the stream type to the voice communication.
- */
-void detect_rtc_stream_pair(struct stream_list *list,
-			    struct cras_rstream *stream);
diff --git a/cras/src/server/test_iodev.c b/cras/src/server/test_iodev.c
deleted file mode 100644
index cb7d5f3..0000000
--- a/cras/src/server/test_iodev.c
+++ /dev/null
@@ -1,267 +0,0 @@
-/* Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <sys/ioctl.h>
-#include <pthread.h>
-#include <sys/param.h>
-#include <syslog.h>
-
-#include "audio_thread.h"
-#include "byte_buffer.h"
-#include "cras_audio_area.h"
-#include "cras_config.h"
-#include "cras_iodev.h"
-#include "cras_iodev_list.h"
-#include "cras_types.h"
-#include "cras_util.h"
-#include "test_iodev.h"
-#include "utlist.h"
-
-#define TEST_BUFFER_SIZE (16 * 1024)
-
-static size_t test_supported_rates[] = { 16000, 0 };
-
-static size_t test_supported_channel_counts[] = { 1, 0 };
-
-static snd_pcm_format_t test_supported_formats[] = { SND_PCM_FORMAT_S16_LE, 0 };
-
-struct test_iodev {
-	struct cras_iodev base;
-	int fd;
-	struct byte_buffer *audbuff;
-	unsigned int fmt_bytes;
-};
-
-/*
- * iodev callbacks.
- */
-
-static int frames_queued(const struct cras_iodev *iodev,
-			 struct timespec *tstamp)
-{
-	struct test_iodev *testio = (struct test_iodev *)iodev;
-	int available;
-
-	if (testio->fd < 0)
-		return 0;
-	ioctl(testio->fd, FIONREAD, &available);
-	clock_gettime(CLOCK_MONOTONIC_RAW, tstamp);
-	return available / testio->fmt_bytes;
-}
-
-static int delay_frames(const struct cras_iodev *iodev)
-{
-	return 0;
-}
-
-static int close_dev(struct cras_iodev *iodev)
-{
-	struct test_iodev *testio = (struct test_iodev *)iodev;
-
-	byte_buffer_destroy(&testio->audbuff);
-	testio->audbuff = NULL;
-	cras_iodev_free_audio_area(iodev);
-	return 0;
-}
-
-static int configure_dev(struct cras_iodev *iodev)
-{
-	struct test_iodev *testio = (struct test_iodev *)iodev;
-
-	if (iodev->format == NULL)
-		return -EINVAL;
-
-	cras_iodev_init_audio_area(iodev, iodev->format->num_channels);
-	testio->fmt_bytes = cras_get_format_bytes(iodev->format);
-	testio->audbuff =
-		byte_buffer_create(TEST_BUFFER_SIZE * testio->fmt_bytes);
-
-	return 0;
-}
-
-static int get_buffer(struct cras_iodev *iodev, struct cras_audio_area **area,
-		      unsigned *frames)
-{
-	struct test_iodev *testio = (struct test_iodev *)iodev;
-	unsigned int readable;
-	uint8_t *buff;
-
-	buff = buf_read_pointer_size(testio->audbuff, &readable);
-	*frames = MIN(*frames, readable);
-
-	iodev->area->frames = *frames;
-	cras_audio_area_config_buf_pointers(iodev->area, iodev->format, buff);
-	*area = iodev->area;
-	return 0;
-}
-
-static int put_buffer(struct cras_iodev *iodev, unsigned frames)
-{
-	struct test_iodev *testio = (struct test_iodev *)iodev;
-
-	/* Input */
-	buf_increment_read(testio->audbuff,
-			   (size_t)frames * (size_t)testio->fmt_bytes);
-
-	return 0;
-}
-
-static int get_buffer_fd_read(struct cras_iodev *iodev,
-			      struct cras_audio_area **area, unsigned *frames)
-{
-	struct test_iodev *testio = (struct test_iodev *)iodev;
-	int nread;
-	uint8_t *write_ptr;
-	unsigned int avail;
-
-	if (testio->fd < 0) {
-		*frames = 0;
-		return 0;
-	}
-
-	write_ptr = buf_write_pointer_size(testio->audbuff, &avail);
-	avail = MIN(avail, *frames * testio->fmt_bytes);
-	nread = read(testio->fd, write_ptr, avail);
-	if (nread <= 0) {
-		*frames = 0;
-		audio_thread_rm_callback(testio->fd);
-		close(testio->fd);
-		testio->fd = -1;
-		return 0;
-	}
-	buf_increment_write(testio->audbuff, nread);
-	*frames = nread / testio->fmt_bytes;
-	iodev->area->frames = *frames;
-	cras_audio_area_config_buf_pointers(iodev->area, iodev->format,
-					    write_ptr);
-	*area = iodev->area;
-	return nread;
-}
-
-static void update_active_node(struct cras_iodev *iodev, unsigned node_idx,
-			       unsigned dev_enabled)
-{
-}
-
-static void play_file_as_hotword(struct test_iodev *testio, const char *path)
-{
-	if (testio->fd >= 0) {
-		/* Remove audio thread callback from main thread. */
-		audio_thread_rm_callback_sync(
-			cras_iodev_list_get_audio_thread(), testio->fd);
-		close(testio->fd);
-	}
-
-	testio->fd = open(path, O_RDONLY);
-	buf_reset(testio->audbuff);
-}
-
-/*
- * Exported Interface.
- */
-
-struct cras_iodev *test_iodev_create(enum CRAS_STREAM_DIRECTION direction,
-				     enum TEST_IODEV_TYPE type)
-{
-	struct test_iodev *testio;
-	struct cras_iodev *iodev;
-	struct cras_ionode *node;
-
-	if (direction != CRAS_STREAM_INPUT || type != TEST_IODEV_HOTWORD)
-		return NULL;
-
-	testio = calloc(1, sizeof(*testio));
-	if (testio == NULL)
-		return NULL;
-	iodev = &testio->base;
-	iodev->direction = direction;
-	testio->fd = -1;
-
-	iodev->supported_rates = test_supported_rates;
-	iodev->supported_channel_counts = test_supported_channel_counts;
-	iodev->supported_formats = test_supported_formats;
-	iodev->buffer_size = TEST_BUFFER_SIZE;
-
-	iodev->configure_dev = configure_dev;
-	iodev->close_dev = close_dev;
-	iodev->frames_queued = frames_queued;
-	iodev->delay_frames = delay_frames;
-	if (type == TEST_IODEV_HOTWORD)
-		iodev->get_buffer = get_buffer_fd_read;
-	else
-		iodev->get_buffer = get_buffer;
-	iodev->put_buffer = put_buffer;
-	iodev->update_active_node = update_active_node;
-
-	/*
-	 * Record max supported channels into cras_iodev_info.
-	 * The value is the max of test_supported_channel_counts.
-	 */
-	iodev->info.max_supported_channels = 1;
-
-	/* Create an empty ionode */
-	node = (struct cras_ionode *)calloc(1, sizeof(*node));
-	node->dev = iodev;
-	node->plugged = 1;
-	if (type == TEST_IODEV_HOTWORD)
-		node->type = CRAS_NODE_TYPE_HOTWORD;
-	else
-		node->type = CRAS_NODE_TYPE_UNKNOWN;
-	node->volume = 100;
-	node->software_volume_needed = 0;
-	node->ui_gain_scaler = 1.0f;
-	strcpy(node->name, "(default)");
-	cras_iodev_add_node(iodev, node);
-	cras_iodev_set_active_node(iodev, node);
-
-	/* Finally add it to the appropriate iodev list. */
-	snprintf(iodev->info.name, ARRAY_SIZE(iodev->info.name), "Tester");
-	iodev->info.name[ARRAY_SIZE(iodev->info.name) - 1] = '\0';
-	cras_iodev_list_add_input(iodev);
-
-	return iodev;
-}
-
-void test_iodev_destroy(struct cras_iodev *iodev)
-{
-	struct test_iodev *testio = (struct test_iodev *)iodev;
-
-	cras_iodev_list_rm_input(iodev);
-	free(iodev->active_node);
-	cras_iodev_free_resources(iodev);
-	free(testio);
-}
-
-unsigned int test_iodev_add_samples(struct test_iodev *testio, uint8_t *samples,
-				    unsigned int count)
-{
-	unsigned int avail;
-	uint8_t *write_ptr;
-
-	write_ptr = buf_write_pointer_size(testio->audbuff, &avail);
-	count = MIN(count, avail);
-	memcpy(write_ptr, samples, (size_t)count * (size_t)testio->fmt_bytes);
-	buf_increment_write(testio->audbuff,
-			    (size_t)count * (size_t)testio->fmt_bytes);
-	return count;
-}
-
-void test_iodev_command(struct cras_iodev *iodev,
-			enum CRAS_TEST_IODEV_CMD command, unsigned int data_len,
-			const uint8_t *data)
-{
-	struct test_iodev *testio = (struct test_iodev *)iodev;
-
-	if (!cras_iodev_is_open(iodev))
-		return;
-
-	switch (command) {
-	case TEST_IODEV_CMD_HOTWORD_TRIGGER:
-		play_file_as_hotword(testio, (char *)data);
-		break;
-	default:
-		break;
-	}
-}
diff --git a/cras/src/server/test_iodev.h b/cras/src/server/test_iodev.h
deleted file mode 100644
index 782bf5c..0000000
--- a/cras/src/server/test_iodev.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/* Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef TEST_IODEV_H_
-#define TEST_IODEV_H_
-
-#include "cras_types.h"
-
-struct cras_iodev;
-
-/* Initializes an test iodev.  The Test iodev is used to simulate hardware
- * iodevs when they aren't available.
- * Args:
- *    direciton - input or output.
- *    type - The test type.
- * Returns:
- *    A pointer to the newly created iodev if successful, NULL otherwise.
- */
-struct cras_iodev *test_iodev_create(enum CRAS_STREAM_DIRECTION direction,
-				     enum TEST_IODEV_TYPE type);
-
-/* Destroys an test_iodev created with test_iodev_create. */
-void test_iodev_destroy(struct cras_iodev *iodev);
-
-/* Handle a test commdn to the given iodev. */
-void test_iodev_command(struct cras_iodev *iodev,
-			enum CRAS_TEST_IODEV_CMD command, unsigned int data_len,
-			const uint8_t *data);
-
-#endif /* TEST_IODEV_H_ */
diff --git a/cras/src/tests/.clang-format b/cras/src/tests/.clang-format
deleted file mode 100644
index a675ede..0000000
--- a/cras/src/tests/.clang-format
+++ /dev/null
@@ -1,14 +0,0 @@
-BasedOnStyle: Chromium
-
-# Taken from:
-#   git grep -h '^#define [^[:space:]]*FOREACH[^[:space:]]*(' cras/ \
-#   | sed "s,^#define \([^[:space:]]*FOREACH[^[:space:]]*\)(.*$,  - '\1'," \
-#   | sort | uniq
-
-ForEachMacros:
-  - 'ARRAY_ELEMENT_FOREACH'
-  - 'DL_FOREACH'
-  - 'DL_FOREACH_INTERNAL'
-  - 'LL_FOREACH'
-  - 'LL_FOREACH_SAFE'
-
diff --git a/cras/src/tests/a2dp_info_unittest.cc b/cras/src/tests/a2dp_info_unittest.cc
deleted file mode 100644
index eb082b0..0000000
--- a/cras/src/tests/a2dp_info_unittest.cc
+++ /dev/null
@@ -1,133 +0,0 @@
-// Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <gtest/gtest.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <sys/socket.h>
-#include <unistd.h>
-
-extern "C" {
-#include <sbc/sbc.h>
-
-#include "cras_a2dp_info.h"
-#include "cras_sbc_codec.h"
-#include "sbc_codec_stub.h"
-}
-
-static size_t a2dp_write_link_mtu_val;
-static struct a2dp_info a2dp;
-static a2dp_sbc_t sbc;
-
-void ResetStubData() {
-  sbc_codec_stub_reset();
-
-  a2dp_write_link_mtu_val = 40;
-
-  sbc.frequency = SBC_SAMPLING_FREQ_48000;
-  sbc.channel_mode = SBC_CHANNEL_MODE_JOINT_STEREO;
-  sbc.allocation_method = SBC_ALLOCATION_LOUDNESS;
-  sbc.subbands = SBC_SUBBANDS_8;
-  sbc.block_length = SBC_BLOCK_LENGTH_16;
-  sbc.max_bitpool = 50;
-
-  a2dp.a2dp_buf_used = 0;
-  a2dp.frame_count = 0;
-  a2dp.samples = 0;
-  a2dp.nsamples = 0;
-}
-
-namespace {
-
-TEST(A2dpInfoInit, InitA2dp) {
-  ResetStubData();
-  init_a2dp(&a2dp, &sbc);
-
-  ASSERT_EQ(1, get_sbc_codec_create_called());
-  ASSERT_EQ(SBC_FREQ_48000, get_sbc_codec_create_freq_val());
-  ASSERT_EQ(SBC_MODE_JOINT_STEREO, get_sbc_codec_create_mode_val());
-  ASSERT_EQ(SBC_AM_LOUDNESS, get_sbc_codec_create_alloc_val());
-  ASSERT_EQ(SBC_SB_8, get_sbc_codec_create_subbands_val());
-  ASSERT_EQ(SBC_BLK_16, get_sbc_codec_create_blocks_val());
-  ASSERT_EQ(50, get_sbc_codec_create_bitpool_val());
-
-  ASSERT_NE(a2dp.codec, (void*)NULL);
-  ASSERT_EQ(a2dp.a2dp_buf_used, 13);
-  ASSERT_EQ(a2dp.frame_count, 0);
-  ASSERT_EQ(a2dp.seq_num, 0);
-  ASSERT_EQ(a2dp.samples, 0);
-
-  destroy_a2dp(&a2dp);
-}
-
-TEST(A2dpInfoInit, InitA2dpFail) {
-  ResetStubData();
-  int err;
-  set_sbc_codec_create_fail(1);
-  err = init_a2dp(&a2dp, &sbc);
-
-  ASSERT_EQ(1, get_sbc_codec_create_called());
-  ASSERT_NE(0, err);
-  ASSERT_EQ(a2dp.codec, (void*)NULL);
-}
-
-TEST(A2dpInfoInit, DestroyA2dp) {
-  ResetStubData();
-  init_a2dp(&a2dp, &sbc);
-  destroy_a2dp(&a2dp);
-
-  ASSERT_EQ(1, get_sbc_codec_destroy_called());
-}
-
-TEST(A2dpInfoInit, ResetA2dp) {
-  ResetStubData();
-  init_a2dp(&a2dp, &sbc);
-  a2dp.a2dp_buf_used = 99;
-  a2dp.samples = 10;
-  a2dp.seq_num = 11;
-  a2dp.frame_count = 12;
-
-  a2dp_reset(&a2dp);
-
-  ASSERT_EQ(a2dp.a2dp_buf_used, 13);
-  ASSERT_EQ(a2dp.frame_count, 0);
-  ASSERT_EQ(a2dp.seq_num, 0);
-  ASSERT_EQ(a2dp.samples, 0);
-
-  destroy_a2dp(&a2dp);
-}
-
-TEST(A2dpEncode, WriteA2dp) {
-  unsigned int processed;
-
-  ResetStubData();
-  init_a2dp(&a2dp, &sbc);
-
-  set_sbc_codec_encoded_out(4);
-  processed = a2dp_encode(&a2dp, NULL, 20, 4, (size_t)40);
-
-  ASSERT_EQ(20, processed);
-  ASSERT_EQ(4, a2dp.frame_count);
-
-  // 13 + 4 used a2dp buffer still below half mtu unwritten
-  ASSERT_EQ(17, a2dp.a2dp_buf_used);
-  ASSERT_EQ(5, a2dp.samples);
-  ASSERT_EQ(5, a2dp.nsamples);
-  ASSERT_EQ(0, a2dp.seq_num);
-
-  set_sbc_codec_encoded_out(15);
-  processed = a2dp_encode(&a2dp, NULL, 20, 4, (size_t)40);
-
-  ASSERT_EQ(32, a2dp.a2dp_buf_used);
-  ASSERT_EQ(10, a2dp.samples);
-  ASSERT_EQ(10, a2dp.nsamples);
-  ASSERT_EQ(0, a2dp.seq_num);
-}
-
-}  // namespace
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tests/a2dp_iodev_unittest.cc b/cras/src/tests/a2dp_iodev_unittest.cc
deleted file mode 100644
index 06c1cd3..0000000
--- a/cras/src/tests/a2dp_iodev_unittest.cc
+++ /dev/null
@@ -1,962 +0,0 @@
-// Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <gtest/gtest.h>
-#include <stdint.h>
-#include <stdio.h>
-
-extern "C" {
-#include "cras_a2dp_iodev.c"
-
-#include "audio_thread.h"
-#include "audio_thread_log.h"
-#include "cras_audio_area.h"
-#include "cras_bt_transport.h"
-#include "cras_iodev.h"
-}
-
-#define FAKE_OBJECT_PATH "/fake/obj/path"
-
-#define MAX_A2DP_ENCODE_CALLS 8
-#define MAX_A2DP_WRITE_CALLS 4
-
-/* Fake the codec to encode (512/4) frames into 128 bytes. */
-#define FAKE_A2DP_CODE_SIZE 512
-#define FAKE_A2DP_FRAME_LENGTH 128
-
-static struct cras_bt_transport* fake_transport;
-static cras_audio_format format;
-static size_t cras_bt_device_append_iodev_called;
-static size_t cras_bt_device_rm_iodev_called;
-static size_t cras_iodev_add_node_called;
-static size_t cras_iodev_rm_node_called;
-static size_t cras_iodev_set_active_node_called;
-static size_t cras_bt_transport_acquire_called;
-static size_t cras_bt_transport_configuration_called;
-static size_t cras_bt_transport_release_called;
-static size_t init_a2dp_called;
-static int init_a2dp_return_val;
-static size_t destroy_a2dp_called;
-static size_t a2dp_reset_called;
-static size_t cras_iodev_free_format_called;
-static size_t cras_iodev_free_resources_called;
-static int a2dp_write_return_val[MAX_A2DP_WRITE_CALLS];
-static unsigned int a2dp_write_index;
-static int a2dp_encode_called;
-static cras_audio_area* mock_audio_area;
-static thread_callback write_callback;
-static void* write_callback_data;
-static const char* fake_device_name = "fake device name";
-static const char* cras_bt_device_name_ret;
-static unsigned int cras_bt_transport_write_mtu_ret;
-static int cras_iodev_fill_odev_zeros_called;
-static unsigned int cras_iodev_fill_odev_zeros_frames;
-static int audio_thread_config_events_callback_called;
-static enum AUDIO_THREAD_EVENTS_CB_TRIGGER
-    audio_thread_config_events_callback_trigger;
-
-void ResetStubData() {
-  cras_bt_device_append_iodev_called = 0;
-  cras_bt_device_rm_iodev_called = 0;
-  cras_iodev_add_node_called = 0;
-  cras_iodev_rm_node_called = 0;
-  cras_iodev_set_active_node_called = 0;
-  cras_bt_transport_acquire_called = 0;
-  cras_bt_transport_configuration_called = 0;
-  cras_bt_transport_release_called = 0;
-  init_a2dp_called = 0;
-  init_a2dp_return_val = 0;
-  destroy_a2dp_called = 0;
-  a2dp_reset_called = 0;
-  cras_iodev_free_format_called = 0;
-  cras_iodev_free_resources_called = 0;
-  a2dp_write_index = 0;
-  a2dp_encode_called = 0;
-  /* Fake the MTU value. min_buffer_level will be derived from this value. */
-  cras_bt_transport_write_mtu_ret = 950;
-  cras_iodev_fill_odev_zeros_called = 0;
-
-  fake_transport = reinterpret_cast<struct cras_bt_transport*>(0x123);
-
-  if (!mock_audio_area) {
-    mock_audio_area = (cras_audio_area*)calloc(
-        1, sizeof(*mock_audio_area) + sizeof(cras_channel_area) * 2);
-  }
-
-  write_callback = NULL;
-}
-
-int iodev_set_format(struct cras_iodev* iodev, struct cras_audio_format* fmt) {
-  fmt->format = SND_PCM_FORMAT_S16_LE;
-  fmt->num_channels = 2;
-  fmt->frame_rate = 44100;
-  iodev->format = fmt;
-  return 0;
-}
-
-namespace {
-
-static struct timespec time_now;
-class A2dpIodev : public testing::Test {
- protected:
-  virtual void SetUp() {
-    ResetStubData();
-    time_now.tv_sec = 0;
-    time_now.tv_nsec = 0;
-    atlog = (audio_thread_event_log*)calloc(1, sizeof(audio_thread_event_log));
-  }
-
-  virtual void TearDown() {
-    free(mock_audio_area);
-    mock_audio_area = NULL;
-    free(atlog);
-  }
-};
-
-TEST_F(A2dpIodev, InitializeA2dpIodev) {
-  struct cras_iodev* iodev;
-
-  cras_bt_device_name_ret = NULL;
-  iodev = a2dp_iodev_create(fake_transport);
-
-  ASSERT_NE(iodev, (void*)NULL);
-  ASSERT_EQ(iodev->direction, CRAS_STREAM_OUTPUT);
-  ASSERT_EQ(1, cras_bt_transport_configuration_called);
-  ASSERT_EQ(1, init_a2dp_called);
-  ASSERT_EQ(1, cras_bt_device_append_iodev_called);
-  ASSERT_EQ(1, cras_iodev_add_node_called);
-  ASSERT_EQ(1, cras_iodev_set_active_node_called);
-
-  /* Assert iodev name matches the object path when bt device doesn't
-   * have its readable name populated. */
-  ASSERT_STREQ(FAKE_OBJECT_PATH, iodev->info.name);
-
-  a2dp_iodev_destroy(iodev);
-
-  ASSERT_EQ(1, cras_bt_device_rm_iodev_called);
-  ASSERT_EQ(1, cras_iodev_rm_node_called);
-  ASSERT_EQ(1, destroy_a2dp_called);
-  ASSERT_EQ(1, cras_iodev_free_resources_called);
-
-  cras_bt_device_name_ret = fake_device_name;
-  /* Assert iodev name matches the bt device's name */
-  iodev = a2dp_iodev_create(fake_transport);
-  ASSERT_STREQ(fake_device_name, iodev->info.name);
-
-  a2dp_iodev_destroy(iodev);
-}
-
-TEST_F(A2dpIodev, InitializeFail) {
-  struct cras_iodev* iodev;
-
-  init_a2dp_return_val = -1;
-  iodev = a2dp_iodev_create(fake_transport);
-
-  ASSERT_EQ(iodev, (void*)NULL);
-  ASSERT_EQ(1, cras_bt_transport_configuration_called);
-  ASSERT_EQ(1, init_a2dp_called);
-  ASSERT_EQ(0, cras_bt_device_append_iodev_called);
-  ASSERT_EQ(0, cras_iodev_add_node_called);
-  ASSERT_EQ(0, cras_iodev_set_active_node_called);
-  ASSERT_EQ(0, cras_iodev_rm_node_called);
-}
-
-TEST_F(A2dpIodev, OpenIodev) {
-  struct cras_iodev* iodev;
-
-  iodev = a2dp_iodev_create(fake_transport);
-
-  iodev_set_format(iodev, &format);
-  iodev->configure_dev(iodev);
-  iodev->start(iodev);
-  iodev->state = CRAS_IODEV_STATE_NORMAL_RUN;
-
-  ASSERT_EQ(1, cras_bt_transport_acquire_called);
-
-  iodev->close_dev(iodev);
-  ASSERT_EQ(1, cras_bt_transport_release_called);
-  ASSERT_EQ(1, a2dp_reset_called);
-  ASSERT_EQ(1, cras_iodev_free_format_called);
-
-  a2dp_iodev_destroy(iodev);
-}
-
-TEST_F(A2dpIodev, GetPutBuffer) {
-  struct cras_iodev* iodev;
-  struct cras_audio_area *area1, *area2, *area3;
-  uint8_t* last_buf_head;
-  unsigned frames;
-  struct timespec tstamp;
-  struct a2dp_io* a2dpio;
-
-  iodev = a2dp_iodev_create(fake_transport);
-  a2dpio = (struct a2dp_io*)iodev;
-
-  iodev_set_format(iodev, &format);
-  iodev->configure_dev(iodev);
-  ASSERT_NE(write_callback, (void*)NULL);
-
-  iodev->start(iodev);
-  iodev->state = CRAS_IODEV_STATE_NORMAL_RUN;
-
-  /* (950 - 13) / 128 * 512 / 4 */
-  ASSERT_EQ(iodev->min_buffer_level, 896);
-
-  frames = 1500;
-  iodev->get_buffer(iodev, &area1, &frames);
-  ASSERT_EQ(1500, frames);
-  ASSERT_EQ(1500, area1->frames);
-  last_buf_head = area1->channels[0].buf;
-  iodev->put_buffer(iodev, 1000);
-  /* 1000 frames takes 8 encode call, FAKE_A2DP_CODE_SIZE / 4 = 128
-   * and 7 * 128 < 1000 < 8 * 128
-   */
-  EXPECT_EQ(8, a2dp_encode_called);
-  /* Expect flushed one block, leaving 1000 - 896 = 104 queued and
-   * next_flush_time has shifted. */
-  EXPECT_EQ(1, a2dp_write_index);
-  EXPECT_EQ(104, iodev->frames_queued(iodev, &tstamp));
-  EXPECT_GT(a2dpio->next_flush_time.tv_nsec, 0);
-
-  /* Assert buffer possition shifted 1000 * 4 bytes */
-  frames = 1000;
-  iodev->get_buffer(iodev, &area2, &frames);
-  ASSERT_EQ(1000, frames);
-  ASSERT_EQ(1000, area2->frames);
-  ASSERT_EQ(4000, area2->channels[0].buf - last_buf_head);
-  last_buf_head = area2->channels[0].buf;
-
-  iodev->put_buffer(iodev, 700);
-  EXPECT_EQ(804, iodev->frames_queued(iodev, &tstamp));
-  /* Assert that even next_flush_time is not met, pcm data still processed.
-   * Expect to takes 7 more encode calls to process the 804 frames of data.
-   * and 6 * 128 < 804 < 7 * 128
-   */
-  EXPECT_EQ(15, a2dp_encode_called);
-  EXPECT_EQ(768, a2dpio->a2dp.samples);
-
-  time_now.tv_nsec = 25000000;
-  frames = 50;
-  iodev->get_buffer(iodev, &area3, &frames);
-  ASSERT_EQ(50, frames);
-  /* Assert buffer possition shifted 700 * 4 bytes */
-  EXPECT_EQ(2800, area3->channels[0].buf - last_buf_head);
-
-  iodev->put_buffer(iodev, 50);
-  /* 804 + 50 = 854 queued, 768 of them are encoded. */
-  EXPECT_EQ(854, iodev->frames_queued(iodev, &tstamp));
-  EXPECT_EQ(768, a2dpio->a2dp.samples);
-  /* Expect one a2dp encode call was executed for the left un-encoded frames.
-   * 854 - 768 = 86 < 128 */
-  EXPECT_EQ(16, a2dp_encode_called);
-  /* Even time now has passed next_flush_time, no a2dp write gets called
-   * because the number of encoded samples is not sufficient for a flush. */
-  EXPECT_EQ(1, a2dp_write_index);
-
-  iodev->close_dev(iodev);
-  a2dp_iodev_destroy(iodev);
-}
-
-TEST_F(A2dpIodev, FramesQueued) {
-  struct cras_iodev* iodev;
-  struct cras_audio_area* area;
-  struct timespec tstamp;
-  unsigned frames;
-  struct a2dp_io* a2dpio;
-
-  iodev = a2dp_iodev_create(fake_transport);
-  a2dpio = (struct a2dp_io*)iodev;
-
-  iodev_set_format(iodev, &format);
-  time_now.tv_sec = 0;
-  time_now.tv_nsec = 0;
-  iodev->configure_dev(iodev);
-  ASSERT_NE(write_callback, (void*)NULL);
-  /* a2dp_block_size(mtu) / format_bytes
-   * (950 - 13) / 128 * 512 / 4 = 896 */
-  EXPECT_EQ(896, a2dpio->write_block);
-
-  iodev->start(iodev);
-  iodev->state = CRAS_IODEV_STATE_NORMAL_RUN;
-
-  frames = 256;
-  iodev->get_buffer(iodev, &area, &frames);
-  ASSERT_EQ(256, frames);
-  ASSERT_EQ(256, area->frames);
-
-  /* Data less than write_block hence not written. */
-  iodev->put_buffer(iodev, 200);
-  EXPECT_EQ(200, iodev->frames_queued(iodev, &tstamp));
-  EXPECT_EQ(tstamp.tv_sec, time_now.tv_sec);
-  EXPECT_EQ(tstamp.tv_nsec, time_now.tv_nsec);
-
-  /* 200 + 800 - 896 = 104 */
-  a2dp_write_return_val[0] = 0;
-  frames = 800;
-  iodev->get_buffer(iodev, &area, &frames);
-  iodev->put_buffer(iodev, 800);
-  EXPECT_EQ(104, iodev->frames_queued(iodev, &tstamp));
-
-  /* Some time has passed, same amount of frames are queued. */
-  time_now.tv_nsec = 15000000;
-  write_callback(write_callback_data, POLLOUT);
-  EXPECT_EQ(104, iodev->frames_queued(iodev, &tstamp));
-
-  /* Put 900 more frames. next_flush_time not yet passed so expect
-   * total 900 + 104 = 1004 are queued. */
-  frames = 900;
-  iodev->get_buffer(iodev, &area, &frames);
-  iodev->put_buffer(iodev, 900);
-  EXPECT_EQ(1004, iodev->frames_queued(iodev, &tstamp));
-
-  /* Time passes next_flush_time, 1004 + 300 - 896 = 408 */
-  time_now.tv_nsec = 25000000;
-  frames = 300;
-  iodev->get_buffer(iodev, &area, &frames);
-  iodev->put_buffer(iodev, 300);
-  EXPECT_EQ(408, iodev->frames_queued(iodev, &tstamp));
-
-  iodev->close_dev(iodev);
-  a2dp_iodev_destroy(iodev);
-}
-
-TEST_F(A2dpIodev, SleepTimeWithWriteThrottle) {
-  struct cras_iodev* iodev;
-  struct cras_audio_area* area;
-  unsigned frames;
-  unsigned int level;
-  unsigned long target;
-  struct timespec tstamp;
-  struct a2dp_io* a2dpio;
-
-  iodev = a2dp_iodev_create(fake_transport);
-  a2dpio = (struct a2dp_io*)iodev;
-
-  iodev_set_format(iodev, &format);
-  iodev->configure_dev(iodev);
-  ASSERT_NE(write_callback, (void*)NULL);
-  /* a2dp_block_size(mtu) / format_bytes
-   * 900 / 128 * 512 / 4 = 896 */
-  EXPECT_EQ(896, a2dpio->write_block);
-
-  iodev->start(iodev);
-  iodev->state = CRAS_IODEV_STATE_NORMAL_RUN;
-
-  /* Both time now and next_flush_time are at 0. Expect write_block of
-   * time to sleep */
-  EXPECT_EQ(a2dpio->write_block,
-            iodev->frames_to_play_in_sleep(iodev, &level, &tstamp));
-
-  /* Fake that 1000 frames are put and one block got flushed.
-   * Expect next_wake_time be fast forward by one flush_period. */
-  frames = 1000;
-  iodev->get_buffer(iodev, &area, &frames);
-  ASSERT_EQ(1000, frames);
-  ASSERT_EQ(1000, area->frames);
-
-  /* Expect the first block be flushed at time 0. */
-  time_now.tv_nsec = 0;
-  a2dp_write_return_val[0] = 0;
-  EXPECT_EQ(0, iodev->put_buffer(iodev, 1000));
-  EXPECT_EQ(104, iodev->frames_queued(iodev, &tstamp)); /* 1000 - 896 */
-
-  /* Same amount of frames are queued after some time has passed. */
-  time_now.tv_nsec = 10000000;
-  EXPECT_EQ(104, iodev->frames_queued(iodev, &tstamp));
-
-  /* Expect to sleep the time between now(10ms) and next_flush_time(~20.3ms). */
-  frames = iodev->frames_to_play_in_sleep(iodev, &level, &tstamp);
-  target =
-      a2dpio->write_block - time_now.tv_nsec * format.frame_rate / 1000000000;
-  EXPECT_GE(frames + 1, target);
-  EXPECT_GE(target + 1, frames);
-
-  /* Time now has passed the next flush time(~20.3ms), expect to return
-   * write_block of time to sleep. */
-  time_now.tv_nsec = 25000000;
-  EXPECT_EQ(a2dpio->write_block,
-            iodev->frames_to_play_in_sleep(iodev, &level, &tstamp));
-
-  a2dp_write_return_val[1] = 0;
-  frames = 1000;
-  iodev->get_buffer(iodev, &area, &frames);
-  EXPECT_EQ(0, iodev->put_buffer(iodev, 1000));
-  EXPECT_EQ(208, iodev->frames_queued(iodev, &tstamp)); /* 104 + 1000 - 896 */
-
-  /* Flush another write_block of data, next_wake_time fast forward by
-   * another flush_period. Expect to sleep the time between now(25ms)
-   * and next_flush_time(~40.6ms). */
-  frames = iodev->frames_to_play_in_sleep(iodev, &level, &tstamp);
-  target = a2dpio->write_block * 2 -
-           time_now.tv_nsec * format.frame_rate / 1000000000;
-  EXPECT_GE(frames + 1, target);
-  EXPECT_GE(target + 1, frames);
-
-  /* Put 1000 more frames, and make a fake failure to this flush. */
-  time_now.tv_nsec = 45000000;
-  a2dp_write_return_val[2] = -EAGAIN;
-  frames = 1000;
-  iodev->get_buffer(iodev, &area, &frames);
-  EXPECT_EQ(0, iodev->put_buffer(iodev, 1000));
-
-  /* Last a2dp write call failed with -EAGAIN, time now(45ms) is after
-   * next_flush_time. Expect to return exact |write_block| equivalant
-   * of time to sleep. */
-  EXPECT_EQ(1208, iodev->frames_queued(iodev, &tstamp)); /* 208 + 1000 */
-  EXPECT_EQ(a2dpio->write_block,
-            iodev->frames_to_play_in_sleep(iodev, &level, &tstamp));
-
-  /* Fake the event that socket becomes writable so data continues to flush.
-   * next_flush_time fast forwards by another flush_period. */
-  a2dp_write_return_val[3] = 0;
-  write_callback(write_callback_data, POLLOUT);
-  EXPECT_EQ(312, iodev->frames_queued(iodev, &tstamp)); /* 1208 - 896 */
-
-  /* Expect to sleep the time between now and next_flush_time(~60.9ms). */
-  frames = iodev->frames_to_play_in_sleep(iodev, &level, &tstamp);
-  target = a2dpio->write_block * 3 -
-           time_now.tv_nsec * format.frame_rate / 1000000000;
-  EXPECT_GE(frames + 1, target);
-  EXPECT_GE(target + 1, frames);
-
-  iodev->close_dev(iodev);
-  a2dp_iodev_destroy(iodev);
-}
-
-TEST_F(A2dpIodev, EnableThreadCallbackAtBufferFull) {
-  struct cras_iodev* iodev;
-  struct cras_audio_area* area;
-  struct timespec tstamp;
-  unsigned frames;
-  struct a2dp_io* a2dpio;
-
-  iodev = a2dp_iodev_create(fake_transport);
-  a2dpio = (struct a2dp_io*)iodev;
-
-  iodev_set_format(iodev, &format);
-  time_now.tv_sec = 0;
-  time_now.tv_nsec = 0;
-  iodev->configure_dev(iodev);
-  ASSERT_NE(write_callback, (void*)NULL);
-
-  iodev->start(iodev);
-  iodev->state = CRAS_IODEV_STATE_NORMAL_RUN;
-
-  audio_thread_config_events_callback_called = 0;
-  a2dp_write_return_val[0] = 0;
-  frames = iodev->buffer_size;
-  iodev->get_buffer(iodev, &area, &frames);
-  EXPECT_LE(frames, iodev->buffer_size);
-  EXPECT_EQ(0, iodev->put_buffer(iodev, frames));
-  EXPECT_EQ(1, a2dp_write_index);
-  EXPECT_EQ(a2dpio->flush_period.tv_nsec, a2dpio->next_flush_time.tv_nsec);
-  EXPECT_EQ(1, audio_thread_config_events_callback_called);
-  EXPECT_EQ(TRIGGER_NONE, audio_thread_config_events_callback_trigger);
-
-  /* Fastfoward time 1ms, not yet reaches the next flush time. */
-  time_now.tv_nsec = 1000000;
-
-  /* Cram into iodev as much data as possible. Expect its buffer to
-   * be full because flush time does not yet met. */
-  frames = iodev->buffer_size;
-  iodev->get_buffer(iodev, &area, &frames);
-  EXPECT_LE(frames, iodev->buffer_size);
-  EXPECT_EQ(0, iodev->put_buffer(iodev, frames));
-  frames = iodev->frames_queued(iodev, &tstamp);
-  EXPECT_EQ(frames, iodev->buffer_size);
-
-  /* Expect a2dp_write didn't get called in last get/put buffer. And
-   * audio thread callback has been enabled. */
-  EXPECT_EQ(1, a2dp_write_index);
-  EXPECT_EQ(2, audio_thread_config_events_callback_called);
-  EXPECT_EQ(TRIGGER_WAKEUP, audio_thread_config_events_callback_trigger);
-
-  iodev->close_dev(iodev);
-  a2dp_iodev_destroy(iodev);
-}
-
-TEST_F(A2dpIodev, FlushAtLowBufferLevel) {
-  struct cras_iodev* iodev;
-  struct cras_audio_area* area;
-  struct timespec tstamp;
-  unsigned frames;
-
-  iodev = a2dp_iodev_create(fake_transport);
-
-  iodev_set_format(iodev, &format);
-  iodev->configure_dev(iodev);
-  ASSERT_NE(write_callback, (void*)NULL);
-
-  /* (950 - 13)/ 128 * 512 / 4 */
-  ASSERT_EQ(iodev->min_buffer_level, 896);
-
-  iodev->start(iodev);
-  iodev->state = CRAS_IODEV_STATE_NORMAL_RUN;
-
-  frames = 1500;
-  iodev->get_buffer(iodev, &area, &frames);
-  ASSERT_EQ(1500, frames);
-  ASSERT_EQ(1500, area->frames);
-
-  /*
-   * Assert put_buffer shouldn't trigger the 2nd call to a2dp_encode()
-   * because buffer is low: 896 < 1500 < 896 * 2
-   */
-  a2dp_write_return_val[0] = 0;
-  EXPECT_EQ(0, iodev->put_buffer(iodev, 1500));
-  EXPECT_EQ(1, a2dp_write_index);
-
-  /* 1500 - 896 */
-  time_now.tv_nsec = 25000000;
-  EXPECT_EQ(604, iodev->frames_queued(iodev, &tstamp));
-  EXPECT_EQ(tstamp.tv_sec, time_now.tv_sec);
-  EXPECT_EQ(tstamp.tv_nsec, time_now.tv_nsec);
-  iodev->close_dev(iodev);
-  a2dp_iodev_destroy(iodev);
-}
-
-TEST_F(A2dpIodev, HandleUnderrun) {
-  struct cras_iodev* iodev;
-  struct cras_audio_area* area;
-  struct timespec tstamp;
-  unsigned frames;
-
-  iodev = a2dp_iodev_create(fake_transport);
-
-  iodev_set_format(iodev, &format);
-  time_now.tv_sec = 0;
-  time_now.tv_nsec = 0;
-  iodev->configure_dev(iodev);
-  /* (950 - 13) / 128 * 512 / 4 */
-  EXPECT_EQ(896, iodev->min_buffer_level);
-
-  iodev->start(iodev);
-  iodev->state = CRAS_IODEV_STATE_NORMAL_RUN;
-
-  frames = 300;
-  iodev->get_buffer(iodev, &area, &frames);
-  ASSERT_EQ(300, frames);
-  ASSERT_EQ(300, area->frames);
-  a2dp_write_return_val[0] = -EAGAIN;
-
-  time_now.tv_nsec = 10000000;
-  iodev->put_buffer(iodev, 300);
-
-  time_now.tv_nsec = 20000000;
-  EXPECT_EQ(300, iodev->frames_queued(iodev, &tstamp));
-
-  /* Frames queued below min_buffer_level, which is derived from transport MTU.
-   * Assert min_cb_level of zero frames are filled. */
-  iodev->min_cb_level = 150;
-  iodev->output_underrun(iodev);
-  ASSERT_EQ(1, cras_iodev_fill_odev_zeros_called);
-  EXPECT_EQ(150, cras_iodev_fill_odev_zeros_frames);
-
-  iodev->close_dev(iodev);
-  a2dp_iodev_destroy(iodev);
-}
-
-TEST_F(A2dpIodev, LeavingNoStreamStateWithSmallStreamDoesntUnderrun) {
-  struct cras_iodev* iodev;
-  struct cras_audio_area* area;
-  struct timespec tstamp;
-  unsigned frames;
-  struct a2dp_io* a2dpio;
-
-  iodev = a2dp_iodev_create(fake_transport);
-  a2dpio = (struct a2dp_io*)iodev;
-
-  iodev_set_format(iodev, &format);
-  time_now.tv_sec = 0;
-  time_now.tv_nsec = 0;
-  iodev->configure_dev(iodev);
-  ASSERT_NE(write_callback, (void*)NULL);
-  /* (950 - 13)/ 128 * 512 / 4 */
-  ASSERT_EQ(896, iodev->min_buffer_level);
-
-  iodev->start(iodev);
-  iodev->state = CRAS_IODEV_STATE_NORMAL_RUN;
-
-  /* Put iodev in no_stream state. Verify it doesn't underrun after each
-   * call of no_stream ops. */
-  a2dp_write_return_val[0] = 0;
-  iodev->no_stream(iodev, 1);
-  EXPECT_EQ(1, a2dp_write_index);
-  EXPECT_EQ(a2dpio->flush_period.tv_nsec, a2dpio->next_flush_time.tv_nsec);
-  frames = iodev->frames_queued(iodev, &tstamp);
-  EXPECT_LE(iodev->min_buffer_level, frames);
-
-  /* Some time has passed and a small stream of 200 frames block is added.
-   * Verify leaving no_stream state doesn't underrun immediately. */
-  time_now.tv_nsec = 20000000;
-  iodev->no_stream(iodev, 1);
-  frames = 200;
-  iodev->get_buffer(iodev, &area, &frames);
-  iodev->put_buffer(iodev, 200);
-  frames = iodev->frames_queued(iodev, &tstamp);
-  EXPECT_LE(iodev->min_buffer_level, frames);
-
-  iodev->close_dev(iodev);
-  a2dp_iodev_destroy(iodev);
-}
-
-TEST_F(A2dpIodev, NoStreamStateFillZerosToTargetLevel) {
-  struct cras_iodev* iodev;
-  struct cras_audio_area* area;
-  struct timespec tstamp;
-  unsigned frames;
-  struct a2dp_io* a2dpio;
-
-  iodev = a2dp_iodev_create(fake_transport);
-  a2dpio = (struct a2dp_io*)iodev;
-
-  iodev_set_format(iodev, &format);
-  time_now.tv_sec = 0;
-  time_now.tv_nsec = 0;
-  iodev->configure_dev(iodev);
-  ASSERT_NE(write_callback, (void*)NULL);
-  /* (950 - 13)/ 128 * 512 / 4 */
-  ASSERT_EQ(896, iodev->min_buffer_level);
-
-  iodev->start(iodev);
-  iodev->state = CRAS_IODEV_STATE_NORMAL_RUN;
-
-  iodev->min_cb_level = 480;
-  frames = 200;
-  iodev->get_buffer(iodev, &area, &frames);
-  iodev->put_buffer(iodev, 200);
-
-  a2dp_write_return_val[0] = 0;
-  iodev->no_stream(iodev, 1);
-  EXPECT_EQ(1, a2dp_write_index);
-  EXPECT_EQ(a2dpio->flush_period.tv_nsec, a2dpio->next_flush_time.tv_nsec);
-
-  /* Some time has passed but not yet reach next flush. Entering no_stream
-   * fills buffer to 3 times of min_buffer_level. */
-  time_now.tv_nsec = 10000000;
-  iodev->no_stream(iodev, 1);
-  frames = iodev->frames_queued(iodev, &tstamp);
-  EXPECT_EQ(3 * iodev->min_buffer_level, frames);
-
-  /* Time has passed next flush time, expect one block is flushed.  */
-  a2dp_write_return_val[1] = 0;
-  time_now.tv_nsec = 25000000;
-  iodev->no_stream(iodev, 1);
-  frames = iodev->frames_queued(iodev, &tstamp);
-  ASSERT_EQ(2 * iodev->min_buffer_level, frames);
-  EXPECT_EQ(2, a2dp_write_index);
-
-  /* Leaving no_stream state fills buffer level back to  2 * min_buffer_level.
-   */
-  a2dp_write_return_val[2] = 0;
-  time_now.tv_nsec = 30000000;
-  iodev->no_stream(iodev, 0);
-  frames = iodev->frames_queued(iodev, &tstamp);
-  ASSERT_EQ(2 * iodev->min_buffer_level, frames);
-  EXPECT_EQ(2, a2dp_write_index);
-
-  iodev->close_dev(iodev);
-  a2dp_iodev_destroy(iodev);
-}
-
-TEST_F(A2dpIodev, EnterNoStreamStateAtHighBufferLevelDoesntFillMore) {
-  struct cras_iodev* iodev;
-  struct cras_audio_area* area;
-  struct timespec tstamp;
-  unsigned frames, start_level;
-  struct a2dp_io* a2dpio;
-
-  iodev = a2dp_iodev_create(fake_transport);
-  a2dpio = (struct a2dp_io*)iodev;
-
-  iodev_set_format(iodev, &format);
-  time_now.tv_sec = 0;
-  time_now.tv_nsec = 0;
-  iodev->configure_dev(iodev);
-  ASSERT_NE(write_callback, (void*)NULL);
-  /* (950 - 13)/ 128 * 512 / 4 */
-  ASSERT_EQ(896, iodev->min_buffer_level);
-
-  iodev->start(iodev);
-  iodev->state = CRAS_IODEV_STATE_NORMAL_RUN;
-
-  a2dp_write_return_val[0] = 0;
-  start_level = 6000;
-  frames = start_level;
-  iodev->get_buffer(iodev, &area, &frames);
-  iodev->put_buffer(iodev, frames);
-  frames = iodev->frames_queued(iodev, &tstamp);
-  /* Assert one block has fluxhed */
-  EXPECT_EQ(start_level - iodev->min_buffer_level, frames);
-  EXPECT_EQ(1, a2dp_write_index);
-  EXPECT_EQ(a2dpio->flush_period.tv_nsec, a2dpio->next_flush_time.tv_nsec);
-
-  a2dp_write_return_val[1] = 0;
-  time_now.tv_nsec = 25000000;
-  iodev->no_stream(iodev, 1);
-  frames = iodev->frames_queued(iodev, &tstamp);
-  /* Next flush time meets requirement so another block is flushed. */
-  ASSERT_EQ(start_level - 2 * iodev->min_buffer_level, frames);
-
-  a2dp_write_return_val[2] = 0;
-  time_now.tv_nsec = 50000000;
-  iodev->no_stream(iodev, 1);
-  frames = iodev->frames_queued(iodev, &tstamp);
-  /* Another block flushed at leaving no stream state. No more data
-   * filled because level is high. */
-  ASSERT_EQ(start_level - 3 * iodev->min_buffer_level, frames);
-
-  iodev->close_dev(iodev);
-  a2dp_iodev_destroy(iodev);
-}
-}  // namespace
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
-
-extern "C" {
-
-int cras_bt_transport_configuration(const struct cras_bt_transport* transport,
-                                    void* configuration,
-                                    int len) {
-  memset(configuration, 0, len);
-  cras_bt_transport_configuration_called++;
-  return 0;
-}
-
-int cras_bt_transport_acquire(struct cras_bt_transport* transport) {
-  cras_bt_transport_acquire_called++;
-  return 0;
-}
-
-int cras_bt_transport_release(struct cras_bt_transport* transport,
-                              unsigned int blocking) {
-  cras_bt_transport_release_called++;
-  return 0;
-}
-
-int cras_bt_transport_fd(const struct cras_bt_transport* transport) {
-  return 0;
-}
-
-const char* cras_bt_transport_object_path(
-    const struct cras_bt_transport* transport) {
-  return FAKE_OBJECT_PATH;
-}
-
-uint16_t cras_bt_transport_write_mtu(
-    const struct cras_bt_transport* transport) {
-  return cras_bt_transport_write_mtu_ret;
-}
-
-int cras_bt_transport_set_volume(struct cras_bt_transport* transport,
-                                 uint16_t volume) {
-  return 0;
-}
-
-void cras_iodev_free_format(struct cras_iodev* iodev) {
-  cras_iodev_free_format_called++;
-}
-
-void cras_iodev_free_resources(struct cras_iodev* iodev) {
-  cras_iodev_free_resources_called++;
-}
-
-// Cras iodev
-void cras_iodev_add_node(struct cras_iodev* iodev, struct cras_ionode* node) {
-  cras_iodev_add_node_called++;
-  iodev->nodes = node;
-}
-
-void cras_iodev_rm_node(struct cras_iodev* iodev, struct cras_ionode* node) {
-  cras_iodev_rm_node_called++;
-  iodev->nodes = NULL;
-}
-
-void cras_iodev_set_active_node(struct cras_iodev* iodev,
-                                struct cras_ionode* node) {
-  cras_iodev_set_active_node_called++;
-  iodev->active_node = node;
-}
-
-// From cras_bt_transport
-struct cras_bt_device* cras_bt_transport_device(
-    const struct cras_bt_transport* transport) {
-  return reinterpret_cast<struct cras_bt_device*>(0x456);
-  ;
-}
-
-enum cras_bt_device_profile cras_bt_transport_profile(
-    const struct cras_bt_transport* transport) {
-  return CRAS_BT_DEVICE_PROFILE_A2DP_SOURCE;
-}
-
-// From cras_bt_device
-const char* cras_bt_device_name(const struct cras_bt_device* device) {
-  return cras_bt_device_name_ret;
-}
-
-const char* cras_bt_device_object_path(const struct cras_bt_device* device) {
-  return "/org/bluez/hci0/dev_1A_2B_3C_4D_5E_6F";
-}
-
-int cras_bt_device_get_stable_id(const struct cras_bt_device* device) {
-  return 123;
-}
-
-void cras_bt_device_append_iodev(struct cras_bt_device* device,
-                                 struct cras_iodev* iodev,
-                                 enum cras_bt_device_profile profile) {
-  cras_bt_device_append_iodev_called++;
-}
-
-void cras_bt_device_rm_iodev(struct cras_bt_device* device,
-                             struct cras_iodev* iodev) {
-  cras_bt_device_rm_iodev_called++;
-}
-
-int cras_bt_device_get_use_hardware_volume(struct cras_bt_device* device) {
-  return 0;
-}
-
-int cras_bt_device_cancel_suspend(struct cras_bt_device* device) {
-  return 0;
-}
-
-int cras_bt_device_schedule_suspend(
-    struct cras_bt_device* device,
-    unsigned int msec,
-    enum cras_bt_device_suspend_reason suspend_reason) {
-  return 0;
-}
-
-int init_a2dp(struct a2dp_info* a2dp, a2dp_sbc_t* sbc) {
-  init_a2dp_called++;
-  memset(a2dp, 0, sizeof(*a2dp));
-  a2dp->frame_length = FAKE_A2DP_FRAME_LENGTH;
-  a2dp->codesize = FAKE_A2DP_CODE_SIZE;
-  return init_a2dp_return_val;
-}
-
-void destroy_a2dp(struct a2dp_info* a2dp) {
-  destroy_a2dp_called++;
-}
-
-int a2dp_codesize(struct a2dp_info* a2dp) {
-  return a2dp->codesize;
-}
-
-int a2dp_block_size(struct a2dp_info* a2dp, int encoded_bytes) {
-  return encoded_bytes / a2dp->frame_length * a2dp->codesize;
-}
-
-int a2dp_queued_frames(const struct a2dp_info* a2dp) {
-  return a2dp->samples;
-}
-
-void a2dp_reset(struct a2dp_info* a2dp) {
-  a2dp_reset_called++;
-  a2dp->samples = 0;
-}
-
-int a2dp_encode(struct a2dp_info* a2dp,
-                const void* pcm_buf,
-                int pcm_buf_size,
-                int format_bytes,
-                size_t link_mtu) {
-  int processed = 0;
-  a2dp_encode_called++;
-
-  if (a2dp->a2dp_buf_used + a2dp->frame_length > link_mtu)
-    return 0;
-  if (pcm_buf_size < a2dp->codesize)
-    return 0;
-
-  processed += a2dp->codesize;
-  a2dp->a2dp_buf_used += a2dp->frame_length;
-  a2dp->samples += processed / format_bytes;
-
-  return processed;
-}
-
-int a2dp_write(struct a2dp_info* a2dp, int stream_fd, size_t link_mtu) {
-  int ret, samples;
-  if (a2dp->frame_length + a2dp->a2dp_buf_used < link_mtu)
-    return 0;
-
-  ret = a2dp_write_return_val[a2dp_write_index++];
-  if (ret < 0)
-    return ret;
-
-  samples = a2dp->samples;
-  a2dp->samples = 0;
-  a2dp->a2dp_buf_used = 0;
-  return samples;
-}
-
-int clock_gettime(clockid_t clk_id, struct timespec* tp) {
-  *tp = time_now;
-  return 0;
-}
-
-void cras_iodev_init_audio_area(struct cras_iodev* iodev, int num_channels) {
-  iodev->area = mock_audio_area;
-}
-
-void cras_iodev_free_audio_area(struct cras_iodev* iodev) {}
-
-int cras_iodev_fill_odev_zeros(struct cras_iodev* odev, unsigned int frames) {
-  struct cras_audio_area* area;
-  cras_iodev_fill_odev_zeros_called++;
-  cras_iodev_fill_odev_zeros_frames = frames;
-
-  odev->get_buffer(odev, &area, &frames);
-  odev->put_buffer(odev, frames);
-  return 0;
-}
-
-void cras_audio_area_config_buf_pointers(struct cras_audio_area* area,
-                                         const struct cras_audio_format* fmt,
-                                         uint8_t* base_buffer) {
-  mock_audio_area->channels[0].buf = base_buffer;
-}
-
-struct audio_thread* cras_iodev_list_get_audio_thread() {
-  return NULL;
-}
-// From ewma_power
-void ewma_power_disable(struct ewma_power* ewma) {}
-
-// From audio_thread
-struct audio_thread_event_log* atlog;
-
-void audio_thread_add_events_callback(int fd,
-                                      thread_callback cb,
-                                      void* data,
-                                      int events) {
-  write_callback = cb;
-  write_callback_data = data;
-}
-
-int audio_thread_rm_callback_sync(struct audio_thread* thread, int fd) {
-  return 0;
-}
-
-void audio_thread_config_events_callback(
-    int fd,
-    enum AUDIO_THREAD_EVENTS_CB_TRIGGER trigger) {
-  audio_thread_config_events_callback_called++;
-  audio_thread_config_events_callback_trigger = trigger;
-}
-}
-
-int cras_audio_thread_event_a2dp_overrun() {
-  return 0;
-}
-
-int cras_audio_thread_event_a2dp_throttle() {
-  return 0;
-}
diff --git a/cras/src/tests/alert_unittest.cc b/cras/src/tests/alert_unittest.cc
deleted file mode 100644
index ec1efcc..0000000
--- a/cras/src/tests/alert_unittest.cc
+++ /dev/null
@@ -1,227 +0,0 @@
-// Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <gtest/gtest.h>
-#include <sys/socket.h>
-#include <sys/types.h>
-#include <unistd.h>
-
-#include "cras_alert.h"
-
-namespace {
-
-void callback1(void* arg, void* data);
-void callback2(void* arg, void* data);
-void prepare(struct cras_alert* alert);
-
-struct cb_data_struct {
-  int data;
-};
-
-static int cb1_called = 0;
-static cb_data_struct cb1_data;
-static int cb2_called = 0;
-static int cb2_set_pending = 0;
-static int prepare_called = 0;
-
-void ResetStub() {
-  cb1_called = 0;
-  cb2_called = 0;
-  cb2_set_pending = 0;
-  prepare_called = 0;
-  cb1_data.data = 0;
-}
-
-class Alert : public testing::Test {
- protected:
-  virtual void SetUp() { cb1_data.data = 0; }
-
-  virtual void TearDown() {}
-};
-
-TEST_F(Alert, OneCallback) {
-  struct cras_alert* alert = cras_alert_create(NULL, 0);
-  cras_alert_add_callback(alert, &callback1, NULL);
-  ResetStub();
-  cras_alert_pending(alert);
-  EXPECT_EQ(0, cb1_called);
-  cras_alert_process_all_pending_alerts();
-  EXPECT_EQ(1, cb1_called);
-  cras_alert_destroy(alert);
-}
-
-TEST_F(Alert, OneCallbackPost2Call1) {
-  struct cras_alert* alert = cras_alert_create(NULL, 0);
-  cras_alert_add_callback(alert, &callback1, NULL);
-  ResetStub();
-  // Alert twice, callback should only be called once.
-  cras_alert_pending(alert);
-  cras_alert_pending(alert);
-  EXPECT_EQ(0, cb1_called);
-  cras_alert_process_all_pending_alerts();
-  EXPECT_EQ(1, cb1_called);
-  cras_alert_destroy(alert);
-}
-
-TEST_F(Alert, OneCallbackWithData) {
-  struct cras_alert* alert = cras_alert_create(NULL, 0);
-  struct cb_data_struct data = {1};
-  cras_alert_add_callback(alert, &callback1, NULL);
-  ResetStub();
-  cras_alert_pending_data(alert, (void*)&data, sizeof(struct cb_data_struct));
-  EXPECT_EQ(0, cb1_called);
-  cras_alert_process_all_pending_alerts();
-  EXPECT_EQ(1, cb1_called);
-  EXPECT_EQ(1, cb1_data.data);
-  cras_alert_destroy(alert);
-}
-
-TEST_F(Alert, OneCallbackTwoDataCalledOnce) {
-  struct cras_alert* alert = cras_alert_create(NULL, 0);
-  struct cb_data_struct data = {1};
-  struct cb_data_struct data2 = {2};
-  cras_alert_add_callback(alert, &callback1, NULL);
-  ResetStub();
-  // Callback called with last data only.
-  cras_alert_pending_data(alert, (void*)&data, sizeof(struct cb_data_struct));
-  cras_alert_pending_data(alert, (void*)&data2, sizeof(struct cb_data_struct));
-  EXPECT_EQ(0, cb1_called);
-  cras_alert_process_all_pending_alerts();
-  EXPECT_EQ(1, cb1_called);
-  EXPECT_EQ(2, cb1_data.data);
-  cras_alert_destroy(alert);
-}
-
-TEST_F(Alert, OneCallbackTwoDataKeepAll) {
-  struct cras_alert* alert =
-      cras_alert_create(NULL, CRAS_ALERT_FLAG_KEEP_ALL_DATA);
-  struct cb_data_struct data = {1};
-  struct cb_data_struct data2 = {2};
-  cras_alert_add_callback(alert, &callback1, NULL);
-  ResetStub();
-  // Callbacks with data should each be called.
-  cras_alert_pending_data(alert, (void*)&data, sizeof(cb_data_struct));
-  cras_alert_pending_data(alert, (void*)&data2, sizeof(cb_data_struct));
-  EXPECT_EQ(0, cb1_called);
-  cras_alert_process_all_pending_alerts();
-  EXPECT_EQ(2, cb1_called);
-  EXPECT_EQ(2, cb1_data.data);
-  cras_alert_destroy(alert);
-}
-
-TEST_F(Alert, TwoCallbacks) {
-  struct cras_alert* alert = cras_alert_create(NULL, 0);
-  cras_alert_add_callback(alert, &callback1, NULL);
-  cras_alert_add_callback(alert, &callback2, NULL);
-  ResetStub();
-  cras_alert_pending(alert);
-  EXPECT_EQ(0, cb1_called);
-  EXPECT_EQ(0, cb2_called);
-  cras_alert_process_all_pending_alerts();
-  EXPECT_EQ(1, cb1_called);
-  EXPECT_EQ(1, cb2_called);
-  cras_alert_destroy(alert);
-}
-
-TEST_F(Alert, NoPending) {
-  struct cras_alert* alert = cras_alert_create(NULL, 0);
-  cras_alert_add_callback(alert, &callback1, NULL);
-  ResetStub();
-  EXPECT_EQ(0, cb1_called);
-  cras_alert_process_all_pending_alerts();
-  EXPECT_EQ(0, cb1_called);
-  cras_alert_destroy(alert);
-}
-
-TEST_F(Alert, PendingInCallback) {
-  struct cras_alert* alert1 = cras_alert_create(NULL, 0);
-  struct cras_alert* alert2 = cras_alert_create(NULL, 0);
-  cras_alert_add_callback(alert1, &callback1, NULL);
-  cras_alert_add_callback(alert2, &callback2, alert1);
-  ResetStub();
-  cras_alert_pending(alert2);
-  EXPECT_EQ(0, cb1_called);
-  EXPECT_EQ(0, cb2_called);
-  cb2_set_pending = 1;
-  cras_alert_process_all_pending_alerts();
-  EXPECT_EQ(1, cb1_called);
-  EXPECT_EQ(1, cb2_called);
-  cras_alert_destroy(alert1);
-  cras_alert_destroy(alert2);
-}
-
-TEST_F(Alert, Prepare) {
-  struct cras_alert* alert = cras_alert_create(prepare, 0);
-  cras_alert_add_callback(alert, &callback1, NULL);
-  ResetStub();
-  cras_alert_pending(alert);
-  EXPECT_EQ(0, cb1_called);
-  cras_alert_process_all_pending_alerts();
-  EXPECT_EQ(1, prepare_called);
-  EXPECT_EQ(1, cb1_called);
-  cras_alert_destroy(alert);
-}
-
-TEST_F(Alert, TwoAlerts) {
-  struct cras_alert* alert1 = cras_alert_create(prepare, 0);
-  struct cras_alert* alert2 = cras_alert_create(prepare, 0);
-  cras_alert_add_callback(alert1, &callback1, NULL);
-  cras_alert_add_callback(alert2, &callback2, NULL);
-
-  ResetStub();
-  cras_alert_pending(alert1);
-  EXPECT_EQ(0, cb1_called);
-  EXPECT_EQ(0, cb2_called);
-  cras_alert_process_all_pending_alerts();
-  EXPECT_EQ(1, prepare_called);
-  EXPECT_EQ(1, cb1_called);
-  EXPECT_EQ(0, cb2_called);
-
-  ResetStub();
-  cras_alert_pending(alert2);
-  EXPECT_EQ(0, cb1_called);
-  EXPECT_EQ(0, cb2_called);
-  cras_alert_process_all_pending_alerts();
-  EXPECT_EQ(1, prepare_called);
-  EXPECT_EQ(0, cb1_called);
-  EXPECT_EQ(1, cb2_called);
-
-  ResetStub();
-  cras_alert_pending(alert1);
-  cras_alert_pending(alert2);
-  EXPECT_EQ(0, cb1_called);
-  EXPECT_EQ(0, cb2_called);
-  cras_alert_process_all_pending_alerts();
-  EXPECT_EQ(2, prepare_called);
-  EXPECT_EQ(1, cb1_called);
-  EXPECT_EQ(1, cb2_called);
-
-  cras_alert_destroy_all();
-}
-
-void callback1(void* arg, void* data) {
-  cb1_called++;
-  if (data)
-    cb1_data.data = ((struct cb_data_struct*)data)->data;
-}
-
-void callback2(void* arg, void* data) {
-  cb2_called++;
-  if (cb2_set_pending) {
-    cb2_set_pending = 0;
-    cras_alert_pending((struct cras_alert*)arg);
-  }
-}
-
-void prepare(struct cras_alert* alert) {
-  prepare_called++;
-  return;
-}
-
-}  // namespace
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tests/alsa_card_unittest.cc b/cras/src/tests/alsa_card_unittest.cc
deleted file mode 100644
index cfb6756..0000000
--- a/cras/src/tests/alsa_card_unittest.cc
+++ /dev/null
@@ -1,1289 +0,0 @@
-// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <gtest/gtest.h>
-#include <stdio.h>
-#include <sys/param.h>
-#include <syslog.h>
-
-#include <map>
-
-extern "C" {
-#include "cras_alsa_card.h"
-#include "cras_alsa_io.h"
-#include "cras_alsa_mixer.h"
-#include "cras_alsa_ucm.h"
-#include "cras_iodev.h"
-#include "cras_types.h"
-#include "cras_util.h"
-#include "utlist.h"
-}
-
-namespace {
-
-static size_t cras_alsa_mixer_create_called;
-static struct cras_alsa_mixer* cras_alsa_mixer_create_return;
-static size_t cras_alsa_mixer_destroy_called;
-static size_t cras_alsa_iodev_create_called;
-static struct cras_iodev** cras_alsa_iodev_create_return;
-static struct cras_iodev fake_dev1, fake_dev2, fake_dev3, fake_dev4;
-static struct cras_iodev* cras_alsa_iodev_create_default_return[] = {
-    &fake_dev1,
-    &fake_dev2,
-    &fake_dev3,
-    &fake_dev4,
-};
-static size_t cras_alsa_iodev_create_return_size;
-static size_t cras_alsa_iodev_legacy_complete_init_called;
-static size_t cras_alsa_iodev_ucm_add_nodes_and_jacks_called;
-static size_t cras_alsa_iodev_ucm_complete_init_called;
-static size_t cras_alsa_iodev_destroy_called;
-static struct cras_iodev* cras_alsa_iodev_destroy_arg;
-static size_t cras_alsa_iodev_index_called;
-static std::map<struct cras_iodev*, unsigned int> cras_alsa_iodev_index_return;
-static int alsa_iodev_has_hctl_jacks_return;
-static size_t snd_ctl_open_called;
-static size_t snd_ctl_open_return;
-static size_t snd_ctl_close_called;
-static size_t snd_ctl_close_return;
-static size_t snd_ctl_pcm_next_device_called;
-static bool snd_ctl_pcm_next_device_return_error;
-static int* snd_ctl_pcm_next_device_set_devs;
-static size_t snd_ctl_pcm_next_device_set_devs_size;
-static size_t snd_ctl_pcm_next_device_set_devs_index;
-static size_t snd_ctl_pcm_info_called;
-static int* snd_ctl_pcm_info_rets;
-static size_t snd_ctl_pcm_info_rets_size;
-static size_t snd_ctl_pcm_info_rets_index;
-static size_t snd_ctl_card_info_called;
-static int snd_ctl_card_info_ret;
-static size_t snd_hctl_open_called;
-static int snd_hctl_open_return_value;
-static int snd_hctl_close_called;
-static size_t snd_hctl_nonblock_called;
-static snd_hctl_t* snd_hctl_open_pointer_val;
-static size_t snd_hctl_load_called;
-static int snd_hctl_load_return_value;
-static struct pollfd* snd_hctl_poll_descriptors_fds;
-static size_t snd_hctl_poll_descriptors_num_fds;
-static size_t snd_hctl_poll_descriptors_called;
-static size_t cras_system_add_select_fd_called;
-static std::vector<int> cras_system_add_select_fd_values;
-static size_t cras_system_rm_select_fd_called;
-static std::vector<int> cras_system_rm_select_fd_values;
-static size_t snd_hctl_handle_events_called;
-static size_t iniparser_freedict_called;
-static size_t iniparser_load_called;
-static struct cras_device_blocklist* fake_blocklist;
-static int cras_device_blocklist_check_retval;
-static unsigned ucm_create_called;
-static char ucm_create_name[100];
-static unsigned ucm_destroy_called;
-static size_t ucm_get_dev_for_mixer_called;
-static size_t ucm_get_flag_called;
-static char ucm_get_flag_name[65];
-static char* device_config_dir;
-static const char* cras_card_config_dir;
-static struct mixer_name* ucm_get_coupled_mixer_names_return_value;
-static struct mixer_name* coupled_output_names_value;
-static int ucm_has_fully_specified_ucm_flag_return_value;
-static int ucm_get_sections_called;
-static struct mixer_name* ucm_get_main_volume_names_return_value;
-static struct ucm_section* ucm_get_sections_return_value;
-static size_t cras_alsa_mixer_add_controls_in_section_called;
-static int cras_alsa_mixer_add_controls_in_section_return_value;
-static int cras_alsa_mixer_add_main_volume_control_by_name_called;
-static int cras_alsa_mixer_add_main_volume_control_by_name_return_value;
-static int ucm_get_echo_reference_dev_name_for_dev_called;
-static size_t cras_system_check_ignore_ucm_suffix_called;
-static bool cras_system_check_ignore_ucm_suffix_value;
-static const char* ucm_get_echo_reference_dev_name_for_dev_return_value[4];
-
-static void ResetStubData() {
-  cras_alsa_mixer_create_called = 0;
-  cras_alsa_mixer_create_return = reinterpret_cast<struct cras_alsa_mixer*>(1);
-  cras_alsa_mixer_destroy_called = 0;
-  cras_alsa_iodev_destroy_arg = NULL;
-  cras_alsa_iodev_create_called = 0;
-  cras_alsa_iodev_create_return = cras_alsa_iodev_create_default_return;
-  cras_alsa_iodev_create_return_size =
-      ARRAY_SIZE(cras_alsa_iodev_create_default_return);
-  cras_alsa_iodev_legacy_complete_init_called = 0;
-  cras_alsa_iodev_ucm_add_nodes_and_jacks_called = 0;
-  cras_alsa_iodev_ucm_complete_init_called = 0;
-  cras_alsa_iodev_destroy_called = 0;
-  cras_alsa_iodev_index_called = 0;
-  cras_alsa_iodev_index_return.clear();
-  alsa_iodev_has_hctl_jacks_return = 1;
-  snd_ctl_open_called = 0;
-  snd_ctl_open_return = 0;
-  snd_ctl_close_called = 0;
-  snd_ctl_close_return = 0;
-  snd_ctl_pcm_next_device_called = 0;
-  snd_ctl_pcm_next_device_return_error = false;
-  snd_ctl_pcm_next_device_set_devs_size = 0;
-  snd_ctl_pcm_next_device_set_devs_index = 0;
-  snd_ctl_pcm_info_called = 0;
-  snd_ctl_pcm_info_rets_size = 0;
-  snd_ctl_pcm_info_rets_index = 0;
-  snd_ctl_card_info_called = 0;
-  snd_ctl_card_info_ret = 0;
-  snd_hctl_open_called = 0;
-  snd_hctl_open_return_value = 0;
-  snd_hctl_open_pointer_val = reinterpret_cast<snd_hctl_t*>(0x4323);
-  snd_hctl_load_called = 0;
-  snd_hctl_load_return_value = 0;
-  snd_hctl_close_called = 0;
-  snd_hctl_nonblock_called = 0;
-  snd_hctl_poll_descriptors_num_fds = 0;
-  snd_hctl_poll_descriptors_called = 0;
-  snd_hctl_handle_events_called = 0;
-  snd_hctl_poll_descriptors_num_fds = 0;
-  snd_hctl_poll_descriptors_called = 0;
-  cras_system_add_select_fd_called = 0;
-  cras_system_add_select_fd_values.clear();
-  cras_system_rm_select_fd_called = 0;
-  cras_system_rm_select_fd_values.clear();
-  iniparser_freedict_called = 0;
-  iniparser_load_called = 0;
-  fake_blocklist = reinterpret_cast<struct cras_device_blocklist*>(3);
-  cras_device_blocklist_check_retval = 0;
-  ucm_create_called = 0;
-  memset(ucm_create_name, 0, sizeof(ucm_get_flag_name));
-  ucm_destroy_called = 0;
-  ucm_get_dev_for_mixer_called = 0;
-  ucm_get_flag_called = 0;
-  memset(ucm_get_flag_name, 0, sizeof(ucm_get_flag_name));
-  device_config_dir = reinterpret_cast<char*>(3);
-  cras_card_config_dir = NULL;
-  ucm_get_coupled_mixer_names_return_value = NULL;
-  ucm_get_main_volume_names_return_value = NULL;
-  mixer_name_free(coupled_output_names_value);
-  coupled_output_names_value = NULL;
-  ucm_has_fully_specified_ucm_flag_return_value = 0;
-  ucm_get_sections_called = 0;
-  ucm_get_sections_return_value = NULL;
-  cras_alsa_mixer_add_controls_in_section_called = 0;
-  cras_alsa_mixer_add_controls_in_section_return_value = 0;
-  cras_alsa_mixer_add_main_volume_control_by_name_called = 0;
-  cras_alsa_mixer_add_main_volume_control_by_name_return_value = 0;
-  ucm_get_echo_reference_dev_name_for_dev_called = 0;
-  cras_system_check_ignore_ucm_suffix_called = 0;
-  cras_system_check_ignore_ucm_suffix_value = 0;
-  fake_dev1.nodes = NULL;
-  fake_dev2.nodes = NULL;
-  fake_dev3.nodes = NULL;
-  fake_dev4.nodes = NULL;
-}
-
-TEST(AlsaCard, CreateFailInvalidCard) {
-  struct cras_alsa_card* c;
-  cras_alsa_card_info card_info;
-
-  ResetStubData();
-  card_info.card_type = ALSA_CARD_TYPE_INTERNAL;
-  card_info.card_index = 55;
-  c = cras_alsa_card_create(&card_info, device_config_dir, fake_blocklist,
-                            NULL);
-  EXPECT_EQ(static_cast<struct cras_alsa_card*>(NULL), c);
-  EXPECT_EQ(snd_ctl_close_called, snd_ctl_open_called);
-  EXPECT_EQ(cras_alsa_mixer_create_called, cras_alsa_mixer_destroy_called);
-}
-
-TEST(AlsaCard, CreateFailMixerInit) {
-  struct cras_alsa_card* c;
-  cras_alsa_card_info card_info;
-
-  ResetStubData();
-  card_info.card_type = ALSA_CARD_TYPE_INTERNAL;
-  card_info.card_index = 0;
-  cras_alsa_mixer_create_return = static_cast<struct cras_alsa_mixer*>(NULL);
-  c = cras_alsa_card_create(&card_info, device_config_dir, fake_blocklist,
-                            NULL);
-  EXPECT_EQ(static_cast<struct cras_alsa_card*>(NULL), c);
-  EXPECT_EQ(snd_ctl_close_called, snd_ctl_open_called);
-  EXPECT_EQ(1, cras_alsa_mixer_create_called);
-  EXPECT_EQ(0, cras_alsa_mixer_destroy_called);
-}
-
-TEST(AlsaCard, CreateFailCtlOpen) {
-  struct cras_alsa_card* c;
-  cras_alsa_card_info card_info;
-
-  ResetStubData();
-  card_info.card_type = ALSA_CARD_TYPE_INTERNAL;
-  card_info.card_index = 0;
-  snd_ctl_open_return = -1;
-  c = cras_alsa_card_create(&card_info, device_config_dir, fake_blocklist,
-                            NULL);
-  EXPECT_EQ(static_cast<struct cras_alsa_card*>(NULL), c);
-  EXPECT_EQ(1, snd_ctl_open_called);
-  EXPECT_EQ(0, snd_ctl_close_called);
-  EXPECT_EQ(iniparser_load_called, iniparser_freedict_called);
-  EXPECT_EQ(0, cras_alsa_mixer_create_called);
-}
-
-TEST(AlsaCard, CreateFailHctlOpen) {
-  struct cras_alsa_card* c;
-  cras_alsa_card_info card_info;
-
-  ResetStubData();
-  card_info.card_type = ALSA_CARD_TYPE_INTERNAL;
-  card_info.card_index = 0;
-  snd_hctl_open_pointer_val = NULL;
-  snd_hctl_open_return_value = -1;
-
-  c = cras_alsa_card_create(&card_info, device_config_dir, fake_blocklist,
-                            NULL);
-  EXPECT_NE(static_cast<struct cras_alsa_card*>(NULL), c);
-  EXPECT_EQ(1, snd_ctl_open_called);
-  EXPECT_EQ(1, snd_ctl_close_called);
-  EXPECT_EQ(iniparser_load_called, iniparser_freedict_called);
-  EXPECT_EQ(1, snd_hctl_open_called);
-  EXPECT_EQ(0, snd_hctl_nonblock_called);
-  EXPECT_EQ(0, snd_hctl_load_called);
-  EXPECT_EQ(1, cras_alsa_mixer_create_called);
-  cras_alsa_card_destroy(c);
-}
-
-TEST(AlsaCard, CreateFailHctlLoad) {
-  struct cras_alsa_card* c;
-  cras_alsa_card_info card_info;
-
-  ResetStubData();
-  card_info.card_type = ALSA_CARD_TYPE_INTERNAL;
-  card_info.card_index = 0;
-  snd_hctl_load_return_value = -1;
-
-  c = cras_alsa_card_create(&card_info, device_config_dir, fake_blocklist,
-                            NULL);
-  EXPECT_EQ(static_cast<struct cras_alsa_card*>(NULL), c);
-  EXPECT_EQ(1, snd_ctl_open_called);
-  EXPECT_EQ(1, snd_ctl_close_called);
-  EXPECT_EQ(iniparser_load_called, iniparser_freedict_called);
-  EXPECT_EQ(1, snd_hctl_open_called);
-  EXPECT_EQ(1, snd_hctl_nonblock_called);
-  EXPECT_EQ(1, snd_hctl_load_called);
-  EXPECT_EQ(0, cras_alsa_mixer_create_called);
-}
-
-TEST(AlsaCard, AddSelectForHctlNoDevices) {
-  struct pollfd poll_fds[] = {
-      {3, 0, 0},
-  };
-
-  struct cras_alsa_card* c;
-  cras_alsa_card_info card_info;
-
-  ResetStubData();
-  card_info.card_type = ALSA_CARD_TYPE_INTERNAL;
-  card_info.card_index = 0;
-  snd_hctl_poll_descriptors_fds = poll_fds;
-  snd_hctl_poll_descriptors_num_fds = ARRAY_SIZE(poll_fds);
-
-  c = cras_alsa_card_create(&card_info, device_config_dir, fake_blocklist,
-                            NULL);
-  EXPECT_NE(static_cast<struct cras_alsa_card*>(NULL), c);
-  EXPECT_EQ(1, snd_ctl_open_called);
-  EXPECT_EQ(1, snd_ctl_close_called);
-  EXPECT_EQ(iniparser_load_called, iniparser_freedict_called);
-  EXPECT_EQ(1, snd_hctl_open_called);
-  EXPECT_EQ(1, snd_hctl_nonblock_called);
-  EXPECT_EQ(1, snd_hctl_load_called);
-  EXPECT_EQ(1, cras_alsa_mixer_create_called);
-  EXPECT_EQ(0, cras_system_add_select_fd_called);
-  cras_alsa_card_destroy(c);
-  EXPECT_EQ(0, cras_system_rm_select_fd_called);
-}
-
-TEST(AlsaCard, AddSelectForHctlWithDevices) {
-  struct pollfd poll_fds[] = {
-      {3, 0, 0},
-  };
-  int dev_nums[] = {0};
-  int info_rets[] = {0, -1};
-
-  struct cras_alsa_card* c;
-  cras_alsa_card_info card_info;
-
-  ResetStubData();
-  snd_ctl_pcm_next_device_set_devs_size = ARRAY_SIZE(dev_nums);
-  snd_ctl_pcm_next_device_set_devs = dev_nums;
-  snd_ctl_pcm_info_rets_size = ARRAY_SIZE(info_rets);
-  snd_ctl_pcm_info_rets = info_rets;
-  card_info.card_type = ALSA_CARD_TYPE_INTERNAL;
-  card_info.card_index = 0;
-  snd_hctl_poll_descriptors_fds = poll_fds;
-  snd_hctl_poll_descriptors_num_fds = ARRAY_SIZE(poll_fds);
-
-  c = cras_alsa_card_create(&card_info, device_config_dir, fake_blocklist,
-                            NULL);
-  EXPECT_NE(static_cast<struct cras_alsa_card*>(NULL), c);
-  EXPECT_EQ(snd_ctl_close_called, snd_ctl_open_called);
-  EXPECT_EQ(2, snd_ctl_pcm_next_device_called);
-  EXPECT_EQ(1, cras_alsa_iodev_create_called);
-  EXPECT_EQ(0, cras_alsa_iodev_index_called);
-  EXPECT_EQ(1, snd_ctl_card_info_called);
-  EXPECT_EQ(1, ucm_create_called);
-  EXPECT_EQ(1, ucm_get_dev_for_mixer_called);
-  EXPECT_EQ(1, ucm_get_flag_called);
-  EXPECT_EQ(0, strcmp(ucm_get_flag_name, "ExtraMainVolume"));
-  EXPECT_EQ(cras_card_config_dir, device_config_dir);
-  EXPECT_EQ(iniparser_load_called, iniparser_freedict_called);
-  EXPECT_EQ(1, snd_hctl_open_called);
-  EXPECT_EQ(1, snd_hctl_nonblock_called);
-  EXPECT_EQ(1, snd_hctl_load_called);
-  EXPECT_EQ(1, cras_alsa_mixer_create_called);
-  ASSERT_EQ(1, cras_system_add_select_fd_called);
-  EXPECT_EQ(3, cras_system_add_select_fd_values[0]);
-  cras_alsa_card_destroy(c);
-  EXPECT_EQ(ARRAY_SIZE(poll_fds), cras_system_rm_select_fd_called);
-}
-
-TEST(AlsaCard, CreateFailCtlCardInfo) {
-  struct cras_alsa_card* c;
-  cras_alsa_card_info card_info;
-
-  ResetStubData();
-  card_info.card_type = ALSA_CARD_TYPE_INTERNAL;
-  card_info.card_index = 0;
-  snd_ctl_card_info_ret = -1;
-  c = cras_alsa_card_create(&card_info, device_config_dir, fake_blocklist,
-                            NULL);
-  EXPECT_EQ(static_cast<struct cras_alsa_card*>(NULL), c);
-  EXPECT_EQ(1, snd_ctl_open_called);
-  EXPECT_EQ(1, snd_ctl_close_called);
-  EXPECT_EQ(cras_alsa_mixer_create_called, cras_alsa_mixer_destroy_called);
-  EXPECT_EQ(iniparser_load_called, iniparser_freedict_called);
-}
-
-TEST(AlsaCard, CreateNoDevices) {
-  struct cras_alsa_card* c;
-  cras_alsa_card_info card_info;
-
-  ResetStubData();
-  card_info.card_type = ALSA_CARD_TYPE_INTERNAL;
-  card_info.card_index = 1;
-  c = cras_alsa_card_create(&card_info, device_config_dir, fake_blocklist,
-                            NULL);
-  EXPECT_NE(static_cast<struct cras_alsa_card*>(NULL), c);
-  EXPECT_EQ(snd_ctl_close_called, snd_ctl_open_called);
-  EXPECT_EQ(1, snd_ctl_pcm_next_device_called);
-  EXPECT_EQ(0, cras_alsa_iodev_create_called);
-  EXPECT_EQ(0, cras_alsa_iodev_legacy_complete_init_called);
-  EXPECT_EQ(1, cras_alsa_card_get_index(c));
-  EXPECT_EQ(0, ucm_get_sections_called);
-  EXPECT_EQ(0, cras_alsa_mixer_add_controls_in_section_called);
-
-  cras_alsa_card_destroy(c);
-  EXPECT_EQ(0, cras_alsa_iodev_destroy_called);
-  EXPECT_EQ(cras_alsa_mixer_create_called, cras_alsa_mixer_destroy_called);
-  EXPECT_EQ(iniparser_load_called, iniparser_freedict_called);
-}
-
-TEST(AlsaCard, CreateOneOutputNextDevError) {
-  struct cras_alsa_card* c;
-  cras_alsa_card_info card_info;
-
-  ResetStubData();
-  snd_ctl_pcm_next_device_return_error = true;
-  card_info.card_type = ALSA_CARD_TYPE_USB;
-  card_info.card_index = 0;
-  c = cras_alsa_card_create(&card_info, device_config_dir, fake_blocklist,
-                            NULL);
-  EXPECT_EQ(static_cast<struct cras_alsa_card*>(NULL), c);
-  EXPECT_EQ(cras_alsa_mixer_create_called, cras_alsa_mixer_destroy_called);
-  EXPECT_EQ(snd_ctl_open_called, snd_ctl_close_called);
-  EXPECT_EQ(iniparser_load_called, iniparser_freedict_called);
-}
-
-TEST(AlsaCard, CreateOneOutput) {
-  struct cras_alsa_card* c;
-  int dev_nums[] = {0};
-  int info_rets[] = {0, -1};
-  cras_alsa_card_info card_info;
-
-  ResetStubData();
-  snd_ctl_pcm_next_device_set_devs_size = ARRAY_SIZE(dev_nums);
-  snd_ctl_pcm_next_device_set_devs = dev_nums;
-  snd_ctl_pcm_info_rets_size = ARRAY_SIZE(info_rets);
-  snd_ctl_pcm_info_rets = info_rets;
-  card_info.card_type = ALSA_CARD_TYPE_USB;
-  card_info.card_index = 0;
-  c = cras_alsa_card_create(&card_info, device_config_dir, fake_blocklist,
-                            NULL);
-  EXPECT_NE(static_cast<struct cras_alsa_card*>(NULL), c);
-  EXPECT_EQ(snd_ctl_close_called, snd_ctl_open_called);
-  EXPECT_EQ(2, snd_ctl_pcm_next_device_called);
-  EXPECT_EQ(1, cras_alsa_iodev_create_called);
-  EXPECT_EQ(1, cras_alsa_iodev_legacy_complete_init_called);
-  EXPECT_EQ(0, cras_alsa_iodev_index_called);
-  EXPECT_EQ(1, snd_ctl_card_info_called);
-  EXPECT_EQ(1, ucm_create_called);
-  EXPECT_EQ(1, ucm_get_dev_for_mixer_called);
-  EXPECT_EQ(1, ucm_get_flag_called);
-  EXPECT_EQ(0, strcmp(ucm_get_flag_name, "ExtraMainVolume"));
-  EXPECT_EQ(cras_card_config_dir, device_config_dir);
-  EXPECT_EQ(0, ucm_get_sections_called);
-  EXPECT_EQ(0, cras_alsa_mixer_add_controls_in_section_called);
-
-  cras_alsa_card_destroy(c);
-  EXPECT_EQ(1, ucm_destroy_called);
-  EXPECT_EQ(1, cras_alsa_iodev_destroy_called);
-  EXPECT_EQ(cras_alsa_iodev_create_return[0], cras_alsa_iodev_destroy_arg);
-  EXPECT_EQ(cras_alsa_mixer_create_called, cras_alsa_mixer_destroy_called);
-  EXPECT_EQ(iniparser_load_called, iniparser_freedict_called);
-}
-
-TEST(AlsaCard, CreateOneOutputBlocklisted) {
-  struct cras_alsa_card* c;
-  int dev_nums[] = {0};
-  int info_rets[] = {0, -1};
-  cras_alsa_card_info card_info;
-
-  ResetStubData();
-  snd_ctl_pcm_next_device_set_devs_size = ARRAY_SIZE(dev_nums);
-  snd_ctl_pcm_next_device_set_devs = dev_nums;
-  snd_ctl_pcm_info_rets_size = ARRAY_SIZE(info_rets);
-  snd_ctl_pcm_info_rets = info_rets;
-  alsa_iodev_has_hctl_jacks_return = 0;
-  cras_device_blocklist_check_retval = 1;
-  card_info.card_type = ALSA_CARD_TYPE_USB;
-  card_info.card_index = 0;
-  c = cras_alsa_card_create(&card_info, device_config_dir, fake_blocklist,
-                            NULL);
-  EXPECT_NE(static_cast<struct cras_alsa_card*>(NULL), c);
-  EXPECT_EQ(snd_ctl_close_called, snd_ctl_open_called);
-  EXPECT_EQ(2, snd_ctl_pcm_next_device_called);
-  EXPECT_EQ(1, snd_ctl_card_info_called);
-  EXPECT_EQ(0, cras_alsa_iodev_create_called);
-  EXPECT_EQ(0, cras_alsa_iodev_legacy_complete_init_called);
-  EXPECT_EQ(cras_card_config_dir, device_config_dir);
-
-  cras_alsa_card_destroy(c);
-  EXPECT_EQ(0, cras_alsa_iodev_destroy_called);
-  EXPECT_EQ(NULL, cras_alsa_iodev_destroy_arg);
-  EXPECT_EQ(cras_alsa_mixer_create_called, cras_alsa_mixer_destroy_called);
-  EXPECT_EQ(iniparser_load_called, iniparser_freedict_called);
-}
-
-TEST(AlsaCard, CreateTwoOutputs) {
-  struct cras_alsa_card* c;
-  int dev_nums[] = {0, 3};
-  int info_rets[] = {0, -1, 0};
-  cras_alsa_card_info card_info;
-
-  ResetStubData();
-  snd_ctl_pcm_next_device_set_devs_size = ARRAY_SIZE(dev_nums);
-  snd_ctl_pcm_next_device_set_devs = dev_nums;
-  snd_ctl_pcm_info_rets_size = ARRAY_SIZE(info_rets);
-  snd_ctl_pcm_info_rets = info_rets;
-  card_info.card_type = ALSA_CARD_TYPE_INTERNAL;
-  card_info.card_index = 0;
-  c = cras_alsa_card_create(&card_info, device_config_dir, fake_blocklist,
-                            NULL);
-  EXPECT_NE(static_cast<struct cras_alsa_card*>(NULL), c);
-  EXPECT_EQ(snd_ctl_close_called, snd_ctl_open_called);
-  EXPECT_EQ(3, snd_ctl_pcm_next_device_called);
-  EXPECT_EQ(2, cras_alsa_iodev_create_called);
-  EXPECT_EQ(2, cras_alsa_iodev_legacy_complete_init_called);
-  EXPECT_EQ(1, cras_alsa_iodev_index_called);
-  EXPECT_EQ(1, snd_ctl_card_info_called);
-  EXPECT_EQ(cras_card_config_dir, device_config_dir);
-  EXPECT_EQ(0, ucm_get_sections_called);
-  EXPECT_EQ(0, cras_alsa_mixer_add_controls_in_section_called);
-
-  cras_alsa_card_destroy(c);
-  EXPECT_EQ(2, cras_alsa_iodev_destroy_called);
-  EXPECT_EQ(cras_alsa_iodev_create_return[1], cras_alsa_iodev_destroy_arg);
-  EXPECT_EQ(cras_alsa_mixer_create_called, cras_alsa_mixer_destroy_called);
-  EXPECT_EQ(iniparser_load_called, iniparser_freedict_called);
-}
-
-TEST(AlsaCard, CreateTwoDuplicateDeviceIndex) {
-  struct cras_alsa_card* c;
-  int dev_nums[] = {0, 0};
-  int info_rets[] = {0, -1, 0};
-  cras_alsa_card_info card_info;
-
-  ResetStubData();
-  snd_ctl_pcm_next_device_set_devs_size = ARRAY_SIZE(dev_nums);
-  snd_ctl_pcm_next_device_set_devs = dev_nums;
-  snd_ctl_pcm_info_rets_size = ARRAY_SIZE(info_rets);
-  snd_ctl_pcm_info_rets = info_rets;
-  card_info.card_type = ALSA_CARD_TYPE_INTERNAL;
-  card_info.card_index = 0;
-  c = cras_alsa_card_create(&card_info, device_config_dir, fake_blocklist,
-                            NULL);
-  EXPECT_NE(static_cast<struct cras_alsa_card*>(NULL), c);
-  EXPECT_EQ(snd_ctl_close_called, snd_ctl_open_called);
-  EXPECT_EQ(3, snd_ctl_pcm_next_device_called);
-  EXPECT_EQ(1, cras_alsa_iodev_create_called);
-  EXPECT_EQ(2, cras_alsa_iodev_legacy_complete_init_called);
-  EXPECT_EQ(1, cras_alsa_iodev_index_called);
-  EXPECT_EQ(1, snd_ctl_card_info_called);
-  EXPECT_EQ(cras_card_config_dir, device_config_dir);
-  EXPECT_EQ(0, ucm_get_sections_called);
-  EXPECT_EQ(0, cras_alsa_mixer_add_controls_in_section_called);
-
-  cras_alsa_card_destroy(c);
-  EXPECT_EQ(1, cras_alsa_iodev_destroy_called);
-  EXPECT_EQ(cras_alsa_iodev_create_return[0], cras_alsa_iodev_destroy_arg);
-  EXPECT_EQ(cras_alsa_mixer_create_called, cras_alsa_mixer_destroy_called);
-  EXPECT_EQ(iniparser_load_called, iniparser_freedict_called);
-}
-
-TEST(AlsaCard, CreateOneInput) {
-  struct cras_alsa_card* c;
-  int dev_nums[] = {0};
-  int info_rets[] = {-1, 0};
-  cras_alsa_card_info card_info;
-
-  ResetStubData();
-  snd_ctl_pcm_next_device_set_devs_size = ARRAY_SIZE(dev_nums);
-  snd_ctl_pcm_next_device_set_devs = dev_nums;
-  snd_ctl_pcm_info_rets_size = ARRAY_SIZE(info_rets);
-  snd_ctl_pcm_info_rets = info_rets;
-  card_info.card_type = ALSA_CARD_TYPE_INTERNAL;
-  card_info.card_index = 0;
-  c = cras_alsa_card_create(&card_info, device_config_dir, fake_blocklist,
-                            NULL);
-  EXPECT_NE(static_cast<struct cras_alsa_card*>(NULL), c);
-  EXPECT_EQ(snd_ctl_close_called, snd_ctl_open_called);
-  EXPECT_EQ(2, snd_ctl_pcm_next_device_called);
-  EXPECT_EQ(1, cras_alsa_iodev_create_called);
-  EXPECT_EQ(1, cras_alsa_iodev_legacy_complete_init_called);
-  EXPECT_EQ(0, cras_alsa_iodev_index_called);
-  EXPECT_EQ(cras_card_config_dir, device_config_dir);
-  EXPECT_EQ(0, ucm_get_sections_called);
-  EXPECT_EQ(0, cras_alsa_mixer_add_controls_in_section_called);
-
-  cras_alsa_card_destroy(c);
-  EXPECT_EQ(1, cras_alsa_iodev_destroy_called);
-  EXPECT_EQ(cras_alsa_iodev_create_return[0], cras_alsa_iodev_destroy_arg);
-  EXPECT_EQ(cras_alsa_mixer_create_called, cras_alsa_mixer_destroy_called);
-  EXPECT_EQ(iniparser_load_called, iniparser_freedict_called);
-}
-
-TEST(AlsaCard, CreateOneInputAndOneOutput) {
-  struct cras_alsa_card* c;
-  int dev_nums[] = {0};
-  int info_rets[] = {0, 0};
-  cras_alsa_card_info card_info;
-
-  ResetStubData();
-  snd_ctl_pcm_next_device_set_devs_size = ARRAY_SIZE(dev_nums);
-  snd_ctl_pcm_next_device_set_devs = dev_nums;
-  snd_ctl_pcm_info_rets_size = ARRAY_SIZE(info_rets);
-  snd_ctl_pcm_info_rets = info_rets;
-  card_info.card_type = ALSA_CARD_TYPE_INTERNAL;
-  card_info.card_index = 0;
-  c = cras_alsa_card_create(&card_info, device_config_dir, fake_blocklist,
-                            NULL);
-  EXPECT_NE(static_cast<struct cras_alsa_card*>(NULL), c);
-  EXPECT_EQ(snd_ctl_close_called, snd_ctl_open_called);
-  EXPECT_EQ(2, snd_ctl_pcm_next_device_called);
-  EXPECT_EQ(2, cras_alsa_iodev_create_called);
-  EXPECT_EQ(2, cras_alsa_iodev_legacy_complete_init_called);
-  EXPECT_EQ(0, cras_alsa_iodev_index_called);
-  EXPECT_EQ(cras_card_config_dir, device_config_dir);
-  EXPECT_EQ(0, ucm_get_sections_called);
-  EXPECT_EQ(0, cras_alsa_mixer_add_controls_in_section_called);
-
-  cras_alsa_card_destroy(c);
-  EXPECT_EQ(2, cras_alsa_iodev_destroy_called);
-  EXPECT_EQ(cras_alsa_iodev_create_return[1], cras_alsa_iodev_destroy_arg);
-  EXPECT_EQ(cras_alsa_mixer_create_called, cras_alsa_mixer_destroy_called);
-  EXPECT_EQ(iniparser_load_called, iniparser_freedict_called);
-}
-
-TEST(AlsaCard, CreateOneInputAndOneOutputTwoDevices) {
-  struct cras_alsa_card* c;
-  int dev_nums[] = {0, 3};
-  int info_rets[] = {0, -1, -1, 0};
-  cras_alsa_card_info card_info;
-
-  ResetStubData();
-  snd_ctl_pcm_next_device_set_devs_size = ARRAY_SIZE(dev_nums);
-  snd_ctl_pcm_next_device_set_devs = dev_nums;
-  snd_ctl_pcm_info_rets_size = ARRAY_SIZE(info_rets);
-  snd_ctl_pcm_info_rets = info_rets;
-  card_info.card_type = ALSA_CARD_TYPE_INTERNAL;
-  card_info.card_index = 0;
-  c = cras_alsa_card_create(&card_info, device_config_dir, fake_blocklist,
-                            NULL);
-  EXPECT_NE(static_cast<struct cras_alsa_card*>(NULL), c);
-  EXPECT_EQ(snd_ctl_close_called, snd_ctl_open_called);
-  EXPECT_EQ(3, snd_ctl_pcm_next_device_called);
-  EXPECT_EQ(2, cras_alsa_iodev_create_called);
-  EXPECT_EQ(2, cras_alsa_iodev_legacy_complete_init_called);
-  EXPECT_EQ(0, cras_alsa_iodev_index_called);
-  EXPECT_EQ(cras_card_config_dir, device_config_dir);
-  EXPECT_EQ(0, ucm_get_sections_called);
-  EXPECT_EQ(0, cras_alsa_mixer_add_controls_in_section_called);
-
-  cras_alsa_card_destroy(c);
-  EXPECT_EQ(2, cras_alsa_iodev_destroy_called);
-  EXPECT_EQ(cras_alsa_iodev_create_return[1], cras_alsa_iodev_destroy_arg);
-  EXPECT_EQ(cras_alsa_mixer_create_called, cras_alsa_mixer_destroy_called);
-  EXPECT_EQ(iniparser_load_called, iniparser_freedict_called);
-}
-
-TEST(AlsaCard, CreateOneOutputWithCoupledMixers) {
-  struct cras_alsa_card* c;
-  int dev_nums[] = {0};
-  int info_rets[] = {0, -1};
-  struct mixer_name *mixer_name_1, *mixer_name_2;
-  /* Use strdup because cras_alsa_card_create will delete it. */
-  const char *name1 = strdup("MixerName1"), *name2 = strdup("MixerName2");
-
-  cras_alsa_card_info card_info;
-
-  ResetStubData();
-  snd_ctl_pcm_next_device_set_devs_size = ARRAY_SIZE(dev_nums);
-  snd_ctl_pcm_next_device_set_devs = dev_nums;
-  snd_ctl_pcm_info_rets_size = ARRAY_SIZE(info_rets);
-  snd_ctl_pcm_info_rets = info_rets;
-  card_info.card_type = ALSA_CARD_TYPE_INTERNAL;
-  card_info.card_index = 0;
-
-  /* Creates a list of mixer names as return value of
-   * ucm_get_coupled_mixer_names. */
-  mixer_name_1 = (struct mixer_name*)malloc(sizeof(*mixer_name_1));
-  mixer_name_2 = (struct mixer_name*)malloc(sizeof(*mixer_name_2));
-  mixer_name_1->name = name1;
-  mixer_name_2->name = name2;
-  mixer_name_1->dir = CRAS_STREAM_OUTPUT;
-  mixer_name_2->dir = CRAS_STREAM_OUTPUT;
-  mixer_name_1->type = MIXER_NAME_VOLUME;
-  mixer_name_2->type = MIXER_NAME_VOLUME;
-
-  DL_APPEND(ucm_get_coupled_mixer_names_return_value, mixer_name_1);
-  DL_APPEND(ucm_get_coupled_mixer_names_return_value, mixer_name_2);
-
-  c = cras_alsa_card_create(&card_info, device_config_dir, fake_blocklist,
-                            NULL);
-
-  EXPECT_NE(static_cast<struct cras_alsa_card*>(NULL), c);
-  EXPECT_EQ(snd_ctl_close_called, snd_ctl_open_called);
-  EXPECT_EQ(2, snd_ctl_pcm_next_device_called);
-  EXPECT_EQ(1, cras_alsa_iodev_create_called);
-  EXPECT_EQ(1, cras_alsa_iodev_legacy_complete_init_called);
-  EXPECT_EQ(0, cras_alsa_iodev_index_called);
-  EXPECT_EQ(1, snd_ctl_card_info_called);
-  EXPECT_EQ(1, ucm_create_called);
-  EXPECT_EQ(1, ucm_get_dev_for_mixer_called);
-  EXPECT_EQ(1, ucm_get_flag_called);
-  EXPECT_EQ(0, strcmp(ucm_get_flag_name, "ExtraMainVolume"));
-  EXPECT_EQ(cras_card_config_dir, device_config_dir);
-  EXPECT_EQ(0, ucm_get_sections_called);
-  EXPECT_EQ(0, cras_alsa_mixer_add_controls_in_section_called);
-
-  /* Checks cras_alsa_card_create can handle the list and pass the names to
-   * cras_alsa_mixer_create. */
-  struct mixer_name* m_name = coupled_output_names_value;
-  EXPECT_EQ(0, m_name ? strcmp(m_name->name, "MixerName1") : 1);
-  if (m_name)
-    m_name = m_name->next;
-  EXPECT_EQ(0, m_name ? strcmp(m_name->name, "MixerName2") : 1);
-
-  cras_alsa_card_destroy(c);
-  EXPECT_EQ(1, ucm_destroy_called);
-  EXPECT_EQ(1, cras_alsa_iodev_destroy_called);
-  EXPECT_EQ(cras_alsa_iodev_create_return[0], cras_alsa_iodev_destroy_arg);
-  EXPECT_EQ(cras_alsa_mixer_create_called, cras_alsa_mixer_destroy_called);
-  EXPECT_EQ(iniparser_load_called, iniparser_freedict_called);
-
-  mixer_name_free(coupled_output_names_value);
-  coupled_output_names_value = NULL;
-}
-
-TEST(AlsaCard, CreateFullyUCMNoSections) {
-  struct cras_alsa_card* c;
-  cras_alsa_card_info card_info;
-
-  ResetStubData();
-  card_info.card_type = ALSA_CARD_TYPE_INTERNAL;
-  card_info.card_index = 0;
-  ucm_has_fully_specified_ucm_flag_return_value = 1;
-  ucm_get_sections_return_value = NULL;
-  c = cras_alsa_card_create(&card_info, device_config_dir, fake_blocklist,
-                            NULL);
-  EXPECT_EQ(static_cast<struct cras_alsa_card*>(NULL), c);
-  EXPECT_EQ(snd_ctl_close_called, snd_ctl_open_called);
-  EXPECT_EQ(0, cras_alsa_iodev_create_called);
-  EXPECT_EQ(0, cras_alsa_iodev_ucm_complete_init_called);
-  EXPECT_EQ(1, snd_ctl_card_info_called);
-  EXPECT_EQ(1, ucm_get_sections_called);
-  EXPECT_EQ(0, cras_alsa_mixer_add_controls_in_section_called);
-
-  cras_alsa_card_destroy(c);
-  EXPECT_EQ(1, ucm_destroy_called);
-  EXPECT_EQ(0, cras_alsa_iodev_destroy_called);
-  EXPECT_EQ(NULL, cras_alsa_iodev_destroy_arg);
-  EXPECT_EQ(cras_alsa_mixer_create_called, cras_alsa_mixer_destroy_called);
-  EXPECT_EQ(iniparser_load_called, iniparser_freedict_called);
-}
-
-TEST(AlsaCard, CreateFullyUCMTwoMainVolume) {
-  struct cras_alsa_card* c;
-  struct mixer_name *mixer_name_1, *mixer_name_2;
-  const char *name1 = strdup("MixerName1"), *name2 = strdup("MixerName2");
-  cras_alsa_card_info card_info;
-
-  ResetStubData();
-  card_info.card_type = ALSA_CARD_TYPE_INTERNAL;
-  card_info.card_index = 0;
-  ucm_has_fully_specified_ucm_flag_return_value = 1;
-
-  /* Creates a list of mixer names as return value of
-   * ucm_get_main_volume_names_return_value. */
-  mixer_name_1 = (struct mixer_name*)malloc(sizeof(*mixer_name_1));
-  mixer_name_2 = (struct mixer_name*)malloc(sizeof(*mixer_name_2));
-  mixer_name_1->name = name1;
-  mixer_name_2->name = name2;
-  mixer_name_1->dir = CRAS_STREAM_OUTPUT;
-  mixer_name_2->dir = CRAS_STREAM_OUTPUT;
-  mixer_name_1->type = MIXER_NAME_MAIN_VOLUME;
-  mixer_name_2->type = MIXER_NAME_MAIN_VOLUME;
-
-  DL_APPEND(ucm_get_main_volume_names_return_value, mixer_name_1);
-  DL_APPEND(ucm_get_main_volume_names_return_value, mixer_name_2);
-
-  c = cras_alsa_card_create(&card_info, device_config_dir, fake_blocklist,
-                            NULL);
-
-  EXPECT_EQ(static_cast<struct cras_alsa_card*>(NULL), c);
-  EXPECT_EQ(snd_ctl_close_called, snd_ctl_open_called);
-  EXPECT_EQ(0, cras_alsa_iodev_create_called);
-  EXPECT_EQ(0, cras_alsa_iodev_ucm_complete_init_called);
-  EXPECT_EQ(1, snd_ctl_card_info_called);
-  EXPECT_EQ(1, cras_alsa_mixer_add_main_volume_control_by_name_called);
-  EXPECT_EQ(1, ucm_get_sections_called);
-  EXPECT_EQ(0, cras_alsa_mixer_add_controls_in_section_called);
-
-  cras_alsa_card_destroy(c);
-  EXPECT_EQ(1, ucm_destroy_called);
-  EXPECT_EQ(0, cras_alsa_iodev_destroy_called);
-  EXPECT_EQ(NULL, cras_alsa_iodev_destroy_arg);
-  EXPECT_EQ(cras_alsa_mixer_create_called, cras_alsa_mixer_destroy_called);
-  EXPECT_EQ(iniparser_load_called, iniparser_freedict_called);
-}
-
-TEST(AlsaCard, TwoUCMSecionsDependentPCM) {
-  struct cras_alsa_card* c;
-  cras_alsa_card_info card_info;
-  struct ucm_section* sections = NULL;
-  struct ucm_section* section;
-
-  /* Create UCM so that MIC1 and MIC2 will be two nodes on the same iodev. */
-  section = ucm_section_create("MIC1", "hw:0,3", 0, -1, CRAS_STREAM_INPUT,
-                               "my-sound-card Headset Jack", "gpio");
-  DL_APPEND(sections, section);
-  section = ucm_section_create("MIC2", "hw:0,5", 0, 3, CRAS_STREAM_INPUT,
-                               "my-sound-card Headset Jack", "gpio");
-  DL_APPEND(sections, section);
-
-  ResetStubData();
-  int info_rets[] = {0, 0};
-  card_info.card_type = ALSA_CARD_TYPE_INTERNAL;
-  card_info.card_index = 0;
-  snd_ctl_pcm_info_rets_size = ARRAY_SIZE(info_rets);
-  snd_ctl_pcm_info_rets = info_rets;
-  ucm_has_fully_specified_ucm_flag_return_value = 1;
-  ucm_get_sections_return_value = sections;
-  ASSERT_NE(ucm_get_sections_return_value, (struct ucm_section*)NULL);
-
-  c = cras_alsa_card_create(&card_info, device_config_dir, fake_blocklist,
-                            NULL);
-
-  EXPECT_NE(static_cast<struct cras_alsa_card*>(NULL), c);
-  EXPECT_EQ(snd_ctl_close_called, snd_ctl_open_called);
-  EXPECT_EQ(1, snd_ctl_card_info_called);
-  EXPECT_EQ(1, ucm_get_sections_called);
-  EXPECT_EQ(1, snd_ctl_pcm_info_called);
-  EXPECT_EQ(2, cras_alsa_mixer_add_controls_in_section_called);
-  EXPECT_EQ(1, cras_alsa_iodev_create_called);
-  EXPECT_EQ(2, cras_alsa_iodev_ucm_add_nodes_and_jacks_called);
-  EXPECT_EQ(1, cras_alsa_iodev_ucm_complete_init_called);
-
-  cras_alsa_card_destroy(c);
-  EXPECT_EQ(1, ucm_destroy_called);
-  EXPECT_EQ(1, cras_alsa_iodev_destroy_called);
-  EXPECT_EQ(cras_alsa_iodev_create_return[0], cras_alsa_iodev_destroy_arg);
-  EXPECT_EQ(cras_alsa_mixer_create_called, cras_alsa_mixer_destroy_called);
-  EXPECT_EQ(iniparser_load_called, iniparser_freedict_called);
-}
-
-struct ucm_section* GenerateUcmSections(void) {
-  struct ucm_section* sections = NULL;
-  struct ucm_section* section;
-
-  section = ucm_section_create("Headphone", "hw:0,1", 0, -1, CRAS_STREAM_OUTPUT,
-                               "my-sound-card Headset Jack", "gpio");
-  ucm_section_add_coupled(section, "HP-L", MIXER_NAME_VOLUME);
-  ucm_section_add_coupled(section, "HP-R", MIXER_NAME_VOLUME);
-  DL_APPEND(sections, section);
-
-  section = ucm_section_create("Speaker", "hw:0,1", 0, -1, CRAS_STREAM_OUTPUT,
-                               NULL, NULL);
-  ucm_section_add_coupled(section, "SPK-L", MIXER_NAME_VOLUME);
-  ucm_section_add_coupled(section, "SPK-R", MIXER_NAME_VOLUME);
-  DL_APPEND(sections, section);
-
-  section = ucm_section_create("Internal Mic", "hw:0,1", 0, -1,
-                               CRAS_STREAM_INPUT, NULL, NULL);
-  ucm_section_add_coupled(section, "INT-MIC-L", MIXER_NAME_VOLUME);
-  ucm_section_add_coupled(section, "INT-MIC-R", MIXER_NAME_VOLUME);
-  DL_APPEND(sections, section);
-
-  section = ucm_section_create("Mic", "hw:0,1", 1, -1, CRAS_STREAM_INPUT,
-                               "my-sound-card Headset Jack", "gpio");
-  ucm_section_add_coupled(section, "MIC-L", MIXER_NAME_VOLUME);
-  ucm_section_add_coupled(section, "MIC-R", MIXER_NAME_VOLUME);
-  DL_APPEND(sections, section);
-
-  section = ucm_section_create("HDMI", "hw:0,1", 2, -1, CRAS_STREAM_OUTPUT,
-                               NULL, NULL);
-  ucm_section_set_mixer_name(section, "HDMI");
-  DL_APPEND(sections, section);
-
-  return sections;
-}
-
-TEST(AlsaCard, CreateFullyUCMFailureOnControls) {
-  struct cras_alsa_card* c;
-  cras_alsa_card_info card_info;
-
-  ResetStubData();
-  card_info.card_type = ALSA_CARD_TYPE_INTERNAL;
-  card_info.card_index = 0;
-  ucm_has_fully_specified_ucm_flag_return_value = 1;
-  ucm_get_sections_return_value = GenerateUcmSections();
-  ASSERT_NE(ucm_get_sections_return_value, (struct ucm_section*)NULL);
-
-  cras_alsa_mixer_add_controls_in_section_return_value = -EINVAL;
-
-  c = cras_alsa_card_create(&card_info, device_config_dir, fake_blocklist,
-                            NULL);
-
-  EXPECT_EQ(static_cast<struct cras_alsa_card*>(NULL), c);
-  EXPECT_EQ(snd_ctl_close_called, snd_ctl_open_called);
-  EXPECT_EQ(1, snd_ctl_card_info_called);
-  EXPECT_EQ(1, ucm_get_sections_called);
-  EXPECT_EQ(1, cras_alsa_mixer_add_controls_in_section_called);
-  EXPECT_EQ(0, cras_alsa_iodev_create_called);
-  EXPECT_EQ(0, cras_alsa_iodev_ucm_complete_init_called);
-
-  cras_alsa_card_destroy(c);
-  EXPECT_EQ(1, ucm_destroy_called);
-  EXPECT_EQ(0, cras_alsa_iodev_destroy_called);
-  EXPECT_EQ(NULL, cras_alsa_iodev_destroy_arg);
-  EXPECT_EQ(cras_alsa_mixer_create_called, cras_alsa_mixer_destroy_called);
-  EXPECT_EQ(iniparser_load_called, iniparser_freedict_called);
-}
-
-TEST(AlsaCard, CreateFullyUCMFourDevicesFiveSections) {
-  struct cras_alsa_card* c;
-  cras_alsa_card_info card_info;
-  int info_rets[] = {0, 0, 0, 0, 0, -1};
-
-  ResetStubData();
-  card_info.card_type = ALSA_CARD_TYPE_INTERNAL;
-  card_info.card_index = 0;
-  snd_ctl_pcm_info_rets_size = ARRAY_SIZE(info_rets);
-  snd_ctl_pcm_info_rets = info_rets;
-  ucm_has_fully_specified_ucm_flag_return_value = 1;
-  ucm_get_sections_return_value = GenerateUcmSections();
-  cras_alsa_iodev_index_return[cras_alsa_iodev_create_return[0]] = 0;
-  cras_alsa_iodev_index_return[cras_alsa_iodev_create_return[1]] = 0;
-  cras_alsa_iodev_index_return[cras_alsa_iodev_create_return[2]] = 1;
-  cras_alsa_iodev_index_return[cras_alsa_iodev_create_return[3]] = 2;
-  ASSERT_NE(ucm_get_sections_return_value, (struct ucm_section*)NULL);
-
-  c = cras_alsa_card_create(&card_info, device_config_dir, fake_blocklist,
-                            NULL);
-
-  EXPECT_NE(static_cast<struct cras_alsa_card*>(NULL), c);
-  EXPECT_EQ(snd_ctl_close_called, snd_ctl_open_called);
-  EXPECT_EQ(1, snd_ctl_card_info_called);
-  EXPECT_EQ(1, ucm_get_sections_called);
-  EXPECT_EQ(5, snd_ctl_pcm_info_called);
-  EXPECT_EQ(5, cras_alsa_mixer_add_controls_in_section_called);
-  EXPECT_EQ(4, cras_alsa_iodev_create_called);
-  EXPECT_EQ(5, cras_alsa_iodev_ucm_add_nodes_and_jacks_called);
-  EXPECT_EQ(4, cras_alsa_iodev_ucm_complete_init_called);
-
-  cras_alsa_card_destroy(c);
-  EXPECT_EQ(1, ucm_destroy_called);
-  EXPECT_EQ(4, cras_alsa_iodev_destroy_called);
-  EXPECT_EQ(cras_alsa_iodev_create_return[3], cras_alsa_iodev_destroy_arg);
-  EXPECT_EQ(cras_alsa_mixer_create_called, cras_alsa_mixer_destroy_called);
-  EXPECT_EQ(iniparser_load_called, iniparser_freedict_called);
-}
-
-TEST(AlsaCard, GG) {
-  struct cras_alsa_card* c;
-  cras_alsa_card_info card_info;
-  int info_rets[] = {0, 0, 0, 0, 0, -1};
-  struct cras_ionode nodes[4];
-  const char* echo_ref = "echo ref";
-
-  ResetStubData();
-  card_info.card_type = ALSA_CARD_TYPE_INTERNAL;
-  card_info.card_index = 0;
-  snd_ctl_pcm_info_rets_size = ARRAY_SIZE(info_rets);
-  snd_ctl_pcm_info_rets = info_rets;
-  ucm_has_fully_specified_ucm_flag_return_value = 1;
-  ucm_get_sections_return_value = GenerateUcmSections();
-
-  fake_dev1.nodes = nodes;
-  fake_dev2.nodes = nodes + 1;
-  fake_dev3.nodes = nodes + 2;
-  fake_dev4.nodes = nodes + 3;
-  snprintf(nodes[0].name, CRAS_NODE_NAME_BUFFER_SIZE, "dev1");
-  snprintf(nodes[1].name, CRAS_NODE_NAME_BUFFER_SIZE, "dev2");
-  snprintf(nodes[2].name, CRAS_NODE_NAME_BUFFER_SIZE, "dev3");
-  snprintf(nodes[3].name, CRAS_NODE_NAME_BUFFER_SIZE, "echo ref");
-
-  ucm_get_echo_reference_dev_name_for_dev_return_value[0] = strdup(echo_ref);
-
-  c = cras_alsa_card_create(&card_info, device_config_dir, fake_blocklist,
-                            NULL);
-
-  EXPECT_NE(static_cast<struct cras_alsa_card*>(NULL), c);
-  EXPECT_EQ(fake_dev1.echo_reference_dev, &fake_dev4);
-  cras_alsa_card_destroy(c);
-}
-
-TEST(AlsaCard, UCMSuffix) {
-  struct cras_alsa_card* c;
-  cras_alsa_card_info card_info;
-  int info_rets[] = {0, 0, 0, 0, 0, -1};
-
-  ResetStubData();
-  card_info.card_type = ALSA_CARD_TYPE_INTERNAL;
-  card_info.card_index = 0;
-  snd_ctl_pcm_info_rets_size = ARRAY_SIZE(info_rets);
-  snd_ctl_pcm_info_rets = info_rets;
-  ucm_has_fully_specified_ucm_flag_return_value = 1;
-  ucm_get_sections_return_value = GenerateUcmSections();
-  c = cras_alsa_card_create(&card_info, device_config_dir, fake_blocklist,
-                            "1mic");
-  EXPECT_EQ(0, strcmp(ucm_create_name, "TestName.1mic"));
-  EXPECT_EQ(1, cras_system_check_ignore_ucm_suffix_called);
-  cras_alsa_card_destroy(c);
-}
-
-TEST(AlsaCard, UCMIgnoreSuffix) {
-  struct cras_alsa_card* c;
-  cras_alsa_card_info card_info;
-  int info_rets[] = {0, 0, 0, 0, 0, -1};
-
-  ResetStubData();
-  card_info.card_type = ALSA_CARD_TYPE_INTERNAL;
-  card_info.card_index = 0;
-  snd_ctl_pcm_info_rets_size = ARRAY_SIZE(info_rets);
-  snd_ctl_pcm_info_rets = info_rets;
-  ucm_has_fully_specified_ucm_flag_return_value = 1;
-  ucm_get_sections_return_value = GenerateUcmSections();
-  cras_system_check_ignore_ucm_suffix_value = true;
-  c = cras_alsa_card_create(&card_info, device_config_dir, fake_blocklist,
-                            "1mic");
-  EXPECT_EQ(0, strcmp(ucm_create_name, "TestName"));
-  EXPECT_EQ(1, cras_system_check_ignore_ucm_suffix_called);
-  cras_alsa_card_destroy(c);
-}
-
-/* Stubs */
-
-extern "C" {
-struct cras_alsa_mixer* cras_alsa_mixer_create(const char* card_name) {
-  cras_alsa_mixer_create_called++;
-  return cras_alsa_mixer_create_return;
-}
-
-int cras_alsa_mixer_add_controls_by_name_matching(
-    struct cras_alsa_mixer* cmix,
-    struct mixer_name* extra_controls,
-    struct mixer_name* coupled_controls) {
-  /* Duplicate coupled_output_names to verify in the end of unittest
-   * because names will get freed later in cras_alsa_card_create. */
-  struct mixer_name* control;
-  DL_FOREACH (coupled_controls, control) {
-    coupled_output_names_value =
-        mixer_name_add(coupled_output_names_value, control->name,
-                       CRAS_STREAM_OUTPUT, control->type);
-  }
-  return 0;
-}
-
-void cras_alsa_mixer_destroy(struct cras_alsa_mixer* cras_mixer) {
-  cras_alsa_mixer_destroy_called++;
-}
-
-struct cras_iodev* alsa_iodev_create(size_t card_index,
-                                     const char* card_name,
-                                     size_t device_index,
-                                     const char* pcm_name,
-                                     const char* dev_name,
-                                     const char* dev_id,
-                                     enum CRAS_ALSA_CARD_TYPE card_type,
-                                     int is_first,
-                                     struct cras_alsa_mixer* mixer,
-                                     const struct cras_card_config* config,
-                                     struct cras_use_case_mgr* ucm,
-                                     snd_hctl_t* hctl,
-                                     enum CRAS_STREAM_DIRECTION direction,
-                                     size_t usb_vid,
-                                     size_t usb_pid,
-                                     char* usb_serial_number) {
-  struct cras_iodev* result = NULL;
-  if (cras_alsa_iodev_create_called < cras_alsa_iodev_create_return_size)
-    result = cras_alsa_iodev_create_return[cras_alsa_iodev_create_called];
-  cras_alsa_iodev_create_called++;
-  return result;
-}
-void alsa_iodev_destroy(struct cras_iodev* iodev) {
-  cras_alsa_iodev_destroy_called++;
-  cras_alsa_iodev_destroy_arg = iodev;
-}
-int alsa_iodev_legacy_complete_init(struct cras_iodev* iodev) {
-  cras_alsa_iodev_legacy_complete_init_called++;
-  return 0;
-}
-int alsa_iodev_ucm_add_nodes_and_jacks(struct cras_iodev* iodev,
-                                       struct ucm_section* section) {
-  cras_alsa_iodev_ucm_add_nodes_and_jacks_called++;
-  return 0;
-}
-void alsa_iodev_ucm_complete_init(struct cras_iodev* iodev) {
-  cras_alsa_iodev_ucm_complete_init_called++;
-}
-unsigned alsa_iodev_index(struct cras_iodev* iodev) {
-  std::map<struct cras_iodev*, unsigned int>::iterator i;
-  cras_alsa_iodev_index_called++;
-  i = cras_alsa_iodev_index_return.find(iodev);
-  if (i != cras_alsa_iodev_index_return.end())
-    return i->second;
-  return 0;
-}
-int alsa_iodev_has_hctl_jacks(struct cras_iodev* iodev) {
-  return alsa_iodev_has_hctl_jacks_return;
-}
-
-size_t snd_pcm_info_sizeof() {
-  return 10;
-}
-size_t snd_ctl_card_info_sizeof() {
-  return 10;
-}
-int snd_ctl_open(snd_ctl_t** handle, const char* name, int card) {
-  snd_ctl_open_called++;
-  if (snd_ctl_open_return == 0)
-    *handle = reinterpret_cast<snd_ctl_t*>(0xff);
-  else
-    *handle = NULL;
-  return snd_ctl_open_return;
-}
-int snd_ctl_close(snd_ctl_t* handle) {
-  snd_ctl_close_called++;
-  return snd_ctl_close_return;
-}
-int snd_ctl_pcm_next_device(snd_ctl_t* ctl, int* device) {
-  if (snd_ctl_pcm_next_device_return_error) {
-    *device = 10;
-    return -1;
-  }
-  snd_ctl_pcm_next_device_called++;
-  if (snd_ctl_pcm_next_device_set_devs_index >=
-      snd_ctl_pcm_next_device_set_devs_size) {
-    *device = -1;
-    return 0;
-  }
-  *device =
-      snd_ctl_pcm_next_device_set_devs[snd_ctl_pcm_next_device_set_devs_index];
-  snd_ctl_pcm_next_device_set_devs_index++;
-  return 0;
-}
-void snd_pcm_info_set_device(snd_pcm_info_t* obj, unsigned int val) {}
-void snd_pcm_info_set_subdevice(snd_pcm_info_t* obj, unsigned int val) {}
-void snd_pcm_info_set_stream(snd_pcm_info_t* obj, snd_pcm_stream_t val) {}
-const char* snd_pcm_info_get_name(const snd_pcm_info_t* obj) {
-  return "Fake device name";
-}
-const char* snd_pcm_info_get_id(const snd_pcm_info_t* obj) {
-  return "Fake device id";
-}
-int snd_ctl_pcm_info(snd_ctl_t* ctl, snd_pcm_info_t* info) {
-  int ret;
-  snd_ctl_pcm_info_called++;
-  if (snd_ctl_pcm_info_rets_index >= snd_ctl_pcm_info_rets_size) {
-    return -1;
-  }
-  ret = snd_ctl_pcm_info_rets[snd_ctl_pcm_info_rets_index];
-  snd_ctl_pcm_info_rets_index++;
-  return ret;
-}
-int snd_ctl_card_info(snd_ctl_t* ctl, snd_ctl_card_info_t* info) {
-  snd_ctl_card_info_called++;
-  return snd_ctl_card_info_ret;
-}
-const char* snd_ctl_card_info_get_name(const snd_ctl_card_info_t* obj) {
-  return "TestName";
-}
-const char* snd_ctl_card_info_get_id(const snd_ctl_card_info_t* obj) {
-  return "TestId";
-}
-int snd_hctl_open(snd_hctl_t** hctlp, const char* name, int mode) {
-  *hctlp = snd_hctl_open_pointer_val;
-  snd_hctl_open_called++;
-  return snd_hctl_open_return_value;
-}
-int snd_hctl_nonblock(snd_hctl_t* hctl, int nonblock) {
-  snd_hctl_nonblock_called++;
-  return 0;
-}
-int snd_hctl_load(snd_hctl_t* hctl) {
-  snd_hctl_load_called++;
-  return snd_hctl_load_return_value;
-}
-int snd_hctl_close(snd_hctl_t* hctl) {
-  snd_hctl_close_called++;
-  return 0;
-}
-int snd_hctl_poll_descriptors_count(snd_hctl_t* hctl) {
-  return snd_hctl_poll_descriptors_num_fds;
-}
-int snd_hctl_poll_descriptors(snd_hctl_t* hctl,
-                              struct pollfd* pfds,
-                              unsigned int space) {
-  unsigned int num = MIN(space, snd_hctl_poll_descriptors_num_fds);
-  memcpy(pfds, snd_hctl_poll_descriptors_fds, num * sizeof(*pfds));
-  snd_hctl_poll_descriptors_called++;
-  return num;
-}
-int snd_hctl_handle_events(snd_hctl_t* hctl) {
-  snd_hctl_handle_events_called++;
-  return 0;
-}
-
-int cras_system_add_select_fd(int fd,
-                              void (*callback)(void* data),
-                              void* callback_data) {
-  cras_system_add_select_fd_called++;
-  cras_system_add_select_fd_values.push_back(fd);
-  return 0;
-}
-void cras_system_rm_select_fd(int fd) {
-  cras_system_rm_select_fd_called++;
-  cras_system_rm_select_fd_values.push_back(fd);
-}
-
-struct cras_card_config* cras_card_config_create(const char* config_path,
-                                                 const char* card_name) {
-  cras_card_config_dir = config_path;
-  return NULL;
-}
-
-void cras_card_config_destroy(struct cras_card_config* card_config) {}
-
-struct cras_volume_curve* cras_card_config_get_volume_curve_for_control(
-    const struct cras_card_config* card_config,
-    const char* control_name) {
-  return NULL;
-}
-
-int cras_device_blocklist_check(struct cras_device_blocklist* blocklist,
-                                unsigned vendor_id,
-                                unsigned product_id,
-                                unsigned device_index) {
-  EXPECT_EQ(fake_blocklist, blocklist);
-
-  return cras_device_blocklist_check_retval;
-}
-
-struct cras_use_case_mgr* ucm_create(const char* name) {
-  ucm_create_called++;
-  strncpy(ucm_create_name, name, sizeof(ucm_create_name) - 1);
-  return reinterpret_cast<struct cras_use_case_mgr*>(0x44);
-}
-
-void ucm_destroy(struct cras_use_case_mgr* mgr) {
-  ucm_destroy_called++;
-}
-
-char* ucm_get_dev_for_mixer(struct cras_use_case_mgr* mgr,
-                            const char* mixer,
-                            enum CRAS_STREAM_DIRECTION dir) {
-  ucm_get_dev_for_mixer_called++;
-  return strdup("device");
-}
-
-char* ucm_get_flag(struct cras_use_case_mgr* mgr, const char* flag_name) {
-  ucm_get_flag_called++;
-  strncpy(ucm_get_flag_name, flag_name, sizeof(ucm_get_flag_name) - 1);
-  return NULL;
-}
-
-struct mixer_name* ucm_get_coupled_mixer_names(struct cras_use_case_mgr* mgr,
-                                               const char* dev) {
-  return ucm_get_coupled_mixer_names_return_value;
-}
-
-int ucm_has_fully_specified_ucm_flag(struct cras_use_case_mgr* mgr) {
-  return ucm_has_fully_specified_ucm_flag_return_value;
-}
-
-struct mixer_name* ucm_get_main_volume_names(struct cras_use_case_mgr* mgr) {
-  return ucm_get_main_volume_names_return_value;
-}
-
-struct ucm_section* ucm_get_sections(struct cras_use_case_mgr* mgr) {
-  ucm_get_sections_called++;
-  return ucm_get_sections_return_value;
-}
-const char* ucm_get_echo_reference_dev_name_for_dev(
-    struct cras_use_case_mgr* mgr,
-    const char* dev) {
-  int idx = ucm_get_echo_reference_dev_name_for_dev_called++;
-  return ucm_get_echo_reference_dev_name_for_dev_return_value[idx];
-}
-
-int cras_alsa_mixer_add_main_volume_control_by_name(
-    struct cras_alsa_mixer* cmix,
-    struct mixer_name* mixer_names) {
-  cras_alsa_mixer_add_main_volume_control_by_name_called++;
-  return cras_alsa_mixer_add_main_volume_control_by_name_return_value;
-}
-
-int cras_alsa_mixer_add_controls_in_section(struct cras_alsa_mixer* cmix,
-                                            struct ucm_section* section) {
-  cras_alsa_mixer_add_controls_in_section_called++;
-  return cras_alsa_mixer_add_controls_in_section_return_value;
-}
-
-bool cras_system_check_ignore_ucm_suffix(const char* card_name) {
-  cras_system_check_ignore_ucm_suffix_called++;
-  return cras_system_check_ignore_ucm_suffix_value;
-}
-
-void ucm_free_mixer_names(struct mixer_name* names) {
-  struct mixer_name* m;
-  DL_FOREACH (names, m) {
-    DL_DELETE(names, m);
-    free((void*)m->name);
-    free(m);
-  }
-}
-
-} /* extern "C" */
-
-}  //  namespace
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  openlog(NULL, LOG_PERROR, LOG_USER);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tests/alsa_helpers_unittest.cc b/cras/src/tests/alsa_helpers_unittest.cc
deleted file mode 100644
index 32df30a..0000000
--- a/cras/src/tests/alsa_helpers_unittest.cc
+++ /dev/null
@@ -1,293 +0,0 @@
-// Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <gtest/gtest.h>
-
-#include <vector>
-
-extern "C" {
-// For static function test.
-#include "cras_alsa_helpers.c"
-}
-
-static int snd_pcm_sw_params_set_tstamp_type_called;
-static int snd_pcm_sw_params_set_tstamp_mode_called;
-static snd_pcm_uframes_t snd_pcm_htimestamp_avail_ret_val;
-static timespec snd_pcm_htimestamp_tstamp_ret_val;
-static std::vector<int> snd_pcm_sw_params_ret_vals;
-
-static void ResetStubData() {
-  snd_pcm_sw_params_set_tstamp_type_called = 0;
-  snd_pcm_sw_params_set_tstamp_mode_called = 0;
-  snd_pcm_htimestamp_avail_ret_val = 0;
-  snd_pcm_htimestamp_tstamp_ret_val.tv_sec = 0;
-  snd_pcm_htimestamp_tstamp_ret_val.tv_nsec = 0;
-  snd_pcm_sw_params_ret_vals.clear();
-}
-
-namespace {
-
-static snd_pcm_chmap_query_t* create_chmap_cap(snd_pcm_chmap_type type,
-                                               size_t channels) {
-  snd_pcm_chmap_query_t* c;
-  c = (snd_pcm_chmap_query_t*)calloc(channels + 2, sizeof(int));
-  c->type = type;
-  c->map.channels = channels;
-  return c;
-}
-
-TEST(AlsaHelper, MatchChannelMapCapabilityStereo) {
-  snd_pcm_chmap_query_t** caps;
-  snd_pcm_chmap_query_t* c;
-  struct cras_audio_format* fmt;
-
-  caps = (snd_pcm_chmap_query_t**)calloc(4, sizeof(*caps));
-
-  /* Layout (CRAS_CH_RL, CRAS_CH_RR) corresponds to
-   * ALSA channel map (5, 6)
-   */
-  int8_t channel_layout[CRAS_CH_MAX] = {-1, -1, 0,  1,  -1, -1,
-                                        -1, -1, -1, -1, -1};
-
-  fmt = cras_audio_format_create(SND_PCM_FORMAT_S16_LE, 44100, 2);
-  cras_audio_format_set_channel_layout(fmt, channel_layout);
-
-  /* Create a list of capabilities */
-  c = create_chmap_cap(SND_CHMAP_TYPE_FIXED, 3);
-  c->map.pos[0] = 3;
-  c->map.pos[1] = 4;
-  c->map.pos[2] = 5;
-  caps[0] = c;
-
-  c = create_chmap_cap(SND_CHMAP_TYPE_VAR, 2);
-  c->map.pos[0] = 5;
-  c->map.pos[1] = 6;
-  caps[1] = c;
-
-  c = create_chmap_cap(SND_CHMAP_TYPE_VAR, 2);
-  c->map.pos[0] = 9;
-  c->map.pos[1] = 10;
-  caps[2] = c;
-
-  caps[3] = NULL;
-
-  /* Test if there's a cap matches fmt */
-  c = cras_chmap_caps_match(caps, fmt);
-  ASSERT_NE((void*)NULL, c);
-
-  caps[1]->map.pos[0] = 5;
-  caps[1]->map.pos[1] = 7;
-
-  c = cras_chmap_caps_match(caps, fmt);
-  ASSERT_EQ((void*)NULL, c);
-
-  free(caps[0]);
-  free(caps[1]);
-  free(caps[2]);
-  free(caps[3]);
-  free(caps);
-  cras_audio_format_destroy(fmt);
-}
-
-TEST(AlsaHelper, MatchChannelMapCapability51) {
-  snd_pcm_chmap_query_t** caps = NULL;
-  snd_pcm_chmap_query_t* c = NULL;
-  struct cras_audio_format* fmt;
-
-  caps = (snd_pcm_chmap_query_t**)calloc(4, sizeof(*caps));
-
-  /* Layout (CRAS_CH_FL, CRAS_CH_FR, CRAS_CH_RL, CRAS_CH_RR, CRAS_CH_FC)
-   * corresponds to ALSA channel map (3, 4, 5, 6, 7)
-   */
-  int8_t channel_layout[CRAS_CH_MAX] = {0, 1, 2, 3, 4, 5, -1, -1, -1, -1, -1};
-
-  fmt = cras_audio_format_create(SND_PCM_FORMAT_S16_LE, 44100, 6);
-  cras_audio_format_set_channel_layout(fmt, channel_layout);
-
-  /* Create a list of capabilities */
-  c = create_chmap_cap(SND_CHMAP_TYPE_FIXED, 6);
-  c->map.pos[0] = 3;
-  c->map.pos[1] = 4;
-  c->map.pos[2] = 5;
-  c->map.pos[3] = 6;
-  c->map.pos[4] = 7;
-  c->map.pos[5] = 8;
-  caps[0] = c;
-
-  c = create_chmap_cap(SND_CHMAP_TYPE_VAR, 2);
-  c->map.pos[0] = 6;
-  c->map.pos[1] = 4;
-  caps[1] = c;
-
-  c = create_chmap_cap(SND_CHMAP_TYPE_VAR, 6);
-  c->map.pos[0] = 9;
-  c->map.pos[1] = 10;
-  c->map.pos[2] = 5;
-  c->map.pos[3] = 6;
-  c->map.pos[4] = 7;
-  c->map.pos[5] = 8;
-  caps[2] = c;
-  caps[3] = NULL;
-
-  /* Test if there's a cap matches fmt */
-  c = cras_chmap_caps_match(caps, fmt);
-  ASSERT_NE((void*)NULL, c);
-
-  caps[0]->map.pos[0] = 7;
-  caps[0]->map.pos[1] = 8;
-  caps[0]->map.pos[4] = 3;
-  caps[0]->map.pos[5] = 4;
-  c = cras_chmap_caps_match(caps, fmt);
-  ASSERT_EQ((void*)NULL, c);
-
-  caps[0]->type = SND_CHMAP_TYPE_PAIRED;
-  c = cras_chmap_caps_match(caps, fmt);
-  ASSERT_NE((void*)NULL, c);
-
-  caps[0]->map.pos[0] = 8;
-  caps[0]->map.pos[1] = 7;
-  c = cras_chmap_caps_match(caps, fmt);
-  ASSERT_EQ((void*)NULL, c);
-
-  caps[0]->type = SND_CHMAP_TYPE_VAR;
-  c = cras_chmap_caps_match(caps, fmt);
-  ASSERT_NE((void*)NULL, c);
-
-  free(caps[0]);
-  free(caps[1]);
-  free(caps[2]);
-  free(caps[3]);
-  free(caps);
-  cras_audio_format_destroy(fmt);
-}
-
-TEST(AlsaHelper, Htimestamp) {
-  snd_pcm_t* mock_handle = reinterpret_cast<snd_pcm_t*>(0x1);
-  snd_pcm_uframes_t used;
-  snd_pcm_uframes_t severe_underrun_frames = 480;
-  struct timespec tstamp;
-  const char* dev_name = "dev_name";
-
-  ResetStubData();
-  tstamp.tv_sec = 0;
-  tstamp.tv_nsec = 0;
-  snd_pcm_htimestamp_avail_ret_val = 20000;
-  snd_pcm_htimestamp_tstamp_ret_val.tv_sec = 10;
-  snd_pcm_htimestamp_tstamp_ret_val.tv_nsec = 10000;
-
-  cras_alsa_get_avail_frames(mock_handle, 48000, severe_underrun_frames,
-                             dev_name, &used, &tstamp);
-  EXPECT_EQ(used, snd_pcm_htimestamp_avail_ret_val);
-  EXPECT_EQ(tstamp.tv_sec, snd_pcm_htimestamp_tstamp_ret_val.tv_sec);
-  EXPECT_EQ(tstamp.tv_nsec, snd_pcm_htimestamp_tstamp_ret_val.tv_nsec);
-}
-
-TEST(AlsaHelper, GetAvailFramesSevereUnderrun) {
-  snd_pcm_t* mock_handle = reinterpret_cast<snd_pcm_t*>(0x1);
-  snd_pcm_uframes_t avail;
-  snd_pcm_uframes_t severe_underrun_frames = 480;
-  snd_pcm_uframes_t buffer_size = 48000;
-  struct timespec tstamp;
-  int rc;
-  const char* dev_name = "dev_name";
-
-  ResetStubData();
-  snd_pcm_htimestamp_avail_ret_val = buffer_size + severe_underrun_frames + 1;
-  rc = cras_alsa_get_avail_frames(mock_handle, buffer_size,
-                                  severe_underrun_frames, dev_name, &avail,
-                                  &tstamp);
-  // Returns -EPIPE when severe underrun happens.
-  EXPECT_EQ(rc, -EPIPE);
-
-  ResetStubData();
-  snd_pcm_htimestamp_avail_ret_val = buffer_size + severe_underrun_frames;
-  rc = cras_alsa_get_avail_frames(mock_handle, buffer_size,
-                                  severe_underrun_frames, dev_name, &avail,
-                                  &tstamp);
-  // Underrun which is not severe enough will be masked.
-  // avail will be adjusted to buffer_size.
-  EXPECT_EQ(avail, buffer_size);
-  EXPECT_EQ(rc, 0);
-
-  ResetStubData();
-  snd_pcm_htimestamp_avail_ret_val = buffer_size - 1;
-  rc = cras_alsa_get_avail_frames(mock_handle, buffer_size,
-                                  severe_underrun_frames, dev_name, &avail,
-                                  &tstamp);
-  // When avail < buffer_size, there is no underrun.
-  EXPECT_EQ(avail, buffer_size - 1);
-  EXPECT_EQ(rc, 0);
-}
-}  // namespace
-
-extern "C" {
-
-int snd_pcm_sw_params_current(snd_pcm_t* pcm, snd_pcm_sw_params_t* params) {
-  return 0;
-}
-
-int snd_pcm_sw_params_get_boundary(const snd_pcm_sw_params_t* params,
-                                   snd_pcm_uframes_t* val) {
-  return 0;
-}
-
-int snd_pcm_sw_params_set_stop_threshold(snd_pcm_t* pcm,
-                                         snd_pcm_sw_params_t* params,
-                                         snd_pcm_uframes_t val) {
-  return 0;
-}
-
-int snd_pcm_sw_params_set_start_threshold(snd_pcm_t* pcm,
-                                          snd_pcm_sw_params_t* params,
-                                          snd_pcm_uframes_t val) {
-  return 0;
-}
-
-int snd_pcm_sw_params_set_period_event(snd_pcm_t* pcm,
-                                       snd_pcm_sw_params_t* params,
-                                       int val) {
-  return 0;
-}
-
-int snd_pcm_sw_params_set_tstamp_mode(snd_pcm_t* pcm,
-                                      snd_pcm_sw_params_t* params,
-                                      snd_pcm_tstamp_t val) {
-  snd_pcm_sw_params_set_tstamp_mode_called++;
-  return 0;
-}
-
-int snd_pcm_sw_params_set_tstamp_type(snd_pcm_t* pcm,
-                                      snd_pcm_sw_params_t* params,
-                                      snd_pcm_tstamp_type_t val) {
-  snd_pcm_sw_params_set_tstamp_type_called++;
-  return 0;
-}
-
-int snd_pcm_sw_params(snd_pcm_t* pcm, snd_pcm_sw_params_t* params) {
-  int rc;
-
-  if (snd_pcm_sw_params_ret_vals.size() == 0)
-    return 0;
-  rc = snd_pcm_sw_params_ret_vals.back();
-  snd_pcm_sw_params_ret_vals.pop_back();
-  return rc;
-}
-
-snd_pcm_sframes_t snd_pcm_avail(snd_pcm_t* pcm) {
-  return snd_pcm_htimestamp_avail_ret_val;
-}
-
-int snd_pcm_htimestamp(snd_pcm_t* pcm,
-                       snd_pcm_uframes_t* avail,
-                       snd_htimestamp_t* tstamp) {
-  *avail = snd_pcm_htimestamp_avail_ret_val;
-  *tstamp = snd_pcm_htimestamp_tstamp_ret_val;
-  return 0;
-}
-}
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tests/alsa_io_unittest.cc b/cras/src/tests/alsa_io_unittest.cc
deleted file mode 100644
index 021b478..0000000
--- a/cras/src/tests/alsa_io_unittest.cc
+++ /dev/null
@@ -1,3045 +0,0 @@
-// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <gtest/gtest.h>
-#include <stdio.h>
-#include <syslog.h>
-
-#include <map>
-#include <vector>
-
-extern "C" {
-
-#include "cras_alsa_mixer.h"
-#include "cras_iodev.h"
-#include "cras_shm.h"
-#include "cras_system_state.h"
-#include "cras_types.h"
-
-//  Include C file to test static functions.
-#include "cras_alsa_io.c"
-}
-
-#define BUFFER_SIZE 8192
-
-//  Data for simulating functions stubbed below.
-static int cras_alsa_open_called;
-static int cras_iodev_append_stream_ret;
-static int cras_alsa_get_avail_frames_ret;
-static int cras_alsa_get_avail_frames_avail;
-static int cras_alsa_start_called;
-static uint8_t* cras_alsa_mmap_begin_buffer;
-static size_t cras_alsa_mmap_begin_frames;
-static size_t cras_alsa_fill_properties_called;
-static bool cras_alsa_support_8_channels;
-static size_t alsa_mixer_set_dBFS_called;
-static int alsa_mixer_set_dBFS_value;
-static const struct mixer_control* alsa_mixer_set_dBFS_output;
-static size_t alsa_mixer_set_capture_dBFS_called;
-static int alsa_mixer_set_capture_dBFS_value;
-static const struct mixer_control* alsa_mixer_set_capture_dBFS_input;
-static const struct mixer_control*
-    cras_alsa_mixer_get_minimum_capture_gain_mixer_input;
-static const struct mixer_control*
-    cras_alsa_mixer_get_maximum_capture_gain_mixer_input;
-static size_t cras_alsa_mixer_list_outputs_called;
-static size_t cras_alsa_mixer_list_inputs_called;
-static size_t cras_alsa_mixer_get_control_for_section_called;
-static struct mixer_control*
-    cras_alsa_mixer_get_control_for_section_return_value;
-static size_t sys_get_volume_called;
-static size_t sys_get_volume_return_value;
-static size_t alsa_mixer_set_mute_called;
-static int alsa_mixer_set_mute_value;
-static size_t alsa_mixer_get_dB_range_called;
-static long alsa_mixer_get_dB_range_value;
-static size_t alsa_mixer_get_output_dB_range_called;
-static long alsa_mixer_get_output_dB_range_value;
-static const struct mixer_control* alsa_mixer_set_mute_output;
-static size_t alsa_mixer_set_capture_mute_called;
-static int alsa_mixer_set_capture_mute_value;
-static const struct mixer_control* alsa_mixer_set_capture_mute_input;
-static size_t sys_get_mute_called;
-static int sys_get_mute_return_value;
-static size_t sys_get_capture_mute_called;
-static int sys_get_capture_mute_return_value;
-static struct cras_alsa_mixer* fake_mixer = (struct cras_alsa_mixer*)1;
-static struct cras_card_config* fake_config = (struct cras_card_config*)2;
-static struct mixer_control** cras_alsa_mixer_list_outputs_outputs;
-static size_t cras_alsa_mixer_list_outputs_outputs_length;
-static struct mixer_control** cras_alsa_mixer_list_inputs_outputs;
-static size_t cras_alsa_mixer_list_inputs_outputs_length;
-static size_t cras_alsa_mixer_set_output_active_state_called;
-static std::vector<struct mixer_control*>
-    cras_alsa_mixer_set_output_active_state_outputs;
-static std::vector<int> cras_alsa_mixer_set_output_active_state_values;
-static cras_audio_format* fake_format;
-static size_t sys_set_volume_limits_called;
-static size_t cras_alsa_mixer_get_minimum_capture_gain_called;
-static size_t cras_alsa_mixer_get_maximum_capture_gain_called;
-static struct mixer_control* cras_alsa_jack_get_mixer_output_ret;
-static struct mixer_control* cras_alsa_jack_get_mixer_input_ret;
-static size_t cras_alsa_mixer_get_output_volume_curve_called;
-typedef std::map<const struct mixer_control*, std::string> ControlNameMap;
-static ControlNameMap cras_alsa_mixer_get_control_name_values;
-static size_t cras_alsa_mixer_get_control_name_called;
-static size_t cras_alsa_jack_list_create_called;
-static size_t cras_alsa_jack_list_find_jacks_by_name_matching_called;
-static size_t cras_alsa_jack_list_add_jack_for_section_called;
-static struct cras_alsa_jack*
-    cras_alsa_jack_list_add_jack_for_section_result_jack;
-static size_t cras_alsa_jack_list_destroy_called;
-static int cras_alsa_jack_list_has_hctl_jacks_return_val;
-static jack_state_change_callback* cras_alsa_jack_list_create_cb;
-static void* cras_alsa_jack_list_create_cb_data;
-static char test_card_name[] = "TestCard";
-static char test_pcm_name[] = "TestPCM";
-static char test_dev_name[] = "TestDev";
-static char test_dev_id[] = "TestDevId";
-static size_t cras_iodev_add_node_called;
-static struct cras_ionode* cras_iodev_set_node_plugged_ionode;
-static size_t cras_iodev_set_node_plugged_called;
-static int cras_iodev_set_node_plugged_value;
-static unsigned cras_alsa_jack_enable_ucm_called;
-static unsigned ucm_set_enabled_called;
-static size_t cras_iodev_update_dsp_called;
-static const char* cras_iodev_update_dsp_name;
-typedef std::map<const char*, std::string> DspNameMap;
-static size_t ucm_get_dsp_name_for_dev_called;
-static DspNameMap ucm_get_dsp_name_for_dev_values;
-static size_t cras_iodev_free_resources_called;
-static size_t cras_alsa_jack_update_node_type_called;
-static int ucm_swap_mode_exists_ret_value;
-static int ucm_enable_swap_mode_ret_value;
-static size_t ucm_enable_swap_mode_called;
-static int is_utf8_string_ret_value;
-static const char* cras_alsa_jack_update_monitor_fake_name = 0;
-static int cras_alsa_jack_get_name_called;
-static const char* cras_alsa_jack_get_name_ret_value = 0;
-static char default_jack_name[] = "Something Jack";
-static int auto_unplug_input_node_ret = 0;
-static int auto_unplug_output_node_ret = 0;
-static long cras_alsa_mixer_get_minimum_capture_gain_ret_value;
-static long cras_alsa_mixer_get_maximum_capture_gain_ret_value;
-static snd_pcm_state_t snd_pcm_state_ret;
-static int cras_alsa_attempt_resume_called;
-static snd_hctl_t* fake_hctl = (snd_hctl_t*)2;
-static size_t ucm_get_dma_period_for_dev_called;
-static unsigned int ucm_get_dma_period_for_dev_ret;
-static int cras_card_config_get_volume_curve_for_control_called;
-typedef std::map<std::string, struct cras_volume_curve*> VolCurveMap;
-static VolCurveMap cras_card_config_get_volume_curve_vals;
-static int cras_alsa_mmap_get_whole_buffer_called;
-static int cras_iodev_fill_odev_zeros_called;
-static unsigned int cras_iodev_fill_odev_zeros_frames;
-static int cras_iodev_frames_queued_ret;
-static int cras_iodev_buffer_avail_ret;
-static int cras_alsa_resume_appl_ptr_called;
-static int cras_alsa_resume_appl_ptr_ahead;
-static const struct cras_volume_curve* fake_get_dBFS_volume_curve_val;
-static int cras_iodev_dsp_set_swap_mode_for_node_called;
-static std::map<std::string, long> ucm_get_default_node_gain_values;
-static std::map<std::string, long> ucm_get_intrinsic_sensitivity_values;
-static thread_callback audio_thread_cb;
-static void* audio_thread_cb_data;
-static int hotword_send_triggered_msg_called;
-static struct timespec clock_gettime_retspec;
-static unsigned cras_iodev_reset_rate_estimator_called;
-
-void ResetStubData() {
-  cras_alsa_open_called = 0;
-  cras_iodev_append_stream_ret = 0;
-  cras_alsa_get_avail_frames_ret = 0;
-  cras_alsa_get_avail_frames_avail = 0;
-  cras_alsa_start_called = 0;
-  cras_alsa_fill_properties_called = 0;
-  cras_alsa_support_8_channels = false;
-  sys_get_volume_called = 0;
-  alsa_mixer_set_dBFS_called = 0;
-  alsa_mixer_set_capture_dBFS_called = 0;
-  sys_get_mute_called = 0;
-  sys_get_capture_mute_called = 0;
-  alsa_mixer_set_mute_called = 0;
-  alsa_mixer_get_dB_range_called = 0;
-  alsa_mixer_get_output_dB_range_called = 0;
-  alsa_mixer_set_capture_mute_called = 0;
-  cras_alsa_mixer_get_control_for_section_called = 0;
-  cras_alsa_mixer_get_control_for_section_return_value = NULL;
-  cras_alsa_mixer_list_outputs_called = 0;
-  cras_alsa_mixer_list_outputs_outputs_length = 0;
-  cras_alsa_mixer_list_inputs_called = 0;
-  cras_alsa_mixer_list_inputs_outputs_length = 0;
-  cras_alsa_mixer_set_output_active_state_called = 0;
-  cras_alsa_mixer_set_output_active_state_outputs.clear();
-  cras_alsa_mixer_set_output_active_state_values.clear();
-  sys_set_volume_limits_called = 0;
-  cras_alsa_mixer_get_minimum_capture_gain_called = 0;
-  cras_alsa_mixer_get_maximum_capture_gain_called = 0;
-  cras_alsa_mixer_get_output_volume_curve_called = 0;
-  cras_alsa_jack_get_mixer_output_ret = NULL;
-  cras_alsa_jack_get_mixer_input_ret = NULL;
-  cras_alsa_mixer_get_control_name_values.clear();
-  cras_alsa_mixer_get_control_name_called = 0;
-  cras_alsa_jack_list_create_called = 0;
-  cras_alsa_jack_list_find_jacks_by_name_matching_called = 0;
-  cras_alsa_jack_list_add_jack_for_section_called = 0;
-  cras_alsa_jack_list_add_jack_for_section_result_jack = NULL;
-  cras_alsa_jack_list_destroy_called = 0;
-  cras_alsa_jack_list_has_hctl_jacks_return_val = 1;
-  cras_iodev_add_node_called = 0;
-  cras_iodev_set_node_plugged_called = 0;
-  cras_alsa_jack_enable_ucm_called = 0;
-  ucm_set_enabled_called = 0;
-  cras_iodev_update_dsp_called = 0;
-  cras_iodev_update_dsp_name = 0;
-  ucm_get_dsp_name_for_dev_called = 0;
-  ucm_get_dsp_name_for_dev_values.clear();
-  cras_iodev_free_resources_called = 0;
-  cras_alsa_jack_update_node_type_called = 0;
-  ucm_swap_mode_exists_ret_value = 0;
-  ucm_enable_swap_mode_ret_value = 0;
-  ucm_enable_swap_mode_called = 0;
-  is_utf8_string_ret_value = 1;
-  cras_alsa_jack_get_name_called = 0;
-  cras_alsa_jack_get_name_ret_value = default_jack_name;
-  cras_alsa_jack_update_monitor_fake_name = 0;
-  cras_card_config_get_volume_curve_for_control_called = 0;
-  cras_card_config_get_volume_curve_vals.clear();
-  cras_alsa_mixer_get_minimum_capture_gain_ret_value = 0;
-  cras_alsa_mixer_get_maximum_capture_gain_ret_value = 0;
-  snd_pcm_state_ret = SND_PCM_STATE_RUNNING;
-  cras_alsa_attempt_resume_called = 0;
-  ucm_get_dma_period_for_dev_called = 0;
-  ucm_get_dma_period_for_dev_ret = 0;
-  cras_alsa_mmap_get_whole_buffer_called = 0;
-  cras_iodev_fill_odev_zeros_called = 0;
-  cras_iodev_fill_odev_zeros_frames = 0;
-  cras_iodev_frames_queued_ret = 0;
-  cras_iodev_buffer_avail_ret = 0;
-  cras_alsa_resume_appl_ptr_called = 0;
-  cras_alsa_resume_appl_ptr_ahead = 0;
-  fake_get_dBFS_volume_curve_val = NULL;
-  cras_iodev_dsp_set_swap_mode_for_node_called = 0;
-  ucm_get_default_node_gain_values.clear();
-  ucm_get_intrinsic_sensitivity_values.clear();
-  cras_iodev_reset_rate_estimator_called = 0;
-}
-
-static long fake_get_dBFS(const struct cras_volume_curve* curve,
-                          size_t volume) {
-  fake_get_dBFS_volume_curve_val = curve;
-  return (volume - 100) * 100;
-}
-static cras_volume_curve default_curve = {
-    .get_dBFS = fake_get_dBFS,
-};
-
-static struct cras_iodev* alsa_iodev_create_with_default_parameters(
-    size_t card_index,
-    const char* dev_id,
-    enum CRAS_ALSA_CARD_TYPE card_type,
-    int is_first,
-    struct cras_alsa_mixer* mixer,
-    struct cras_card_config* config,
-    struct cras_use_case_mgr* ucm,
-    enum CRAS_STREAM_DIRECTION direction) {
-  return alsa_iodev_create(card_index, test_card_name, 0, test_pcm_name,
-                           test_dev_name, dev_id, card_type, is_first, mixer,
-                           config, ucm, fake_hctl, direction, 0, 0,
-                           (char*)"123");
-}
-
-namespace {
-TEST(AlsaIoInit, InitializeInvalidDirection) {
-  struct alsa_io* aio;
-
-  aio = (struct alsa_io*)alsa_iodev_create_with_default_parameters(
-      0, NULL, ALSA_CARD_TYPE_INTERNAL, 0, fake_mixer, fake_config, NULL,
-      CRAS_NUM_DIRECTIONS);
-  ASSERT_EQ(aio, (void*)NULL);
-}
-
-TEST(AlsaIoInit, InitializePlayback) {
-  struct alsa_io* aio;
-  struct cras_alsa_mixer* const fake_mixer = (struct cras_alsa_mixer*)2;
-
-  ResetStubData();
-  aio = (struct alsa_io*)alsa_iodev_create_with_default_parameters(
-      0, test_dev_id, ALSA_CARD_TYPE_INTERNAL, 1, fake_mixer, fake_config, NULL,
-      CRAS_STREAM_OUTPUT);
-  ASSERT_EQ(0, alsa_iodev_legacy_complete_init((struct cras_iodev*)aio));
-  /* Get volume curve twice for iodev, and default node. */
-  EXPECT_EQ(2, cras_card_config_get_volume_curve_for_control_called);
-  EXPECT_EQ(SND_PCM_STREAM_PLAYBACK, aio->alsa_stream);
-  /* Call cras_alsa_fill_properties once on update_max_supported_channels. */
-  EXPECT_EQ(1, cras_alsa_fill_properties_called);
-  EXPECT_EQ(1, cras_alsa_mixer_list_outputs_called);
-  EXPECT_EQ(
-      0, strncmp(test_card_name, aio->base.info.name, strlen(test_card_name)));
-  EXPECT_EQ(1, cras_iodev_update_dsp_called);
-  EXPECT_EQ("", cras_iodev_update_dsp_name);
-  ASSERT_NE(reinterpret_cast<const char*>(NULL), aio->dev_name);
-  EXPECT_EQ(0, strcmp(test_dev_name, aio->dev_name));
-  ASSERT_NE(reinterpret_cast<const char*>(NULL), aio->dev_id);
-  EXPECT_EQ(0, strcmp(test_dev_id, aio->dev_id));
-
-  alsa_iodev_destroy((struct cras_iodev*)aio);
-  EXPECT_EQ(1, cras_iodev_free_resources_called);
-}
-
-TEST(AlsaIoInit, DefaultNodeInternalCard) {
-  struct alsa_io* aio;
-  struct cras_alsa_mixer* const fake_mixer = (struct cras_alsa_mixer*)2;
-
-  ResetStubData();
-  aio = (struct alsa_io*)alsa_iodev_create_with_default_parameters(
-      0, NULL, ALSA_CARD_TYPE_INTERNAL, 0, fake_mixer, fake_config, NULL,
-      CRAS_STREAM_OUTPUT);
-  ASSERT_EQ(0, alsa_iodev_legacy_complete_init((struct cras_iodev*)aio));
-  EXPECT_EQ(2, cras_card_config_get_volume_curve_for_control_called);
-  ASSERT_STREQ(DEFAULT, aio->base.active_node->name);
-  ASSERT_EQ(1, aio->base.active_node->plugged);
-  ASSERT_EQ((void*)no_stream, (void*)aio->base.no_stream);
-  ASSERT_EQ((void*)is_free_running, (void*)aio->base.is_free_running);
-  alsa_iodev_destroy((struct cras_iodev*)aio);
-
-  aio = (struct alsa_io*)alsa_iodev_create_with_default_parameters(
-      0, NULL, ALSA_CARD_TYPE_INTERNAL, 1, fake_mixer, fake_config, NULL,
-      CRAS_STREAM_OUTPUT);
-  ASSERT_EQ(0, alsa_iodev_legacy_complete_init((struct cras_iodev*)aio));
-  EXPECT_EQ(4, cras_card_config_get_volume_curve_for_control_called);
-  ASSERT_STREQ(INTERNAL_SPEAKER, aio->base.active_node->name);
-  ASSERT_EQ(1, aio->base.active_node->plugged);
-  ASSERT_EQ((void*)no_stream, (void*)aio->base.no_stream);
-  ASSERT_EQ((void*)is_free_running, (void*)aio->base.is_free_running);
-  alsa_iodev_destroy((struct cras_iodev*)aio);
-
-  aio = (struct alsa_io*)alsa_iodev_create_with_default_parameters(
-      0, NULL, ALSA_CARD_TYPE_INTERNAL, 0, fake_mixer, fake_config, NULL,
-      CRAS_STREAM_INPUT);
-  ASSERT_EQ(0, alsa_iodev_legacy_complete_init((struct cras_iodev*)aio));
-  /* No more call to get volume curve for input device. */
-  EXPECT_EQ(4, cras_card_config_get_volume_curve_for_control_called);
-  ASSERT_STREQ(DEFAULT, aio->base.active_node->name);
-  ASSERT_EQ(1, aio->base.active_node->plugged);
-  ASSERT_EQ((void*)no_stream, (void*)aio->base.no_stream);
-  ASSERT_EQ((void*)is_free_running, (void*)aio->base.is_free_running);
-  alsa_iodev_destroy((struct cras_iodev*)aio);
-
-  aio = (struct alsa_io*)alsa_iodev_create_with_default_parameters(
-      0, NULL, ALSA_CARD_TYPE_INTERNAL, 1, fake_mixer, fake_config, NULL,
-      CRAS_STREAM_INPUT);
-  ASSERT_EQ(0, alsa_iodev_legacy_complete_init((struct cras_iodev*)aio));
-  EXPECT_EQ(4, cras_card_config_get_volume_curve_for_control_called);
-  ASSERT_STREQ(INTERNAL_MICROPHONE, aio->base.active_node->name);
-  ASSERT_EQ(1, aio->base.active_node->plugged);
-  ASSERT_EQ((void*)no_stream, (void*)aio->base.no_stream);
-  ASSERT_EQ((void*)is_free_running, (void*)aio->base.is_free_running);
-  alsa_iodev_destroy((struct cras_iodev*)aio);
-}
-
-TEST(AlsaIoInit, DefaultNodeUSBCard) {
-  struct alsa_io* aio;
-  struct cras_alsa_mixer* const fake_mixer = (struct cras_alsa_mixer*)2;
-
-  ResetStubData();
-  aio = (struct alsa_io*)alsa_iodev_create_with_default_parameters(
-      0, NULL, ALSA_CARD_TYPE_USB, 1, fake_mixer, fake_config, NULL,
-      CRAS_STREAM_OUTPUT);
-  ASSERT_EQ(0, alsa_iodev_legacy_complete_init((struct cras_iodev*)aio));
-  EXPECT_EQ(2, cras_card_config_get_volume_curve_for_control_called);
-  ASSERT_STREQ(DEFAULT, aio->base.active_node->name);
-  ASSERT_EQ(1, aio->base.active_node->plugged);
-  EXPECT_EQ(1, cras_iodev_set_node_plugged_called);
-  alsa_iodev_destroy((struct cras_iodev*)aio);
-
-  aio = (struct alsa_io*)alsa_iodev_create_with_default_parameters(
-      0, NULL, ALSA_CARD_TYPE_USB, 1, fake_mixer, fake_config, NULL,
-      CRAS_STREAM_INPUT);
-  ASSERT_EQ(0, alsa_iodev_legacy_complete_init((struct cras_iodev*)aio));
-  EXPECT_EQ(2, cras_card_config_get_volume_curve_for_control_called);
-  ASSERT_STREQ(DEFAULT, aio->base.active_node->name);
-  ASSERT_EQ(1, aio->base.active_node->plugged);
-  EXPECT_EQ(2, cras_iodev_set_node_plugged_called);
-
-  /* No extra gain applied. */
-  ASSERT_EQ(DEFAULT_CAPTURE_VOLUME_DBFS,
-            aio->base.active_node->intrinsic_sensitivity);
-  ASSERT_EQ(0, aio->base.active_node->capture_gain);
-  alsa_iodev_destroy((struct cras_iodev*)aio);
-}
-
-TEST(AlsaIoInit, OpenPlayback) {
-  struct cras_iodev* iodev;
-  struct cras_audio_format format;
-  struct alsa_io* aio;
-
-  ResetStubData();
-  iodev = alsa_iodev_create_with_default_parameters(
-      0, NULL, ALSA_CARD_TYPE_INTERNAL, 0, fake_mixer, fake_config, NULL,
-      CRAS_STREAM_OUTPUT);
-  ASSERT_EQ(0, alsa_iodev_legacy_complete_init(iodev));
-  /* Call open_dev once on update_max_supported_channels. */
-  EXPECT_EQ(1, cras_alsa_open_called);
-  EXPECT_EQ(2, cras_card_config_get_volume_curve_for_control_called);
-  aio = (struct alsa_io*)iodev;
-  format.frame_rate = 48000;
-  format.num_channels = 1;
-  cras_iodev_set_format(iodev, &format);
-
-  // Test that these flags are cleared after open_dev.
-  aio->free_running = 1;
-  aio->filled_zeros_for_draining = 512;
-  iodev->open_dev(iodev);
-  EXPECT_EQ(2, cras_alsa_open_called);
-  iodev->configure_dev(iodev);
-  EXPECT_EQ(2, cras_alsa_open_called);
-  EXPECT_EQ(1, sys_set_volume_limits_called);
-  EXPECT_EQ(1, alsa_mixer_set_dBFS_called);
-  EXPECT_EQ(0, cras_alsa_start_called);
-  EXPECT_EQ(0, cras_iodev_set_node_plugged_called);
-  EXPECT_EQ(0, aio->free_running);
-  EXPECT_EQ(0, aio->filled_zeros_for_draining);
-  EXPECT_EQ(SEVERE_UNDERRUN_MS * format.frame_rate / 1000,
-            aio->severe_underrun_frames);
-
-  alsa_iodev_destroy(iodev);
-  free(fake_format);
-}
-
-TEST(AlsaIoInit, UsbCardAutoPlug) {
-  struct cras_iodev* iodev;
-
-  ResetStubData();
-  iodev = alsa_iodev_create_with_default_parameters(
-      0, NULL, ALSA_CARD_TYPE_INTERNAL, 1, fake_mixer, fake_config, NULL,
-      CRAS_STREAM_OUTPUT);
-  ASSERT_EQ(0, alsa_iodev_legacy_complete_init(iodev));
-  EXPECT_EQ(2, cras_card_config_get_volume_curve_for_control_called);
-  EXPECT_EQ(0, cras_iodev_set_node_plugged_called);
-  alsa_iodev_destroy(iodev);
-
-  ResetStubData();
-  iodev = alsa_iodev_create_with_default_parameters(0, NULL, ALSA_CARD_TYPE_USB,
-                                                    0, fake_mixer, fake_config,
-                                                    NULL, CRAS_STREAM_OUTPUT);
-  ASSERT_EQ(0, alsa_iodev_legacy_complete_init(iodev));
-  EXPECT_EQ(2, cras_card_config_get_volume_curve_for_control_called);
-  EXPECT_EQ(0, cras_iodev_set_node_plugged_called);
-  alsa_iodev_destroy(iodev);
-
-  ResetStubData();
-  iodev = alsa_iodev_create_with_default_parameters(0, NULL, ALSA_CARD_TYPE_USB,
-                                                    1, fake_mixer, fake_config,
-                                                    NULL, CRAS_STREAM_OUTPUT);
-  ASSERT_EQ(0, alsa_iodev_legacy_complete_init(iodev));
-  EXPECT_EQ(2, cras_card_config_get_volume_curve_for_control_called);
-  // Should assume USB devs are plugged when they appear.
-  EXPECT_EQ(1, cras_iodev_set_node_plugged_called);
-  EXPECT_EQ(1, iodev->active_node->plugged);
-  alsa_iodev_destroy(iodev);
-}
-
-TEST(AlsaIoInit, UsbCardUseSoftwareVolume) {
-  struct cras_iodev* iodev;
-
-  alsa_mixer_get_dB_range_value = 1000;
-  alsa_mixer_get_output_dB_range_value = 1000;
-  ResetStubData();
-  iodev = alsa_iodev_create_with_default_parameters(0, NULL, ALSA_CARD_TYPE_USB,
-                                                    1, fake_mixer, fake_config,
-                                                    NULL, CRAS_STREAM_OUTPUT);
-  ASSERT_EQ(0, alsa_iodev_legacy_complete_init(iodev));
-  EXPECT_EQ(2, cras_card_config_get_volume_curve_for_control_called);
-  EXPECT_EQ(1, alsa_mixer_get_dB_range_called);
-  EXPECT_EQ(1, alsa_mixer_get_output_dB_range_called);
-  EXPECT_EQ(1, iodev->active_node->software_volume_needed);
-  alsa_iodev_destroy(iodev);
-
-  alsa_mixer_get_dB_range_value = 3000;
-  alsa_mixer_get_output_dB_range_value = 2000;
-  ResetStubData();
-  iodev = alsa_iodev_create_with_default_parameters(0, NULL, ALSA_CARD_TYPE_USB,
-                                                    1, fake_mixer, fake_config,
-                                                    NULL, CRAS_STREAM_OUTPUT);
-  ASSERT_EQ(0, alsa_iodev_legacy_complete_init(iodev));
-  EXPECT_EQ(2, cras_card_config_get_volume_curve_for_control_called);
-  EXPECT_EQ(1, alsa_mixer_get_dB_range_called);
-  EXPECT_EQ(1, alsa_mixer_get_output_dB_range_called);
-  EXPECT_EQ(0, iodev->active_node->software_volume_needed);
-  alsa_iodev_destroy(iodev);
-}
-
-TEST(AlsaIoInit, SoftwareGainIntrinsicSensitivity) {
-  struct cras_iodev* iodev;
-  struct cras_use_case_mgr* const fake_ucm = (struct cras_use_case_mgr*)3;
-  long intrinsic_sensitivity = -2700;
-
-  ResetStubData();
-
-  // Set intrinsic sensitivity to -2700 * 0.01 dBFS/Pa.
-  ucm_get_intrinsic_sensitivity_values[INTERNAL_MICROPHONE] =
-      intrinsic_sensitivity;
-
-  // Assume this is the first device so it gets internal mic node name.
-  iodev = alsa_iodev_create_with_default_parameters(
-      0, NULL, ALSA_CARD_TYPE_INTERNAL, 1, fake_mixer, fake_config, fake_ucm,
-      CRAS_STREAM_INPUT);
-  ASSERT_EQ(0, alsa_iodev_legacy_complete_init(iodev));
-  ASSERT_EQ(intrinsic_sensitivity, iodev->active_node->intrinsic_sensitivity);
-  ASSERT_EQ(DEFAULT_CAPTURE_VOLUME_DBFS - intrinsic_sensitivity,
-            iodev->active_node->capture_gain);
-
-  alsa_iodev_destroy(iodev);
-}
-
-TEST(AlsaIoInit, RouteBasedOnJackCallback) {
-  struct alsa_io* aio;
-  struct cras_alsa_mixer* const fake_mixer = (struct cras_alsa_mixer*)2;
-
-  ResetStubData();
-  aio = (struct alsa_io*)alsa_iodev_create_with_default_parameters(
-      0, NULL, ALSA_CARD_TYPE_INTERNAL, 1, fake_mixer, fake_config, NULL,
-      CRAS_STREAM_OUTPUT);
-  ASSERT_NE(aio, (void*)NULL);
-  ASSERT_EQ(0, alsa_iodev_legacy_complete_init((struct cras_iodev*)aio));
-  EXPECT_EQ(2, cras_card_config_get_volume_curve_for_control_called);
-  EXPECT_EQ(SND_PCM_STREAM_PLAYBACK, aio->alsa_stream);
-  /* Call cras_alsa_fill_properties once on update_max_supported_channels. */
-  EXPECT_EQ(1, cras_alsa_fill_properties_called);
-  EXPECT_EQ(1, cras_alsa_mixer_list_outputs_called);
-  EXPECT_EQ(1, cras_alsa_jack_list_create_called);
-  EXPECT_EQ(1, cras_alsa_jack_list_find_jacks_by_name_matching_called);
-  EXPECT_EQ(0, cras_alsa_jack_list_add_jack_for_section_called);
-
-  cras_alsa_jack_list_create_cb(NULL, 1, cras_alsa_jack_list_create_cb_data);
-  EXPECT_EQ(1, cras_iodev_set_node_plugged_called);
-  EXPECT_EQ(1, cras_iodev_set_node_plugged_value);
-  cras_alsa_jack_list_create_cb(NULL, 0, cras_alsa_jack_list_create_cb_data);
-  EXPECT_EQ(2, cras_iodev_set_node_plugged_called);
-  EXPECT_EQ(0, cras_iodev_set_node_plugged_value);
-
-  alsa_iodev_destroy((struct cras_iodev*)aio);
-  EXPECT_EQ(1, cras_alsa_jack_list_destroy_called);
-}
-
-TEST(AlsaIoInit, RouteBasedOnInputJackCallback) {
-  struct alsa_io* aio;
-  struct cras_alsa_mixer* const fake_mixer = (struct cras_alsa_mixer*)2;
-
-  ResetStubData();
-  aio = (struct alsa_io*)alsa_iodev_create_with_default_parameters(
-      0, NULL, ALSA_CARD_TYPE_INTERNAL, 0, fake_mixer, fake_config, NULL,
-      CRAS_STREAM_INPUT);
-  ASSERT_NE(aio, (void*)NULL);
-  ASSERT_EQ(0, alsa_iodev_legacy_complete_init((struct cras_iodev*)aio));
-
-  EXPECT_EQ(SND_PCM_STREAM_CAPTURE, aio->alsa_stream);
-  /* Call cras_alsa_fill_properties once on update_max_supported_channels. */
-  EXPECT_EQ(1, cras_alsa_fill_properties_called);
-  EXPECT_EQ(1, cras_alsa_jack_list_create_called);
-  EXPECT_EQ(1, cras_alsa_jack_list_find_jacks_by_name_matching_called);
-  EXPECT_EQ(0, cras_alsa_jack_list_add_jack_for_section_called);
-
-  cras_alsa_jack_list_create_cb(NULL, 1, cras_alsa_jack_list_create_cb_data);
-  EXPECT_EQ(1, cras_iodev_set_node_plugged_called);
-  EXPECT_EQ(1, cras_iodev_set_node_plugged_value);
-  cras_alsa_jack_list_create_cb(NULL, 0, cras_alsa_jack_list_create_cb_data);
-  EXPECT_EQ(2, cras_iodev_set_node_plugged_called);
-  EXPECT_EQ(0, cras_iodev_set_node_plugged_value);
-
-  alsa_iodev_destroy((struct cras_iodev*)aio);
-  EXPECT_EQ(1, cras_alsa_jack_list_destroy_called);
-}
-
-TEST(AlsaIoInit, InitializeCapture) {
-  struct alsa_io* aio;
-
-  ResetStubData();
-  aio = (struct alsa_io*)alsa_iodev_create_with_default_parameters(
-      0, NULL, ALSA_CARD_TYPE_INTERNAL, 1, fake_mixer, fake_config, NULL,
-      CRAS_STREAM_INPUT);
-  ASSERT_NE(aio, (void*)NULL);
-  ASSERT_EQ(0, alsa_iodev_legacy_complete_init((struct cras_iodev*)aio));
-
-  EXPECT_EQ(SND_PCM_STREAM_CAPTURE, aio->alsa_stream);
-  /* Call cras_alsa_fill_properties once on update_max_supported_channels. */
-  EXPECT_EQ(1, cras_alsa_fill_properties_called);
-  EXPECT_EQ(1, cras_alsa_mixer_list_inputs_called);
-
-  alsa_iodev_destroy((struct cras_iodev*)aio);
-}
-
-TEST(AlsaIoInit, OpenCapture) {
-  struct cras_iodev* iodev;
-  struct cras_audio_format format;
-  struct alsa_io* aio;
-
-  iodev = alsa_iodev_create_with_default_parameters(
-      0, NULL, ALSA_CARD_TYPE_INTERNAL, 0, fake_mixer, fake_config, NULL,
-      CRAS_STREAM_INPUT);
-  ASSERT_EQ(0, alsa_iodev_legacy_complete_init(iodev));
-
-  aio = (struct alsa_io*)iodev;
-  format.frame_rate = 48000;
-  format.num_channels = 1;
-  cras_iodev_set_format(iodev, &format);
-
-  ResetStubData();
-  iodev->open_dev(iodev);
-  EXPECT_EQ(1, cras_alsa_open_called);
-  iodev->configure_dev(iodev);
-  EXPECT_EQ(1, cras_alsa_open_called);
-  EXPECT_EQ(1, cras_alsa_mixer_get_minimum_capture_gain_called);
-  EXPECT_EQ(1, cras_alsa_mixer_get_maximum_capture_gain_called);
-  EXPECT_EQ(1, alsa_mixer_set_capture_dBFS_called);
-  EXPECT_EQ(1, sys_get_capture_mute_called);
-  EXPECT_EQ(1, alsa_mixer_set_capture_mute_called);
-  EXPECT_EQ(1, cras_alsa_start_called);
-  EXPECT_EQ(SEVERE_UNDERRUN_MS * format.frame_rate / 1000,
-            aio->severe_underrun_frames);
-
-  alsa_iodev_destroy(iodev);
-  free(fake_format);
-}
-
-TEST(AlsaIoInit, OpenCaptureSetCaptureGainWithDefaultNodeGain) {
-  struct cras_iodev* iodev;
-  struct cras_audio_format format;
-  struct cras_use_case_mgr* const fake_ucm = (struct cras_use_case_mgr*)3;
-  long default_node_gain = 1000;
-
-  ResetStubData();
-  // Set default node gain to -1000 * 0.01 dB.
-  ucm_get_default_node_gain_values[INTERNAL_MICROPHONE] = default_node_gain;
-
-  // Assume this is the first device so it gets internal mic node name.
-  iodev = alsa_iodev_create_with_default_parameters(
-      0, NULL, ALSA_CARD_TYPE_INTERNAL, 1, fake_mixer, fake_config, fake_ucm,
-      CRAS_STREAM_INPUT);
-  ASSERT_EQ(0, alsa_iodev_legacy_complete_init(iodev));
-
-  cras_iodev_set_format(iodev, &format);
-
-  // Check the default node gain is the same as what specified in UCM.
-  EXPECT_EQ(default_node_gain, iodev->active_node->capture_gain);
-  cras_alsa_mixer_get_minimum_capture_gain_ret_value = 0;
-  cras_alsa_mixer_get_maximum_capture_gain_ret_value = 2000;
-
-  iodev->open_dev(iodev);
-  iodev->configure_dev(iodev);
-  iodev->close_dev(iodev);
-
-  // Hardware gain is in the hardware gain range and set to 1000 * 0.01 dB.
-  EXPECT_EQ(default_node_gain, alsa_mixer_set_capture_dBFS_value);
-
-  // Check we do respect the hardware maximum capture gain.
-  cras_alsa_mixer_get_maximum_capture_gain_ret_value = 500;
-
-  iodev->open_dev(iodev);
-  iodev->configure_dev(iodev);
-  iodev->close_dev(iodev);
-
-  EXPECT_EQ(500, alsa_mixer_set_capture_dBFS_value);
-
-  alsa_iodev_destroy(iodev);
-  free(fake_format);
-}
-
-TEST(AlsaIoInit, OpenCaptureSetCaptureGainWithSoftwareGain) {
-  struct cras_iodev* iodev;
-  struct cras_audio_format format;
-  struct cras_use_case_mgr* const fake_ucm = (struct cras_use_case_mgr*)3;
-
-  /* Meet the requirements of using software gain. */
-  ResetStubData();
-
-  iodev = alsa_iodev_create_with_default_parameters(
-      0, NULL, ALSA_CARD_TYPE_INTERNAL, 0, fake_mixer, fake_config, fake_ucm,
-      CRAS_STREAM_INPUT);
-  ASSERT_EQ(0, alsa_iodev_legacy_complete_init(iodev));
-
-  format.frame_rate = 48000;
-  format.num_channels = 1;
-  cras_iodev_set_format(iodev, &format);
-
-  iodev->open_dev(iodev);
-  iodev->configure_dev(iodev);
-  iodev->close_dev(iodev);
-
-  /* Hardware gain is set to 0dB when software gain is used. */
-  EXPECT_EQ(0, alsa_mixer_set_capture_dBFS_value);
-
-  /* Test the case where software gain is not needed. */
-  iodev->active_node->software_volume_needed = 0;
-  iodev->active_node->capture_gain = 1000;
-  iodev->open_dev(iodev);
-  iodev->configure_dev(iodev);
-  iodev->close_dev(iodev);
-
-  /* Hardware gain is set to 1000 * 0.01 dB as got from catpure_gain.*/
-  EXPECT_EQ(0, alsa_mixer_set_capture_dBFS_value);
-
-  alsa_iodev_destroy(iodev);
-  free(fake_format);
-}
-
-TEST(AlsaIoInit, OpenCaptureSetCaptureGainWithDefaultUsbDevice) {
-  struct cras_iodev* iodev;
-  struct cras_audio_format format;
-
-  iodev = alsa_iodev_create_with_default_parameters(0, NULL, ALSA_CARD_TYPE_USB,
-                                                    0, fake_mixer, fake_config,
-                                                    NULL, CRAS_STREAM_INPUT);
-  ASSERT_EQ(0, alsa_iodev_legacy_complete_init(iodev));
-
-  format.frame_rate = 48000;
-  format.num_channels = 1;
-  cras_iodev_set_format(iodev, &format);
-
-  iodev->active_node->intrinsic_sensitivity = DEFAULT_CAPTURE_VOLUME_DBFS;
-  iodev->active_node->capture_gain = 0;
-
-  ResetStubData();
-  iodev->open_dev(iodev);
-  iodev->configure_dev(iodev);
-
-  EXPECT_EQ(1, sys_get_capture_mute_called);
-  EXPECT_EQ(1, alsa_mixer_set_capture_mute_called);
-
-  /* Not change mixer controls for USB devices without UCM config. */
-  EXPECT_EQ(0, alsa_mixer_set_capture_dBFS_called);
-
-  alsa_iodev_destroy(iodev);
-  free(fake_format);
-}
-
-TEST(AlsaIoInit, UpdateActiveNode) {
-  struct cras_iodev* iodev;
-  struct cras_alsa_mixer* const fake_mixer = (struct cras_alsa_mixer*)2;
-
-  ResetStubData();
-  iodev = alsa_iodev_create_with_default_parameters(
-      0, NULL, ALSA_CARD_TYPE_INTERNAL, 0, fake_mixer, fake_config, NULL,
-      CRAS_STREAM_OUTPUT);
-  ASSERT_EQ(0, alsa_iodev_legacy_complete_init(iodev));
-  EXPECT_EQ(2, cras_card_config_get_volume_curve_for_control_called);
-
-  iodev->update_active_node(iodev, 0, 1);
-
-  alsa_iodev_destroy(iodev);
-}
-
-TEST(AlsaIoInit, StartDevice) {
-  struct cras_iodev* iodev;
-  int rc;
-
-  ResetStubData();
-  iodev = alsa_iodev_create_with_default_parameters(
-      0, NULL, ALSA_CARD_TYPE_INTERNAL, 0, NULL, fake_config, NULL,
-      CRAS_STREAM_OUTPUT);
-  ASSERT_EQ(0, alsa_iodev_legacy_complete_init(iodev));
-  EXPECT_EQ(2, cras_card_config_get_volume_curve_for_control_called);
-
-  // Return right away if it is already running.
-  snd_pcm_state_ret = SND_PCM_STATE_RUNNING;
-  rc = iodev->start(iodev);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(0, cras_alsa_start_called);
-
-  // Otherwise, start the device.
-  snd_pcm_state_ret = SND_PCM_STATE_SETUP;
-  rc = iodev->start(iodev);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(1, cras_alsa_start_called);
-
-  alsa_iodev_destroy(iodev);
-}
-
-TEST(AlsaIoInit, ResumeDevice) {
-  struct cras_iodev* iodev;
-  int rc;
-
-  ResetStubData();
-  iodev = alsa_iodev_create_with_default_parameters(
-      0, NULL, ALSA_CARD_TYPE_INTERNAL, 0, NULL, fake_config, NULL,
-      CRAS_STREAM_OUTPUT);
-  ASSERT_EQ(0, alsa_iodev_legacy_complete_init(iodev));
-  EXPECT_EQ(2, cras_card_config_get_volume_curve_for_control_called);
-
-  // Attempt to resume if the device is suspended.
-  snd_pcm_state_ret = SND_PCM_STATE_SUSPENDED;
-  rc = iodev->start(iodev);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(1, cras_alsa_attempt_resume_called);
-
-  alsa_iodev_destroy(iodev);
-}
-
-TEST(AlsaIoInit, DspNameDefault) {
-  struct alsa_io* aio;
-  struct cras_alsa_mixer* const fake_mixer = (struct cras_alsa_mixer*)2;
-  struct cras_use_case_mgr* const fake_ucm = (struct cras_use_case_mgr*)3;
-
-  ResetStubData();
-  aio = (struct alsa_io*)alsa_iodev_create_with_default_parameters(
-      0, NULL, ALSA_CARD_TYPE_INTERNAL, 0, fake_mixer, fake_config, fake_ucm,
-      CRAS_STREAM_OUTPUT);
-  ASSERT_EQ(0, alsa_iodev_legacy_complete_init((struct cras_iodev*)aio));
-  EXPECT_EQ(2, cras_card_config_get_volume_curve_for_control_called);
-  EXPECT_EQ(SND_PCM_STREAM_PLAYBACK, aio->alsa_stream);
-  EXPECT_EQ(1, ucm_get_dsp_name_for_dev_called);
-  EXPECT_STREQ("", cras_iodev_update_dsp_name);
-
-  alsa_iodev_destroy((struct cras_iodev*)aio);
-}
-
-TEST(AlsaIoInit, DspName) {
-  struct alsa_io* aio;
-  struct cras_alsa_mixer* const fake_mixer = (struct cras_alsa_mixer*)2;
-  struct cras_use_case_mgr* const fake_ucm = (struct cras_use_case_mgr*)3;
-
-  ResetStubData();
-  ucm_get_dsp_name_for_dev_values[DEFAULT] = "hello";
-  aio = (struct alsa_io*)alsa_iodev_create_with_default_parameters(
-      0, NULL, ALSA_CARD_TYPE_INTERNAL, 0, fake_mixer, fake_config, fake_ucm,
-      CRAS_STREAM_OUTPUT);
-  ASSERT_EQ(0, alsa_iodev_legacy_complete_init((struct cras_iodev*)aio));
-  EXPECT_EQ(2, cras_card_config_get_volume_curve_for_control_called);
-  EXPECT_EQ(SND_PCM_STREAM_PLAYBACK, aio->alsa_stream);
-  EXPECT_EQ(1, ucm_get_dsp_name_for_dev_called);
-  EXPECT_STREQ("hello", cras_iodev_update_dsp_name);
-
-  alsa_iodev_destroy((struct cras_iodev*)aio);
-}
-
-TEST(AlsaIoInit, DspNameJackOverride) {
-  struct alsa_io* aio;
-  struct cras_alsa_mixer* const fake_mixer = (struct cras_alsa_mixer*)2;
-  struct cras_use_case_mgr* const fake_ucm = (struct cras_use_case_mgr*)3;
-  const struct cras_alsa_jack* jack = (struct cras_alsa_jack*)4;
-  static const char* jack_name = "jack";
-
-  ResetStubData();
-  aio = (struct alsa_io*)alsa_iodev_create_with_default_parameters(
-      0, NULL, ALSA_CARD_TYPE_INTERNAL, 0, fake_mixer, fake_config, fake_ucm,
-      CRAS_STREAM_OUTPUT);
-  ASSERT_EQ(0, alsa_iodev_legacy_complete_init((struct cras_iodev*)aio));
-  EXPECT_EQ(SND_PCM_STREAM_PLAYBACK, aio->alsa_stream);
-  EXPECT_EQ(1, ucm_get_dsp_name_for_dev_called);
-  EXPECT_EQ(1, cras_iodev_update_dsp_called);
-  EXPECT_STREQ("", cras_iodev_update_dsp_name);
-
-  cras_alsa_jack_get_name_ret_value = jack_name;
-  ucm_get_dsp_name_for_dev_values[jack_name] = "override_dsp";
-  // Add the jack node.
-  cras_alsa_jack_list_create_cb(jack, 1, cras_alsa_jack_list_create_cb_data);
-  EXPECT_EQ(2, cras_alsa_jack_get_name_called);
-  EXPECT_EQ(2, ucm_get_dsp_name_for_dev_called);
-
-  // Mark the jack node as active.
-  alsa_iodev_set_active_node(&aio->base, aio->base.nodes->next, 1);
-  EXPECT_EQ(2, ucm_get_dsp_name_for_dev_called);
-  EXPECT_EQ(2, cras_iodev_update_dsp_called);
-  EXPECT_STREQ("override_dsp", cras_iodev_update_dsp_name);
-
-  // Mark the default node as active.
-  alsa_iodev_set_active_node(&aio->base, aio->base.nodes, 1);
-  EXPECT_EQ(2, ucm_get_dsp_name_for_dev_called);
-  EXPECT_EQ(3, cras_iodev_update_dsp_called);
-  EXPECT_STREQ("", cras_iodev_update_dsp_name);
-
-  alsa_iodev_destroy((struct cras_iodev*)aio);
-}
-
-TEST(AlsaIoInit, NodeTypeOverride) {
-  struct alsa_io* aio;
-  struct cras_alsa_mixer* const fake_mixer = (struct cras_alsa_mixer*)2;
-  struct cras_use_case_mgr* const fake_ucm = (struct cras_use_case_mgr*)3;
-  const struct cras_alsa_jack* jack = (struct cras_alsa_jack*)4;
-
-  ResetStubData();
-  aio = (struct alsa_io*)alsa_iodev_create_with_default_parameters(
-      0, NULL, ALSA_CARD_TYPE_INTERNAL, 0, fake_mixer, fake_config, fake_ucm,
-      CRAS_STREAM_OUTPUT);
-  ASSERT_EQ(0, alsa_iodev_legacy_complete_init((struct cras_iodev*)aio));
-  // Add the jack node.
-  cras_alsa_jack_list_create_cb(jack, 1, cras_alsa_jack_list_create_cb_data);
-  // Verify that cras_alsa_jack_update_node_type is called when an output device
-  // is created.
-  EXPECT_EQ(1, cras_alsa_jack_update_node_type_called);
-
-  alsa_iodev_destroy((struct cras_iodev*)aio);
-}
-
-TEST(AlsaIoInit, SwapMode) {
-  struct alsa_io* aio;
-  struct cras_alsa_mixer* const fake_mixer = (struct cras_alsa_mixer*)2;
-  struct cras_use_case_mgr* const fake_ucm = (struct cras_use_case_mgr*)3;
-  struct cras_ionode* const fake_node =
-      (cras_ionode*)calloc(1, sizeof(struct cras_ionode));
-  ResetStubData();
-  // Stub replies that swap mode does not exist.
-  ucm_swap_mode_exists_ret_value = 0;
-
-  aio = (struct alsa_io*)alsa_iodev_create_with_default_parameters(
-      0, NULL, ALSA_CARD_TYPE_INTERNAL, 0, fake_mixer, fake_config, fake_ucm,
-      CRAS_STREAM_OUTPUT);
-  ASSERT_EQ(0, alsa_iodev_legacy_complete_init((struct cras_iodev*)aio));
-
-  aio->base.set_swap_mode_for_node((cras_iodev*)aio, fake_node, 1);
-  /* Swap mode is implemented by dsp. */
-  EXPECT_EQ(1, cras_iodev_dsp_set_swap_mode_for_node_called);
-
-  // Stub replies that swap mode exists.
-  ucm_swap_mode_exists_ret_value = 1;
-  alsa_iodev_destroy((struct cras_iodev*)aio);
-
-  aio = (struct alsa_io*)alsa_iodev_create_with_default_parameters(
-      0, NULL, ALSA_CARD_TYPE_INTERNAL, 0, fake_mixer, fake_config, fake_ucm,
-      CRAS_STREAM_OUTPUT);
-  ASSERT_EQ(0, alsa_iodev_legacy_complete_init((struct cras_iodev*)aio));
-  // Enable swap mode.
-  aio->base.set_swap_mode_for_node((cras_iodev*)aio, fake_node, 1);
-
-  // Verify that ucm_enable_swap_mode is called when callback to enable
-  // swap mode is called.
-  EXPECT_EQ(1, ucm_enable_swap_mode_called);
-
-  alsa_iodev_destroy((struct cras_iodev*)aio);
-  free(fake_node);
-}
-
-TEST(AlsaIoInit, MaxSupportedChannels) {
-  struct alsa_io* aio;
-  struct cras_alsa_mixer* const fake_mixer = (struct cras_alsa_mixer*)2;
-  int i;
-
-  // i = 0: cras_alsa_support_8_channels is false, support 2 channels only.
-  // i = 1: cras_alsa_support_8_channels is true, support up to 8 channels.
-  for (i = 0; i < 2; i++) {
-    ResetStubData();
-    cras_alsa_support_8_channels = (bool)i;
-
-    aio = (struct alsa_io*)alsa_iodev_create_with_default_parameters(
-        0, test_dev_id, ALSA_CARD_TYPE_INTERNAL, 1, fake_mixer, fake_config,
-        NULL, CRAS_STREAM_OUTPUT);
-    ASSERT_EQ(0, alsa_iodev_legacy_complete_init((struct cras_iodev*)aio));
-    /* Call cras_alsa_fill_properties once on update_max_supported_channels. */
-    EXPECT_EQ(1, cras_alsa_fill_properties_called);
-    uint32_t max_channels = (cras_alsa_support_8_channels) ? 8 : 2;
-    EXPECT_EQ(max_channels, aio->base.info.max_supported_channels);
-    alsa_iodev_destroy((struct cras_iodev*)aio);
-    EXPECT_EQ(1, cras_iodev_free_resources_called);
-  }
-}
-
-// Test that system settins aren't touched if no streams active.
-TEST(AlsaOutputNode, SystemSettingsWhenInactive) {
-  int rc;
-  struct alsa_io* aio;
-  struct cras_alsa_mixer* const fake_mixer = (struct cras_alsa_mixer*)2;
-  struct mixer_control* outputs[2];
-
-  ResetStubData();
-  outputs[0] = reinterpret_cast<struct mixer_control*>(3);
-  outputs[1] = reinterpret_cast<struct mixer_control*>(4);
-  cras_alsa_mixer_list_outputs_outputs = outputs;
-  cras_alsa_mixer_list_outputs_outputs_length = ARRAY_SIZE(outputs);
-  aio = (struct alsa_io*)alsa_iodev_create_with_default_parameters(
-      0, NULL, ALSA_CARD_TYPE_INTERNAL, 1, fake_mixer, fake_config, NULL,
-      CRAS_STREAM_OUTPUT);
-  ASSERT_EQ(0, alsa_iodev_legacy_complete_init((struct cras_iodev*)aio));
-  /* Two mixer controls calls get volume curve. */
-  EXPECT_EQ(4, cras_card_config_get_volume_curve_for_control_called);
-  EXPECT_EQ(SND_PCM_STREAM_PLAYBACK, aio->alsa_stream);
-  EXPECT_EQ(1, cras_alsa_mixer_list_outputs_called);
-
-  ResetStubData();
-  rc = alsa_iodev_set_active_node((struct cras_iodev*)aio,
-                                  aio->base.nodes->next, 1);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(0, alsa_mixer_set_mute_called);
-  EXPECT_EQ(0, alsa_mixer_set_dBFS_called);
-  ASSERT_EQ(2, cras_alsa_mixer_set_output_active_state_called);
-  EXPECT_EQ(outputs[0], cras_alsa_mixer_set_output_active_state_outputs[0]);
-  EXPECT_EQ(0, cras_alsa_mixer_set_output_active_state_values[0]);
-  EXPECT_EQ(outputs[1], cras_alsa_mixer_set_output_active_state_outputs[1]);
-  EXPECT_EQ(1, cras_alsa_mixer_set_output_active_state_values[1]);
-  EXPECT_EQ(1, cras_iodev_update_dsp_called);
-  // No jack is defined, and UCM is not used.
-  EXPECT_EQ(0, cras_alsa_jack_enable_ucm_called);
-  EXPECT_EQ(0, ucm_set_enabled_called);
-
-  alsa_iodev_destroy((struct cras_iodev*)aio);
-}
-
-//  Test handling of different amounts of outputs.
-TEST(AlsaOutputNode, TwoOutputs) {
-  int rc;
-  struct alsa_io* aio;
-  struct cras_alsa_mixer* const fake_mixer = (struct cras_alsa_mixer*)2;
-  struct mixer_control* outputs[2];
-
-  ResetStubData();
-  outputs[0] = reinterpret_cast<struct mixer_control*>(3);
-  outputs[1] = reinterpret_cast<struct mixer_control*>(4);
-  cras_alsa_mixer_list_outputs_outputs = outputs;
-  cras_alsa_mixer_list_outputs_outputs_length = ARRAY_SIZE(outputs);
-  aio = (struct alsa_io*)alsa_iodev_create_with_default_parameters(
-      0, NULL, ALSA_CARD_TYPE_INTERNAL, 1, fake_mixer, fake_config, NULL,
-      CRAS_STREAM_OUTPUT);
-  ASSERT_EQ(0, alsa_iodev_legacy_complete_init((struct cras_iodev*)aio));
-  EXPECT_EQ(4, cras_card_config_get_volume_curve_for_control_called);
-  EXPECT_EQ(SND_PCM_STREAM_PLAYBACK, aio->alsa_stream);
-  EXPECT_EQ(1, cras_alsa_mixer_list_outputs_called);
-
-  aio->handle = (snd_pcm_t*)0x24;
-
-  ResetStubData();
-  rc = alsa_iodev_set_active_node((struct cras_iodev*)aio,
-                                  aio->base.nodes->next, 1);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(1, alsa_mixer_set_mute_called);
-  EXPECT_EQ(outputs[1], alsa_mixer_set_mute_output);
-  EXPECT_EQ(1, alsa_mixer_set_dBFS_called);
-  EXPECT_EQ(outputs[1], alsa_mixer_set_dBFS_output);
-  ASSERT_EQ(2, cras_alsa_mixer_set_output_active_state_called);
-  EXPECT_EQ(outputs[0], cras_alsa_mixer_set_output_active_state_outputs[0]);
-  EXPECT_EQ(0, cras_alsa_mixer_set_output_active_state_values[0]);
-  EXPECT_EQ(outputs[1], cras_alsa_mixer_set_output_active_state_outputs[1]);
-  EXPECT_EQ(1, cras_alsa_mixer_set_output_active_state_values[1]);
-  EXPECT_EQ(1, cras_iodev_update_dsp_called);
-  // No jacks defined, and UCM is not used.
-  EXPECT_EQ(0, cras_alsa_jack_enable_ucm_called);
-  EXPECT_EQ(0, ucm_set_enabled_called);
-
-  alsa_iodev_destroy((struct cras_iodev*)aio);
-}
-
-TEST(AlsaOutputNode, TwoJacksHeadphoneLineout) {
-  struct alsa_io* aio;
-  struct cras_alsa_mixer* const fake_mixer = (struct cras_alsa_mixer*)2;
-  struct cras_use_case_mgr* const fake_ucm = (struct cras_use_case_mgr*)3;
-  struct cras_iodev* iodev;
-  struct mixer_control* output;
-  struct ucm_section* section;
-
-  ResetStubData();
-  output = reinterpret_cast<struct mixer_control*>(3);
-  cras_alsa_mixer_get_control_name_values[output] = HEADPHONE;
-
-  // Create the iodev
-  iodev = alsa_iodev_create_with_default_parameters(
-      0, NULL, ALSA_CARD_TYPE_INTERNAL, 1, fake_mixer, fake_config, fake_ucm,
-      CRAS_STREAM_OUTPUT);
-  ASSERT_NE(iodev, (void*)NULL);
-  aio = reinterpret_cast<struct alsa_io*>(iodev);
-  EXPECT_EQ(1, cras_card_config_get_volume_curve_for_control_called);
-
-  // First node 'Headphone'
-  section = ucm_section_create(HEADPHONE, "hw:0,1", 0, -1, CRAS_STREAM_OUTPUT,
-                               "fake-jack", "gpio");
-  ucm_section_set_mixer_name(section, HEADPHONE);
-  cras_alsa_jack_list_add_jack_for_section_result_jack =
-      reinterpret_cast<struct cras_alsa_jack*>(10);
-  cras_alsa_mixer_get_control_for_section_return_value = output;
-  ASSERT_EQ(0, alsa_iodev_ucm_add_nodes_and_jacks(iodev, section));
-  EXPECT_EQ(4, cras_card_config_get_volume_curve_for_control_called);
-  ucm_section_free_list(section);
-
-  // Second node 'Line Out'
-  section = ucm_section_create("Line Out", "hw:0.1", 0, -1, CRAS_STREAM_OUTPUT,
-                               "fake-jack", "gpio");
-  ucm_section_set_mixer_name(section, HEADPHONE);
-  cras_alsa_jack_list_add_jack_for_section_result_jack =
-      reinterpret_cast<struct cras_alsa_jack*>(20);
-  cras_alsa_mixer_get_control_for_section_return_value = output;
-  ASSERT_EQ(0, alsa_iodev_ucm_add_nodes_and_jacks(iodev, section));
-  EXPECT_EQ(7, cras_card_config_get_volume_curve_for_control_called);
-  ucm_section_free_list(section);
-
-  // Both nodes are associated with the same mixer output. Different jack plug
-  // report should trigger different node attribute change.
-  cras_alsa_jack_get_mixer_output_ret = output;
-  jack_output_plug_event(reinterpret_cast<struct cras_alsa_jack*>(10), 0, aio);
-  EXPECT_STREQ(cras_iodev_set_node_plugged_ionode->name, HEADPHONE);
-
-  jack_output_plug_event(reinterpret_cast<struct cras_alsa_jack*>(20), 0, aio);
-  EXPECT_STREQ(cras_iodev_set_node_plugged_ionode->name, "Line Out");
-
-  alsa_iodev_destroy(iodev);
-}
-
-TEST(AlsaOutputNode, MaxSupportedChannels) {
-  struct cras_use_case_mgr* const fake_ucm = (struct cras_use_case_mgr*)3;
-  struct cras_iodev* iodev;
-  struct ucm_section* section;
-  int i;
-
-  // i = 0: cras_alsa_support_8_channels is false, support 2 channels only.
-  // i = 1: cras_alsa_support_8_channels is true, support up to 8 channels.
-  for (i = 0; i < 2; i++) {
-    ResetStubData();
-    cras_alsa_support_8_channels = (bool)i;
-
-    // Create the IO device.
-    iodev = alsa_iodev_create_with_default_parameters(
-        1, NULL, ALSA_CARD_TYPE_INTERNAL, 1, fake_mixer, fake_config, fake_ucm,
-        CRAS_STREAM_OUTPUT);
-    ASSERT_NE(iodev, (void*)NULL);
-
-    // Node without controls or jacks.
-    section = ucm_section_create(INTERNAL_SPEAKER, "hw:0,1", 1, -1,
-                                 CRAS_STREAM_OUTPUT, NULL, NULL);
-    // Device index doesn't match.
-    EXPECT_EQ(-22, alsa_iodev_ucm_add_nodes_and_jacks(iodev, section));
-    section->dev_idx = 0;
-    ASSERT_EQ(0, alsa_iodev_ucm_add_nodes_and_jacks(iodev, section));
-    ucm_section_free_list(section);
-
-    // Complete initialization, and make first node active.
-    alsa_iodev_ucm_complete_init(iodev);
-    /* Call cras_alsa_fill_properties once on update_max_supported_channels. */
-    EXPECT_EQ(1, cras_alsa_fill_properties_called);
-    uint32_t max_channels = (cras_alsa_support_8_channels) ? 8 : 2;
-    EXPECT_EQ(max_channels, iodev->info.max_supported_channels);
-    alsa_iodev_destroy(iodev);
-  }
-}
-
-TEST(AlsaOutputNode, OutputsFromUCM) {
-  struct alsa_io* aio;
-  struct cras_alsa_mixer* const fake_mixer = (struct cras_alsa_mixer*)2;
-  struct cras_use_case_mgr* const fake_ucm = (struct cras_use_case_mgr*)3;
-  struct cras_iodev* iodev;
-  static const char* jack_name = "TestCard - Headset Jack";
-  struct mixer_control* outputs[2];
-  int rc;
-  struct ucm_section* section;
-
-  ResetStubData();
-  outputs[0] = reinterpret_cast<struct mixer_control*>(3);
-  outputs[1] = reinterpret_cast<struct mixer_control*>(4);
-  cras_alsa_mixer_list_outputs_outputs = outputs;
-  cras_alsa_mixer_list_outputs_outputs_length = ARRAY_SIZE(outputs);
-  cras_alsa_mixer_get_control_name_values[outputs[0]] = INTERNAL_SPEAKER;
-  cras_alsa_mixer_get_control_name_values[outputs[1]] = HEADPHONE;
-  ucm_get_dma_period_for_dev_ret = 1000;
-
-  // Create the IO device.
-  iodev = alsa_iodev_create_with_default_parameters(
-      0, NULL, ALSA_CARD_TYPE_INTERNAL, 1, fake_mixer, fake_config, fake_ucm,
-      CRAS_STREAM_OUTPUT);
-  ASSERT_NE(iodev, (void*)NULL);
-  aio = reinterpret_cast<struct alsa_io*>(iodev);
-  EXPECT_EQ(1, cras_card_config_get_volume_curve_for_control_called);
-
-  // First node.
-  section = ucm_section_create(INTERNAL_SPEAKER, "hw:0,1", 0, -1,
-                               CRAS_STREAM_OUTPUT, NULL, NULL);
-  ucm_section_set_mixer_name(section, INTERNAL_SPEAKER);
-  cras_alsa_jack_list_add_jack_for_section_result_jack =
-      reinterpret_cast<struct cras_alsa_jack*>(1);
-  cras_alsa_mixer_get_control_for_section_return_value = outputs[0];
-  ASSERT_EQ(0, alsa_iodev_ucm_add_nodes_and_jacks(iodev, section));
-  ucm_section_free_list(section);
-  EXPECT_EQ(4, cras_card_config_get_volume_curve_for_control_called);
-
-  // Add a second node (will use the same iodev).
-  section = ucm_section_create(HEADPHONE, "hw:0,2", 0, -1, CRAS_STREAM_OUTPUT,
-                               jack_name, "hctl");
-  ucm_section_add_coupled(section, "HP-L", MIXER_NAME_VOLUME);
-  ucm_section_add_coupled(section, "HP-R", MIXER_NAME_VOLUME);
-  cras_alsa_jack_list_add_jack_for_section_result_jack = NULL;
-  cras_alsa_mixer_get_control_for_section_return_value = outputs[1];
-  ASSERT_EQ(0, alsa_iodev_ucm_add_nodes_and_jacks(iodev, section));
-  ucm_section_free_list(section);
-  /* New nodes creation calls get volume curve once, NULL jack doesn't make
-   * more calls. */
-  EXPECT_EQ(5, cras_card_config_get_volume_curve_for_control_called);
-
-  // Jack plug of an unkonwn device should do nothing.
-  cras_alsa_jack_get_mixer_output_ret = NULL;
-  cras_alsa_jack_get_name_ret_value = "Some other jack";
-  jack_output_plug_event(reinterpret_cast<struct cras_alsa_jack*>(4), 0, aio);
-  EXPECT_EQ(0, cras_iodev_set_node_plugged_called);
-
-  // Complete initialization, and make first node active.
-  cras_alsa_support_8_channels = false;  // Support 2 channels only.
-  alsa_iodev_ucm_complete_init(iodev);
-  EXPECT_EQ(SND_PCM_STREAM_PLAYBACK, aio->alsa_stream);
-  EXPECT_EQ(2, cras_alsa_jack_list_add_jack_for_section_called);
-  EXPECT_EQ(2, cras_alsa_mixer_get_control_for_section_called);
-  EXPECT_EQ(1, ucm_get_dma_period_for_dev_called);
-  EXPECT_EQ(ucm_get_dma_period_for_dev_ret, aio->dma_period_set_microsecs);
-  /* Call cras_alsa_fill_properties once on update_max_supported_channels. */
-  EXPECT_EQ(1, cras_alsa_fill_properties_called);
-  EXPECT_EQ(2, iodev->info.max_supported_channels);
-
-  aio->handle = (snd_pcm_t*)0x24;
-
-  ResetStubData();
-  rc = alsa_iodev_set_active_node(iodev, aio->base.nodes->next, 1);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(1, alsa_mixer_set_mute_called);
-  EXPECT_EQ(outputs[1], alsa_mixer_set_mute_output);
-  EXPECT_EQ(1, alsa_mixer_set_dBFS_called);
-  EXPECT_EQ(outputs[1], alsa_mixer_set_dBFS_output);
-  ASSERT_EQ(2, cras_alsa_mixer_set_output_active_state_called);
-  EXPECT_EQ(outputs[0], cras_alsa_mixer_set_output_active_state_outputs[0]);
-  EXPECT_EQ(0, cras_alsa_mixer_set_output_active_state_values[0]);
-  EXPECT_EQ(outputs[1], cras_alsa_mixer_set_output_active_state_outputs[1]);
-  EXPECT_EQ(1, cras_alsa_mixer_set_output_active_state_values[1]);
-  EXPECT_EQ(1, cras_iodev_update_dsp_called);
-  EXPECT_EQ(1, cras_alsa_jack_enable_ucm_called);
-  EXPECT_EQ(1, ucm_set_enabled_called);
-
-  // Simulate jack plug event.
-  cras_alsa_support_8_channels = true;  // Support up to 8 channels.
-  cras_alsa_jack_get_mixer_output_ret = outputs[1];
-  cras_alsa_jack_get_name_ret_value = jack_name;
-  jack_output_plug_event(reinterpret_cast<struct cras_alsa_jack*>(4), 0, aio);
-  EXPECT_EQ(1, cras_iodev_set_node_plugged_called);
-  /* Headphone plug event shouldn't trigger update_max_supported_channels. */
-  EXPECT_EQ(0, cras_alsa_fill_properties_called);
-  EXPECT_EQ(2, iodev->info.max_supported_channels);
-
-  alsa_iodev_destroy(iodev);
-}
-
-TEST(AlsaOutputNode, OutputNoControlsUCM) {
-  struct alsa_io* aio;
-  struct cras_use_case_mgr* const fake_ucm = (struct cras_use_case_mgr*)3;
-  struct cras_iodev* iodev;
-  struct ucm_section* section;
-
-  ResetStubData();
-
-  // Create the IO device.
-  iodev = alsa_iodev_create_with_default_parameters(
-      1, NULL, ALSA_CARD_TYPE_INTERNAL, 1, fake_mixer, fake_config, fake_ucm,
-      CRAS_STREAM_OUTPUT);
-  ASSERT_NE(iodev, (void*)NULL);
-  aio = reinterpret_cast<struct alsa_io*>(iodev);
-  EXPECT_EQ(1, cras_card_config_get_volume_curve_for_control_called);
-
-  // Node without controls or jacks.
-  section = ucm_section_create(INTERNAL_SPEAKER, "hw:0,1", 1, -1,
-                               CRAS_STREAM_OUTPUT, NULL, NULL);
-  // Device index doesn't match.
-  EXPECT_EQ(-22, alsa_iodev_ucm_add_nodes_and_jacks(iodev, section));
-  section->dev_idx = 0;
-  ASSERT_EQ(0, alsa_iodev_ucm_add_nodes_and_jacks(iodev, section));
-  EXPECT_EQ(2, cras_card_config_get_volume_curve_for_control_called);
-  EXPECT_EQ(1, cras_alsa_mixer_get_control_for_section_called);
-  EXPECT_EQ(1, cras_iodev_add_node_called);
-  ucm_section_free_list(section);
-
-  // Complete initialization, and make first node active.
-  alsa_iodev_ucm_complete_init(iodev);
-  EXPECT_EQ(SND_PCM_STREAM_PLAYBACK, aio->alsa_stream);
-  EXPECT_EQ(0, cras_alsa_mixer_get_control_name_called);
-  EXPECT_EQ(1, cras_iodev_update_dsp_called);
-  EXPECT_EQ(0, cras_alsa_jack_enable_ucm_called);
-  EXPECT_EQ(1, ucm_set_enabled_called);
-
-  alsa_iodev_destroy(iodev);
-}
-
-TEST(AlsaOutputNode, OutputFromJackUCM) {
-  struct alsa_io* aio;
-  struct cras_use_case_mgr* const fake_ucm = (struct cras_use_case_mgr*)3;
-  struct cras_iodev* iodev;
-  static const char* jack_name = "TestCard - Headset Jack";
-  struct ucm_section* section;
-
-  ResetStubData();
-
-  // Create the IO device.
-  iodev = alsa_iodev_create_with_default_parameters(
-      1, NULL, ALSA_CARD_TYPE_INTERNAL, 1, fake_mixer, fake_config, fake_ucm,
-      CRAS_STREAM_OUTPUT);
-  ASSERT_NE(iodev, (void*)NULL);
-  aio = reinterpret_cast<struct alsa_io*>(iodev);
-  EXPECT_EQ(1, cras_card_config_get_volume_curve_for_control_called);
-
-  // Node without controls or jacks.
-  cras_alsa_jack_list_add_jack_for_section_result_jack =
-      reinterpret_cast<struct cras_alsa_jack*>(1);
-  section = ucm_section_create(HEADPHONE, "hw:0,1", 0, -1, CRAS_STREAM_OUTPUT,
-                               jack_name, "hctl");
-  ASSERT_EQ(0, alsa_iodev_ucm_add_nodes_and_jacks(iodev, section));
-  EXPECT_EQ(4, cras_card_config_get_volume_curve_for_control_called);
-  EXPECT_EQ(1, cras_alsa_mixer_get_control_for_section_called);
-  EXPECT_EQ(1, cras_iodev_add_node_called);
-  EXPECT_EQ(1, cras_alsa_jack_list_add_jack_for_section_called);
-  ucm_section_free_list(section);
-
-  // Complete initialization, and make first node active.
-  alsa_iodev_ucm_complete_init(iodev);
-  EXPECT_EQ(SND_PCM_STREAM_PLAYBACK, aio->alsa_stream);
-  EXPECT_EQ(0, cras_alsa_mixer_get_control_name_called);
-  EXPECT_EQ(1, cras_iodev_update_dsp_called);
-  EXPECT_EQ(1, cras_alsa_jack_enable_ucm_called);
-  EXPECT_EQ(0, ucm_set_enabled_called);
-
-  alsa_iodev_destroy(iodev);
-}
-
-TEST(AlsaOutputNode, InputsFromUCM) {
-  struct alsa_io* aio;
-  struct cras_alsa_mixer* const fake_mixer = (struct cras_alsa_mixer*)2;
-  struct cras_use_case_mgr* const fake_ucm = (struct cras_use_case_mgr*)3;
-  struct mixer_control* inputs[2];
-  struct cras_iodev* iodev;
-  static const char* jack_name = "TestCard - Headset Jack";
-  int rc;
-  struct ucm_section* section;
-  long intrinsic_sensitivity = -2700;
-
-  ResetStubData();
-  inputs[0] = reinterpret_cast<struct mixer_control*>(3);
-  inputs[1] = reinterpret_cast<struct mixer_control*>(4);
-  cras_alsa_mixer_list_inputs_outputs = inputs;
-  cras_alsa_mixer_list_inputs_outputs_length = ARRAY_SIZE(inputs);
-  cras_alsa_mixer_get_control_name_values[inputs[0]] = INTERNAL_MICROPHONE;
-  cras_alsa_mixer_get_control_name_values[inputs[1]] = MIC;
-
-  // Create the IO device.
-  iodev = alsa_iodev_create_with_default_parameters(
-      0, NULL, ALSA_CARD_TYPE_INTERNAL, 1, fake_mixer, fake_config, fake_ucm,
-      CRAS_STREAM_INPUT);
-  ASSERT_NE(iodev, (void*)NULL);
-  aio = reinterpret_cast<struct alsa_io*>(iodev);
-
-  // First node.
-  cras_alsa_mixer_get_control_for_section_return_value = inputs[0];
-  section = ucm_section_create(INTERNAL_MICROPHONE, "hw:0,1", 0, -1,
-                               CRAS_STREAM_INPUT, NULL, NULL);
-  ucm_section_add_coupled(section, "MIC-L", MIXER_NAME_VOLUME);
-  ucm_section_add_coupled(section, "MIC-R", MIXER_NAME_VOLUME);
-  ASSERT_EQ(0, alsa_iodev_ucm_add_nodes_and_jacks(iodev, section));
-  ucm_section_free_list(section);
-
-  // Add a second node (will use the same iodev).
-  cras_alsa_mixer_get_control_name_called = 0;
-  // Set intrinsic sensitivity to enable software gain.
-  ucm_get_intrinsic_sensitivity_values[MIC] = intrinsic_sensitivity;
-  cras_alsa_jack_list_add_jack_for_section_result_jack =
-      reinterpret_cast<struct cras_alsa_jack*>(1);
-  cras_alsa_mixer_get_control_for_section_return_value = inputs[1];
-  section = ucm_section_create(MIC, "hw:0,2", 0, -1, CRAS_STREAM_INPUT,
-                               jack_name, "hctl");
-  ucm_section_set_mixer_name(section, MIC);
-  ASSERT_EQ(0, alsa_iodev_ucm_add_nodes_and_jacks(iodev, section));
-  ucm_section_free_list(section);
-
-  // Jack plug of an unknown device should do nothing.
-  cras_alsa_jack_get_mixer_input_ret = NULL;
-  cras_alsa_jack_get_name_ret_value = "Some other jack";
-  jack_input_plug_event(reinterpret_cast<struct cras_alsa_jack*>(4), 0, aio);
-  EXPECT_EQ(0, cras_iodev_set_node_plugged_called);
-
-  // Simulate jack plug event.
-  cras_alsa_jack_get_mixer_input_ret = inputs[1];
-  cras_alsa_jack_get_name_ret_value = jack_name;
-  jack_input_plug_event(reinterpret_cast<struct cras_alsa_jack*>(4), 0, aio);
-  EXPECT_EQ(1, cras_iodev_set_node_plugged_called);
-
-  // Complete initialization, and make first node active.
-  alsa_iodev_ucm_complete_init(iodev);
-  EXPECT_EQ(SND_PCM_STREAM_CAPTURE, aio->alsa_stream);
-  EXPECT_EQ(2, cras_alsa_jack_list_add_jack_for_section_called);
-  EXPECT_EQ(2, cras_alsa_mixer_get_control_for_section_called);
-  EXPECT_EQ(1, cras_alsa_mixer_get_control_name_called);
-  EXPECT_EQ(2, cras_iodev_add_node_called);
-  EXPECT_EQ(2, ucm_get_dma_period_for_dev_called);
-  EXPECT_EQ(0, aio->dma_period_set_microsecs);
-
-  aio->handle = (snd_pcm_t*)0x24;
-
-  ResetStubData();
-  rc = alsa_iodev_set_active_node(iodev, aio->base.nodes->next, 1);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(1, alsa_mixer_set_capture_dBFS_called);
-  EXPECT_EQ(inputs[1], alsa_mixer_set_capture_dBFS_input);
-  EXPECT_EQ(0, alsa_mixer_set_capture_dBFS_value);
-  EXPECT_EQ(1, cras_iodev_update_dsp_called);
-  EXPECT_EQ(1, cras_alsa_jack_enable_ucm_called);
-  EXPECT_EQ(1, ucm_set_enabled_called);
-  EXPECT_EQ(1, alsa_mixer_set_capture_mute_called);
-  ASSERT_EQ(DEFAULT_CAPTURE_VOLUME_DBFS - intrinsic_sensitivity,
-            iodev->active_node->capture_gain);
-
-  alsa_iodev_destroy(iodev);
-}
-
-TEST(AlsaOutputNode, InputNoControlsUCM) {
-  struct alsa_io* aio;
-  struct cras_use_case_mgr* const fake_ucm = (struct cras_use_case_mgr*)3;
-  struct cras_iodev* iodev;
-  struct ucm_section* section;
-
-  ResetStubData();
-
-  // Create the IO device.
-  iodev = alsa_iodev_create_with_default_parameters(
-      1, NULL, ALSA_CARD_TYPE_INTERNAL, 1, fake_mixer, fake_config, fake_ucm,
-      CRAS_STREAM_INPUT);
-  ASSERT_NE(iodev, (void*)NULL);
-  aio = reinterpret_cast<struct alsa_io*>(iodev);
-
-  // Node without controls or jacks.
-  section = ucm_section_create(INTERNAL_MICROPHONE, "hw:0,1", 1, -1,
-                               CRAS_STREAM_INPUT, NULL, NULL);
-  // Device index doesn't match.
-  EXPECT_EQ(-22, alsa_iodev_ucm_add_nodes_and_jacks(iodev, section));
-  section->dev_idx = 0;
-  ASSERT_EQ(0, alsa_iodev_ucm_add_nodes_and_jacks(iodev, section));
-  EXPECT_EQ(1, cras_alsa_jack_list_add_jack_for_section_called);
-  EXPECT_EQ(1, cras_alsa_mixer_get_control_for_section_called);
-  EXPECT_EQ(0, cras_alsa_mixer_get_control_name_called);
-  EXPECT_EQ(1, cras_iodev_add_node_called);
-  ucm_section_free_list(section);
-
-  // Complete initialization, and make first node active.
-  alsa_iodev_ucm_complete_init(iodev);
-  EXPECT_EQ(SND_PCM_STREAM_CAPTURE, aio->alsa_stream);
-  EXPECT_EQ(0, cras_alsa_mixer_get_control_name_called);
-  EXPECT_EQ(1, cras_iodev_update_dsp_called);
-  EXPECT_EQ(0, cras_alsa_jack_enable_ucm_called);
-  EXPECT_EQ(1, ucm_set_enabled_called);
-
-  alsa_iodev_destroy(iodev);
-}
-
-TEST(AlsaOutputNode, InputFromJackUCM) {
-  struct alsa_io* aio;
-  struct cras_use_case_mgr* const fake_ucm = (struct cras_use_case_mgr*)3;
-  struct cras_iodev* iodev;
-  static const char* jack_name = "TestCard - Headset Jack";
-  struct ucm_section* section;
-
-  ResetStubData();
-
-  // Create the IO device.
-  iodev = alsa_iodev_create_with_default_parameters(
-      1, NULL, ALSA_CARD_TYPE_INTERNAL, 1, fake_mixer, fake_config, fake_ucm,
-      CRAS_STREAM_INPUT);
-  ASSERT_NE(iodev, (void*)NULL);
-  aio = reinterpret_cast<struct alsa_io*>(iodev);
-
-  // Node without controls or jacks.
-  cras_alsa_jack_list_add_jack_for_section_result_jack =
-      reinterpret_cast<struct cras_alsa_jack*>(1);
-  section = ucm_section_create(MIC, "hw:0,1", 0, -1, CRAS_STREAM_INPUT,
-                               jack_name, "hctl");
-  ASSERT_EQ(0, alsa_iodev_ucm_add_nodes_and_jacks(iodev, section));
-  EXPECT_EQ(1, cras_alsa_mixer_get_control_for_section_called);
-  EXPECT_EQ(1, cras_iodev_add_node_called);
-  EXPECT_EQ(1, cras_alsa_jack_list_add_jack_for_section_called);
-  ucm_section_free_list(section);
-
-  // Complete initialization, and make first node active.
-  alsa_iodev_ucm_complete_init(iodev);
-  EXPECT_EQ(SND_PCM_STREAM_CAPTURE, aio->alsa_stream);
-  EXPECT_EQ(0, cras_alsa_mixer_get_control_name_called);
-  EXPECT_EQ(1, cras_iodev_update_dsp_called);
-  EXPECT_EQ(1, cras_alsa_jack_enable_ucm_called);
-  EXPECT_EQ(0, ucm_set_enabled_called);
-
-  alsa_iodev_destroy(iodev);
-}
-
-TEST(AlsaOutputNode, AutoUnplugOutputNode) {
-  struct alsa_io* aio;
-  struct cras_alsa_mixer* const fake_mixer = (struct cras_alsa_mixer*)2;
-  struct cras_use_case_mgr* const fake_ucm = (struct cras_use_case_mgr*)3;
-  struct mixer_control* outputs[2];
-  const struct cras_alsa_jack* jack = (struct cras_alsa_jack*)4;
-
-  ResetStubData();
-  outputs[0] = reinterpret_cast<struct mixer_control*>(5);
-  outputs[1] = reinterpret_cast<struct mixer_control*>(6);
-
-  cras_alsa_mixer_list_outputs_outputs = outputs;
-  cras_alsa_mixer_list_outputs_outputs_length = ARRAY_SIZE(outputs);
-
-  cras_alsa_mixer_get_control_name_values[outputs[0]] = INTERNAL_SPEAKER;
-  cras_alsa_mixer_get_control_name_values[outputs[1]] = HEADPHONE;
-  auto_unplug_output_node_ret = 1;
-
-  aio = (struct alsa_io*)alsa_iodev_create_with_default_parameters(
-      0, NULL, ALSA_CARD_TYPE_INTERNAL, 1, fake_mixer, fake_config, fake_ucm,
-      CRAS_STREAM_OUTPUT);
-
-  ASSERT_EQ(0, alsa_iodev_legacy_complete_init((struct cras_iodev*)aio));
-  EXPECT_EQ(3, cras_card_config_get_volume_curve_for_control_called);
-  EXPECT_EQ(1, cras_alsa_mixer_list_outputs_called);
-  EXPECT_EQ(2, cras_alsa_mixer_get_control_name_called);
-
-  // Assert that the the internal speaker is plugged and other nodes aren't.
-  ASSERT_NE(aio->base.nodes, (void*)NULL);
-  EXPECT_EQ(aio->base.nodes->plugged, 1);
-  ASSERT_NE(aio->base.nodes->next, (void*)NULL);
-  EXPECT_EQ(aio->base.nodes->next->plugged, 0);
-
-  // Plug headphone jack
-  cras_alsa_jack_get_name_ret_value = "Headphone Jack";
-  is_utf8_string_ret_value = 1;
-  cras_alsa_jack_get_mixer_output_ret = outputs[1];
-  cras_alsa_jack_list_create_cb(jack, 1, cras_alsa_jack_list_create_cb_data);
-
-  // Assert internal speaker is auto unplugged
-  EXPECT_EQ(aio->base.nodes->plugged, 0);
-  EXPECT_EQ(aio->base.nodes->next->plugged, 1);
-
-  alsa_iodev_destroy((struct cras_iodev*)aio);
-}
-
-TEST(AlsaOutputNode, AutoUnplugInputNode) {
-  struct alsa_io* aio;
-  struct cras_alsa_mixer* const fake_mixer = (struct cras_alsa_mixer*)2;
-  struct cras_use_case_mgr* const fake_ucm = (struct cras_use_case_mgr*)3;
-  struct mixer_control* inputs[2];
-  const struct cras_alsa_jack* jack = (struct cras_alsa_jack*)4;
-
-  ResetStubData();
-  inputs[0] = reinterpret_cast<struct mixer_control*>(5);
-  inputs[1] = reinterpret_cast<struct mixer_control*>(6);
-
-  cras_alsa_mixer_list_inputs_outputs = inputs;
-  cras_alsa_mixer_list_inputs_outputs_length = ARRAY_SIZE(inputs);
-
-  cras_alsa_mixer_get_control_name_values[inputs[0]] = INTERNAL_MICROPHONE;
-  cras_alsa_mixer_get_control_name_values[inputs[1]] = MIC;
-  auto_unplug_input_node_ret = 1;
-
-  aio = (struct alsa_io*)alsa_iodev_create_with_default_parameters(
-      0, NULL, ALSA_CARD_TYPE_INTERNAL, 1, fake_mixer, fake_config, fake_ucm,
-      CRAS_STREAM_INPUT);
-  ASSERT_EQ(0, alsa_iodev_legacy_complete_init((struct cras_iodev*)aio));
-  EXPECT_EQ(1, cras_alsa_mixer_list_inputs_called);
-  EXPECT_EQ(2, cras_alsa_mixer_get_control_name_called);
-
-  // Assert that the the internal speaker is plugged and other nodes aren't.
-  ASSERT_NE(aio->base.nodes, (void*)NULL);
-  EXPECT_EQ(aio->base.nodes->plugged, 1);
-  ASSERT_NE(aio->base.nodes->next, (void*)NULL);
-  EXPECT_EQ(aio->base.nodes->next->plugged, 0);
-
-  // Plug headphone jack
-  cras_alsa_jack_get_name_ret_value = "Mic Jack";
-  is_utf8_string_ret_value = 1;
-  cras_alsa_jack_get_mixer_input_ret = inputs[1];
-  cras_alsa_jack_list_create_cb(jack, 1, cras_alsa_jack_list_create_cb_data);
-
-  // Assert internal speaker is auto unplugged
-  EXPECT_EQ(aio->base.nodes->plugged, 0);
-  EXPECT_EQ(aio->base.nodes->next->plugged, 1);
-
-  alsa_iodev_destroy((struct cras_iodev*)aio);
-}
-
-TEST(AlsaLoopback, InitializePlayback) {
-  struct alsa_io* aio;
-  struct cras_alsa_mixer* const fake_mixer = (struct cras_alsa_mixer*)2;
-  struct cras_use_case_mgr* const fake_ucm = (struct cras_use_case_mgr*)3;
-  struct cras_iodev* iodev;
-  static const char* jack_name = "TestCard - Alsa Loopback";
-  struct mixer_control* outputs[1];
-  struct ucm_section* section;
-
-  ResetStubData();
-  outputs[0] = reinterpret_cast<struct mixer_control*>(3);
-  cras_alsa_mixer_list_outputs_outputs = outputs;
-  cras_alsa_mixer_list_outputs_outputs_length = ARRAY_SIZE(outputs);
-  cras_alsa_mixer_get_control_name_values[outputs[0]] = LOOPBACK_PLAYBACK;
-
-  // Create the IO device.
-  iodev = alsa_iodev_create_with_default_parameters(
-      0, NULL, ALSA_CARD_TYPE_INTERNAL, 1, fake_mixer, fake_config, fake_ucm,
-      CRAS_STREAM_OUTPUT);
-  ASSERT_NE(iodev, (void*)NULL);
-  aio = reinterpret_cast<struct alsa_io*>(iodev);
-
-  // Add node.
-  section = ucm_section_create(LOOPBACK_PLAYBACK, "hw:0,1", 0, -1,
-                               CRAS_STREAM_OUTPUT, jack_name, NULL);
-  ucm_section_set_mixer_name(section, LOOPBACK_PLAYBACK);
-  cras_alsa_jack_list_add_jack_for_section_result_jack = NULL;
-  cras_alsa_mixer_get_control_for_section_return_value = outputs[0];
-  ASSERT_EQ(0, alsa_iodev_ucm_add_nodes_and_jacks(iodev, section));
-  ucm_section_free_list(section);
-
-  // Complete initialization, and check the loopback playback node is plugged as
-  // the active node.
-  alsa_iodev_ucm_complete_init(iodev);
-  EXPECT_EQ(SND_PCM_STREAM_PLAYBACK, aio->alsa_stream);
-  ASSERT_NE(aio->base.active_node, (void*)NULL);
-  EXPECT_STREQ(LOOPBACK_PLAYBACK, aio->base.active_node->name);
-  EXPECT_EQ(1, aio->base.active_node->plugged);
-
-  alsa_iodev_destroy(iodev);
-}
-
-TEST(AlsaLoopback, InitializeCapture) {
-  struct alsa_io* aio;
-  struct cras_use_case_mgr* const fake_ucm = (struct cras_use_case_mgr*)3;
-  struct cras_iodev* iodev;
-  static const char* jack_name = "TestCard - Alsa Loopback";
-  struct ucm_section* section;
-
-  ResetStubData();
-
-  // Create the IO device.
-  iodev = alsa_iodev_create_with_default_parameters(
-      1, NULL, ALSA_CARD_TYPE_INTERNAL, 1, fake_mixer, fake_config, fake_ucm,
-      CRAS_STREAM_INPUT);
-  ASSERT_NE(iodev, (void*)NULL);
-  aio = reinterpret_cast<struct alsa_io*>(iodev);
-
-  // Node without controls or jacks.
-  cras_alsa_jack_list_add_jack_for_section_result_jack =
-      reinterpret_cast<struct cras_alsa_jack*>(1);
-  section = ucm_section_create(LOOPBACK_CAPTURE, "hw:0,1", 0, -1,
-                               CRAS_STREAM_INPUT, jack_name, NULL);
-  ASSERT_EQ(0, alsa_iodev_ucm_add_nodes_and_jacks(iodev, section));
-  ucm_section_free_list(section);
-
-  // Complete initialization, and check the loopback capture node is plugged as
-  // the active node.
-  alsa_iodev_ucm_complete_init(iodev);
-  EXPECT_EQ(SND_PCM_STREAM_CAPTURE, aio->alsa_stream);
-  ASSERT_NE(aio->base.active_node, (void*)NULL);
-  EXPECT_STREQ(LOOPBACK_CAPTURE, aio->base.active_node->name);
-  EXPECT_EQ(1, aio->base.active_node->plugged);
-
-  alsa_iodev_destroy(iodev);
-}
-
-TEST(AlsaInitNode, SetNodeInitialState) {
-  struct cras_ionode node;
-  struct cras_iodev dev;
-
-  memset(&dev, 0, sizeof(dev));
-  memset(&node, 0, sizeof(node));
-  node.dev = &dev;
-  strcpy(node.name, "Unknown");
-  dev.direction = CRAS_STREAM_OUTPUT;
-  set_node_initial_state(&node, ALSA_CARD_TYPE_INTERNAL);
-  ASSERT_EQ(0, node.plugged);
-  ASSERT_EQ(0, node.plugged_time.tv_sec);
-  ASSERT_EQ(CRAS_NODE_TYPE_UNKNOWN, node.type);
-  ASSERT_EQ(NODE_POSITION_EXTERNAL, node.position);
-
-  memset(&node, 0, sizeof(node));
-  node.dev = &dev;
-  strcpy(node.name, INTERNAL_SPEAKER);
-  dev.direction = CRAS_STREAM_OUTPUT;
-  set_node_initial_state(&node, ALSA_CARD_TYPE_INTERNAL);
-  ASSERT_EQ(1, node.plugged);
-  ASSERT_GT(node.plugged_time.tv_sec, 0);
-  ASSERT_EQ(CRAS_NODE_TYPE_INTERNAL_SPEAKER, node.type);
-  ASSERT_EQ(NODE_POSITION_INTERNAL, node.position);
-
-  memset(&node, 0, sizeof(node));
-  node.dev = &dev;
-  strcpy(node.name, INTERNAL_MICROPHONE);
-  dev.direction = CRAS_STREAM_INPUT;
-  set_node_initial_state(&node, ALSA_CARD_TYPE_INTERNAL);
-  ASSERT_EQ(1, node.plugged);
-  ASSERT_GT(node.plugged_time.tv_sec, 0);
-  ASSERT_EQ(CRAS_NODE_TYPE_MIC, node.type);
-  ASSERT_EQ(NODE_POSITION_INTERNAL, node.position);
-
-  memset(&node, 0, sizeof(node));
-  node.dev = &dev;
-  strcpy(node.name, HDMI);
-  dev.direction = CRAS_STREAM_OUTPUT;
-  set_node_initial_state(&node, ALSA_CARD_TYPE_INTERNAL);
-  ASSERT_EQ(0, node.plugged);
-  ASSERT_EQ(0, node.plugged_time.tv_sec);
-  ASSERT_EQ(CRAS_NODE_TYPE_HDMI, node.type);
-  ASSERT_EQ(NODE_POSITION_EXTERNAL, node.position);
-
-  memset(&node, 0, sizeof(node));
-  node.dev = &dev;
-  strcpy(node.name, "IEC958");
-  dev.direction = CRAS_STREAM_OUTPUT;
-  set_node_initial_state(&node, ALSA_CARD_TYPE_INTERNAL);
-  ASSERT_EQ(0, node.plugged);
-  ASSERT_EQ(CRAS_NODE_TYPE_HDMI, node.type);
-  ASSERT_EQ(NODE_POSITION_EXTERNAL, node.position);
-
-  memset(&node, 0, sizeof(node));
-  node.dev = &dev;
-  strcpy(node.name, "HDMI Jack");
-  dev.direction = CRAS_STREAM_OUTPUT;
-  set_node_initial_state(&node, ALSA_CARD_TYPE_INTERNAL);
-  ASSERT_EQ(0, node.plugged);
-  ASSERT_EQ(CRAS_NODE_TYPE_HDMI, node.type);
-  ASSERT_EQ(NODE_POSITION_EXTERNAL, node.position);
-
-  memset(&node, 0, sizeof(node));
-  node.dev = &dev;
-  strcpy(node.name, "Something HDMI Jack");
-  dev.direction = CRAS_STREAM_OUTPUT;
-  set_node_initial_state(&node, ALSA_CARD_TYPE_INTERNAL);
-  ASSERT_EQ(0, node.plugged);
-  ASSERT_EQ(CRAS_NODE_TYPE_HDMI, node.type);
-  ASSERT_EQ(NODE_POSITION_EXTERNAL, node.position);
-
-  memset(&node, 0, sizeof(node));
-  node.dev = &dev;
-  strcpy(node.name, HEADPHONE);
-  dev.direction = CRAS_STREAM_OUTPUT;
-  set_node_initial_state(&node, ALSA_CARD_TYPE_INTERNAL);
-  ASSERT_EQ(0, node.plugged);
-  ASSERT_EQ(CRAS_NODE_TYPE_HEADPHONE, node.type);
-  ASSERT_EQ(NODE_POSITION_EXTERNAL, node.position);
-
-  memset(&node, 0, sizeof(node));
-  node.dev = &dev;
-  strcpy(node.name, "Headphone Jack");
-  dev.direction = CRAS_STREAM_OUTPUT;
-  set_node_initial_state(&node, ALSA_CARD_TYPE_INTERNAL);
-  ASSERT_EQ(0, node.plugged);
-  ASSERT_EQ(CRAS_NODE_TYPE_HEADPHONE, node.type);
-  ASSERT_EQ(NODE_POSITION_EXTERNAL, node.position);
-
-  memset(&node, 0, sizeof(node));
-  node.dev = &dev;
-  strcpy(node.name, MIC);
-  dev.direction = CRAS_STREAM_INPUT;
-  set_node_initial_state(&node, ALSA_CARD_TYPE_INTERNAL);
-  ASSERT_EQ(0, node.plugged);
-  ASSERT_EQ(CRAS_NODE_TYPE_MIC, node.type);
-  ASSERT_EQ(NODE_POSITION_EXTERNAL, node.position);
-
-  memset(&node, 0, sizeof(node));
-  node.dev = &dev;
-  strcpy(node.name, "Front Mic");
-  dev.direction = CRAS_STREAM_INPUT;
-  set_node_initial_state(&node, ALSA_CARD_TYPE_INTERNAL);
-  ASSERT_EQ(1, node.plugged);
-  ASSERT_EQ(CRAS_NODE_TYPE_MIC, node.type);
-  ASSERT_EQ(NODE_POSITION_FRONT, node.position);
-
-  memset(&node, 0, sizeof(node));
-  node.dev = &dev;
-  strcpy(node.name, "Rear Mic");
-  dev.direction = CRAS_STREAM_INPUT;
-  set_node_initial_state(&node, ALSA_CARD_TYPE_INTERNAL);
-  ASSERT_EQ(1, node.plugged);
-  ASSERT_EQ(CRAS_NODE_TYPE_MIC, node.type);
-  ASSERT_EQ(NODE_POSITION_REAR, node.position);
-
-  memset(&node, 0, sizeof(node));
-  node.dev = &dev;
-  strcpy(node.name, "Mic Jack");
-  dev.direction = CRAS_STREAM_INPUT;
-  set_node_initial_state(&node, ALSA_CARD_TYPE_INTERNAL);
-  ASSERT_EQ(0, node.plugged);
-  ASSERT_EQ(CRAS_NODE_TYPE_MIC, node.type);
-  ASSERT_EQ(NODE_POSITION_EXTERNAL, node.position);
-
-  memset(&node, 0, sizeof(node));
-  node.dev = &dev;
-  strcpy(node.name, "Unknown");
-  dev.direction = CRAS_STREAM_OUTPUT;
-  set_node_initial_state(&node, ALSA_CARD_TYPE_USB);
-  ASSERT_EQ(0, node.plugged);
-  ASSERT_EQ(CRAS_NODE_TYPE_USB, node.type);
-  ASSERT_EQ(NODE_POSITION_EXTERNAL, node.position);
-
-  memset(&node, 0, sizeof(node));
-  node.dev = &dev;
-  dev.direction = CRAS_STREAM_INPUT;
-  strcpy(node.name, "DAISY-I2S Mic Jack");
-  set_node_initial_state(&node, ALSA_CARD_TYPE_INTERNAL);
-  ASSERT_EQ(0, node.plugged);
-  ASSERT_EQ(CRAS_NODE_TYPE_MIC, node.type);
-  ASSERT_EQ(NODE_POSITION_EXTERNAL, node.position);
-  // Node name is changed to "MIC".
-  ASSERT_EQ(0, strcmp(node.name, MIC));
-
-  memset(&node, 0, sizeof(node));
-  node.dev = &dev;
-  dev.direction = CRAS_STREAM_OUTPUT;
-  strcpy(node.name, "DAISY-I2S Headphone Jack");
-  set_node_initial_state(&node, ALSA_CARD_TYPE_INTERNAL);
-  ASSERT_EQ(0, node.plugged);
-  ASSERT_EQ(CRAS_NODE_TYPE_HEADPHONE, node.type);
-  ASSERT_EQ(NODE_POSITION_EXTERNAL, node.position);
-  // Node name is changed to "Headphone".
-  ASSERT_EQ(0, strcmp(node.name, HEADPHONE));
-
-  memset(&node, 0, sizeof(node));
-  node.dev = &dev;
-  strcpy(node.name, INTERNAL_SPEAKER);
-  dev.direction = CRAS_STREAM_OUTPUT;
-  set_node_initial_state(&node, ALSA_CARD_TYPE_USB);
-  ASSERT_EQ(1, node.plugged);
-  ASSERT_GT(node.plugged_time.tv_sec, 0);
-  ASSERT_EQ(CRAS_NODE_TYPE_USB, node.type);
-  ASSERT_EQ(NODE_POSITION_EXTERNAL, node.position);
-
-  memset(&node, 0, sizeof(node));
-  node.dev = &dev;
-  strcpy(node.name, "Haptic");
-  dev.direction = CRAS_STREAM_OUTPUT;
-  set_node_initial_state(&node, ALSA_CARD_TYPE_INTERNAL);
-  ASSERT_EQ(1, node.plugged);
-  ASSERT_GT(node.plugged_time.tv_sec, 0);
-  ASSERT_EQ(CRAS_NODE_TYPE_HAPTIC, node.type);
-  ASSERT_EQ(NODE_POSITION_INTERNAL, node.position);
-
-  memset(&node, 0, sizeof(node));
-  node.dev = &dev;
-  strcpy(node.name, "Rumbler");
-  dev.direction = CRAS_STREAM_OUTPUT;
-  set_node_initial_state(&node, ALSA_CARD_TYPE_INTERNAL);
-  ASSERT_EQ(1, node.plugged);
-  ASSERT_GT(node.plugged_time.tv_sec, 0);
-  ASSERT_EQ(CRAS_NODE_TYPE_HAPTIC, node.type);
-  ASSERT_EQ(NODE_POSITION_INTERNAL, node.position);
-}
-
-TEST(AlsaInitNode, SetNodeInitialStateDropInvalidUTF8NodeName) {
-  struct cras_ionode node;
-  struct cras_iodev dev;
-
-  memset(&dev, 0, sizeof(dev));
-  memset(&node, 0, sizeof(node));
-  node.dev = &dev;
-
-  memset(&node, 0, sizeof(node));
-  node.dev = &dev;
-  strcpy(node.name, "Something USB");
-  // 0xfe can not appear in a valid UTF-8 string.
-  node.name[0] = 0xfe;
-  is_utf8_string_ret_value = 0;
-  dev.direction = CRAS_STREAM_OUTPUT;
-  set_node_initial_state(&node, ALSA_CARD_TYPE_USB);
-  ASSERT_EQ(CRAS_NODE_TYPE_USB, node.type);
-  ASSERT_STREQ(USB, node.name);
-
-  memset(&node, 0, sizeof(node));
-  node.dev = &dev;
-  strcpy(node.name, "Something HDMI Jack");
-  // 0xfe can not appear in a valid UTF-8 string.
-  node.name[0] = 0xfe;
-  is_utf8_string_ret_value = 0;
-  dev.direction = CRAS_STREAM_OUTPUT;
-  set_node_initial_state(&node, ALSA_CARD_TYPE_INTERNAL);
-  ASSERT_EQ(CRAS_NODE_TYPE_HDMI, node.type);
-  ASSERT_STREQ(HDMI, node.name);
-}
-
-TEST(AlsaIoInit, HDMIJackUpdateInvalidUTF8MonitorName) {
-  struct alsa_io* aio;
-  struct cras_alsa_mixer* const fake_mixer = (struct cras_alsa_mixer*)2;
-  struct cras_use_case_mgr* const fake_ucm = (struct cras_use_case_mgr*)3;
-  const struct cras_alsa_jack* jack = (struct cras_alsa_jack*)4;
-
-  ResetStubData();
-  aio = (struct alsa_io*)alsa_iodev_create_with_default_parameters(
-      0, NULL, ALSA_CARD_TYPE_INTERNAL, 0, fake_mixer, fake_config, fake_ucm,
-      CRAS_STREAM_OUTPUT);
-  ASSERT_EQ(0, alsa_iodev_legacy_complete_init((struct cras_iodev*)aio));
-
-  // Prepare the stub data such that the jack will be identified as an
-  // HDMI jack, and thus the callback creates an HDMI node.
-  cras_alsa_jack_get_name_ret_value = "HDMI Jack";
-  // Set the jack name updated from monitor to be an invalid UTF8 string.
-  cras_alsa_jack_update_monitor_fake_name = "\xfeomething";
-  is_utf8_string_ret_value = 0;
-
-  // Add the jack node.
-  cras_alsa_jack_list_create_cb(jack, 1, cras_alsa_jack_list_create_cb_data);
-
-  EXPECT_EQ(2, cras_alsa_jack_get_name_called);
-  ASSERT_EQ(CRAS_NODE_TYPE_HDMI, aio->base.nodes->next->type);
-  // The node name should be "HDMI".
-  ASSERT_STREQ(HDMI, aio->base.nodes->next->name);
-
-  alsa_iodev_destroy((struct cras_iodev*)aio);
-}
-
-//  Test thread add/rm stream, open_alsa, and iodev config.
-class AlsaVolumeMuteSuite : public testing::Test {
- protected:
-  virtual void SetUp() {
-    ResetStubData();
-    output_control_ = reinterpret_cast<struct mixer_control*>(10);
-    cras_alsa_mixer_list_outputs_outputs = &output_control_;
-    cras_alsa_mixer_list_outputs_outputs_length = 1;
-    cras_alsa_mixer_get_control_name_values[output_control_] = INTERNAL_SPEAKER;
-    cras_alsa_mixer_list_outputs_outputs_length = 1;
-    aio_output_ = (struct alsa_io*)alsa_iodev_create_with_default_parameters(
-        0, NULL, ALSA_CARD_TYPE_INTERNAL, 1, fake_mixer, fake_config, NULL,
-        CRAS_STREAM_OUTPUT);
-    alsa_iodev_legacy_complete_init((struct cras_iodev*)aio_output_);
-    EXPECT_EQ(2, cras_card_config_get_volume_curve_for_control_called);
-
-    struct cras_ionode* node;
-    int count = 0;
-    DL_FOREACH (aio_output_->base.nodes, node) { printf("node %d \n", count); }
-    aio_output_->base.direction = CRAS_STREAM_OUTPUT;
-    fmt_.frame_rate = 44100;
-    fmt_.num_channels = 2;
-    fmt_.format = SND_PCM_FORMAT_S16_LE;
-    aio_output_->base.format = &fmt_;
-    cras_alsa_get_avail_frames_ret = -1;
-  }
-
-  virtual void TearDown() {
-    alsa_iodev_destroy((struct cras_iodev*)aio_output_);
-    cras_alsa_get_avail_frames_ret = 0;
-  }
-
-  struct mixer_control* output_control_;
-  struct alsa_io* aio_output_;
-  struct cras_audio_format fmt_;
-};
-
-TEST_F(AlsaVolumeMuteSuite, GetDefaultVolumeCurve) {
-  int rc;
-  struct cras_audio_format* fmt;
-
-  fmt = (struct cras_audio_format*)malloc(sizeof(*fmt));
-  memcpy(fmt, &fmt_, sizeof(fmt_));
-  aio_output_->base.format = fmt;
-  aio_output_->handle = (snd_pcm_t*)0x24;
-
-  rc = aio_output_->base.configure_dev(&aio_output_->base);
-  ASSERT_EQ(0, rc);
-  EXPECT_EQ(&default_curve, fake_get_dBFS_volume_curve_val);
-
-  aio_output_->base.set_volume(&aio_output_->base);
-  EXPECT_EQ(&default_curve, fake_get_dBFS_volume_curve_val);
-  free(fmt);
-}
-
-TEST_F(AlsaVolumeMuteSuite, GetVolumeCurveFromNode) {
-  int rc;
-  struct cras_audio_format* fmt;
-  struct cras_alsa_jack* jack = (struct cras_alsa_jack*)4;
-  struct cras_ionode* node;
-  struct cras_volume_curve hp_curve = {
-      .get_dBFS = fake_get_dBFS,
-  };
-
-  // Headphone jack plugged and has its own volume curve.
-  cras_alsa_jack_get_mixer_output_ret = NULL;
-  cras_alsa_jack_get_name_ret_value = HEADPHONE;
-  cras_card_config_get_volume_curve_vals[HEADPHONE] = &hp_curve;
-  cras_alsa_jack_list_create_cb(jack, 1, cras_alsa_jack_list_create_cb_data);
-  EXPECT_EQ(1, cras_alsa_jack_update_node_type_called);
-  EXPECT_EQ(3, cras_card_config_get_volume_curve_for_control_called);
-
-  // These settings should be placed after plugging jacks to make it safer.
-  // If is HDMI jack, plug event will trigger update_max_supported_channels()
-  // and do open_dev() and close_dev() once. close_dev() will perform alsa_io
-  // cleanup.
-  // Headphone jack won't trigger, but we still place here due to coherence.
-  fmt = (struct cras_audio_format*)malloc(sizeof(*fmt));
-  memcpy(fmt, &fmt_, sizeof(fmt_));
-  aio_output_->base.format = fmt;
-  aio_output_->handle = (snd_pcm_t*)0x24;
-
-  // Switch to node 'Headphone'.
-  node = aio_output_->base.nodes->next;
-  aio_output_->base.active_node = node;
-
-  rc = aio_output_->base.configure_dev(&aio_output_->base);
-  ASSERT_EQ(0, rc);
-  EXPECT_EQ(&hp_curve, fake_get_dBFS_volume_curve_val);
-
-  aio_output_->base.set_volume(&aio_output_->base);
-  EXPECT_EQ(&hp_curve, fake_get_dBFS_volume_curve_val);
-  free(fmt);
-}
-
-TEST_F(AlsaVolumeMuteSuite, SetVolume) {
-  int rc;
-  struct cras_audio_format* fmt;
-  const size_t fake_system_volume = 55;
-  const size_t fake_system_volume_dB = (fake_system_volume - 100) * 100;
-
-  fmt = (struct cras_audio_format*)malloc(sizeof(*fmt));
-  memcpy(fmt, &fmt_, sizeof(fmt_));
-  aio_output_->base.format = fmt;
-  aio_output_->handle = (snd_pcm_t*)0x24;
-
-  sys_get_volume_return_value = fake_system_volume;
-  rc = aio_output_->base.configure_dev(&aio_output_->base);
-  ASSERT_EQ(0, rc);
-  EXPECT_EQ(1, alsa_mixer_set_dBFS_called);
-  EXPECT_EQ(fake_system_volume_dB, alsa_mixer_set_dBFS_value);
-
-  alsa_mixer_set_dBFS_called = 0;
-  alsa_mixer_set_dBFS_value = 0;
-  sys_get_volume_return_value = 50;
-  sys_get_volume_called = 0;
-  aio_output_->base.set_volume(&aio_output_->base);
-  EXPECT_EQ(1, sys_get_volume_called);
-  EXPECT_EQ(1, alsa_mixer_set_dBFS_called);
-  EXPECT_EQ(-5000, alsa_mixer_set_dBFS_value);
-  EXPECT_EQ(output_control_, alsa_mixer_set_dBFS_output);
-
-  alsa_mixer_set_dBFS_called = 0;
-  alsa_mixer_set_dBFS_value = 0;
-  sys_get_volume_return_value = 0;
-  sys_get_volume_called = 0;
-  aio_output_->base.set_volume(&aio_output_->base);
-  EXPECT_EQ(1, sys_get_volume_called);
-  EXPECT_EQ(1, alsa_mixer_set_dBFS_called);
-  EXPECT_EQ(-10000, alsa_mixer_set_dBFS_value);
-
-  sys_get_volume_return_value = 80;
-  aio_output_->base.active_node->volume = 90;
-  aio_output_->base.set_volume(&aio_output_->base);
-  EXPECT_EQ(-3000, alsa_mixer_set_dBFS_value);
-
-  // close the dev.
-  rc = aio_output_->base.close_dev(&aio_output_->base);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ((void*)NULL, aio_output_->handle);
-
-  free(fmt);
-}
-
-TEST_F(AlsaVolumeMuteSuite, SetMute) {
-  int muted;
-
-  aio_output_->handle = (snd_pcm_t*)0x24;
-
-  // Test mute.
-  ResetStubData();
-  muted = 1;
-
-  sys_get_mute_return_value = muted;
-
-  aio_output_->base.set_mute(&aio_output_->base);
-
-  EXPECT_EQ(1, sys_get_mute_called);
-  EXPECT_EQ(1, alsa_mixer_set_mute_called);
-  EXPECT_EQ(muted, alsa_mixer_set_mute_value);
-  EXPECT_EQ(output_control_, alsa_mixer_set_mute_output);
-
-  // Test unmute.
-  ResetStubData();
-  muted = 0;
-
-  sys_get_mute_return_value = muted;
-
-  aio_output_->base.set_mute(&aio_output_->base);
-
-  EXPECT_EQ(1, sys_get_mute_called);
-  EXPECT_EQ(1, alsa_mixer_set_mute_called);
-  EXPECT_EQ(muted, alsa_mixer_set_mute_value);
-  EXPECT_EQ(output_control_, alsa_mixer_set_mute_output);
-}
-
-//  Test free run.
-class AlsaFreeRunTestSuite : public testing::Test {
- protected:
-  virtual void SetUp() {
-    ResetStubData();
-    memset(&aio, 0, sizeof(aio));
-    fmt_.format = SND_PCM_FORMAT_S16_LE;
-    fmt_.frame_rate = 48000;
-    fmt_.num_channels = 2;
-    aio.base.frames_queued = frames_queued;
-    aio.base.output_underrun = alsa_output_underrun;
-    aio.base.direction = CRAS_STREAM_OUTPUT;
-    aio.base.format = &fmt_;
-    aio.base.buffer_size = BUFFER_SIZE;
-    aio.base.min_cb_level = 240;
-    aio.base.min_buffer_level = 0;
-    aio.filled_zeros_for_draining = 0;
-    cras_alsa_mmap_begin_buffer = (uint8_t*)calloc(
-        BUFFER_SIZE * 2 * 2, sizeof(*cras_alsa_mmap_begin_buffer));
-    memset(cras_alsa_mmap_begin_buffer, 0xff,
-           sizeof(*cras_alsa_mmap_begin_buffer));
-  }
-
-  virtual void TearDown() { free(cras_alsa_mmap_begin_buffer); }
-
-  struct alsa_io aio;
-  struct cras_audio_format fmt_;
-};
-
-TEST_F(AlsaFreeRunTestSuite, FillWholeBufferWithZeros) {
-  int rc;
-  int16_t* zeros;
-
-  rc = fill_whole_buffer_with_zeros(&aio.base);
-
-  EXPECT_EQ(0, rc);
-  zeros = (int16_t*)calloc(BUFFER_SIZE * 2, sizeof(*zeros));
-  EXPECT_EQ(0, memcmp(zeros, cras_alsa_mmap_begin_buffer, BUFFER_SIZE * 2 * 2));
-
-  free(zeros);
-}
-
-TEST_F(AlsaFreeRunTestSuite, EnterFreeRunAlreadyFreeRunning) {
-  int rc;
-
-  // Device is in free run state, no need to fill zeros or fill whole buffer.
-  aio.free_running = 1;
-
-  rc = no_stream(&aio.base, 1);
-
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(0, cras_alsa_mmap_get_whole_buffer_called);
-  EXPECT_EQ(0, cras_iodev_fill_odev_zeros_called);
-  EXPECT_EQ(0, cras_iodev_fill_odev_zeros_frames);
-}
-
-TEST_F(AlsaFreeRunTestSuite, EnterFreeRunNotDrainedYetNeedToFillZeros) {
-  int rc, real_hw_level;
-  struct timespec hw_tstamp;
-  int fill_zeros_duration = 50;
-  // Device is not in free run state. There are still valid samples to play.
-  // In cras_alsa_io.c, we defined there are 50ms zeros to be filled.
-  real_hw_level = 200;
-  cras_alsa_get_avail_frames_avail = BUFFER_SIZE - real_hw_level;
-
-  rc = aio.base.frames_queued(&aio.base, &hw_tstamp);
-  EXPECT_EQ(200, rc);
-
-  rc = no_stream(&aio.base, 1);
-
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(0, cras_alsa_mmap_get_whole_buffer_called);
-  EXPECT_EQ(1, cras_iodev_fill_odev_zeros_called);
-  EXPECT_EQ(fmt_.frame_rate / 1000 * fill_zeros_duration,
-            cras_iodev_fill_odev_zeros_frames);
-  EXPECT_EQ(fmt_.frame_rate / 1000 * fill_zeros_duration,
-            aio.filled_zeros_for_draining);
-  EXPECT_EQ(0, aio.free_running);
-}
-
-TEST_F(AlsaFreeRunTestSuite, EnterFreeRunNotDrainedYetFillZerosExceedBuffer) {
-  int rc, real_hw_level;
-
-  // Device is not in free run state. There are still valid samples to play.
-  // If frames avail is smaller than 50ms(48 * 50 = 2400 zeros), only fill
-  // zeros until buffer size.
-  real_hw_level = 7000;
-  cras_alsa_get_avail_frames_avail = BUFFER_SIZE - real_hw_level;
-
-  rc = no_stream(&aio.base, 1);
-
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(0, cras_alsa_mmap_get_whole_buffer_called);
-  EXPECT_EQ(1, cras_iodev_fill_odev_zeros_called);
-  EXPECT_EQ(cras_alsa_get_avail_frames_avail,
-            cras_iodev_fill_odev_zeros_frames);
-  EXPECT_EQ(cras_alsa_get_avail_frames_avail, aio.filled_zeros_for_draining);
-  EXPECT_EQ(0, aio.free_running);
-}
-
-TEST_F(AlsaFreeRunTestSuite, EnterFreeRunDrained) {
-  int rc, real_hw_level;
-
-  // Device is not in free run state. There are still valid samples to play.
-  // The number of valid samples is less than filled zeros.
-  // Should enter free run state and fill whole buffer with zeros.
-  real_hw_level = 40;
-  cras_alsa_get_avail_frames_avail = BUFFER_SIZE - real_hw_level;
-  aio.filled_zeros_for_draining = 100;
-
-  rc = no_stream(&aio.base, 1);
-
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(1, cras_alsa_mmap_get_whole_buffer_called);
-  EXPECT_EQ(0, cras_iodev_fill_odev_zeros_called);
-  EXPECT_EQ(1, aio.free_running);
-}
-
-TEST_F(AlsaFreeRunTestSuite, EnterFreeRunNoSamples) {
-  int rc, real_hw_level;
-
-  // Device is not in free run state. There is no sample to play.
-  // Should enter free run state and fill whole buffer with zeros.
-  real_hw_level = 0;
-  cras_alsa_get_avail_frames_avail = BUFFER_SIZE - real_hw_level;
-
-  rc = no_stream(&aio.base, 1);
-
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(1, cras_alsa_mmap_get_whole_buffer_called);
-  EXPECT_EQ(0, cras_iodev_fill_odev_zeros_called);
-  EXPECT_EQ(1, aio.free_running);
-}
-
-TEST_F(AlsaFreeRunTestSuite, IsFreeRunning) {
-  aio.free_running = 1;
-  EXPECT_EQ(1, is_free_running(&aio.base));
-
-  aio.free_running = 0;
-  EXPECT_EQ(0, is_free_running(&aio.base));
-}
-
-TEST_F(AlsaFreeRunTestSuite, LeaveFreeRunNotInFreeRunMoreRemain) {
-  int rc, real_hw_level;
-
-  // Compare min_buffer_level + min_cb_level with valid samples left.
-  // 240 + 512 < 900 - 100, so we will get 900 - 100 in appl_ptr_ahead.
-
-  aio.free_running = 0;
-  aio.filled_zeros_for_draining = 100;
-  aio.base.min_buffer_level = 512;
-  real_hw_level = 900;
-  cras_alsa_get_avail_frames_avail = BUFFER_SIZE - real_hw_level;
-
-  rc = no_stream(&aio.base, 0);
-
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(1, cras_alsa_resume_appl_ptr_called);
-  EXPECT_EQ(800, cras_alsa_resume_appl_ptr_ahead);
-  EXPECT_EQ(0, cras_iodev_fill_odev_zeros_frames);
-  EXPECT_EQ(0, aio.free_running);
-  EXPECT_EQ(0, aio.filled_zeros_for_draining);
-  EXPECT_EQ(1, cras_iodev_reset_rate_estimator_called);
-}
-
-TEST_F(AlsaFreeRunTestSuite, LeaveFreeRunNotInFreeRunLessRemain) {
-  int rc, real_hw_level;
-
-  // Compare min_buffer_level + min_cb_level with valid samples left.
-  // 240 + 256 > 400 - 500, so we will get 240 + 256 in appl_ptr_ahead.
-  // And it will fill 240 + 256 - 400 = 96 zeros frames into device.
-
-  aio.free_running = 0;
-  aio.filled_zeros_for_draining = 500;
-  aio.base.min_buffer_level = 256;
-  real_hw_level = 400;
-  cras_alsa_get_avail_frames_avail = BUFFER_SIZE - real_hw_level;
-
-  rc = no_stream(&aio.base, 0);
-
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(1, cras_alsa_resume_appl_ptr_called);
-  EXPECT_EQ(aio.base.min_buffer_level + aio.base.min_cb_level,
-            cras_alsa_resume_appl_ptr_ahead);
-  EXPECT_EQ(96, cras_iodev_fill_odev_zeros_frames);
-  EXPECT_EQ(0, aio.free_running);
-  EXPECT_EQ(0, aio.filled_zeros_for_draining);
-  EXPECT_EQ(1, cras_iodev_reset_rate_estimator_called);
-}
-
-TEST_F(AlsaFreeRunTestSuite, LeaveFreeRunInFreeRun) {
-  int rc;
-
-  aio.free_running = 1;
-  aio.filled_zeros_for_draining = 100;
-  aio.base.min_buffer_level = 512;
-
-  rc = no_stream(&aio.base, 0);
-
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(1, cras_alsa_resume_appl_ptr_called);
-  EXPECT_EQ(aio.base.min_buffer_level + aio.base.min_cb_level,
-            cras_alsa_resume_appl_ptr_ahead);
-  EXPECT_EQ(0, aio.free_running);
-  EXPECT_EQ(0, aio.filled_zeros_for_draining);
-  EXPECT_EQ(1, cras_iodev_reset_rate_estimator_called);
-}
-
-// Reuse AlsaFreeRunTestSuite for output underrun handling because they are
-// similar.
-TEST_F(AlsaFreeRunTestSuite, OutputUnderrun) {
-  int rc;
-  int16_t* zeros;
-  snd_pcm_uframes_t offset;
-
-  // Ask alsa_io to handle output underrun.
-  rc = alsa_output_underrun(&aio.base);
-  EXPECT_EQ(0, rc);
-
-  // mmap buffer should be filled with zeros.
-  zeros = (int16_t*)calloc(BUFFER_SIZE * 2, sizeof(*zeros));
-  EXPECT_EQ(0, memcmp(zeros, cras_alsa_mmap_begin_buffer, BUFFER_SIZE * 2 * 2));
-
-  // appl_ptr should be moved to min_buffer_level + 1.5 * min_cb_level ahead of
-  // hw_ptr.
-  offset = aio.base.min_buffer_level + aio.base.min_cb_level +
-           aio.base.min_cb_level / 2;
-  EXPECT_EQ(1, cras_alsa_resume_appl_ptr_called);
-  EXPECT_EQ(offset, cras_alsa_resume_appl_ptr_ahead);
-
-  free(zeros);
-}
-
-TEST(AlsaHotwordNode, HotwordTriggeredSendMessage) {
-  struct cras_iodev* iodev;
-  struct cras_audio_format format;
-  struct alsa_input_node alsa_node;
-  struct cras_ionode* node = &alsa_node.base;
-  int rc;
-
-  ResetStubData();
-  iodev = alsa_iodev_create_with_default_parameters(
-      0, NULL, ALSA_CARD_TYPE_INTERNAL, 0, fake_mixer, fake_config, NULL,
-      CRAS_STREAM_INPUT);
-  format.frame_rate = 16000;
-  format.num_channels = 1;
-  cras_iodev_set_format(iodev, &format);
-
-  memset(&alsa_node, 0, sizeof(alsa_node));
-  node->dev = iodev;
-  strcpy(node->name, HOTWORD_DEV);
-  set_node_initial_state(node, ALSA_CARD_TYPE_INTERNAL);
-  EXPECT_EQ(CRAS_NODE_TYPE_HOTWORD, node->type);
-
-  iodev->active_node = node;
-  iodev->open_dev(iodev);
-  rc = iodev->configure_dev(iodev);
-  free(fake_format);
-  ASSERT_EQ(0, rc);
-
-  ASSERT_NE(reinterpret_cast<thread_callback>(NULL), audio_thread_cb);
-  audio_thread_cb(audio_thread_cb_data, POLLIN);
-  EXPECT_EQ(1, hotword_send_triggered_msg_called);
-  alsa_iodev_destroy(iodev);
-}
-
-TEST(AlsaGetValidFrames, GetValidFramesNormalState) {
-  struct cras_iodev* iodev;
-  struct alsa_io* aio;
-  struct timespec tstamp;
-  int rc;
-
-  ResetStubData();
-  iodev = alsa_iodev_create_with_default_parameters(
-      0, NULL, ALSA_CARD_TYPE_INTERNAL, 0, fake_mixer, fake_config, NULL,
-      CRAS_STREAM_OUTPUT);
-  aio = (struct alsa_io*)iodev;
-
-  aio->free_running = 0;
-  aio->filled_zeros_for_draining = 200;
-  cras_alsa_get_avail_frames_avail = iodev->buffer_size - 500;
-  cras_alsa_get_avail_frames_ret = 0;
-  clock_gettime_retspec.tv_sec = 123;
-  clock_gettime_retspec.tv_nsec = 321;
-  rc = iodev->get_valid_frames(iodev, &tstamp);
-  EXPECT_EQ(rc, 300);
-  EXPECT_EQ(tstamp.tv_sec, clock_gettime_retspec.tv_sec);
-  EXPECT_EQ(tstamp.tv_nsec, clock_gettime_retspec.tv_nsec);
-
-  alsa_iodev_destroy(iodev);
-}
-
-TEST(AlsaGetValidFrames, GetValidFramesFreeRunning) {
-  struct cras_iodev* iodev;
-  struct alsa_io* aio;
-  struct timespec tstamp;
-  int rc;
-
-  ResetStubData();
-  iodev = alsa_iodev_create_with_default_parameters(
-      0, NULL, ALSA_CARD_TYPE_INTERNAL, 0, fake_mixer, fake_config, NULL,
-      CRAS_STREAM_OUTPUT);
-  aio = (struct alsa_io*)iodev;
-
-  aio->free_running = 1;
-  clock_gettime_retspec.tv_sec = 123;
-  clock_gettime_retspec.tv_nsec = 321;
-  rc = iodev->get_valid_frames(iodev, &tstamp);
-  EXPECT_EQ(rc, 0);
-  EXPECT_EQ(tstamp.tv_sec, clock_gettime_retspec.tv_sec);
-  EXPECT_EQ(tstamp.tv_nsec, clock_gettime_retspec.tv_nsec);
-
-  alsa_iodev_destroy(iodev);
-}
-
-}  //  namespace
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  openlog(NULL, LOG_PERROR, LOG_USER);
-  return RUN_ALL_TESTS();
-}
-
-//  Stubs
-
-extern "C" {
-
-//  From iodev.
-int cras_iodev_list_add_output(struct cras_iodev* output) {
-  return 0;
-}
-int cras_iodev_list_rm_output(struct cras_iodev* dev) {
-  return 0;
-}
-
-int cras_iodev_list_add_input(struct cras_iodev* input) {
-  return 0;
-}
-int cras_iodev_list_rm_input(struct cras_iodev* dev) {
-  return 0;
-}
-
-char* cras_iodev_list_get_hotword_models(cras_node_id_t node_id) {
-  return NULL;
-}
-
-int cras_iodev_list_set_hotword_model(cras_node_id_t node_id,
-                                      const char* model_name) {
-  return 0;
-}
-
-int cras_iodev_list_suspend_hotword_streams() {
-  return 0;
-}
-
-int cras_iodev_list_resume_hotword_stream() {
-  return 0;
-}
-
-struct audio_thread* cras_iodev_list_get_audio_thread() {
-  return NULL;
-}
-
-//  From alsa helper.
-int cras_alsa_set_channel_map(snd_pcm_t* handle,
-                              struct cras_audio_format* fmt) {
-  return 0;
-}
-int cras_alsa_get_channel_map(snd_pcm_t* handle,
-                              struct cras_audio_format* fmt) {
-  return 0;
-}
-int cras_alsa_pcm_open(snd_pcm_t** handle,
-                       const char* dev,
-                       snd_pcm_stream_t stream) {
-  *handle = (snd_pcm_t*)0x24;
-  cras_alsa_open_called++;
-  return 0;
-}
-int cras_alsa_pcm_close(snd_pcm_t* handle) {
-  return 0;
-}
-int cras_alsa_pcm_start(snd_pcm_t* handle) {
-  cras_alsa_start_called++;
-  return 0;
-}
-int cras_alsa_pcm_drain(snd_pcm_t* handle) {
-  return 0;
-}
-int cras_alsa_fill_properties(snd_pcm_t* handle,
-                              size_t** rates,
-                              size_t** channel_counts,
-                              snd_pcm_format_t** formats) {
-  *rates = (size_t*)malloc(sizeof(**rates) * 3);
-  (*rates)[0] = 44100;
-  (*rates)[1] = 48000;
-  (*rates)[2] = 0;
-
-  if (cras_alsa_support_8_channels) {  // Support up to 8 channels.
-    *channel_counts = (size_t*)malloc(sizeof(**channel_counts) * 6);
-    (*channel_counts)[0] = 6;
-    (*channel_counts)[1] = 4;
-    (*channel_counts)[2] = 2;
-    (*channel_counts)[3] = 1;
-    (*channel_counts)[4] = 8;
-    (*channel_counts)[5] = 0;
-  } else {  // Support 2 channels only.
-    *channel_counts = (size_t*)malloc(sizeof(**channel_counts) * 2);
-    (*channel_counts)[0] = 2;
-    (*channel_counts)[1] = 0;
-  }
-
-  *formats = (snd_pcm_format_t*)malloc(sizeof(**formats) * 2);
-  (*formats)[0] = SND_PCM_FORMAT_S16_LE;
-  (*formats)[1] = (snd_pcm_format_t)0;
-
-  cras_alsa_fill_properties_called++;
-  return 0;
-}
-int cras_alsa_set_hwparams(snd_pcm_t* handle,
-                           struct cras_audio_format* format,
-                           snd_pcm_uframes_t* buffer_size,
-                           int period_wakeup,
-                           unsigned int dma_period_time) {
-  return 0;
-}
-int cras_alsa_set_swparams(snd_pcm_t* handle) {
-  return 0;
-}
-int cras_alsa_get_avail_frames(snd_pcm_t* handle,
-                               snd_pcm_uframes_t buf_size,
-                               snd_pcm_uframes_t severe_underrun_frames,
-                               const char* dev_name,
-                               snd_pcm_uframes_t* used,
-                               struct timespec* tstamp) {
-  *used = cras_alsa_get_avail_frames_avail;
-  clock_gettime(CLOCK_MONOTONIC_RAW, tstamp);
-  return cras_alsa_get_avail_frames_ret;
-}
-int cras_alsa_get_delay_frames(snd_pcm_t* handle,
-                               snd_pcm_uframes_t buf_size,
-                               snd_pcm_sframes_t* delay) {
-  *delay = 0;
-  return 0;
-}
-int cras_alsa_mmap_begin(snd_pcm_t* handle,
-                         unsigned int format_bytes,
-                         uint8_t** dst,
-                         snd_pcm_uframes_t* offset,
-                         snd_pcm_uframes_t* frames) {
-  *dst = cras_alsa_mmap_begin_buffer;
-  *frames = cras_alsa_mmap_begin_frames;
-  return 0;
-}
-int cras_alsa_mmap_commit(snd_pcm_t* handle,
-                          snd_pcm_uframes_t offset,
-                          snd_pcm_uframes_t frames) {
-  return 0;
-}
-int cras_alsa_attempt_resume(snd_pcm_t* handle) {
-  cras_alsa_attempt_resume_called++;
-  return 0;
-}
-
-//  ALSA stubs.
-int snd_pcm_format_physical_width(snd_pcm_format_t format) {
-  return 16;
-}
-
-snd_pcm_state_t snd_pcm_state(snd_pcm_t* handle) {
-  return snd_pcm_state_ret;
-}
-
-const char* snd_strerror(int errnum) {
-  return "Alsa Error in UT";
-}
-
-struct mixer_control* cras_alsa_mixer_get_control_for_section(
-    struct cras_alsa_mixer* cras_mixer,
-    const struct ucm_section* section) {
-  cras_alsa_mixer_get_control_for_section_called++;
-  return cras_alsa_mixer_get_control_for_section_return_value;
-}
-
-const char* cras_alsa_mixer_get_control_name(
-    const struct mixer_control* control) {
-  ControlNameMap::iterator it;
-  cras_alsa_mixer_get_control_name_called++;
-  it = cras_alsa_mixer_get_control_name_values.find(control);
-  if (it == cras_alsa_mixer_get_control_name_values.end())
-    return "";
-  return it->second.c_str();
-}
-
-//  From system_state.
-size_t cras_system_get_volume() {
-  sys_get_volume_called++;
-  return sys_get_volume_return_value;
-}
-
-int cras_system_get_mute() {
-  sys_get_mute_called++;
-  return sys_get_mute_return_value;
-}
-
-int cras_system_get_capture_mute() {
-  sys_get_capture_mute_called++;
-  return sys_get_capture_mute_return_value;
-}
-
-void cras_system_set_volume_limits(long min, long max) {
-  sys_set_volume_limits_called++;
-}
-
-bool cras_system_get_noise_cancellation_enabled() {
-  return false;
-}
-
-//  From cras_alsa_mixer.
-void cras_alsa_mixer_set_dBFS(struct cras_alsa_mixer* m,
-                              long dB_level,
-                              struct mixer_control* output) {
-  alsa_mixer_set_dBFS_called++;
-  alsa_mixer_set_dBFS_value = dB_level;
-  alsa_mixer_set_dBFS_output = output;
-}
-
-void cras_alsa_mixer_set_mute(struct cras_alsa_mixer* cras_mixer,
-                              int muted,
-                              struct mixer_control* mixer_output) {
-  alsa_mixer_set_mute_called++;
-  alsa_mixer_set_mute_value = muted;
-  alsa_mixer_set_mute_output = mixer_output;
-}
-
-long cras_alsa_mixer_get_dB_range(struct cras_alsa_mixer* cras_mixer) {
-  alsa_mixer_get_dB_range_called++;
-  return alsa_mixer_get_dB_range_value;
-}
-
-long cras_alsa_mixer_get_output_dB_range(struct mixer_control* mixer_output) {
-  alsa_mixer_get_output_dB_range_called++;
-  return alsa_mixer_get_output_dB_range_value;
-}
-
-void cras_alsa_mixer_set_capture_dBFS(struct cras_alsa_mixer* m,
-                                      long dB_level,
-                                      struct mixer_control* mixer_input) {
-  alsa_mixer_set_capture_dBFS_called++;
-  alsa_mixer_set_capture_dBFS_value = dB_level;
-  alsa_mixer_set_capture_dBFS_input = mixer_input;
-}
-
-void cras_alsa_mixer_set_capture_mute(struct cras_alsa_mixer* m,
-                                      int mute,
-                                      struct mixer_control* mixer_input) {
-  alsa_mixer_set_capture_mute_called++;
-  alsa_mixer_set_capture_mute_value = mute;
-  alsa_mixer_set_capture_mute_input = mixer_input;
-}
-
-void cras_alsa_mixer_list_outputs(struct cras_alsa_mixer* cras_mixer,
-                                  cras_alsa_mixer_control_callback cb,
-                                  void* callback_arg) {
-  cras_alsa_mixer_list_outputs_called++;
-  for (size_t i = 0; i < cras_alsa_mixer_list_outputs_outputs_length; i++) {
-    cb(cras_alsa_mixer_list_outputs_outputs[i], callback_arg);
-  }
-}
-
-void cras_alsa_mixer_list_inputs(struct cras_alsa_mixer* cras_mixer,
-                                 cras_alsa_mixer_control_callback cb,
-                                 void* callback_arg) {
-  cras_alsa_mixer_list_inputs_called++;
-  for (size_t i = 0; i < cras_alsa_mixer_list_inputs_outputs_length; i++) {
-    cb(cras_alsa_mixer_list_inputs_outputs[i], callback_arg);
-  }
-}
-
-int cras_alsa_mixer_set_output_active_state(struct mixer_control* output,
-                                            int active) {
-  cras_alsa_mixer_set_output_active_state_called++;
-  cras_alsa_mixer_set_output_active_state_outputs.push_back(output);
-  cras_alsa_mixer_set_output_active_state_values.push_back(active);
-  return 0;
-}
-
-void cras_volume_curve_destroy(struct cras_volume_curve* curve) {}
-
-long cras_alsa_mixer_get_minimum_capture_gain(
-    struct cras_alsa_mixer* cmix,
-    struct mixer_control* mixer_input) {
-  cras_alsa_mixer_get_minimum_capture_gain_called++;
-  cras_alsa_mixer_get_minimum_capture_gain_mixer_input = mixer_input;
-  return cras_alsa_mixer_get_minimum_capture_gain_ret_value;
-}
-
-long cras_alsa_mixer_get_maximum_capture_gain(
-    struct cras_alsa_mixer* cmix,
-    struct mixer_control* mixer_input) {
-  cras_alsa_mixer_get_maximum_capture_gain_called++;
-  cras_alsa_mixer_get_maximum_capture_gain_mixer_input = mixer_input;
-  return cras_alsa_mixer_get_maximum_capture_gain_ret_value;
-}
-
-int cras_alsa_mixer_has_main_volume(const struct cras_alsa_mixer* cras_mixer) {
-  return 1;
-}
-
-int cras_alsa_mixer_has_volume(const struct mixer_control* mixer_control) {
-  return 1;
-}
-
-// From cras_alsa_jack
-struct cras_alsa_jack_list* cras_alsa_jack_list_create(
-    unsigned int card_index,
-    const char* card_name,
-    unsigned int device_index,
-    int check_gpio_jack,
-    struct cras_alsa_mixer* mixer,
-    struct cras_use_case_mgr* ucm,
-    snd_hctl_t* hctl,
-    enum CRAS_STREAM_DIRECTION direction,
-    jack_state_change_callback* cb,
-    void* cb_data) {
-  cras_alsa_jack_list_create_called++;
-  cras_alsa_jack_list_create_cb = cb;
-  cras_alsa_jack_list_create_cb_data = cb_data;
-  return (struct cras_alsa_jack_list*)0xfee;
-}
-
-int cras_alsa_jack_list_find_jacks_by_name_matching(
-    struct cras_alsa_jack_list* jack_list) {
-  cras_alsa_jack_list_find_jacks_by_name_matching_called++;
-  return 0;
-}
-
-int cras_alsa_jack_list_add_jack_for_section(
-    struct cras_alsa_jack_list* jack_list,
-    struct ucm_section* ucm_section,
-    struct cras_alsa_jack** result_jack) {
-  cras_alsa_jack_list_add_jack_for_section_called++;
-  if (result_jack)
-    *result_jack = cras_alsa_jack_list_add_jack_for_section_result_jack;
-  return 0;
-}
-
-void cras_alsa_jack_list_destroy(struct cras_alsa_jack_list* jack_list) {
-  cras_alsa_jack_list_destroy_called++;
-}
-
-int cras_alsa_jack_list_has_hctl_jacks(struct cras_alsa_jack_list* jack_list) {
-  return cras_alsa_jack_list_has_hctl_jacks_return_val;
-}
-
-void cras_alsa_jack_list_report(const struct cras_alsa_jack_list* jack_list) {}
-
-void cras_alsa_jack_enable_ucm(const struct cras_alsa_jack* jack, int enable) {
-  cras_alsa_jack_enable_ucm_called++;
-}
-
-const char* cras_alsa_jack_get_name(const struct cras_alsa_jack* jack) {
-  cras_alsa_jack_get_name_called++;
-  return cras_alsa_jack_get_name_ret_value;
-}
-
-const char* ucm_get_dsp_name_for_dev(struct cras_use_case_mgr* mgr,
-                                     const char* dev) {
-  DspNameMap::iterator it;
-  ucm_get_dsp_name_for_dev_called++;
-  if (!dev)
-    return NULL;
-  it = ucm_get_dsp_name_for_dev_values.find(dev);
-  if (it == ucm_get_dsp_name_for_dev_values.end())
-    return NULL;
-  return strdup(it->second.c_str());
-}
-
-struct mixer_control* cras_alsa_jack_get_mixer_output(
-    const struct cras_alsa_jack* jack) {
-  return cras_alsa_jack_get_mixer_output_ret;
-}
-
-struct mixer_control* cras_alsa_jack_get_mixer_input(
-    const struct cras_alsa_jack* jack) {
-  return cras_alsa_jack_get_mixer_input_ret;
-}
-
-int ucm_set_enabled(struct cras_use_case_mgr* mgr,
-                    const char* dev,
-                    int enabled) {
-  ucm_set_enabled_called++;
-  return 0;
-}
-
-char* ucm_get_flag(struct cras_use_case_mgr* mgr, const char* flag_name) {
-  if ((!strcmp(flag_name, "AutoUnplugInputNode") &&
-       auto_unplug_input_node_ret) ||
-      (!strcmp(flag_name, "AutoUnplugOutputNode") &&
-       auto_unplug_output_node_ret)) {
-    char* ret = (char*)malloc(8);
-    snprintf(ret, 8, "%s", "1");
-    return ret;
-  }
-
-  return NULL;
-}
-
-int ucm_swap_mode_exists(struct cras_use_case_mgr* mgr) {
-  return ucm_swap_mode_exists_ret_value;
-}
-
-int ucm_enable_swap_mode(struct cras_use_case_mgr* mgr,
-                         const char* node_name,
-                         int enable) {
-  ucm_enable_swap_mode_called++;
-  return ucm_enable_swap_mode_ret_value;
-}
-
-int ucm_get_min_buffer_level(struct cras_use_case_mgr* mgr,
-                             unsigned int* level) {
-  *level = 0;
-  return 0;
-}
-
-unsigned int ucm_get_disable_software_volume(struct cras_use_case_mgr* mgr) {
-  return 0;
-}
-
-char* ucm_get_hotword_models(struct cras_use_case_mgr* mgr) {
-  return NULL;
-}
-
-int ucm_set_hotword_model(struct cras_use_case_mgr* mgr, const char* model) {
-  return 0;
-}
-
-unsigned int ucm_get_dma_period_for_dev(struct cras_use_case_mgr* mgr,
-                                        const char* dev) {
-  ucm_get_dma_period_for_dev_called++;
-  return ucm_get_dma_period_for_dev_ret;
-}
-
-int ucm_get_sample_rate_for_dev(struct cras_use_case_mgr* mgr,
-                                const char* dev,
-                                enum CRAS_STREAM_DIRECTION direction) {
-  return -EINVAL;
-}
-
-int ucm_get_capture_chmap_for_dev(struct cras_use_case_mgr* mgr,
-                                  const char* dev,
-                                  int8_t* channel_layout) {
-  return -EINVAL;
-}
-
-int ucm_get_preempt_hotword(struct cras_use_case_mgr* mgr, const char* dev) {
-  return 0;
-}
-
-int ucm_get_channels_for_dev(struct cras_use_case_mgr* mgr,
-                             const char* dev,
-                             enum CRAS_STREAM_DIRECTION direction,
-                             size_t* channels) {
-  return -EINVAL;
-}
-
-int ucm_node_noise_cancellation_exists(struct cras_use_case_mgr* mgr,
-                                       const char* node_name) {
-  return 0;
-}
-
-int ucm_enable_node_noise_cancellation(struct cras_use_case_mgr* mgr,
-                                       const char* node_name,
-                                       int enable) {
-  return 0;
-}
-
-struct cras_volume_curve* cras_volume_curve_create_default() {
-  return &default_curve;
-}
-
-struct cras_volume_curve* cras_card_config_get_volume_curve_for_control(
-    const struct cras_card_config* card_config,
-    const char* control_name) {
-  VolCurveMap::iterator it;
-  cras_card_config_get_volume_curve_for_control_called++;
-  if (!control_name)
-    return NULL;
-  it = cras_card_config_get_volume_curve_vals.find(control_name);
-  if (it == cras_card_config_get_volume_curve_vals.end())
-    return NULL;
-  return it->second;
-}
-
-void cras_iodev_free_format(struct cras_iodev* iodev) {}
-
-int cras_iodev_set_format(struct cras_iodev* iodev,
-                          const struct cras_audio_format* fmt) {
-  fake_format = (struct cras_audio_format*)calloc(1, sizeof(cras_audio_format));
-  // Copy the content of format from fmt into format of iodev.
-  memcpy(fake_format, fmt, sizeof(cras_audio_format));
-  iodev->format = fake_format;
-  return 0;
-}
-
-struct audio_thread* audio_thread_create() {
-  return reinterpret_cast<audio_thread*>(0x323);
-}
-
-void audio_thread_destroy(audio_thread* thread) {}
-
-void cras_iodev_update_dsp(struct cras_iodev* iodev) {
-  cras_iodev_update_dsp_called++;
-  cras_iodev_update_dsp_name = iodev->dsp_name ?: "";
-}
-
-void cras_iodev_set_node_plugged(struct cras_ionode* ionode, int plugged) {
-  cras_iodev_set_node_plugged_called++;
-  cras_iodev_set_node_plugged_ionode = ionode;
-  cras_iodev_set_node_plugged_value = plugged;
-  if (ionode)
-    ionode->plugged = plugged;
-}
-
-void cras_iodev_add_node(struct cras_iodev* iodev, struct cras_ionode* node) {
-  cras_iodev_add_node_called++;
-  DL_APPEND(iodev->nodes, node);
-}
-
-void cras_iodev_rm_node(struct cras_iodev* iodev, struct cras_ionode* node) {
-  DL_DELETE(iodev->nodes, node);
-}
-
-void cras_iodev_set_active_node(struct cras_iodev* iodev,
-                                struct cras_ionode* node) {
-  iodev->active_node = node;
-}
-
-void cras_iodev_free_resources(struct cras_iodev* iodev) {
-  cras_iodev_free_resources_called++;
-}
-
-void cras_alsa_jack_update_monitor_name(const struct cras_alsa_jack* jack,
-                                        char* name_buf,
-                                        unsigned int buf_size) {
-  if (cras_alsa_jack_update_monitor_fake_name)
-    strcpy(name_buf, cras_alsa_jack_update_monitor_fake_name);
-}
-
-void cras_alsa_jack_update_node_type(const struct cras_alsa_jack* jack,
-                                     enum CRAS_NODE_TYPE* type) {
-  cras_alsa_jack_update_node_type_called++;
-}
-
-const char* cras_alsa_jack_get_ucm_device(const struct cras_alsa_jack* jack) {
-  return NULL;
-}
-
-void ucm_disable_all_hotword_models(struct cras_use_case_mgr* mgr) {}
-
-int ucm_enable_hotword_model(struct cras_use_case_mgr* mgr) {
-  return 0;
-}
-
-int ucm_get_default_node_gain(struct cras_use_case_mgr* mgr,
-                              const char* dev,
-                              long* gain) {
-  if (ucm_get_default_node_gain_values.find(dev) ==
-      ucm_get_default_node_gain_values.end())
-    return 1;
-
-  *gain = ucm_get_default_node_gain_values[dev];
-  return 0;
-}
-
-int ucm_get_intrinsic_sensitivity(struct cras_use_case_mgr* mgr,
-                                  const char* dev,
-                                  long* vol) {
-  if (ucm_get_intrinsic_sensitivity_values.find(dev) ==
-      ucm_get_intrinsic_sensitivity_values.end())
-    return 1;
-
-  *vol = ucm_get_intrinsic_sensitivity_values[dev];
-  return 0;
-}
-
-void cras_iodev_init_audio_area(struct cras_iodev* iodev, int num_channels) {}
-
-void cras_iodev_free_audio_area(struct cras_iodev* iodev) {}
-
-int cras_iodev_reset_rate_estimator(const struct cras_iodev* iodev) {
-  cras_iodev_reset_rate_estimator_called++;
-  return 0;
-}
-
-int cras_iodev_frames_queued(struct cras_iodev* iodev,
-                             struct timespec* tstamp) {
-  clock_gettime(CLOCK_MONOTONIC_RAW, tstamp);
-  return cras_iodev_frames_queued_ret;
-}
-
-int cras_iodev_buffer_avail(struct cras_iodev* iodev, unsigned hw_level) {
-  return cras_iodev_buffer_avail_ret;
-}
-
-int cras_iodev_fill_odev_zeros(struct cras_iodev* odev, unsigned int frames) {
-  cras_iodev_fill_odev_zeros_called++;
-  cras_iodev_fill_odev_zeros_frames = frames;
-  return 0;
-}
-
-void cras_audio_area_config_buf_pointers(struct cras_audio_area* area,
-                                         const struct cras_audio_format* fmt,
-                                         uint8_t* base_buffer) {}
-
-void audio_thread_add_events_callback(int fd,
-                                      thread_callback cb,
-                                      void* data,
-                                      int events) {
-  audio_thread_cb = cb;
-  audio_thread_cb_data = data;
-}
-
-void audio_thread_rm_callback(int fd) {}
-
-int audio_thread_rm_callback_sync(struct audio_thread* thread, int fd) {
-  return 0;
-}
-
-int cras_hotword_send_triggered_msg() {
-  hotword_send_triggered_msg_called++;
-  return 0;
-}
-
-int snd_pcm_poll_descriptors_count(snd_pcm_t* pcm) {
-  return 1;
-}
-
-int snd_pcm_poll_descriptors(snd_pcm_t* pcm,
-                             struct pollfd* pfds,
-                             unsigned int space) {
-  if (space >= 1) {
-    pfds[0].events = POLLIN;
-    pfds[0].fd = 99;
-  }
-  return 0;
-}
-
-int is_utf8_string(const char* string) {
-  return is_utf8_string_ret_value;
-}
-
-int cras_alsa_mmap_get_whole_buffer(snd_pcm_t* handle, uint8_t** dst) {
-  snd_pcm_uframes_t offset, frames;
-
-  cras_alsa_mmap_get_whole_buffer_called++;
-  return cras_alsa_mmap_begin(handle, 0, dst, &offset, &frames);
-}
-
-int cras_alsa_resume_appl_ptr(snd_pcm_t* handle, snd_pcm_uframes_t ahead) {
-  cras_alsa_resume_appl_ptr_called++;
-  cras_alsa_resume_appl_ptr_ahead = ahead;
-  return 0;
-}
-
-int cras_iodev_default_no_stream_playback(struct cras_iodev* odev, int enable) {
-  return 0;
-}
-
-int cras_iodev_output_underrun(struct cras_iodev* odev,
-                               unsigned int hw_level,
-                               unsigned int frames_written) {
-  return odev->output_underrun(odev);
-}
-
-enum CRAS_IODEV_STATE cras_iodev_state(const struct cras_iodev* iodev) {
-  return iodev->state;
-}
-
-int cras_iodev_dsp_set_swap_mode_for_node(struct cras_iodev* iodev,
-                                          struct cras_ionode* node,
-                                          int enable) {
-  cras_iodev_dsp_set_swap_mode_for_node_called++;
-  return 0;
-}
-
-struct cras_ramp* cras_ramp_create() {
-  return (struct cras_ramp*)0x1;
-}
-
-//  From librt.
-int clock_gettime(clockid_t clk_id, struct timespec* tp) {
-  tp->tv_sec = clock_gettime_retspec.tv_sec;
-  tp->tv_nsec = clock_gettime_retspec.tv_nsec;
-  return 0;
-}
-
-}  // extern "C"
diff --git a/cras/src/tests/alsa_jack_unittest.cc b/cras/src/tests/alsa_jack_unittest.cc
deleted file mode 100644
index 1aa9549..0000000
--- a/cras/src/tests/alsa_jack_unittest.cc
+++ /dev/null
@@ -1,1104 +0,0 @@
-// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <gtest/gtest.h>
-#include <linux/input.h>
-#include <poll.h>
-#include <stdio.h>
-#include <sys/param.h>
-#include <syslog.h>
-
-#include <deque>
-#include <map>
-#include <string>
-#include <vector>
-
-extern "C" {
-#include "cras_alsa_jack.h"
-#include "cras_alsa_ucm_section.h"
-#include "cras_gpio_jack.h"
-#include "cras_tm.h"
-#include "cras_types.h"
-#include "cras_util.h"
-}
-
-namespace {
-
-#define BITS_PER_BYTE (8)
-#define BITS_PER_LONG (sizeof(long) * BITS_PER_BYTE)
-#define NBITS(x) ((((x)-1) / BITS_PER_LONG) + 1)
-#define OFF(x) ((x) % BITS_PER_LONG)
-#define BIT(x) (1UL << OFF(x))
-#define LONG(x) ((x) / BITS_PER_LONG)
-#define IS_BIT_SET(bit, array) !!((array[LONG(bit)]) & (1UL << OFF(bit)))
-
-static int fake_jack_cb_plugged;
-static void* fake_jack_cb_data;
-static size_t fake_jack_cb_called;
-unsigned int snd_hctl_elem_get_device_return_val;
-unsigned int snd_hctl_elem_get_device_called;
-static size_t snd_hctl_first_elem_called;
-static snd_hctl_elem_t* snd_hctl_first_elem_return_val;
-static size_t snd_hctl_elem_next_called;
-std::deque<snd_hctl_elem_t*> snd_hctl_elem_next_ret_vals;
-std::deque<snd_hctl_elem_t*> snd_hctl_elem_next_ret_vals_poped;
-static size_t snd_hctl_elem_get_name_called;
-static size_t snd_hctl_elem_set_callback_called;
-static snd_hctl_elem_t* snd_hctl_elem_set_callback_obj;
-static snd_hctl_elem_callback_t snd_hctl_elem_set_callback_value;
-static size_t snd_hctl_find_elem_called;
-static std::vector<snd_hctl_elem_t*> snd_hctl_find_elem_return_vals;
-static std::map<std::string, size_t> snd_ctl_elem_id_set_name_map;
-static size_t cras_system_add_select_fd_called;
-static std::vector<int> cras_system_add_select_fd_values;
-static size_t cras_system_rm_select_fd_called;
-static std::vector<int> cras_system_rm_select_fd_values;
-static size_t snd_hctl_elem_set_callback_private_called;
-static void* snd_hctl_elem_set_callback_private_value;
-static size_t snd_hctl_elem_get_hctl_called;
-static snd_hctl_t* snd_hctl_elem_get_hctl_return_value;
-static size_t snd_ctl_elem_value_get_boolean_called;
-static int snd_ctl_elem_value_get_boolean_return_value;
-static void* fake_jack_cb_arg;
-static struct cras_alsa_mixer* fake_mixer;
-static size_t cras_alsa_mixer_get_output_matching_name_called;
-static size_t cras_alsa_mixer_get_input_matching_name_called;
-static size_t cras_alsa_mixer_get_control_for_section_called;
-static struct mixer_control*
-    cras_alsa_mixer_get_output_matching_name_return_value;
-static struct mixer_control*
-    cras_alsa_mixer_get_input_matching_name_return_value;
-static struct mixer_control*
-    cras_alsa_mixer_get_control_for_section_return_value;
-static size_t gpio_switch_list_for_each_called;
-static std::vector<std::string> gpio_switch_list_for_each_dev_paths;
-static std::vector<std::string> gpio_switch_list_for_each_dev_names;
-static size_t gpio_switch_open_called;
-static size_t gpio_switch_eviocgsw_called;
-static size_t gpio_switch_eviocgbit_called;
-static unsigned ucm_get_dev_for_jack_called;
-static unsigned ucm_get_cap_control_called;
-static char* ucm_get_cap_control_value;
-static bool ucm_get_dev_for_jack_return;
-static int ucm_set_enabled_value;
-static unsigned long eviocbit_ret[NBITS(SW_CNT)];
-static int gpio_switch_eviocgbit_fd;
-static const char* edid_file_ret;
-static unsigned ucm_get_override_type_name_called;
-static int ucm_get_alsa_dev_idx_for_dev_value;
-static snd_hctl_t* fake_hctl = (snd_hctl_t*)2;
-
-static void ResetStubData() {
-  gpio_switch_list_for_each_called = 0;
-  gpio_switch_list_for_each_dev_paths.clear();
-  gpio_switch_list_for_each_dev_paths.push_back("/dev/input/event3");
-  gpio_switch_list_for_each_dev_paths.push_back("/dev/input/event2");
-  gpio_switch_list_for_each_dev_names.clear();
-  gpio_switch_open_called = 0;
-  gpio_switch_eviocgsw_called = 0;
-  gpio_switch_eviocgbit_called = 0;
-  snd_hctl_elem_get_device_return_val = 0;
-  snd_hctl_elem_get_device_called = 0;
-  snd_hctl_first_elem_called = 0;
-  snd_hctl_first_elem_return_val = reinterpret_cast<snd_hctl_elem_t*>(0x87);
-  snd_hctl_elem_next_called = 0;
-  snd_hctl_elem_next_ret_vals.clear();
-  snd_hctl_elem_next_ret_vals_poped.clear();
-  snd_hctl_elem_get_name_called = 0;
-  snd_hctl_elem_set_callback_called = 0;
-  snd_hctl_elem_set_callback_obj = NULL;
-  snd_hctl_elem_set_callback_value = NULL;
-  snd_hctl_find_elem_called = 0;
-  snd_hctl_find_elem_return_vals.clear();
-  snd_ctl_elem_id_set_name_map.clear();
-  cras_system_add_select_fd_called = 0;
-  cras_system_add_select_fd_values.clear();
-  cras_system_rm_select_fd_called = 0;
-  cras_system_rm_select_fd_values.clear();
-  snd_hctl_elem_set_callback_private_called = 0;
-  snd_hctl_elem_get_hctl_called = 0;
-  snd_ctl_elem_value_get_boolean_called = 0;
-  fake_jack_cb_called = 0;
-  fake_jack_cb_plugged = 0;
-  fake_jack_cb_arg = reinterpret_cast<void*>(0x987);
-  fake_mixer = reinterpret_cast<struct cras_alsa_mixer*>(0x789);
-  cras_alsa_mixer_get_output_matching_name_called = 0;
-  cras_alsa_mixer_get_input_matching_name_called = 0;
-  cras_alsa_mixer_get_control_for_section_called = 0;
-  cras_alsa_mixer_get_output_matching_name_return_value =
-      reinterpret_cast<struct mixer_control*>(0x456);
-  cras_alsa_mixer_get_input_matching_name_return_value = NULL;
-  cras_alsa_mixer_get_control_for_section_return_value =
-      reinterpret_cast<struct mixer_control*>(0x456);
-  ucm_get_dev_for_jack_called = 0;
-  ucm_get_cap_control_called = 0;
-  ucm_get_cap_control_value = NULL;
-  ucm_get_dev_for_jack_return = false;
-  edid_file_ret = NULL;
-  ucm_get_override_type_name_called = 0;
-  ucm_get_alsa_dev_idx_for_dev_value = -1;
-
-  memset(eviocbit_ret, 0, sizeof(eviocbit_ret));
-}
-
-static void fake_jack_cb(const struct cras_alsa_jack* jack,
-                         int plugged,
-                         void* data) {
-  fake_jack_cb_called++;
-  fake_jack_cb_plugged = plugged;
-  fake_jack_cb_data = data;
-
-  // Check that jack enable callback is called if there is a ucm device.
-  ucm_set_enabled_value = !plugged;
-  cras_alsa_jack_enable_ucm(jack, plugged);
-  EXPECT_EQ(ucm_get_dev_for_jack_return ? plugged : !plugged,
-            ucm_set_enabled_value);
-}
-
-TEST(AlsaJacks, CreateNullHctl) {
-  struct cras_alsa_jack_list* jack_list;
-  ResetStubData();
-  jack_list = cras_alsa_jack_list_create(0, "c1", 0, 1, fake_mixer, NULL, NULL,
-                                         CRAS_STREAM_OUTPUT, fake_jack_cb,
-                                         fake_jack_cb_arg);
-  ASSERT_NE(static_cast<struct cras_alsa_jack_list*>(NULL), jack_list);
-  EXPECT_EQ(0, cras_alsa_jack_list_find_jacks_by_name_matching(jack_list));
-  EXPECT_EQ(1, gpio_switch_list_for_each_called);
-  EXPECT_EQ(0, gpio_switch_open_called);
-  EXPECT_EQ(0, gpio_switch_eviocgsw_called);
-  EXPECT_EQ(0, gpio_switch_eviocgbit_called);
-
-  cras_alsa_jack_list_destroy(jack_list);
-}
-
-TEST(AlsaJacks, CreateNoElements) {
-  struct cras_alsa_jack_list* jack_list;
-
-  ResetStubData();
-  snd_hctl_first_elem_return_val = NULL;
-  jack_list = cras_alsa_jack_list_create(0, "c1", 0, 1, fake_mixer, NULL,
-                                         fake_hctl, CRAS_STREAM_OUTPUT,
-                                         fake_jack_cb, fake_jack_cb_arg);
-  ASSERT_NE(static_cast<struct cras_alsa_jack_list*>(NULL), jack_list);
-  EXPECT_EQ(0, cras_alsa_jack_list_find_jacks_by_name_matching(jack_list));
-  EXPECT_EQ(1, gpio_switch_list_for_each_called);
-  EXPECT_EQ(0, gpio_switch_open_called);
-  EXPECT_EQ(0, gpio_switch_eviocgsw_called);
-  EXPECT_EQ(0, gpio_switch_eviocgbit_called);
-  EXPECT_EQ(1, snd_hctl_first_elem_called);
-  EXPECT_EQ(0, snd_hctl_elem_next_called);
-
-  cras_alsa_jack_list_destroy(jack_list);
-}
-
-static struct cras_alsa_jack_list* run_test_with_elem_list(
-    CRAS_STREAM_DIRECTION direction,
-    std::string* elems,
-    unsigned int device_index,
-    struct cras_use_case_mgr* ucm,
-    size_t nelems,
-    size_t nhdmi_jacks,
-    size_t njacks) {
-  struct cras_alsa_jack_list* jack_list;
-
-  snd_hctl_first_elem_return_val =
-      reinterpret_cast<snd_hctl_elem_t*>(&elems[0]);
-  for (unsigned int i = 1; i < nelems; i++)
-    snd_hctl_elem_next_ret_vals.push_front(
-        reinterpret_cast<snd_hctl_elem_t*>(&elems[i]));
-
-  jack_list = cras_alsa_jack_list_create(0, "card_name", device_index, 1,
-                                         fake_mixer, ucm, fake_hctl, direction,
-                                         fake_jack_cb, fake_jack_cb_arg);
-  if (jack_list == NULL)
-    return jack_list;
-  EXPECT_EQ(0, cras_alsa_jack_list_find_jacks_by_name_matching(jack_list));
-  EXPECT_EQ(ucm ? njacks : 0, ucm_get_dev_for_jack_called);
-  EXPECT_EQ(ucm ? njacks : 0, ucm_get_override_type_name_called);
-  EXPECT_EQ(1, snd_hctl_first_elem_called);
-  EXPECT_EQ(njacks, snd_hctl_elem_set_callback_called);
-  EXPECT_EQ(nhdmi_jacks, snd_hctl_find_elem_called);
-
-  /* For some functions, the number of calls to them could
-   * be larger then expected count if there is ELD control
-   * in given elements. */
-  EXPECT_GE(snd_hctl_elem_next_called, nelems);
-  EXPECT_GE(snd_hctl_elem_get_name_called, nelems);
-
-  if (direction == CRAS_STREAM_OUTPUT) {
-    EXPECT_EQ(njacks, cras_alsa_mixer_get_output_matching_name_called);
-  }
-  if (direction == CRAS_STREAM_INPUT && ucm_get_dev_for_jack_return) {
-    EXPECT_EQ(njacks, ucm_get_cap_control_called);
-  }
-
-  return jack_list;
-}
-
-static struct cras_alsa_jack_list* run_test_with_section(
-    CRAS_STREAM_DIRECTION direction,
-    std::string* elems,
-    size_t nelems,
-    unsigned int device_index,
-    struct cras_use_case_mgr* ucm,
-    struct ucm_section* ucm_section,
-    int add_jack_rc,
-    size_t njacks) {
-  struct cras_alsa_jack_list* jack_list;
-  struct cras_alsa_jack* jack;
-
-  for (size_t i = 0; i < nelems; i++) {
-    snd_ctl_elem_id_set_name_map[elems[i]] = i;
-    snd_hctl_find_elem_return_vals.push_back(
-        reinterpret_cast<snd_hctl_elem_t*>(&elems[i]));
-  }
-
-  jack_list = cras_alsa_jack_list_create(0, "card_name", device_index, 1,
-                                         fake_mixer, ucm, fake_hctl, direction,
-                                         fake_jack_cb, fake_jack_cb_arg);
-  if (jack_list == NULL)
-    return jack_list;
-  EXPECT_EQ(add_jack_rc, cras_alsa_jack_list_add_jack_for_section(
-                             jack_list, ucm_section, &jack));
-  if (add_jack_rc == 0) {
-    EXPECT_NE(jack, reinterpret_cast<struct cras_alsa_jack*>(NULL));
-  } else {
-    EXPECT_EQ(jack, reinterpret_cast<struct cras_alsa_jack*>(NULL));
-  }
-  if (add_jack_rc != 0) {
-    cras_alsa_jack_list_destroy(jack_list);
-    return NULL;
-  }
-  EXPECT_EQ(njacks, snd_hctl_elem_set_callback_called);
-  EXPECT_EQ(njacks, cras_alsa_mixer_get_control_for_section_called);
-
-  return jack_list;
-}
-
-TEST(AlsaJacks, ReportNull) {
-  cras_alsa_jack_list_report(NULL);
-}
-
-TEST(AlsaJacks, CreateNoJacks) {
-  static std::string elem_names[] = {
-      "Mic Jack",
-      "foo",
-      "bar",
-  };
-  struct cras_alsa_jack_list* jack_list;
-
-  ResetStubData();
-  jack_list = run_test_with_elem_list(CRAS_STREAM_OUTPUT, elem_names, 0, NULL,
-                                      ARRAY_SIZE(elem_names), 0, 0);
-  ASSERT_NE(static_cast<struct cras_alsa_jack_list*>(NULL), jack_list);
-
-  cras_alsa_jack_list_destroy(jack_list);
-  EXPECT_EQ(0, cras_system_rm_select_fd_called);
-}
-
-TEST(AlsaJacks, CreateGPIOHp) {
-  struct cras_alsa_jack_list* jack_list;
-
-  ResetStubData();
-  gpio_switch_list_for_each_dev_names.push_back("some-other-device");
-  gpio_switch_list_for_each_dev_names.push_back("c1 Headphone Jack");
-  eviocbit_ret[LONG(SW_HEADPHONE_INSERT)] |= 1 << OFF(SW_HEADPHONE_INSERT);
-  gpio_switch_eviocgbit_fd = 2;
-  snd_hctl_first_elem_return_val = NULL;
-  jack_list = cras_alsa_jack_list_create(0, "c1", 0, 1, fake_mixer, NULL,
-                                         fake_hctl, CRAS_STREAM_OUTPUT,
-                                         fake_jack_cb, fake_jack_cb_arg);
-  ASSERT_NE(static_cast<struct cras_alsa_jack_list*>(NULL), jack_list);
-  EXPECT_EQ(0, cras_alsa_jack_list_find_jacks_by_name_matching(jack_list));
-  cras_alsa_jack_list_destroy(jack_list);
-  EXPECT_EQ(1, gpio_switch_list_for_each_called);
-  EXPECT_GT(gpio_switch_open_called, 1);
-  EXPECT_EQ(1, gpio_switch_eviocgsw_called);
-  EXPECT_GT(gpio_switch_eviocgbit_called, 1);
-  EXPECT_EQ(1, cras_system_add_select_fd_called);
-  EXPECT_EQ(1, cras_system_rm_select_fd_called);
-}
-
-TEST(AlsaJacks, CreateGPIOMic) {
-  struct cras_alsa_jack_list* jack_list;
-  ResetStubData();
-  ucm_get_dev_for_jack_return = true;
-  gpio_switch_list_for_each_dev_names.push_back("c1 Mic Jack");
-  gpio_switch_list_for_each_dev_names.push_back("c1 Headphone Jack");
-  eviocbit_ret[LONG(SW_MICROPHONE_INSERT)] |= 1 << OFF(SW_MICROPHONE_INSERT);
-  gpio_switch_eviocgbit_fd = 3;
-  snd_hctl_first_elem_return_val = NULL;
-  ucm_get_cap_control_value = reinterpret_cast<char*>(0x1);
-
-  cras_alsa_mixer_get_input_matching_name_return_value =
-      reinterpret_cast<struct mixer_control*>(malloc(1));
-
-  jack_list = cras_alsa_jack_list_create(
-      0, "c1", 0, 1, fake_mixer,
-      reinterpret_cast<struct cras_use_case_mgr*>(0x55), fake_hctl,
-      CRAS_STREAM_INPUT, fake_jack_cb, fake_jack_cb_arg);
-  ASSERT_NE(static_cast<struct cras_alsa_jack_list*>(NULL), jack_list);
-  EXPECT_EQ(0, cras_alsa_jack_list_find_jacks_by_name_matching(jack_list));
-  EXPECT_EQ(ucm_get_cap_control_called, 1);
-  EXPECT_EQ(cras_alsa_mixer_get_input_matching_name_called, 1);
-  cras_alsa_jack_list_destroy(jack_list);
-  // Mixer will be free by alsa_card_destroy, we should free it explicitly here
-  free(cras_alsa_mixer_get_input_matching_name_return_value);
-}
-
-TEST(AlsaJacks, CreateGPIOHdmi) {
-  struct cras_alsa_jack_list* jack_list;
-
-  ResetStubData();
-  gpio_switch_list_for_each_dev_names.push_back("c1 HDMI Jack");
-  gpio_switch_list_for_each_dev_names.push_back("c1 Mic Jack");
-  eviocbit_ret[LONG(SW_LINEOUT_INSERT)] |= 1 << OFF(SW_LINEOUT_INSERT);
-  gpio_switch_eviocgbit_fd = 3;
-  snd_hctl_first_elem_return_val = NULL;
-  jack_list = cras_alsa_jack_list_create(0, "c1", 0, 1, fake_mixer, NULL,
-                                         fake_hctl, CRAS_STREAM_OUTPUT,
-                                         fake_jack_cb, fake_jack_cb_arg);
-  ASSERT_NE(static_cast<struct cras_alsa_jack_list*>(NULL), jack_list);
-  EXPECT_EQ(0, cras_alsa_jack_list_find_jacks_by_name_matching(jack_list));
-  EXPECT_EQ(1, gpio_switch_eviocgsw_called);
-
-  fake_jack_cb_called = 0;
-  cras_alsa_jack_list_report(jack_list);
-  EXPECT_EQ(1, fake_jack_cb_plugged);
-  EXPECT_EQ(1, fake_jack_cb_called);
-
-  cras_alsa_jack_list_destroy(jack_list);
-  EXPECT_EQ(1, gpio_switch_list_for_each_called);
-  EXPECT_GT(gpio_switch_open_called, 1);
-  EXPECT_GT(gpio_switch_eviocgbit_called, 1);
-  EXPECT_EQ(1, cras_system_add_select_fd_called);
-  EXPECT_EQ(1, cras_system_rm_select_fd_called);
-}
-
-void run_gpio_jack_test(int device_index,
-                        int is_first_device,
-                        enum CRAS_STREAM_DIRECTION direction,
-                        int should_create_jack,
-                        const char* jack_name) {
-  struct cras_alsa_jack_list* jack_list;
-  struct cras_use_case_mgr* ucm =
-      reinterpret_cast<struct cras_use_case_mgr*>(0x55);
-
-  gpio_switch_list_for_each_dev_names.push_back("some-other-device one");
-  gpio_switch_eviocgbit_fd = 2;
-  if (direction == CRAS_STREAM_OUTPUT) {
-    eviocbit_ret[LONG(SW_HEADPHONE_INSERT)] |= 1 << OFF(SW_HEADPHONE_INSERT);
-  } else {
-    eviocbit_ret[LONG(SW_MICROPHONE_INSERT)] |= 1 << OFF(SW_MICROPHONE_INSERT);
-  }
-  gpio_switch_list_for_each_dev_names.push_back(jack_name);
-  snd_hctl_first_elem_return_val = NULL;
-
-  jack_list = cras_alsa_jack_list_create(0, "c1", device_index, is_first_device,
-                                         fake_mixer, ucm, fake_hctl, direction,
-                                         fake_jack_cb, fake_jack_cb_arg);
-  ASSERT_NE(static_cast<struct cras_alsa_jack_list*>(NULL), jack_list);
-  EXPECT_EQ(0, cras_alsa_jack_list_find_jacks_by_name_matching(jack_list));
-
-  cras_alsa_jack_list_report(jack_list);
-  EXPECT_EQ(should_create_jack, fake_jack_cb_plugged);
-  EXPECT_EQ(should_create_jack, fake_jack_cb_called);
-
-  cras_alsa_jack_list_destroy(jack_list);
-}
-
-TEST(AlsaJacks, CreateGPIOHpUCMPlaybackPCMMatched) {
-  int device_index = 1;
-  int is_first_device = 0;
-  enum CRAS_STREAM_DIRECTION direction = CRAS_STREAM_OUTPUT;
-  int should_create_jack = 1;
-
-  ResetStubData();
-
-  /* PlaybackPCM matched, so create jack even if this is not the first device.*/
-  ucm_get_dev_for_jack_return = true;
-  ucm_get_alsa_dev_idx_for_dev_value = 1;
-
-  run_gpio_jack_test(device_index, is_first_device, direction,
-                     should_create_jack, "c1 Headset Jack");
-}
-
-TEST(AlsaJacks, CreateGPIOHpUCMCapturePCMMatched) {
-  int device_index = 1;
-  int is_first_device = 0;
-  enum CRAS_STREAM_DIRECTION direction = CRAS_STREAM_INPUT;
-  int should_create_jack = 1;
-
-  ResetStubData();
-
-  /* CapturePCM matched, so create jack even if this is not the first device.*/
-  ucm_get_dev_for_jack_return = true;
-  ucm_get_alsa_dev_idx_for_dev_value = 1;
-
-  run_gpio_jack_test(device_index, is_first_device, direction,
-                     should_create_jack, "c1 Mic Jack");
-}
-
-TEST(AlsaJacks, CreateGPIOHpUCMPlaybackPCMNotMatched) {
-  int device_index = 0;
-  int is_first_device = 1;
-  enum CRAS_STREAM_DIRECTION direction = CRAS_STREAM_OUTPUT;
-  int should_create_jack = 0;
-
-  ResetStubData();
-
-  /* PlaybackPCM not matched, do not create jack. */
-  ucm_get_dev_for_jack_return = true;
-  ucm_get_alsa_dev_idx_for_dev_value = 2;
-
-  run_gpio_jack_test(device_index, is_first_device, direction,
-                     should_create_jack, "c1 Headset Jack");
-}
-
-TEST(AlsaJacks, CreateGPIOHpUCMPlaybackPCMNotSpecifiedFirstDevice) {
-  int device_index = 1;
-  int is_first_device = 1;
-  enum CRAS_STREAM_DIRECTION direction = CRAS_STREAM_OUTPUT;
-  int should_create_jack = 1;
-
-  ResetStubData();
-
-  /* PlaybackPCM not specified, create jack for the first device. */
-  ucm_get_dev_for_jack_return = true;
-  ucm_get_alsa_dev_idx_for_dev_value = -1;
-
-  run_gpio_jack_test(device_index, is_first_device, direction,
-                     should_create_jack, "c1 Headset Jack");
-}
-
-TEST(AlsaJacks, CreateGPIOHpUCMPlaybackPCMNotSpecifiedSecondDevice) {
-  int device_index = 1;
-  int is_first_device = 0;
-  enum CRAS_STREAM_DIRECTION direction = CRAS_STREAM_OUTPUT;
-  int should_create_jack = 0;
-
-  ResetStubData();
-
-  /* PlaybackPCM not specified, do not create jack for the second device. */
-  ucm_get_dev_for_jack_return = true;
-  ucm_get_alsa_dev_idx_for_dev_value = -1;
-
-  run_gpio_jack_test(device_index, is_first_device, direction,
-                     should_create_jack, "c1 Headset Jack");
-}
-
-TEST(AlsaJacks, CreateGPIOHpNoUCMFirstDevice) {
-  int device_index = 1;
-  int is_first_device = 1;
-  enum CRAS_STREAM_DIRECTION direction = CRAS_STREAM_OUTPUT;
-  int should_create_jack = 1;
-
-  ResetStubData();
-
-  /* No UCM for this jack, create jack for the first device. */
-  ucm_get_dev_for_jack_return = false;
-  ucm_get_alsa_dev_idx_for_dev_value = -1;
-
-  run_gpio_jack_test(device_index, is_first_device, direction,
-                     should_create_jack, "c1 Headset Jack");
-}
-
-TEST(AlsaJacks, CreateGPIOHpNoUCMSecondDevice) {
-  int device_index = 1;
-  int is_first_device = 0;
-  enum CRAS_STREAM_DIRECTION direction = CRAS_STREAM_OUTPUT;
-  int should_create_jack = 0;
-
-  ResetStubData();
-
-  /* No UCM for this jack, dot not create jack for the second device. */
-  ucm_get_dev_for_jack_return = false;
-  ucm_get_alsa_dev_idx_for_dev_value = -1;
-
-  run_gpio_jack_test(device_index, is_first_device, direction,
-                     should_create_jack, "c1 Headset Jack");
-}
-
-TEST(AlsaJacks, CreateGPIOMicNoUCMFirstDeviceMicJack) {
-  int device_index = 1;
-  int is_first_device = 1;
-  enum CRAS_STREAM_DIRECTION direction = CRAS_STREAM_INPUT;
-  int should_create_jack = 1;
-
-  ResetStubData();
-
-  // No UCM for this jack, create jack for the first device.
-  ucm_get_dev_for_jack_return = false;
-  ucm_get_alsa_dev_idx_for_dev_value = -1;
-
-  // Mic Jack is a valid name for microphone jack.
-  run_gpio_jack_test(device_index, is_first_device, direction,
-                     should_create_jack, "c1 Mic Jack");
-}
-
-TEST(AlsaJacks, CreateGPIOMicNoUCMFirstDeviceHeadsetJack) {
-  int device_index = 1;
-  int is_first_device = 1;
-  enum CRAS_STREAM_DIRECTION direction = CRAS_STREAM_INPUT;
-  int should_create_jack = 1;
-
-  ResetStubData();
-
-  // No UCM for this jack, create jack for the first device.
-  ucm_get_dev_for_jack_return = false;
-  ucm_get_alsa_dev_idx_for_dev_value = -1;
-
-  // Headset Jack is a valid name for microphone jack.
-  run_gpio_jack_test(device_index, is_first_device, direction,
-                     should_create_jack, "c1 Headset Jack");
-}
-
-TEST(AlsaJacks, GPIOHdmiWithEdid) {
-  cras_alsa_jack_list* jack_list;
-
-  ResetStubData();
-  ucm_get_dev_for_jack_return = 1;
-  edid_file_ret = static_cast<char*>(calloc(1, 1));  // Freed in destroy.
-  gpio_switch_list_for_each_dev_names.push_back("c1 HDMI Jack");
-  eviocbit_ret[LONG(SW_LINEOUT_INSERT)] |= 1 << OFF(SW_LINEOUT_INSERT);
-  gpio_switch_eviocgbit_fd = 3;
-  snd_hctl_first_elem_return_val = NULL;
-  jack_list = cras_alsa_jack_list_create(
-      0, "c1", 0, 1, fake_mixer,
-      reinterpret_cast<struct cras_use_case_mgr*>(0x55), fake_hctl,
-      CRAS_STREAM_OUTPUT, fake_jack_cb, fake_jack_cb_arg);
-  ASSERT_NE(static_cast<cras_alsa_jack_list*>(NULL), jack_list);
-  EXPECT_EQ(0, cras_alsa_jack_list_find_jacks_by_name_matching(jack_list));
-  EXPECT_EQ(1, gpio_switch_eviocgsw_called);
-
-  // EDID shouldn't open, callback should be skipped until re-try.
-  fake_jack_cb_called = 0;
-  cras_alsa_jack_list_report(jack_list);
-  EXPECT_EQ(0, fake_jack_cb_called);
-
-  cras_alsa_jack_list_destroy(jack_list);
-  EXPECT_EQ(1, gpio_switch_list_for_each_called);
-  EXPECT_GT(gpio_switch_open_called, 1);
-  EXPECT_GT(gpio_switch_eviocgbit_called, 1);
-  EXPECT_EQ(1, cras_system_add_select_fd_called);
-  EXPECT_EQ(1, cras_system_rm_select_fd_called);
-}
-
-TEST(AlsaJacks, CreateGPIOHpNoNameMatch) {
-  struct cras_alsa_jack_list* jack_list;
-
-  ResetStubData();
-  gpio_switch_list_for_each_dev_names.push_back("some-other-device one");
-  gpio_switch_list_for_each_dev_names.push_back("some-other-device two");
-  snd_hctl_first_elem_return_val = NULL;
-  jack_list = cras_alsa_jack_list_create(0, "c2", 0, 1, fake_mixer, NULL,
-                                         fake_hctl, CRAS_STREAM_OUTPUT,
-                                         fake_jack_cb, fake_jack_cb_arg);
-  ASSERT_NE(static_cast<struct cras_alsa_jack_list*>(NULL), jack_list);
-  EXPECT_EQ(0, cras_alsa_jack_list_find_jacks_by_name_matching(jack_list));
-
-  cras_alsa_jack_list_destroy(jack_list);
-  EXPECT_EQ(1, gpio_switch_list_for_each_called);
-  EXPECT_EQ(0, gpio_switch_open_called);
-  EXPECT_EQ(0, cras_system_add_select_fd_called);
-  EXPECT_EQ(0, cras_system_rm_select_fd_called);
-}
-
-TEST(AlsaJacks, CreateOneHpJack) {
-  std::string elem_names[] = {
-      "asdf",
-      "Headphone Jack, klasdjf",
-      "Mic Jack",
-  };
-  struct cras_alsa_jack_list* jack_list;
-
-  ResetStubData();
-  jack_list = run_test_with_elem_list(CRAS_STREAM_OUTPUT, elem_names, 0, NULL,
-                                      ARRAY_SIZE(elem_names), 0, 1);
-  ASSERT_NE(static_cast<struct cras_alsa_jack_list*>(NULL), jack_list);
-  ASSERT_NE(reinterpret_cast<snd_hctl_elem_callback_t>(NULL),
-            snd_hctl_elem_set_callback_value);
-  EXPECT_EQ(1, snd_hctl_elem_set_callback_called);
-
-  snd_hctl_elem_get_hctl_return_value = reinterpret_cast<snd_hctl_t*>(0x33);
-  snd_hctl_elem_get_name_called = 0;
-  snd_ctl_elem_value_get_boolean_return_value = 1;
-  snd_hctl_elem_set_callback_value(
-      reinterpret_cast<snd_hctl_elem_t*>(&elem_names[1]), 0);
-  EXPECT_EQ(1, snd_hctl_elem_get_name_called);
-  EXPECT_EQ(1, fake_jack_cb_plugged);
-  EXPECT_EQ(1, fake_jack_cb_called);
-  EXPECT_EQ(fake_jack_cb_arg, fake_jack_cb_data);
-  EXPECT_EQ(reinterpret_cast<snd_hctl_elem_t*>(&elem_names[1]),
-            snd_hctl_elem_set_callback_obj);
-
-  fake_jack_cb_called = 0;
-  cras_alsa_jack_list_report(jack_list);
-  EXPECT_EQ(1, fake_jack_cb_plugged);
-  EXPECT_EQ(1, fake_jack_cb_called);
-
-  cras_alsa_jack_list_destroy(jack_list);
-  EXPECT_EQ(2, snd_hctl_elem_set_callback_called);
-  EXPECT_EQ(reinterpret_cast<snd_hctl_elem_callback_t>(NULL),
-            snd_hctl_elem_set_callback_value);
-}
-
-TEST(AlsaJacks, CreateOneMicJack) {
-  static std::string elem_names[] = {
-      "asdf",     "Headphone Jack", "HDMI/DP,pcm=5 Jack", "HDMI/DP,pcm=6 Jack",
-      "Mic Jack",
-  };
-  struct cras_alsa_jack_list* jack_list;
-
-  ResetStubData();
-  jack_list = run_test_with_elem_list(CRAS_STREAM_INPUT, elem_names, 0, NULL,
-                                      ARRAY_SIZE(elem_names), 0, 1);
-  ASSERT_NE(static_cast<struct cras_alsa_jack_list*>(NULL), jack_list);
-  ASSERT_NE(reinterpret_cast<snd_hctl_elem_callback_t>(NULL),
-            snd_hctl_elem_set_callback_value);
-  EXPECT_EQ(1, snd_hctl_elem_set_callback_called);
-
-  cras_alsa_jack_list_destroy(jack_list);
-  EXPECT_EQ(0, cras_system_rm_select_fd_called);
-  EXPECT_EQ(2, snd_hctl_elem_set_callback_called);
-  EXPECT_EQ(reinterpret_cast<snd_hctl_elem_callback_t>(NULL),
-            snd_hctl_elem_set_callback_value);
-}
-
-TEST(AlsaJacks, CreateHDMIJacksWithELD) {
-  std::string elem_names[] = {"asdf", "HDMI/DP,pcm=3 Jack", "ELD",
-                              "HDMI/DP,pcm=4 Jack"};
-  struct cras_alsa_jack_list* jack_list;
-
-  ResetStubData();
-  snd_hctl_elem_get_device_return_val = 3;
-
-  jack_list = run_test_with_elem_list(CRAS_STREAM_OUTPUT, elem_names, 3, NULL,
-                                      ARRAY_SIZE(elem_names), 1, 1);
-  ASSERT_NE(static_cast<struct cras_alsa_jack_list*>(NULL), jack_list);
-
-  /* Assert get device is called for the ELD control */
-  EXPECT_EQ(1, snd_hctl_find_elem_called);
-  cras_alsa_jack_list_destroy(jack_list);
-}
-
-TEST(AlsaJacks, CreateOneHpTwoHDMIJacks) {
-  std::string elem_names[] = {
-      "asdf",
-      "Headphone Jack, klasdjf",
-      "HDMI/DP,pcm=5 Jack",
-      "HDMI/DP,pcm=6 Jack",
-      "Mic Jack",
-  };
-  struct cras_alsa_jack_list* jack_list;
-
-  ResetStubData();
-  ucm_get_dev_for_jack_return = true;
-  jack_list =
-      run_test_with_elem_list(CRAS_STREAM_OUTPUT, elem_names, 5,
-                              reinterpret_cast<struct cras_use_case_mgr*>(0x55),
-                              ARRAY_SIZE(elem_names), 1, 1);
-  ASSERT_NE(static_cast<struct cras_alsa_jack_list*>(NULL), jack_list);
-
-  snd_hctl_elem_get_hctl_return_value = reinterpret_cast<snd_hctl_t*>(0x33);
-  snd_hctl_elem_get_name_called = 0;
-  snd_ctl_elem_value_get_boolean_return_value = 1;
-  snd_hctl_elem_set_callback_value(
-      reinterpret_cast<snd_hctl_elem_t*>(&elem_names[2]), 0);
-  EXPECT_EQ(1, snd_hctl_elem_get_name_called);
-  EXPECT_EQ(1, fake_jack_cb_plugged);
-  EXPECT_EQ(1, fake_jack_cb_called);
-  EXPECT_EQ(fake_jack_cb_arg, fake_jack_cb_data);
-  EXPECT_EQ(reinterpret_cast<snd_hctl_elem_t*>(&elem_names[2]),
-            snd_hctl_elem_set_callback_obj);
-
-  fake_jack_cb_called = 0;
-  cras_alsa_jack_list_report(jack_list);
-  EXPECT_EQ(1, fake_jack_cb_plugged);
-  EXPECT_EQ(1, fake_jack_cb_called);
-
-  cras_alsa_jack_list_destroy(jack_list);
-}
-
-TEST(AlsaJacks, CreateHCTLHeadphoneJackFromUCM) {
-  std::string elem_names[] = {
-      "HP/DP,pcm=5 Jack",
-      "Headphone Jack",
-  };
-  struct cras_alsa_jack_list* jack_list;
-  struct ucm_section* section;
-
-  section = ucm_section_create("Headphone", "hw:0,1", 0, -1, CRAS_STREAM_OUTPUT,
-                               "Headphone Jack", "hctl");
-
-  ResetStubData();
-  ucm_get_dev_for_jack_return = true;
-
-  jack_list = run_test_with_section(
-      CRAS_STREAM_OUTPUT, elem_names, ARRAY_SIZE(elem_names), 5,
-      reinterpret_cast<struct cras_use_case_mgr*>(0x55), section, 0, 1);
-  ASSERT_NE(reinterpret_cast<struct cras_alsa_jack_list*>(NULL), jack_list);
-
-  snd_hctl_elem_get_hctl_return_value = reinterpret_cast<snd_hctl_t*>(0x33);
-  snd_ctl_elem_value_get_boolean_return_value = 1;
-  snd_hctl_elem_set_callback_value(
-      reinterpret_cast<snd_hctl_elem_t*>(&elem_names[1]), 0);
-  EXPECT_EQ(1, snd_hctl_elem_get_name_called);
-  EXPECT_EQ(1, fake_jack_cb_plugged);
-  EXPECT_EQ(1, fake_jack_cb_called);
-  EXPECT_EQ(fake_jack_cb_arg, fake_jack_cb_data);
-  EXPECT_EQ(reinterpret_cast<snd_hctl_elem_t*>(&elem_names[1]),
-            snd_hctl_elem_set_callback_obj);
-
-  fake_jack_cb_called = 0;
-  cras_alsa_jack_list_report(jack_list);
-  EXPECT_EQ(1, fake_jack_cb_plugged);
-  EXPECT_EQ(1, fake_jack_cb_called);
-
-  ucm_section_free_list(section);
-  cras_alsa_jack_list_destroy(jack_list);
-}
-
-TEST(AlsaJacks, CreateGPIOHeadphoneJackFromUCM) {
-  struct cras_alsa_jack_list* jack_list;
-  struct cras_alsa_jack* jack;
-  struct ucm_section* section;
-
-  section = ucm_section_create("Headphone", "hw:0,1", 0, -1, CRAS_STREAM_OUTPUT,
-                               "c1 Headphone Jack", "gpio");
-
-  ResetStubData();
-  gpio_switch_list_for_each_dev_names.push_back("some-other-device");
-  gpio_switch_list_for_each_dev_names.push_back("c1 Headphone Jack");
-  eviocbit_ret[LONG(SW_HEADPHONE_INSERT)] |= 1 << OFF(SW_HEADPHONE_INSERT);
-  gpio_switch_eviocgbit_fd = 2;
-  snd_hctl_first_elem_return_val = NULL;
-  jack_list = cras_alsa_jack_list_create(0, "c1", 0, 1, fake_mixer, NULL,
-                                         fake_hctl, CRAS_STREAM_OUTPUT,
-                                         fake_jack_cb, fake_jack_cb_arg);
-  ASSERT_NE(static_cast<struct cras_alsa_jack_list*>(NULL), jack_list);
-  EXPECT_EQ(
-      0, cras_alsa_jack_list_add_jack_for_section(jack_list, section, &jack));
-  EXPECT_EQ(1, gpio_switch_list_for_each_called);
-  EXPECT_GT(gpio_switch_open_called, 1);
-  EXPECT_EQ(1, gpio_switch_eviocgsw_called);
-  EXPECT_GT(gpio_switch_eviocgbit_called, 1);
-  EXPECT_EQ(1, cras_system_add_select_fd_called);
-  EXPECT_EQ(1, cras_alsa_mixer_get_control_for_section_called);
-
-  fake_jack_cb_called = 0;
-  ucm_get_dev_for_jack_return = true;
-  cras_alsa_jack_list_report(jack_list);
-  EXPECT_EQ(1, fake_jack_cb_plugged);
-  EXPECT_EQ(1, fake_jack_cb_called);
-  EXPECT_EQ(fake_jack_cb_arg, fake_jack_cb_data);
-
-  ucm_section_free_list(section);
-  cras_alsa_jack_list_destroy(jack_list);
-  EXPECT_EQ(1, cras_system_rm_select_fd_called);
-}
-
-TEST(AlsaJacks, BadJackTypeFromUCM) {
-  std::string elem_names[] = {
-      "HP/DP,pcm=5 Jack",
-      "Headphone Jack",
-  };
-  struct cras_alsa_jack_list* jack_list;
-  struct ucm_section* section;
-
-  section = ucm_section_create("Headphone", "hw:0,1", 0, -1, CRAS_STREAM_OUTPUT,
-                               "Headphone Jack", "badtype");
-
-  ResetStubData();
-  ucm_get_dev_for_jack_return = true;
-
-  jack_list = run_test_with_section(
-      CRAS_STREAM_OUTPUT, elem_names, ARRAY_SIZE(elem_names), 5,
-      reinterpret_cast<struct cras_use_case_mgr*>(0x55), section, -22, 1);
-  EXPECT_EQ(reinterpret_cast<struct cras_alsa_jack_list*>(NULL), jack_list);
-
-  ucm_section_free_list(section);
-}
-
-TEST(AlsaJacks, NoJackTypeFromUCM) {
-  std::string elem_names[] = {
-      "HP/DP,pcm=5 Jack",
-      "Headphone Jack",
-  };
-  struct cras_alsa_jack_list* jack_list;
-  struct ucm_section* section;
-
-  section = ucm_section_create("Headphone", "hw:0,1", 0, -1, CRAS_STREAM_OUTPUT,
-                               "Headphone Jack", NULL);
-
-  ResetStubData();
-  ucm_get_dev_for_jack_return = true;
-
-  jack_list = run_test_with_section(
-      CRAS_STREAM_OUTPUT, elem_names, ARRAY_SIZE(elem_names), 5,
-      reinterpret_cast<struct cras_use_case_mgr*>(0x55), section, -22, 1);
-  EXPECT_EQ(reinterpret_cast<struct cras_alsa_jack_list*>(NULL), jack_list);
-
-  ucm_section_free_list(section);
-}
-
-/* Stubs */
-
-extern "C" {
-
-// From cras_system_state
-int cras_system_add_select_fd(int fd,
-                              void (*callback)(void* data),
-                              void* callback_data) {
-  cras_system_add_select_fd_called++;
-  cras_system_add_select_fd_values.push_back(fd);
-  return 0;
-}
-void cras_system_rm_select_fd(int fd) {
-  cras_system_rm_select_fd_called++;
-  cras_system_rm_select_fd_values.push_back(fd);
-}
-
-// From alsa-lib hcontrol.c
-unsigned int snd_hctl_elem_get_device(const snd_hctl_elem_t* obj) {
-  snd_hctl_elem_get_device_called = 1;
-  return snd_hctl_elem_get_device_return_val;
-}
-snd_hctl_elem_t* snd_hctl_first_elem(snd_hctl_t* hctl) {
-  snd_hctl_first_elem_called++;
-
-  /* When first elem is called, restored the poped ret values */
-  while (!snd_hctl_elem_next_ret_vals_poped.empty()) {
-    snd_hctl_elem_t* tmp = snd_hctl_elem_next_ret_vals_poped.back();
-    snd_hctl_elem_next_ret_vals_poped.pop_back();
-    snd_hctl_elem_next_ret_vals.push_back(tmp);
-  }
-  return snd_hctl_first_elem_return_val;
-}
-snd_hctl_elem_t* snd_hctl_elem_next(snd_hctl_elem_t* elem) {
-  snd_hctl_elem_next_called++;
-  if (snd_hctl_elem_next_ret_vals.empty())
-    return NULL;
-  snd_hctl_elem_t* ret_elem = snd_hctl_elem_next_ret_vals.back();
-  snd_hctl_elem_next_ret_vals.pop_back();
-  snd_hctl_elem_next_ret_vals_poped.push_back(ret_elem);
-  return ret_elem;
-}
-const char* snd_hctl_elem_get_name(const snd_hctl_elem_t* obj) {
-  snd_hctl_elem_get_name_called++;
-  const std::string* name = reinterpret_cast<const std::string*>(obj);
-  return name->c_str();
-}
-snd_ctl_elem_iface_t snd_hctl_elem_get_interface(const snd_hctl_elem_t* obj) {
-  return SND_CTL_ELEM_IFACE_CARD;
-}
-void snd_hctl_elem_set_callback(snd_hctl_elem_t* obj,
-                                snd_hctl_elem_callback_t val) {
-  snd_hctl_elem_set_callback_called++;
-  snd_hctl_elem_set_callback_obj = obj;
-  snd_hctl_elem_set_callback_value = val;
-}
-void snd_hctl_elem_set_callback_private(snd_hctl_elem_t* obj, void* val) {
-  snd_hctl_elem_set_callback_private_called++;
-  snd_hctl_elem_set_callback_private_value = val;
-}
-void* snd_hctl_elem_get_callback_private(const snd_hctl_elem_t* obj) {
-  return snd_hctl_elem_set_callback_private_value;
-}
-snd_hctl_t* snd_hctl_elem_get_hctl(snd_hctl_elem_t* elem) {
-  snd_hctl_elem_get_hctl_called++;
-  return snd_hctl_elem_get_hctl_return_value;
-}
-int snd_hctl_elem_read(snd_hctl_elem_t* elem, snd_ctl_elem_value_t* value) {
-  return 0;
-}
-snd_hctl_elem_t* snd_hctl_find_elem(snd_hctl_t* hctl,
-                                    const snd_ctl_elem_id_t* id) {
-  const size_t* index = reinterpret_cast<const size_t*>(id);
-  snd_hctl_find_elem_called++;
-  if (*index < snd_hctl_find_elem_return_vals.size())
-    return snd_hctl_find_elem_return_vals[*index];
-  return NULL;
-}
-void snd_ctl_elem_id_set_interface(snd_ctl_elem_id_t* obj,
-                                   snd_ctl_elem_iface_t val) {}
-void snd_ctl_elem_id_set_device(snd_ctl_elem_id_t* obj, unsigned int val) {}
-void snd_ctl_elem_id_set_name(snd_ctl_elem_id_t* obj, const char* val) {
-  size_t* obj_id = reinterpret_cast<size_t*>(obj);
-  std::map<std::string, size_t>::iterator id_name_it =
-      snd_ctl_elem_id_set_name_map.find(val);
-  if (id_name_it != snd_ctl_elem_id_set_name_map.end())
-    *obj_id = id_name_it->second;
-  else
-    *obj_id = INT_MAX;
-}
-
-// From alsa-lib control.c
-int snd_ctl_elem_value_get_boolean(const snd_ctl_elem_value_t* obj,
-                                   unsigned int idx) {
-  snd_ctl_elem_value_get_boolean_called++;
-  return snd_ctl_elem_value_get_boolean_return_value;
-}
-
-// From cras_alsa_mixer
-struct mixer_control* cras_alsa_mixer_get_output_matching_name(
-    const struct cras_alsa_mixer* cras_mixer,
-    size_t device_index,
-    const char* const name) {
-  cras_alsa_mixer_get_output_matching_name_called++;
-  return cras_alsa_mixer_get_output_matching_name_return_value;
-}
-
-struct mixer_control* cras_alsa_mixer_get_input_matching_name(
-    struct cras_alsa_mixer* cras_mixer,
-    const char* control_name) {
-  cras_alsa_mixer_get_input_matching_name_called++;
-  return cras_alsa_mixer_get_input_matching_name_return_value;
-}
-
-struct mixer_control* cras_alsa_mixer_get_control_for_section(
-    struct cras_alsa_mixer* cras_mixer,
-    struct ucm_section* section) {
-  cras_alsa_mixer_get_control_for_section_called++;
-  return cras_alsa_mixer_get_control_for_section_return_value;
-}
-
-int gpio_switch_eviocgbit(int fd, void* buf, size_t n_bytes) {
-  unsigned char* p = (unsigned char*)buf;
-
-  /* Returns >= 0 if 'sw' is supported, negative if not.
-   *
-   *  Set the bit corresponding to 'sw' in 'buf'.  'buf' must have
-   *  been allocated by the caller to accommodate this.
-   */
-  if (fd == gpio_switch_eviocgbit_fd)
-    memcpy(p, eviocbit_ret, n_bytes);
-  else
-    memset(p, 0, n_bytes);
-
-  gpio_switch_eviocgbit_called++;
-  return 1;
-}
-
-int gpio_switch_eviocgsw(int fd, void* bits, size_t n_bytes) {
-  /* Bits set to '1' indicate a switch is enabled.
-   * Bits set to '0' indicate a switch is disabled
-   */
-  gpio_switch_eviocgsw_called++;
-  memset(bits, 0xff, n_bytes);
-  return 1;
-}
-
-int gpio_switch_read(int fd, void* buf, size_t n_bytes) {
-  /* This function is only invoked when the 'switch has changed'
-   * callback is invoked.  That code is not exercised by this
-   * unittest.
-   */
-  assert(0);
-  return 0;
-}
-
-int gpio_switch_open(const char* pathname) {
-  ++gpio_switch_open_called;
-  if (strstr(pathname, "event2"))
-    return 2;
-  if (strstr(pathname, "event3"))
-    return 3;
-  return 0;
-}
-
-void gpio_switch_list_for_each(gpio_switch_list_callback callback, void* arg) {
-  size_t i = 0;
-
-  ++gpio_switch_list_for_each_called;
-
-  while (i < gpio_switch_list_for_each_dev_names.size() &&
-         i < gpio_switch_list_for_each_dev_paths.size()) {
-    callback(gpio_switch_list_for_each_dev_paths[i].c_str(),
-             gpio_switch_list_for_each_dev_names[i].c_str(), arg);
-    i++;
-  }
-}
-
-int ucm_set_enabled(struct cras_use_case_mgr* mgr,
-                    const char* dev,
-                    int enable) {
-  ucm_set_enabled_value = enable;
-  return 0;
-}
-
-char* ucm_get_cap_control(struct cras_use_case_mgr* mgr, const char* ucm_dev) {
-  ++ucm_get_cap_control_called;
-  return ucm_get_cap_control_value;
-}
-
-char* ucm_get_dev_for_jack(struct cras_use_case_mgr* mgr,
-                           const char* jack,
-                           CRAS_STREAM_DIRECTION direction) {
-  ++ucm_get_dev_for_jack_called;
-  if (ucm_get_dev_for_jack_return)
-    return static_cast<char*>(
-        malloc(1));  // Will be freed in jack_list_destroy.
-  return NULL;
-}
-
-const char* ucm_get_edid_file_for_dev(struct cras_use_case_mgr* mgr,
-                                      const char* dev) {
-  return edid_file_ret;
-}
-
-const char* ucm_get_override_type_name(struct cras_use_case_mgr* mgr,
-                                       const char* ucm_dev) {
-  ++ucm_get_override_type_name_called;
-  return NULL;
-}
-
-int ucm_get_alsa_dev_idx_for_dev(struct cras_use_case_mgr* mgr,
-                                 const char* dev,
-                                 enum CRAS_STREAM_DIRECTION direction) {
-  return ucm_get_alsa_dev_idx_for_dev_value;
-}
-
-cras_timer* cras_tm_create_timer(cras_tm* tm,
-                                 unsigned int ms,
-                                 void (*cb)(cras_timer* t, void* data),
-                                 void* cb_data) {
-  return reinterpret_cast<cras_timer*>(0x55);
-}
-
-void cras_tm_cancel_timer(cras_tm* tm, cras_timer* t) {}
-
-cras_tm* cras_system_state_get_tm() {
-  return reinterpret_cast<cras_tm*>(0x66);
-}
-
-int edid_valid(const unsigned char* edid_data) {
-  return 0;
-}
-
-int edid_lpcm_support(const unsigned char* edid_data, int ext) {
-  return 0;
-}
-
-int edid_get_monitor_name(const unsigned char* edid_data,
-                          char* buf,
-                          unsigned int buf_size) {
-  return 0;
-}
-
-// Overwrite this function so unittest can run without 2 seconds of wait
-// in find_gpio_jacks.
-int wait_for_dev_input_access() {
-  return 0;
-}
-
-} /* extern "C" */
-
-}  //  namespace
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  openlog(NULL, LOG_PERROR, LOG_USER);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tests/alsa_mixer_unittest.cc b/cras/src/tests/alsa_mixer_unittest.cc
deleted file mode 100644
index b3db9de..0000000
--- a/cras/src/tests/alsa_mixer_unittest.cc
+++ /dev/null
@@ -1,1645 +0,0 @@
-// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <gtest/gtest.h>
-#include <stdio.h>
-#include <syslog.h>
-
-#include <map>
-#include <string>
-#include <vector>
-
-extern "C" {
-#include "cras_alsa_mixer.h"
-#include "cras_alsa_mixer_name.h"
-#include "cras_types.h"
-#include "cras_util.h"
-#include "cras_volume_curve.h"
-#include "utlist.h"
-
-//  Include C file to test static functions and use the definition of some
-//  structure.
-#include "cras_alsa_mixer.c"
-}
-
-namespace {
-
-static size_t snd_mixer_open_called;
-static int snd_mixer_open_return_value;
-static size_t snd_mixer_close_called;
-static size_t snd_mixer_attach_called;
-static int snd_mixer_attach_return_value;
-const char* snd_mixer_attach_mixdev;
-static size_t snd_mixer_selem_register_called;
-static int snd_mixer_selem_register_return_value;
-static size_t snd_mixer_load_called;
-static int snd_mixer_load_return_value;
-static size_t snd_mixer_first_elem_called;
-static snd_mixer_elem_t* snd_mixer_first_elem_return_value;
-static int snd_mixer_elem_next_called;
-static snd_mixer_elem_t** snd_mixer_elem_next_return_values;
-static int snd_mixer_elem_next_return_values_index;
-static int snd_mixer_elem_next_return_values_length;
-static int snd_mixer_selem_set_playback_dB_all_called;
-static long* snd_mixer_selem_set_playback_dB_all_values;
-static int snd_mixer_selem_set_playback_dB_all_values_length;
-static int snd_mixer_selem_set_playback_switch_all_called;
-static int snd_mixer_selem_set_playback_switch_all_value;
-static int snd_mixer_selem_has_playback_volume_called;
-static int* snd_mixer_selem_has_playback_volume_return_values;
-static int snd_mixer_selem_has_playback_volume_return_values_length;
-static int snd_mixer_selem_has_playback_switch_called;
-static int* snd_mixer_selem_has_playback_switch_return_values;
-static int snd_mixer_selem_has_playback_switch_return_values_length;
-static int snd_mixer_selem_set_capture_dB_all_called;
-static long* snd_mixer_selem_set_capture_dB_all_values;
-static int snd_mixer_selem_set_capture_dB_all_values_length;
-static int snd_mixer_selem_set_capture_switch_all_called;
-static int snd_mixer_selem_set_capture_switch_all_value;
-static int snd_mixer_selem_has_capture_volume_called;
-static int* snd_mixer_selem_has_capture_volume_return_values;
-static int snd_mixer_selem_has_capture_volume_return_values_length;
-static int snd_mixer_selem_has_capture_switch_called;
-static int* snd_mixer_selem_has_capture_switch_return_values;
-static int snd_mixer_selem_has_capture_switch_return_values_length;
-static int snd_mixer_selem_get_name_called;
-static const char** snd_mixer_selem_get_name_return_values;
-static int snd_mixer_selem_get_name_return_values_length;
-static int snd_mixer_selem_get_playback_dB_called;
-static long* snd_mixer_selem_get_playback_dB_return_values;
-static int snd_mixer_selem_get_playback_dB_return_values_length;
-static int snd_mixer_selem_get_capture_dB_called;
-static long* snd_mixer_selem_get_capture_dB_return_values;
-static int snd_mixer_selem_get_capture_dB_return_values_length;
-static size_t cras_volume_curve_destroy_called;
-static size_t snd_mixer_selem_get_playback_dB_range_called;
-static size_t snd_mixer_selem_get_playback_dB_range_values_length;
-static const long* snd_mixer_selem_get_playback_dB_range_min_values;
-static const long* snd_mixer_selem_get_playback_dB_range_max_values;
-static size_t snd_mixer_selem_get_capture_dB_range_called;
-static size_t snd_mixer_selem_get_capture_dB_range_values_length;
-static const long* snd_mixer_selem_get_capture_dB_range_min_values;
-static const long* snd_mixer_selem_get_capture_dB_range_max_values;
-static size_t iniparser_getstring_return_index;
-static size_t iniparser_getstring_return_length;
-static char** iniparser_getstring_returns;
-static size_t snd_mixer_find_selem_called;
-static std::map<std::string, snd_mixer_elem_t*> snd_mixer_find_elem_map;
-static std::string snd_mixer_find_elem_id_name;
-
-static void ResetStubData() {
-  iniparser_getstring_return_index = 0;
-  iniparser_getstring_return_length = 0;
-  snd_mixer_open_called = 0;
-  snd_mixer_open_return_value = 0;
-  snd_mixer_close_called = 0;
-  snd_mixer_attach_called = 0;
-  snd_mixer_attach_return_value = 0;
-  snd_mixer_attach_mixdev = static_cast<const char*>(NULL);
-  snd_mixer_selem_register_called = 0;
-  snd_mixer_selem_register_return_value = 0;
-  snd_mixer_load_called = 0;
-  snd_mixer_load_return_value = 0;
-  snd_mixer_first_elem_called = 0;
-  snd_mixer_first_elem_return_value = static_cast<snd_mixer_elem_t*>(NULL);
-  snd_mixer_elem_next_called = 0;
-  snd_mixer_elem_next_return_values = static_cast<snd_mixer_elem_t**>(NULL);
-  snd_mixer_elem_next_return_values_index = 0;
-  snd_mixer_elem_next_return_values_length = 0;
-  snd_mixer_selem_set_playback_dB_all_called = 0;
-  snd_mixer_selem_set_playback_dB_all_values = static_cast<long*>(NULL);
-  snd_mixer_selem_set_playback_dB_all_values_length = 0;
-  snd_mixer_selem_set_playback_switch_all_called = 0;
-  snd_mixer_selem_has_playback_volume_called = 0;
-  snd_mixer_selem_has_playback_volume_return_values = static_cast<int*>(NULL);
-  snd_mixer_selem_has_playback_volume_return_values_length = 0;
-  snd_mixer_selem_has_playback_switch_called = 0;
-  snd_mixer_selem_has_playback_switch_return_values = static_cast<int*>(NULL);
-  snd_mixer_selem_has_playback_switch_return_values_length = 0;
-  snd_mixer_selem_set_capture_dB_all_called = 0;
-  snd_mixer_selem_set_capture_dB_all_values = static_cast<long*>(NULL);
-  snd_mixer_selem_set_capture_dB_all_values_length = 0;
-  snd_mixer_selem_set_capture_switch_all_called = 0;
-  snd_mixer_selem_has_capture_volume_called = 0;
-  snd_mixer_selem_has_capture_volume_return_values = static_cast<int*>(NULL);
-  snd_mixer_selem_has_capture_volume_return_values_length = 0;
-  snd_mixer_selem_has_capture_switch_called = 0;
-  snd_mixer_selem_has_capture_switch_return_values = static_cast<int*>(NULL);
-  snd_mixer_selem_has_capture_switch_return_values_length = 0;
-  snd_mixer_selem_get_name_called = 0;
-  snd_mixer_selem_get_name_return_values = static_cast<const char**>(NULL);
-  snd_mixer_selem_get_name_return_values_length = 0;
-  snd_mixer_selem_get_playback_dB_called = 0;
-  snd_mixer_selem_get_playback_dB_return_values = static_cast<long*>(NULL);
-  snd_mixer_selem_get_playback_dB_return_values_length = 0;
-  snd_mixer_selem_get_capture_dB_called = 0;
-  snd_mixer_selem_get_capture_dB_return_values = static_cast<long*>(NULL);
-  snd_mixer_selem_get_capture_dB_return_values_length = 0;
-  cras_volume_curve_destroy_called = 0;
-  snd_mixer_selem_get_playback_dB_range_called = 0;
-  snd_mixer_selem_get_playback_dB_range_values_length = 0;
-  snd_mixer_selem_get_playback_dB_range_min_values = static_cast<long*>(NULL);
-  snd_mixer_selem_get_playback_dB_range_max_values = static_cast<long*>(NULL);
-  snd_mixer_selem_get_capture_dB_range_called = 0;
-  snd_mixer_selem_get_capture_dB_range_values_length = 0;
-  snd_mixer_selem_get_capture_dB_range_min_values = static_cast<long*>(NULL);
-  snd_mixer_selem_get_capture_dB_range_max_values = static_cast<long*>(NULL);
-  snd_mixer_find_selem_called = 0;
-  snd_mixer_find_elem_map.clear();
-  snd_mixer_find_elem_id_name.clear();
-}
-
-struct cras_alsa_mixer* create_mixer_and_add_controls_by_name_matching(
-    const char* card_name,
-    struct mixer_name* extra_controls,
-    struct mixer_name* coupled_controls) {
-  struct cras_alsa_mixer* cmix = cras_alsa_mixer_create(card_name);
-  cras_alsa_mixer_add_controls_by_name_matching(cmix, extra_controls,
-                                                coupled_controls);
-  return cmix;
-}
-
-TEST(AlsaMixer, CreateFailOpen) {
-  struct cras_alsa_mixer* c;
-
-  ResetStubData();
-  snd_mixer_open_return_value = -1;
-  c = cras_alsa_mixer_create("hw:0");
-  EXPECT_NE(static_cast<struct cras_alsa_mixer*>(NULL), c);
-  EXPECT_EQ(1, snd_mixer_open_called);
-  cras_alsa_mixer_destroy(c);
-}
-
-TEST(AlsaMixer, CreateFailAttach) {
-  struct cras_alsa_mixer* c;
-
-  ResetStubData();
-  snd_mixer_attach_return_value = -1;
-  c = cras_alsa_mixer_create("hw:0");
-  EXPECT_NE(static_cast<struct cras_alsa_mixer*>(NULL), c);
-  EXPECT_EQ(1, snd_mixer_open_called);
-  EXPECT_EQ(1, snd_mixer_attach_called);
-  EXPECT_EQ(0, strcmp(snd_mixer_attach_mixdev, "hw:0"));
-  EXPECT_EQ(1, snd_mixer_close_called);
-  cras_alsa_mixer_destroy(c);
-}
-
-TEST(AlsaMixer, CreateFailSelemRegister) {
-  struct cras_alsa_mixer* c;
-
-  ResetStubData();
-  snd_mixer_selem_register_return_value = -1;
-  c = cras_alsa_mixer_create("hw:0");
-  EXPECT_NE(static_cast<struct cras_alsa_mixer*>(NULL), c);
-  EXPECT_EQ(1, snd_mixer_open_called);
-  EXPECT_EQ(1, snd_mixer_attach_called);
-  EXPECT_EQ(0, strcmp(snd_mixer_attach_mixdev, "hw:0"));
-  EXPECT_EQ(1, snd_mixer_selem_register_called);
-  EXPECT_EQ(1, snd_mixer_close_called);
-  cras_alsa_mixer_destroy(c);
-}
-
-TEST(AlsaMixer, CreateFailLoad) {
-  struct cras_alsa_mixer* c;
-
-  ResetStubData();
-  snd_mixer_load_return_value = -1;
-  c = cras_alsa_mixer_create("hw:0");
-  EXPECT_NE(static_cast<struct cras_alsa_mixer*>(NULL), c);
-  EXPECT_EQ(1, snd_mixer_open_called);
-  EXPECT_EQ(1, snd_mixer_attach_called);
-  EXPECT_EQ(0, strcmp(snd_mixer_attach_mixdev, "hw:0"));
-  EXPECT_EQ(1, snd_mixer_selem_register_called);
-  EXPECT_EQ(1, snd_mixer_load_called);
-  EXPECT_EQ(1, snd_mixer_close_called);
-  cras_alsa_mixer_destroy(c);
-}
-
-TEST(AlsaMixer, CreateNoElements) {
-  struct cras_alsa_mixer* c;
-
-  ResetStubData();
-  c = create_mixer_and_add_controls_by_name_matching("hw:0", NULL, NULL);
-  ASSERT_NE(static_cast<struct cras_alsa_mixer*>(NULL), c);
-  EXPECT_EQ(1, snd_mixer_open_called);
-  EXPECT_EQ(1, snd_mixer_attach_called);
-  EXPECT_EQ(0, strcmp(snd_mixer_attach_mixdev, "hw:0"));
-  EXPECT_EQ(1, snd_mixer_selem_register_called);
-  EXPECT_EQ(1, snd_mixer_load_called);
-  EXPECT_EQ(0, snd_mixer_close_called);
-
-  /* set mute shouldn't call anything. */
-  cras_alsa_mixer_set_mute(c, 0, NULL);
-  EXPECT_EQ(0, snd_mixer_selem_set_playback_switch_all_called);
-  /* set volume shouldn't call anything. */
-  cras_alsa_mixer_set_dBFS(c, 0, NULL);
-  EXPECT_EQ(0, snd_mixer_selem_set_playback_dB_all_called);
-
-  cras_alsa_mixer_destroy(c);
-  EXPECT_EQ(1, snd_mixer_close_called);
-}
-
-TEST(AlsaMixer, CreateOneUnknownElementWithoutVolume) {
-  struct cras_alsa_mixer* c;
-  int element_playback_volume[] = {
-      0,
-  };
-  int element_playback_switches[] = {
-      1,
-  };
-  const char* element_names[] = {
-      "Unknown",
-  };
-  struct mixer_control* mixer_output;
-  int rc;
-
-  ResetStubData();
-  snd_mixer_first_elem_return_value = reinterpret_cast<snd_mixer_elem_t*>(1);
-  snd_mixer_selem_has_playback_volume_return_values = element_playback_volume;
-  snd_mixer_selem_has_playback_volume_return_values_length =
-      ARRAY_SIZE(element_playback_volume);
-  snd_mixer_selem_get_name_return_values = element_names;
-  snd_mixer_selem_get_name_return_values_length = ARRAY_SIZE(element_names);
-  c = create_mixer_and_add_controls_by_name_matching("hw:0", NULL, NULL);
-  ASSERT_NE(static_cast<struct cras_alsa_mixer*>(NULL), c);
-  EXPECT_EQ(1, snd_mixer_open_called);
-  EXPECT_EQ(1, snd_mixer_attach_called);
-  EXPECT_EQ(0, strcmp(snd_mixer_attach_mixdev, "hw:0"));
-  EXPECT_EQ(1, snd_mixer_selem_register_called);
-  EXPECT_EQ(1, snd_mixer_load_called);
-  EXPECT_EQ(0, snd_mixer_close_called);
-  EXPECT_EQ(1, snd_mixer_selem_has_playback_volume_called);
-  EXPECT_EQ(1, snd_mixer_selem_get_name_called);
-  EXPECT_EQ(0, snd_mixer_selem_get_playback_dB_range_called);
-
-  /* set mute shouldn't call anything. */
-  cras_alsa_mixer_set_mute(c, 0, NULL);
-  EXPECT_EQ(0, snd_mixer_selem_set_playback_switch_all_called);
-
-  ResetStubData();
-  snd_mixer_selem_has_playback_switch_return_values = element_playback_switches;
-  snd_mixer_selem_has_playback_switch_return_values_length =
-      ARRAY_SIZE(element_playback_switches);
-  snd_mixer_selem_get_name_return_values = element_names;
-  snd_mixer_selem_get_name_return_values_length = ARRAY_SIZE(element_names);
-  rc = mixer_control_create(&mixer_output, NULL,
-                            reinterpret_cast<snd_mixer_elem_t*>(1),
-                            CRAS_STREAM_OUTPUT);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(1, snd_mixer_selem_get_name_called);
-  EXPECT_EQ(1, snd_mixer_selem_has_playback_volume_called);
-  EXPECT_EQ(1, snd_mixer_selem_has_playback_switch_called);
-  EXPECT_EQ(1, snd_mixer_selem_get_playback_dB_range_called);
-
-  /* if passed a mixer output then it should mute that. */
-  cras_alsa_mixer_set_mute(c, 0, mixer_output);
-  EXPECT_EQ(1, snd_mixer_selem_set_playback_switch_all_called);
-  /* set volume shouldn't call anything. */
-  cras_alsa_mixer_set_dBFS(c, 0, NULL);
-  EXPECT_EQ(0, snd_mixer_selem_set_playback_dB_all_called);
-
-  cras_alsa_mixer_destroy(c);
-  EXPECT_EQ(1, snd_mixer_close_called);
-  mixer_control_destroy(mixer_output);
-}
-
-TEST(AlsaMixer, CreateOneUnknownElementWithVolume) {
-  struct cras_alsa_mixer* c;
-  static const long min_volumes[] = {-500};
-  static const long max_volumes[] = {40};
-  int element_playback_volume[] = {
-      1,
-      0,
-  };
-  int element_playback_switches[] = {
-      0,
-      1,
-  };
-  const char* element_names[] = {
-      "Unknown",
-      "Playback",
-  };
-  struct mixer_control* mixer_output;
-  int rc;
-
-  ResetStubData();
-  snd_mixer_first_elem_return_value = reinterpret_cast<snd_mixer_elem_t*>(1);
-  snd_mixer_selem_has_playback_volume_return_values = element_playback_volume;
-  snd_mixer_selem_has_playback_volume_return_values_length =
-      ARRAY_SIZE(element_playback_volume);
-  snd_mixer_selem_get_name_return_values = element_names;
-  snd_mixer_selem_get_name_return_values_length = ARRAY_SIZE(element_names);
-  snd_mixer_selem_get_playback_dB_range_min_values = min_volumes;
-  snd_mixer_selem_get_playback_dB_range_max_values = max_volumes;
-  snd_mixer_selem_get_playback_dB_range_values_length = ARRAY_SIZE(min_volumes);
-  c = create_mixer_and_add_controls_by_name_matching("hw:0", NULL, NULL);
-  ASSERT_NE(static_cast<struct cras_alsa_mixer*>(NULL), c);
-  EXPECT_EQ(1, snd_mixer_open_called);
-  EXPECT_EQ(1, snd_mixer_attach_called);
-  EXPECT_EQ(0, strcmp(snd_mixer_attach_mixdev, "hw:0"));
-  EXPECT_EQ(1, snd_mixer_selem_register_called);
-  EXPECT_EQ(1, snd_mixer_load_called);
-  EXPECT_EQ(0, snd_mixer_close_called);
-  EXPECT_EQ(3, snd_mixer_selem_has_playback_volume_called);
-  EXPECT_EQ(2, snd_mixer_selem_get_playback_dB_range_called);
-  EXPECT_EQ(3, snd_mixer_selem_get_name_called);
-
-  /* Should use "Playback" since it has playback switch. */
-  cras_alsa_mixer_set_mute(c, 0, NULL);
-  EXPECT_EQ(1, snd_mixer_selem_set_playback_switch_all_called);
-
-  ResetStubData();
-  snd_mixer_selem_has_playback_volume_return_values = element_playback_volume;
-  snd_mixer_selem_has_playback_volume_return_values_length =
-      ARRAY_SIZE(element_playback_volume);
-  snd_mixer_selem_has_playback_switch_return_values = element_playback_switches;
-  snd_mixer_selem_has_playback_switch_return_values_length =
-      ARRAY_SIZE(element_playback_switches);
-  snd_mixer_selem_get_name_return_values = element_names;
-  snd_mixer_selem_get_name_return_values_length = ARRAY_SIZE(element_names);
-  rc = mixer_control_create(&mixer_output, NULL,
-                            reinterpret_cast<snd_mixer_elem_t*>(2),
-                            CRAS_STREAM_OUTPUT);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(1, snd_mixer_selem_get_name_called);
-  EXPECT_EQ(1, snd_mixer_selem_has_playback_volume_called);
-  EXPECT_EQ(1, snd_mixer_selem_has_playback_switch_called);
-  EXPECT_EQ(0, snd_mixer_selem_get_playback_dB_range_called);
-
-  /*
-   * If passed a mixer output then it should mute both "Playback" and that
-   * mixer_output.
-   */
-  cras_alsa_mixer_set_mute(c, 0, mixer_output);
-  EXPECT_EQ(2, snd_mixer_selem_set_playback_switch_all_called);
-  cras_alsa_mixer_set_dBFS(c, 0, NULL);
-  EXPECT_EQ(1, snd_mixer_selem_set_playback_dB_all_called);
-
-  cras_alsa_mixer_destroy(c);
-  EXPECT_EQ(1, snd_mixer_close_called);
-  mixer_control_destroy(mixer_output);
-}
-
-TEST(AlsaMixer, CreateOneMainElement) {
-  struct cras_alsa_mixer* c;
-  int element_playback_volume[] = {
-      1,
-      1,
-  };
-  int element_playback_switches[] = {
-      1,
-      1,
-  };
-  const char* element_names[] = {"Master", "Playback"};
-  struct mixer_control* mixer_output;
-  int rc;
-  long set_dB_values[3];
-  static const long min_volumes[] = {0, 0};
-  static const long max_volumes[] = {950, 950};
-
-  ResetStubData();
-  snd_mixer_first_elem_return_value = reinterpret_cast<snd_mixer_elem_t*>(1);
-  snd_mixer_selem_has_playback_volume_return_values = element_playback_volume;
-  snd_mixer_selem_has_playback_volume_return_values_length =
-      ARRAY_SIZE(element_playback_volume);
-  snd_mixer_selem_has_playback_switch_return_values = element_playback_switches;
-  snd_mixer_selem_has_playback_switch_return_values_length =
-      ARRAY_SIZE(element_playback_switches);
-  snd_mixer_selem_get_name_return_values = element_names;
-  snd_mixer_selem_get_name_return_values_length = ARRAY_SIZE(element_names);
-  c = create_mixer_and_add_controls_by_name_matching("hw:0", NULL, NULL);
-  ASSERT_NE(static_cast<struct cras_alsa_mixer*>(NULL), c);
-  EXPECT_EQ(1, snd_mixer_open_called);
-  EXPECT_EQ(1, snd_mixer_attach_called);
-  EXPECT_EQ(0, strcmp(snd_mixer_attach_mixdev, "hw:0"));
-  EXPECT_EQ(1, snd_mixer_selem_register_called);
-  EXPECT_EQ(1, snd_mixer_load_called);
-  EXPECT_EQ(0, snd_mixer_close_called);
-  EXPECT_EQ(3, snd_mixer_selem_get_name_called);
-  EXPECT_EQ(1, snd_mixer_elem_next_called);
-
-  /* set mute should be called for Main. */
-  cras_alsa_mixer_set_mute(c, 0, NULL);
-  EXPECT_EQ(1, snd_mixer_selem_set_playback_switch_all_called);
-  /* set volume should be called for Main. */
-  cras_alsa_mixer_set_dBFS(c, 0, NULL);
-  EXPECT_EQ(1, snd_mixer_selem_set_playback_dB_all_called);
-
-  ResetStubData();
-  snd_mixer_selem_set_playback_dB_all_values = set_dB_values;
-  snd_mixer_selem_set_playback_dB_all_values_length = ARRAY_SIZE(set_dB_values);
-  snd_mixer_selem_get_playback_dB_range_min_values = min_volumes;
-  snd_mixer_selem_get_playback_dB_range_max_values = max_volumes;
-  snd_mixer_selem_get_playback_dB_range_values_length = ARRAY_SIZE(min_volumes);
-  snd_mixer_selem_has_playback_volume_return_values = element_playback_volume;
-  snd_mixer_selem_has_playback_volume_return_values_length =
-      ARRAY_SIZE(element_playback_volume);
-  snd_mixer_selem_get_name_return_values = element_names;
-  snd_mixer_selem_get_name_return_values_length = ARRAY_SIZE(element_names);
-  rc = mixer_control_create(&mixer_output, NULL,
-                            reinterpret_cast<snd_mixer_elem_t*>(2),
-                            CRAS_STREAM_OUTPUT);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(1, snd_mixer_selem_get_name_called);
-  EXPECT_EQ(1, snd_mixer_selem_has_playback_volume_called);
-  EXPECT_EQ(1, snd_mixer_selem_has_playback_switch_called);
-  EXPECT_EQ(1, snd_mixer_selem_get_playback_dB_range_called);
-
-  /* if passed a mixer output then it should set the volume for that too. */
-  cras_alsa_mixer_set_dBFS(c, 0, mixer_output);
-  EXPECT_EQ(2, snd_mixer_selem_set_playback_dB_all_called);
-  EXPECT_EQ(950, set_dB_values[0]);
-  EXPECT_EQ(950, set_dB_values[1]);
-
-  cras_alsa_mixer_destroy(c);
-  EXPECT_EQ(1, snd_mixer_close_called);
-  mixer_control_destroy(mixer_output);
-}
-
-TEST(AlsaMixer, CreateTwoMainVolumeElements) {
-  struct cras_alsa_mixer* c;
-  snd_mixer_elem_t* elements[] = {
-      reinterpret_cast<snd_mixer_elem_t*>(2),
-  };
-  int element_playback_volume[] = {
-      1,
-      1,
-      1,
-  };
-  int element_playback_switches[] = {
-      1,
-      1,
-      1,
-  };
-  const char* element_names[] = {
-      "Master",
-      "PCM",
-      "Other",
-  };
-  struct mixer_control* mixer_output;
-  int rc;
-  static const long min_volumes[] = {-500, -1250, -500};
-  static const long max_volumes[] = {40, 40, 0};
-  long get_dB_returns[] = {0, 0, 0};
-  long set_dB_values[3];
-
-  ResetStubData();
-  snd_mixer_first_elem_return_value = reinterpret_cast<snd_mixer_elem_t*>(1);
-  snd_mixer_elem_next_return_values = elements;
-  snd_mixer_elem_next_return_values_length = ARRAY_SIZE(elements);
-  snd_mixer_selem_has_playback_volume_return_values = element_playback_volume;
-  snd_mixer_selem_has_playback_volume_return_values_length =
-      ARRAY_SIZE(element_playback_volume);
-  snd_mixer_selem_has_playback_switch_return_values = element_playback_switches;
-  snd_mixer_selem_has_playback_switch_return_values_length =
-      ARRAY_SIZE(element_playback_switches);
-  snd_mixer_selem_get_name_return_values = element_names;
-  snd_mixer_selem_get_name_return_values_length = ARRAY_SIZE(element_names);
-  snd_mixer_selem_get_playback_dB_range_called = 0;
-  snd_mixer_selem_get_playback_dB_range_min_values = min_volumes;
-  snd_mixer_selem_get_playback_dB_range_max_values = max_volumes;
-  snd_mixer_selem_get_playback_dB_range_values_length = ARRAY_SIZE(min_volumes);
-  snd_mixer_selem_set_playback_dB_all_values = set_dB_values;
-  snd_mixer_selem_set_playback_dB_all_values_length = ARRAY_SIZE(set_dB_values);
-  c = create_mixer_and_add_controls_by_name_matching("hw:0", NULL, NULL);
-  ASSERT_NE(static_cast<struct cras_alsa_mixer*>(NULL), c);
-  EXPECT_EQ(2, snd_mixer_selem_get_playback_dB_range_called);
-  EXPECT_EQ(1, snd_mixer_open_called);
-  EXPECT_EQ(1, snd_mixer_attach_called);
-  EXPECT_EQ(0, strcmp(snd_mixer_attach_mixdev, "hw:0"));
-  EXPECT_EQ(1, snd_mixer_selem_register_called);
-  EXPECT_EQ(1, snd_mixer_load_called);
-  EXPECT_EQ(0, snd_mixer_close_called);
-  EXPECT_EQ(2, snd_mixer_elem_next_called);
-  EXPECT_EQ(5, snd_mixer_selem_get_name_called);
-  EXPECT_EQ(3, snd_mixer_selem_has_playback_switch_called);
-
-  /* Set mute should be called for Main only. */
-  cras_alsa_mixer_set_mute(c, 0, NULL);
-  EXPECT_EQ(1, snd_mixer_selem_set_playback_switch_all_called);
-
-  /* Set volume should be called for Main and PCM. If Main doesn't set to
-   * anything but zero then the entire volume should be passed to the PCM
-   * control.*/
-
-  /* Set volume should be called for Main and PCM. (without mixer_output) */
-  snd_mixer_selem_get_playback_dB_return_values = get_dB_returns;
-  snd_mixer_selem_get_playback_dB_return_values_length =
-      ARRAY_SIZE(get_dB_returns);
-  cras_alsa_mixer_set_dBFS(c, -50, NULL);
-  EXPECT_EQ(2, snd_mixer_selem_set_playback_dB_all_called);
-  EXPECT_EQ(2, snd_mixer_selem_get_playback_dB_called);
-  /* volume should be set relative to max volume (40 + 40). */
-  EXPECT_EQ(30, set_dB_values[0]);
-  EXPECT_EQ(30, set_dB_values[1]);
-
-  ResetStubData();
-  snd_mixer_selem_set_playback_dB_all_values = set_dB_values;
-  snd_mixer_selem_set_playback_dB_all_values_length = ARRAY_SIZE(set_dB_values);
-  snd_mixer_selem_get_playback_dB_range_min_values = min_volumes;
-  snd_mixer_selem_get_playback_dB_range_max_values = max_volumes;
-  snd_mixer_selem_get_playback_dB_range_values_length = ARRAY_SIZE(min_volumes);
-  snd_mixer_selem_has_playback_volume_return_values = element_playback_volume;
-  snd_mixer_selem_has_playback_volume_return_values_length =
-      ARRAY_SIZE(element_playback_volume);
-  snd_mixer_selem_has_playback_switch_return_values = element_playback_switches;
-  snd_mixer_selem_has_playback_switch_return_values_length =
-      ARRAY_SIZE(element_playback_switches);
-  snd_mixer_selem_get_name_return_values = element_names;
-  snd_mixer_selem_get_name_return_values_length = ARRAY_SIZE(element_names);
-  rc = mixer_control_create(&mixer_output, NULL,
-                            reinterpret_cast<snd_mixer_elem_t*>(3),
-                            CRAS_STREAM_OUTPUT);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(1, snd_mixer_selem_get_name_called);
-  EXPECT_EQ(1, snd_mixer_selem_has_playback_volume_called);
-  EXPECT_EQ(1, snd_mixer_selem_has_playback_switch_called);
-  EXPECT_EQ(1, snd_mixer_selem_get_playback_dB_range_called);
-
-  /* Set volume should be called for Main, PCM, and the mixer_output passed
-   * in. If Main doesn't set to anything but zero then the entire volume
-   * should be passed to the PCM control.*/
-  cras_alsa_mixer_set_dBFS(c, -50, mixer_output);
-  EXPECT_EQ(3, snd_mixer_selem_set_playback_dB_all_called);
-  EXPECT_EQ(2, snd_mixer_selem_get_playback_dB_called);
-  EXPECT_EQ(30, set_dB_values[0]);
-  EXPECT_EQ(30, set_dB_values[1]);
-  EXPECT_EQ(30, set_dB_values[2]);
-  /* Set volume should be called for Main and PCM. Since the controls were
-   * sorted, Main should get the volume remaining after PCM is set, in this
-   * case -50 - -24 = -26. */
-  long get_dB_returns2[] = {
-      -25,
-      -24,
-  };
-  snd_mixer_selem_get_playback_dB_return_values = get_dB_returns2;
-  snd_mixer_selem_get_playback_dB_return_values_length =
-      ARRAY_SIZE(get_dB_returns2);
-  snd_mixer_selem_set_playback_dB_all_called = 0;
-  snd_mixer_selem_get_playback_dB_called = 0;
-  mixer_output->has_volume = 0;
-  mixer_output->min_volume_dB = MIXER_CONTROL_VOLUME_DB_INVALID;
-  mixer_output->max_volume_dB = MIXER_CONTROL_VOLUME_DB_INVALID;
-  cras_alsa_mixer_set_dBFS(c, -50, mixer_output);
-  EXPECT_EQ(2, snd_mixer_selem_set_playback_dB_all_called);
-  EXPECT_EQ(2, snd_mixer_selem_get_playback_dB_called);
-  EXPECT_EQ(54, set_dB_values[0]);  // Main
-  EXPECT_EQ(30, set_dB_values[1]);  // PCM
-
-  cras_alsa_mixer_destroy(c);
-  EXPECT_EQ(1, snd_mixer_close_called);
-  mixer_control_destroy(mixer_output);
-}
-
-TEST(AlsaMixer, CreateTwoMainCaptureElements) {
-  struct cras_alsa_mixer* c;
-  snd_mixer_elem_t* elements[] = {
-      reinterpret_cast<snd_mixer_elem_t*>(2),
-  };
-  int element_capture_volume[] = {
-      1,
-      1,
-      1,
-  };
-  int element_capture_switches[] = {
-      1,
-      1,
-      1,
-  };
-  const char* element_names[] = {
-      "Capture",
-      "Digital Capture",
-      "Mic",
-  };
-  struct mixer_control* mixer_input;
-  int rc;
-
-  ResetStubData();
-  snd_mixer_first_elem_return_value = reinterpret_cast<snd_mixer_elem_t*>(1);
-  snd_mixer_elem_next_return_values = elements;
-  snd_mixer_elem_next_return_values_length = ARRAY_SIZE(elements);
-  snd_mixer_selem_has_capture_volume_return_values = element_capture_volume;
-  snd_mixer_selem_has_capture_volume_return_values_length =
-      ARRAY_SIZE(element_capture_volume);
-  snd_mixer_selem_has_capture_switch_return_values = element_capture_switches;
-  snd_mixer_selem_has_capture_switch_return_values_length =
-      ARRAY_SIZE(element_capture_switches);
-  snd_mixer_selem_get_name_return_values = element_names;
-  snd_mixer_selem_get_name_return_values_length = ARRAY_SIZE(element_names);
-  c = create_mixer_and_add_controls_by_name_matching("hw:0", NULL, NULL);
-  ASSERT_NE(static_cast<struct cras_alsa_mixer*>(NULL), c);
-  EXPECT_EQ(1, snd_mixer_open_called);
-  EXPECT_EQ(1, snd_mixer_attach_called);
-  EXPECT_EQ(0, strcmp(snd_mixer_attach_mixdev, "hw:0"));
-  EXPECT_EQ(1, snd_mixer_selem_register_called);
-  EXPECT_EQ(1, snd_mixer_load_called);
-  EXPECT_EQ(0, snd_mixer_close_called);
-  EXPECT_EQ(2, snd_mixer_elem_next_called);
-  EXPECT_EQ(5, snd_mixer_selem_get_name_called);
-  EXPECT_EQ(3, snd_mixer_selem_has_capture_switch_called);
-
-  /* Set mute should be called for Main only. */
-  cras_alsa_mixer_set_capture_mute(c, 0, NULL);
-  EXPECT_EQ(1, snd_mixer_selem_set_capture_switch_all_called);
-  /* Set volume should be called for Capture and Digital Capture. If Capture
-   * doesn't set to anything but zero then the entire volume should be passed to
-   * the Digital Capture control. */
-  long get_dB_returns[] = {
-      0,
-      0,
-  };
-  long set_dB_values[2];
-  snd_mixer_selem_get_capture_dB_return_values = get_dB_returns;
-  snd_mixer_selem_get_capture_dB_return_values_length =
-      ARRAY_SIZE(get_dB_returns);
-  snd_mixer_selem_set_capture_dB_all_values = set_dB_values;
-  snd_mixer_selem_set_capture_dB_all_values_length = ARRAY_SIZE(set_dB_values);
-  cras_alsa_mixer_set_capture_dBFS(c, -10, NULL);
-  EXPECT_EQ(2, snd_mixer_selem_set_capture_dB_all_called);
-  EXPECT_EQ(2, snd_mixer_selem_get_capture_dB_called);
-  EXPECT_EQ(-10, set_dB_values[0]);
-  EXPECT_EQ(-10, set_dB_values[1]);
-  /* Set volume should be called for Capture and Digital Capture. Capture should
-   * get the gain remaining after Mic Boos is set, in this case 20 - 25 = -5. */
-  long get_dB_returns2[] = {
-      25,
-      -5,
-  };
-  snd_mixer_selem_get_capture_dB_return_values = get_dB_returns2;
-  snd_mixer_selem_get_capture_dB_return_values_length =
-      ARRAY_SIZE(get_dB_returns2);
-  snd_mixer_selem_set_capture_dB_all_values = set_dB_values;
-  snd_mixer_selem_set_capture_dB_all_values_length = ARRAY_SIZE(set_dB_values);
-  snd_mixer_selem_set_capture_dB_all_called = 0;
-  snd_mixer_selem_get_capture_dB_called = 0;
-  cras_alsa_mixer_set_capture_dBFS(c, 20, NULL);
-  EXPECT_EQ(2, snd_mixer_selem_set_capture_dB_all_called);
-  EXPECT_EQ(2, snd_mixer_selem_get_capture_dB_called);
-  EXPECT_EQ(20, set_dB_values[0]);
-  EXPECT_EQ(-5, set_dB_values[1]);
-
-  /* Set volume to the two main controls plus additional specific input
-   * volume control */
-
-  long get_dB_returns3[] = {
-      0,
-      0,
-      0,
-  };
-  long set_dB_values3[3];
-
-  snd_mixer_selem_get_capture_dB_return_values = get_dB_returns3;
-  snd_mixer_selem_get_capture_dB_return_values_length =
-      ARRAY_SIZE(get_dB_returns3);
-  snd_mixer_selem_get_capture_dB_called = 0;
-  snd_mixer_selem_set_capture_dB_all_values = set_dB_values3;
-  snd_mixer_selem_set_capture_dB_all_values_length = ARRAY_SIZE(set_dB_values3);
-  snd_mixer_selem_set_capture_dB_all_called = 0;
-  snd_mixer_selem_has_capture_volume_return_values = element_capture_volume;
-  snd_mixer_selem_has_capture_volume_return_values_length =
-      ARRAY_SIZE(element_capture_volume);
-  snd_mixer_selem_has_capture_switch_return_values = element_capture_switches;
-  snd_mixer_selem_has_capture_switch_return_values_length =
-      ARRAY_SIZE(element_capture_switches);
-  snd_mixer_selem_get_name_return_values = element_names;
-  snd_mixer_selem_get_name_return_values_length = ARRAY_SIZE(element_names);
-  snd_mixer_selem_get_name_called = 0;
-  snd_mixer_selem_has_capture_volume_called = 0;
-  snd_mixer_selem_has_capture_switch_called = 0;
-  snd_mixer_selem_get_capture_dB_range_called = 0;
-  rc = mixer_control_create(&mixer_input, NULL,
-                            reinterpret_cast<snd_mixer_elem_t*>(3),
-                            CRAS_STREAM_INPUT);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(1, snd_mixer_selem_get_name_called);
-  EXPECT_EQ(1, snd_mixer_selem_has_capture_volume_called);
-  EXPECT_EQ(1, snd_mixer_selem_has_capture_switch_called);
-  EXPECT_EQ(1, snd_mixer_selem_get_capture_dB_range_called);
-  EXPECT_EQ(1, mixer_input->has_volume);
-
-  cras_alsa_mixer_set_capture_dBFS(c, 20, mixer_input);
-
-  EXPECT_EQ(3, snd_mixer_selem_set_capture_dB_all_called);
-  EXPECT_EQ(2, snd_mixer_selem_get_capture_dB_called);
-  EXPECT_EQ(20, set_dB_values3[0]);
-  EXPECT_EQ(20, set_dB_values3[1]);
-  EXPECT_EQ(20, set_dB_values3[2]);
-
-  cras_alsa_mixer_destroy(c);
-  EXPECT_EQ(1, snd_mixer_close_called);
-  mixer_control_destroy(mixer_input);
-}
-
-class AlsaMixerOutputs : public testing::Test {
- protected:
-  virtual void SetUp() {
-    output_called_values_.clear();
-    output_callback_called_ = 0;
-    static snd_mixer_elem_t* elements[] = {
-        reinterpret_cast<snd_mixer_elem_t*>(2),  // PCM
-        reinterpret_cast<snd_mixer_elem_t*>(3),  // Headphone
-        reinterpret_cast<snd_mixer_elem_t*>(4),  // Speaker
-        reinterpret_cast<snd_mixer_elem_t*>(5),  // HDMI
-        reinterpret_cast<snd_mixer_elem_t*>(6),  // IEC958
-        reinterpret_cast<snd_mixer_elem_t*>(7),  // Mic Boost
-        reinterpret_cast<snd_mixer_elem_t*>(8),  // Capture
-    };
-    static int element_playback_volume[] = {
-        1, 1, 1, 0, 0, 1, 1,
-    };
-    static int element_playback_switches[] = {
-        1, 1, 1, 0, 1, 1, 1,
-    };
-    static int element_capture_volume[] = {
-        0, 0, 0, 0, 0, 0, 1, 1,
-    };
-    static int element_capture_switches[] = {
-        0, 0, 0, 0, 0, 0, 1, 1,
-    };
-    static const long min_volumes[] = {0, 0, 0, 0, 0, 0, 500, -1250};
-    static const long max_volumes[] = {0, 0, 0, 0, 0, 0, 3000, 400};
-    static const char* element_names[] = {
-        "Master", "PCM",    "Headphone", "Speaker",
-        "HDMI",   "IEC958", "Capture",   "Digital Capture",
-    };
-    static const char* output_names_extra[] = {"IEC958"};
-    static char* iniparser_returns[] = {
-        NULL,
-    };
-    struct mixer_name* extra_controls = mixer_name_add_array(
-        NULL, output_names_extra, ARRAY_SIZE(output_names_extra),
-        CRAS_STREAM_OUTPUT, MIXER_NAME_VOLUME);
-
-    ResetStubData();
-    snd_mixer_first_elem_return_value =
-        reinterpret_cast<snd_mixer_elem_t*>(1);  // Main
-    snd_mixer_elem_next_return_values = elements;
-    snd_mixer_elem_next_return_values_length = ARRAY_SIZE(elements);
-    snd_mixer_selem_has_playback_volume_return_values = element_playback_volume;
-    snd_mixer_selem_has_playback_volume_return_values_length =
-        ARRAY_SIZE(element_playback_volume);
-    snd_mixer_selem_has_playback_switch_return_values =
-        element_playback_switches;
-    snd_mixer_selem_has_playback_switch_return_values_length =
-        ARRAY_SIZE(element_playback_switches);
-    snd_mixer_selem_has_capture_volume_return_values = element_capture_volume;
-    snd_mixer_selem_has_capture_volume_return_values_length =
-        ARRAY_SIZE(element_capture_volume);
-    snd_mixer_selem_has_capture_switch_return_values = element_capture_switches;
-    snd_mixer_selem_has_capture_switch_return_values_length =
-        ARRAY_SIZE(element_capture_switches);
-    snd_mixer_selem_get_name_return_values = element_names;
-    snd_mixer_selem_get_name_return_values_length = ARRAY_SIZE(element_names);
-    snd_mixer_selem_get_capture_dB_range_called = 0;
-    snd_mixer_selem_get_capture_dB_range_min_values = min_volumes;
-    snd_mixer_selem_get_capture_dB_range_max_values = max_volumes;
-    snd_mixer_selem_get_capture_dB_range_values_length =
-        ARRAY_SIZE(min_volumes);
-    iniparser_getstring_returns = iniparser_returns;
-    iniparser_getstring_return_length = ARRAY_SIZE(iniparser_returns);
-    cras_mixer_ = create_mixer_and_add_controls_by_name_matching(
-        "hw:0", extra_controls, NULL);
-    ASSERT_NE(static_cast<struct cras_alsa_mixer*>(NULL), cras_mixer_);
-    EXPECT_EQ(1, snd_mixer_open_called);
-    EXPECT_EQ(1, snd_mixer_attach_called);
-    EXPECT_EQ(0, strcmp(snd_mixer_attach_mixdev, "hw:0"));
-    EXPECT_EQ(1, snd_mixer_selem_register_called);
-    EXPECT_EQ(1, snd_mixer_load_called);
-    EXPECT_EQ(0, snd_mixer_close_called);
-    EXPECT_EQ(ARRAY_SIZE(elements) + 1, snd_mixer_elem_next_called);
-    EXPECT_EQ(8, snd_mixer_selem_has_playback_volume_called);
-    EXPECT_EQ(7, snd_mixer_selem_has_playback_switch_called);
-    EXPECT_EQ(4, snd_mixer_selem_has_capture_volume_called);
-    EXPECT_EQ(3, snd_mixer_selem_has_capture_switch_called);
-    mixer_name_free(extra_controls);
-  }
-
-  virtual void TearDown() {
-    cras_alsa_mixer_destroy(cras_mixer_);
-    EXPECT_EQ(1, snd_mixer_close_called);
-  }
-
-  static void OutputCallback(struct mixer_control* out, void* arg) {
-    output_callback_called_++;
-    output_called_values_.push_back(out);
-  }
-
-  struct cras_alsa_mixer* cras_mixer_;
-  static size_t output_callback_called_;
-  static std::vector<struct mixer_control*> output_called_values_;
-};
-
-size_t AlsaMixerOutputs::output_callback_called_;
-std::vector<struct mixer_control*> AlsaMixerOutputs::output_called_values_;
-
-TEST_F(AlsaMixerOutputs, CheckFourOutputs) {
-  cras_alsa_mixer_list_outputs(cras_mixer_, AlsaMixerOutputs::OutputCallback,
-                               reinterpret_cast<void*>(555));
-  EXPECT_EQ(4, output_callback_called_);
-}
-
-TEST_F(AlsaMixerOutputs, CheckFindOutputByNameNoMatch) {
-  struct mixer_control* out;
-
-  out = cras_alsa_mixer_get_output_matching_name(cras_mixer_, "AAAAA Jack");
-  EXPECT_EQ(static_cast<struct mixer_control*>(NULL), out);
-}
-
-TEST_F(AlsaMixerOutputs, CheckFindOutputByName) {
-  struct mixer_control* out;
-
-  out = cras_alsa_mixer_get_output_matching_name(cras_mixer_, "Headphone Jack");
-  EXPECT_NE(static_cast<struct mixer_control*>(NULL), out);
-}
-
-TEST_F(AlsaMixerOutputs, CheckFindOutputHDMIByName) {
-  struct mixer_control* out;
-
-  out = cras_alsa_mixer_get_output_matching_name(cras_mixer_, "HDMI Jack");
-  EXPECT_NE(static_cast<struct mixer_control*>(NULL), out);
-}
-
-TEST_F(AlsaMixerOutputs, CheckFindInputNameWorkaround) {
-  struct mixer_control* control;
-  snd_mixer_elem_t* elements[] = {
-      reinterpret_cast<snd_mixer_elem_t*>(1),  // Speaker
-      reinterpret_cast<snd_mixer_elem_t*>(2),  // Headphone
-      reinterpret_cast<snd_mixer_elem_t*>(3),  // MIC
-  };
-  const char* element_names[] = {
-      "Speaker",
-      "Headphone",
-      "MIC",
-  };
-  size_t i;
-
-  ResetStubData();
-  for (i = 0; i < ARRAY_SIZE(elements); i++)
-    snd_mixer_find_elem_map[element_names[i]] = elements[i];
-
-  snd_mixer_selem_get_name_called = 0;
-  snd_mixer_selem_get_name_return_values = element_names;
-  snd_mixer_selem_get_name_return_values_length = ARRAY_SIZE(element_names);
-  control = cras_alsa_mixer_get_input_matching_name(cras_mixer_, "MIC");
-  EXPECT_NE(static_cast<struct mixer_control*>(NULL), control);
-  /* This exercises the 'workaround' where the control is added if it was
-   * previouly missing in cras_alsa_mixer_get_input_matching_name().
-   * snd_mixer_find_selem is called once for the missing control. */
-  EXPECT_EQ(1, snd_mixer_find_selem_called);
-  EXPECT_EQ(1, snd_mixer_selem_has_capture_volume_called);
-  EXPECT_EQ(1, snd_mixer_selem_has_capture_switch_called);
-}
-
-TEST_F(AlsaMixerOutputs, ActivateDeactivate) {
-  int rc;
-
-  cras_alsa_mixer_list_outputs(cras_mixer_, AlsaMixerOutputs::OutputCallback,
-                               reinterpret_cast<void*>(555));
-  EXPECT_EQ(4, output_callback_called_);
-  EXPECT_EQ(4, output_called_values_.size());
-
-  rc = cras_alsa_mixer_set_output_active_state(output_called_values_[0], 0);
-  ASSERT_EQ(0, rc);
-  EXPECT_EQ(1, snd_mixer_selem_set_playback_switch_all_called);
-  cras_alsa_mixer_set_output_active_state(output_called_values_[0], 1);
-  EXPECT_EQ(2, snd_mixer_selem_set_playback_switch_all_called);
-}
-
-TEST_F(AlsaMixerOutputs, MinMaxCaptureGain) {
-  long min, max;
-  min = cras_alsa_mixer_get_minimum_capture_gain(cras_mixer_, NULL);
-  EXPECT_EQ(-750, min);
-  max = cras_alsa_mixer_get_maximum_capture_gain(cras_mixer_, NULL);
-  EXPECT_EQ(3400, max);
-}
-
-TEST_F(AlsaMixerOutputs, MinMaxCaptureGainWithActiveInput) {
-  struct mixer_control* mixer_input;
-  long min, max;
-
-  mixer_input = (struct mixer_control*)calloc(1, sizeof(*mixer_input));
-  mixer_input->min_volume_dB = 50;
-  mixer_input->max_volume_dB = 60;
-  mixer_input->has_volume = 1;
-  min = cras_alsa_mixer_get_minimum_capture_gain(cras_mixer_, mixer_input);
-  max = cras_alsa_mixer_get_maximum_capture_gain(cras_mixer_, mixer_input);
-  EXPECT_EQ(-700, min);
-  EXPECT_EQ(3460, max);
-
-  free((void*)mixer_input);
-}
-
-TEST(AlsaMixer, CreateWithCoupledOutputControls) {
-  struct cras_alsa_mixer* c;
-  struct mixer_control* output_control;
-  struct mixer_control_element *c1, *c2, *c3, *c4;
-
-  static const long min_volumes[] = {-70, -70};
-  static const long max_volumes[] = {30, 30};
-
-  long set_dB_values[2];
-
-  const char* coupled_output_names[] = {"Left Master", "Right Master",
-                                        "Left Speaker", "Right Speaker"};
-  struct mixer_name* coupled_controls = mixer_name_add_array(
-      NULL, coupled_output_names, ARRAY_SIZE(coupled_output_names),
-      CRAS_STREAM_OUTPUT, MIXER_NAME_VOLUME);
-  int element_playback_volume[] = {1, 1, 0, 0};
-  int element_playback_switches[] = {0, 0, 1, 1};
-
-  long target_dBFS = -30;
-  long expected_dB_value = target_dBFS + max_volumes[0];
-
-  ResetStubData();
-
-  snd_mixer_find_elem_map[std::string("Left Master")] =
-      reinterpret_cast<snd_mixer_elem_t*>(1);
-  snd_mixer_find_elem_map[std::string("Right Master")] =
-      reinterpret_cast<snd_mixer_elem_t*>(2);
-  snd_mixer_find_elem_map[std::string("Left Speaker")] =
-      reinterpret_cast<snd_mixer_elem_t*>(3);
-  snd_mixer_find_elem_map[std::string("Right Speaker")] =
-      reinterpret_cast<snd_mixer_elem_t*>(4);
-
-  snd_mixer_selem_has_playback_volume_return_values = element_playback_volume;
-  snd_mixer_selem_has_playback_volume_return_values_length =
-      ARRAY_SIZE(element_playback_volume);
-  snd_mixer_selem_has_playback_switch_return_values = element_playback_switches;
-  snd_mixer_selem_has_playback_switch_return_values_length =
-      ARRAY_SIZE(element_playback_switches);
-
-  snd_mixer_selem_get_playback_dB_range_min_values = min_volumes;
-  snd_mixer_selem_get_playback_dB_range_max_values = max_volumes;
-  snd_mixer_selem_get_playback_dB_range_values_length = ARRAY_SIZE(min_volumes);
-
-  c = create_mixer_and_add_controls_by_name_matching("hw:0", NULL,
-                                                     coupled_controls);
-
-  ASSERT_NE(static_cast<struct cras_alsa_mixer*>(NULL), c);
-  EXPECT_EQ(1, snd_mixer_open_called);
-  EXPECT_EQ(1, snd_mixer_attach_called);
-  EXPECT_EQ(0, strcmp(snd_mixer_attach_mixdev, "hw:0"));
-  EXPECT_EQ(1, snd_mixer_selem_register_called);
-  EXPECT_EQ(1, snd_mixer_load_called);
-  EXPECT_EQ(0, snd_mixer_close_called);
-
-  output_control = c->output_controls;
-  EXPECT_EQ(NULL, output_control->next);
-  c1 = output_control->elements;
-  c2 = c1->next;
-  c3 = c2->next;
-  c4 = c3->next;
-  EXPECT_EQ(c1->elem, reinterpret_cast<snd_mixer_elem_t*>(1));
-  EXPECT_EQ(c2->elem, reinterpret_cast<snd_mixer_elem_t*>(2));
-  EXPECT_EQ(c3->elem, reinterpret_cast<snd_mixer_elem_t*>(3));
-  EXPECT_EQ(c4->elem, reinterpret_cast<snd_mixer_elem_t*>(4));
-  EXPECT_EQ(c4->next, reinterpret_cast<mixer_control_element*>(NULL));
-  EXPECT_EQ(c1->has_volume, 1);
-  EXPECT_EQ(c1->has_mute, 0);
-  EXPECT_EQ(c2->has_volume, 1);
-  EXPECT_EQ(c2->has_mute, 0);
-  EXPECT_EQ(c3->has_volume, 0);
-  EXPECT_EQ(c3->has_mute, 1);
-  EXPECT_EQ(c4->has_volume, 0);
-  EXPECT_EQ(c4->has_mute, 1);
-  EXPECT_EQ(output_control->max_volume_dB, max_volumes[0]);
-  EXPECT_EQ(output_control->min_volume_dB, min_volumes[0]);
-
-  snd_mixer_selem_set_playback_dB_all_values = set_dB_values;
-  snd_mixer_selem_set_playback_dB_all_values_length = ARRAY_SIZE(set_dB_values);
-
-  cras_alsa_mixer_set_dBFS(c, target_dBFS, output_control);
-
-  /* Set volume should set playback dB on two of the coupled controls. */
-  EXPECT_EQ(2, snd_mixer_selem_set_playback_dB_all_called);
-  EXPECT_EQ(set_dB_values[0], expected_dB_value);
-  EXPECT_EQ(set_dB_values[1], expected_dB_value);
-
-  /* Mute should set playback switch on two of the coupled controls. */
-  cras_alsa_mixer_set_mute(c, 1, output_control);
-  EXPECT_EQ(2, snd_mixer_selem_set_playback_switch_all_called);
-  EXPECT_EQ(0, snd_mixer_selem_set_playback_switch_all_value);
-
-  /* Unmute should set playback switch on two of the coupled controls. */
-  cras_alsa_mixer_set_mute(c, 0, output_control);
-  EXPECT_EQ(4, snd_mixer_selem_set_playback_switch_all_called);
-  EXPECT_EQ(1, snd_mixer_selem_set_playback_switch_all_value);
-
-  EXPECT_EQ(max_volumes[0] - min_volumes[0],
-            cras_alsa_mixer_get_output_dB_range(output_control));
-
-  cras_alsa_mixer_destroy(c);
-  EXPECT_EQ(1, snd_mixer_close_called);
-  mixer_name_free(coupled_controls);
-}
-
-TEST(AlsaMixer, CoupledOutputHasMuteNoVolume) {
-  struct cras_alsa_mixer* c;
-  struct mixer_control* output_control;
-  struct mixer_control_element *c1, *c2, *c3, *c4;
-
-  static const long min_volumes[] = {-70};
-  static const long max_volumes[] = {30};
-
-  const char* coupled_output_names[] = {"Left Master", "Right Master",
-                                        "Left Speaker", "Right Speaker"};
-  struct mixer_name* coupled_controls = mixer_name_add_array(
-      NULL, coupled_output_names, ARRAY_SIZE(coupled_output_names),
-      CRAS_STREAM_OUTPUT, MIXER_NAME_VOLUME);
-  int element_playback_volume[] = {0, 0, 0, 0};
-  int element_playback_switches[] = {0, 0, 1, 1};
-
-  ResetStubData();
-
-  snd_mixer_find_elem_map[std::string("Left Master")] =
-      reinterpret_cast<snd_mixer_elem_t*>(1);
-  snd_mixer_find_elem_map[std::string("Right Master")] =
-      reinterpret_cast<snd_mixer_elem_t*>(2);
-  snd_mixer_find_elem_map[std::string("Left Speaker")] =
-      reinterpret_cast<snd_mixer_elem_t*>(3);
-  snd_mixer_find_elem_map[std::string("Right Speaker")] =
-      reinterpret_cast<snd_mixer_elem_t*>(4);
-
-  snd_mixer_selem_has_playback_volume_return_values = element_playback_volume;
-  snd_mixer_selem_has_playback_volume_return_values_length =
-      ARRAY_SIZE(element_playback_volume);
-  snd_mixer_selem_has_playback_switch_return_values = element_playback_switches;
-  snd_mixer_selem_has_playback_switch_return_values_length =
-      ARRAY_SIZE(element_playback_switches);
-
-  snd_mixer_selem_get_playback_dB_range_min_values = min_volumes;
-  snd_mixer_selem_get_playback_dB_range_max_values = max_volumes;
-  snd_mixer_selem_get_playback_dB_range_values_length = ARRAY_SIZE(min_volumes);
-
-  c = create_mixer_and_add_controls_by_name_matching("hw:0", NULL,
-                                                     coupled_controls);
-
-  ASSERT_NE(static_cast<struct cras_alsa_mixer*>(NULL), c);
-  EXPECT_EQ(1, snd_mixer_open_called);
-  EXPECT_EQ(1, snd_mixer_attach_called);
-  EXPECT_EQ(0, strcmp(snd_mixer_attach_mixdev, "hw:0"));
-  EXPECT_EQ(1, snd_mixer_selem_register_called);
-  EXPECT_EQ(1, snd_mixer_load_called);
-  EXPECT_EQ(0, snd_mixer_close_called);
-
-  output_control = c->output_controls;
-  EXPECT_EQ(NULL, output_control->next);
-  c1 = output_control->elements;
-  c2 = c1->next;
-  c3 = c2->next;
-  c4 = c3->next;
-  EXPECT_EQ(c1->elem, reinterpret_cast<snd_mixer_elem_t*>(1));
-  EXPECT_EQ(c2->elem, reinterpret_cast<snd_mixer_elem_t*>(2));
-  EXPECT_EQ(c3->elem, reinterpret_cast<snd_mixer_elem_t*>(3));
-  EXPECT_EQ(c4->elem, reinterpret_cast<snd_mixer_elem_t*>(4));
-  EXPECT_EQ(c4->next, reinterpret_cast<mixer_control_element*>(NULL));
-  EXPECT_EQ(c1->has_volume, 0);
-  EXPECT_EQ(c1->has_mute, 0);
-  EXPECT_EQ(c2->has_volume, 0);
-  EXPECT_EQ(c2->has_mute, 0);
-  EXPECT_EQ(c3->has_volume, 0);
-  EXPECT_EQ(c3->has_mute, 1);
-  EXPECT_EQ(c4->has_volume, 0);
-  EXPECT_EQ(c4->has_mute, 1);
-
-  EXPECT_EQ(0, cras_alsa_mixer_has_volume(output_control));
-  EXPECT_EQ(1, output_control->has_mute);
-
-  cras_alsa_mixer_destroy(c);
-  EXPECT_EQ(1, snd_mixer_close_called);
-  mixer_name_free(coupled_controls);
-}
-
-TEST(AlsaMixer, CoupledOutputHasVolumeNoMute) {
-  struct cras_alsa_mixer* c;
-  struct mixer_control* output_control;
-  struct mixer_control_element *c1, *c2, *c3, *c4;
-
-  static const long min_volumes[] = {-70, -70};
-  static const long max_volumes[] = {30, 30};
-
-  const char* coupled_output_names[] = {"Left Master", "Right Master",
-                                        "Left Speaker", "Right Speaker"};
-  struct mixer_name* coupled_controls = mixer_name_add_array(
-      NULL, coupled_output_names, ARRAY_SIZE(coupled_output_names),
-      CRAS_STREAM_OUTPUT, MIXER_NAME_VOLUME);
-  int element_playback_volume[] = {1, 1, 0, 0};
-  int element_playback_switches[] = {0, 0, 0, 0};
-
-  ResetStubData();
-
-  snd_mixer_find_elem_map[std::string("Left Master")] =
-      reinterpret_cast<snd_mixer_elem_t*>(1);
-  snd_mixer_find_elem_map[std::string("Right Master")] =
-      reinterpret_cast<snd_mixer_elem_t*>(2);
-  snd_mixer_find_elem_map[std::string("Left Speaker")] =
-      reinterpret_cast<snd_mixer_elem_t*>(3);
-  snd_mixer_find_elem_map[std::string("Right Speaker")] =
-      reinterpret_cast<snd_mixer_elem_t*>(4);
-
-  snd_mixer_selem_has_playback_volume_return_values = element_playback_volume;
-  snd_mixer_selem_has_playback_volume_return_values_length =
-      ARRAY_SIZE(element_playback_volume);
-  snd_mixer_selem_has_playback_switch_return_values = element_playback_switches;
-  snd_mixer_selem_has_playback_switch_return_values_length =
-      ARRAY_SIZE(element_playback_switches);
-
-  snd_mixer_selem_get_playback_dB_range_min_values = min_volumes;
-  snd_mixer_selem_get_playback_dB_range_max_values = max_volumes;
-  snd_mixer_selem_get_playback_dB_range_values_length = ARRAY_SIZE(min_volumes);
-
-  c = create_mixer_and_add_controls_by_name_matching("hw:0", NULL,
-                                                     coupled_controls);
-
-  ASSERT_NE(static_cast<struct cras_alsa_mixer*>(NULL), c);
-  EXPECT_EQ(1, snd_mixer_open_called);
-  EXPECT_EQ(1, snd_mixer_attach_called);
-  EXPECT_EQ(0, strcmp(snd_mixer_attach_mixdev, "hw:0"));
-  EXPECT_EQ(1, snd_mixer_selem_register_called);
-  EXPECT_EQ(1, snd_mixer_load_called);
-  EXPECT_EQ(0, snd_mixer_close_called);
-
-  output_control = c->output_controls;
-  EXPECT_EQ(NULL, output_control->next);
-  c1 = output_control->elements;
-  c2 = c1->next;
-  c3 = c2->next;
-  c4 = c3->next;
-  EXPECT_EQ(c1->elem, reinterpret_cast<snd_mixer_elem_t*>(1));
-  EXPECT_EQ(c2->elem, reinterpret_cast<snd_mixer_elem_t*>(2));
-  EXPECT_EQ(c3->elem, reinterpret_cast<snd_mixer_elem_t*>(3));
-  EXPECT_EQ(c4->elem, reinterpret_cast<snd_mixer_elem_t*>(4));
-  EXPECT_EQ(c4->next, reinterpret_cast<mixer_control_element*>(NULL));
-  EXPECT_EQ(c1->has_volume, 1);
-  EXPECT_EQ(c1->has_mute, 0);
-  EXPECT_EQ(c2->has_volume, 1);
-  EXPECT_EQ(c2->has_mute, 0);
-  EXPECT_EQ(c3->has_volume, 0);
-  EXPECT_EQ(c3->has_mute, 0);
-  EXPECT_EQ(c4->has_volume, 0);
-  EXPECT_EQ(c4->has_mute, 0);
-
-  EXPECT_EQ(1, cras_alsa_mixer_has_volume(output_control));
-  EXPECT_EQ(0, output_control->has_mute);
-
-  cras_alsa_mixer_destroy(c);
-  EXPECT_EQ(1, snd_mixer_close_called);
-  mixer_name_free(coupled_controls);
-}
-
-TEST(AlsaMixer, MixerName) {
-  struct mixer_name* names;
-  struct mixer_name* control;
-  size_t mixer_name_count;
-  static const char* element_names[] = {
-      "Master", "PCM", "Headphone", "Speaker", "HDMI", "IEC958",
-  };
-
-  names = mixer_name_add_array(NULL, element_names, ARRAY_SIZE(element_names),
-                               CRAS_STREAM_OUTPUT, MIXER_NAME_VOLUME);
-  names =
-      mixer_name_add(names, "Playback", CRAS_STREAM_OUTPUT, MIXER_NAME_VOLUME);
-  names =
-      mixer_name_add(names, "Main", CRAS_STREAM_OUTPUT, MIXER_NAME_MAIN_VOLUME);
-  names = mixer_name_add(names, "Mic", CRAS_STREAM_INPUT, MIXER_NAME_VOLUME);
-  names = mixer_name_add(names, "Capture", CRAS_STREAM_INPUT,
-                         MIXER_NAME_MAIN_VOLUME);
-
-  /* Number of items (test mixer_name_add(_array)). */
-  mixer_name_count = 0;
-  DL_FOREACH (names, control) { mixer_name_count++; }
-  EXPECT_EQ(10, mixer_name_count);
-
-  /* Item not in the list: mismatch direction. */
-  control =
-      mixer_name_find(names, "Main", CRAS_STREAM_INPUT, MIXER_NAME_UNDEFINED);
-  EXPECT_EQ(1, control == NULL);
-
-  /* Item not in the list: mismatch type. */
-  control =
-      mixer_name_find(names, "Main", CRAS_STREAM_OUTPUT, MIXER_NAME_VOLUME);
-  EXPECT_EQ(1, control == NULL);
-
-  /* Find by name and direction. */
-  control =
-      mixer_name_find(names, "Main", CRAS_STREAM_OUTPUT, MIXER_NAME_UNDEFINED);
-  EXPECT_EQ(0, strcmp("Main", control->name));
-
-  /* Find by type and direction. */
-  control = mixer_name_find(names, NULL, CRAS_STREAM_INPUT, MIXER_NAME_VOLUME);
-  EXPECT_EQ(0, strcmp("Mic", control->name));
-
-  mixer_name_free(names);
-}
-
-class AlsaMixerFullySpeced : public testing::Test {
- protected:
-  virtual void SetUp() {
-    callback_values_.clear();
-    callback_called_ = 0;
-    static snd_mixer_elem_t* elements[] = {
-        reinterpret_cast<snd_mixer_elem_t*>(1),  // HP-L
-        reinterpret_cast<snd_mixer_elem_t*>(2),  // HP-R
-        reinterpret_cast<snd_mixer_elem_t*>(3),  // SPK-L
-        reinterpret_cast<snd_mixer_elem_t*>(4),  // SPK-R
-        reinterpret_cast<snd_mixer_elem_t*>(5),  // HDMI
-        reinterpret_cast<snd_mixer_elem_t*>(6),  // CAPTURE
-        reinterpret_cast<snd_mixer_elem_t*>(7),  // MIC-L
-        reinterpret_cast<snd_mixer_elem_t*>(8),  // MIC-R
-        reinterpret_cast<snd_mixer_elem_t*>(0),  // Unknown
-    };
-    static int element_playback_volume[] = {
-        1, 1, 1, 1, 1, 0, 0, 0,
-    };
-    static int element_playback_switches[] = {
-        0, 0, 0, 0, 1, 0, 0, 0,
-    };
-    static int element_capture_volume[] = {
-        0, 0, 0, 0, 0, 0, 1, 1,
-    };
-    static int element_capture_switches[] = {
-        0, 0, 0, 0, 0, 1, 0, 0,
-    };
-    static const long min_volumes[] = {-84, -84, -84, -84, -84, 0, 0, 0};
-    static const long max_volumes[] = {0, 0, 0, 0, 0, 0, 84, 84};
-    static const char* element_names[] = {"HP-L",  "HP-R",  "SPK-L",
-                                          "SPK-R", "HDMI",  "CAPTURE",
-                                          "MIC-L", "MIC-R", "Unknown"};
-    struct ucm_section* sections = NULL;
-    struct ucm_section* section;
-    size_t i;
-
-    ResetStubData();
-
-    for (i = 0; i < ARRAY_SIZE(elements); i++)
-      snd_mixer_find_elem_map[element_names[i]] = elements[i];
-
-    section = ucm_section_create("NullElement", "hw:0,1", 0, -1,
-                                 CRAS_STREAM_OUTPUT, NULL, NULL);
-    ucm_section_set_mixer_name(section, "Unknown");
-    DL_APPEND(sections, section);
-    section =
-        ucm_section_create("Headphone", "hw:0,1", 0, -1, CRAS_STREAM_OUTPUT,
-                           "my-sound-card Headset Jack", "gpio");
-    ucm_section_add_coupled(section, "HP-L", MIXER_NAME_VOLUME);
-    ucm_section_add_coupled(section, "HP-R", MIXER_NAME_VOLUME);
-    DL_APPEND(sections, section);
-    section = ucm_section_create("Speaker", "hw:0,1", 0, -1, CRAS_STREAM_OUTPUT,
-                                 NULL, NULL);
-    ucm_section_add_coupled(section, "SPK-L", MIXER_NAME_VOLUME);
-    ucm_section_add_coupled(section, "SPK-R", MIXER_NAME_VOLUME);
-    DL_APPEND(sections, section);
-    section = ucm_section_create("Mic", "hw:0,1", 0, -1, CRAS_STREAM_INPUT,
-                                 "my-sound-card Headset Jack", "gpio");
-    ucm_section_set_mixer_name(section, "CAPTURE");
-    DL_APPEND(sections, section);
-    section = ucm_section_create("Internal Mic", "hw:0,1", 0, -1,
-                                 CRAS_STREAM_INPUT, NULL, NULL);
-    ucm_section_add_coupled(section, "MIC-L", MIXER_NAME_VOLUME);
-    ucm_section_add_coupled(section, "MIC-R", MIXER_NAME_VOLUME);
-    DL_APPEND(sections, section);
-    section = ucm_section_create("HDMI", "hw:0,1", 0, -1, CRAS_STREAM_OUTPUT,
-                                 NULL, NULL);
-    ucm_section_set_mixer_name(section, "HDMI");
-    DL_APPEND(sections, section);
-    ASSERT_NE(sections, (struct ucm_section*)NULL);
-
-    snd_mixer_selem_has_playback_volume_return_values = element_playback_volume;
-    snd_mixer_selem_has_playback_volume_return_values_length =
-        ARRAY_SIZE(element_playback_volume);
-    snd_mixer_selem_has_playback_switch_return_values =
-        element_playback_switches;
-    snd_mixer_selem_has_playback_switch_return_values_length =
-        ARRAY_SIZE(element_playback_switches);
-    snd_mixer_selem_has_capture_volume_return_values = element_capture_volume;
-    snd_mixer_selem_has_capture_volume_return_values_length =
-        ARRAY_SIZE(element_capture_volume);
-    snd_mixer_selem_has_capture_switch_return_values = element_capture_switches;
-    snd_mixer_selem_has_capture_switch_return_values_length =
-        ARRAY_SIZE(element_capture_switches);
-    snd_mixer_selem_get_name_return_values = element_names;
-    snd_mixer_selem_get_name_return_values_length = ARRAY_SIZE(element_names);
-    snd_mixer_selem_get_capture_dB_range_min_values = min_volumes;
-    snd_mixer_selem_get_capture_dB_range_max_values = max_volumes;
-    snd_mixer_selem_get_capture_dB_range_values_length =
-        ARRAY_SIZE(min_volumes);
-
-    cras_mixer_ = cras_alsa_mixer_create("hw:0");
-    ASSERT_NE(static_cast<struct cras_alsa_mixer*>(NULL), cras_mixer_);
-    EXPECT_EQ(1, snd_mixer_open_called);
-    EXPECT_EQ(1, snd_mixer_attach_called);
-    EXPECT_EQ(0, strcmp(snd_mixer_attach_mixdev, "hw:0"));
-    EXPECT_EQ(1, snd_mixer_selem_register_called);
-    EXPECT_EQ(1, snd_mixer_load_called);
-    EXPECT_EQ(0, snd_mixer_close_called);
-
-    section = sections;
-    EXPECT_EQ(-ENOENT,
-              cras_alsa_mixer_add_controls_in_section(cras_mixer_, section));
-    ASSERT_NE((struct ucm_section*)NULL, section->next);
-    section = section->next;
-    EXPECT_EQ(0, cras_alsa_mixer_add_controls_in_section(cras_mixer_, section));
-    ASSERT_NE((struct ucm_section*)NULL, section->next);
-    section = section->next;
-    EXPECT_EQ(0, cras_alsa_mixer_add_controls_in_section(cras_mixer_, section));
-    ASSERT_NE((struct ucm_section*)NULL, section->next);
-    section = section->next;
-    EXPECT_EQ(0, cras_alsa_mixer_add_controls_in_section(cras_mixer_, section));
-    ASSERT_NE((struct ucm_section*)NULL, section->next);
-    section = section->next;
-    EXPECT_EQ(0, cras_alsa_mixer_add_controls_in_section(cras_mixer_, section));
-    ASSERT_NE((struct ucm_section*)NULL, section->next);
-    section = section->next;
-    EXPECT_EQ(0, cras_alsa_mixer_add_controls_in_section(cras_mixer_, section));
-    EXPECT_EQ(section->next, (struct ucm_section*)NULL);
-
-    EXPECT_EQ(9, snd_mixer_find_selem_called);
-    EXPECT_EQ(5, snd_mixer_selem_has_playback_volume_called);
-    EXPECT_EQ(5, snd_mixer_selem_has_playback_switch_called);
-    EXPECT_EQ(3, snd_mixer_selem_has_capture_volume_called);
-    EXPECT_EQ(3, snd_mixer_selem_has_capture_switch_called);
-    EXPECT_EQ(5, snd_mixer_selem_get_playback_dB_range_called);
-    EXPECT_EQ(2, snd_mixer_selem_get_capture_dB_range_called);
-
-    sections_ = sections;
-  }
-
-  virtual void TearDown() {
-    ucm_section_free_list(sections_);
-    cras_alsa_mixer_destroy(cras_mixer_);
-    EXPECT_EQ(1, snd_mixer_close_called);
-  }
-
-  static void Callback(struct mixer_control* control, void* arg) {
-    callback_called_++;
-    callback_values_.push_back(control);
-  }
-
-  struct cras_alsa_mixer* cras_mixer_;
-  static size_t callback_called_;
-  static std::vector<struct mixer_control*> callback_values_;
-  struct ucm_section* sections_;
-};
-
-size_t AlsaMixerFullySpeced::callback_called_;
-std::vector<struct mixer_control*> AlsaMixerFullySpeced::callback_values_;
-
-TEST_F(AlsaMixerFullySpeced, CheckControlCounts) {
-  cras_alsa_mixer_list_outputs(cras_mixer_, AlsaMixerFullySpeced::Callback,
-                               reinterpret_cast<void*>(555));
-  EXPECT_EQ(3, callback_called_);
-  callback_called_ = 0;
-  cras_alsa_mixer_list_inputs(cras_mixer_, AlsaMixerFullySpeced::Callback,
-                              reinterpret_cast<void*>(555));
-  EXPECT_EQ(2, callback_called_);
-}
-
-TEST_F(AlsaMixerFullySpeced, CheckFindOutputByNameNoMatch) {
-  struct mixer_control* out;
-
-  out = cras_alsa_mixer_get_output_matching_name(cras_mixer_, "AAAAA Jack");
-  EXPECT_EQ(static_cast<struct mixer_control*>(NULL), out);
-}
-
-TEST_F(AlsaMixerFullySpeced, CheckFindOutputByName) {
-  struct mixer_control* out;
-
-  out = cras_alsa_mixer_get_output_matching_name(cras_mixer_, "Headphone Jack");
-  EXPECT_NE(static_cast<struct mixer_control*>(NULL), out);
-}
-
-TEST_F(AlsaMixerFullySpeced, CheckFindControlForSection) {
-  struct mixer_control* control;
-  struct ucm_section* section = sections_;
-
-  // Look for the control for the Headphone section.
-  // We've already asserted that section != NULL above.
-  // Matching the control created by CoupledMixers.
-  section = section->next;
-  control = cras_alsa_mixer_get_control_for_section(cras_mixer_, section);
-  ASSERT_NE(static_cast<struct mixer_control*>(NULL), control);
-  EXPECT_EQ(0, strcmp(control->name, "Headphone"));
-
-  // Look for the control for the Mic section.
-  // Matching the control created by MixerName.
-  section = section->next->next;
-  control = cras_alsa_mixer_get_control_for_section(cras_mixer_, section);
-  ASSERT_NE(static_cast<struct mixer_control*>(NULL), control);
-  EXPECT_EQ(0, strcmp(control->name, "CAPTURE"));
-}
-
-/* Stubs */
-
-extern "C" {
-int snd_mixer_open(snd_mixer_t** mixer, int mode) {
-  snd_mixer_open_called++;
-  *mixer = reinterpret_cast<snd_mixer_t*>(2);
-  return snd_mixer_open_return_value;
-}
-int snd_mixer_attach(snd_mixer_t* mixer, const char* name) {
-  snd_mixer_attach_called++;
-  snd_mixer_attach_mixdev = name;
-  return snd_mixer_attach_return_value;
-}
-int snd_mixer_selem_register(snd_mixer_t* mixer,
-                             struct snd_mixer_selem_regopt* options,
-                             snd_mixer_class_t** classp) {
-  snd_mixer_selem_register_called++;
-  return snd_mixer_selem_register_return_value;
-}
-int snd_mixer_load(snd_mixer_t* mixer) {
-  snd_mixer_load_called++;
-  return snd_mixer_load_return_value;
-}
-const char* snd_mixer_selem_get_name(snd_mixer_elem_t* elem) {
-  int index = reinterpret_cast<size_t>(elem) - 1;
-  snd_mixer_selem_get_name_called++;
-  if (index >= snd_mixer_selem_get_name_return_values_length)
-    return static_cast<char*>(NULL);
-
-  return snd_mixer_selem_get_name_return_values[index];
-}
-unsigned int snd_mixer_selem_get_index(snd_mixer_elem_t* elem) {
-  return 0;
-}
-int snd_mixer_selem_has_playback_volume(snd_mixer_elem_t* elem) {
-  int index = reinterpret_cast<size_t>(elem) - 1;
-  snd_mixer_selem_has_playback_volume_called++;
-  if (index >= snd_mixer_selem_has_playback_volume_return_values_length)
-    return -1;
-
-  return snd_mixer_selem_has_playback_volume_return_values[index];
-}
-int snd_mixer_selem_has_playback_switch(snd_mixer_elem_t* elem) {
-  int index = reinterpret_cast<size_t>(elem) - 1;
-  snd_mixer_selem_has_playback_switch_called++;
-  if (index >= snd_mixer_selem_has_playback_switch_return_values_length)
-    return -1;
-
-  return snd_mixer_selem_has_playback_switch_return_values[index];
-}
-int snd_mixer_selem_has_capture_volume(snd_mixer_elem_t* elem) {
-  int index = reinterpret_cast<size_t>(elem) - 1;
-  snd_mixer_selem_has_capture_volume_called++;
-  if (index >= snd_mixer_selem_has_capture_volume_return_values_length)
-    return -1;
-
-  return snd_mixer_selem_has_capture_volume_return_values[index];
-}
-int snd_mixer_selem_has_capture_switch(snd_mixer_elem_t* elem) {
-  int index = reinterpret_cast<size_t>(elem) - 1;
-  snd_mixer_selem_has_capture_switch_called++;
-  if (index >= snd_mixer_selem_has_capture_switch_return_values_length)
-    return -1;
-
-  return snd_mixer_selem_has_capture_switch_return_values[index];
-}
-snd_mixer_elem_t* snd_mixer_first_elem(snd_mixer_t* mixer) {
-  snd_mixer_first_elem_called++;
-  return snd_mixer_first_elem_return_value;
-}
-snd_mixer_elem_t* snd_mixer_elem_next(snd_mixer_elem_t* elem) {
-  snd_mixer_elem_next_called++;
-  if (snd_mixer_elem_next_return_values_index >=
-      snd_mixer_elem_next_return_values_length)
-    return static_cast<snd_mixer_elem_t*>(NULL);
-
-  return snd_mixer_elem_next_return_values
-      [snd_mixer_elem_next_return_values_index++];
-}
-int snd_mixer_close(snd_mixer_t* mixer) {
-  snd_mixer_close_called++;
-  return 0;
-}
-int snd_mixer_selem_set_playback_dB_all(snd_mixer_elem_t* elem,
-                                        long value,
-                                        int dir) {
-  int index = reinterpret_cast<size_t>(elem) - 1;
-  snd_mixer_selem_set_playback_dB_all_called++;
-  if (index < snd_mixer_selem_set_playback_dB_all_values_length)
-    snd_mixer_selem_set_playback_dB_all_values[index] = value;
-  return 0;
-}
-int snd_mixer_selem_get_playback_dB(snd_mixer_elem_t* elem,
-                                    snd_mixer_selem_channel_id_t channel,
-                                    long* value) {
-  int index = reinterpret_cast<size_t>(elem) - 1;
-  snd_mixer_selem_get_playback_dB_called++;
-  if (index >= snd_mixer_selem_get_playback_dB_return_values_length)
-    *value = 0;
-  else
-    *value = snd_mixer_selem_get_playback_dB_return_values[index];
-  return 0;
-}
-int snd_mixer_selem_set_playback_switch_all(snd_mixer_elem_t* elem, int value) {
-  snd_mixer_selem_set_playback_switch_all_called++;
-  snd_mixer_selem_set_playback_switch_all_value = value;
-  return 0;
-}
-int snd_mixer_selem_set_capture_dB_all(snd_mixer_elem_t* elem,
-                                       long value,
-                                       int dir) {
-  int index = reinterpret_cast<size_t>(elem) - 1;
-  snd_mixer_selem_set_capture_dB_all_called++;
-  if (index < snd_mixer_selem_set_capture_dB_all_values_length)
-    snd_mixer_selem_set_capture_dB_all_values[index] = value;
-  return 0;
-}
-int snd_mixer_selem_get_capture_dB(snd_mixer_elem_t* elem,
-                                   snd_mixer_selem_channel_id_t channel,
-                                   long* value) {
-  int index = reinterpret_cast<size_t>(elem) - 1;
-  snd_mixer_selem_get_capture_dB_called++;
-  if (index >= snd_mixer_selem_get_capture_dB_return_values_length)
-    *value = 0;
-  else
-    *value = snd_mixer_selem_get_capture_dB_return_values[index];
-  return 0;
-}
-int snd_mixer_selem_set_capture_switch_all(snd_mixer_elem_t* elem, int value) {
-  snd_mixer_selem_set_capture_switch_all_called++;
-  snd_mixer_selem_set_capture_switch_all_value = value;
-  return 0;
-}
-int snd_mixer_selem_get_capture_dB_range(snd_mixer_elem_t* elem,
-                                         long* min,
-                                         long* max) {
-  size_t index = reinterpret_cast<size_t>(elem) - 1;
-  snd_mixer_selem_get_capture_dB_range_called++;
-  if (index >= snd_mixer_selem_get_capture_dB_range_values_length) {
-    *min = 0;
-    *max = 0;
-  } else {
-    *min = snd_mixer_selem_get_capture_dB_range_min_values[index];
-    *max = snd_mixer_selem_get_capture_dB_range_max_values[index];
-  }
-  return 0;
-}
-int snd_mixer_selem_get_playback_dB_range(snd_mixer_elem_t* elem,
-                                          long* min,
-                                          long* max) {
-  size_t index = reinterpret_cast<size_t>(elem) - 1;
-  snd_mixer_selem_get_playback_dB_range_called++;
-  if (index >= snd_mixer_selem_get_playback_dB_range_values_length) {
-    *min = 0;
-    *max = 0;
-  } else {
-    *min = snd_mixer_selem_get_playback_dB_range_min_values[index];
-    *max = snd_mixer_selem_get_playback_dB_range_max_values[index];
-  }
-  return 0;
-}
-
-snd_mixer_elem_t* snd_mixer_find_selem(snd_mixer_t* mixer,
-                                       const snd_mixer_selem_id_t* id) {
-  std::string name(snd_mixer_selem_id_get_name(id));
-  unsigned int index = snd_mixer_selem_id_get_index(id);
-  snd_mixer_find_selem_called++;
-  if (index != 0)
-    return NULL;
-  if (snd_mixer_find_elem_map.find(name) == snd_mixer_find_elem_map.end()) {
-    return NULL;
-  }
-  return snd_mixer_find_elem_map[name];
-}
-
-//  From cras_volume_curve.
-static long get_dBFS_default(const struct cras_volume_curve* curve,
-                             size_t volume) {
-  return 100 * (volume - 100);
-}
-
-struct cras_volume_curve* cras_volume_curve_create_default() {
-  struct cras_volume_curve* curve;
-  curve = (struct cras_volume_curve*)calloc(1, sizeof(*curve));
-  if (curve)
-    curve->get_dBFS = get_dBFS_default;
-  return curve;
-}
-
-void cras_volume_curve_destroy(struct cras_volume_curve* curve) {
-  cras_volume_curve_destroy_called++;
-  free(curve);
-}
-
-// From libiniparser.
-struct cras_volume_curve* cras_card_config_get_volume_curve_for_control(
-    const struct cras_card_config* card_config,
-    const char* control_name) {
-  struct cras_volume_curve* curve;
-  curve = (struct cras_volume_curve*)calloc(1, sizeof(*curve));
-  if (curve != NULL)
-    curve->get_dBFS = get_dBFS_default;
-  return curve;
-}
-
-} /* extern "C" */
-
-}  //  namespace
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  openlog(NULL, LOG_PERROR, LOG_USER);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tests/alsa_ucm_unittest.cc b/cras/src/tests/alsa_ucm_unittest.cc
deleted file mode 100644
index 1b351dd..0000000
--- a/cras/src/tests/alsa_ucm_unittest.cc
+++ /dev/null
@@ -1,1564 +0,0 @@
-// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <gtest/gtest.h>
-#include <stdio.h>
-#include <syslog.h>
-
-#include <map>
-
-extern "C" {
-#include "cras_alsa_ucm.h"
-#include "cras_types.h"
-#include "cras_util.h"
-#include "utlist.h"
-
-//  Include C file to test static functions.
-#include "cras_alsa_ucm.c"
-}
-
-namespace {
-
-static int snd_use_case_mgr_open_return;
-static snd_use_case_mgr_t* snd_use_case_mgr_open_mgr_ptr;
-static unsigned snd_use_case_mgr_open_called;
-static unsigned snd_use_case_mgr_close_called;
-static unsigned snd_use_case_get_called;
-static std::vector<std::string> snd_use_case_get_id;
-static int snd_use_case_set_return;
-static std::map<std::string, std::string> snd_use_case_get_value;
-static std::map<std::string, unsigned> snd_use_case_geti_value;
-static unsigned snd_use_case_set_called;
-static std::vector<std::pair<std::string, std::string> > snd_use_case_set_param;
-static std::map<std::string, const char**> fake_list;
-static std::map<std::string, unsigned> fake_list_size;
-static unsigned snd_use_case_free_list_called;
-static unsigned snd_use_case_geti_called;
-static std::vector<std::string> list_devices_callback_names;
-static std::vector<void*> list_devices_callback_args;
-static struct cras_use_case_mgr cras_ucm_mgr;
-static const char* avail_verbs[] = {"HiFi", "Comment for Verb1"};
-
-static void ResetStubData() {
-  snd_use_case_mgr_open_called = 0;
-  snd_use_case_mgr_open_return = 0;
-  snd_use_case_mgr_close_called = 0;
-  snd_use_case_set_return = 0;
-  snd_use_case_get_called = 0;
-  snd_use_case_set_called = 0;
-  snd_use_case_geti_called = 0;
-  snd_use_case_set_param.clear();
-  snd_use_case_free_list_called = 0;
-  snd_use_case_get_id.clear();
-  snd_use_case_get_value.clear();
-  snd_use_case_geti_value.clear();
-  fake_list.clear();
-  fake_list_size.clear();
-  fake_list["_verbs"] = avail_verbs;
-  fake_list_size["_verbs"] = 2;
-  list_devices_callback_names.clear();
-  list_devices_callback_args.clear();
-  snd_use_case_mgr_open_mgr_ptr = reinterpret_cast<snd_use_case_mgr_t*>(0x55);
-  cras_ucm_mgr.use_case = CRAS_STREAM_TYPE_DEFAULT;
-  cras_ucm_mgr.hotword_modifier = NULL;
-}
-
-static void list_devices_callback(const char* section_name, void* arg) {
-  list_devices_callback_names.push_back(std::string(section_name));
-  list_devices_callback_args.push_back(arg);
-}
-
-static void SetSectionDeviceData() {
-  static const char* sections[] = {
-      "Speaker",   "Comment for Dev1", "IntMic", "Comment for Dev2",
-      "Headphone", "Comment for Dev3", "ExtMic", "Comment for Dev4",
-      "HDMI",      "Comment for Dev5"};
-  fake_list["_devices/HiFi"] = sections;
-  fake_list_size["_devices/HiFi"] = 10;
-  std::string id_1 = "=PlaybackPCM/Speaker/HiFi";
-  std::string id_2 = "=CapturePCM/IntMic/HiFi";
-  std::string id_3 = "=PlaybackPCM/Headphone/HiFi";
-  std::string id_4 = "=CapturePCM/ExtMic/HiFi";
-  std::string id_5 = "=PlaybackPCM/HDMI/HiFi";
-  std::string value_1 = "test_card:0";
-  std::string value_2 = "test_card:0";
-  std::string value_3 = "test_card:0";
-  std::string value_4 = "test_card:0";
-  std::string value_5 = "test_card:1";
-
-  snd_use_case_get_value[id_1] = value_1;
-  snd_use_case_get_value[id_2] = value_2;
-  snd_use_case_get_value[id_3] = value_3;
-  snd_use_case_get_value[id_4] = value_4;
-  snd_use_case_get_value[id_5] = value_5;
-}
-
-TEST(AlsaUcm, CreateFailInvalidCard) {
-  ResetStubData();
-  EXPECT_EQ(NULL, ucm_create(NULL));
-  EXPECT_EQ(0, snd_use_case_mgr_open_called);
-}
-
-TEST(AlsaUcm, CreateFailCardNotFound) {
-  ResetStubData();
-  snd_use_case_mgr_open_return = -1;
-  EXPECT_EQ(NULL, ucm_create("foo"));
-  EXPECT_EQ(1, snd_use_case_mgr_open_called);
-}
-
-TEST(AlsaUcm, CreateFailNoHiFi) {
-  ResetStubData();
-  snd_use_case_set_return = -1;
-  EXPECT_EQ(NULL, ucm_create("foo"));
-  EXPECT_EQ(1, snd_use_case_mgr_open_called);
-  EXPECT_EQ(1, snd_use_case_set_called);
-  EXPECT_EQ(1, snd_use_case_mgr_close_called);
-}
-
-TEST(AlsaUcm, CreateSuccess) {
-  struct cras_use_case_mgr* mgr;
-
-  ResetStubData();
-
-  mgr = ucm_create("foo");
-  EXPECT_NE(static_cast<snd_use_case_mgr_t*>(NULL), mgr->mgr);
-  EXPECT_EQ(1, snd_use_case_mgr_open_called);
-  EXPECT_EQ(1, snd_use_case_set_called);
-  EXPECT_EQ(0, snd_use_case_mgr_close_called);
-
-  ucm_destroy(mgr);
-  EXPECT_EQ(1, snd_use_case_mgr_close_called);
-}
-
-TEST(AlsaUcm, CheckEnabledEmptyList) {
-  struct cras_use_case_mgr* mgr = &cras_ucm_mgr;
-
-  ResetStubData();
-  fake_list["_enadevs"] = NULL;
-  fake_list_size["_enadevs"] = 0;
-
-  EXPECT_EQ(0, ucm_set_enabled(mgr, "Dev1", 0));
-  EXPECT_EQ(0, snd_use_case_set_called);
-
-  EXPECT_EQ(0, ucm_set_enabled(mgr, "Dev1", 1));
-  EXPECT_EQ(1, snd_use_case_set_called);
-
-  EXPECT_EQ(0, snd_use_case_free_list_called);
-}
-
-TEST(AlsaUcm, CheckEnabledAlready) {
-  struct cras_use_case_mgr* mgr = &cras_ucm_mgr;
-  const char* enabled[] = {"Dev2", "Dev1"};
-
-  ResetStubData();
-
-  fake_list["_enadevs"] = enabled;
-  fake_list_size["_enadevs"] = 2;
-
-  EXPECT_EQ(0, ucm_set_enabled(mgr, "Dev1", 1));
-  EXPECT_EQ(0, snd_use_case_set_called);
-
-  EXPECT_EQ(0, ucm_set_enabled(mgr, "Dev1", 0));
-  EXPECT_EQ(1, snd_use_case_set_called);
-
-  EXPECT_EQ(2, snd_use_case_free_list_called);
-}
-
-TEST(AlsaUcm, GetEdidForDev) {
-  struct cras_use_case_mgr* mgr = &cras_ucm_mgr;
-  std::string id = "=EDIDFile/Dev1/HiFi";
-  std::string value = "EdidFileName";
-  const char* file_name;
-
-  ResetStubData();
-
-  snd_use_case_get_value[id] = value;
-
-  file_name = ucm_get_edid_file_for_dev(mgr, "Dev1");
-  ASSERT_TRUE(file_name);
-  EXPECT_EQ(0, strcmp(file_name, value.c_str()));
-  free((void*)file_name);
-
-  ASSERT_EQ(1, snd_use_case_get_called);
-  EXPECT_EQ(snd_use_case_get_id[0], id);
-}
-
-TEST(AlsaUcm, GetCapControlForDev) {
-  struct cras_use_case_mgr* mgr = &cras_ucm_mgr;
-  char* cap_control;
-  std::string id = "=CaptureControl/Dev1/HiFi";
-  std::string value = "MIC";
-
-  ResetStubData();
-
-  snd_use_case_get_value[id] = value;
-
-  cap_control = ucm_get_cap_control(mgr, "Dev1");
-  ASSERT_TRUE(cap_control);
-  EXPECT_EQ(0, strcmp(cap_control, value.c_str()));
-  free(cap_control);
-
-  ASSERT_EQ(1, snd_use_case_get_called);
-  EXPECT_EQ(snd_use_case_get_id[0], id);
-}
-
-TEST(AlsaUcm, GetOverrideType) {
-  struct cras_use_case_mgr* mgr = &cras_ucm_mgr;
-  const char* override_type_name;
-  std::string id = "=OverrideNodeType/Dev1/HiFi";
-  std::string value = "HDMI";
-
-  ResetStubData();
-
-  snd_use_case_get_value[id] = value;
-
-  override_type_name = ucm_get_override_type_name(mgr, "Dev1");
-  ASSERT_TRUE(override_type_name);
-  EXPECT_EQ(0, strcmp(override_type_name, value.c_str()));
-  free((void*)override_type_name);
-
-  ASSERT_EQ(1, snd_use_case_get_called);
-  EXPECT_EQ(snd_use_case_get_id[0], id);
-}
-
-TEST(AlsaUcm, GetSectionsForVar) {
-  struct cras_use_case_mgr* mgr = &cras_ucm_mgr;
-  struct section_name *section_names, *c;
-
-  ResetStubData();
-
-  const char* sections[] = {"Sec1", "Comment for Sec1",
-                            "Sec2", "Comment for Sec2",
-                            "Sec3", "Comment for Sec3"};
-  fake_list["Identifier"] = sections;
-  fake_list_size["Identifier"] = 6;
-  std::string id_1 = "=Var/Sec1/HiFi";
-  std::string id_2 = "=Var/Sec2/HiFi";
-  std::string id_3 = "=Var/Sec3/HiFi";
-  std::string value_1 = "Value1";
-  std::string value_2 = "Value2";
-  std::string value_3 = "Value2";
-
-  snd_use_case_get_value[id_1] = value_1;
-  snd_use_case_get_value[id_2] = value_2;
-  snd_use_case_get_value[id_3] = value_3;
-
-  section_names = ucm_get_sections_for_var(mgr, "Var", "Value2", "Identifier",
-                                           CRAS_STREAM_OUTPUT);
-
-  ASSERT_TRUE(section_names);
-  EXPECT_EQ(0, strcmp(section_names->name, "Sec2"));
-  EXPECT_EQ(0, strcmp(section_names->next->name, "Sec3"));
-
-  ASSERT_EQ(3, snd_use_case_get_called);
-  EXPECT_EQ(snd_use_case_get_id[0], id_1);
-  EXPECT_EQ(snd_use_case_get_id[1], id_2);
-  EXPECT_EQ(snd_use_case_get_id[2], id_3);
-
-  DL_FOREACH (section_names, c) {
-    DL_DELETE(section_names, c);
-    free((void*)c->name);
-    free(c);
-  }
-}
-
-TEST(AlsaUcm, GetDevForJack) {
-  struct cras_use_case_mgr* mgr = &cras_ucm_mgr;
-  const char* dev_name;
-  const char* devices[] = {"Dev1", "Comment for Dev1", "Dev2",
-                           "Comment for Dev2"};
-
-  ResetStubData();
-
-  fake_list["_devices/HiFi"] = devices;
-  fake_list_size["_devices/HiFi"] = 4;
-  std::string id_1 = "=JackDev/Dev1/HiFi";
-  std::string id_2 = "=JackDev/Dev2/HiFi";
-  std::string value_1 = "Value1";
-  std::string value_2 = "Value2";
-
-  snd_use_case_get_value[id_1] = value_1;
-  snd_use_case_get_value[id_2] = value_2;
-  dev_name = ucm_get_dev_for_jack(mgr, value_2.c_str(), CRAS_STREAM_OUTPUT);
-  ASSERT_TRUE(dev_name);
-  EXPECT_EQ(0, strcmp(dev_name, "Dev2"));
-  free((void*)dev_name);
-
-  ASSERT_EQ(2, snd_use_case_get_called);
-  EXPECT_EQ(snd_use_case_get_id[0], id_1);
-  EXPECT_EQ(snd_use_case_get_id[1], id_2);
-}
-
-TEST(AlsaUcm, GetDevForHeadphoneJack) {
-  struct cras_use_case_mgr* mgr = &cras_ucm_mgr;
-  const char* dev_name;
-  const char* devices[] = {"Mic", "Comment for Dev1", "Headphone",
-                           "Comment for Dev2"};
-
-  ResetStubData();
-
-  fake_list["_devices/HiFi"] = devices;
-  fake_list_size["_devices/HiFi"] = 4;
-  std::string id_1 = "=JackDev/Mic/HiFi";
-  std::string id_2 = "=JackDev/Headphone/HiFi";
-  std::string value = "JackValue";
-
-  snd_use_case_get_value[id_1] = value;
-  snd_use_case_get_value[id_2] = value;
-
-  /* Looking for jack with matched value with output direction, Headphone will
-   * be found even though Mic section has the matched value too. */
-  dev_name = ucm_get_dev_for_jack(mgr, value.c_str(), CRAS_STREAM_OUTPUT);
-
-  ASSERT_TRUE(dev_name);
-  EXPECT_EQ(0, strcmp(dev_name, "Headphone"));
-  free((void*)dev_name);
-}
-
-TEST(AlsaUcm, GetDevForMicJack) {
-  struct cras_use_case_mgr* mgr = &cras_ucm_mgr;
-  const char* dev_name;
-  const char* devices[] = {"Headphone", "Comment for Dev1", "Mic",
-                           "Comment for Dev2"};
-
-  ResetStubData();
-
-  fake_list["_devices/HiFi"] = devices;
-  fake_list_size["_devices/HiFi"] = 4;
-  std::string id_1 = "=JackDev/Headphone/HiFi";
-  std::string id_2 = "=JackDev/Mic/HiFi";
-  std::string value = "JackValue";
-
-  snd_use_case_get_value[id_1] = value;
-  snd_use_case_get_value[id_2] = value;
-
-  /* Looking for jack with matched value with input direction, Mic will be found
-   * even though Headphone section has the matched value too. */
-  dev_name = ucm_get_dev_for_jack(mgr, value.c_str(), CRAS_STREAM_INPUT);
-
-  ASSERT_TRUE(dev_name);
-  EXPECT_EQ(0, strcmp(dev_name, "Mic"));
-  free((void*)dev_name);
-}
-
-TEST(AlsaUcm, GetDevForMixer) {
-  struct cras_use_case_mgr* mgr = &cras_ucm_mgr;
-  const char *dev_name_out, *dev_name_in;
-  const char* devices[] = {"Dev1", "Comment for Dev1", "Dev2",
-                           "Comment for Dev2"};
-
-  ResetStubData();
-
-  fake_list["_devices/HiFi"] = devices;
-  fake_list_size["_devices/HiFi"] = 4;
-  std::string id_1 = "=PlaybackMixerElem/Dev1/HiFi";
-  std::string id_2 = "=CaptureMixerElem/Dev2/HiFi";
-  std::string value_1 = "Value1";
-  std::string value_2 = "Value2";
-
-  snd_use_case_get_value[id_1] = value_1;
-  snd_use_case_get_value[id_2] = value_2;
-  dev_name_out =
-      ucm_get_dev_for_mixer(mgr, value_1.c_str(), CRAS_STREAM_OUTPUT);
-  dev_name_in = ucm_get_dev_for_mixer(mgr, value_2.c_str(), CRAS_STREAM_INPUT);
-
-  ASSERT_TRUE(dev_name_out);
-  EXPECT_EQ(0, strcmp(dev_name_out, "Dev1"));
-  free((void*)dev_name_out);
-
-  ASSERT_TRUE(dev_name_in);
-  EXPECT_EQ(0, strcmp(dev_name_in, "Dev2"));
-  free((void*)dev_name_in);
-}
-
-TEST(AlsaUcm, GetAlsaDeviceIndexForDevice) {
-  struct cras_use_case_mgr* mgr = &cras_ucm_mgr;
-  const char* devices[] = {"Dev1", "Comment for Dev1", "Dev2",
-                           "Comment for Dev2"};
-
-  ResetStubData();
-
-  fake_list["_devices/HiFi"] = devices;
-  fake_list_size["_devices/HiFi"] = 4;
-  std::string id_1 = "=CapturePCM/Dev1/HiFi";
-  std::string id_2 = "=PlaybackPCM/Dev2/HiFi";
-  std::string value_1 = "PCMName,1";
-  std::string value_2 = "PCMName,2";
-
-  snd_use_case_get_value[id_1] = value_1;
-  snd_use_case_get_value[id_2] = value_2;
-  EXPECT_EQ(1, ucm_get_alsa_dev_idx_for_dev(mgr, "Dev1", CRAS_STREAM_INPUT));
-  EXPECT_EQ(2, ucm_get_alsa_dev_idx_for_dev(mgr, "Dev2", CRAS_STREAM_OUTPUT));
-
-  ASSERT_EQ(2, snd_use_case_get_called);
-  EXPECT_EQ(snd_use_case_get_id[0], id_1);
-  EXPECT_EQ(snd_use_case_get_id[1], id_2);
-}
-
-TEST(AlsaUcm, GetDeviceRateForDevice) {
-  struct cras_use_case_mgr* mgr = &cras_ucm_mgr;
-  int input_dev_rate, output_dev_rate;
-  const char* devices[] = {"Dev1", "Comment for Dev1", "Dev2",
-                           "Comment for Dev2"};
-
-  ResetStubData();
-
-  fake_list["_devices/HiFi"] = devices;
-  fake_list_size["_devices/HiFi"] = 4;
-  std::string id_1 = "=CaptureRate/Dev1/HiFi";
-  std::string id_2 = "=PlaybackRate/Dev2/HiFi";
-  std::string value_1 = "44100";
-  std::string value_2 = "48000";
-
-  snd_use_case_get_value[id_1] = value_1;
-  snd_use_case_get_value[id_2] = value_2;
-  input_dev_rate = ucm_get_sample_rate_for_dev(mgr, "Dev1", CRAS_STREAM_INPUT);
-  output_dev_rate =
-      ucm_get_sample_rate_for_dev(mgr, "Dev2", CRAS_STREAM_OUTPUT);
-  EXPECT_EQ(44100, input_dev_rate);
-  EXPECT_EQ(48000, output_dev_rate);
-
-  ASSERT_EQ(2, snd_use_case_get_called);
-  EXPECT_EQ(snd_use_case_get_id[0], id_1);
-  EXPECT_EQ(snd_use_case_get_id[1], id_2);
-}
-
-TEST(AlsaUcm, GetDeviceChannelsForDevice) {
-  struct cras_use_case_mgr* mgr = &cras_ucm_mgr;
-  int rc;
-  size_t input_dev_channels, output_dev_channels;
-  const char* devices[] = {"Dev1", "Comment for Dev1", "Dev2",
-                           "Comment for Dev2"};
-
-  ResetStubData();
-
-  fake_list["_devices/HiFi"] = devices;
-  fake_list_size["_devices/HiFi"] = 4;
-  std::string id_1 = "=CaptureChannels/Dev1/HiFi";
-  std::string id_2 = "=PlaybackChannels/Dev2/HiFi";
-  std::string value_1 = "4";
-  std::string value_2 = "8";
-
-  snd_use_case_get_value[id_1] = value_1;
-  snd_use_case_get_value[id_2] = value_2;
-  rc = ucm_get_channels_for_dev(mgr, "Dev1", CRAS_STREAM_INPUT,
-                                &input_dev_channels);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(4, input_dev_channels);
-  rc = ucm_get_channels_for_dev(mgr, "Dev2", CRAS_STREAM_OUTPUT,
-                                &output_dev_channels);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(8, output_dev_channels);
-
-  ASSERT_EQ(2, snd_use_case_get_called);
-  EXPECT_EQ(snd_use_case_get_id[0], id_1);
-  EXPECT_EQ(snd_use_case_get_id[1], id_2);
-}
-
-TEST(AlsaUcm, GetCaptureChannelMapForDevice) {
-  struct cras_use_case_mgr* mgr = &cras_ucm_mgr;
-  int8_t channel_layout[CRAS_CH_MAX];
-  int rc;
-
-  ResetStubData();
-
-  std::string id_1 = "=CaptureChannelMap/Dev1/HiFi";
-  std::string value_1 = "-1 -1 0 1 -1 -1 -1 -1 -1 -1 -1";
-
-  snd_use_case_get_value[id_1] = value_1;
-  rc = ucm_get_capture_chmap_for_dev(mgr, "Dev1", channel_layout);
-
-  EXPECT_EQ(0, rc);
-
-  ASSERT_EQ(1, snd_use_case_get_called);
-  EXPECT_EQ(snd_use_case_get_id[0], id_1);
-  EXPECT_EQ(channel_layout[0], -1);
-  EXPECT_EQ(channel_layout[1], -1);
-  EXPECT_EQ(channel_layout[2], 0);
-  EXPECT_EQ(channel_layout[3], 1);
-  EXPECT_EQ(channel_layout[4], -1);
-  EXPECT_EQ(channel_layout[5], -1);
-  EXPECT_EQ(channel_layout[6], -1);
-  EXPECT_EQ(channel_layout[7], -1);
-  EXPECT_EQ(channel_layout[8], -1);
-  EXPECT_EQ(channel_layout[9], -1);
-  EXPECT_EQ(channel_layout[10], -1);
-}
-
-TEST(AlsaUcm, GetEchoReferenceDev) {
-  struct cras_use_case_mgr* mgr = &cras_ucm_mgr;
-  const char* echo_ref_dev;
-
-  ResetStubData();
-
-  std::string id_1 = "=EchoReferenceDev/Dev1/HiFi";
-  std::string value_1 = "Echo Ref";
-
-  snd_use_case_get_value[id_1] = value_1;
-  echo_ref_dev = ucm_get_echo_reference_dev_name_for_dev(mgr, "Dev1");
-
-  ASSERT_EQ(1, snd_use_case_get_called);
-  EXPECT_EQ(snd_use_case_get_id[0], id_1);
-  EXPECT_EQ(0, strcmp(echo_ref_dev, value_1.c_str()));
-  free((void*)echo_ref_dev);
-}
-
-TEST(AlsaUcm, GetHotwordModels) {
-  struct cras_use_case_mgr* mgr = &cras_ucm_mgr;
-  const char* models;
-  const char* modifiers[] = {"Mod1",     "Comment1",         "Hotword Model en",
-                             "Comment2", "Hotword Model jp", "Comment3",
-                             "Mod2",     "Comment4",         "Hotword Model de",
-                             "Comment5"};
-  ResetStubData();
-
-  fake_list["_modifiers/HiFi"] = modifiers;
-  fake_list_size["_modifiers/HiFi"] = 10;
-
-  models = ucm_get_hotword_models(mgr);
-  ASSERT_TRUE(models);
-  EXPECT_EQ(0, strcmp(models, "en,jp,de"));
-  free((void*)models);
-}
-
-TEST(AlsaUcm, SetHotwordModel) {
-  struct cras_use_case_mgr* mgr = &cras_ucm_mgr;
-  const char* modifiers[] = {"Hotword Model en", "Comment1",
-                             "Hotword Model jp", "Comment2",
-                             "Hotword Model de", "Comment3"};
-  const char* enabled_mods[] = {"Hotword Model jp"};
-  int ret;
-  std::string id = "_modstatus/Hotword Model jp";
-  ResetStubData();
-
-  snd_use_case_geti_value[id] = 1;
-  fake_list["_modifiers/HiFi"] = modifiers;
-  fake_list_size["_modifiers/HiFi"] = 6;
-
-  EXPECT_EQ(-EINVAL, ucm_set_hotword_model(mgr, "zh"));
-  EXPECT_EQ(0, snd_use_case_set_called);
-
-  ret = ucm_set_hotword_model(mgr, "jp");
-
-  EXPECT_EQ(0, ret);
-  EXPECT_EQ(0, snd_use_case_set_called);
-  EXPECT_EQ(0, strcmp(mgr->hotword_modifier, "Hotword Model jp"));
-
-  fake_list["_enamods"] = enabled_mods;
-  fake_list_size["_enamods"] = 1;
-  ret = ucm_set_hotword_model(mgr, "de");
-  EXPECT_EQ(0, ret);
-  EXPECT_EQ(2, snd_use_case_set_called);
-  EXPECT_EQ(1, snd_use_case_geti_called);
-  EXPECT_EQ(
-      snd_use_case_set_param[0],
-      std::make_pair(std::string("_dismod"), std::string("Hotword Model jp")));
-  EXPECT_EQ(
-      snd_use_case_set_param[1],
-      std::make_pair(std::string("_enamod"), std::string("Hotword Model de")));
-  free(mgr->hotword_modifier);
-}
-
-TEST(AlsaUcm, DisableAllHotwordModels) {
-  struct cras_use_case_mgr* mgr = &cras_ucm_mgr;
-  const char* modifiers[] = {"Hotword Model en", "Comment1",
-                             "Hotword Model jp", "Comment2",
-                             "Hotword Model de", "Comment3"};
-  const char* enabled_mods[] = {"Hotword Model en"};
-  ResetStubData();
-
-  fake_list["_modifiers/HiFi"] = modifiers;
-  fake_list_size["_modifiers/HiFi"] = 6;
-  fake_list["_enamods"] = enabled_mods;
-  fake_list_size["_enamods"] = 1;
-
-  ucm_disable_all_hotword_models(mgr);
-
-  EXPECT_EQ(1, snd_use_case_set_called);
-  EXPECT_EQ(
-      snd_use_case_set_param[0],
-      std::make_pair(std::string("_dismod"), std::string("Hotword Model en")));
-}
-
-TEST(AlsaUcm, EnableHotwordModel) {
-  struct cras_use_case_mgr* mgr = &cras_ucm_mgr;
-  const char* modifiers[] = {"Hotword Model en", "Comment1",
-                             "Hotword Model jp", "Comment2",
-                             "Hotword Model de", "Comment3"};
-  const char* enabled_mods[] = {""};
-  int ret;
-  ResetStubData();
-
-  fake_list["_modifiers/HiFi"] = modifiers;
-  fake_list_size["_modifiers/HiFi"] = 6;
-  fake_list["_enamods"] = enabled_mods;
-  fake_list_size["_enamods"] = 0;
-
-  EXPECT_EQ(-EINVAL, ucm_enable_hotword_model(mgr));
-
-  mgr->hotword_modifier = strdup("Hotword Model de");
-  ret = ucm_enable_hotword_model(mgr);
-
-  EXPECT_EQ(0, ret);
-  EXPECT_EQ(1, snd_use_case_set_called);
-  EXPECT_EQ(
-      snd_use_case_set_param[0],
-      std::make_pair(std::string("_enamod"), std::string("Hotword Model de")));
-  free(mgr->hotword_modifier);
-}
-
-TEST(AlsaUcm, SwapModeExists) {
-  struct cras_use_case_mgr* mgr = &cras_ucm_mgr;
-  int rc;
-  const char* modifiers_1[] = {
-      "Speaker Swap Mode", "Comment for Speaker Swap Mode",
-      "Microphone Swap Mode", "Comment for Microphone Swap Mode"};
-  const char* modifiers_2[] = {
-      "Speaker Some Mode", "Comment for Speaker Some Mode",
-      "Microphone Some Mode", "Comment for Microphone Some Mode"};
-
-  ResetStubData();
-
-  fake_list["_modifiers/HiFi"] = modifiers_1;
-  fake_list_size["_modifiers/HiFi"] = 4;
-  rc = ucm_swap_mode_exists(mgr);
-  EXPECT_EQ(1, rc);
-
-  fake_list["_modifiers/HiFi"] = modifiers_2;
-  fake_list_size["_modifiers/HiFi"] = 4;
-  rc = ucm_swap_mode_exists(mgr);
-  EXPECT_EQ(0, rc);
-}
-
-TEST(AlsaUcm, EnableSwapMode) {
-  struct cras_use_case_mgr* mgr = &cras_ucm_mgr;
-  int rc;
-  const char* modifiers[] = {
-      "Speaker Swap Mode", "Comment for Speaker Swap Mode",
-      "Microphone Swap Mode", "Comment for Microphone Swap Mode"};
-  const char* modifiers_enabled[] = {"Speaker Swap Mode"};
-
-  ResetStubData();
-
-  fake_list["_modifiers/HiFi"] = modifiers;
-  fake_list_size["_modifiers/HiFi"] = 4;
-
-  fake_list["_enamods"] = modifiers_enabled;
-  fake_list_size["_enamods"] = 1;
-
-  snd_use_case_set_return = 0;
-
-  rc = ucm_enable_swap_mode(mgr, "Headphone", 1);
-  EXPECT_EQ(-EPERM, rc);
-  EXPECT_EQ(0, snd_use_case_set_called);
-
-  rc = ucm_enable_swap_mode(mgr, "Speaker", 1);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(0, snd_use_case_set_called);
-
-  rc = ucm_enable_swap_mode(mgr, "Microphone", 1);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(1, snd_use_case_set_called);
-}
-
-TEST(AlsaUcm, DisableSwapMode) {
-  struct cras_use_case_mgr* mgr = &cras_ucm_mgr;
-  int rc;
-  const char* modifiers[] = {
-      "Speaker Swap Mode", "Comment for Speaker Swap Mode",
-      "Microphone Swap Mode", "Comment for Microphone Swap Mode"};
-  const char* modifiers_enabled[] = {"Speaker Swap Mode"};
-
-  ResetStubData();
-
-  fake_list["_modifiers/HiFi"] = modifiers;
-  fake_list_size["_modifiers/HiFi"] = 4;
-
-  fake_list["_enamods"] = modifiers_enabled;
-  fake_list_size["_enamods"] = 1;
-
-  snd_use_case_set_return = 0;
-
-  rc = ucm_enable_swap_mode(mgr, "Headphone", 0);
-  EXPECT_EQ(-EPERM, rc);
-  EXPECT_EQ(0, snd_use_case_set_called);
-
-  rc = ucm_enable_swap_mode(mgr, "Microphone", 0);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(0, snd_use_case_set_called);
-
-  rc = ucm_enable_swap_mode(mgr, "Speaker", 0);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(1, snd_use_case_set_called);
-}
-
-TEST(AlsaUcm, NoiseCancellationExists) {
-  struct cras_use_case_mgr* mgr = &cras_ucm_mgr;
-  int rc;
-  const char* node = "Internal Mic";
-  const char* modifiers_1[] = {"Internal Mic Noise Cancellation", "Comment"};
-  const char* modifiers_2[] = {"Internal Mic Noise Augmentation", "Comment"};
-  const char* modifiers_3[] = {"Microphone Noise Cancellation", "Comment"};
-
-  ResetStubData();
-
-  fake_list["_modifiers/HiFi"] = modifiers_1;
-  fake_list_size["_modifiers/HiFi"] = 2;
-  rc = ucm_node_noise_cancellation_exists(mgr, node);
-  EXPECT_EQ(1, rc);
-
-  fake_list["_modifiers/HiFi"] = modifiers_2;
-  fake_list_size["_modifiers/HiFi"] = 2;
-  rc = ucm_node_noise_cancellation_exists(mgr, node);
-  EXPECT_EQ(0, rc);
-
-  fake_list["_modifiers/HiFi"] = modifiers_3;
-  fake_list_size["_modifiers/HiFi"] = 2;
-  rc = ucm_node_noise_cancellation_exists(mgr, node);
-  EXPECT_EQ(0, rc);
-}
-
-TEST(AlsaUcm, EnableDisableNoiseCancellation) {
-  struct cras_use_case_mgr* mgr = &cras_ucm_mgr;
-  int rc;
-  const char* modifiers[] = {"Internal Mic Noise Cancellation", "Comment1",
-                             "Microphone Noise Cancellation", "Comment2"};
-  const char* modifiers_enabled[] = {"Internal Mic Noise Cancellation"};
-
-  ResetStubData();
-
-  fake_list["_modifiers/HiFi"] = modifiers;
-  fake_list_size["_modifiers/HiFi"] = 4;
-
-  fake_list["_enamods"] = modifiers_enabled;
-  fake_list_size["_enamods"] = 1;
-
-  snd_use_case_set_return = 0;
-
-  rc = ucm_enable_node_noise_cancellation(mgr, "Line In", 1);
-  EXPECT_EQ(-EPERM, rc);  // Modifier is not existed
-  EXPECT_EQ(0, snd_use_case_set_called);
-
-  rc = ucm_enable_node_noise_cancellation(mgr, "Line In", 0);
-  EXPECT_EQ(-EPERM, rc);  // Modifier is not existed
-  EXPECT_EQ(0, snd_use_case_set_called);
-
-  rc = ucm_enable_node_noise_cancellation(mgr, "Microphone", 0);
-  EXPECT_EQ(0, rc);  // Modifier is already disabled
-  EXPECT_EQ(0, snd_use_case_set_called);
-
-  rc = ucm_enable_node_noise_cancellation(mgr, "Microphone", 1);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(1, snd_use_case_set_called);
-
-  snd_use_case_set_called = 0;
-
-  rc = ucm_enable_node_noise_cancellation(mgr, "Internal Mic", 1);
-  EXPECT_EQ(0, rc);  // Modifier is already enabled
-  EXPECT_EQ(0, snd_use_case_set_called);
-
-  rc = ucm_enable_node_noise_cancellation(mgr, "Internal Mic", 0);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(1, snd_use_case_set_called);
-}
-
-TEST(AlsaFlag, GetFlag) {
-  struct cras_use_case_mgr* mgr = &cras_ucm_mgr;
-  char* flag_value;
-
-  std::string id = "=FlagName//HiFi";
-  std::string value = "1";
-  ResetStubData();
-
-  snd_use_case_get_value[id] = value;
-
-  flag_value = ucm_get_flag(mgr, "FlagName");
-  ASSERT_TRUE(flag_value);
-  EXPECT_EQ(0, strcmp(flag_value, value.c_str()));
-  free(flag_value);
-
-  ASSERT_EQ(1, snd_use_case_get_called);
-  EXPECT_EQ(snd_use_case_get_id[0], id);
-}
-
-TEST(AlsaUcm, ModifierEnabled) {
-  struct cras_use_case_mgr* mgr = &cras_ucm_mgr;
-  int enabled;
-
-  ResetStubData();
-
-  const char* mods[] = {"Mod1", "Mod2"};
-  fake_list["_enamods"] = mods;
-  fake_list_size["_enamods"] = 2;
-
-  enabled = modifier_enabled(mgr, "Mod1");
-  EXPECT_EQ(1, enabled);
-  enabled = modifier_enabled(mgr, "Mod2");
-  EXPECT_EQ(1, enabled);
-  enabled = modifier_enabled(mgr, "Mod3");
-  EXPECT_EQ(0, enabled);
-}
-
-TEST(AlsaUcm, SetModifierEnabled) {
-  struct cras_use_case_mgr* mgr = &cras_ucm_mgr;
-
-  ResetStubData();
-
-  ucm_set_modifier_enabled(mgr, "Mod1", 1);
-  EXPECT_EQ(snd_use_case_set_param[0],
-            std::make_pair(std::string("_enamod"), std::string("Mod1")));
-  EXPECT_EQ(1, snd_use_case_set_called);
-  ucm_set_modifier_enabled(mgr, "Mod1", 0);
-  EXPECT_EQ(snd_use_case_set_param[1],
-            std::make_pair(std::string("_dismod"), std::string("Mod1")));
-  EXPECT_EQ(2, snd_use_case_set_called);
-}
-
-TEST(AlsaUcm, EndWithSuffix) {
-  EXPECT_EQ(1, ucm_str_ends_with_suffix("Foo bar", "bar"));
-  EXPECT_EQ(1, ucm_str_ends_with_suffix("bar", "bar"));
-  EXPECT_EQ(0, ucm_str_ends_with_suffix("Foo car", "bar"));
-}
-
-TEST(AlsaUcm, SectionExistsWithName) {
-  struct cras_use_case_mgr* mgr = &cras_ucm_mgr;
-  const char* sections[] = {"Sec1", "Comment for Sec1", "Sec2",
-                            "Comment for Sec2"};
-
-  ResetStubData();
-
-  fake_list["Identifier"] = sections;
-  fake_list_size["Identifier"] = 4;
-  EXPECT_EQ(1, ucm_section_exists_with_name(mgr, "Sec1", "Identifier"));
-  EXPECT_EQ(1, ucm_section_exists_with_name(mgr, "Sec2", "Identifier"));
-  EXPECT_EQ(0, ucm_section_exists_with_name(mgr, "Sec3", "Identifier"));
-}
-
-TEST(AlsaUcm, SectionExistsWithSuffix) {
-  struct cras_use_case_mgr* mgr = &cras_ucm_mgr;
-
-  ResetStubData();
-
-  const char* sections[] = {"Sec1 Suffix1", "Comment for Sec1", "Sec2 Suffix2",
-                            "Comment for Sec2"};
-  fake_list["Identifier"] = sections;
-  fake_list_size["Identifier"] = 4;
-  EXPECT_EQ(1, ucm_section_exists_with_suffix(mgr, "Suffix1", "Identifier"));
-  EXPECT_EQ(1, ucm_section_exists_with_suffix(mgr, "Suffix2", "Identifier"));
-  EXPECT_EQ(0, ucm_section_exists_with_suffix(mgr, "Suffix3", "Identifier"));
-}
-
-TEST(AlsaUcm, DisableSoftwareVolume) {
-  struct cras_use_case_mgr* mgr = &cras_ucm_mgr;
-  unsigned int disable_software_volume;
-  std::string id = "=DisableSoftwareVolume//HiFi";
-  std::string value = "1";
-
-  ResetStubData();
-
-  snd_use_case_get_value[id] = value;
-
-  disable_software_volume = ucm_get_disable_software_volume(mgr);
-  ASSERT_TRUE(disable_software_volume);
-
-  ASSERT_EQ(1, snd_use_case_get_called);
-  EXPECT_EQ(snd_use_case_get_id[0], id);
-}
-
-TEST(AlsaUcm, GetCoupledMixersForDevice) {
-  struct cras_use_case_mgr* mgr = &cras_ucm_mgr;
-  struct mixer_name *mixer_names_1, *mixer_names_2, *c;
-  const char* devices[] = {"Dev1", "Comment for Dev1", "Dev2",
-                           "Comment for Dev2"};
-
-  ResetStubData();
-
-  fake_list["_devices/HiFi"] = devices;
-  fake_list_size["_devices/HiFi"] = 4;
-  std::string id_1 = "=CoupledMixers/Dev1/HiFi";
-  std::string value_1 = "Mixer Name1,Mixer Name2,Mixer Name3";
-  std::string id_2 = "=CoupledMixers/Dev2/HiFi";
-  std::string value_2 = "";
-  snd_use_case_get_value[id_1] = value_1;
-  snd_use_case_get_value[id_2] = value_2;
-  mixer_names_1 = ucm_get_coupled_mixer_names(mgr, "Dev1");
-  mixer_names_2 = ucm_get_coupled_mixer_names(mgr, "Dev2");
-
-  ASSERT_TRUE(mixer_names_1);
-  EXPECT_EQ(0, strcmp(mixer_names_1->name, "Mixer Name1"));
-  EXPECT_EQ(0, strcmp(mixer_names_1->next->name, "Mixer Name2"));
-  EXPECT_EQ(0, strcmp(mixer_names_1->next->next->name, "Mixer Name3"));
-  EXPECT_EQ(NULL, mixer_names_1->next->next->next);
-
-  EXPECT_EQ(NULL, mixer_names_2);
-
-  DL_FOREACH (mixer_names_1, c) {
-    DL_DELETE(mixer_names_1, c);
-    free((void*)c->name);
-    free(c);
-  }
-}
-
-TEST(AlsaUcm, FreeMixerNames) {
-  struct cras_use_case_mgr* mgr = &cras_ucm_mgr;
-  struct mixer_name* mixer_names_1;
-  const char* devices[] = {"Dev1", "Comment for Dev1"};
-
-  ResetStubData();
-
-  fake_list["_devices/HiFi"] = devices;
-  fake_list_size["_devices/HiFi"] = 2;
-  std::string id_1 = "=CoupledMixers/Dev1/HiFi";
-  std::string value_1 = "Mixer Name1,Mixer Name2,Mixer Name3";
-  snd_use_case_get_value[id_1] = value_1;
-  mixer_names_1 = ucm_get_coupled_mixer_names(mgr, "Dev1");
-
-  ASSERT_TRUE(mixer_names_1);
-  EXPECT_EQ(0, strcmp(mixer_names_1->name, "Mixer Name1"));
-  EXPECT_EQ(0, strcmp(mixer_names_1->next->name, "Mixer Name2"));
-  EXPECT_EQ(0, strcmp(mixer_names_1->next->next->name, "Mixer Name3"));
-  EXPECT_EQ(NULL, mixer_names_1->next->next->next);
-
-  /* No way to actually check if memory is freed. */
-  mixer_name_free(mixer_names_1);
-}
-
-TEST(AlsaUcm, DefaultNodeGain) {
-  struct cras_use_case_mgr* mgr = &cras_ucm_mgr;
-  long default_node_gain;
-  int ret;
-  std::string id = "=DefaultNodeGain/Internal Mic/HiFi";
-  std::string value = "-2000";
-
-  ResetStubData();
-
-  /* Value can be found in UCM. */
-  snd_use_case_get_value[id] = value;
-
-  ret = ucm_get_default_node_gain(mgr, "Internal Mic", &default_node_gain);
-
-  EXPECT_EQ(0, ret);
-  EXPECT_EQ(-2000, default_node_gain);
-
-  ResetStubData();
-
-  /* Value can not be found in UCM. */
-  ret = ucm_get_default_node_gain(mgr, "Internal Mic", &default_node_gain);
-
-  ASSERT_TRUE(ret);
-}
-
-TEST(AlsaUcm, IntrinsicSensitivity) {
-  struct cras_use_case_mgr* mgr = &cras_ucm_mgr;
-  long intrinsic_vol;
-  int ret;
-  std::string id = "=IntrinsicSensitivity/Internal Mic/HiFi";
-  std::string value = "-2000";
-
-  ResetStubData();
-
-  /* Value can be found in UCM. */
-  snd_use_case_get_value[id] = value;
-
-  ret = ucm_get_intrinsic_sensitivity(mgr, "Internal Mic", &intrinsic_vol);
-
-  EXPECT_EQ(0, ret);
-  EXPECT_EQ(-2000, intrinsic_vol);
-
-  ResetStubData();
-
-  /* Value can not be found in UCM. */
-  ret = ucm_get_intrinsic_sensitivity(mgr, "Internal Mic", &intrinsic_vol);
-
-  ASSERT_TRUE(ret);
-}
-
-TEST(AlsaUcm, UseFullySpecifiedUCMConfig) {
-  struct cras_use_case_mgr* mgr = &cras_ucm_mgr;
-  int fully_specified_flag;
-
-  std::string id = "=FullySpecifiedUCM//HiFi";
-  ResetStubData();
-
-  /* Flag is not set */
-  fully_specified_flag = ucm_has_fully_specified_ucm_flag(mgr);
-  ASSERT_FALSE(fully_specified_flag);
-
-  /* Flag is set to "1". */
-  snd_use_case_get_value[id] = std::string("1");
-  fully_specified_flag = ucm_has_fully_specified_ucm_flag(mgr);
-  ASSERT_TRUE(fully_specified_flag);
-
-  /* Flag is set to "0". */
-  snd_use_case_get_value[id] = std::string("0");
-  fully_specified_flag = ucm_has_fully_specified_ucm_flag(mgr);
-  ASSERT_FALSE(fully_specified_flag);
-}
-
-TEST(AlsaUcm, GetMixerNameForDevice) {
-  struct cras_use_case_mgr* mgr = &cras_ucm_mgr;
-  const char *mixer_name_1, *mixer_name_2;
-  const char* devices[] = {"Dev1", "Comment for Dev1", "Dev2",
-                           "Comment for Dev2"};
-
-  ResetStubData();
-
-  fake_list["_devices/HiFi"] = devices;
-  fake_list_size["_devices/HiFi"] = 4;
-  std::string id_1 = "=PlaybackMixerElem/Dev1/HiFi";
-  std::string id_2 = "=CaptureMixerElem/Dev2/HiFi";
-  std::string value_1 = "MixerName1";
-  std::string value_2 = "MixerName2";
-
-  snd_use_case_get_value[id_1] = value_1;
-  snd_use_case_get_value[id_2] = value_2;
-  mixer_name_1 = ucm_get_playback_mixer_elem_for_dev(mgr, "Dev1");
-  mixer_name_2 = ucm_get_capture_mixer_elem_for_dev(mgr, "Dev2");
-
-  EXPECT_EQ(0, strcmp(mixer_name_1, value_1.c_str()));
-  EXPECT_EQ(0, strcmp(mixer_name_2, value_2.c_str()));
-  free((void*)mixer_name_1);
-  free((void*)mixer_name_2);
-}
-
-TEST(AlsaUcm, GetMainVolumeMixerName) {
-  struct cras_use_case_mgr* mgr = &cras_ucm_mgr;
-  struct mixer_name *mixer_names_1, *mixer_names_2, *c;
-
-  ResetStubData();
-
-  std::string id = "=MainVolumeNames//HiFi";
-  std::string value_1 = "Mixer Name1,Mixer Name2,Mixer Name3";
-
-  snd_use_case_get_value[id] = value_1;
-  mixer_names_1 = ucm_get_main_volume_names(mgr);
-
-  ResetStubData();
-
-  /* Can not find MainVolumeNames */
-  mixer_names_2 = ucm_get_main_volume_names(mgr);
-
-  ASSERT_TRUE(mixer_names_1);
-  EXPECT_EQ(0, strcmp(mixer_names_1->name, "Mixer Name1"));
-  EXPECT_EQ(0, strcmp(mixer_names_1->next->name, "Mixer Name2"));
-  EXPECT_EQ(0, strcmp(mixer_names_1->next->next->name, "Mixer Name3"));
-  EXPECT_EQ(NULL, mixer_names_1->next->next->next);
-
-  DL_FOREACH (mixer_names_1, c) {
-    DL_DELETE(mixer_names_1, c);
-    free((void*)c->name);
-    free(c);
-  }
-
-  EXPECT_EQ(NULL, mixer_names_2);
-}
-
-TEST(AlsaUcm, ListSectionsByDeviceNameOutput) {
-  struct cras_use_case_mgr* mgr = &cras_ucm_mgr;
-  void* callback_arg = reinterpret_cast<void*>(0x56);
-  int listed = 0;
-
-  ResetStubData();
-  SetSectionDeviceData();
-
-  listed = ucm_list_section_devices_by_device_name(
-      mgr, CRAS_STREAM_OUTPUT, "test_card:0", list_devices_callback,
-      callback_arg);
-
-  EXPECT_EQ(2, listed);
-  EXPECT_EQ(2, list_devices_callback_names.size());
-  EXPECT_EQ(2, list_devices_callback_args.size());
-
-  EXPECT_EQ(0, strcmp(list_devices_callback_names[0].c_str(), "Speaker"));
-  EXPECT_EQ(callback_arg, list_devices_callback_args[0]);
-
-  EXPECT_EQ(0, strcmp(list_devices_callback_names[1].c_str(), "Headphone"));
-  EXPECT_EQ(callback_arg, list_devices_callback_args[1]);
-}
-
-TEST(AlsaUcm, ListSectionsByDeviceNameInput) {
-  struct cras_use_case_mgr* mgr = &cras_ucm_mgr;
-  void* callback_arg = reinterpret_cast<void*>(0x56);
-  int listed = 0;
-
-  ResetStubData();
-  SetSectionDeviceData();
-
-  listed = ucm_list_section_devices_by_device_name(
-      mgr, CRAS_STREAM_INPUT, "test_card:0", list_devices_callback,
-      callback_arg);
-
-  EXPECT_EQ(2, listed);
-  EXPECT_EQ(2, list_devices_callback_names.size());
-  EXPECT_EQ(2, list_devices_callback_args.size());
-
-  EXPECT_EQ(0, strcmp(list_devices_callback_names[0].c_str(), "IntMic"));
-  EXPECT_EQ(callback_arg, list_devices_callback_args[0]);
-
-  EXPECT_EQ(0, strcmp(list_devices_callback_names[1].c_str(), "ExtMic"));
-  EXPECT_EQ(callback_arg, list_devices_callback_args[1]);
-}
-
-TEST(AlsaUcm, GetJackDevForDevice) {
-  struct cras_use_case_mgr* mgr = &cras_ucm_mgr;
-  const char *jack_name_1, *jack_name_2;
-  const char* devices[] = {"Dev1", "Comment for Dev1", "Dev2",
-                           "Comment for Dev2"};
-
-  ResetStubData();
-
-  fake_list["_devices/HiFi"] = devices;
-  fake_list_size["_devices/HiFi"] = 4;
-  std::string id_1 = "=JackDev/Dev1/HiFi";
-  std::string value_1 = "JackDev1";
-
-  snd_use_case_get_value[id_1] = value_1;
-  jack_name_1 = ucm_get_jack_dev_for_dev(mgr, "Dev1");
-  jack_name_2 = ucm_get_jack_dev_for_dev(mgr, "Dev2");
-
-  EXPECT_EQ(0, strcmp(jack_name_1, value_1.c_str()));
-  EXPECT_EQ(NULL, jack_name_2);
-
-  free((void*)jack_name_1);
-  free((void*)jack_name_2);
-}
-
-TEST(AlsaUcm, GetJackControlForDevice) {
-  struct cras_use_case_mgr* mgr = &cras_ucm_mgr;
-  const char *jack_name_1, *jack_name_2;
-  const char* devices[] = {"Dev1", "Comment for Dev1", "Dev2",
-                           "Comment for Dev2"};
-
-  ResetStubData();
-
-  fake_list["_devices/HiFi"] = devices;
-  fake_list_size["_devices/HiFi"] = 4;
-  std::string id_1 = "=JackControl/Dev1/HiFi";
-  std::string value_1 = "JackControl1";
-
-  snd_use_case_get_value[id_1] = value_1;
-  jack_name_1 = ucm_get_jack_control_for_dev(mgr, "Dev1");
-  jack_name_2 = ucm_get_jack_control_for_dev(mgr, "Dev2");
-
-  EXPECT_EQ(0, strcmp(jack_name_1, value_1.c_str()));
-  EXPECT_EQ(NULL, jack_name_2);
-
-  free((void*)jack_name_1);
-  free((void*)jack_name_2);
-}
-
-TEST(AlsaUcm, GetPeriodFramesForDevice) {
-  struct cras_use_case_mgr* mgr = &cras_ucm_mgr;
-  int dma_period_1, dma_period_2, dma_period_3;
-  const char* devices[] = {"Dev1", "Comment for Dev1",
-                           "Dev2", "Comment for Dev2",
-                           "Dev3", "Comment for Dev3"};
-
-  ResetStubData();
-
-  fake_list["_devices/HiFi"] = devices;
-  fake_list_size["_devices/HiFi"] = 6;
-  std::string id_1 = "=DmaPeriodMicrosecs/Dev1/HiFi";
-  std::string value_1 = "1000";
-  std::string id_2 = "=DmaPeriodMicrosecs/Dev2/HiFi";
-  std::string value_2 = "-10";
-
-  snd_use_case_get_value[id_1] = value_1;
-  snd_use_case_get_value[id_2] = value_2;
-
-  dma_period_1 = ucm_get_dma_period_for_dev(mgr, "Dev1");
-  dma_period_2 = ucm_get_dma_period_for_dev(mgr, "Dev2");
-  dma_period_3 = ucm_get_dma_period_for_dev(mgr, "Dev3");
-
-  EXPECT_EQ(1000, dma_period_1);
-  EXPECT_EQ(0, dma_period_2);
-  EXPECT_EQ(0, dma_period_3);
-}
-
-TEST(AlsaUcm, UcmSection) {
-  struct ucm_section* section_list = NULL;
-  struct ucm_section* section;
-  struct mixer_name* controls = NULL;
-  struct mixer_name* m_name;
-  int dev_idx = 0;
-  int dependent_dev_idx = -1;
-  size_t i;
-  enum CRAS_STREAM_DIRECTION dir = CRAS_STREAM_OUTPUT;
-  static const char* name = "Headphone";
-  static const char* pcm_name = "hw:0,1";
-  static const char* jack_name = "my-card-name Headset Jack";
-  static const char* jack_type = "gpio";
-  static const char* mixer_name = "Control1";
-  static const char* coupled_names[] = {"Coupled1", "Coupled2"};
-
-  section =
-      ucm_section_create(NULL, NULL, 0, -1, CRAS_STREAM_OUTPUT, NULL, NULL);
-  EXPECT_EQ(reinterpret_cast<struct ucm_section*>(NULL), section);
-
-  section = ucm_section_create(name, pcm_name, dev_idx, dependent_dev_idx, dir,
-                               jack_name, jack_type);
-  EXPECT_NE(reinterpret_cast<struct ucm_section*>(NULL), section);
-  EXPECT_NE(name, section->name);
-  EXPECT_EQ(0, strcmp(name, section->name));
-  EXPECT_EQ(dev_idx, section->dev_idx);
-  EXPECT_EQ(dir, section->dir);
-  EXPECT_NE(jack_name, section->jack_name);
-  EXPECT_NE(jack_type, section->jack_type);
-  EXPECT_EQ(section->prev, section);
-  EXPECT_EQ(reinterpret_cast<const char*>(NULL), section->mixer_name);
-  EXPECT_EQ(reinterpret_cast<struct mixer_name*>(NULL), section->coupled);
-
-  EXPECT_EQ(-EINVAL, ucm_section_set_mixer_name(section, NULL));
-  EXPECT_EQ(-EINVAL, ucm_section_set_mixer_name(NULL, mixer_name));
-  EXPECT_EQ(0, ucm_section_set_mixer_name(section, mixer_name));
-
-  EXPECT_NE(section->mixer_name, mixer_name);
-  EXPECT_EQ(0, strcmp(section->mixer_name, mixer_name));
-
-  EXPECT_EQ(-EINVAL, ucm_section_add_coupled(section, NULL, MIXER_NAME_VOLUME));
-  EXPECT_EQ(-EINVAL,
-            ucm_section_add_coupled(NULL, coupled_names[0], MIXER_NAME_VOLUME));
-  EXPECT_EQ(
-      0, ucm_section_add_coupled(section, coupled_names[0], MIXER_NAME_VOLUME));
-
-  EXPECT_EQ(-EINVAL, ucm_section_concat_coupled(section, NULL));
-  EXPECT_EQ(-EINVAL, ucm_section_concat_coupled(
-                         NULL, reinterpret_cast<struct mixer_name*>(0x1111)));
-
-  controls = NULL;
-  for (i = 1; i < ARRAY_SIZE(coupled_names); i++) {
-    controls = mixer_name_add(controls, coupled_names[i], CRAS_STREAM_OUTPUT,
-                              MIXER_NAME_VOLUME);
-  }
-  /* Add controls to the list of coupled controls for this section. */
-  EXPECT_EQ(0, ucm_section_concat_coupled(section, controls));
-
-  i = 0;
-  DL_FOREACH (section->coupled, m_name) {
-    EXPECT_NE(m_name->name, coupled_names[i]);
-    EXPECT_EQ(0, strcmp(m_name->name, coupled_names[i]));
-    i++;
-  }
-  EXPECT_EQ(i, ARRAY_SIZE(coupled_names));
-
-  DL_APPEND(section_list, section);
-  ucm_section_free_list(section_list);
-}
-
-TEST(AlsaUcm, GetSections) {
-  struct cras_use_case_mgr* mgr = &cras_ucm_mgr;
-  struct ucm_section* sections;
-  struct ucm_section* section;
-  struct mixer_name* m_name;
-  int section_count = 0;
-  int dev_idx;
-  int i = 0;
-  const char* devices[] = {"Headphone",    "The headphones jack.",
-                           "Speaker",      "The speakers.",
-                           "Mic",          "Microphone jack.",
-                           "Internal Mic", "Internal Microphones",
-                           "HDMI",         "HDMI output"};
-  const char* ids[] = {"=PlaybackPCM/Headphone/HiFi",
-                       "=JackDev/Headphone/HiFi",
-                       "=JackSwitch/Headphone/HiFi",
-                       "=CoupledMixers/Headphone/HiFi",
-
-                       "=PlaybackPCM/Speaker/HiFi",
-                       "=CoupledMixers/Speaker/HiFi",
-                       "=DependentPCM/Speaker/HiFi",
-
-                       "=CapturePCM/Mic/HiFi",
-                       "=JackDev/Mic/HiFi",
-                       "=JackSwitch/Mic/HiFi",
-                       "=CaptureMixerElem/Mic/HiFi",
-
-                       "=CapturePCM/Internal Mic/HiFi",
-                       "=CoupledMixers/Internal Mic/HiFi",
-                       "=JackSwitch/Internal Mic/HiFi",
-
-                       "=PlaybackPCM/HDMI/HiFi",
-                       "=PlaybackMixerElem/HDMI/HiFi",
-
-                       NULL};
-  const char* values[] = {
-      "hw:my-sound-card,0",
-      "my-sound-card Headset Jack",
-      "2",
-      "HP-L,HP-R",
-
-      "hw:my-sound-card,1",
-      "SPK-L,SPK-R",
-      "hw:my-sound-card,0",
-
-      "hw:my-sound-card,2",
-      "my-sound-card Headset Jack",
-      "0",
-      "CAPTURE",
-
-      "hw:my-sound-card,3",
-      "MIC-L,MIC-R",
-      "-10",
-
-      "hw:my-sound-card,4",
-      "HDMI",
-  };
-
-  ResetStubData();
-
-  fake_list["_devices/HiFi"] = devices;
-  fake_list_size["_devices/HiFi"] = ARRAY_SIZE(devices);
-
-  while (ids[i]) {
-    snd_use_case_get_value[ids[i]] = values[i];
-    i++;
-  }
-
-  sections = ucm_get_sections(mgr);
-  ASSERT_NE(sections, (struct ucm_section*)NULL);
-  DL_FOREACH (sections, section) { section_count++; }
-  EXPECT_EQ(section_count, ARRAY_SIZE(devices) / 2);
-
-  // Headphone
-  section = sections;
-  EXPECT_EQ(0, strcmp(section->pcm_name, "hw:my-sound-card,0"));
-  EXPECT_EQ(0, strcmp(section->name, "Headphone"));
-  EXPECT_EQ(0, section->dev_idx);
-  EXPECT_EQ(CRAS_STREAM_OUTPUT, section->dir);
-  EXPECT_EQ(0, strcmp(section->jack_name, values[1]));
-  EXPECT_EQ(0, strcmp(section->jack_type, "gpio"));
-  EXPECT_EQ(NULL, section->mixer_name);
-  ASSERT_NE((struct mixer_name*)NULL, section->coupled);
-  m_name = section->coupled;
-  EXPECT_EQ(0, strcmp(m_name->name, "HP-L"));
-  m_name = m_name->next;
-  EXPECT_EQ(0, strcmp(m_name->name, "HP-R"));
-  EXPECT_EQ(NULL, m_name->next);
-  EXPECT_EQ(2, section->jack_switch);
-  dev_idx = section->dev_idx;
-
-  // Speaker
-  section = section->next;
-  EXPECT_EQ(0, strcmp(section->pcm_name, "hw:my-sound-card,1"));
-  EXPECT_EQ(0, strcmp(section->name, "Speaker"));
-  EXPECT_EQ(1, section->dev_idx);
-  EXPECT_EQ(CRAS_STREAM_OUTPUT, section->dir);
-  EXPECT_EQ(NULL, section->jack_name);
-  EXPECT_EQ(NULL, section->jack_type);
-  EXPECT_EQ(-1, section->jack_switch);
-  EXPECT_EQ(NULL, section->mixer_name);
-  EXPECT_EQ(dev_idx, section->dependent_dev_idx);
-  ASSERT_NE((struct mixer_name*)NULL, section->coupled);
-  m_name = section->coupled;
-  EXPECT_EQ(0, strcmp(m_name->name, "SPK-L"));
-  m_name = m_name->next;
-  EXPECT_EQ(0, strcmp(m_name->name, "SPK-R"));
-  EXPECT_EQ(NULL, m_name->next);
-
-  // Mic
-  section = section->next;
-  EXPECT_EQ(0, strcmp(section->pcm_name, "hw:my-sound-card,2"));
-  EXPECT_EQ(0, strcmp(section->name, "Mic"));
-  EXPECT_EQ(2, section->dev_idx);
-  EXPECT_EQ(CRAS_STREAM_INPUT, section->dir);
-  EXPECT_EQ(0, strcmp(section->jack_name, values[1]));
-  EXPECT_EQ(0, strcmp(section->jack_type, "gpio"));
-  EXPECT_EQ(0, section->jack_switch);
-  ASSERT_NE((const char*)NULL, section->mixer_name);
-  EXPECT_EQ(0, strcmp(section->mixer_name, "CAPTURE"));
-  EXPECT_EQ(NULL, section->coupled);
-
-  // Internal Mic
-  section = section->next;
-  EXPECT_EQ(0, strcmp(section->pcm_name, "hw:my-sound-card,3"));
-  EXPECT_EQ(0, strcmp(section->name, "Internal Mic"));
-  EXPECT_EQ(3, section->dev_idx);
-  EXPECT_EQ(CRAS_STREAM_INPUT, section->dir);
-  EXPECT_EQ(NULL, section->jack_name);
-  EXPECT_EQ(NULL, section->jack_type);
-  EXPECT_EQ(-1, section->jack_switch);
-  EXPECT_EQ(NULL, section->mixer_name);
-  ASSERT_NE((struct mixer_name*)NULL, section->coupled);
-  m_name = section->coupled;
-  EXPECT_EQ(0, strcmp(m_name->name, "MIC-L"));
-  m_name = m_name->next;
-  EXPECT_EQ(0, strcmp(m_name->name, "MIC-R"));
-
-  // HDMI
-  section = section->next;
-  EXPECT_EQ(0, strcmp(section->pcm_name, "hw:my-sound-card,4"));
-  EXPECT_EQ(0, strcmp(section->name, "HDMI"));
-  EXPECT_EQ(4, section->dev_idx);
-  EXPECT_EQ(CRAS_STREAM_OUTPUT, section->dir);
-  EXPECT_EQ(NULL, section->jack_name);
-  EXPECT_EQ(NULL, section->jack_type);
-  EXPECT_EQ(-1, section->jack_switch);
-  ASSERT_NE((const char*)NULL, section->mixer_name);
-  EXPECT_EQ(0, strcmp(section->mixer_name, "HDMI"));
-
-  EXPECT_EQ(NULL, section->next);
-  ucm_section_free_list(sections);
-}
-
-TEST(AlsaUcm, GetSectionsMissingPCM) {
-  struct cras_use_case_mgr* mgr = &cras_ucm_mgr;
-  struct ucm_section* sections;
-  int i = 0;
-  const char* devices[] = {"Headphone", "The headphones jack."};
-  const char* ids[] = {"=JackDev/Headphone/HiFi",
-                       "=CoupledMixers/Headphone/HiFi", NULL};
-  const char* values[] = {
-      "my-sound-card Headset Jack",
-      "HP-L,HP-R",
-  };
-
-  ResetStubData();
-
-  fake_list["_devices/HiFi"] = devices;
-  fake_list_size["_devices/HiFi"] = ARRAY_SIZE(devices);
-
-  while (ids[i]) {
-    snd_use_case_get_value[ids[i]] = values[i];
-    i++;
-  }
-
-  sections = ucm_get_sections(mgr);
-  EXPECT_EQ(NULL, sections);
-}
-
-TEST(AlsaUcm, CheckUseCaseVerbs) {
-  struct cras_use_case_mgr* mgr = &cras_ucm_mgr;
-
-  /* Verifies the mapping between stream types and verbs are correct. */
-  mgr->use_case = CRAS_STREAM_TYPE_DEFAULT;
-  EXPECT_EQ(0, strcmp("HiFi", uc_verb(mgr)));
-  mgr->use_case = CRAS_STREAM_TYPE_MULTIMEDIA;
-  EXPECT_EQ(0, strcmp("Multimedia", uc_verb(mgr)));
-  mgr->use_case = CRAS_STREAM_TYPE_VOICE_COMMUNICATION;
-  EXPECT_EQ(0, strcmp("Voice Call", uc_verb(mgr)));
-  mgr->use_case = CRAS_STREAM_TYPE_SPEECH_RECOGNITION;
-  EXPECT_EQ(0, strcmp("Speech", uc_verb(mgr)));
-  mgr->use_case = CRAS_STREAM_TYPE_PRO_AUDIO;
-  EXPECT_EQ(0, strcmp("Pro Audio", uc_verb(mgr)));
-}
-
-TEST(AlsaUcm, GetAvailUseCases) {
-  struct cras_use_case_mgr* mgr;
-  const char* verbs[] = {"HiFi",       "Comment for Verb1",
-                         "Voice Call", "Comment for Verb2",
-                         "Speech",     "Comment for Verb3"};
-
-  ResetStubData();
-
-  fake_list["_verbs"] = verbs;
-  fake_list_size["_verbs"] = 6;
-
-  mgr = ucm_create("foo");
-  EXPECT_EQ(0x0D, mgr->avail_use_cases);
-  ucm_destroy(mgr);
-}
-
-TEST(AlsaUcm, SetUseCase) {
-  struct cras_use_case_mgr* mgr;
-  const char* verbs[] = {"HiFi",       "Comment for Verb1",
-                         "Voice Call", "Comment for Verb2",
-                         "Speech",     "Comment for Verb3"};
-  int rc;
-
-  ResetStubData();
-
-  fake_list["_verbs"] = verbs;
-  fake_list_size["_verbs"] = 6;
-
-  mgr = ucm_create("foo");
-  EXPECT_EQ(snd_use_case_set_param[0],
-            std::make_pair(std::string("_verb"), std::string("HiFi")));
-
-  rc = ucm_set_use_case(mgr, CRAS_STREAM_TYPE_VOICE_COMMUNICATION);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(mgr->use_case, CRAS_STREAM_TYPE_VOICE_COMMUNICATION);
-  EXPECT_EQ(snd_use_case_set_param[1],
-            std::make_pair(std::string("_verb"), std::string("Voice Call")));
-
-  /* Request unavailable use case will fail. */
-  rc = ucm_set_use_case(mgr, CRAS_STREAM_TYPE_PRO_AUDIO);
-  EXPECT_EQ(-1, rc);
-  /* cras_use_case_mgr's use case should not be changed. */
-  EXPECT_EQ(mgr->use_case, CRAS_STREAM_TYPE_VOICE_COMMUNICATION);
-  /* And snd_use_case_set not being called. */
-  EXPECT_EQ(2, snd_use_case_set_param.size());
-
-  ucm_destroy(mgr);
-}
-
-/* Stubs */
-
-extern "C" {
-
-int snd_use_case_mgr_open(snd_use_case_mgr_t** uc_mgr, const char* card_name) {
-  snd_use_case_mgr_open_called++;
-  *uc_mgr = snd_use_case_mgr_open_mgr_ptr;
-  return snd_use_case_mgr_open_return;
-}
-
-int snd_use_case_mgr_close(snd_use_case_mgr_t* uc_mgr) {
-  snd_use_case_mgr_close_called++;
-  return 0;
-}
-
-int snd_use_case_get(snd_use_case_mgr_t* uc_mgr,
-                     const char* identifier,
-                     const char** value) {
-  snd_use_case_get_called++;
-  snd_use_case_get_id.push_back(std::string(identifier));
-  if (snd_use_case_get_value.find(identifier) == snd_use_case_get_value.end()) {
-    *value = NULL;
-    return -1;
-  }
-  *value = strdup(snd_use_case_get_value[identifier].c_str());
-  return 0;
-}
-
-int snd_use_case_set(snd_use_case_mgr_t* uc_mgr,
-                     const char* identifier,
-                     const char* value) {
-  snd_use_case_set_called++;
-  snd_use_case_set_param.push_back(
-      std::make_pair(std::string(identifier), std::string(value)));
-  return snd_use_case_set_return;
-}
-
-int snd_use_case_get_list(snd_use_case_mgr_t* uc_mgr,
-                          const char* identifier,
-                          const char** list[]) {
-  *list = fake_list[identifier];
-  return fake_list_size[identifier];
-}
-
-int snd_use_case_free_list(const char* list[], int items) {
-  snd_use_case_free_list_called++;
-  return 0;
-}
-
-int snd_use_case_geti(snd_use_case_mgr_t* uc_mgr,
-                      const char* identifier,
-                      long* value) {
-  snd_use_case_geti_called++;
-  if (snd_use_case_geti_value.find(identifier) ==
-      snd_use_case_geti_value.end()) {
-    *value = 0;
-    return -1;
-  }
-  *value = snd_use_case_geti_value[identifier];
-  return 0;
-}
-
-} /* extern "C" */
-
-}  //  namespace
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  openlog(NULL, LOG_PERROR, LOG_USER);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tests/apm_list_unittest.cc b/cras/src/tests/apm_list_unittest.cc
deleted file mode 100644
index 65e712f..0000000
--- a/cras/src/tests/apm_list_unittest.cc
+++ /dev/null
@@ -1,444 +0,0 @@
-// Copyright 2018 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <gtest/gtest.h>
-#include <stdio.h>
-
-extern "C" {
-#include "cras_apm_list.h"
-#include "cras_audio_area.h"
-#include "cras_dsp_pipeline.h"
-#include "cras_iodev.h"
-#include "cras_iodev_list.h"
-#include "cras_types.h"
-#include "float_buffer.h"
-#include "webrtc_apm.h"
-}
-
-#define FILENAME_TEMPLATE "ApmTest.XXXXXX"
-
-namespace {
-
-static void* stream_ptr = reinterpret_cast<void*>(0x123);
-static void* dev_ptr = reinterpret_cast<void*>(0x345);
-static void* dev_ptr2 = reinterpret_cast<void*>(0x678);
-static struct cras_apm_list* list;
-static struct cras_audio_area fake_audio_area;
-static unsigned int dsp_util_interleave_frames;
-static unsigned int webrtc_apm_process_stream_f_called;
-static unsigned int webrtc_apm_process_reverse_stream_f_called;
-static device_enabled_callback_t device_enabled_callback_val;
-static struct ext_dsp_module* ext_dsp_module_value;
-static struct cras_ionode fake_node;
-static struct cras_iodev fake_iodev;
-static int webrtc_apm_create_called;
-static bool cras_iodev_is_aec_use_case_ret;
-static dictionary* webrtc_apm_create_aec_ini_val = NULL;
-static dictionary* webrtc_apm_create_apm_ini_val = NULL;
-
-TEST(ApmList, ApmListCreate) {
-  list = cras_apm_list_create(stream_ptr, 0);
-  EXPECT_EQ((void*)NULL, list);
-
-  list = cras_apm_list_create(stream_ptr, APM_ECHO_CANCELLATION);
-  EXPECT_NE((void*)NULL, list);
-  EXPECT_EQ(APM_ECHO_CANCELLATION, cras_apm_list_get_effects(list));
-
-  cras_apm_list_destroy(list);
-}
-
-static char* prepare_tempdir() {
-  char dirname[sizeof(FILENAME_TEMPLATE) + 1];
-  char filename[64];
-  char* tempdir;
-  FILE* fp;
-
-  strcpy(dirname, FILENAME_TEMPLATE);
-  tempdir = mkdtemp(dirname);
-  snprintf(filename, 64, "%s/apm.ini", tempdir);
-  fp = fopen(filename, "w");
-  fprintf(fp, "%s", "[foo]\n");
-  fclose(fp);
-  fp = NULL;
-  snprintf(filename, 64, "%s/aec.ini", tempdir);
-  fp = fopen(filename, "w");
-  fprintf(fp, "%s", "[bar]\n");
-  fclose(fp);
-  fp = NULL;
-  return strdup(tempdir);
-}
-
-static void delete_tempdir(char* dir) {
-  char filename[64];
-
-  snprintf(filename, 64, "%s/apm.ini", dir);
-  unlink(filename);
-  snprintf(filename, 64, "%s/aec.ini", dir);
-  unlink(filename);
-  rmdir(dir);
-}
-
-static void init_channel_layout(struct cras_audio_format* fmt) {
-  int i;
-  for (i = 0; i < CRAS_CH_MAX; i++)
-    fmt->channel_layout[i] = -1;
-}
-
-TEST(ApmList, AddApmInputDevUnuseFirstChannel) {
-  struct cras_audio_format fmt;
-  struct cras_audio_format* val;
-  struct cras_apm* apm;
-  int ch;
-  const int num_test_casts = 9;
-  int test_layouts[num_test_casts][CRAS_CH_MAX] = {
-      {0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
-      {0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1},
-      {0, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
-      {1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
-      {1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1},
-      {2, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1},
-      {2, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1},
-      {3, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1},
-      {3, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1}};
-  int test_num_channels[num_test_casts] = {1, 2, 2, 2, 2, 3, 4, 4, 4};
-
-  fmt.frame_rate = 48000;
-  fmt.format = SND_PCM_FORMAT_S16_LE;
-
-  cras_apm_list_init("");
-  list = cras_apm_list_create(stream_ptr, APM_ECHO_CANCELLATION);
-  EXPECT_NE((void*)NULL, list);
-
-  for (int i = 0; i < num_test_casts; i++) {
-    fmt.num_channels = test_num_channels[i];
-    init_channel_layout(&fmt);
-    for (ch = 0; ch < CRAS_CH_MAX; ch++)
-      fmt.channel_layout[ch] = test_layouts[i][ch];
-
-    /* Input dev is of aec use case. */
-    apm = cras_apm_list_add_apm(list, dev_ptr, &fmt, 1);
-    EXPECT_NE((void*)NULL, apm);
-
-    /* Assert that the post-processing format never has an unset
-     * first channel in the layout. */
-    bool first_channel_found_in_layout = 0;
-    val = cras_apm_list_get_format(apm);
-    for (ch = 0; ch < CRAS_CH_MAX; ch++)
-      if (0 == val->channel_layout[ch])
-        first_channel_found_in_layout = 1;
-
-    EXPECT_EQ(1, first_channel_found_in_layout);
-
-    cras_apm_list_remove_apm(list, dev_ptr);
-  }
-
-  cras_apm_list_destroy(list);
-  cras_apm_list_deinit();
-}
-
-TEST(ApmList, AddRemoveApm) {
-  struct cras_audio_format fmt;
-  char* dir;
-
-  fmt.num_channels = 2;
-  fmt.frame_rate = 48000;
-  fmt.format = SND_PCM_FORMAT_S16_LE;
-  fake_iodev.active_node = &fake_node;
-  fake_node.type = CRAS_NODE_TYPE_INTERNAL_SPEAKER;
-
-  dir = prepare_tempdir();
-  cras_apm_list_init(dir);
-  cras_iodev_is_aec_use_case_ret = 1;
-
-  list = cras_apm_list_create(stream_ptr, APM_ECHO_CANCELLATION);
-  EXPECT_NE((void*)NULL, list);
-
-  /* Input dev is of aec use case. */
-  EXPECT_NE((void*)NULL, cras_apm_list_add_apm(list, dev_ptr, &fmt, 1));
-  EXPECT_NE((void*)NULL, webrtc_apm_create_aec_ini_val);
-  EXPECT_NE((void*)NULL, webrtc_apm_create_apm_ini_val);
-  EXPECT_EQ((void*)NULL, cras_apm_list_get_active_apm(stream_ptr, dev_ptr));
-
-  cras_apm_list_start_apm(list, dev_ptr);
-  EXPECT_NE((void*)NULL, cras_apm_list_get_active_apm(stream_ptr, dev_ptr));
-  EXPECT_EQ((void*)NULL, cras_apm_list_get_active_apm(stream_ptr, dev_ptr2));
-
-  /* Input dev is not of aec use case. */
-  EXPECT_NE((void*)NULL, cras_apm_list_add_apm(list, dev_ptr2, &fmt, 0));
-  EXPECT_EQ((void*)NULL, webrtc_apm_create_aec_ini_val);
-  EXPECT_EQ((void*)NULL, webrtc_apm_create_apm_ini_val);
-  cras_apm_list_start_apm(list, dev_ptr2);
-  cras_apm_list_stop_apm(list, dev_ptr);
-
-  EXPECT_EQ((void*)NULL, cras_apm_list_get_active_apm(stream_ptr, dev_ptr));
-  EXPECT_NE((void*)NULL, cras_apm_list_get_active_apm(stream_ptr, dev_ptr2));
-
-  cras_apm_list_stop_apm(list, dev_ptr2);
-  cras_apm_list_remove_apm(list, dev_ptr);
-  cras_apm_list_remove_apm(list, dev_ptr2);
-
-  cras_apm_list_destroy(list);
-  cras_apm_list_deinit();
-  delete_tempdir(dir);
-  free(dir);
-}
-
-TEST(ApmList, OutputTypeNotAecUseCase) {
-  struct cras_audio_format fmt;
-  char* dir;
-
-  fmt.num_channels = 2;
-  fmt.frame_rate = 48000;
-  fmt.format = SND_PCM_FORMAT_S16_LE;
-  fake_iodev.active_node = &fake_node;
-
-  dir = prepare_tempdir();
-  cras_apm_list_init(dir);
-
-  list = cras_apm_list_create(stream_ptr, APM_ECHO_CANCELLATION);
-  EXPECT_NE((void*)NULL, list);
-
-  /* Output device is of aec use case. */
-  cras_iodev_is_aec_use_case_ret = 1;
-  EXPECT_NE((void*)NULL, cras_apm_list_add_apm(list, dev_ptr, &fmt, 1));
-  EXPECT_NE((void*)NULL, webrtc_apm_create_aec_ini_val);
-  EXPECT_NE((void*)NULL, webrtc_apm_create_apm_ini_val);
-  cras_apm_list_remove_apm(list, dev_ptr);
-
-  /* Output device is not of aec use case. */
-  cras_iodev_is_aec_use_case_ret = 0;
-  EXPECT_NE((void*)NULL, cras_apm_list_add_apm(list, dev_ptr, &fmt, 1));
-  EXPECT_EQ((void*)NULL, webrtc_apm_create_aec_ini_val);
-  EXPECT_EQ((void*)NULL, webrtc_apm_create_apm_ini_val);
-  cras_apm_list_remove_apm(list, dev_ptr);
-
-  cras_apm_list_destroy(list);
-  cras_apm_list_deinit();
-  delete_tempdir(dir);
-  free(dir);
-}
-
-TEST(ApmList, ApmProcessForwardBuffer) {
-  struct cras_apm* apm;
-  struct cras_audio_format fmt;
-  struct cras_audio_area* area;
-  struct float_buffer* buf;
-
-  fmt.num_channels = 2;
-  fmt.frame_rate = 48000;
-  fmt.format = SND_PCM_FORMAT_S16_LE;
-  init_channel_layout(&fmt);
-  fmt.channel_layout[CRAS_CH_FL] = 0;
-  fmt.channel_layout[CRAS_CH_FR] = 1;
-
-  cras_apm_list_init("");
-
-  list = cras_apm_list_create(stream_ptr, APM_ECHO_CANCELLATION);
-  EXPECT_NE((void*)NULL, list);
-
-  apm = cras_apm_list_add_apm(list, dev_ptr, &fmt, 1);
-
-  buf = float_buffer_create(500, 2);
-  float_buffer_written(buf, 300);
-  webrtc_apm_process_stream_f_called = 0;
-  cras_apm_list_process(apm, buf, 0);
-  EXPECT_EQ(0, webrtc_apm_process_stream_f_called);
-
-  area = cras_apm_list_get_processed(apm);
-  EXPECT_EQ(0, area->frames);
-
-  float_buffer_reset(buf);
-  float_buffer_written(buf, 200);
-  cras_apm_list_process(apm, buf, 0);
-  area = cras_apm_list_get_processed(apm);
-  EXPECT_EQ(1, webrtc_apm_process_stream_f_called);
-  EXPECT_EQ(480, dsp_util_interleave_frames);
-  EXPECT_EQ(480, area->frames);
-
-  /* Put some processed frames. Another apm_list process will not call
-   * into webrtc_apm because the processed buffer is not yet empty.
-   */
-  cras_apm_list_put_processed(apm, 200);
-  float_buffer_reset(buf);
-  float_buffer_written(buf, 500);
-  cras_apm_list_process(apm, buf, 0);
-  EXPECT_EQ(1, webrtc_apm_process_stream_f_called);
-
-  /* Put another 280 processed frames, so it's now ready for webrtc_apm
-   * to process another chunk of 480 frames (10ms) data.
-   */
-  cras_apm_list_put_processed(apm, 280);
-  cras_apm_list_process(apm, buf, 0);
-  EXPECT_EQ(2, webrtc_apm_process_stream_f_called);
-
-  float_buffer_destroy(&buf);
-  cras_apm_list_destroy(list);
-  cras_apm_list_deinit();
-}
-
-TEST(ApmList, ApmProcessReverseData) {
-  struct cras_apm* apm;
-  struct cras_audio_format fmt;
-  struct float_buffer* buf;
-  float* const* rp;
-  unsigned int nread;
-  struct cras_iodev fake_iodev;
-
-  fmt.num_channels = 2;
-  fmt.frame_rate = 48000;
-  fmt.format = SND_PCM_FORMAT_S16_LE;
-
-  fake_iodev.direction = CRAS_STREAM_OUTPUT;
-  device_enabled_callback_val = NULL;
-  ext_dsp_module_value = NULL;
-  webrtc_apm_process_reverse_stream_f_called = 0;
-
-  cras_apm_list_init("");
-  EXPECT_NE((void*)NULL, device_enabled_callback_val);
-
-  device_enabled_callback_val(&fake_iodev, NULL);
-  EXPECT_NE((void*)NULL, ext_dsp_module_value);
-  EXPECT_NE((void*)NULL, ext_dsp_module_value->ports);
-
-  buf = float_buffer_create(500, 2);
-  float_buffer_written(buf, 500);
-  nread = 500;
-  rp = float_buffer_read_pointer(buf, 0, &nread);
-
-  for (int i = 0; i < buf->num_channels; i++)
-    ext_dsp_module_value->ports[i] = rp[i];
-
-  ext_dsp_module_value->configure(ext_dsp_module_value, 800, 2, 48000);
-  ext_dsp_module_value->run(ext_dsp_module_value, 500);
-  EXPECT_EQ(0, webrtc_apm_process_reverse_stream_f_called);
-
-  list = cras_apm_list_create(stream_ptr, APM_ECHO_CANCELLATION);
-  EXPECT_NE((void*)NULL, list);
-
-  apm = cras_apm_list_add_apm(list, dev_ptr, &fmt, 1);
-  cras_apm_list_start_apm(list, dev_ptr);
-
-  ext_dsp_module_value->run(ext_dsp_module_value, 250);
-  EXPECT_EQ(0, webrtc_apm_process_reverse_stream_f_called);
-
-  ext_dsp_module_value->run(ext_dsp_module_value, 250);
-  EXPECT_EQ(1, webrtc_apm_process_reverse_stream_f_called);
-
-  float_buffer_destroy(&buf);
-  cras_apm_list_destroy(list);
-  cras_apm_list_deinit();
-}
-
-TEST(ApmList, StreamAddToAlreadyOpenedDev) {
-  struct cras_audio_format fmt;
-  struct cras_apm *apm1, *apm2;
-
-  fmt.num_channels = 2;
-  fmt.frame_rate = 48000;
-  fmt.format = SND_PCM_FORMAT_S16_LE;
-
-  cras_apm_list_init("");
-
-  webrtc_apm_create_called = 0;
-  list = cras_apm_list_create(stream_ptr, APM_ECHO_CANCELLATION);
-  EXPECT_NE((void*)NULL, list);
-
-  apm1 = cras_apm_list_add_apm(list, dev_ptr, &fmt, 1);
-  EXPECT_EQ(1, webrtc_apm_create_called);
-  EXPECT_NE((void*)NULL, apm1);
-
-  apm2 = cras_apm_list_add_apm(list, dev_ptr, &fmt, 1);
-  EXPECT_EQ(1, webrtc_apm_create_called);
-  EXPECT_EQ(apm1, apm2);
-
-  cras_apm_list_destroy(list);
-  cras_apm_list_deinit();
-}
-
-extern "C" {
-int cras_iodev_list_set_device_enabled_callback(
-    device_enabled_callback_t enabled_cb,
-    device_disabled_callback_t disabled_cb,
-    void* cb_data) {
-  device_enabled_callback_val = enabled_cb;
-  return 0;
-}
-struct cras_iodev* cras_iodev_list_get_first_enabled_iodev(
-    enum CRAS_STREAM_DIRECTION direction) {
-  return &fake_iodev;
-}
-void cras_iodev_set_ext_dsp_module(struct cras_iodev* iodev,
-                                   struct ext_dsp_module* ext) {
-  ext_dsp_module_value = ext;
-}
-bool cras_iodev_is_aec_use_case(const struct cras_ionode* node) {
-  return cras_iodev_is_aec_use_case_ret;
-}
-struct cras_audio_area* cras_audio_area_create(int num_channels) {
-  return &fake_audio_area;
-}
-
-void cras_audio_area_destroy(struct cras_audio_area* area) {}
-void cras_audio_area_config_channels(struct cras_audio_area* area,
-                                     const struct cras_audio_format* fmt) {}
-void cras_audio_area_config_buf_pointers(struct cras_audio_area* area,
-                                         const struct cras_audio_format* fmt,
-                                         uint8_t* base_buffer) {}
-void dsp_util_interleave(float* const* input,
-                         int16_t* output,
-                         int channels,
-                         snd_pcm_format_t format,
-                         int frames) {
-  dsp_util_interleave_frames = frames;
-}
-struct aec_config* aec_config_get(const char* device_config_dir) {
-  return NULL;
-}
-void aec_config_dump(struct aec_config* config) {}
-struct apm_config* apm_config_get(const char* device_config_dir) {
-  return NULL;
-}
-void apm_config_dump(struct apm_config* config) {}
-webrtc_apm webrtc_apm_create(unsigned int num_channels,
-                             unsigned int frame_rate,
-                             dictionary* aec_ini,
-                             dictionary* apm_ini) {
-  webrtc_apm_create_called++;
-  webrtc_apm_create_aec_ini_val = aec_ini;
-  webrtc_apm_create_apm_ini_val = apm_ini;
-  return reinterpret_cast<webrtc_apm>(0x11);
-}
-void webrtc_apm_dump_configs(dictionary* aec_ini, dictionary* apm_ini) {}
-void webrtc_apm_destroy(webrtc_apm apm) {
-  return;
-}
-int webrtc_apm_process_stream_f(webrtc_apm ptr,
-                                int num_channels,
-                                int rate,
-                                float* const* data) {
-  webrtc_apm_process_stream_f_called++;
-  return 0;
-}
-
-int webrtc_apm_process_reverse_stream_f(webrtc_apm ptr,
-                                        int num_channels,
-                                        int rate,
-                                        float* const* data) {
-  webrtc_apm_process_reverse_stream_f_called++;
-  return 0;
-}
-int webrtc_apm_aec_dump(webrtc_apm ptr,
-                        void** work_queue,
-                        int start,
-                        FILE* handle) {
-  return 0;
-}
-
-}  // extern "C"
-}  // namespace
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tests/array_unittest.cc b/cras/src/tests/array_unittest.cc
deleted file mode 100644
index e95cd71..0000000
--- a/cras/src/tests/array_unittest.cc
+++ /dev/null
@@ -1,116 +0,0 @@
-// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "array.h"
-
-#include <gtest/gtest.h>
-
-namespace {
-
-struct point {
-  int x, y;
-};
-
-DECLARE_ARRAY_TYPE(double, double_array);
-DECLARE_ARRAY_TYPE(struct point, point_array);
-
-TEST(ArrayTest, Basic) {
-  double_array a = ARRAY_INIT;
-
-  /* create an array {1.0, 2.0} */
-  ARRAY_APPEND(&a, 1.0);
-  double* p = ARRAY_APPEND_ZERO(&a);
-  EXPECT_EQ(0.0, *p);
-  *p = 2.0;
-
-  EXPECT_EQ(2, ARRAY_COUNT(&a));
-  EXPECT_EQ(2, a.count);
-  EXPECT_GE(a.size, 2);
-  EXPECT_EQ(1.0, *ARRAY_ELEMENT(&a, 0));
-  EXPECT_EQ(2.0, *ARRAY_ELEMENT(&a, 1));
-  EXPECT_EQ(1.0, a.element[0]);
-  EXPECT_EQ(2.0, a.element[1]);
-  EXPECT_EQ(0, ARRAY_FIND(&a, 1.0));
-  EXPECT_EQ(1, ARRAY_FIND(&a, 2.0));
-  EXPECT_EQ(-1, ARRAY_FIND(&a, 0.0));
-  EXPECT_EQ(0, ARRAY_INDEX(&a, ARRAY_ELEMENT(&a, 0)));
-  EXPECT_EQ(1, ARRAY_INDEX(&a, ARRAY_ELEMENT(&a, 1)));
-
-  ARRAY_FREE(&a);
-  EXPECT_EQ(0, ARRAY_COUNT(&a));
-  EXPECT_EQ(0, a.count);
-  EXPECT_EQ(0, a.size);
-  EXPECT_EQ(NULL, a.element);
-}
-
-TEST(ArrayTest, StructElement) {
-  struct point p = {1, 2};
-  struct point q = {3, 4};
-  point_array a = ARRAY_INIT;
-
-  ARRAY_APPEND(&a, p);
-  ARRAY_APPEND(&a, q);
-
-  EXPECT_EQ(2, ARRAY_COUNT(&a));
-  EXPECT_EQ(1, ARRAY_ELEMENT(&a, 0)->x);
-  EXPECT_EQ(2, ARRAY_ELEMENT(&a, 0)->y);
-  EXPECT_EQ(3, a.element[1].x);
-  EXPECT_EQ(4, a.element[1].y);
-  ARRAY_ELEMENT(&a, 1)->y = 5;
-  EXPECT_EQ(5, a.element[1].y);
-
-  ARRAY_FREE(&a);
-  EXPECT_EQ(0, ARRAY_COUNT(&a));
-  EXPECT_EQ(0, a.size);
-  EXPECT_EQ(NULL, a.element);
-}
-
-TEST(ArrayTest, AppendZeroStruct) {
-  point_array a = ARRAY_INIT;
-  struct point *p, *q;
-
-  p = ARRAY_APPEND_ZERO(&a);
-  EXPECT_EQ(0, p->x);
-  EXPECT_EQ(0, p->y);
-  EXPECT_EQ(1, a.count);
-
-  q = ARRAY_APPEND_ZERO(&a);
-  EXPECT_EQ(0, q->x);
-  EXPECT_EQ(0, q->y);
-  EXPECT_EQ(2, a.count);
-
-  ARRAY_FREE(&a);
-}
-
-TEST(ArrayTest, ForLoop) {
-  int i;
-  double* p;
-  double_array a = ARRAY_INIT;
-
-  for (i = 0; i < 100; i++) {
-    ARRAY_APPEND(&a, i * 2);
-  }
-
-  int expectedIndex = 0;
-  double expectedValue = 0;
-  ARRAY_ELEMENT_FOREACH (&a, i, p) {
-    EXPECT_EQ(expectedIndex, i);
-    EXPECT_EQ(expectedValue, *p);
-    expectedIndex++;
-    expectedValue += 2;
-  }
-  EXPECT_EQ(expectedIndex, 100);
-
-  ARRAY_FREE(&a);
-  EXPECT_EQ(0, a.count);
-  EXPECT_EQ(0, a.size);
-  EXPECT_EQ(NULL, a.element);
-}
-
-}  //  namespace
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tests/audio_area_unittest.cc b/cras/src/tests/audio_area_unittest.cc
deleted file mode 100644
index 091d8de..0000000
--- a/cras/src/tests/audio_area_unittest.cc
+++ /dev/null
@@ -1,340 +0,0 @@
-// Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <gtest/gtest.h>
-#include <stdio.h>
-
-extern "C" {
-#include "cras_audio_area.h"
-#include "cras_audio_format.h"
-}
-
-static const int8_t stereo[CRAS_CH_MAX] = {
-    0, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-};
-static const int8_t mono[CRAS_CH_MAX] = {
-    -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1,
-};
-static const int8_t kb_mic[CRAS_CH_MAX] = {
-    0, 1, -1, -1, 2, -1, -1, -1, -1, -1, -1,
-};
-
-static uint16_t buf1[32];
-static uint16_t buf2[32];
-struct cras_audio_area* a1;
-struct cras_audio_area* a2;
-
-namespace {
-
-TEST(AudioArea, CopyAudioArea) {
-  struct cras_audio_format fmt;
-  int i;
-
-  fmt.num_channels = 2;
-  fmt.format = SND_PCM_FORMAT_S16_LE;
-  for (i = 0; i < CRAS_CH_MAX; i++)
-    fmt.channel_layout[i] = stereo[i];
-
-  a1 = cras_audio_area_create(2);
-  a2 = cras_audio_area_create(2);
-  cras_audio_area_config_channels(a1, &fmt);
-  cras_audio_area_config_channels(a2, &fmt);
-  cras_audio_area_config_buf_pointers(a1, &fmt, (uint8_t*)buf1);
-  cras_audio_area_config_buf_pointers(a2, &fmt, (uint8_t*)buf2);
-  a1->frames = 16;
-  a2->frames = 16;
-
-  memset(buf1, 0, 32 * 2);
-  for (i = 0; i < 32; i++)
-    buf2[i] = rand();
-  cras_audio_area_copy(a1, 0, &fmt, a2, 0, 1.0);
-  for (i = 0; i < 32; i++)
-    EXPECT_EQ(buf1[i], buf2[i]);
-
-  cras_audio_area_destroy(a1);
-  cras_audio_area_destroy(a2);
-}
-
-TEST(AudioArea, CopyAudioAreaWithGain) {
-  struct cras_audio_format fmt;
-  int i;
-  /* Check a gain of 10x can be applied. */
-  float gain_scaler = 10.0f;
-
-  fmt.num_channels = 2;
-  fmt.format = SND_PCM_FORMAT_S16_LE;
-  for (i = 0; i < CRAS_CH_MAX; i++)
-    fmt.channel_layout[i] = stereo[i];
-
-  a1 = cras_audio_area_create(2);
-  a2 = cras_audio_area_create(2);
-  cras_audio_area_config_channels(a1, &fmt);
-  cras_audio_area_config_channels(a2, &fmt);
-  cras_audio_area_config_buf_pointers(a1, &fmt, (uint8_t*)buf1);
-  cras_audio_area_config_buf_pointers(a2, &fmt, (uint8_t*)buf2);
-  a1->frames = 16;
-  a2->frames = 16;
-
-  memset(buf1, 0, 32 * 2);
-  /* Let src has some samples smaller than 32768/10 and some samples larger than
-   * 32768/10 to test clipping. */
-  for (i = 0; i < 16; i++)
-    buf2[i] = rand() % 3270;
-  for (i = 17; i < 32; i++)
-    buf2[i] = 3280 + rand() % 3200;
-  cras_audio_area_copy(a1, 0, &fmt, a2, 0, gain_scaler);
-  for (i = 0; i < 32; i++) {
-    int32_t expected_value = buf2[i] * gain_scaler;
-    if (expected_value > INT16_MAX)
-      expected_value = INT16_MAX;
-    EXPECT_EQ(buf1[i], expected_value);
-  }
-
-  cras_audio_area_destroy(a1);
-  cras_audio_area_destroy(a2);
-}
-TEST(AudioArea, CopyAudioAreaOffset) {
-  struct cras_audio_format fmt;
-  int i;
-
-  fmt.num_channels = 2;
-  fmt.format = SND_PCM_FORMAT_S16_LE;
-  for (i = 0; i < CRAS_CH_MAX; i++)
-    fmt.channel_layout[i] = stereo[i];
-
-  a1 = cras_audio_area_create(2);
-  a2 = cras_audio_area_create(2);
-  cras_audio_area_config_channels(a1, &fmt);
-  cras_audio_area_config_channels(a2, &fmt);
-  cras_audio_area_config_buf_pointers(a1, &fmt, (uint8_t*)buf1);
-  cras_audio_area_config_buf_pointers(a2, &fmt, (uint8_t*)buf2);
-  a1->frames = 16;
-  a2->frames = 14;
-
-  memset(buf1, 0, 32 * 2);
-  for (i = 0; i < 32; i++)
-    buf2[i] = rand();
-  cras_audio_area_copy(a1, 2, &fmt, a2, 0, 1.0);
-  EXPECT_EQ(buf1[0], 0);
-  EXPECT_EQ(buf1[1], 0);
-  EXPECT_EQ(buf1[2], 0);
-  EXPECT_EQ(buf1[3], 0);
-  for (i = 4; i < 32; i++)
-    EXPECT_EQ(buf1[i], buf2[i - 4]);
-
-  cras_audio_area_destroy(a1);
-  cras_audio_area_destroy(a2);
-}
-
-TEST(AudioArea, CopyAudioAreaOffsetLimit) {
-  struct cras_audio_format fmt;
-  int i;
-
-  fmt.num_channels = 2;
-  fmt.format = SND_PCM_FORMAT_S16_LE;
-  for (i = 0; i < CRAS_CH_MAX; i++)
-    fmt.channel_layout[i] = stereo[i];
-
-  a1 = cras_audio_area_create(2);
-  a2 = cras_audio_area_create(2);
-  cras_audio_area_config_channels(a1, &fmt);
-  cras_audio_area_config_channels(a2, &fmt);
-  cras_audio_area_config_buf_pointers(a1, &fmt, (uint8_t*)buf1);
-  cras_audio_area_config_buf_pointers(a2, &fmt, (uint8_t*)buf2);
-  a1->frames = 14;
-  a2->frames = 14;
-
-  memset(buf1, 0, 32 * 2);
-  for (i = 0; i < 32; i++)
-    buf2[i] = rand();
-  cras_audio_area_copy(a1, 2, &fmt, a2, 0, 1.0);
-  EXPECT_EQ(buf1[0], 0);
-  EXPECT_EQ(buf1[1], 0);
-  EXPECT_EQ(buf1[2], 0);
-  EXPECT_EQ(buf1[3], 0);
-  for (i = 4; i < 28; i++)
-    EXPECT_EQ(buf1[i], buf2[i - 4]);
-  EXPECT_EQ(buf1[28], 0);
-  EXPECT_EQ(buf1[29], 0);
-  EXPECT_EQ(buf1[30], 0);
-  EXPECT_EQ(buf1[31], 0);
-
-  cras_audio_area_destroy(a1);
-  cras_audio_area_destroy(a2);
-}
-
-TEST(AudioArea, CopyMonoToStereo) {
-  struct cras_audio_format dst_fmt;
-  struct cras_audio_format src_fmt;
-  int i;
-
-  dst_fmt.num_channels = 2;
-  dst_fmt.format = SND_PCM_FORMAT_S16_LE;
-  for (i = 0; i < CRAS_CH_MAX; i++)
-    dst_fmt.channel_layout[i] = stereo[i];
-  a1 = cras_audio_area_create(2);
-  a1->frames = 16;
-  cras_audio_area_config_channels(a1, &dst_fmt);
-  cras_audio_area_config_buf_pointers(a1, &dst_fmt, (uint8_t*)buf1);
-
-  src_fmt.num_channels = 1;
-  src_fmt.format = SND_PCM_FORMAT_S16_LE;
-  for (i = 0; i < CRAS_CH_MAX; i++)
-    src_fmt.channel_layout[i] = mono[i];
-  a2 = cras_audio_area_create(1);
-  a2->frames = 16;
-  cras_audio_area_config_channels(a2, &src_fmt);
-  cras_audio_area_config_buf_pointers(a2, &src_fmt, (uint8_t*)buf2);
-
-  memset(buf1, 0, 32 * 2);
-  for (i = 0; i < 32; i++)
-    buf2[i] = rand();
-  cras_audio_area_copy(a1, 0, &dst_fmt, a2, 0, 1.0);
-  for (i = 0; i < 16; i++) {
-    EXPECT_EQ(buf1[i * 2], buf2[i]);
-    EXPECT_EQ(buf1[i * 2 + 1], buf2[i]);
-  }
-
-  cras_audio_area_destroy(a1);
-  cras_audio_area_destroy(a2);
-}
-
-TEST(AudioArea, CopyStereoToMono) {
-  struct cras_audio_format fmt;
-  int i;
-
-  fmt.num_channels = 1;
-  fmt.format = SND_PCM_FORMAT_S16_LE;
-  for (i = 0; i < CRAS_CH_MAX; i++)
-    fmt.channel_layout[i] = mono[i];
-  a1 = cras_audio_area_create(1);
-  a1->frames = 16;
-  cras_audio_area_config_channels(a1, &fmt);
-  cras_audio_area_config_buf_pointers(a1, &fmt, (uint8_t*)buf1);
-
-  fmt.num_channels = 2;
-  for (i = 0; i < CRAS_CH_MAX; i++)
-    fmt.channel_layout[i] = stereo[i];
-  a2 = cras_audio_area_create(2);
-  a2->frames = 16;
-  cras_audio_area_config_channels(a2, &fmt);
-  cras_audio_area_config_buf_pointers(a2, &fmt, (uint8_t*)buf2);
-
-  memset(buf1, 0, 32 * 2);
-  for (i = 0; i < 32; i++)
-    buf2[i] = rand() % 10000;
-  cras_audio_area_copy(a1, 0, &fmt, a2, 0, 1.0);
-  for (i = 0; i < 16; i++)
-    EXPECT_EQ(buf1[i], buf2[i * 2] + buf2[i * 2 + 1]);
-
-  cras_audio_area_destroy(a1);
-  cras_audio_area_destroy(a2);
-}
-
-TEST(AudioArea, KeyboardMicCopyStereo) {
-  struct cras_audio_format fmt;
-  int i;
-
-  fmt.num_channels = 3;
-  fmt.format = SND_PCM_FORMAT_S16_LE;
-  for (i = 0; i < CRAS_CH_MAX; i++)
-    fmt.channel_layout[i] = kb_mic[i];
-  a1 = cras_audio_area_create(3);
-  a1->frames = 10;
-  cras_audio_area_config_channels(a1, &fmt);
-  cras_audio_area_config_buf_pointers(a1, &fmt, (uint8_t*)buf1);
-
-  fmt.num_channels = 2;
-  for (i = 0; i < CRAS_CH_MAX; i++)
-    fmt.channel_layout[i] = stereo[i];
-  a2 = cras_audio_area_create(2);
-  a2->frames = 10;
-  cras_audio_area_config_channels(a2, &fmt);
-  cras_audio_area_config_buf_pointers(a2, &fmt, (uint8_t*)buf2);
-
-  memset(buf1, 0, 32 * 2);
-  for (i = 0; i < 32; i++)
-    buf2[i] = rand();
-  cras_audio_area_copy(a1, 0, &fmt, a2, 0, 1.0);
-  for (i = 0; i < 10; i++) {
-    EXPECT_EQ(buf1[i * 3], buf2[i * 2]);
-    EXPECT_EQ(buf1[i * 3 + 1], buf2[i * 2 + 1]);
-    EXPECT_EQ(buf1[i * 3 + 2], 0);
-  }
-
-  cras_audio_area_destroy(a1);
-  cras_audio_area_destroy(a2);
-}
-
-TEST(AudioArea, KeyboardMicCopyFrontCenter) {
-  struct cras_audio_format dst_fmt;
-  struct cras_audio_format src_fmt;
-  int i;
-
-  dst_fmt.num_channels = 3;
-  dst_fmt.format = SND_PCM_FORMAT_S16_LE;
-  for (i = 0; i < CRAS_CH_MAX; i++)
-    dst_fmt.channel_layout[i] = kb_mic[i];
-  a1 = cras_audio_area_create(3);
-  a1->frames = 10;
-  cras_audio_area_config_channels(a1, &dst_fmt);
-  cras_audio_area_config_buf_pointers(a1, &dst_fmt, (uint8_t*)buf1);
-
-  /* Test 2 channels area with only front center in layout. */
-  src_fmt.num_channels = 2;
-  src_fmt.format = SND_PCM_FORMAT_S16_LE;
-  for (i = 0; i < CRAS_CH_MAX; i++)
-    src_fmt.channel_layout[i] = -1;
-  src_fmt.channel_layout[CRAS_CH_FC] = 0;
-  a2 = cras_audio_area_create(2);
-  a2->frames = 10;
-  cras_audio_area_config_channels(a2, &src_fmt);
-  cras_audio_area_config_buf_pointers(a2, &src_fmt, (uint8_t*)buf2);
-
-  memset(buf1, 0, 32 * 2);
-  for (i = 0; i < 32; i++)
-    buf2[i] = rand();
-  cras_audio_area_copy(a1, 0, &dst_fmt, a2, 0, 1.0);
-  for (i = 0; i < 10; i++) {
-    EXPECT_EQ(buf1[i * 3], 0);
-    EXPECT_EQ(buf1[i * 3 + 1], 0);
-    EXPECT_EQ(buf1[i * 3 + 2], buf2[i * 2]);
-  }
-
-  cras_audio_area_destroy(a1);
-  cras_audio_area_destroy(a2);
-}
-
-}  //  namespace
-
-extern "C" {
-
-void cras_mix_add_scale_stride(snd_pcm_format_t fmt,
-                               uint8_t* dst,
-                               uint8_t* src,
-                               unsigned int count,
-                               unsigned int dst_stride,
-                               unsigned int src_stride,
-                               float scaler) {
-  unsigned int i;
-
-  for (i = 0; i < count; i++) {
-    int32_t sum;
-    sum = *(int16_t*)dst + *(int16_t*)src * scaler;
-    if (sum > INT16_MAX)
-      sum = INT16_MAX;
-    else if (sum < INT16_MIN)
-      sum = INT16_MIN;
-    *(int16_t*)dst = sum;
-    dst += dst_stride;
-    src += src_stride;
-  }
-}
-
-}  //  extern "C"
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tests/audio_format_unittest.cc b/cras/src/tests/audio_format_unittest.cc
deleted file mode 100644
index f03f687..0000000
--- a/cras/src/tests/audio_format_unittest.cc
+++ /dev/null
@@ -1,102 +0,0 @@
-// Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <gtest/gtest.h>
-
-extern "C" {
-// Test static functions
-#include "cras_audio_format.c"
-}
-
-namespace {
-
-class ChannelConvMtxTestSuite : public testing::Test {
- protected:
-  virtual void SetUp() {
-    int i;
-    in_fmt = cras_audio_format_create(SND_PCM_FORMAT_S16_LE, 44100, 6);
-    out_fmt = cras_audio_format_create(SND_PCM_FORMAT_S16_LE, 44100, 6);
-    for (i = 0; i < CRAS_CH_MAX; i++) {
-      in_fmt->channel_layout[i] = -1;
-      out_fmt->channel_layout[i] = -1;
-    }
-  }
-
-  virtual void TearDown() {
-    cras_audio_format_destroy(in_fmt);
-    cras_audio_format_destroy(out_fmt);
-    if (conv_mtx)
-      cras_channel_conv_matrix_destroy(conv_mtx, 6);
-  }
-
-  struct cras_audio_format* in_fmt;
-  struct cras_audio_format* out_fmt;
-  float** conv_mtx;
-};
-
-TEST_F(ChannelConvMtxTestSuite, MatrixCreateSuccess) {
-  in_fmt->channel_layout[0] = 5;
-  in_fmt->channel_layout[1] = 4;
-  in_fmt->channel_layout[2] = 3;
-  in_fmt->channel_layout[3] = 2;
-  in_fmt->channel_layout[4] = 1;
-  in_fmt->channel_layout[5] = 0;
-
-  out_fmt->channel_layout[0] = 0;
-  out_fmt->channel_layout[1] = 1;
-  out_fmt->channel_layout[2] = 2;
-  out_fmt->channel_layout[3] = 3;
-  out_fmt->channel_layout[4] = 4;
-  out_fmt->channel_layout[5] = 5;
-
-  conv_mtx = cras_channel_conv_matrix_create(in_fmt, out_fmt);
-  ASSERT_NE(conv_mtx, (void*)NULL);
-}
-
-TEST_F(ChannelConvMtxTestSuite, MatrixCreateFail) {
-  in_fmt->channel_layout[0] = 5;
-  in_fmt->channel_layout[1] = 4;
-  in_fmt->channel_layout[2] = 3;
-  in_fmt->channel_layout[3] = 2;
-  in_fmt->channel_layout[4] = 1;
-  in_fmt->channel_layout[5] = 0;
-
-  out_fmt->channel_layout[0] = 0;
-  out_fmt->channel_layout[1] = 1;
-  out_fmt->channel_layout[2] = 2;
-  out_fmt->channel_layout[3] = 3;
-  out_fmt->channel_layout[4] = 4;
-  out_fmt->channel_layout[7] = 5;
-
-  conv_mtx = cras_channel_conv_matrix_create(in_fmt, out_fmt);
-  ASSERT_EQ(conv_mtx, (void*)NULL);
-}
-
-TEST_F(ChannelConvMtxTestSuite, SLSRToRRRL) {
-  in_fmt->channel_layout[0] = 0;
-  in_fmt->channel_layout[1] = 1;
-  in_fmt->channel_layout[4] = 2;
-  in_fmt->channel_layout[5] = 3;
-  /* Input format uses SL and SR*/
-  in_fmt->channel_layout[6] = 4;
-  in_fmt->channel_layout[7] = 5;
-
-  out_fmt->channel_layout[0] = 0;
-  out_fmt->channel_layout[1] = 1;
-  /* Output format uses RR and RR */
-  out_fmt->channel_layout[2] = 4;
-  out_fmt->channel_layout[3] = 5;
-  out_fmt->channel_layout[4] = 2;
-  out_fmt->channel_layout[5] = 3;
-
-  conv_mtx = cras_channel_conv_matrix_create(in_fmt, out_fmt);
-  ASSERT_NE(conv_mtx, (void*)NULL);
-}
-
-}  // namespace
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tests/audio_test_gui.py b/cras/src/tests/audio_test_gui.py
deleted file mode 100644
index 6ee401b..0000000
--- a/cras/src/tests/audio_test_gui.py
+++ /dev/null
@@ -1,266 +0,0 @@
-#!/usr/bin/env python
-#
-# Copyright 2016 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""Script functions as a web app and wrapper for the cras_router program."""
-
-import re
-import subprocess
-import logging
-import cherrypy
-
-# Node Format: [Stable_Id, ID, Vol, Plugged, L/R_swapped, Time, Type, Name]
-ID_INDEX = 1
-PLUGGED_INDEX = 3
-TYPE_INDEX = 6
-NAME_INDEX = 7
-
-
-def get_plugged_nodes(plugged_nodes, lines, is_input):
-  start_str = 'Input Nodes:' if is_input else 'Output Nodes:'
-  end_str = 'Attached clients:' if is_input else 'Input Devices:'
-  for i in range(lines.index(start_str) + 2,
-                 lines.index(end_str)):
-    node = filter(None, re.split(r'\s+|\*+', lines[i]))
-    # check for nodes that are plugged nodes and loopback
-    if node[PLUGGED_INDEX] == 'yes' and node[TYPE_INDEX][:4] != 'POST':
-      key = node[TYPE_INDEX] + ' ' + node[NAME_INDEX]
-      plugged_nodes[key] = node[ID_INDEX]
-
-
-class CrasRouterTest(object):
-  """Cherrypy class that builds and runs the HTML for audio testing tool."""
-
-  @cherrypy.expose
-  def index(self):
-    """Builds up and displays the html for the audio testing tool.
-
-    Returns:
-      html that was built up based on plugged audio devices.
-    """
-
-    # Stop program if currently being run.
-    if 'process' in cherrypy.session:
-      print 'Existing process'
-      # If return code is None process is still running
-      if cherrypy.session['process'].poll() is None:
-        print 'Killing existing process'
-        cherrypy.session['process'].kill()
-      else:
-        print 'Process already finished'
-
-    html = """<html>
-              <head>
-                <title>Audio Test</title>
-              </head>
-              <body style="background-color:lightgrey;">
-                <font color="red">
-                <h1>Audio Closed Loop Test</h1>
-                <font style="color:rgb(100, 149, 237)">
-                <h3>
-                <form name="routerOptions" method="get"
-                onsubmit="return validateForm()" action="start_test">
-                  <h2>Input Type</h2>
-              """
-    dump = subprocess.check_output(['cras_test_client', '--dump_s'])
-    if not dump:
-      return 'Could not connect to server'
-    dump_lines = dump.split('\n')
-    input_plugged_nodes = {}
-    get_plugged_nodes(input_plugged_nodes, dump_lines, True)
-    for name, node_id in input_plugged_nodes.items():
-      line = '<input type ="radio" name="input_type" value="'
-      line += node_id + '">' +name + '<br>\n'
-      html += line
-
-    html += """<input type ="radio" id="i0" name="input_type"
-               value="file">File<br>
-                 <div id="input_file" style="display:none;">
-                 Filename <input type="text" name="input_file"><br><br>
-                 </div>
-               <h2>Output Type</h2>"""
-    output_plugged_nodes = {}
-    get_plugged_nodes(output_plugged_nodes, dump_lines, False)
-    for name, node_id in output_plugged_nodes.items():
-      line = '<input type ="radio" name="output_type" value="'
-      line = line + node_id + '">' +name + '<br>\n'
-      html += line
-
-    html += """<input type ="radio" name="output_type"
-               value="file">File<br>
-               <div id="output_file" style="display:none;">
-               Filename <input type="text" name="output_file">
-               </div><br>
-               <h2>Sample Rate</h2>
-               <input type="radio" name="rate" id="sample_rate1" value=48000
-               checked>48,000 Hz<br>
-               <input type="radio" name="rate" id="sample_rate0" value=44100>
-               44,100 Hz<br><br>
-               <button type="submit" onclick="onOff(this)">Test!</button>
-               </h3>
-               </form>
-               </font>
-               </body>
-               </html>
-               """
-    javascript = """
-                 <script>
-                 /* Does basic error checking to make sure user doesn't
-                  * give bad options to the router.
-                  */
-                 function validateForm(){
-                    var input_type =
-                        document.forms['routerOptions']['input_type'].value;
-                    var output_type =
-                        document.forms['routerOptions']['output_type'].value;
-                    if (input_type == '' || output_type == '') {
-                        alert('Please select an input and output type.');
-                        return false;
-                    }
-                    if (input_type == 'file' && output_type == 'file') {
-                        alert('Input and Output Types cannot both be files!');
-                        return false;
-                    }
-                    //check if filename is valid
-                    if (input_type == 'file') {
-                        var input_file =
-                          document.forms['routerOptions']['input_file'].value;
-                        if (input_file == '') {
-                            alert('Please enter a file name');
-                            return false;
-                        }
-                    }
-                    if (output_type == 'file') {
-                        var output_file =
-                          document.forms['routerOptions']['output_file'].value;
-                        if (output_file == '') {
-                            alert('Please enter a file name');
-                            return false;
-                        }
-                    }
-                }
-
-                function show_filename(radio, file_elem) {
-                    for(var i =0; i < radio.length; i++){
-                        radio[i].onclick = function(){
-                            if (this.value == 'file') {
-                                file_elem.style.display = 'block';
-                            } else {
-                                file_elem.style.display = 'none';
-                            }
-                        }
-                    }
-                }
-                /* Loops determine if filename field should be shown */
-                var input_type_rad =
-                    document.forms['routerOptions']['input_type'];
-                var input_file_elem =
-                    document.getElementById('input_file');
-                var output_type_rad =
-                    document.forms['routerOptions']['output_type'];
-                var output_file_elem =
-                    document.getElementById('output_file');
-                show_filename(input_type_rad, input_file_elem);
-                show_filename(output_type_rad, output_file_elem);
-                </script>"""
-    html += javascript
-    return html
-
-  @cherrypy.expose
-  def start_test(self, input_type, output_type, input_file='',
-                 output_file='', rate=48000):
-    """Capture audio from the input_type and plays it back to the output_type.
-
-    Args:
-      input_type: Node id for the selected input or 'file' for files
-      output_type: Node id for the selected output or 'file' for files
-      input_file: Path of the input if 'file' is input type
-      output_file: Path of the output if 'file' is output type
-      rate: Sample rate for the test.
-
-    Returns:
-      html for the tesing in progress page.
-    """
-    print 'Beginning test'
-    if input_type == 'file' or output_type == 'file':
-        command = ['cras_test_client']
-    else:
-        command = ['cras_router']
-    if input_type == 'file':
-      command.append('--playback_file')
-      command.append(str(input_file))
-    else:
-      set_input = ['cras_test_client', '--select_input', str(input_type)]
-      if subprocess.check_call(set_input):
-        print 'Error setting input'
-    if output_type == 'file':
-      command.append('--capture_file')
-      command.append(str(output_file))
-    else:
-      set_output = ['cras_test_client', '--select_output', str(output_type)]
-      if subprocess.check_call(set_output):
-        print 'Error setting output'
-    command.append('--rate')
-    command.append(str(rate))
-    print 'Running commmand: ' + str(command)
-    p = subprocess.Popen(command)
-    cherrypy.session['process'] = p
-    return """
-    <html>
-    <head>
-    <style type="text/css">
-    body {
-      background-color: #DC143C;
-    }
-    #test {
-      color: white;
-      text-align: center;
-    }
-    </style>
-      <title>Running test</title>
-    </head>
-    <body>
-      <div id="test">
-        <h1>Test in progress</h1>
-        <form action="index"><!--Go back to orginal page-->
-          <button type="submit" id="stop">Click to stop</button>
-        </form>
-        <h2>Time Elapsed<br>
-            <time id="elapsed_time">00:00</time>
-        </h2>
-        </div>
-    </body>
-    </html>
-    <script type="text/javascript">
-    var seconds = 0;
-    var minutes = 0;
-    var elapsed_time;
-    var start_time = new Date().getTime();
-    function secondPassed(){
-      var time = new Date().getTime() - start_time;
-      elapsed_time = Math.floor(time / 100) / 10;
-      minutes = Math.floor(elapsed_time / 60);
-      seconds = Math.floor(elapsed_time % 60);
-      var seconds_str = (seconds < 10 ? '0' + seconds: '' + seconds);
-      var minutes_str = (minutes < 10 ? '0' + minutes: '' + minutes);
-      var time_passed = minutes_str + ':' + seconds_str;
-      document.getElementById("elapsed_time").textContent = time_passed;
-    }
-    //have time tic every second
-    var timer = setInterval(secondPassed, 1000);
-    var stop = document.getElementById("stop");
-    stop.onclick = function(){
-      seconds = 0;
-      minutes = 0;
-      clearInterval(timer);
-    }
-    </script>"""
-
-if __name__ == '__main__':
-  conf = {
-      '/': {
-          'tools.sessions.on': True
-      }
-  }
-  cherrypy.quickstart(CrasRouterTest(), '/', conf)
diff --git a/cras/src/tests/audio_thread_monitor_unittest.cc b/cras/src/tests/audio_thread_monitor_unittest.cc
deleted file mode 100644
index 9e1de63..0000000
--- a/cras/src/tests/audio_thread_monitor_unittest.cc
+++ /dev/null
@@ -1,131 +0,0 @@
-// Copyright 2018 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <gtest/gtest.h>
-#include <stdio.h>
-
-extern "C" {
-#include "cras_audio_thread_monitor.c"
-#include "cras_main_message.h"
-}
-
-// Function call counters
-static int cras_system_state_add_snapshot_called;
-static int audio_thread_dump_thread_info_called;
-
-// Stub data
-static enum CRAS_MAIN_MESSAGE_TYPE type_set;
-struct cras_audio_thread_event_message message;
-
-void ResetStubData() {
-  cras_system_state_add_snapshot_called = 0;
-  audio_thread_dump_thread_info_called = 0;
-  type_set = (enum CRAS_MAIN_MESSAGE_TYPE)999;
-  message.event_type = (enum CRAS_AUDIO_THREAD_EVENT_TYPE)999;
-}
-
-namespace {
-
-class AudioThreadMonitorTestSuite : public testing::Test {
- protected:
-  virtual void SetUp() { ResetStubData(); }
-
-  virtual void TearDown() {}
-};
-
-TEST_F(AudioThreadMonitorTestSuite, Init) {
-  cras_audio_thread_monitor_init();
-  EXPECT_EQ(type_set, CRAS_MAIN_AUDIO_THREAD_EVENT);
-}
-
-TEST_F(AudioThreadMonitorTestSuite, Busyloop) {
-  cras_audio_thread_event_busyloop();
-  EXPECT_EQ(message.event_type, AUDIO_THREAD_EVENT_BUSYLOOP);
-}
-
-TEST_F(AudioThreadMonitorTestSuite, Debug) {
-  cras_audio_thread_event_debug();
-  EXPECT_EQ(message.event_type, AUDIO_THREAD_EVENT_DEBUG);
-}
-
-TEST_F(AudioThreadMonitorTestSuite, Underrun) {
-  cras_audio_thread_event_underrun();
-  EXPECT_EQ(message.event_type, AUDIO_THREAD_EVENT_UNDERRUN);
-}
-
-TEST_F(AudioThreadMonitorTestSuite, SevereUnderrun) {
-  cras_audio_thread_event_severe_underrun();
-  EXPECT_EQ(message.event_type, AUDIO_THREAD_EVENT_SEVERE_UNDERRUN);
-}
-
-TEST_F(AudioThreadMonitorTestSuite, DropSamples) {
-  cras_audio_thread_event_drop_samples();
-  EXPECT_EQ(message.event_type, AUDIO_THREAD_EVENT_DROP_SAMPLES);
-}
-
-TEST_F(AudioThreadMonitorTestSuite, TakeSnapshot) {
-  take_snapshot(AUDIO_THREAD_EVENT_DEBUG);
-  EXPECT_EQ(cras_system_state_add_snapshot_called, 1);
-  EXPECT_EQ(audio_thread_dump_thread_info_called, 1);
-}
-
-TEST_F(AudioThreadMonitorTestSuite, EventHandlerDoubleCall) {
-  struct cras_audio_thread_event_message msg;
-  msg.event_type = AUDIO_THREAD_EVENT_DEBUG;
-  handle_audio_thread_event_message((struct cras_main_message*)&msg, NULL);
-  EXPECT_EQ(cras_system_state_add_snapshot_called, 1);
-  EXPECT_EQ(audio_thread_dump_thread_info_called, 1);
-
-  // take_snapshot shouldn't be called since the time interval is short
-  handle_audio_thread_event_message((struct cras_main_message*)&msg, NULL);
-  EXPECT_EQ(cras_system_state_add_snapshot_called, 1);
-  EXPECT_EQ(audio_thread_dump_thread_info_called, 1);
-}
-
-TEST_F(AudioThreadMonitorTestSuite, EventHandlerIgnoreInvalidEvent) {
-  struct cras_audio_thread_event_message msg;
-  msg.event_type = (enum CRAS_AUDIO_THREAD_EVENT_TYPE)999;
-  handle_audio_thread_event_message((struct cras_main_message*)&msg, NULL);
-  EXPECT_EQ(cras_system_state_add_snapshot_called, 0);
-  EXPECT_EQ(audio_thread_dump_thread_info_called, 0);
-}
-
-extern "C" {
-
-void cras_system_state_add_snapshot(
-    struct cras_audio_thread_snapshot* snapshot) {
-  cras_system_state_add_snapshot_called++;
-}
-
-struct audio_thread* cras_iodev_list_get_audio_thread() {
-  return reinterpret_cast<struct audio_thread*>(0xff);
-}
-
-int audio_thread_dump_thread_info(struct audio_thread* thread,
-                                  struct audio_debug_info* info) {
-  audio_thread_dump_thread_info_called++;
-  return 0;
-}
-
-int cras_main_message_add_handler(enum CRAS_MAIN_MESSAGE_TYPE type,
-                                  cras_message_callback callback,
-                                  void* callback_data) {
-  type_set = type;
-  return 0;
-}
-
-int cras_main_message_send(struct cras_main_message* msg) {
-  message = *(struct cras_audio_thread_event_message*)msg;
-  return 0;
-}
-
-}  // extern "C"
-}  // namespace
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  int rc = RUN_ALL_TESTS();
-
-  return rc;
-}
diff --git a/cras/src/tests/audio_thread_unittest.cc b/cras/src/tests/audio_thread_unittest.cc
deleted file mode 100644
index 93045e0..0000000
--- a/cras/src/tests/audio_thread_unittest.cc
+++ /dev/null
@@ -1,1475 +0,0 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-extern "C" {
-#include "audio_thread.c"
-
-#include "cras_audio_area.h"
-#include "metrics_stub.h"
-}
-
-#include <gtest/gtest.h>
-
-#include <map>
-
-#define MAX_CALLS 10
-#define BUFFER_SIZE 8192
-#define FIRST_CB_LEVEL 480
-
-static int cras_audio_thread_event_busyloop_called;
-static int cras_audio_thread_event_severe_underrun_called;
-static unsigned int cras_rstream_dev_offset_called;
-static unsigned int cras_rstream_dev_offset_ret[MAX_CALLS];
-static const struct cras_rstream*
-    cras_rstream_dev_offset_rstream_val[MAX_CALLS];
-static unsigned int cras_rstream_dev_offset_dev_id_val[MAX_CALLS];
-static unsigned int cras_rstream_dev_offset_update_called;
-static const struct cras_rstream*
-    cras_rstream_dev_offset_update_rstream_val[MAX_CALLS];
-static unsigned int cras_rstream_dev_offset_update_frames_val[MAX_CALLS];
-static unsigned int cras_rstream_dev_offset_update_dev_id_val[MAX_CALLS];
-static int cras_rstream_is_pending_reply_ret;
-static int cras_iodev_all_streams_written_ret;
-static struct cras_audio_area* cras_iodev_get_output_buffer_area;
-static int cras_iodev_put_output_buffer_called;
-static unsigned int cras_iodev_put_output_buffer_nframes;
-static unsigned int cras_iodev_fill_odev_zeros_frames;
-static int dev_stream_playback_frames_ret;
-static int dev_stream_mix_called;
-static unsigned int dev_stream_update_next_wake_time_called;
-static unsigned int dev_stream_request_playback_samples_called;
-static unsigned int cras_iodev_prepare_output_before_write_samples_called;
-static enum CRAS_IODEV_STATE
-    cras_iodev_prepare_output_before_write_samples_state;
-static unsigned int cras_iodev_get_output_buffer_called;
-static unsigned int cras_iodev_frames_to_play_in_sleep_called;
-static int cras_iodev_prepare_output_before_write_samples_ret;
-static int cras_iodev_reset_request_called;
-static struct cras_iodev* cras_iodev_reset_request_iodev;
-static int cras_iodev_get_valid_frames_ret;
-static int cras_iodev_output_underrun_called;
-static int cras_iodev_start_stream_called;
-static int cras_device_monitor_reset_device_called;
-static struct cras_iodev* cras_device_monitor_reset_device_iodev;
-static struct cras_iodev* cras_iodev_start_ramp_odev;
-static enum CRAS_IODEV_RAMP_REQUEST cras_iodev_start_ramp_request;
-static struct timespec clock_gettime_retspec;
-static struct timespec init_cb_ts_;
-static struct timespec sleep_interval_ts_;
-static std::map<const struct dev_stream*, struct timespec>
-    dev_stream_wake_time_val;
-static int cras_device_monitor_set_device_mute_state_called;
-static int cras_iodev_is_zero_volume_ret;
-
-void ResetGlobalStubData() {
-  cras_rstream_dev_offset_called = 0;
-  cras_rstream_dev_offset_update_called = 0;
-  cras_rstream_is_pending_reply_ret = 0;
-  for (int i = 0; i < MAX_CALLS; i++) {
-    cras_rstream_dev_offset_ret[i] = 0;
-    cras_rstream_dev_offset_rstream_val[i] = NULL;
-    cras_rstream_dev_offset_dev_id_val[i] = 0;
-    cras_rstream_dev_offset_update_rstream_val[i] = NULL;
-    cras_rstream_dev_offset_update_frames_val[i] = 0;
-    cras_rstream_dev_offset_update_dev_id_val[i] = 0;
-  }
-  cras_iodev_all_streams_written_ret = 0;
-  if (cras_iodev_get_output_buffer_area) {
-    free(cras_iodev_get_output_buffer_area->channels[0].buf);
-    free(cras_iodev_get_output_buffer_area);
-    cras_iodev_get_output_buffer_area = NULL;
-  }
-  cras_iodev_put_output_buffer_called = 0;
-  cras_iodev_put_output_buffer_nframes = 0;
-  cras_iodev_fill_odev_zeros_frames = 0;
-  cras_iodev_frames_to_play_in_sleep_called = 0;
-  dev_stream_playback_frames_ret = 0;
-  dev_stream_mix_called = 0;
-  dev_stream_request_playback_samples_called = 0;
-  dev_stream_update_next_wake_time_called = 0;
-  cras_iodev_prepare_output_before_write_samples_called = 0;
-  cras_iodev_prepare_output_before_write_samples_state = CRAS_IODEV_STATE_OPEN;
-  cras_iodev_get_output_buffer_called = 0;
-  cras_iodev_prepare_output_before_write_samples_ret = 0;
-  cras_iodev_reset_request_called = 0;
-  cras_iodev_reset_request_iodev = NULL;
-  cras_iodev_get_valid_frames_ret = 0;
-  cras_iodev_output_underrun_called = 0;
-  cras_iodev_start_stream_called = 0;
-  cras_device_monitor_reset_device_called = 0;
-  cras_device_monitor_reset_device_iodev = NULL;
-  cras_iodev_start_ramp_odev = NULL;
-  cras_iodev_start_ramp_request = CRAS_IODEV_RAMP_REQUEST_UP_START_PLAYBACK;
-  cras_device_monitor_set_device_mute_state_called = 0;
-  cras_iodev_is_zero_volume_ret = 0;
-  clock_gettime_retspec.tv_sec = 0;
-  clock_gettime_retspec.tv_nsec = 0;
-  dev_stream_wake_time_val.clear();
-}
-
-void SetupRstream(struct cras_rstream* rstream,
-                  enum CRAS_STREAM_DIRECTION direction) {
-  uint32_t frame_bytes = 4;
-  uint32_t used_size = 4096 * frame_bytes;
-
-  memset(rstream, 0, sizeof(*rstream));
-  rstream->direction = direction;
-  rstream->cb_threshold = 480;
-  rstream->format.frame_rate = 48000;
-
-  rstream->shm = static_cast<cras_audio_shm*>(calloc(1, sizeof(*rstream->shm)));
-  rstream->shm->header = static_cast<cras_audio_shm_header*>(
-      calloc(1, sizeof(*rstream->shm->header)));
-
-  rstream->shm->samples = static_cast<uint8_t*>(
-      calloc(1, cras_shm_calculate_samples_size(used_size)));
-
-  cras_shm_set_frame_bytes(rstream->shm, frame_bytes);
-  cras_shm_set_used_size(rstream->shm, used_size);
-}
-
-void TearDownRstream(struct cras_rstream* rstream) {
-  free(rstream->shm->samples);
-  free(rstream->shm->header);
-  free(rstream->shm);
-}
-
-// Test streams and devices manipulation.
-class StreamDeviceSuite : public testing::Test {
- protected:
-  virtual void SetUp() {
-    thread_ = audio_thread_create();
-    ResetStubData();
-  }
-
-  virtual void TearDown() {
-    audio_thread_destroy(thread_);
-    ResetGlobalStubData();
-  }
-
-  virtual void SetupDevice(cras_iodev* iodev,
-                           enum CRAS_STREAM_DIRECTION direction) {
-    memset(iodev, 0, sizeof(*iodev));
-    iodev->info.idx = ++device_id_;
-    iodev->direction = direction;
-    iodev->configure_dev = configure_dev;
-    iodev->close_dev = close_dev;
-    iodev->frames_queued = frames_queued;
-    iodev->delay_frames = delay_frames;
-    iodev->get_buffer = get_buffer;
-    iodev->put_buffer = put_buffer;
-    iodev->flush_buffer = flush_buffer;
-    iodev->format = &format_;
-    iodev->buffer_size = BUFFER_SIZE;
-    iodev->min_cb_level = FIRST_CB_LEVEL;
-    iodev->state = CRAS_IODEV_STATE_NORMAL_RUN;
-    format_.frame_rate = 48000;
-  }
-
-  void ResetStubData() {
-    device_id_ = 0;
-    open_dev_called_ = 0;
-    close_dev_called_ = 0;
-    frames_queued_ = 0;
-    delay_frames_ = 0;
-    audio_buffer_size_ = 0;
-    cras_iodev_start_ramp_odev = NULL;
-    cras_iodev_is_zero_volume_ret = 0;
-  }
-
-  void SetupPinnedStream(struct cras_rstream* rstream,
-                         enum CRAS_STREAM_DIRECTION direction,
-                         cras_iodev* pin_to_dev) {
-    SetupRstream(rstream, direction);
-    rstream->is_pinned = 1;
-    rstream->pinned_dev_idx = pin_to_dev->info.idx;
-  }
-
-  static int configure_dev(cras_iodev* iodev) {
-    open_dev_called_++;
-    return 0;
-  }
-
-  static int close_dev(cras_iodev* iodev) {
-    close_dev_called_++;
-    return 0;
-  }
-
-  static int frames_queued(const cras_iodev* iodev, struct timespec* tstamp) {
-    clock_gettime(CLOCK_MONOTONIC_RAW, tstamp);
-    return frames_queued_;
-  }
-
-  static int delay_frames(const cras_iodev* iodev) { return delay_frames_; }
-
-  static int get_buffer(cras_iodev* iodev,
-                        struct cras_audio_area** area,
-                        unsigned int* num) {
-    size_t sz = sizeof(*area_) + sizeof(struct cras_channel_area) * 2;
-
-    if (audio_buffer_size_ < *num)
-      *num = audio_buffer_size_;
-
-    area_ = (cras_audio_area*)calloc(1, sz);
-    area_->frames = *num;
-    area_->num_channels = 2;
-    area_->channels[0].buf = audio_buffer_;
-    channel_area_set_channel(&area_->channels[0], CRAS_CH_FL);
-    area_->channels[0].step_bytes = 4;
-    area_->channels[1].buf = audio_buffer_ + 2;
-    channel_area_set_channel(&area_->channels[1], CRAS_CH_FR);
-    area_->channels[1].step_bytes = 4;
-
-    *area = area_;
-    return 0;
-  }
-
-  static int put_buffer(cras_iodev* iodev, unsigned int num) {
-    free(area_);
-    return 0;
-  }
-
-  static int flush_buffer(cras_iodev* iodev) { return 0; }
-
-  int device_id_;
-  struct audio_thread* thread_;
-
-  static int open_dev_called_;
-  static int close_dev_called_;
-  static int frames_queued_;
-  static int delay_frames_;
-  static struct cras_audio_format format_;
-  static struct cras_audio_area* area_;
-  static uint8_t audio_buffer_[BUFFER_SIZE];
-  static unsigned int audio_buffer_size_;
-};
-
-int StreamDeviceSuite::open_dev_called_;
-int StreamDeviceSuite::close_dev_called_;
-int StreamDeviceSuite::frames_queued_;
-int StreamDeviceSuite::delay_frames_;
-struct cras_audio_format StreamDeviceSuite::format_;
-struct cras_audio_area* StreamDeviceSuite::area_;
-uint8_t StreamDeviceSuite::audio_buffer_[8192];
-unsigned int StreamDeviceSuite::audio_buffer_size_;
-
-TEST_F(StreamDeviceSuite, AddRemoveOpenOutputDevice) {
-  struct cras_iodev iodev;
-  struct open_dev* adev;
-
-  SetupDevice(&iodev, CRAS_STREAM_OUTPUT);
-
-  // Check the newly added device is open.
-  thread_add_open_dev(thread_, &iodev);
-  adev = thread_->open_devs[CRAS_STREAM_OUTPUT];
-  EXPECT_EQ(adev->dev, &iodev);
-
-  thread_rm_open_dev(thread_, CRAS_STREAM_OUTPUT, iodev.info.idx);
-  adev = thread_->open_devs[CRAS_STREAM_OUTPUT];
-  EXPECT_EQ(NULL, adev);
-}
-
-TEST_F(StreamDeviceSuite, StartRamp) {
-  struct cras_iodev iodev;
-  struct open_dev* adev;
-  int rc;
-  enum CRAS_IODEV_RAMP_REQUEST req;
-
-  SetupDevice(&iodev, CRAS_STREAM_OUTPUT);
-
-  // Check the newly added device is open.
-  thread_add_open_dev(thread_, &iodev);
-  adev = thread_->open_devs[CRAS_STREAM_OUTPUT];
-  EXPECT_EQ(adev->dev, &iodev);
-
-  // Ramp up for unmute.
-  iodev.ramp = reinterpret_cast<cras_ramp*>(0x123);
-  req = CRAS_IODEV_RAMP_REQUEST_UP_UNMUTE;
-  rc = thread_dev_start_ramp(thread_, iodev.info.idx, req);
-
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(&iodev, cras_iodev_start_ramp_odev);
-  EXPECT_EQ(req, cras_iodev_start_ramp_request);
-
-  // Ramp down for mute.
-  ResetStubData();
-  req = CRAS_IODEV_RAMP_REQUEST_DOWN_MUTE;
-
-  rc = thread_dev_start_ramp(thread_, iodev.info.idx, req);
-
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(&iodev, cras_iodev_start_ramp_odev);
-  EXPECT_EQ(req, cras_iodev_start_ramp_request);
-
-  // If device's volume percentage is zero, than ramp won't start.
-  ResetStubData();
-  cras_iodev_is_zero_volume_ret = 1;
-  rc = thread_dev_start_ramp(thread_, iodev.info.idx, req);
-
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(NULL, cras_iodev_start_ramp_odev);
-  EXPECT_EQ(1, cras_device_monitor_set_device_mute_state_called);
-
-  // Assume iodev changed to no_stream run state, it should not use ramp.
-  ResetStubData();
-  iodev.state = CRAS_IODEV_STATE_NO_STREAM_RUN;
-  rc = thread_dev_start_ramp(thread_, iodev.info.idx, req);
-
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(NULL, cras_iodev_start_ramp_odev);
-  EXPECT_EQ(2, cras_device_monitor_set_device_mute_state_called);
-
-  thread_rm_open_dev(thread_, CRAS_STREAM_OUTPUT, iodev.info.idx);
-}
-
-TEST_F(StreamDeviceSuite, AddRemoveOpenInputDevice) {
-  struct cras_iodev iodev;
-  struct open_dev* adev;
-
-  SetupDevice(&iodev, CRAS_STREAM_INPUT);
-
-  // Check the newly added device is open.
-  thread_add_open_dev(thread_, &iodev);
-  adev = thread_->open_devs[CRAS_STREAM_INPUT];
-  EXPECT_EQ(adev->dev, &iodev);
-
-  thread_rm_open_dev(thread_, CRAS_STREAM_INPUT, iodev.info.idx);
-  adev = thread_->open_devs[CRAS_STREAM_INPUT];
-  EXPECT_EQ(NULL, adev);
-}
-
-TEST_F(StreamDeviceSuite, AddRemoveMultipleOpenDevices) {
-  struct cras_iodev odev;
-  struct cras_iodev odev2;
-  struct cras_iodev odev3;
-  struct cras_iodev idev;
-  struct cras_iodev idev2;
-  struct cras_iodev idev3;
-  struct open_dev* adev;
-
-  SetupDevice(&odev, CRAS_STREAM_OUTPUT);
-  SetupDevice(&odev2, CRAS_STREAM_OUTPUT);
-  SetupDevice(&odev3, CRAS_STREAM_OUTPUT);
-  SetupDevice(&idev, CRAS_STREAM_INPUT);
-  SetupDevice(&idev2, CRAS_STREAM_INPUT);
-  SetupDevice(&idev3, CRAS_STREAM_INPUT);
-
-  // Add 2 open devices and check both are open.
-  thread_add_open_dev(thread_, &odev);
-  thread_add_open_dev(thread_, &odev2);
-  adev = thread_->open_devs[CRAS_STREAM_OUTPUT];
-  EXPECT_EQ(adev->dev, &odev);
-  EXPECT_EQ(adev->next->dev, &odev2);
-
-  // Remove first open device and check the second one is still open.
-  thread_rm_open_dev(thread_, CRAS_STREAM_OUTPUT, odev.info.idx);
-  adev = thread_->open_devs[CRAS_STREAM_OUTPUT];
-  EXPECT_EQ(adev->dev, &odev2);
-
-  // Add another open device and check both are open.
-  thread_add_open_dev(thread_, &odev3);
-  adev = thread_->open_devs[CRAS_STREAM_OUTPUT];
-  EXPECT_EQ(adev->dev, &odev2);
-  EXPECT_EQ(adev->next->dev, &odev3);
-
-  // Add 2 open devices and check both are open.
-  thread_add_open_dev(thread_, &idev);
-  thread_add_open_dev(thread_, &idev2);
-  adev = thread_->open_devs[CRAS_STREAM_INPUT];
-  EXPECT_EQ(adev->dev, &idev);
-  EXPECT_EQ(adev->next->dev, &idev2);
-
-  // Remove first open device and check the second one is still open.
-  thread_rm_open_dev(thread_, CRAS_STREAM_INPUT, idev.info.idx);
-  adev = thread_->open_devs[CRAS_STREAM_INPUT];
-  EXPECT_EQ(adev->dev, &idev2);
-
-  // Add and remove another open device and check still open.
-  thread_add_open_dev(thread_, &idev3);
-  thread_rm_open_dev(thread_, CRAS_STREAM_INPUT, idev3.info.idx);
-  adev = thread_->open_devs[CRAS_STREAM_INPUT];
-  EXPECT_EQ(adev->dev, &idev2);
-  thread_rm_open_dev(thread_, CRAS_STREAM_INPUT, idev2.info.idx);
-  thread_rm_open_dev(thread_, CRAS_STREAM_OUTPUT, odev2.info.idx);
-  thread_rm_open_dev(thread_, CRAS_STREAM_OUTPUT, odev3.info.idx);
-}
-
-TEST_F(StreamDeviceSuite, MultipleInputStreamsCopyFirstStreamOffset) {
-  struct cras_iodev iodev;
-  struct cras_iodev iodev2;
-  struct cras_iodev* iodevs[] = {&iodev, &iodev2};
-  struct cras_rstream rstream;
-  struct cras_rstream rstream2;
-  struct cras_rstream rstream3;
-
-  SetupDevice(&iodev, CRAS_STREAM_INPUT);
-  SetupDevice(&iodev2, CRAS_STREAM_INPUT);
-  SetupRstream(&rstream, CRAS_STREAM_INPUT);
-  SetupRstream(&rstream2, CRAS_STREAM_INPUT);
-  SetupRstream(&rstream3, CRAS_STREAM_INPUT);
-
-  thread_add_open_dev(thread_, &iodev);
-  thread_add_open_dev(thread_, &iodev2);
-
-  thread_add_stream(thread_, &rstream, iodevs, 2);
-  EXPECT_NE((void*)NULL, iodev.streams);
-  EXPECT_NE((void*)NULL, iodev2.streams);
-
-  EXPECT_EQ(0, cras_rstream_dev_offset_called);
-  EXPECT_EQ(0, cras_rstream_dev_offset_update_called);
-
-  // Fake offset for rstream
-  cras_rstream_dev_offset_ret[0] = 30;
-  cras_rstream_dev_offset_ret[1] = 0;
-
-  thread_add_stream(thread_, &rstream2, iodevs, 2);
-  EXPECT_EQ(2, cras_rstream_dev_offset_called);
-  EXPECT_EQ(&rstream, cras_rstream_dev_offset_rstream_val[0]);
-  EXPECT_EQ(iodev.info.idx, cras_rstream_dev_offset_dev_id_val[0]);
-  EXPECT_EQ(&rstream, cras_rstream_dev_offset_rstream_val[1]);
-  EXPECT_EQ(iodev2.info.idx, cras_rstream_dev_offset_dev_id_val[1]);
-
-  EXPECT_EQ(2, cras_rstream_dev_offset_update_called);
-  EXPECT_EQ(&rstream2, cras_rstream_dev_offset_update_rstream_val[0]);
-  EXPECT_EQ(30, cras_rstream_dev_offset_update_frames_val[0]);
-  EXPECT_EQ(&rstream2, cras_rstream_dev_offset_update_rstream_val[1]);
-  EXPECT_EQ(0, cras_rstream_dev_offset_update_frames_val[1]);
-
-  thread_rm_open_dev(thread_, CRAS_STREAM_INPUT, iodev.info.idx);
-  thread_rm_open_dev(thread_, CRAS_STREAM_INPUT, iodev2.info.idx);
-  TearDownRstream(&rstream);
-  TearDownRstream(&rstream2);
-  TearDownRstream(&rstream3);
-}
-
-TEST_F(StreamDeviceSuite, InputStreamsSetInputDeviceWakeTime) {
-  struct cras_iodev iodev;
-  struct cras_iodev* iodevs[] = {&iodev};
-  struct cras_rstream rstream1, rstream2;
-  struct timespec ts_wake_1 = {.tv_sec = 1, .tv_nsec = 500};
-  struct timespec ts_wake_2 = {.tv_sec = 1, .tv_nsec = 1000};
-  struct open_dev* adev;
-
-  SetupDevice(&iodev, CRAS_STREAM_INPUT);
-  SetupRstream(&rstream1, CRAS_STREAM_INPUT);
-  SetupRstream(&rstream2, CRAS_STREAM_INPUT);
-
-  thread_add_open_dev(thread_, &iodev);
-  thread_add_stream(thread_, &rstream1, iodevs, 1);
-  thread_add_stream(thread_, &rstream2, iodevs, 1);
-  EXPECT_NE((void*)NULL, iodev.streams);
-
-  // Assume device is running.
-  iodev.state = CRAS_IODEV_STATE_NORMAL_RUN;
-
-  // Set stub data for dev_stream_wake_time.
-  dev_stream_wake_time_val[iodev.streams] = ts_wake_1;
-  dev_stream_wake_time_val[iodev.streams->next] = ts_wake_2;
-
-  // Send captured samples to client.
-  // This will also update wake time for this device based on
-  // dev_stream_wake_time of each stream of this device.
-  dev_io_send_captured_samples(thread_->open_devs[CRAS_STREAM_INPUT]);
-
-  // wake_ts is maintained in open_dev.
-  adev = thread_->open_devs[CRAS_STREAM_INPUT];
-
-  // The wake up time for this device is the minimum of
-  // ts_wake_1 and ts_wake_2.
-  EXPECT_EQ(ts_wake_1.tv_sec, adev->wake_ts.tv_sec);
-  EXPECT_EQ(ts_wake_1.tv_nsec, adev->wake_ts.tv_nsec);
-
-  thread_rm_open_dev(thread_, CRAS_STREAM_INPUT, iodev.info.idx);
-  TearDownRstream(&rstream1);
-  TearDownRstream(&rstream2);
-}
-
-TEST_F(StreamDeviceSuite, AddOutputStream) {
-  struct cras_iodev iodev, *piodev = &iodev;
-  struct cras_rstream rstream;
-  struct cras_audio_shm_header* shm_header;
-  struct dev_stream* dev_stream;
-  struct open_dev* adev;
-
-  ResetGlobalStubData();
-  SetupDevice(&iodev, CRAS_STREAM_OUTPUT);
-  SetupRstream(&rstream, CRAS_STREAM_OUTPUT);
-  shm_header = rstream.shm->header;
-
-  thread_add_open_dev(thread_, &iodev);
-  thread_add_stream(thread_, &rstream, &piodev, 1);
-  dev_stream = iodev.streams;
-  EXPECT_EQ(dev_stream->stream, &rstream);
-  /*
-   * When a output stream is added, the start_stream function will be called
-   * just before its first fetch.
-   */
-  EXPECT_EQ(cras_iodev_start_stream_called, 0);
-
-  adev = thread_->open_devs[CRAS_STREAM_OUTPUT];
-
-  shm_header->write_buf_idx = 0;
-  shm_header->write_offset[0] = 0;
-
-  /* Assume device is started. */
-  iodev.state = CRAS_IODEV_STATE_NORMAL_RUN;
-
-  /* Fetch stream. */
-  cras_rstream_is_pending_reply_ret = 0;
-  dev_io_playback_fetch(adev);
-  EXPECT_EQ(dev_stream_request_playback_samples_called, 1);
-  EXPECT_EQ(cras_iodev_start_stream_called, 1);
-
-  thread_rm_open_dev(thread_, CRAS_STREAM_OUTPUT, iodev.info.idx);
-  TearDownRstream(&rstream);
-}
-
-TEST_F(StreamDeviceSuite, OutputStreamFetchTime) {
-  struct cras_iodev iodev, *piodev = &iodev;
-  struct cras_rstream rstream1, rstream2;
-  struct dev_stream* dev_stream;
-  struct timespec expect_ts;
-
-  ResetGlobalStubData();
-  SetupDevice(&iodev, CRAS_STREAM_OUTPUT);
-  SetupRstream(&rstream1, CRAS_STREAM_OUTPUT);
-  SetupRstream(&rstream2, CRAS_STREAM_OUTPUT);
-
-  thread_add_open_dev(thread_, &iodev);
-
-  /* Add a new stream. init_cb_ts should be the time right now. */
-  clock_gettime_retspec.tv_sec = 1;
-  clock_gettime_retspec.tv_nsec = 500;
-  cras_iodev_get_valid_frames_ret = 0;
-  expect_ts = clock_gettime_retspec;
-  thread_add_stream(thread_, &rstream1, &piodev, 1);
-  dev_stream = iodev.streams;
-  EXPECT_EQ(dev_stream->stream, &rstream1);
-  EXPECT_EQ(init_cb_ts_.tv_sec, expect_ts.tv_sec);
-  EXPECT_EQ(init_cb_ts_.tv_nsec, expect_ts.tv_nsec);
-
-  thread_rm_open_dev(thread_, CRAS_STREAM_OUTPUT, iodev.info.idx);
-
-  thread_add_open_dev(thread_, &iodev);
-
-  /*
-   * Add a new stream when there are remaining frames in device buffer.
-   * init_cb_ts should be the time that hw_level drops to min_cb_level.
-   * In this case, we should wait 480 / 48000 = 0.01s.
-   */
-  clock_gettime_retspec.tv_sec = 1;
-  clock_gettime_retspec.tv_nsec = 500;
-  expect_ts = clock_gettime_retspec;
-  cras_iodev_get_valid_frames_ret = 960;
-  rstream1.cb_threshold = 480;
-  expect_ts.tv_nsec += 10 * 1000000;
-  thread_add_stream(thread_, &rstream1, &piodev, 1);
-  dev_stream = iodev.streams;
-  EXPECT_EQ(dev_stream->stream, &rstream1);
-  EXPECT_EQ(init_cb_ts_.tv_sec, expect_ts.tv_sec);
-  EXPECT_EQ(init_cb_ts_.tv_nsec, expect_ts.tv_nsec);
-
-  /*
-   * Add a new stream when there are other streams exist. init_cb_ts should
-   * be the earliest next callback time from other streams.
-   */
-  rstream1.next_cb_ts = expect_ts;
-  thread_add_stream(thread_, &rstream2, &piodev, 1);
-  dev_stream = iodev.streams->prev;
-  EXPECT_EQ(dev_stream->stream, &rstream2);
-  EXPECT_EQ(init_cb_ts_.tv_sec, expect_ts.tv_sec);
-  EXPECT_EQ(init_cb_ts_.tv_nsec, expect_ts.tv_nsec);
-
-  thread_rm_open_dev(thread_, CRAS_STREAM_OUTPUT, iodev.info.idx);
-  TearDownRstream(&rstream1);
-  TearDownRstream(&rstream2);
-}
-
-TEST_F(StreamDeviceSuite, AddRemoveMultipleStreamsOnMultipleDevices) {
-  struct cras_iodev iodev, *piodev = &iodev;
-  struct cras_iodev iodev2, *piodev2 = &iodev2;
-  struct cras_rstream rstream;
-  struct cras_rstream rstream2;
-  struct cras_rstream rstream3;
-  struct dev_stream* dev_stream;
-
-  SetupDevice(&iodev, CRAS_STREAM_OUTPUT);
-  SetupDevice(&iodev2, CRAS_STREAM_OUTPUT);
-  SetupRstream(&rstream, CRAS_STREAM_OUTPUT);
-  SetupRstream(&rstream2, CRAS_STREAM_OUTPUT);
-  SetupRstream(&rstream3, CRAS_STREAM_OUTPUT);
-
-  // Add first device as open and check 2 streams can be added.
-  thread_add_open_dev(thread_, &iodev);
-  thread_add_stream(thread_, &rstream, &piodev, 1);
-  dev_stream = iodev.streams;
-  EXPECT_EQ(dev_stream->stream, &rstream);
-  thread_add_stream(thread_, &rstream2, &piodev, 1);
-  EXPECT_EQ(dev_stream->next->stream, &rstream2);
-
-  // Add second device as open and check no streams are copied over.
-  thread_add_open_dev(thread_, &iodev2);
-  dev_stream = iodev2.streams;
-  EXPECT_EQ(NULL, dev_stream);
-  // Also check the 2 streams on first device remain intact.
-  dev_stream = iodev.streams;
-  EXPECT_EQ(dev_stream->stream, &rstream);
-  EXPECT_EQ(dev_stream->next->stream, &rstream2);
-
-  // Add a stream to the second dev and check it isn't also added to the first.
-  thread_add_stream(thread_, &rstream3, &piodev2, 1);
-  dev_stream = iodev.streams;
-  EXPECT_EQ(dev_stream->stream, &rstream);
-  EXPECT_EQ(dev_stream->next->stream, &rstream2);
-  EXPECT_EQ(NULL, dev_stream->next->next);
-  dev_stream = iodev2.streams;
-  EXPECT_EQ(&rstream3, dev_stream->stream);
-  EXPECT_EQ(NULL, dev_stream->next);
-
-  // Remove first device from open and streams on second device remain
-  // intact.
-  thread_rm_open_dev(thread_, CRAS_STREAM_OUTPUT, iodev.info.idx);
-  dev_stream = iodev2.streams;
-  EXPECT_EQ(&rstream3, dev_stream->stream);
-  EXPECT_EQ(NULL, dev_stream->next);
-
-  // Remove 2 streams, check the streams are removed from both open devices.
-  dev_io_remove_stream(&thread_->open_devs[rstream.direction], &rstream,
-                       &iodev);
-  dev_io_remove_stream(&thread_->open_devs[rstream3.direction], &rstream3,
-                       &iodev2);
-  dev_stream = iodev2.streams;
-  EXPECT_EQ(NULL, dev_stream);
-
-  // Remove open devices and check stream is on fallback device.
-  thread_rm_open_dev(thread_, CRAS_STREAM_OUTPUT, iodev2.info.idx);
-
-  // Add open device, again check it is empty of streams.
-  thread_add_open_dev(thread_, &iodev);
-  dev_stream = iodev.streams;
-  EXPECT_EQ(NULL, dev_stream);
-
-  thread_rm_open_dev(thread_, CRAS_STREAM_OUTPUT, iodev.info.idx);
-  TearDownRstream(&rstream);
-  TearDownRstream(&rstream2);
-  TearDownRstream(&rstream3);
-}
-
-TEST_F(StreamDeviceSuite, FetchStreams) {
-  struct cras_iodev iodev, *piodev = &iodev;
-  struct open_dev* adev;
-  struct cras_rstream rstream;
-  struct cras_audio_shm_header* shm_header;
-
-  SetupRstream(&rstream, CRAS_STREAM_OUTPUT);
-  shm_header = rstream.shm->header;
-  ResetGlobalStubData();
-
-  SetupDevice(&iodev, CRAS_STREAM_OUTPUT);
-
-  shm_header->write_buf_idx = 0;
-
-  /* Add the device and add the stream. */
-  thread_add_open_dev(thread_, &iodev);
-  thread_add_stream(thread_, &rstream, &piodev, 1);
-
-  adev = thread_->open_devs[CRAS_STREAM_OUTPUT];
-
-  /* Assume device is started. */
-  iodev.state = CRAS_IODEV_STATE_NORMAL_RUN;
-
-  /*
-   * If the stream is pending a reply and shm buffer for writing is empty,
-   * just skip it.
-   */
-  cras_rstream_is_pending_reply_ret = 1;
-  shm_header->write_offset[0] = 0;
-  dev_io_playback_fetch(adev);
-
-  EXPECT_EQ(dev_stream_request_playback_samples_called, 0);
-  EXPECT_EQ(dev_stream_update_next_wake_time_called, 0);
-
-  /*
-   * If the stream is not pending a reply and shm buffer for writing is full,
-   * update next wake up time and skip fetching.
-   */
-  cras_rstream_is_pending_reply_ret = 0;
-  shm_header->write_offset[0] = cras_shm_used_size(rstream.shm);
-  dev_io_playback_fetch(adev);
-  EXPECT_EQ(dev_stream_request_playback_samples_called, 0);
-  EXPECT_EQ(dev_stream_update_next_wake_time_called, 1);
-
-  /* If the stream can be fetched, fetch it. */
-  cras_rstream_is_pending_reply_ret = 0;
-  shm_header->write_offset[0] = 0;
-  dev_io_playback_fetch(adev);
-  EXPECT_EQ(dev_stream_request_playback_samples_called, 1);
-
-  thread_rm_open_dev(thread_, CRAS_STREAM_OUTPUT, iodev.info.idx);
-  TearDownRstream(&rstream);
-}
-
-TEST_F(StreamDeviceSuite, WriteOutputSamplesPrepareOutputFailed) {
-  struct cras_iodev iodev;
-  struct open_dev* adev;
-
-  ResetGlobalStubData();
-
-  SetupDevice(&iodev, CRAS_STREAM_OUTPUT);
-
-  // Add the device.
-  thread_add_open_dev(thread_, &iodev);
-  adev = thread_->open_devs[CRAS_STREAM_OUTPUT];
-
-  // Assume device is started.
-  iodev.state = CRAS_IODEV_STATE_NO_STREAM_RUN;
-  // Assume device remains in no stream state;
-  cras_iodev_prepare_output_before_write_samples_state =
-      CRAS_IODEV_STATE_NO_STREAM_RUN;
-
-  // Assume there is an error in prepare_output.
-  cras_iodev_prepare_output_before_write_samples_ret = -EINVAL;
-
-  // cras_iodev should handle no stream playback.
-  EXPECT_EQ(-EINVAL,
-            write_output_samples(&thread_->open_devs[CRAS_STREAM_OUTPUT], adev,
-                                 nullptr));
-
-  // cras_iodev_get_output_buffer in audio_thread write_output_samples is not
-  // called.
-  EXPECT_EQ(0, cras_iodev_get_output_buffer_called);
-
-  thread_rm_open_dev(thread_, CRAS_STREAM_OUTPUT, iodev.info.idx);
-}
-
-TEST_F(StreamDeviceSuite, WriteOutputSamplesNoStream) {
-  struct cras_iodev iodev;
-  struct open_dev* adev;
-
-  ResetGlobalStubData();
-
-  SetupDevice(&iodev, CRAS_STREAM_OUTPUT);
-
-  // Add the device.
-  thread_add_open_dev(thread_, &iodev);
-  adev = thread_->open_devs[CRAS_STREAM_OUTPUT];
-
-  // Assume device is started.
-  iodev.state = CRAS_IODEV_STATE_NO_STREAM_RUN;
-  // Assume device remains in no stream state;
-  cras_iodev_prepare_output_before_write_samples_state =
-      CRAS_IODEV_STATE_NO_STREAM_RUN;
-
-  // cras_iodev should handle no stream playback.
-  write_output_samples(&thread_->open_devs[CRAS_STREAM_OUTPUT], adev, nullptr);
-  EXPECT_EQ(1, cras_iodev_prepare_output_before_write_samples_called);
-  // cras_iodev_get_output_buffer in audio_thread write_output_samples is not
-  // called.
-  EXPECT_EQ(0, cras_iodev_get_output_buffer_called);
-
-  thread_rm_open_dev(thread_, CRAS_STREAM_OUTPUT, iodev.info.idx);
-}
-
-TEST_F(StreamDeviceSuite, WriteOutputSamplesLeaveNoStream) {
-  struct cras_iodev iodev;
-  struct open_dev* adev;
-
-  ResetGlobalStubData();
-
-  SetupDevice(&iodev, CRAS_STREAM_OUTPUT);
-
-  // Setup the output buffer for device.
-  cras_iodev_get_output_buffer_area = cras_audio_area_create(2);
-
-  // Add the device.
-  thread_add_open_dev(thread_, &iodev);
-  adev = thread_->open_devs[CRAS_STREAM_OUTPUT];
-
-  // Assume device in no stream state.
-  iodev.state = CRAS_IODEV_STATE_NO_STREAM_RUN;
-
-  // Assume device remains in no stream state;
-  cras_iodev_prepare_output_before_write_samples_state =
-      CRAS_IODEV_STATE_NO_STREAM_RUN;
-
-  // cras_iodev should NOT leave no stream state;
-  write_output_samples(&thread_->open_devs[CRAS_STREAM_OUTPUT], adev, nullptr);
-  EXPECT_EQ(1, cras_iodev_prepare_output_before_write_samples_called);
-  // cras_iodev_get_output_buffer in audio_thread write_output_samples is not
-  // called.
-  EXPECT_EQ(0, cras_iodev_get_output_buffer_called);
-
-  // Assume device leaves no stream state;
-  cras_iodev_prepare_output_before_write_samples_state =
-      CRAS_IODEV_STATE_NORMAL_RUN;
-
-  // cras_iodev should write samples from streams.
-  write_output_samples(&thread_->open_devs[CRAS_STREAM_OUTPUT], adev, nullptr);
-  EXPECT_EQ(2, cras_iodev_prepare_output_before_write_samples_called);
-  EXPECT_EQ(1, cras_iodev_get_output_buffer_called);
-
-  thread_rm_open_dev(thread_, CRAS_STREAM_OUTPUT, iodev.info.idx);
-}
-
-TEST_F(StreamDeviceSuite, MixOutputSamples) {
-  struct cras_iodev iodev, *piodev = &iodev;
-  struct cras_rstream rstream1;
-  struct cras_rstream rstream2;
-  struct open_dev* adev;
-  struct dev_stream* dev_stream;
-
-  ResetGlobalStubData();
-
-  SetupDevice(&iodev, CRAS_STREAM_OUTPUT);
-  SetupRstream(&rstream1, CRAS_STREAM_OUTPUT);
-  SetupRstream(&rstream2, CRAS_STREAM_OUTPUT);
-
-  // Setup the output buffer for device.
-  cras_iodev_get_output_buffer_area = cras_audio_area_create(2);
-
-  // Add the device and add the stream.
-  thread_add_open_dev(thread_, &iodev);
-  thread_add_stream(thread_, &rstream1, &piodev, 1);
-  adev = thread_->open_devs[CRAS_STREAM_OUTPUT];
-
-  // Assume device is running.
-  iodev.state = CRAS_IODEV_STATE_NORMAL_RUN;
-
-  // Assume device in normal run stream state.
-  cras_iodev_prepare_output_before_write_samples_state =
-      CRAS_IODEV_STATE_NORMAL_RUN;
-
-  // cras_iodev should not mix samples because the stream has not started
-  // running.
-  frames_queued_ = 0;
-  dev_stream_playback_frames_ret = 100;
-  dev_stream = iodev.streams;
-  write_output_samples(&thread_->open_devs[CRAS_STREAM_OUTPUT], adev, nullptr);
-  EXPECT_EQ(1, cras_iodev_prepare_output_before_write_samples_called);
-  EXPECT_EQ(1, cras_iodev_get_output_buffer_called);
-  EXPECT_EQ(0, dev_stream_mix_called);
-
-  // Set rstream1 to be running. cras_iodev should mix samples from rstream1.
-  dev_stream_set_running(dev_stream);
-  write_output_samples(&thread_->open_devs[CRAS_STREAM_OUTPUT], adev, nullptr);
-  EXPECT_EQ(2, cras_iodev_prepare_output_before_write_samples_called);
-  EXPECT_EQ(2, cras_iodev_get_output_buffer_called);
-  EXPECT_EQ(1, dev_stream_mix_called);
-
-  // Add rstream2. cras_iodev should mix samples from rstream1 but not from
-  // rstream2.
-  thread_add_stream(thread_, &rstream2, &piodev, 1);
-  write_output_samples(&thread_->open_devs[CRAS_STREAM_OUTPUT], adev, nullptr);
-  EXPECT_EQ(3, cras_iodev_prepare_output_before_write_samples_called);
-  EXPECT_EQ(3, cras_iodev_get_output_buffer_called);
-  EXPECT_EQ(2, dev_stream_mix_called);
-
-  // Set rstream2 to be running. cras_iodev should mix samples from rstream1
-  // and rstream2.
-  dev_stream = iodev.streams->prev;
-  dev_stream_set_running(dev_stream);
-  write_output_samples(&thread_->open_devs[CRAS_STREAM_OUTPUT], adev, nullptr);
-  EXPECT_EQ(4, cras_iodev_prepare_output_before_write_samples_called);
-  EXPECT_EQ(4, cras_iodev_get_output_buffer_called);
-  EXPECT_EQ(4, dev_stream_mix_called);
-
-  thread_rm_open_dev(thread_, CRAS_STREAM_OUTPUT, iodev.info.idx);
-  TearDownRstream(&rstream1);
-  TearDownRstream(&rstream2);
-}
-
-TEST_F(StreamDeviceSuite, DoPlaybackNoStream) {
-  struct cras_iodev iodev;
-
-  ResetGlobalStubData();
-
-  SetupDevice(&iodev, CRAS_STREAM_OUTPUT);
-
-  // Add the device.
-  thread_add_open_dev(thread_, &iodev);
-
-  // Assume device is started.
-  iodev.state = CRAS_IODEV_STATE_NO_STREAM_RUN;
-  // Assume device remains in no stream state;
-  cras_iodev_prepare_output_before_write_samples_state =
-      CRAS_IODEV_STATE_NO_STREAM_RUN;
-  // Add 10 frames in queue to prevent underrun
-  frames_queued_ = 10;
-
-  // cras_iodev should handle no stream playback.
-  dev_io_playback_write(&thread_->open_devs[CRAS_STREAM_OUTPUT], nullptr);
-  EXPECT_EQ(1, cras_iodev_prepare_output_before_write_samples_called);
-  // cras_iodev_get_output_buffer in audio_thread write_output_samples is not
-  // called.
-  EXPECT_EQ(0, cras_iodev_get_output_buffer_called);
-
-  EXPECT_EQ(0, cras_iodev_output_underrun_called);
-  // cras_iodev_frames_to_play_in_sleep should be called from
-  // update_dev_wakeup_time.
-  EXPECT_EQ(1, cras_iodev_frames_to_play_in_sleep_called);
-
-  thread_rm_open_dev(thread_, CRAS_STREAM_OUTPUT, iodev.info.idx);
-}
-
-TEST_F(StreamDeviceSuite, DoPlaybackUnderrun) {
-  struct cras_iodev iodev, *piodev = &iodev;
-  struct cras_rstream rstream;
-
-  ResetGlobalStubData();
-
-  SetupDevice(&iodev, CRAS_STREAM_OUTPUT);
-  SetupRstream(&rstream, CRAS_STREAM_OUTPUT);
-
-  // Setup the output buffer for device.
-  cras_iodev_get_output_buffer_area = cras_audio_area_create(2);
-
-  // Add the device and add the stream.
-  thread_add_open_dev(thread_, &iodev);
-  thread_add_stream(thread_, &rstream, &piodev, 1);
-
-  // Assume device is running and there is an underrun.
-  // It wrote 11 frames into device but new hw_level is only 10.
-  // It means underrun may happened because 10 - 11 < 0.
-  // Audio thread should ask iodev to handle output underrun.
-  iodev.state = CRAS_IODEV_STATE_NORMAL_RUN;
-  frames_queued_ = 10;
-  cras_iodev_all_streams_written_ret = 11;
-
-  // Assume device in normal run stream state;
-  cras_iodev_prepare_output_before_write_samples_state =
-      CRAS_IODEV_STATE_NORMAL_RUN;
-
-  EXPECT_EQ(0, cras_iodev_output_underrun_called);
-  dev_io_playback_write(&thread_->open_devs[CRAS_STREAM_OUTPUT], nullptr);
-  EXPECT_EQ(1, cras_iodev_output_underrun_called);
-
-  thread_rm_open_dev(thread_, CRAS_STREAM_OUTPUT, iodev.info.idx);
-  TearDownRstream(&rstream);
-}
-
-TEST_F(StreamDeviceSuite, DoPlaybackSevereUnderrun) {
-  struct cras_iodev iodev, *piodev = &iodev;
-  struct cras_rstream rstream;
-
-  ResetGlobalStubData();
-
-  SetupDevice(&iodev, CRAS_STREAM_OUTPUT);
-  SetupRstream(&rstream, CRAS_STREAM_OUTPUT);
-
-  // Setup the output buffer for device.
-  cras_iodev_get_output_buffer_area = cras_audio_area_create(2);
-
-  // Add the device and add the stream.
-  thread_add_open_dev(thread_, &iodev);
-  thread_add_stream(thread_, &rstream, &piodev, 1);
-
-  // Assume device is running and there is a severe underrun.
-  cras_audio_thread_event_severe_underrun_called = 0;
-  iodev.state = CRAS_IODEV_STATE_NORMAL_RUN;
-  frames_queued_ = -EPIPE;
-
-  // Assume device in normal run stream state;
-  cras_iodev_prepare_output_before_write_samples_state =
-      CRAS_IODEV_STATE_NORMAL_RUN;
-
-  dev_io_playback_write(&thread_->open_devs[CRAS_STREAM_OUTPUT], nullptr);
-
-  // Audio thread should ask main thread to reset device.
-  EXPECT_EQ(1, cras_iodev_reset_request_called);
-  EXPECT_EQ(&iodev, cras_iodev_reset_request_iodev);
-  EXPECT_EQ(1, cras_audio_thread_event_severe_underrun_called);
-
-  thread_rm_open_dev(thread_, CRAS_STREAM_OUTPUT, iodev.info.idx);
-  TearDownRstream(&rstream);
-}
-
-TEST(AudioThreadStreams, DrainStream) {
-  struct cras_rstream rstream;
-  struct cras_audio_shm_header* shm_header;
-  struct audio_thread thread;
-
-  SetupRstream(&rstream, CRAS_STREAM_OUTPUT);
-  shm_header = rstream.shm->header;
-
-  shm_header->write_offset[0] = 1 * 4;
-  EXPECT_EQ(1, thread_drain_stream_ms_remaining(&thread, &rstream));
-
-  shm_header->write_offset[0] = 479 * 4;
-  EXPECT_EQ(10, thread_drain_stream_ms_remaining(&thread, &rstream));
-
-  shm_header->write_offset[0] = 0;
-  EXPECT_EQ(0, thread_drain_stream_ms_remaining(&thread, &rstream));
-
-  rstream.direction = CRAS_STREAM_INPUT;
-  shm_header->write_offset[0] = 479 * 4;
-  EXPECT_EQ(0, thread_drain_stream_ms_remaining(&thread, &rstream));
-  TearDownRstream(&rstream);
-}
-
-TEST(BusyloopDetectSuite, CheckerTest) {
-  continuous_zero_sleep_count = 0;
-  cras_audio_thread_event_busyloop_called = 0;
-  timespec wait_ts;
-  wait_ts.tv_sec = 0;
-  wait_ts.tv_nsec = 0;
-
-  check_busyloop(&wait_ts);
-  EXPECT_EQ(continuous_zero_sleep_count, 1);
-  EXPECT_EQ(cras_audio_thread_event_busyloop_called, 0);
-  check_busyloop(&wait_ts);
-  EXPECT_EQ(continuous_zero_sleep_count, 2);
-  EXPECT_EQ(cras_audio_thread_event_busyloop_called, 1);
-  check_busyloop(&wait_ts);
-  EXPECT_EQ(continuous_zero_sleep_count, 3);
-  EXPECT_EQ(cras_audio_thread_event_busyloop_called, 1);
-
-  wait_ts.tv_sec = 1;
-  check_busyloop(&wait_ts);
-  EXPECT_EQ(continuous_zero_sleep_count, 0);
-  EXPECT_EQ(cras_audio_thread_event_busyloop_called, 1);
-}
-
-extern "C" {
-
-int cras_iodev_add_stream(struct cras_iodev* iodev, struct dev_stream* stream) {
-  DL_APPEND(iodev->streams, stream);
-  return 0;
-}
-
-void cras_iodev_start_stream(struct cras_iodev* iodev,
-                             struct dev_stream* stream) {
-  dev_stream_set_running(stream);
-  cras_iodev_start_stream_called++;
-}
-
-unsigned int cras_iodev_all_streams_written(struct cras_iodev* iodev) {
-  return cras_iodev_all_streams_written_ret;
-}
-
-int cras_iodev_close(struct cras_iodev* iodev) {
-  return 0;
-}
-
-void cras_iodev_free_format(struct cras_iodev* iodev) {
-  return;
-}
-
-double cras_iodev_get_est_rate_ratio(const struct cras_iodev* iodev) {
-  return 1.0;
-}
-
-unsigned int cras_iodev_max_stream_offset(const struct cras_iodev* iodev) {
-  return 0;
-}
-
-int cras_iodev_open(struct cras_iodev* iodev,
-                    unsigned int cb_level,
-                    const struct cras_audio_format* fmt) {
-  return 0;
-}
-
-int cras_iodev_put_buffer(struct cras_iodev* iodev, unsigned int nframes) {
-  return 0;
-}
-
-struct dev_stream* cras_iodev_rm_stream(struct cras_iodev* iodev,
-                                        const struct cras_rstream* stream) {
-  struct dev_stream* out;
-  DL_FOREACH (iodev->streams, out) {
-    if (out->stream == stream) {
-      DL_DELETE(iodev->streams, out);
-      return out;
-    }
-  }
-  return NULL;
-}
-
-int cras_iodev_set_format(struct cras_iodev* iodev,
-                          const struct cras_audio_format* fmt) {
-  return 0;
-}
-
-unsigned int cras_iodev_stream_offset(struct cras_iodev* iodev,
-                                      struct dev_stream* stream) {
-  return 0;
-}
-
-int cras_iodev_is_zero_volume(const struct cras_iodev* iodev) {
-  return cras_iodev_is_zero_volume_ret;
-}
-
-int dev_stream_attached_devs(const struct dev_stream* dev_stream) {
-  return 1;
-}
-
-void cras_iodev_stream_written(struct cras_iodev* iodev,
-                               struct dev_stream* stream,
-                               unsigned int nwritten) {}
-
-int cras_iodev_update_rate(struct cras_iodev* iodev,
-                           unsigned int level,
-                           struct timespec* level_tstamp) {
-  return 0;
-}
-
-int cras_iodev_put_input_buffer(struct cras_iodev* iodev) {
-  return 0;
-}
-
-int cras_iodev_put_output_buffer(struct cras_iodev* iodev,
-                                 uint8_t* frames,
-                                 unsigned int nframes,
-                                 int* non_empty,
-                                 struct cras_fmt_conv* output_converter) {
-  cras_iodev_put_output_buffer_called++;
-  cras_iodev_put_output_buffer_nframes = nframes;
-  return 0;
-}
-
-int cras_iodev_get_input_buffer(struct cras_iodev* iodev, unsigned* frames) {
-  return 0;
-}
-
-int cras_iodev_get_output_buffer(struct cras_iodev* iodev,
-                                 struct cras_audio_area** area,
-                                 unsigned* frames) {
-  cras_iodev_get_output_buffer_called++;
-  *area = cras_iodev_get_output_buffer_area;
-  return 0;
-}
-
-int cras_iodev_get_dsp_delay(const struct cras_iodev* iodev) {
-  return 0;
-}
-
-void cras_fmt_conv_destroy(struct cras_fmt_conv** conv) {}
-
-struct cras_fmt_conv* cras_channel_remix_conv_create(unsigned int num_channels,
-                                                     const float* coefficient) {
-  return NULL;
-}
-
-void cras_rstream_dev_attach(struct cras_rstream* rstream,
-                             unsigned int dev_id,
-                             void* dev_ptr) {}
-
-void cras_rstream_dev_detach(struct cras_rstream* rstream,
-                             unsigned int dev_id) {}
-
-void cras_rstream_destroy(struct cras_rstream* stream) {}
-
-void cras_rstream_dev_offset_update(struct cras_rstream* rstream,
-                                    unsigned int frames,
-                                    unsigned int dev_id) {
-  int i = cras_rstream_dev_offset_update_called;
-  if (i < MAX_CALLS) {
-    cras_rstream_dev_offset_update_rstream_val[i] = rstream;
-    cras_rstream_dev_offset_update_frames_val[i] = frames;
-    cras_rstream_dev_offset_update_dev_id_val[i] = dev_id;
-    cras_rstream_dev_offset_update_called++;
-  }
-}
-
-unsigned int cras_rstream_dev_offset(const struct cras_rstream* rstream,
-                                     unsigned int dev_id) {
-  int i = cras_rstream_dev_offset_called;
-  if (i < MAX_CALLS) {
-    cras_rstream_dev_offset_rstream_val[i] = rstream;
-    cras_rstream_dev_offset_dev_id_val[i] = dev_id;
-    cras_rstream_dev_offset_called++;
-    return cras_rstream_dev_offset_ret[i];
-  }
-  return 0;
-}
-
-void cras_rstream_record_fetch_interval(struct cras_rstream* rstream,
-                                        const struct timespec* now) {}
-
-int cras_rstream_is_pending_reply(const struct cras_rstream* stream) {
-  return cras_rstream_is_pending_reply_ret;
-}
-
-float cras_rstream_get_volume_scaler(struct cras_rstream* rstream) {
-  return 1.0f;
-}
-
-int cras_set_rt_scheduling(int rt_lim) {
-  return 0;
-}
-
-int cras_set_thread_priority(int priority) {
-  return 0;
-}
-
-void cras_system_rm_select_fd(int fd) {}
-
-unsigned int dev_stream_capture(struct dev_stream* dev_stream,
-                                const struct cras_audio_area* area,
-                                unsigned int area_offset,
-                                float software_gain_scaler) {
-  return 0;
-}
-
-unsigned int dev_stream_capture_avail(const struct dev_stream* dev_stream) {
-  return 0;
-}
-unsigned int dev_stream_cb_threshold(const struct dev_stream* dev_stream) {
-  return 0;
-}
-
-int dev_stream_capture_update_rstream(struct dev_stream* dev_stream) {
-  return 0;
-}
-
-struct dev_stream* dev_stream_create(struct cras_rstream* stream,
-                                     unsigned int dev_id,
-                                     const struct cras_audio_format* dev_fmt,
-                                     void* dev_ptr,
-                                     struct timespec* cb_ts,
-                                     const struct timespec* sleep_interval_ts) {
-  struct dev_stream* out = static_cast<dev_stream*>(calloc(1, sizeof(*out)));
-  out->stream = stream;
-  init_cb_ts_ = *cb_ts;
-  sleep_interval_ts_ = *sleep_interval_ts;
-  return out;
-}
-
-void dev_stream_destroy(struct dev_stream* dev_stream) {
-  free(dev_stream);
-}
-
-int dev_stream_mix(struct dev_stream* dev_stream,
-                   const struct cras_audio_format* fmt,
-                   uint8_t* dst,
-                   unsigned int num_to_write) {
-  dev_stream_mix_called++;
-  return num_to_write;
-}
-
-int dev_stream_playback_frames(const struct dev_stream* dev_stream) {
-  return dev_stream_playback_frames_ret;
-}
-
-int dev_stream_playback_update_rstream(struct dev_stream* dev_stream) {
-  return 0;
-}
-
-int dev_stream_poll_stream_fd(const struct dev_stream* dev_stream) {
-  return dev_stream->stream->fd;
-}
-
-int dev_stream_request_playback_samples(struct dev_stream* dev_stream,
-                                        const struct timespec* now) {
-  dev_stream_request_playback_samples_called++;
-  return 0;
-}
-
-void dev_stream_set_delay(const struct dev_stream* dev_stream,
-                          unsigned int delay_frames) {}
-
-void dev_stream_set_dev_rate(struct dev_stream* dev_stream,
-                             unsigned int dev_rate,
-                             double dev_rate_ratio,
-                             double main_rate_ratio,
-                             int coarse_rate_adjust) {}
-
-void dev_stream_update_frames(const struct dev_stream* dev_stream) {}
-
-void dev_stream_update_next_wake_time(struct dev_stream* dev_stream) {
-  dev_stream_update_next_wake_time_called++;
-}
-
-int dev_stream_wake_time(struct dev_stream* dev_stream,
-                         unsigned int curr_level,
-                         struct timespec* level_tstamp,
-                         unsigned int cap_limit,
-                         int is_cap_limit_stream,
-                         struct timespec* wake_time) {
-  if (dev_stream_wake_time_val.find(dev_stream) !=
-      dev_stream_wake_time_val.end()) {
-    wake_time->tv_sec = dev_stream_wake_time_val[dev_stream].tv_sec;
-    wake_time->tv_nsec = dev_stream_wake_time_val[dev_stream].tv_nsec;
-  }
-  return 0;
-}
-
-int dev_stream_is_pending_reply(const struct dev_stream* dev_stream) {
-  return 0;
-}
-
-int dev_stream_flush_old_audio_messages(struct dev_stream* dev_stream) {
-  return 0;
-}
-
-int cras_iodev_frames_queued(struct cras_iodev* iodev,
-                             struct timespec* tstamp) {
-  return iodev->frames_queued(iodev, tstamp);
-}
-
-int cras_iodev_buffer_avail(struct cras_iodev* iodev, unsigned hw_level) {
-  struct timespec tstamp;
-  return iodev->buffer_size - iodev->frames_queued(iodev, &tstamp);
-}
-
-int cras_iodev_fill_odev_zeros(struct cras_iodev* odev, unsigned int frames) {
-  cras_iodev_fill_odev_zeros_frames = frames;
-  return 0;
-}
-
-int cras_iodev_output_underrun(struct cras_iodev* odev,
-                               unsigned int hw_level,
-                               unsigned int frames_written) {
-  cras_iodev_output_underrun_called++;
-  return 0;
-}
-
-int cras_iodev_prepare_output_before_write_samples(struct cras_iodev* odev) {
-  cras_iodev_prepare_output_before_write_samples_called++;
-  odev->state = cras_iodev_prepare_output_before_write_samples_state;
-  return cras_iodev_prepare_output_before_write_samples_ret;
-}
-
-float cras_iodev_get_software_gain_scaler(const struct cras_iodev* iodev) {
-  return 1.0f;
-}
-
-unsigned int cras_iodev_frames_to_play_in_sleep(struct cras_iodev* odev,
-                                                unsigned int* hw_level,
-                                                struct timespec* hw_tstamp) {
-  *hw_level = cras_iodev_frames_queued(odev, hw_tstamp);
-  cras_iodev_frames_to_play_in_sleep_called++;
-  return 0;
-}
-
-int cras_iodev_odev_should_wake(const struct cras_iodev* odev) {
-  return 1;
-}
-
-struct cras_audio_area* cras_audio_area_create(int num_channels) {
-  struct cras_audio_area* area;
-  size_t sz;
-
-  sz = sizeof(*area) + num_channels * sizeof(struct cras_channel_area);
-  area = (cras_audio_area*)calloc(1, sz);
-  area->num_channels = num_channels;
-  area->channels[0].buf = (uint8_t*)calloc(1, BUFFER_SIZE * 2 * num_channels);
-
-  return area;
-}
-
-enum CRAS_IODEV_STATE cras_iodev_state(const struct cras_iodev* iodev) {
-  return iodev->state;
-}
-
-unsigned int cras_iodev_get_num_underruns(const struct cras_iodev* iodev) {
-  return 0;
-}
-
-int cras_iodev_get_valid_frames(struct cras_iodev* iodev,
-                                struct timespec* hw_tstamp) {
-  clock_gettime(CLOCK_MONOTONIC_RAW, hw_tstamp);
-  return cras_iodev_get_valid_frames_ret;
-}
-
-int cras_iodev_reset_request(struct cras_iodev* iodev) {
-  cras_iodev_reset_request_called++;
-  cras_iodev_reset_request_iodev = iodev;
-  return 0;
-}
-
-unsigned int cras_iodev_get_num_severe_underruns(
-    const struct cras_iodev* iodev) {
-  return 0;
-}
-
-void cras_iodev_update_highest_hw_level(struct cras_iodev* iodev,
-                                        unsigned int hw_level) {}
-
-int cras_iodev_start_ramp(struct cras_iodev* odev,
-                          enum CRAS_IODEV_RAMP_REQUEST request) {
-  cras_iodev_start_ramp_odev = odev;
-  cras_iodev_start_ramp_request = request;
-  return 0;
-}
-
-int input_data_get_for_stream(struct input_data* data,
-                              struct cras_rstream* stream,
-                              struct buffer_share* offsets,
-                              struct cras_audio_area** area,
-                              unsigned int* offset) {
-  return 0;
-}
-
-int input_data_put_for_stream(struct input_data* data,
-                              struct cras_rstream* stream,
-                              struct buffer_share* offsets,
-                              unsigned int frames) {
-  return 0;
-}
-
-int cras_device_monitor_set_device_mute_state(unsigned int dev_idx) {
-  cras_device_monitor_set_device_mute_state_called++;
-  return 0;
-}
-int cras_device_monitor_error_close(unsigned int dev_idx) {
-  return 0;
-}
-
-int cras_iodev_drop_frames_by_time(struct cras_iodev* iodev,
-                                   struct timespec ts) {
-  return 0;
-}
-
-bool cras_iodev_is_on_internal_card(const struct cras_ionode* node) {
-  return 0;
-}
-
-//  From librt.
-int clock_gettime(clockid_t clk_id, struct timespec* tp) {
-  *tp = clock_gettime_retspec;
-  return 0;
-}
-
-#ifdef HAVE_WEBRTC_APM
-
-uint64_t cras_apm_list_get_effects(struct cras_apm_list* list) {
-  return 0;
-}
-
-void cras_apm_list_set_debug_recording(struct cras_apm* apm,
-                                       unsigned int stream_id,
-                                       int start,
-                                       const char* file_name_base) {}
-void cras_apm_list_set_aec_dump(struct cras_apm_list* list,
-                                void* dev_ptr,
-                                int start,
-                                int fd) {}
-
-#endif
-
-int cras_audio_thread_event_busyloop() {
-  cras_audio_thread_event_busyloop_called++;
-  return 0;
-}
-
-int cras_audio_thread_event_drop_samples() {
-  return 0;
-}
-
-int cras_audio_thread_event_severe_underrun() {
-  cras_audio_thread_event_severe_underrun_called++;
-  return 0;
-}
-
-float input_data_get_software_gain_scaler(struct input_data* data,
-                                          float idev_sw_gain_scaler,
-                                          struct cras_rstream* stream) {
-  return 1.0;
-}
-}  // extern "C"
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tests/audio_thread_unittest_obsolete.cc b/cras/src/tests/audio_thread_unittest_obsolete.cc
deleted file mode 100644
index ae9f5ef..0000000
--- a/cras/src/tests/audio_thread_unittest_obsolete.cc
+++ /dev/null
@@ -1,2191 +0,0 @@
-// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-extern "C" {
-#include "audio_thread.c"
-}
-
-#include <gtest/gtest.h>
-#include <stdio.h>
-#include <sys/select.h>
-
-extern "C" {
-
-struct dev_stream_capture_call {
-  struct dev_stream* dev_stream;
-  const struct cras_audio_area* area;
-  unsigned int dev_index;
-  unsigned int num_called;
-};
-
-struct cap_sleep_frames_call {
-  struct dev_stream* dev_stream;
-  unsigned int written;
-  unsigned int num_called;
-};
-
-static int dev_stream_mix_dont_fill_next;
-static unsigned int dev_stream_mix_count;
-static unsigned int cras_mix_mute_count;
-static unsigned int dev_stream_request_playback_samples_called;
-static unsigned int cras_rstream_destroy_called;
-static unsigned int cras_metrics_log_histogram_called;
-static const char* cras_metrics_log_histogram_name;
-static unsigned int cras_metrics_log_histogram_sample;
-static unsigned int cras_metrics_log_event_called;
-
-static void (*cras_system_add_select_fd_callback)(void* data);
-static void* cras_system_add_select_fd_callback_data;
-
-static int select_return_value;
-static struct timeval select_timeval;
-static int select_max_fd;
-static fd_set select_in_fds;
-static fd_set select_out_fds;
-static uint32_t* select_write_ptr;
-static uint32_t select_write_value;
-static unsigned int cras_iodev_set_format_called;
-static unsigned int dev_stream_set_delay_called;
-static unsigned int cras_system_get_volume_return;
-static unsigned int dev_stream_mix_called;
-
-static struct timespec time_now;
-static int cras_fmt_conversion_needed_return_val;
-static struct cras_audio_area* mock_audio_area1;
-static struct cras_audio_area* mock_audio_area2;
-static struct cras_audio_format cras_iodev_set_format_val;
-
-static struct dev_stream_capture_call dev_stream_capture_call;
-static struct cap_sleep_frames_call cap_sleep_frames_call;
-}
-
-// Number of frames past target that will be added to sleep times to insure that
-// all frames are ready.
-static const int CAP_EXTRA_SLEEP_FRAMES = 16;
-
-//  Test the audio capture path.
-class ReadStreamSuite : public testing::Test {
- protected:
-  virtual void SetUp() {
-    memset(&cras_iodev_set_format_val, 0, sizeof(cras_iodev_set_format_val));
-    cras_iodev_set_format_val.frame_rate = 44100;
-    cras_iodev_set_format_val.num_channels = 2;
-    cras_iodev_set_format_val.format = SND_PCM_FORMAT_S16_LE;
-
-    memset(&iodev_, 0, sizeof(iodev_));
-    iodev_.buffer_size = 16384;
-    cb_threshold_ = 480;
-    iodev_.direction = CRAS_STREAM_INPUT;
-
-    iodev_.frames_queued = frames_queued;
-    iodev_.delay_frames = delay_frames;
-    iodev_.get_buffer = get_buffer;
-    iodev_.put_buffer = put_buffer;
-    iodev_.is_open = is_open;
-    iodev_.open_dev = open_dev;
-    iodev_.close_dev = close_dev;
-    iodev_.dev_running = dev_running;
-
-    memcpy(&output_dev_, &iodev_, sizeof(output_dev_));
-    output_dev_.direction = CRAS_STREAM_OUTPUT;
-
-    SetupRstream(&rstream_, 1);
-    shm_ = cras_rstream_input_shm(rstream_);
-    SetupRstream(&rstream2_, 2);
-    shm2_ = cras_rstream_input_shm(rstream2_);
-
-    mock_audio_area1 = (cras_audio_area*)calloc(
-        1, sizeof(cras_audio_area) + 2 * sizeof(cras_channel_area));
-    mock_audio_area1->num_channels = 2;
-    channel_area_set_channel(&mock_audio_area1->channels[0], CRAS_CH_FL);
-    channel_area_set_channel(&mock_audio_area1->channels[1], CRAS_CH_FR);
-    rstream_->input_audio_area = mock_audio_area1;
-    mock_audio_area2 = (cras_audio_area*)calloc(
-        1, sizeof(cras_audio_area) + 2 * sizeof(cras_channel_area));
-    mock_audio_area2->num_channels = 2;
-    channel_area_set_channel(&mock_audio_area2->channels[0], CRAS_CH_FL);
-    channel_area_set_channel(&mock_audio_area2->channels[1], CRAS_CH_FR);
-    rstream2_->input_audio_area = mock_audio_area2;
-
-    dev_stream_mix_dont_fill_next = 0;
-    dev_stream_mix_count = 0;
-    dev_running_called_ = 0;
-    is_open_ = 0;
-    close_dev_called_ = 0;
-
-    cras_iodev_set_format_called = 0;
-    dev_stream_set_delay_called = 0;
-  }
-
-  virtual void TearDown() {
-    free(shm_->area);
-    free(rstream_);
-    free(shm2_->area);
-    free(rstream2_);
-    free(mock_audio_area1);
-    free(mock_audio_area2);
-  }
-
-  void SetupRstream(struct cras_rstream** rstream, int fd) {
-    struct cras_audio_shm* shm;
-
-    *rstream = (struct cras_rstream*)calloc(1, sizeof(**rstream));
-    memcpy(&(*rstream)->format, &cras_iodev_set_format_val,
-           sizeof(cras_iodev_set_format_val));
-    (*rstream)->direction = CRAS_STREAM_INPUT;
-    (*rstream)->cb_threshold = cb_threshold_;
-    (*rstream)->client = (struct cras_rclient*)this;
-
-    shm = cras_rstream_input_shm(*rstream);
-    shm->header = (struct cras_audio_shm_header*)calloc(
-        1, sizeof(*shm->header) + cb_threshold_ * 8);
-    cras_shm_set_frame_bytes(shm, 4);
-    cras_shm_set_used_size(shm, cb_threshold_ * cras_shm_frame_bytes(shm));
-  }
-
-  unsigned int GetCaptureSleepFrames() {
-    // Account for padding the sleep interval to ensure the wake up happens
-    // after the last desired frame is received.
-    return cb_threshold_ + 16;
-  }
-
-  // Stub functions for the iodev structure.
-  static int frames_queued(const cras_iodev* iodev) { return frames_queued_; }
-
-  static int delay_frames(const cras_iodev* iodev) { return delay_frames_; }
-
-  static int get_buffer(cras_iodev* iodev,
-                        struct cras_audio_area** area,
-                        unsigned int* num) {
-    size_t sz = sizeof(*area_) + sizeof(struct cras_channel_area) * 2;
-
-    if (audio_buffer_size_ < *num)
-      *num = audio_buffer_size_;
-
-    area_ = (cras_audio_area*)calloc(1, sz);
-    area_->frames = *num;
-    area_->num_channels = 2;
-    area_->channels[0].buf = audio_buffer_;
-    channel_area_set_channel(&area_->channels[0], CRAS_CH_FL);
-    area_->channels[0].step_bytes = 4;
-    area_->channels[1].buf = audio_buffer_ + 2;
-    channel_area_set_channel(&area_->channels[1], CRAS_CH_FR);
-    area_->channels[1].step_bytes = 4;
-
-    *area = area_;
-    return 0;
-  }
-
-  static int put_buffer(cras_iodev* iodev, unsigned int num) {
-    free(area_);
-    return 0;
-  }
-
-  static int is_open(const cras_iodev* iodev) { return is_open_; }
-
-  static int open_dev(cras_iodev* iodev) { return 0; }
-
-  static int close_dev(cras_iodev* iodev) {
-    close_dev_called_++;
-    return 0;
-  }
-
-  static int dev_running(const cras_iodev* iodev) {
-    dev_running_called_++;
-    return 1;
-  }
-
-  struct cras_iodev iodev_;
-  struct cras_iodev output_dev_;
-  static int is_open_;
-  static int frames_queued_;
-  static int delay_frames_;
-  static unsigned int cb_threshold_;
-  static uint8_t audio_buffer_[8192];
-  static struct cras_audio_area* area_;
-  static unsigned int audio_buffer_size_;
-  static unsigned int dev_running_called_;
-  static unsigned int close_dev_called_;
-  struct cras_rstream* rstream_;
-  struct cras_rstream* rstream2_;
-  struct cras_audio_shm* shm_;
-  struct cras_audio_shm* shm2_;
-};
-
-int ReadStreamSuite::is_open_ = 0;
-int ReadStreamSuite::frames_queued_ = 0;
-int ReadStreamSuite::delay_frames_ = 0;
-unsigned int ReadStreamSuite::close_dev_called_ = 0;
-uint8_t ReadStreamSuite::audio_buffer_[8192];
-unsigned int ReadStreamSuite::audio_buffer_size_ = 0;
-unsigned int ReadStreamSuite::dev_running_called_ = 0;
-unsigned int ReadStreamSuite::cb_threshold_ = 0;
-struct cras_audio_area* ReadStreamSuite::area_;
-
-TEST_F(ReadStreamSuite, PossiblyReadGetAvailError) {
-  struct timespec ts;
-  int rc;
-  struct audio_thread* thread;
-
-  thread = audio_thread_create();
-  ASSERT_TRUE(thread);
-  thread_set_active_dev(thread, &iodev_);
-
-  thread_add_stream(thread, rstream_);
-  EXPECT_EQ(1, cras_iodev_set_format_called);
-
-  frames_queued_ = -4;
-  is_open_ = 1;
-  rc = unified_io(thread, &ts);
-  EXPECT_EQ(-4, rc);
-  EXPECT_EQ(0, ts.tv_sec);
-  EXPECT_EQ(0, ts.tv_nsec);
-  EXPECT_EQ(0, dev_stream_set_delay_called);
-  EXPECT_EQ(1, close_dev_called_);
-
-  audio_thread_destroy(thread);
-}
-
-TEST_F(ReadStreamSuite, PossiblyReadEmpty) {
-  struct timespec ts;
-  int rc;
-  uint64_t nsec_expected;
-  struct audio_thread* thread;
-
-  thread = audio_thread_create();
-  ASSERT_TRUE(thread);
-  thread_set_active_dev(thread, &iodev_);
-
-  thread_add_stream(thread, rstream_);
-  EXPECT_EQ(1, cras_iodev_set_format_called);
-
-  //  If no samples are present, it should sleep for cb_threshold frames.
-  frames_queued_ = 0;
-  is_open_ = 1;
-  nsec_expected = (GetCaptureSleepFrames()) * 1000000000ULL /
-                  (uint64_t)cras_iodev_set_format_val.frame_rate;
-  rc = unified_io(thread, &ts);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(0, ts.tv_sec);
-  EXPECT_EQ(0, shm_->area->write_offset[0]);
-  EXPECT_GE(ts.tv_nsec, nsec_expected - 1000);
-  EXPECT_LE(ts.tv_nsec, nsec_expected + 1000);
-  EXPECT_EQ(1, dev_running_called_);
-  EXPECT_EQ(1, dev_stream_set_delay_called);
-
-  audio_thread_destroy(thread);
-}
-
-TEST_F(ReadStreamSuite, PossiblyReadTooLittleData) {
-  struct timespec ts;
-  int rc;
-  uint64_t nsec_expected;
-  static const uint64_t num_frames_short = 40;
-  struct audio_thread* thread;
-
-  thread = audio_thread_create();
-  ASSERT_TRUE(thread);
-  thread_set_active_dev(thread, &iodev_);
-
-  thread_add_stream(thread, rstream_);
-
-  frames_queued_ = cb_threshold_ - num_frames_short;
-  is_open_ = 1;
-  audio_buffer_size_ = frames_queued_;
-  nsec_expected = ((uint64_t)num_frames_short + CAP_EXTRA_SLEEP_FRAMES) *
-                  1000000000ULL /
-                  (uint64_t)cras_iodev_set_format_val.frame_rate;
-
-  rc = unified_io(thread, &ts);
-  EXPECT_EQ(0, rc);
-  /* As much data as can be, should be read. */
-  EXPECT_EQ(&audio_buffer_[0], dev_stream_capture_call.area->channels[0].buf);
-  EXPECT_EQ(rstream_, dev_stream_capture_call.dev_stream->stream);
-  EXPECT_EQ(cb_threshold_ - num_frames_short, cap_sleep_frames_call.written);
-  EXPECT_EQ(0, ts.tv_sec);
-  EXPECT_GE(ts.tv_nsec, nsec_expected - 1000);
-  EXPECT_LE(ts.tv_nsec, nsec_expected + 1000);
-
-  audio_thread_destroy(thread);
-}
-
-TEST_F(ReadStreamSuite, PossiblyReadHasDataWriteStream) {
-  struct timespec ts;
-  int rc;
-  uint64_t nsec_expected;
-  struct audio_thread* thread;
-
-  thread = audio_thread_create();
-  ASSERT_TRUE(thread);
-  thread_set_active_dev(thread, &iodev_);
-
-  thread_add_stream(thread, rstream_);
-
-  //  A full block plus 4 frames.
-  frames_queued_ = cb_threshold_ + 4;
-  audio_buffer_size_ = frames_queued_;
-
-  for (unsigned int i = 0; i < sizeof(audio_buffer_); i++)
-    audio_buffer_[i] = i;
-
-  uint64_t sleep_frames = GetCaptureSleepFrames() - 4;
-  nsec_expected = (uint64_t)sleep_frames * 1000000000ULL /
-                  (uint64_t)cras_iodev_set_format_val.frame_rate;
-  is_open_ = 1;
-  //  Give it some samples to copy.
-  rc = unified_io(thread, &ts);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(0, ts.tv_sec);
-  EXPECT_GE(ts.tv_nsec, nsec_expected - 1000);
-  EXPECT_LE(ts.tv_nsec, nsec_expected + 1000);
-  EXPECT_EQ(1, dev_stream_set_delay_called);
-  EXPECT_EQ(&audio_buffer_[0], dev_stream_capture_call.area->channels[0].buf);
-  EXPECT_EQ(rstream_, dev_stream_capture_call.dev_stream->stream);
-  EXPECT_EQ(cb_threshold_, cap_sleep_frames_call.written);
-  EXPECT_EQ(rstream_, cap_sleep_frames_call.dev_stream->stream);
-
-  audio_thread_destroy(thread);
-}
-
-TEST_F(ReadStreamSuite, PossiblyReadHasDataWriteTwoStreams) {
-  struct timespec ts;
-  int rc;
-  uint64_t nsec_expected;
-  struct audio_thread* thread;
-
-  dev_stream_capture_call.num_called = 0;
-  cap_sleep_frames_call.num_called = 0;
-
-  thread = audio_thread_create();
-  ASSERT_TRUE(thread);
-  thread_set_active_dev(thread, &iodev_);
-
-  rc = thread_add_stream(thread, rstream_);
-  EXPECT_EQ(0, rc);
-  rc = thread_add_stream(thread, rstream2_);
-  EXPECT_EQ(0, rc);
-
-  //  A full block plus 4 frames.
-  frames_queued_ = cb_threshold_ + 4;
-  audio_buffer_size_ = frames_queued_;
-
-  for (unsigned int i = 0; i < sizeof(audio_buffer_); i++)
-    audio_buffer_[i] = i;
-
-  uint64_t sleep_frames = GetCaptureSleepFrames() - 4;
-  nsec_expected = (uint64_t)sleep_frames * 1000000000ULL /
-                  (uint64_t)cras_iodev_set_format_val.frame_rate;
-  is_open_ = 1;
-  //  Give it some samples to copy.
-  rc = unified_io(thread, &ts);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(0, ts.tv_sec);
-  EXPECT_GE(ts.tv_nsec, nsec_expected - 1000);
-  EXPECT_LE(ts.tv_nsec, nsec_expected + 1000);
-  EXPECT_EQ(2, dev_stream_capture_call.num_called);
-  EXPECT_EQ(2, cap_sleep_frames_call.num_called);
-
-  audio_thread_destroy(thread);
-}
-
-TEST_F(ReadStreamSuite, PossiblyReadHasDataWriteTwoDifferentStreams) {
-  struct timespec ts;
-  int rc;
-  uint64_t nsec_expected;
-  struct audio_thread* thread;
-
-  thread = audio_thread_create();
-  ASSERT_TRUE(thread);
-  thread_set_active_dev(thread, &iodev_);
-
-  cb_threshold_ /= 2;
-  rstream_->cb_threshold = cb_threshold_;
-
-  rc = thread_add_stream(thread, rstream_);
-  EXPECT_EQ(0, rc);
-  rc = thread_add_stream(thread, rstream2_);
-  EXPECT_EQ(0, rc);
-
-  //  A full block plus 4 frames.
-  frames_queued_ = cb_threshold_ + 4;
-  audio_buffer_size_ = frames_queued_;
-
-  uint64_t sleep_frames = GetCaptureSleepFrames() - 4;
-  nsec_expected = (uint64_t)sleep_frames * 1000000000ULL /
-                  (uint64_t)cras_iodev_set_format_val.frame_rate;
-  is_open_ = 1;
-  //  Give it some samples to copy.
-  rc = unified_io(thread, &ts);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(0, ts.tv_sec);
-  EXPECT_GE(ts.tv_nsec, nsec_expected - 1000);
-  EXPECT_LE(ts.tv_nsec, nsec_expected + 1000);
-
-  frames_queued_ = cb_threshold_ + 5;
-  sleep_frames = GetCaptureSleepFrames() - 5;
-  nsec_expected = (uint64_t)sleep_frames * 1000000000ULL /
-                  (uint64_t)cras_iodev_set_format_val.frame_rate;
-  audio_buffer_size_ = frames_queued_;
-  is_open_ = 1;
-  //  Give it some samples to copy.
-  rc = unified_io(thread, &ts);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(0, ts.tv_sec);
-  EXPECT_GE(ts.tv_nsec, nsec_expected - 1000);
-  EXPECT_LE(ts.tv_nsec, nsec_expected + 1000);
-
-  audio_thread_destroy(thread);
-}
-
-TEST_F(ReadStreamSuite, PossiblyReadWriteThreeBuffers) {
-  struct timespec ts;
-  int rc;
-  struct audio_thread* thread;
-
-  thread = audio_thread_create();
-  ASSERT_TRUE(thread);
-  thread_set_active_dev(thread, &iodev_);
-
-  thread_add_stream(thread, rstream_);
-
-  //  A full block plus 4 frames.
-  frames_queued_ = cb_threshold_ + 4;
-  audio_buffer_size_ = frames_queued_;
-  is_open_ = 1;
-
-  //  Give it some samples to copy.
-  rc = unified_io(thread, &ts);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(0, cras_shm_num_overruns(shm_));
-  EXPECT_EQ(&audio_buffer_[0], dev_stream_capture_call.area->channels[0].buf);
-  EXPECT_EQ(rstream_, dev_stream_capture_call.dev_stream->stream);
-  EXPECT_EQ(cb_threshold_, cap_sleep_frames_call.written);
-  EXPECT_EQ(rstream_, cap_sleep_frames_call.dev_stream->stream);
-
-  is_open_ = 1;
-  rc = unified_io(thread, &ts);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(0, cras_shm_num_overruns(shm_));
-  EXPECT_EQ(&audio_buffer_[0], dev_stream_capture_call.area->channels[0].buf);
-  EXPECT_EQ(rstream_, dev_stream_capture_call.dev_stream->stream);
-  EXPECT_EQ(cb_threshold_, cap_sleep_frames_call.written);
-  EXPECT_EQ(rstream_, cap_sleep_frames_call.dev_stream->stream);
-
-  is_open_ = 1;
-  rc = unified_io(thread, &ts);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(&audio_buffer_[0], dev_stream_capture_call.area->channels[0].buf);
-  EXPECT_EQ(rstream_, dev_stream_capture_call.dev_stream->stream);
-  EXPECT_EQ(cb_threshold_, cap_sleep_frames_call.written);
-  EXPECT_EQ(rstream_, cap_sleep_frames_call.dev_stream->stream);
-
-  audio_thread_destroy(thread);
-}
-
-//  Test the audio playback path.
-class WriteStreamSuite : public testing::Test {
- protected:
-  virtual void SetUp() {
-    memset(&fmt_, 0, sizeof(fmt_));
-    fmt_.frame_rate = 44100;
-    fmt_.num_channels = 2;
-    fmt_.format = SND_PCM_FORMAT_S16_LE;
-
-    memset(&iodev_, 0, sizeof(iodev_));
-    iodev_.format = &fmt_;
-    iodev_.buffer_size = 16384;
-    iodev_.direction = CRAS_STREAM_OUTPUT;
-
-    iodev_.frames_queued = frames_queued;
-    iodev_.delay_frames = delay_frames;
-    iodev_.get_buffer = get_buffer;
-    iodev_.put_buffer = put_buffer;
-    iodev_.dev_running = dev_running;
-    iodev_.is_open = is_open;
-    iodev_.open_dev = open_dev;
-    iodev_.close_dev = close_dev;
-    iodev_.buffer_size = 480;
-
-    buffer_frames_ = iodev_.buffer_size;
-    cb_threshold_ = 96;
-    SetupRstream(&rstream_, 1);
-    shm_ = cras_rstream_output_shm(rstream_);
-    SetupRstream(&rstream2_, 2);
-    shm2_ = cras_rstream_output_shm(rstream2_);
-
-    thread_ = audio_thread_create();
-    ASSERT_TRUE(thread_);
-    thread_set_active_dev(thread_, &iodev_);
-
-    dev_stream_mix_dont_fill_next = 0;
-    dev_stream_mix_count = 0;
-    select_max_fd = -1;
-    select_write_ptr = NULL;
-    cras_metrics_log_event_called = 0;
-    dev_stream_request_playback_samples_called = 0;
-    cras_rstream_destroy_called = 0;
-    dev_stream_mix_called = 0;
-    is_open_ = 0;
-    close_dev_called_ = 0;
-
-    dev_running_called_ = 0;
-
-    audio_buffer_size_ = 8196;
-    thread_add_stream(thread_, rstream_);
-    frames_written_ = 0;
-  }
-
-  virtual void TearDown() {
-    free(shm_->area);
-    free(rstream_);
-    free(shm2_->area);
-    free(rstream2_);
-    audio_thread_destroy(thread_);
-  }
-
-  void SetupRstream(struct cras_rstream** rstream, int fd) {
-    struct cras_audio_shm* shm;
-
-    *rstream = (struct cras_rstream*)calloc(1, sizeof(**rstream));
-    memcpy(&(*rstream)->format, &fmt_, sizeof(fmt_));
-    (*rstream)->fd = fd;
-    (*rstream)->buffer_frames = buffer_frames_;
-    (*rstream)->cb_threshold = cb_threshold_;
-    (*rstream)->client = (struct cras_rclient*)this;
-
-    shm = cras_rstream_output_shm(*rstream);
-    shm->header = (struct cras_audio_shm_header*)calloc(
-        1, sizeof(*shm->header) + cb_threshold_ * 8);
-    cras_shm_set_frame_bytes(shm, 4);
-    cras_shm_set_used_size(shm, buffer_frames_ * cras_shm_frame_bytes(shm));
-  }
-
-  uint64_t GetCaptureSleepFrames() {
-    // Account for padding the sleep interval to ensure the wake up happens
-    // after the last desired frame is received.
-    return cb_threshold_ + CAP_EXTRA_SLEEP_FRAMES;
-  }
-
-  // Stub functions for the iodev structure.
-  static int frames_queued(const cras_iodev* iodev) {
-    return frames_queued_ + frames_written_;
-  }
-
-  static int delay_frames(const cras_iodev* iodev) { return delay_frames_; }
-
-  static int get_buffer(cras_iodev* iodev,
-                        struct cras_audio_area** area,
-                        unsigned int* num) {
-    size_t sz = sizeof(*area_) + sizeof(struct cras_channel_area) * 2;
-
-    if (audio_buffer_size_ < *num)
-      *num = audio_buffer_size_;
-
-    area_ = (cras_audio_area*)calloc(1, sz);
-    area_->frames = *num;
-    area_->num_channels = 2;
-    area_->channels[0].buf = audio_buffer_;
-    channel_area_set_channel(&area_->channels[0], CRAS_CH_FL);
-    area_->channels[0].step_bytes = 4;
-    area_->channels[1].buf = audio_buffer_ + 2;
-    channel_area_set_channel(&area_->channels[1], CRAS_CH_FR);
-    area_->channels[1].step_bytes = 4;
-
-    *area = area_;
-    return 0;
-  }
-
-  static int put_buffer(cras_iodev* iodev, unsigned int num) {
-    free(area_);
-    frames_written_ += num;
-    return 0;
-  }
-
-  static int dev_running(const cras_iodev* iodev) {
-    dev_running_called_++;
-    return dev_running_;
-  }
-
-  static int is_open(const cras_iodev* iodev) { return is_open_; }
-
-  static int open_dev(cras_iodev* iodev) {
-    is_open_ = 1;
-    open_dev_called_++;
-    return 0;
-  }
-
-  static int close_dev(cras_iodev* iodev) {
-    close_dev_called_++;
-    is_open_ = 0;
-    return 0;
-  }
-
-  struct cras_iodev iodev_;
-  static int is_open_;
-  static int frames_queued_;
-  static int frames_written_;
-  static int delay_frames_;
-  static unsigned int cb_threshold_;
-  static unsigned int buffer_frames_;
-  static uint8_t audio_buffer_[8192];
-  static unsigned int audio_buffer_size_;
-  static int dev_running_;
-  static unsigned int dev_running_called_;
-  static unsigned int close_dev_called_;
-  static unsigned int open_dev_called_;
-  static struct cras_audio_area* area_;
-  struct cras_audio_format fmt_;
-  struct cras_rstream* rstream_;
-  struct cras_rstream* rstream2_;
-  struct cras_audio_shm* shm_;
-  struct cras_audio_shm* shm2_;
-  struct audio_thread* thread_;
-};
-
-int WriteStreamSuite::is_open_ = 0;
-int WriteStreamSuite::frames_queued_ = 0;
-int WriteStreamSuite::frames_written_ = 0;
-int WriteStreamSuite::delay_frames_ = 0;
-unsigned int WriteStreamSuite::cb_threshold_ = 0;
-unsigned int WriteStreamSuite::buffer_frames_ = 0;
-uint8_t WriteStreamSuite::audio_buffer_[8192];
-unsigned int WriteStreamSuite::audio_buffer_size_ = 0;
-int WriteStreamSuite::dev_running_ = 1;
-unsigned int WriteStreamSuite::dev_running_called_ = 0;
-unsigned int WriteStreamSuite::close_dev_called_ = 0;
-unsigned int WriteStreamSuite::open_dev_called_ = 0;
-struct cras_audio_area* WriteStreamSuite::area_;
-
-TEST_F(WriteStreamSuite, PossiblyFillGetAvailError) {
-  struct timespec ts;
-  int rc;
-
-  frames_queued_ = -4;
-  is_open_ = 1;
-  rc = unified_io(thread_, &ts);
-  EXPECT_EQ(-4, rc);
-  EXPECT_EQ(0, ts.tv_sec);
-  EXPECT_EQ(0, ts.tv_nsec);
-  EXPECT_EQ(1, close_dev_called_);
-}
-
-TEST_F(WriteStreamSuite, PossiblyFillEarlyWake) {
-  struct timespec ts;
-  int rc;
-
-  //  If woken and still have tons of data to play, go back to sleep.
-  frames_queued_ = cb_threshold_ * 2;
-  audio_buffer_size_ = buffer_frames_ - frames_queued_;
-
-  iodev_.direction = CRAS_STREAM_OUTPUT;
-  is_open_ = 1;
-
-  rc = unified_io(thread_, &ts);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(0, ts.tv_sec);
-}
-
-TEST_F(WriteStreamSuite, PossiblyFillGetFromStreamFull) {
-  struct timespec ts;
-  int rc;
-  uint64_t nsec_expected;
-
-  // Have cb_threshold samples left.
-  frames_queued_ = cb_threshold_;
-  audio_buffer_size_ = buffer_frames_ - frames_queued_;
-  nsec_expected =
-      (uint64_t)cb_threshold_ * 1000000000ULL / (uint64_t)fmt_.frame_rate;
-
-  // shm has plenty of data in it.
-  shm_->area->write_offset[0] = cb_threshold_ * 4;
-
-  FD_ZERO(&select_out_fds);
-  FD_SET(rstream_->fd, &select_out_fds);
-  select_return_value = 1;
-  is_open_ = 1;
-
-  rc = unified_io(thread_, &ts);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(0, ts.tv_sec);
-  EXPECT_GE(ts.tv_nsec, nsec_expected - 1000);
-  EXPECT_LE(ts.tv_nsec, nsec_expected + 1000);
-  EXPECT_EQ(cb_threshold_, dev_stream_mix_count);
-  EXPECT_EQ(0, dev_stream_request_playback_samples_called);
-  EXPECT_EQ(-1, select_max_fd);
-}
-
-TEST_F(WriteStreamSuite, PossiblyFillGetFromStreamMinSet) {
-  struct timespec ts;
-  int rc;
-  uint64_t nsec_expected;
-
-  // Have cb_threshold samples left.
-  frames_queued_ = cb_threshold_ * 2;
-  audio_buffer_size_ = buffer_frames_ - frames_queued_;
-  // Setting the min_buffer_level should shorten the sleep time.
-  iodev_.min_buffer_level = cb_threshold_;
-
-  // shm has is empty.
-  shm_->area->write_offset[0] = 0;
-
-  FD_ZERO(&select_out_fds);
-  FD_SET(rstream_->fd, &select_out_fds);
-  select_return_value = 1;
-  is_open_ = 1;
-  // Set write offset after call to select.
-  select_write_ptr = &shm_->area->write_offset[0];
-  select_write_value = cb_threshold_ * 4;
-
-  // After the callback there will be cb_thresh of data in the buffer and
-  // cb_thresh x 2 data in the hardware (frames_queued_) = 3 cb_thresh total.
-  // It should sleep until there is a total of cb_threshold + min_buffer_level
-  // left,  or 3 - 2 = 1 cb_thresh worth of delay.
-  nsec_expected =
-      (uint64_t)cb_threshold_ * 1000000000ULL / (uint64_t)fmt_.frame_rate;
-
-  rc = unified_io(thread_, &ts);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(0, ts.tv_sec);
-  EXPECT_GE(ts.tv_nsec, nsec_expected - 1000);
-  EXPECT_LE(ts.tv_nsec, nsec_expected + 1000);
-  EXPECT_EQ(cb_threshold_, dev_stream_mix_count);
-  EXPECT_EQ(1, dev_stream_request_playback_samples_called);
-}
-
-TEST_F(WriteStreamSuite, PossiblyFillFramesQueued) {
-  struct timespec ts;
-  int rc;
-
-  // Have cb_threshold samples left.
-  frames_queued_ = cb_threshold_;
-  audio_buffer_size_ = buffer_frames_ - frames_queued_;
-
-  // shm has plenty of data in it.
-  shm_->area->write_offset[0] = cras_shm_used_size(shm_);
-
-  is_open_ = 1;
-  rc = unified_io(thread_, &ts);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(1, dev_running_called_);
-}
-
-TEST_F(WriteStreamSuite, PossiblyFillGetFromStreamOneEmpty) {
-  struct timespec ts;
-  int rc;
-
-  // Have cb_threshold samples left.
-  frames_queued_ = cb_threshold_;
-  audio_buffer_size_ = buffer_frames_ - frames_queued_;
-
-  // shm has plenty of data in it.
-  shm_->area->write_offset[0] = cras_shm_used_size(shm_);
-
-  // Test that nothing breaks if there is an empty stream.
-  dev_stream_mix_dont_fill_next = 1;
-
-  FD_ZERO(&select_out_fds);
-  FD_SET(rstream_->fd, &select_out_fds);
-  select_return_value = 1;
-
-  is_open_ = 1;
-  rc = unified_io(thread_, &ts);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(0, dev_stream_request_playback_samples_called);
-  EXPECT_EQ(-1, select_max_fd);
-  EXPECT_EQ(0, shm_->area->read_offset[0]);
-  EXPECT_EQ(0, shm_->area->read_offset[1]);
-  EXPECT_EQ(cras_shm_used_size(shm_), shm_->area->write_offset[0]);
-  EXPECT_EQ(0, shm_->area->write_offset[1]);
-}
-
-TEST_F(WriteStreamSuite, PossiblyFillGetFromStreamNeedFill) {
-  struct timespec ts;
-  uint64_t nsec_expected;
-  int rc;
-
-  //  Have cb_threshold samples left.
-  frames_queued_ = cb_threshold_;
-  audio_buffer_size_ = buffer_frames_ - frames_queued_;
-
-  //  shm is out of data.
-  shm_->area->write_offset[0] = 0;
-
-  FD_ZERO(&select_out_fds);
-  FD_SET(rstream_->fd, &select_out_fds);
-  select_return_value = 1;
-  // Set write offset after call to select.
-  select_write_ptr = &shm_->area->write_offset[0];
-  select_write_value = (buffer_frames_ - cb_threshold_) * 4;
-
-  nsec_expected = (buffer_frames_ - cb_threshold_) * 1000000000ULL /
-                  (uint64_t)fmt_.frame_rate;
-
-  is_open_ = 1;
-  rc = unified_io(thread_, &ts);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(0, ts.tv_sec);
-  EXPECT_GE(ts.tv_nsec, nsec_expected - 1000);
-  EXPECT_LE(ts.tv_nsec, nsec_expected + 1000);
-  EXPECT_EQ(buffer_frames_ - cb_threshold_, dev_stream_mix_count);
-  EXPECT_EQ(1, dev_stream_request_playback_samples_called);
-  EXPECT_NE(-1, select_max_fd);
-  EXPECT_EQ(0, memcmp(&select_out_fds, &select_in_fds, sizeof(select_in_fds)));
-  EXPECT_EQ(0, shm_->area->read_offset[0]);
-}
-
-TEST_F(WriteStreamSuite, PossiblyFillGetFromTwoStreamsFull) {
-  struct timespec ts;
-  int rc;
-  uint64_t nsec_expected;
-
-  //  Have cb_threshold samples left.
-  frames_queued_ = cras_rstream_get_cb_threshold(rstream_);
-  audio_buffer_size_ = buffer_frames_ - frames_queued_;
-  nsec_expected = (uint64_t)cras_rstream_get_cb_threshold(rstream_) *
-                  1000000000ULL / (uint64_t)fmt_.frame_rate;
-
-  //  shm has plenty of data in it.
-  shm_->area->write_offset[0] = cras_rstream_get_cb_threshold(rstream_) * 4;
-  shm2_->area->write_offset[0] = cras_rstream_get_cb_threshold(rstream2_) * 4;
-
-  thread_add_stream(thread_, rstream2_);
-
-  is_open_ = 1;
-  rc = unified_io(thread_, &ts);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(2, dev_stream_mix_called);
-  EXPECT_EQ(0, ts.tv_sec);
-  EXPECT_GE(ts.tv_nsec, nsec_expected - 1000);
-  EXPECT_LE(ts.tv_nsec, nsec_expected + 1000);
-  EXPECT_EQ(cras_rstream_get_cb_threshold(rstream_), dev_stream_mix_count);
-  EXPECT_EQ(0, dev_stream_request_playback_samples_called);
-  EXPECT_EQ(-1, select_max_fd);
-}
-
-TEST_F(WriteStreamSuite, PossiblyFillGetFromTwoOneEmptySmallerCbThreshold) {
-  struct timespec ts;
-  int rc;
-  uint64_t nsec_expected;
-
-  // Have cb_threshold samples left.
-  frames_queued_ = cb_threshold_;
-  audio_buffer_size_ = buffer_frames_ - frames_queued_;
-
-  // First stream is empty and with a smaller cb_threshold. This is to test
-  // the case that when buffer level reaches the cb_threshold of one stream
-  // but not yet the other stream of smaller cb_threshold.
-  rstream_->cb_threshold -= 20;
-  nsec_expected = 20 * 1000000000ULL / (uint64_t)fmt_.frame_rate;
-  shm_->area->write_offset[0] = 0;
-  shm2_->area->write_offset[0] = cras_shm_used_size(shm2_);
-
-  thread_add_stream(thread_, rstream2_);
-  is_open_ = 1;
-  rc = unified_io(thread_, &ts);
-
-  // In this case, assert (1) we didn't request the empty stream since buffer
-  // level is larger then its cb_threshold, (2) still mix both streams so
-  // dev_stream_mix_count is zero, and (3) the resulting sleep frames
-  // equals the cb_threshold difference.
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(2, dev_stream_mix_called);
-  EXPECT_GE(ts.tv_nsec, nsec_expected - 1000);
-  EXPECT_LE(ts.tv_nsec, nsec_expected + 1000);
-  EXPECT_EQ(0, dev_stream_mix_count);
-  EXPECT_EQ(0, dev_stream_request_playback_samples_called);
-}
-
-TEST_F(WriteStreamSuite, PossiblyFillGetFromTwoOneEmptyAfterFetch) {
-  struct timespec ts;
-  int rc;
-
-  // Have cb_threshold samples left.
-  frames_queued_ = cb_threshold_;
-  audio_buffer_size_ = buffer_frames_ - frames_queued_;
-
-  // First stream empty while the second stream full.
-  shm_->area->write_offset[0] = 0;
-  shm2_->area->write_offset[0] = cras_shm_used_size(shm2_);
-
-  thread_add_stream(thread_, rstream2_);
-
-  FD_ZERO(&select_out_fds);
-  FD_SET(rstream_->fd, &select_out_fds);
-  select_return_value = 1;
-
-  is_open_ = 1;
-  rc = unified_io(thread_, &ts);
-
-  // Assert that the empty stream is skipped, only one stream mixed.
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(1, dev_stream_mix_called);
-  EXPECT_EQ(buffer_frames_ - cb_threshold_, dev_stream_mix_count);
-  EXPECT_EQ(1, dev_stream_request_playback_samples_called);
-  EXPECT_NE(-1, select_max_fd);
-  EXPECT_EQ(0, memcmp(&select_out_fds, &select_in_fds, sizeof(select_in_fds)));
-}
-
-TEST_F(WriteStreamSuite, PossiblyFillGetFromTwoStreamsFullOneMixes) {
-  struct timespec ts;
-  int rc;
-  size_t written_expected;
-
-  //  Have cb_threshold samples left.
-  frames_queued_ = cb_threshold_;
-  audio_buffer_size_ = buffer_frames_ - frames_queued_;
-  written_expected = buffer_frames_ - cb_threshold_;
-
-  //  shm has plenty of data in it.
-  shm_->area->write_offset[0] = cras_shm_used_size(shm_);
-  shm2_->area->write_offset[0] = cras_shm_used_size(shm2_);
-
-  thread_add_stream(thread_, rstream2_);
-
-  //  Test that nothing breaks if one stream doesn't fill.
-  dev_stream_mix_dont_fill_next = 1;
-
-  is_open_ = 1;
-  rc = unified_io(thread_, &ts);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(0, dev_stream_request_playback_samples_called);
-  EXPECT_EQ(0, shm_->area->read_offset[0]);  //  No write from first stream.
-  EXPECT_EQ(written_expected * 4, shm2_->area->read_offset[0]);
-}
-
-TEST_F(WriteStreamSuite, PossiblyFillGetFromTwoStreamsOneLimited) {
-  struct timespec ts;
-  int rc;
-  uint64_t nsec_expected;
-  static const unsigned int smaller_frames = 10;
-
-  //  Have cb_threshold samples left.
-  frames_queued_ = cb_threshold_;
-  audio_buffer_size_ = buffer_frames_ - frames_queued_;
-  nsec_expected =
-      (uint64_t)smaller_frames * (1000000000ULL / (uint64_t)fmt_.frame_rate);
-
-  //  One has too little the other is full.
-  shm_->area->write_offset[0] = smaller_frames * 4;
-  shm_->area->write_buf_idx = 1;
-  shm2_->area->write_offset[0] = cras_shm_used_size(shm2_);
-  shm2_->area->write_buf_idx = 1;
-
-  thread_add_stream(thread_, rstream2_);
-
-  FD_ZERO(&select_out_fds);
-  FD_SET(rstream_->fd, &select_out_fds);
-  select_return_value = 1;
-
-  is_open_ = 1;
-  rc = unified_io(thread_, &ts);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(0, ts.tv_sec);
-  EXPECT_GE(ts.tv_nsec, nsec_expected - 1000);
-  EXPECT_LE(ts.tv_nsec, nsec_expected + 1000);
-  EXPECT_EQ(smaller_frames, dev_stream_mix_count);
-  EXPECT_EQ(1, dev_stream_request_playback_samples_called);
-  EXPECT_NE(-1, select_max_fd);
-}
-
-TEST_F(WriteStreamSuite, DrainOutputBufferCompelete) {
-  frames_queued_ = 3 * cb_threshold_;
-  close_dev_called_ = 0;
-  // All the audio in hw buffer are extra silent frames.
-  iodev_.extra_silent_frames = frames_queued_ + 1;
-  drain_output_buffer(thread_, &iodev_);
-  EXPECT_EQ(1, close_dev_called_);
-}
-
-TEST_F(WriteStreamSuite, DrainOutputBufferWaitForPlayback) {
-  // Hardware buffer is full.
-  frames_queued_ = buffer_frames_;
-  iodev_.extra_silent_frames = 0;
-  close_dev_called_ = 0;
-  drain_output_buffer(thread_, &iodev_);
-  EXPECT_EQ(0, close_dev_called_);
-}
-
-TEST_F(WriteStreamSuite, DrainOutputBufferWaitForAudio) {
-  // Hardware buffer is almost empty
-  frames_queued_ = 30;
-  iodev_.extra_silent_frames = 0;
-  close_dev_called_ = 0;
-  drain_output_buffer(thread_, &iodev_);
-  EXPECT_LT(cb_threshold_ - frames_queued_, frames_written_);
-  EXPECT_EQ(0, close_dev_called_);
-}
-
-TEST_F(WriteStreamSuite, DrainOutputStream) {
-  struct timespec ts;
-  int rc;
-
-  // Have 3 * cb_threshold samples in the hw buffer.
-  // Have 4 * cb_threshold samples in the first stream's shm
-  // Note: used_size = 5 * cb_threshold.
-  frames_queued_ = 3 * cb_threshold_;
-  audio_buffer_size_ = buffer_frames_ - frames_queued_;
-  shm_->area->write_offset[0] = 4 * cb_threshold_ * 4;
-
-  is_open_ = 1;
-  close_dev_called_ = 0;
-  open_dev_called_ = 0;
-
-  thread_disconnect_stream(thread_, rstream_);
-
-  // We should be draining the audio.
-  EXPECT_EQ(0, close_dev_called_);
-  EXPECT_EQ(0, open_dev_called_);
-
-  rc = unified_io(thread_, &ts);
-
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(2 * cb_threshold_, frames_written_);
-  EXPECT_EQ(0, open_dev_called_);
-  EXPECT_EQ(0, close_dev_called_);
-
-  // Clear the hardware buffer
-  frames_queued_ = 0;
-  frames_written_ = 0;
-  audio_buffer_size_ = buffer_frames_ - frames_queued_;
-
-  rc = unified_io(thread_, &ts);
-
-  // Verified that all data in stream1 is written.
-  // The device is not closed before we have played all the content.
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(2 * cb_threshold_, frames_written_);
-  EXPECT_EQ(0, close_dev_called_);
-
-  // Clear the hardware buffer again.
-  frames_queued_ = 0;
-  frames_written_ = 0;
-  audio_buffer_size_ = buffer_frames_ - frames_queued_;
-  rc = unified_io(thread_, &ts);
-
-  EXPECT_EQ(1, cras_rstream_destroy_called);
-  EXPECT_EQ(1, iodev_.is_draining);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(480, thread_->buffer_frames[CRAS_STREAM_OUTPUT]);
-  EXPECT_EQ(96, thread_->cb_threshold[CRAS_STREAM_OUTPUT]);
-
-  // Clear the hardware buffer again.
-  frames_queued_ = 0;
-  frames_written_ = 0;
-  audio_buffer_size_ = buffer_frames_ - frames_queued_;
-  rc = unified_io(thread_, &ts);
-
-  EXPECT_EQ(1, close_dev_called_);
-  EXPECT_EQ(0, thread_->buffer_frames[CRAS_STREAM_OUTPUT]);
-  EXPECT_EQ(0, thread_->cb_threshold[CRAS_STREAM_OUTPUT]);
-}
-
-//  Test adding and removing streams.
-class AddStreamSuite : public testing::Test {
- protected:
-  virtual void SetUp() {
-    memset(&cras_iodev_set_format_val, 0, sizeof(cras_iodev_set_format_val));
-    cras_iodev_set_format_val.frame_rate = 44100;
-    cras_iodev_set_format_val.num_channels = 2;
-    cras_iodev_set_format_val.format = SND_PCM_FORMAT_S16_LE;
-
-    memset(&iodev_, 0, sizeof(iodev_));
-    iodev_.buffer_size = 16384;
-    used_size_ = 480;
-    cb_threshold_ = 96;
-    iodev_.direction = CRAS_STREAM_OUTPUT;
-
-    iodev_.is_open = is_open;
-    iodev_.open_dev = open_dev;
-    iodev_.close_dev = close_dev;
-    iodev_.get_buffer = get_buffer;
-    iodev_.put_buffer = put_buffer;
-
-    is_open_ = 0;
-    is_open_called_ = 0;
-    open_dev_called_ = 0;
-    close_dev_called_ = 0;
-    open_dev_return_val_ = 0;
-
-    cras_iodev_set_format_called = 0;
-    cras_rstream_destroy_called = 0;
-    cras_metrics_log_histogram_called = 0;
-    cras_metrics_log_histogram_name = NULL;
-    cras_metrics_log_histogram_sample = 0;
-
-    audio_buffer_size_ = 8196;
-  }
-
-  virtual void TearDown() {}
-
-  unsigned int GetCaptureSleepFrames() {
-    // Account for padding the sleep interval to ensure the wake up happens
-    // after the last desired frame is received.
-    return cb_threshold_ + 16;
-  }
-
-  // Stub functions for the iodev structure.
-  static int get_buffer(cras_iodev* iodev,
-                        struct cras_audio_area** area,
-                        unsigned int* num) {
-    size_t sz = sizeof(*area_) + sizeof(struct cras_channel_area) * 2;
-
-    if (audio_buffer_size_ < *num)
-      *num = audio_buffer_size_;
-
-    area_ = (cras_audio_area*)calloc(1, sz);
-    area_->frames = *num;
-    area_->num_channels = 2;
-    area_->channels[0].buf = audio_buffer_;
-    channel_area_set_channel(&area_->channels[0], CRAS_CH_FL);
-    area_->channels[0].step_bytes = 4;
-    area_->channels[1].buf = audio_buffer_ + 2;
-    channel_area_set_channel(&area_->channels[1], CRAS_CH_FR);
-    area_->channels[1].step_bytes = 4;
-
-    *area = area_;
-    return 0;
-  }
-
-  static int put_buffer(cras_iodev* iodev, unsigned int num) {
-    free(area_);
-    return 0;
-  }
-
-  static int is_open(const cras_iodev* iodev) {
-    is_open_called_++;
-    return is_open_;
-  }
-
-  static int open_dev(cras_iodev* iodev) {
-    open_dev_called_++;
-    is_open_ = true;
-    return open_dev_return_val_;
-  }
-
-  static int close_dev(cras_iodev* iodev) {
-    close_dev_called_++;
-    is_open_ = false;
-    return 0;
-  }
-
-  void add_rm_two_streams(CRAS_STREAM_DIRECTION direction) {
-    int rc;
-    struct cras_rstream *new_stream, *second_stream;
-    cras_audio_shm* shm;
-    struct cras_audio_format* fmt;
-    struct audio_thread* thread;
-
-    thread = audio_thread_create();
-
-    fmt = (struct cras_audio_format*)malloc(sizeof(*fmt));
-    memcpy(fmt, &cras_iodev_set_format_val, sizeof(*fmt));
-    iodev_.direction = direction;
-    new_stream = (struct cras_rstream*)calloc(1, sizeof(*new_stream));
-    new_stream->fd = 55;
-    new_stream->buffer_frames = 65;
-    new_stream->cb_threshold = 80;
-    new_stream->direction = direction;
-    memcpy(&new_stream->format, fmt, sizeof(*fmt));
-    shm = cras_rstream_output_shm(new_stream);
-    shm->header =
-        (struct cras_audio_shm_header*)calloc(1, sizeof(*shm->header));
-
-    if (direction == CRAS_STREAM_INPUT)
-      thread_set_active_dev(thread, &iodev_);
-    else
-      thread_set_active_dev(thread, &iodev_);
-
-    thread_add_stream(thread, new_stream);
-    EXPECT_EQ(1, thread->devs_open[direction]);
-    EXPECT_EQ(1, open_dev_called_);
-    EXPECT_EQ(65, thread->buffer_frames[direction]);
-    if (direction == CRAS_STREAM_OUTPUT)
-      EXPECT_EQ(32, thread->cb_threshold[direction]);
-    else
-      EXPECT_EQ(80, thread->cb_threshold[direction]);
-
-    is_open_ = 1;
-
-    second_stream = (struct cras_rstream*)calloc(1, sizeof(*second_stream));
-    second_stream->fd = 56;
-    second_stream->buffer_frames = 25;
-    second_stream->cb_threshold = 12;
-    second_stream->direction = direction;
-    memcpy(&second_stream->format, fmt, sizeof(*fmt));
-    shm = cras_rstream_output_shm(second_stream);
-    shm->header =
-        (struct cras_audio_shm_header*)calloc(1, sizeof(*shm->header));
-
-    is_open_called_ = 0;
-    thread_add_stream(thread, second_stream);
-    EXPECT_EQ(1, thread->devs_open[direction]);
-    EXPECT_EQ(1, open_dev_called_);
-    EXPECT_EQ(25, thread->buffer_frames[direction]);
-    EXPECT_EQ(12, thread->cb_threshold[direction]);
-
-    //  Remove the streams.
-    rc = thread_remove_stream(thread, second_stream);
-    EXPECT_EQ(1, rc);
-    EXPECT_EQ(0, close_dev_called_);
-    if (direction == CRAS_STREAM_OUTPUT)
-      EXPECT_EQ(32, thread->cb_threshold[direction]);
-    else
-      EXPECT_EQ(80, thread->cb_threshold[direction]);
-
-    rc = thread_remove_stream(thread, new_stream);
-    EXPECT_EQ(0, rc);
-
-    // For output stream, we enter the draining mode;
-    // for input stream, we close the device directly.
-    if (direction == CRAS_STREAM_INPUT) {
-      EXPECT_EQ(0, thread->devs_open[direction]);
-      EXPECT_EQ(0, thread->buffer_frames[direction]);
-      EXPECT_EQ(0, thread->cb_threshold[direction]);
-    } else {
-      EXPECT_EQ(1, iodev_.is_draining);
-    }
-
-    free(fmt);
-    shm = cras_rstream_output_shm(new_stream);
-    audio_thread_destroy(thread);
-    free(shm->header);
-    free(new_stream);
-    shm = cras_rstream_output_shm(second_stream);
-    free(shm->header);
-    free(second_stream);
-  }
-
-  struct cras_iodev iodev_;
-  static int is_open_;
-  static int is_open_called_;
-  static int open_dev_called_;
-  static int open_dev_return_val_;
-  static int close_dev_called_;
-  static int used_size_;
-  static int cb_threshold_;
-  struct cras_audio_format fmt_;
-  static struct cras_audio_area* area_;
-  static uint8_t audio_buffer_[8192];
-  static unsigned int audio_buffer_size_;
-};
-
-int AddStreamSuite::is_open_ = 0;
-int AddStreamSuite::is_open_called_ = 0;
-int AddStreamSuite::open_dev_called_ = 0;
-int AddStreamSuite::open_dev_return_val_ = 0;
-int AddStreamSuite::close_dev_called_ = 0;
-int AddStreamSuite::used_size_ = 0;
-int AddStreamSuite::cb_threshold_ = 0;
-struct cras_audio_area* AddStreamSuite::area_;
-uint8_t AddStreamSuite::audio_buffer_[8192];
-unsigned int AddStreamSuite::audio_buffer_size_ = 0;
-
-TEST_F(AddStreamSuite, SimpleAddOutputStream) {
-  int rc;
-  cras_rstream* new_stream;
-  cras_audio_shm* shm;
-  struct audio_thread* thread;
-
-  thread = audio_thread_create();
-
-  new_stream = (struct cras_rstream*)calloc(1, sizeof(*new_stream));
-  new_stream->client = (struct cras_rclient*)this;
-  new_stream->fd = 55;
-  new_stream->buffer_frames = 65;
-  new_stream->cb_threshold = 80;
-  memcpy(&new_stream->format, &cras_iodev_set_format_val,
-         sizeof(cras_iodev_set_format_val));
-
-  shm = cras_rstream_output_shm(new_stream);
-  shm->header = (struct cras_audio_shm_header*)calloc(1, sizeof(*shm->header));
-
-  thread_set_active_dev(thread, &iodev_);
-
-  rc = thread_add_stream(thread, new_stream);
-  ASSERT_EQ(0, rc);
-  EXPECT_EQ(1, thread->devs_open[CRAS_STREAM_OUTPUT]);
-  EXPECT_EQ(1, open_dev_called_);
-  EXPECT_EQ(65, thread->buffer_frames[CRAS_STREAM_OUTPUT]);
-  EXPECT_EQ(32, thread->cb_threshold[CRAS_STREAM_OUTPUT]);
-
-  is_open_ = 1;
-
-  //  remove the stream.
-  rc = thread_remove_stream(thread, new_stream);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(1, iodev_.is_draining);
-  EXPECT_EQ(0, cras_metrics_log_histogram_called);
-  EXPECT_EQ(0, cras_rstream_destroy_called);
-
-  rc = thread_disconnect_stream(thread, new_stream);
-  EXPECT_EQ(1, cras_rstream_destroy_called);
-
-  free(shm->header);
-  audio_thread_destroy(thread);
-  free(new_stream);
-}
-
-TEST_F(AddStreamSuite, AddStreamOpenFail) {
-  struct audio_thread* thread;
-  cras_rstream new_stream;
-  cras_audio_shm* shm;
-
-  thread = audio_thread_create();
-  ASSERT_TRUE(thread);
-  thread_set_active_dev(thread, &iodev_);
-  printf("1\n");
-
-  shm = cras_rstream_output_shm(&new_stream);
-  shm->header = (struct cras_audio_shm_header*)calloc(1, sizeof(*shm->header));
-
-  open_dev_return_val_ = -1;
-  new_stream.direction = CRAS_STREAM_OUTPUT;
-  EXPECT_EQ(AUDIO_THREAD_OUTPUT_DEV_ERROR,
-            thread_add_stream(thread, &new_stream));
-  printf("2\n");
-  EXPECT_EQ(1, open_dev_called_);
-  EXPECT_EQ(1, cras_iodev_set_format_called);
-  audio_thread_destroy(thread);
-  printf("3\n");
-  free(shm->header);
-}
-
-TEST_F(AddStreamSuite, AddRmTwoOutputStreams) {
-  add_rm_two_streams(CRAS_STREAM_OUTPUT);
-}
-
-TEST_F(AddStreamSuite, AddRmTwoInputStreams) {
-  add_rm_two_streams(CRAS_STREAM_INPUT);
-}
-
-TEST_F(AddStreamSuite, RmStreamLogLongestTimeout) {
-  int rc;
-  cras_rstream* new_stream;
-  cras_audio_shm* shm;
-  struct audio_thread* thread;
-
-  thread = audio_thread_create();
-
-  new_stream = (struct cras_rstream*)calloc(1, sizeof(*new_stream));
-  new_stream->fd = 55;
-  new_stream->buffer_frames = 65;
-  new_stream->cb_threshold = 80;
-  memcpy(&new_stream->format, &cras_iodev_set_format_val,
-         sizeof(cras_iodev_set_format_val));
-
-  shm = cras_rstream_output_shm(new_stream);
-  shm->header = (struct cras_audio_shm_header*)calloc(1, sizeof(*shm->header));
-
-  thread_set_active_dev(thread, &iodev_);
-  rc = thread_add_stream(thread, new_stream);
-  ASSERT_EQ(0, rc);
-  EXPECT_EQ(1, thread->devs_open[CRAS_STREAM_OUTPUT]);
-  EXPECT_EQ(1, open_dev_called_);
-  EXPECT_EQ(65, thread->buffer_frames[CRAS_STREAM_OUTPUT]);
-  EXPECT_EQ(32, thread->cb_threshold[CRAS_STREAM_OUTPUT]);
-
-  is_open_ = 1;
-  cras_shm_set_longest_timeout(shm, 90);
-
-  //  remove the stream.
-  rc = thread_remove_stream(thread, new_stream);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(1, iodev_.is_draining);
-
-  cras_system_add_select_fd_callback(cras_system_add_select_fd_callback_data);
-
-  EXPECT_EQ(1, cras_metrics_log_histogram_called);
-  EXPECT_STREQ(kStreamTimeoutMilliSeconds, cras_metrics_log_histogram_name);
-  EXPECT_EQ(90, cras_metrics_log_histogram_sample);
-
-  free(shm->header);
-  free(new_stream);
-  audio_thread_destroy(thread);
-}
-
-class ActiveDevicesSuite : public testing::Test {
- protected:
-  virtual void SetUp() {
-    memset(&cras_iodev_set_format_val, 0, sizeof(cras_iodev_set_format_val));
-    cras_iodev_set_format_val.frame_rate = 44100;
-    cras_iodev_set_format_val.num_channels = 2;
-    cras_iodev_set_format_val.format = SND_PCM_FORMAT_S16_LE;
-
-    memset(&iodev_, 0, sizeof(iodev_));
-    memset(&iodev2_, 0, sizeof(iodev2_));
-    iodev_.close_dev = close_dev;
-    iodev_.is_open = is_open;
-    iodev_.open_dev = open_dev;
-    iodev_.delay_frames = delay_frames;
-    iodev_.get_buffer = get_buffer;
-    iodev_.put_buffer = put_buffer;
-    iodev_.frames_queued = frames_queued;
-    iodev_.delay_frames = delay_frames;
-    iodev_.dev_running = dev_running;
-    iodev_.buffer_size = 2048;
-    iodev2_.close_dev = close_dev;
-    iodev2_.is_open = is_open;
-    iodev2_.open_dev = open_dev;
-    iodev2_.delay_frames = delay_frames;
-    iodev2_.get_buffer = get_buffer;
-    iodev2_.put_buffer = put_buffer;
-    iodev2_.frames_queued = frames_queued;
-    iodev2_.delay_frames = delay_frames;
-    iodev2_.dev_running = dev_running;
-    iodev2_.buffer_size = 2048;
-    thread_ = audio_thread_create();
-    ASSERT_TRUE(thread_);
-
-    buffer_frames_ = 500;
-    cb_threshold_ = 250;
-    SetupRstream(&rstream_);
-    SetupRstream(&rstream2_);
-    rstream2_->buffer_frames -= 50;
-    rstream2_->cb_threshold -= 50;
-
-    mock_audio_area1 = (cras_audio_area*)calloc(
-        1, sizeof(cras_audio_area) + 2 * sizeof(cras_channel_area));
-    mock_audio_area1->num_channels = 2;
-    channel_area_set_channel(&mock_audio_area1->channels[0], CRAS_CH_FL);
-    channel_area_set_channel(&mock_audio_area1->channels[1], CRAS_CH_FR);
-    rstream_->input_audio_area = mock_audio_area1;
-    mock_audio_area2 = (cras_audio_area*)calloc(
-        1, sizeof(cras_audio_area) + 2 * sizeof(cras_channel_area));
-    mock_audio_area2->num_channels = 2;
-    channel_area_set_channel(&mock_audio_area2->channels[0], CRAS_CH_FL);
-    channel_area_set_channel(&mock_audio_area2->channels[1], CRAS_CH_FR);
-    rstream2_->input_audio_area = mock_audio_area2;
-
-    cras_iodev_set_format_called = 0;
-    close_dev_called_ = 0;
-    is_open_ = 0;
-    cras_fmt_conversion_needed_return_val = 0;
-    open_dev_val_idx_ = 0;
-    delay_frames_val_idx_ = 0;
-    frames_queued_val_idx_ = 0;
-    frames_queued_[0] = 250;
-    frames_queued_[1] = 250;
-    get_buffer_val_idx_ = 0;
-    put_buffer_val_idx_ = 0;
-    for (int i = 0; i < 8; i++) {
-      open_dev_val_[i] = 0;
-      delay_frames_[i] = 0;
-      audio_buffer_size_[i] = 250;
-      get_buffer_rc_[i] = 0;
-      put_buffer_rc_[i] = 0;
-    }
-  }
-
-  virtual void TearDown() {
-    struct cras_audio_shm* shm;
-    audio_thread_destroy(thread_);
-    shm = cras_rstream_output_shm(rstream_);
-    free(shm->header);
-    free(rstream_);
-    free(mock_audio_area1);
-    free(mock_audio_area2);
-  }
-
-  void SetupRstream(struct cras_rstream** rstream) {
-    struct cras_audio_shm* shm;
-    *rstream = (struct cras_rstream*)calloc(1, sizeof(**rstream));
-    memcpy(&(*rstream)->format, &cras_iodev_set_format_val,
-           sizeof(cras_iodev_set_format_val));
-    (*rstream)->direction = CRAS_STREAM_OUTPUT;
-    (*rstream)->buffer_frames = buffer_frames_;
-    (*rstream)->cb_threshold = cb_threshold_;
-    shm = cras_rstream_output_shm(*rstream);
-    shm->header = (struct cras_audio_shm_header*)calloc(
-        1, sizeof(*shm->header) + cb_threshold_ * 8);
-    cras_shm_set_frame_bytes(shm, 4);
-    cras_shm_set_used_size(shm, buffer_frames_ * cras_shm_frame_bytes(shm));
-    shm = cras_rstream_input_shm(*rstream);
-    shm->header = (struct cras_audio_shm_header*)calloc(
-        1, sizeof(*shm->header) + buffer_frames_ * 8);
-    cras_shm_set_frame_bytes(shm, 4);
-    cras_shm_set_used_size(shm, cb_threshold_ * cras_shm_frame_bytes(shm));
-  }
-
-  static int close_dev(struct cras_iodev* iodev) {
-    close_dev_called_++;
-    return 0;
-  }
-
-  static int is_open(const cras_iodev* iodev) { return is_open_; }
-
-  static int open_dev(struct cras_iodev* iodev) {
-    open_dev_val_idx_ %= 8;
-    is_open_ = 1;
-    return open_dev_val_[open_dev_val_idx_++];
-  }
-
-  static int delay_frames(const cras_iodev* iodev) {
-    delay_frames_val_idx_ %= 8;
-    return delay_frames_[delay_frames_val_idx_++];
-  }
-
-  static int dev_running(const cras_iodev* iodev) { return 1; }
-
-  static int frames_queued(const cras_iodev* iodev) {
-    frames_queued_val_idx_ %= 2;
-    return frames_queued_[frames_queued_val_idx_++];
-  }
-
-  static int get_buffer(cras_iodev* iodev,
-                        struct cras_audio_area** area,
-                        unsigned int* num) {
-    size_t sz = sizeof(*area_) + sizeof(struct cras_channel_area) * 2;
-
-    get_buffer_val_idx_ %= 8;
-    if (audio_buffer_size_[get_buffer_val_idx_] < *num)
-      *num = audio_buffer_size_[get_buffer_val_idx_];
-
-    area_ = (cras_audio_area*)calloc(1, sz);
-    area_->frames = *num;
-    area_->num_channels = 2;
-    area_->channels[0].buf = audio_buffer_[get_buffer_val_idx_];
-    channel_area_set_channel(&area_->channels[0], CRAS_CH_FL);
-    area_->channels[0].step_bytes = 4;
-    area_->channels[1].buf = audio_buffer_[get_buffer_val_idx_] + 2;
-    channel_area_set_channel(&area_->channels[1], CRAS_CH_FR);
-    area_->channels[1].step_bytes = 4;
-
-    *area = area_;
-
-    get_buffer_val_idx_++;
-    return 0;
-  }
-
-  static int put_buffer(cras_iodev* iodev, unsigned int num) {
-    free(area_);
-    put_buffer_val_idx_ %= 8;
-    return put_buffer_rc_[put_buffer_val_idx_++];
-  }
-
-  static int is_open_;
-  static int open_dev_val_[8];
-  static int open_dev_val_idx_;
-  static int close_dev_called_;
-  static int buffer_frames_;
-  static int cb_threshold_;
-  static int frames_queued_[2];
-  static int frames_queued_val_idx_;
-  static uint8_t audio_buffer_[8][8192];
-  static unsigned int audio_buffer_size_[8];
-  static int get_buffer_rc_[8];
-  static int put_buffer_rc_[8];
-  static int get_buffer_val_idx_;
-  static int put_buffer_val_idx_;
-  struct cras_iodev iodev_;
-  struct cras_iodev iodev2_;
-  struct cras_rstream* rstream_;
-  struct cras_rstream* rstream2_;
-  struct audio_thread* thread_;
-  static struct cras_audio_area* area_;
-  static int delay_frames_val_idx_;
-  static int delay_frames_[8];
-};
-
-int ActiveDevicesSuite::is_open_ = 0;
-int ActiveDevicesSuite::buffer_frames_ = 0;
-int ActiveDevicesSuite::cb_threshold_ = 0;
-int ActiveDevicesSuite::frames_queued_[2];
-int ActiveDevicesSuite::frames_queued_val_idx_;
-int ActiveDevicesSuite::close_dev_called_ = 0;
-int ActiveDevicesSuite::open_dev_val_[8];
-int ActiveDevicesSuite::open_dev_val_idx_ = 0;
-int ActiveDevicesSuite::delay_frames_val_idx_ = 0;
-int ActiveDevicesSuite::delay_frames_[8];
-uint8_t ActiveDevicesSuite::audio_buffer_[8][8192];
-unsigned int ActiveDevicesSuite::audio_buffer_size_[8];
-int ActiveDevicesSuite::get_buffer_val_idx_ = 0;
-int ActiveDevicesSuite::put_buffer_val_idx_ = 0;
-int ActiveDevicesSuite::get_buffer_rc_[8];
-int ActiveDevicesSuite::put_buffer_rc_[8];
-struct cras_audio_area* ActiveDevicesSuite::area_;
-
-TEST_F(ActiveDevicesSuite, SetActiveDevRemoveOld) {
-  struct active_dev* adevs;
-  struct cras_iodev iodev3_;
-
-  iodev_.direction = CRAS_STREAM_INPUT;
-  iodev2_.direction = CRAS_STREAM_INPUT;
-  iodev3_.direction = CRAS_STREAM_INPUT;
-
-  thread_set_active_dev(thread_, &iodev_);
-  adevs = thread_->active_devs[CRAS_STREAM_INPUT];
-  EXPECT_NE((void*)NULL, adevs);
-  EXPECT_EQ(adevs->dev, &iodev_);
-  EXPECT_EQ(1, iodev_.is_active);
-
-  /* Assert the first active dev is still iodev. */
-  thread_add_active_dev(thread_, &iodev2_);
-  adevs = thread_->active_devs[CRAS_STREAM_INPUT];
-  EXPECT_EQ(adevs->dev, &iodev_);
-
-  thread_set_active_dev(thread_, &iodev3_);
-  adevs = thread_->active_devs[CRAS_STREAM_INPUT];
-  EXPECT_EQ(adevs->dev, &iodev3_);
-  EXPECT_EQ(iodev3_.is_active, 1);
-  EXPECT_EQ(iodev_.is_active, 0);
-}
-
-TEST_F(ActiveDevicesSuite, SetActiveDevAlreadyInList) {
-  struct active_dev* adevs;
-  iodev_.direction = CRAS_STREAM_INPUT;
-  iodev2_.direction = CRAS_STREAM_INPUT;
-
-  thread_set_active_dev(thread_, &iodev_);
-  thread_add_active_dev(thread_, &iodev2_);
-
-  adevs = thread_->active_devs[CRAS_STREAM_INPUT];
-  EXPECT_EQ(adevs->dev, &iodev_);
-  EXPECT_EQ(iodev_.is_active, 1);
-
-  thread_set_active_dev(thread_, &iodev2_);
-  adevs = thread_->active_devs[CRAS_STREAM_INPUT];
-  EXPECT_EQ(adevs->dev, &iodev2_);
-  EXPECT_EQ(iodev2_.is_active, 1);
-  EXPECT_EQ(iodev_.is_active, 0);
-}
-
-TEST_F(ActiveDevicesSuite, AddRemoveActiveDevice) {
-  struct active_dev* adevs;
-  iodev_.direction = CRAS_STREAM_INPUT;
-  iodev2_.direction = CRAS_STREAM_INPUT;
-
-  thread_set_active_dev(thread_, &iodev_);
-  adevs = thread_->active_devs[CRAS_STREAM_INPUT];
-  EXPECT_NE((void*)NULL, adevs);
-  EXPECT_EQ(adevs->dev, &iodev_);
-  EXPECT_EQ(1, iodev_.is_active);
-
-  thread_add_active_dev(thread_, &iodev2_);
-  EXPECT_NE((void*)NULL, adevs->next);
-  EXPECT_EQ(adevs->next->dev, &iodev2_);
-  EXPECT_EQ(1, iodev2_.is_active);
-
-  thread_rm_active_dev(thread_, &iodev_);
-  adevs = thread_->active_devs[CRAS_STREAM_INPUT];
-  EXPECT_EQ((void*)NULL, adevs->next);
-  EXPECT_EQ(adevs->dev, &iodev2_);
-  EXPECT_EQ(0, iodev_.is_active);
-
-  iodev_.direction = CRAS_STREAM_POST_MIX_PRE_DSP;
-  thread_add_active_dev(thread_, &iodev_);
-  EXPECT_NE((void*)NULL, thread_->active_devs[CRAS_STREAM_POST_MIX_PRE_DSP]);
-  EXPECT_EQ(1, iodev_.is_active);
-}
-
-TEST_F(ActiveDevicesSuite, ClearActiveDevices) {
-  iodev_.direction = CRAS_STREAM_OUTPUT;
-  iodev2_.direction = CRAS_STREAM_OUTPUT;
-
-  thread_set_active_dev(thread_, &iodev_);
-  thread_add_active_dev(thread_, &iodev2_);
-  EXPECT_NE((void*)NULL, thread_->active_devs[CRAS_STREAM_OUTPUT]);
-  EXPECT_EQ(1, iodev_.is_active);
-  EXPECT_EQ(1, iodev2_.is_active);
-
-  thread_clear_active_devs(thread_, CRAS_STREAM_OUTPUT);
-  EXPECT_EQ((void*)NULL, thread_->active_devs[CRAS_STREAM_OUTPUT]);
-  EXPECT_EQ(0, iodev_.is_active);
-  EXPECT_EQ(0, iodev2_.is_active);
-}
-
-TEST_F(ActiveDevicesSuite, OpenActiveDevices) {
-  iodev_.direction = CRAS_STREAM_OUTPUT;
-  iodev2_.direction = CRAS_STREAM_OUTPUT;
-
-  thread_set_active_dev(thread_, &iodev_);
-  thread_add_active_dev(thread_, &iodev2_);
-  thread_add_stream(thread_, rstream_);
-
-  EXPECT_EQ(2, cras_iodev_set_format_called);
-  EXPECT_EQ(500, thread_->buffer_frames[CRAS_STREAM_OUTPUT]);
-  EXPECT_EQ(250, thread_->cb_threshold[CRAS_STREAM_OUTPUT]);
-}
-
-TEST_F(ActiveDevicesSuite, OpenFirstActiveDeviceFail) {
-  int rc;
-  iodev_.direction = CRAS_STREAM_OUTPUT;
-  iodev2_.direction = CRAS_STREAM_OUTPUT;
-
-  thread_set_active_dev(thread_, &iodev_);
-  thread_add_active_dev(thread_, &iodev2_);
-
-  open_dev_val_[0] = -1;
-  rc = thread_add_stream(thread_, rstream_);
-  EXPECT_EQ(rc, AUDIO_THREAD_OUTPUT_DEV_ERROR);
-  EXPECT_EQ(2, cras_iodev_set_format_called);
-  EXPECT_EQ(0, thread_->buffer_frames[CRAS_STREAM_OUTPUT]);
-  EXPECT_EQ(0, thread_->cb_threshold[CRAS_STREAM_OUTPUT]);
-}
-
-TEST_F(ActiveDevicesSuite, OpenSecondActiveDeviceFail) {
-  int rc;
-  iodev_.direction = CRAS_STREAM_OUTPUT;
-  iodev2_.direction = CRAS_STREAM_OUTPUT;
-
-  thread_set_active_dev(thread_, &iodev_);
-  thread_add_active_dev(thread_, &iodev2_);
-
-  open_dev_val_[1] = -1;
-  rc = thread_add_stream(thread_, rstream_);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(2, cras_iodev_set_format_called);
-  EXPECT_EQ(500, thread_->buffer_frames[CRAS_STREAM_OUTPUT]);
-  EXPECT_EQ(250, thread_->cb_threshold[CRAS_STREAM_OUTPUT]);
-  EXPECT_EQ(0, close_dev_called_);
-  EXPECT_EQ((void*)NULL, thread_->active_devs[CRAS_STREAM_OUTPUT]->next);
-}
-
-TEST_F(ActiveDevicesSuite, OpenSecondActiveDeviceFormatIncompatible) {
-  int rc;
-  iodev_.direction = CRAS_STREAM_OUTPUT;
-  iodev2_.direction = CRAS_STREAM_OUTPUT;
-
-  thread_set_active_dev(thread_, &iodev_);
-  thread_add_active_dev(thread_, &iodev2_);
-
-  cras_fmt_conversion_needed_return_val = 1;
-  rc = thread_add_stream(thread_, rstream_);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(2, cras_iodev_set_format_called);
-  EXPECT_EQ(500, thread_->buffer_frames[CRAS_STREAM_OUTPUT]);
-  EXPECT_EQ(250, thread_->cb_threshold[CRAS_STREAM_OUTPUT]);
-  EXPECT_EQ(1, close_dev_called_);
-  EXPECT_EQ((void*)NULL, thread_->active_devs[CRAS_STREAM_OUTPUT]->next);
-}
-
-TEST_F(ActiveDevicesSuite, CloseActiveDevices) {
-  iodev_.direction = CRAS_STREAM_OUTPUT;
-  iodev2_.direction = CRAS_STREAM_OUTPUT;
-
-  thread_set_active_dev(thread_, &iodev_);
-  thread_add_active_dev(thread_, &iodev2_);
-
-  thread_add_stream(thread_, rstream_);
-  EXPECT_EQ(1, thread_->devs_open[CRAS_STREAM_OUTPUT]);
-  EXPECT_EQ(2, cras_iodev_set_format_called);
-
-  thread_add_stream(thread_, rstream2_);
-  EXPECT_EQ(4, cras_iodev_set_format_called);
-
-  thread_remove_stream(thread_, rstream2_);
-
-  thread_remove_stream(thread_, rstream_);
-  EXPECT_EQ(1, iodev_.is_draining);
-  EXPECT_EQ(1, iodev2_.is_draining);
-}
-
-TEST_F(ActiveDevicesSuite, InputDelayFrames) {
-  int fr;
-  iodev_.direction = CRAS_STREAM_INPUT;
-  iodev2_.direction = CRAS_STREAM_INPUT;
-  rstream_->direction = CRAS_STREAM_INPUT;
-
-  thread_set_active_dev(thread_, &iodev_);
-  thread_add_active_dev(thread_, &iodev2_);
-
-  thread_add_stream(thread_, rstream_);
-  delay_frames_[0] = 3;
-  delay_frames_[1] = 33;
-  fr = input_delay_frames(thread_->active_devs[CRAS_STREAM_INPUT]);
-  EXPECT_EQ(33, fr);
-
-  delay_frames_val_idx_ = 0;
-  delay_frames_[1] = -1;
-  fr = input_delay_frames(thread_->active_devs[CRAS_STREAM_INPUT]);
-  EXPECT_EQ(-1, fr);
-}
-
-TEST_F(ActiveDevicesSuite, InputFramesQueued) {
-  int fr;
-  iodev_.direction = CRAS_STREAM_INPUT;
-  iodev2_.direction = CRAS_STREAM_INPUT;
-  thread_set_active_dev(thread_, &iodev_);
-  thread_add_active_dev(thread_, &iodev2_);
-  frames_queued_val_idx_ = 0;
-  frames_queued_[0] = 195;
-  frames_queued_[1] = 190;
-  fr = input_min_frames_queued(thread_->active_devs[CRAS_STREAM_INPUT]);
-  EXPECT_EQ(190, fr);
-
-  /* Test error path. */
-  frames_queued_val_idx_ = 0;
-  frames_queued_[0] = -1;
-  frames_queued_[1] = 190;
-  fr = input_min_frames_queued(thread_->active_devs[CRAS_STREAM_INPUT]);
-  EXPECT_EQ(-1, fr);
-}
-
-TEST_F(ActiveDevicesSuite, MixMultipleInputs) {
-  struct timespec ts;
-
-  iodev_.direction = CRAS_STREAM_INPUT;
-  iodev2_.direction = CRAS_STREAM_INPUT;
-  rstream_->direction = CRAS_STREAM_INPUT;
-  rstream2_->direction = CRAS_STREAM_INPUT;
-
-  for (unsigned int dev = 0; dev < 8; dev++) {
-    int16_t* buff = (int16_t*)audio_buffer_[dev];
-    for (unsigned int i = 0; i < 250; i++)
-      buff[i] = i;
-  }
-  thread_set_active_dev(thread_, &iodev_);
-  thread_add_active_dev(thread_, &iodev2_);
-
-  /* Assert shm from rstream_ is used. */
-  thread_add_stream(thread_, rstream_);
-  unified_io(thread_, &ts);
-  EXPECT_EQ(rstream_, cap_sleep_frames_call.dev_stream->stream);
-
-  thread_add_stream(thread_, rstream2_);
-  unified_io(thread_, &ts);
-  EXPECT_EQ(rstream2_, cap_sleep_frames_call.dev_stream->stream);
-}
-
-extern "C" {
-
-const char kNoCodecsFoundMetric[] = "Cras.NoCodecsFoundAtBoot";
-const char kStreamTimeoutMilliSeconds[] = "Cras.StreamTimeoutMilliSeconds";
-
-int cras_iodev_get_thread_poll_fd(const struct cras_iodev* iodev) {
-  return 0;
-}
-
-int cras_iodev_read_thread_command(struct cras_iodev* iodev,
-                                   uint8_t* buf,
-                                   size_t max_len) {
-  return 0;
-}
-
-int cras_iodev_send_command_response(struct cras_iodev* iodev, int rc) {
-  return 0;
-}
-
-void cras_iodev_fill_time_from_frames(size_t frames,
-                                      size_t frame_rate,
-                                      struct timespec* ts) {
-  uint64_t to_play_usec;
-
-  ts->tv_sec = 0;
-  /* adjust sleep time to target our callback threshold */
-  to_play_usec = (uint64_t)frames * 1000000L / (uint64_t)frame_rate;
-
-  while (to_play_usec > 1000000) {
-    ts->tv_sec++;
-    to_play_usec -= 1000000;
-  }
-  ts->tv_nsec = to_play_usec * 1000;
-}
-
-void dev_stream_set_delay(const struct dev_stream* dev_stream,
-                          unsigned int delay_frames) {
-  dev_stream_set_delay_called++;
-}
-
-void cras_set_capture_timestamp(size_t frame_rate,
-                                size_t frames,
-                                struct cras_timespec* ts) {}
-
-int cras_iodev_set_format(struct cras_iodev* iodev,
-                          struct cras_audio_format* fmt) {
-  cras_iodev_set_format_called++;
-  iodev->format = &cras_iodev_set_format_val;
-  return 0;
-}
-
-//  From mixer.
-unsigned int dev_stream_mix(struct dev_stream* dev_stream,
-                            size_t num_channels,
-                            uint8_t* dst,
-                            size_t* count,
-                            size_t* index) {
-  int16_t* src;
-  int16_t* target = (int16_t*)dst;
-  size_t fr_written, fr_in_buf;
-  size_t num_samples;
-  size_t frames = 0;
-  struct cras_audio_shm* shm;
-
-  if (dev_stream->stream->direction == CRAS_STREAM_OUTPUT) {
-    shm = &dev_stream->stream->output_shm;
-  } else {
-    shm = &dev_stream->stream->input_shm;
-  }
-
-  dev_stream_mix_called++;
-
-  if (dev_stream_mix_dont_fill_next) {
-    dev_stream_mix_dont_fill_next = 0;
-    return 0;
-  }
-  dev_stream_mix_count = *count;
-
-  /* We only copy the data from shm to dst, not actually mix them. */
-  fr_in_buf = cras_shm_get_frames(shm);
-  if (fr_in_buf == 0)
-    return 0;
-  if (fr_in_buf < *count)
-    *count = fr_in_buf;
-
-  fr_written = 0;
-  while (fr_written < *count) {
-    src = cras_shm_get_readable_frames(shm, fr_written, &frames);
-    if (frames > *count - fr_written)
-      frames = *count - fr_written;
-    num_samples = frames * num_channels;
-    memcpy(target, src, num_samples * 2);
-    fr_written += frames;
-    target += num_samples;
-  }
-
-  *index = *index + 1;
-  cras_shm_buffer_read(shm, fr_written);
-  return *count;
-}
-
-void cras_scale_buffer(int16_t* buffer, unsigned int count, float scaler) {}
-
-size_t cras_mix_mute_buffer(uint8_t* dst, size_t frame_bytes, size_t count) {
-  cras_mix_mute_count = count;
-  return count;
-}
-
-void cras_mix_add_clip(int16_t* dst, const int16_t* src, size_t count) {
-  int32_t sum;
-  unsigned int i;
-
-  for (i = 0; i < count; i++) {
-    sum = dst[i] + src[i];
-    if (sum > 0x7fff)
-      sum = 0x7fff;
-    else if (sum < -0x8000)
-      sum = -0x8000;
-    dst[i] = sum;
-  }
-}
-
-// From cras_metrics.c
-void cras_metrics_log_event(const char* event) {
-  cras_metrics_log_event_called++;
-}
-
-void cras_metrics_log_histogram(const char* name,
-                                int sample,
-                                int min,
-                                int max,
-                                int nbuckets) {
-  cras_metrics_log_histogram_called++;
-  cras_metrics_log_histogram_name = name;
-  cras_metrics_log_histogram_sample = sample;
-}
-
-//  From util.
-int cras_set_rt_scheduling(int rt_lim) {
-  return 0;
-}
-
-int cras_set_thread_priority(int priority) {
-  return 0;
-}
-
-//  From rstream.
-int cras_rstream_get_audio_request_reply(const struct cras_rstream* stream) {
-  return 0;
-}
-
-void cras_rstream_log_overrun(const struct cras_rstream* stream) {}
-
-int cras_system_add_select_fd(int fd,
-                              void (*callback)(void* data),
-                              void* callback_data) {
-  cras_system_add_select_fd_callback = callback;
-  cras_system_add_select_fd_callback_data = callback_data;
-  return 0;
-}
-
-void cras_system_rm_select_fd(int fd) {}
-
-size_t cras_system_get_volume() {
-  return cras_system_get_volume_return;
-}
-
-int cras_system_get_mute() {
-  return 0;
-}
-
-int cras_system_get_capture_mute() {
-  return 0;
-}
-
-void cras_rstream_destroy(struct cras_rstream* stream) {
-  cras_rstream_destroy_called++;
-}
-
-void loopback_iodev_set_format(struct cras_iodev* loopback_dev,
-                               const struct cras_audio_format* fmt) {}
-
-int loopback_iodev_add_audio(struct cras_iodev* loopback_dev,
-                             const uint8_t* audio,
-                             unsigned int count) {
-  return 0;
-}
-
-int loopback_iodev_add_zeros(struct cras_iodev* dev, unsigned int count) {
-  return 0;
-}
-
-int cras_fmt_conversion_needed(const struct cras_audio_format* a,
-                               const struct cras_audio_format* b) {
-  return cras_fmt_conversion_needed_return_val;
-}
-
-void cras_audio_area_config_buf_pointers(struct cras_audio_area* area,
-                                         const struct cras_audio_format* fmt,
-                                         uint8_t* base_buffer) {
-  unsigned int i;
-  const int sample_size = snd_pcm_format_physical_width(fmt->format) / 8;
-
-  /* TODO(dgreid) - assuming interleaved audio here for now. */
-  for (i = 0; i < area->num_channels; i++) {
-    area->channels[i].step_bytes = cras_get_format_bytes(fmt);
-    area->channels[i].buf = base_buffer + i * sample_size;
-  }
-}
-
-void cras_audio_area_copy(const struct cras_audio_area* dst,
-                          unsigned int dst_offset,
-                          unsigned int dst_format_bytes,
-                          const struct cras_audio_area* src,
-                          unsigned int src_index) {
-  unsigned count, i;
-  int16_t *dchan, *schan;
-
-  if (src_index == 0)
-    memset(dst->channels[0].buf, 0, src->frames * dst_format_bytes);
-
-  dchan = (int16_t*)(dst->channels[0].buf +
-                     dst_offset * dst->channels[0].step_bytes);
-  schan = (int16_t*)src->channels[0].buf;
-  count = src->frames * src->num_channels;
-  for (i = 0; i < count; i++) {
-    int32_t sum;
-    sum = *dchan + *schan;
-    if (sum > 0x7fff)
-      sum = 0x7fff;
-    else if (sum < -0x8000)
-      sum = -0x8000;
-    *dchan = sum;
-    dchan++;
-    schan++;
-  }
-}
-
-//  Override select so it can be stubbed.
-int select(int nfds,
-           fd_set* readfds,
-           fd_set* writefds,
-           fd_set* exceptfds,
-           struct timeval* timeout) {
-  select_max_fd = nfds;
-  select_timeval.tv_sec = timeout->tv_sec;
-  select_timeval.tv_usec = timeout->tv_usec;
-  select_in_fds = *readfds;
-  *readfds = select_out_fds;
-  if (select_write_ptr)
-    *select_write_ptr = select_write_value;
-  return select_return_value;
-}
-
-int clock_gettime(clockid_t clk_id, struct timespec* tp) {
-  *tp = time_now;
-  return 0;
-}
-
-struct dev_stream* dev_stream_create(struct cras_rstream* stream,
-                                     const struct cras_audio_format* fmt) {
-  struct dev_stream* out = static_cast<dev_stream*>(calloc(1, sizeof(*out)));
-  out->stream = stream;
-
-  return out;
-}
-
-void dev_stream_destroy(struct dev_stream* dev_stream) {
-  free(dev_stream);
-}
-
-void dev_stream_capture(struct dev_stream* dev_stream,
-                        const struct cras_audio_area* area,
-                        unsigned int dev_index) {
-  dev_stream_capture_call.dev_stream = dev_stream;
-  dev_stream_capture_call.area = area;
-  dev_stream_capture_call.dev_index = dev_index;
-  dev_stream_capture_call.num_called++;
-}
-
-int dev_stream_playback_frames(const struct dev_stream* dev_stream) {
-  struct cras_audio_shm* shm;
-  int frames;
-
-  shm = cras_rstream_output_shm(dev_stream->stream);
-
-  frames = cras_shm_get_frames(shm);
-  if (frames < 0)
-    return frames;
-
-  if (!dev_stream->conv)
-    return frames;
-
-  return cras_fmt_conv_in_frames_to_out(dev_stream->conv, frames);
-}
-
-unsigned int dev_stream_capture_avail(const struct dev_stream* dev_stream) {
-  struct cras_audio_shm* shm;
-  struct cras_rstream* rstream = dev_stream->stream;
-  unsigned int cb_threshold = cras_rstream_get_cb_threshold(rstream);
-  unsigned int frames_avail;
-
-  shm = cras_rstream_input_shm(rstream);
-
-  cras_shm_get_writeable_frames(shm, cb_threshold, &frames_avail);
-
-  return frames_avail;
-}
-
-int dev_stream_capture_sleep_frames(struct dev_stream* dev_stream,
-                                    unsigned int written) {
-  cap_sleep_frames_call.dev_stream = dev_stream;
-  cap_sleep_frames_call.written = written;
-  cap_sleep_frames_call.num_called++;
-  return 0;
-}
-
-int dev_stream_request_playback_samples(struct dev_stream* dev_stream) {
-  struct cras_rstream* rstream = dev_stream->stream;
-
-  dev_stream_request_playback_samples_called++;
-
-  cras_shm_set_callback_pending(cras_rstream_output_shm(rstream), 1);
-  return 0;
-}
-
-size_t cras_fmt_conv_in_frames_to_out(struct cras_fmt_conv* conv,
-                                      size_t in_frames) {
-  return in_frames;
-}
-
-size_t cras_fmt_conv_out_frames_to_in(struct cras_fmt_conv* conv,
-                                      size_t out_frames) {
-  return out_frames;
-}
-
-}  // extern "C"
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tests/biquad_unittest.cc b/cras/src/tests/biquad_unittest.cc
deleted file mode 100644
index 30e67ea..0000000
--- a/cras/src/tests/biquad_unittest.cc
+++ /dev/null
@@ -1,216 +0,0 @@
-// Copyright 2019 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "biquad.h"
-
-#include <assert.h>
-#include <gtest/gtest.h>
-#include <math.h>
-
-namespace {
-
-TEST(InvalidFrequencyTest, All) {
-  struct biquad bq, test_bq;
-  float f_over = 1.5;
-  float f_under = -0.1;
-  double db_gain = 2;
-  double A = pow(10.0, db_gain / 40);
-
-  // check response to freq >= 1
-  biquad_set(&bq, BQ_LOWPASS, f_over, 0, db_gain);
-  test_bq = {0, 0, 0, 0, 0, 0, 0, 0, 0};
-  test_bq.b0 = 1;
-  EXPECT_EQ(bq.b0, test_bq.b0);
-  EXPECT_EQ(bq.b1, test_bq.b1);
-  EXPECT_EQ(bq.b2, test_bq.b2);
-  EXPECT_EQ(bq.a1, test_bq.a1);
-  EXPECT_EQ(bq.a2, test_bq.a2);
-
-  biquad_set(&bq, BQ_HIGHPASS, f_over, 0, db_gain);
-  test_bq = {0, 0, 0, 0, 0, 0, 0, 0, 0};
-  EXPECT_EQ(bq.b0, test_bq.b0);
-  EXPECT_EQ(bq.b1, test_bq.b1);
-  EXPECT_EQ(bq.b2, test_bq.b2);
-  EXPECT_EQ(bq.a1, test_bq.a1);
-  EXPECT_EQ(bq.a2, test_bq.a2);
-
-  biquad_set(&bq, BQ_BANDPASS, f_over, 0, db_gain);
-  test_bq = {0, 0, 0, 0, 0, 0, 0, 0, 0};
-  EXPECT_EQ(bq.b0, test_bq.b0);
-  EXPECT_EQ(bq.b1, test_bq.b1);
-  EXPECT_EQ(bq.b2, test_bq.b2);
-  EXPECT_EQ(bq.a1, test_bq.a1);
-  EXPECT_EQ(bq.a2, test_bq.a2);
-
-  biquad_set(&bq, BQ_LOWSHELF, f_over, 0, db_gain);
-  test_bq = {0, 0, 0, 0, 0, 0, 0, 0, 0};
-  test_bq.b0 = A * A;
-  EXPECT_EQ(bq.b0, test_bq.b0);
-  EXPECT_EQ(bq.b1, test_bq.b1);
-  EXPECT_EQ(bq.b2, test_bq.b2);
-  EXPECT_EQ(bq.a1, test_bq.a1);
-  EXPECT_EQ(bq.a2, test_bq.a2);
-
-  biquad_set(&bq, BQ_HIGHSHELF, f_over, 0, db_gain);
-  test_bq = {0, 0, 0, 0, 0, 0, 0, 0, 0};
-  test_bq.b0 = 1;
-  EXPECT_EQ(bq.b0, test_bq.b0);
-  EXPECT_EQ(bq.b1, test_bq.b1);
-  EXPECT_EQ(bq.b2, test_bq.b2);
-  EXPECT_EQ(bq.a1, test_bq.a1);
-  EXPECT_EQ(bq.a2, test_bq.a2);
-
-  biquad_set(&bq, BQ_PEAKING, f_over, 0, db_gain);
-  test_bq = {0, 0, 0, 0, 0, 0, 0, 0, 0};
-  test_bq.b0 = 1;
-  EXPECT_EQ(bq.b0, test_bq.b0);
-  EXPECT_EQ(bq.b1, test_bq.b1);
-  EXPECT_EQ(bq.b2, test_bq.b2);
-  EXPECT_EQ(bq.a1, test_bq.a1);
-  EXPECT_EQ(bq.a2, test_bq.a2);
-
-  biquad_set(&bq, BQ_NOTCH, f_over, 0, db_gain);
-  test_bq = {0, 0, 0, 0, 0, 0, 0, 0, 0};
-  test_bq.b0 = 1;
-  EXPECT_EQ(bq.b0, test_bq.b0);
-  EXPECT_EQ(bq.b1, test_bq.b1);
-  EXPECT_EQ(bq.b2, test_bq.b2);
-  EXPECT_EQ(bq.a1, test_bq.a1);
-  EXPECT_EQ(bq.a2, test_bq.a2);
-
-  biquad_set(&bq, BQ_ALLPASS, f_over, 0, db_gain);
-  test_bq = {0, 0, 0, 0, 0, 0, 0, 0, 0};
-  test_bq.b0 = 1;
-  EXPECT_EQ(bq.b0, test_bq.b0);
-  EXPECT_EQ(bq.b1, test_bq.b1);
-  EXPECT_EQ(bq.b2, test_bq.b2);
-  EXPECT_EQ(bq.a1, test_bq.a1);
-  EXPECT_EQ(bq.a2, test_bq.a2);
-
-  // check response to frew <= 0
-  biquad_set(&bq, BQ_LOWPASS, f_under, 0, db_gain);
-  test_bq = {0, 0, 0, 0, 0, 0, 0, 0, 0};
-  EXPECT_EQ(bq.b0, test_bq.b0);
-  EXPECT_EQ(bq.b1, test_bq.b1);
-  EXPECT_EQ(bq.b2, test_bq.b2);
-  EXPECT_EQ(bq.a1, test_bq.a1);
-  EXPECT_EQ(bq.a2, test_bq.a2);
-
-  biquad_set(&bq, BQ_HIGHPASS, f_under, 0, db_gain);
-  test_bq = {0, 0, 0, 0, 0, 0, 0, 0, 0};
-  test_bq.b0 = 1;
-  EXPECT_EQ(bq.b0, test_bq.b0);
-  EXPECT_EQ(bq.b1, test_bq.b1);
-  EXPECT_EQ(bq.b2, test_bq.b2);
-  EXPECT_EQ(bq.a1, test_bq.a1);
-  EXPECT_EQ(bq.a2, test_bq.a2);
-
-  biquad_set(&bq, BQ_BANDPASS, f_under, 0, db_gain);
-  test_bq = {0, 0, 0, 0, 0, 0, 0, 0, 0};
-  EXPECT_EQ(bq.b0, test_bq.b0);
-  EXPECT_EQ(bq.b1, test_bq.b1);
-  EXPECT_EQ(bq.b2, test_bq.b2);
-  EXPECT_EQ(bq.a1, test_bq.a1);
-  EXPECT_EQ(bq.a2, test_bq.a2);
-
-  biquad_set(&bq, BQ_LOWSHELF, f_under, 0, db_gain);
-  test_bq = {0, 0, 0, 0, 0, 0, 0, 0, 0};
-  test_bq.b0 = 1;
-  EXPECT_EQ(bq.b0, test_bq.b0);
-  EXPECT_EQ(bq.b1, test_bq.b1);
-  EXPECT_EQ(bq.b2, test_bq.b2);
-  EXPECT_EQ(bq.a1, test_bq.a1);
-  EXPECT_EQ(bq.a2, test_bq.a2);
-
-  biquad_set(&bq, BQ_HIGHSHELF, f_under, 0, db_gain);
-  test_bq = {0, 0, 0, 0, 0, 0, 0, 0, 0};
-  test_bq.b0 = A * A;
-  EXPECT_EQ(bq.b0, test_bq.b0);
-  EXPECT_EQ(bq.b1, test_bq.b1);
-  EXPECT_EQ(bq.b2, test_bq.b2);
-  EXPECT_EQ(bq.a1, test_bq.a1);
-  EXPECT_EQ(bq.a2, test_bq.a2);
-
-  biquad_set(&bq, BQ_PEAKING, f_under, 0, db_gain);
-  test_bq = {0, 0, 0, 0, 0, 0, 0, 0, 0};
-  test_bq.b0 = 1;
-  EXPECT_EQ(bq.b0, test_bq.b0);
-  EXPECT_EQ(bq.b1, test_bq.b1);
-  EXPECT_EQ(bq.b2, test_bq.b2);
-  EXPECT_EQ(bq.a1, test_bq.a1);
-  EXPECT_EQ(bq.a2, test_bq.a2);
-
-  biquad_set(&bq, BQ_NOTCH, f_under, 0, db_gain);
-  test_bq = {0, 0, 0, 0, 0, 0, 0, 0, 0};
-  test_bq.b0 = 1;
-  EXPECT_EQ(bq.b0, test_bq.b0);
-  EXPECT_EQ(bq.b1, test_bq.b1);
-  EXPECT_EQ(bq.b2, test_bq.b2);
-  EXPECT_EQ(bq.a1, test_bq.a1);
-  EXPECT_EQ(bq.a2, test_bq.a2);
-
-  biquad_set(&bq, BQ_ALLPASS, f_under, 0, db_gain);
-  test_bq = {0, 0, 0, 0, 0, 0, 0, 0, 0};
-  test_bq.b0 = 1;
-  EXPECT_EQ(bq.b0, test_bq.b0);
-  EXPECT_EQ(bq.b1, test_bq.b1);
-  EXPECT_EQ(bq.b2, test_bq.b2);
-  EXPECT_EQ(bq.a1, test_bq.a1);
-  EXPECT_EQ(bq.a2, test_bq.a2);
-}
-
-TEST(InvalidQTest, All) {
-  struct biquad bq, test_bq;
-  float f = 0.5;
-  float Q = -0.1;
-  double db_gain = 2;
-  double A = pow(10.0, db_gain / 40);
-
-  // check response to Q <= 0
-  // Low and High pass filters scope Q making the test mute
-
-  biquad_set(&bq, BQ_BANDPASS, f, Q, db_gain);
-  test_bq = {0, 0, 0, 0, 0, 0, 0, 0, 0};
-  test_bq.b0 = 1;
-  EXPECT_EQ(bq.b0, test_bq.b0);
-  EXPECT_EQ(bq.b1, test_bq.b1);
-  EXPECT_EQ(bq.b2, test_bq.b2);
-  EXPECT_EQ(bq.a1, test_bq.a1);
-  EXPECT_EQ(bq.a2, test_bq.a2);
-
-  // Low and high shelf do not compute resonance
-
-  biquad_set(&bq, BQ_PEAKING, f, Q, db_gain);
-  test_bq = {0, 0, 0, 0, 0, 0, 0, 0, 0};
-  test_bq.b0 = A * A;
-  EXPECT_EQ(bq.b0, test_bq.b0);
-  EXPECT_EQ(bq.b1, test_bq.b1);
-  EXPECT_EQ(bq.b2, test_bq.b2);
-  EXPECT_EQ(bq.a1, test_bq.a1);
-  EXPECT_EQ(bq.a2, test_bq.a2);
-
-  biquad_set(&bq, BQ_NOTCH, f, 0, db_gain);
-  test_bq = {0, 0, 0, 0, 0, 0, 0, 0, 0};
-  EXPECT_EQ(bq.b0, test_bq.b0);
-  EXPECT_EQ(bq.b1, test_bq.b1);
-  EXPECT_EQ(bq.b2, test_bq.b2);
-  EXPECT_EQ(bq.a1, test_bq.a1);
-  EXPECT_EQ(bq.a2, test_bq.a2);
-
-  biquad_set(&bq, BQ_ALLPASS, f, 0, db_gain);
-  test_bq = {0, 0, 0, 0, 0, 0, 0, 0, 0};
-  test_bq.b0 = -1;
-  EXPECT_EQ(bq.b0, test_bq.b0);
-  EXPECT_EQ(bq.b1, test_bq.b1);
-  EXPECT_EQ(bq.b2, test_bq.b2);
-  EXPECT_EQ(bq.a1, test_bq.a1);
-  EXPECT_EQ(bq.a2, test_bq.a2);
-}
-
-}  //  namespace
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tests/bt_device_unittest.cc b/cras/src/tests/bt_device_unittest.cc
deleted file mode 100644
index ccb581c..0000000
--- a/cras/src/tests/bt_device_unittest.cc
+++ /dev/null
@@ -1,781 +0,0 @@
-// Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <gtest/gtest.h>
-
-extern "C" {
-#include "cras_bt_constants.h"
-#include "cras_bt_device.h"
-#include "cras_bt_io.h"
-#include "cras_bt_log.h"
-#include "cras_iodev.h"
-#include "cras_main_message.h"
-
-#define FAKE_OBJ_PATH "/obj/path"
-}
-
-static const unsigned int CONN_WATCH_MAX_RETRIES = 30;
-
-static struct cras_iodev* cras_bt_io_create_profile_ret;
-static struct cras_iodev* cras_bt_io_append_btio_val;
-static struct cras_ionode* cras_bt_io_get_profile_ret;
-static unsigned int cras_bt_io_create_called;
-static unsigned int cras_bt_io_append_called;
-static unsigned int cras_bt_io_remove_called;
-static unsigned int cras_bt_io_destroy_called;
-static enum cras_bt_device_profile cras_bt_io_create_profile_val;
-static enum cras_bt_device_profile cras_bt_io_append_profile_val;
-static unsigned int cras_bt_io_try_remove_ret;
-
-static cras_main_message* cras_main_message_send_msg;
-static cras_message_callback cras_main_message_add_handler_callback;
-static void* cras_main_message_add_handler_callback_data;
-static int cras_tm_create_timer_called;
-static int cras_tm_cancel_timer_called;
-static int cras_a2dp_start_called;
-static int cras_a2dp_suspend_connected_device_called;
-static int cras_hfp_ag_remove_conflict_called;
-static int cras_hfp_ag_start_called;
-static int cras_hfp_ag_suspend_connected_device_called;
-static void (*cras_tm_create_timer_cb)(struct cras_timer* t, void* data);
-static void* cras_tm_create_timer_cb_data;
-static int dbus_message_new_method_call_called;
-static const char* dbus_message_new_method_call_method;
-static struct cras_bt_device* cras_a2dp_connected_device_ret;
-static struct cras_bt_device* cras_a2dp_suspend_connected_device_dev;
-static struct cras_timer* cras_tm_cancel_timer_arg;
-static struct cras_timer* cras_tm_create_timer_ret;
-static size_t cras_iodev_set_node_plugged_called;
-static int cras_iodev_set_node_plugged_value;
-
-struct MockDBusMessage {
-  int type;
-  void* value;
-  MockDBusMessage* next;
-  MockDBusMessage* recurse;
-};
-
-void ResetStubData() {
-  cras_bt_io_get_profile_ret = NULL;
-  cras_bt_io_create_called = 0;
-  cras_bt_io_append_called = 0;
-  cras_bt_io_remove_called = 0;
-  cras_bt_io_destroy_called = 0;
-  cras_bt_io_try_remove_ret = 0;
-  cras_main_message_send_msg = NULL;
-  cras_tm_create_timer_called = 0;
-  cras_tm_cancel_timer_called = 0;
-  cras_a2dp_start_called = 0;
-  cras_a2dp_suspend_connected_device_called = 0;
-  cras_hfp_ag_remove_conflict_called = 0;
-  cras_hfp_ag_start_called = 0;
-  cras_hfp_ag_suspend_connected_device_called = 0;
-  dbus_message_new_method_call_method = NULL;
-  dbus_message_new_method_call_called = 0;
-  cras_a2dp_connected_device_ret = NULL;
-  cras_iodev_set_node_plugged_called = 0;
-}
-
-static void FreeMockDBusMessage(MockDBusMessage* head) {
-  if (head->next != NULL)
-    FreeMockDBusMessage(head->next);
-  if (head->recurse != NULL)
-    FreeMockDBusMessage(head->recurse);
-  if (head->type == DBUS_TYPE_STRING)
-    free((char*)head->value);
-  delete head;
-}
-
-static struct MockDBusMessage* NewMockDBusConnectedMessage(long connected) {
-  MockDBusMessage* msg = new MockDBusMessage{DBUS_TYPE_ARRAY, NULL};
-  MockDBusMessage* dict =
-      new MockDBusMessage{DBUS_TYPE_STRING, (void*)strdup("Connected")};
-  MockDBusMessage* variant =
-      new MockDBusMessage{DBUS_TYPE_BOOLEAN, (void*)connected};
-
-  msg->recurse = dict;
-  dict->next = new MockDBusMessage{DBUS_TYPE_INVALID, NULL};
-  dict->next->recurse = variant;
-  return msg;
-}
-
-namespace {
-
-class BtDeviceTestSuite : public testing::Test {
- protected:
-  virtual void SetUp() {
-    ResetStubData();
-    bt_iodev1.direction = CRAS_STREAM_OUTPUT;
-    bt_iodev1.update_active_node = update_active_node;
-    bt_iodev2.direction = CRAS_STREAM_INPUT;
-    bt_iodev2.update_active_node = update_active_node;
-    d1_.direction = CRAS_STREAM_OUTPUT;
-    d1_.update_active_node = update_active_node;
-    d2_.direction = CRAS_STREAM_OUTPUT;
-    d2_.update_active_node = update_active_node;
-    d3_.direction = CRAS_STREAM_INPUT;
-    d3_.update_active_node = update_active_node;
-    btlog = cras_bt_event_log_init();
-  }
-
-  virtual void TearDown() {
-    if (cras_main_message_send_msg)
-      free(cras_main_message_send_msg);
-    cras_bt_event_log_deinit(btlog);
-  }
-
-  static void update_active_node(struct cras_iodev* iodev,
-                                 unsigned node_idx,
-                                 unsigned dev_enabled) {}
-
-  struct cras_iodev bt_iodev1;
-  struct cras_iodev bt_iodev2;
-  struct cras_iodev d3_;
-  struct cras_iodev d2_;
-  struct cras_iodev d1_;
-};
-
-TEST(BtDeviceSuite, CreateBtDevice) {
-  struct cras_bt_device* device;
-
-  device = cras_bt_device_create(NULL, FAKE_OBJ_PATH);
-  EXPECT_NE((void*)NULL, device);
-
-  device = cras_bt_device_get(FAKE_OBJ_PATH);
-  EXPECT_NE((void*)NULL, device);
-
-  cras_bt_device_remove(device);
-  device = cras_bt_device_get(FAKE_OBJ_PATH);
-  EXPECT_EQ((void*)NULL, device);
-}
-
-TEST_F(BtDeviceTestSuite, AppendRmIodev) {
-  struct cras_bt_device* device;
-  device = cras_bt_device_create(NULL, FAKE_OBJ_PATH);
-  bt_iodev1.nodes = reinterpret_cast<struct cras_ionode*>(0x123);
-  cras_bt_io_create_profile_ret = &bt_iodev1;
-  cras_bt_device_append_iodev(device, &d1_, CRAS_BT_DEVICE_PROFILE_A2DP_SOURCE);
-  EXPECT_EQ(1, cras_bt_io_create_called);
-  EXPECT_EQ(0, cras_bt_io_append_called);
-  EXPECT_EQ(CRAS_BT_DEVICE_PROFILE_A2DP_SOURCE, cras_bt_io_create_profile_val);
-  cras_bt_device_set_active_profile(device, CRAS_BT_DEVICE_PROFILE_A2DP_SOURCE);
-
-  cras_bt_device_append_iodev(device, &d2_,
-                              CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY);
-  EXPECT_EQ(1, cras_bt_io_create_called);
-  EXPECT_EQ(1, cras_bt_io_append_called);
-  EXPECT_EQ(CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY,
-            cras_bt_io_append_profile_val);
-  EXPECT_EQ(&bt_iodev1, cras_bt_io_append_btio_val);
-
-  /* Test HFP disconnected and switch to A2DP. */
-  cras_bt_io_get_profile_ret = bt_iodev1.nodes;
-  cras_bt_io_try_remove_ret = CRAS_BT_DEVICE_PROFILE_A2DP_SOURCE;
-  cras_bt_device_set_active_profile(device,
-                                    CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY);
-  cras_bt_device_rm_iodev(device, &d2_);
-  EXPECT_EQ(1, cras_bt_io_remove_called);
-  EXPECT_EQ(1, cras_iodev_set_node_plugged_called);
-  EXPECT_EQ(0, cras_iodev_set_node_plugged_value);
-
-  /* Test A2DP disconnection will cause bt_io destroy. */
-  cras_bt_io_try_remove_ret = 0;
-  cras_bt_device_rm_iodev(device, &d1_);
-  EXPECT_EQ(1, cras_bt_io_remove_called);
-  EXPECT_EQ(1, cras_bt_io_destroy_called);
-  EXPECT_EQ(0, cras_bt_device_get_active_profile(device));
-  EXPECT_EQ(2, cras_iodev_set_node_plugged_called);
-  EXPECT_EQ(0, cras_iodev_set_node_plugged_value);
-  cras_bt_device_remove(device);
-}
-
-TEST_F(BtDeviceTestSuite, SwitchProfile) {
-  struct cras_bt_device* device;
-
-  ResetStubData();
-  device = cras_bt_device_create(NULL, FAKE_OBJ_PATH);
-  cras_bt_io_create_profile_ret = &bt_iodev1;
-  cras_bt_device_append_iodev(device, &d1_, CRAS_BT_DEVICE_PROFILE_A2DP_SOURCE);
-  cras_bt_io_create_profile_ret = &bt_iodev2;
-  cras_bt_device_append_iodev(device, &d3_,
-                              CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY);
-
-  cras_bt_device_start_monitor();
-  cras_bt_device_switch_profile_enable_dev(device, &bt_iodev1);
-
-  /* Two bt iodevs were all active. */
-  cras_main_message_add_handler_callback(
-      cras_main_message_send_msg, cras_main_message_add_handler_callback_data);
-
-  /* One bt iodev was active, the other was not. */
-  cras_bt_device_switch_profile_enable_dev(device, &bt_iodev2);
-  cras_main_message_add_handler_callback(
-      cras_main_message_send_msg, cras_main_message_add_handler_callback_data);
-
-  /* Output bt iodev wasn't active, close the active input iodev. */
-  cras_bt_device_switch_profile(device, &bt_iodev2);
-  cras_main_message_add_handler_callback(
-      cras_main_message_send_msg, cras_main_message_add_handler_callback_data);
-  cras_bt_device_remove(device);
-}
-
-TEST_F(BtDeviceTestSuite, SetDeviceConnectedA2dpOnly) {
-  struct cras_bt_device* device;
-  struct MockDBusMessage *msg_root, *cur;
-  ResetStubData();
-
-  device = cras_bt_device_create(NULL, FAKE_OBJ_PATH);
-  EXPECT_NE((void*)NULL, device);
-
-  cras_bt_device_set_supported_profiles(device,
-                                        CRAS_BT_DEVICE_PROFILE_A2DP_SINK);
-
-  cur = msg_root = NewMockDBusConnectedMessage(1);
-  cras_bt_device_update_properties(device, (DBusMessageIter*)&cur, NULL);
-  EXPECT_EQ(1, cras_tm_create_timer_called);
-  EXPECT_NE((void*)NULL, cras_tm_create_timer_cb);
-
-  /* Schedule another timer, if A2DP not yet configured. */
-  cras_tm_create_timer_cb(NULL, cras_tm_create_timer_cb_data);
-  EXPECT_EQ(2, cras_tm_create_timer_called);
-
-  /* ConnectProfile must not be called, since this is A2DP only case. */
-  EXPECT_EQ(0, dbus_message_new_method_call_called);
-
-  cras_bt_device_a2dp_configured(device);
-
-  /* Prepate the iodev created by cras_a2dp_start. */
-  cras_bt_io_create_profile_ret = &bt_iodev1;
-  cras_bt_device_append_iodev(device, &d1_, CRAS_BT_DEVICE_PROFILE_A2DP_SOURCE);
-
-  cras_tm_create_timer_cb(NULL, cras_tm_create_timer_cb_data);
-  EXPECT_EQ(2, cras_tm_create_timer_called);
-  EXPECT_EQ(1, cras_hfp_ag_remove_conflict_called);
-  EXPECT_EQ(1, cras_a2dp_start_called);
-  EXPECT_EQ(1, cras_iodev_set_node_plugged_called);
-  EXPECT_EQ(1, cras_iodev_set_node_plugged_value);
-
-  cras_bt_device_remove(device);
-  FreeMockDBusMessage(msg_root);
-}
-
-TEST_F(BtDeviceTestSuite, SetDeviceConnectedHfpHspOnly) {
-  struct cras_bt_device* device;
-  struct MockDBusMessage *msg_root, *cur;
-
-  ResetStubData();
-
-  device = cras_bt_device_create(NULL, FAKE_OBJ_PATH);
-  EXPECT_NE((void*)NULL, device);
-
-  cras_bt_device_set_supported_profiles(
-      device, CRAS_BT_DEVICE_PROFILE_HSP_HEADSET |
-                  CRAS_BT_DEVICE_PROFILE_HFP_HANDSFREE);
-
-  cur = msg_root = NewMockDBusConnectedMessage(1);
-  cras_bt_device_update_properties(device, (DBusMessageIter*)&cur, NULL);
-  EXPECT_EQ(1, cras_tm_create_timer_called);
-  EXPECT_NE((void*)NULL, cras_tm_create_timer_cb);
-
-  /* Schedule another timer, if HFP AG not yet intialized. */
-  cras_tm_create_timer_cb(NULL, cras_tm_create_timer_cb_data);
-  EXPECT_EQ(2, cras_tm_create_timer_called);
-
-  /* ConnectProfile must not be called, since this is HFP only case. */
-  EXPECT_EQ(0, dbus_message_new_method_call_called);
-
-  cras_bt_device_audio_gateway_initialized(device);
-
-  /* Prepate the iodev created by ag initialization. */
-  cras_bt_io_create_profile_ret = &bt_iodev2;
-  cras_bt_device_append_iodev(device, &d3_,
-                              CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY);
-
-  cras_tm_create_timer_cb(NULL, cras_tm_create_timer_cb_data);
-  EXPECT_EQ(2, cras_tm_create_timer_called);
-  EXPECT_EQ(1, cras_hfp_ag_remove_conflict_called);
-  EXPECT_EQ(1, cras_hfp_ag_start_called);
-  EXPECT_EQ(1, cras_iodev_set_node_plugged_called);
-  EXPECT_EQ(1, cras_iodev_set_node_plugged_value);
-
-  cras_bt_device_remove(device);
-  FreeMockDBusMessage(msg_root);
-}
-
-TEST_F(BtDeviceTestSuite, SetDeviceConnectedA2dpHfpHsp) {
-  struct cras_bt_device* device;
-  struct MockDBusMessage *msg_root, *cur;
-
-  ResetStubData();
-
-  device = cras_bt_device_create(NULL, FAKE_OBJ_PATH);
-  EXPECT_NE((void*)NULL, device);
-
-  cras_bt_device_set_supported_profiles(
-      device, CRAS_BT_DEVICE_PROFILE_A2DP_SINK |
-                  CRAS_BT_DEVICE_PROFILE_HSP_HEADSET |
-                  CRAS_BT_DEVICE_PROFILE_HFP_HANDSFREE);
-
-  cur = msg_root = NewMockDBusConnectedMessage(1);
-  cras_bt_device_update_properties(device, (DBusMessageIter*)&cur, NULL);
-  EXPECT_EQ(1, cras_tm_create_timer_called);
-  EXPECT_NE((void*)NULL, cras_tm_create_timer_cb);
-
-  /* Schedule another timer, if not HFP nor A2DP is ready. */
-  cras_tm_create_timer_cb(NULL, cras_tm_create_timer_cb_data);
-  EXPECT_EQ(2, cras_tm_create_timer_called);
-
-  /* ConnectProfile must not be called, since the first profile connection
-   * should be initiated by Bluez.
-   */
-  EXPECT_EQ(0, dbus_message_new_method_call_called);
-
-  cras_bt_device_audio_gateway_initialized(device);
-
-  /* Schedule another timer, because A2DP is not ready. */
-  cras_tm_create_timer_cb(NULL, cras_tm_create_timer_cb_data);
-  EXPECT_EQ(3, cras_tm_create_timer_called);
-  EXPECT_EQ(0, cras_hfp_ag_start_called);
-
-  /* ConnectProfile should be called to connect A2DP, since HFP is connected */
-  EXPECT_EQ(1, dbus_message_new_method_call_called);
-  EXPECT_STREQ("ConnectProfile", dbus_message_new_method_call_method);
-
-  cras_bt_device_a2dp_configured(device);
-
-  cras_tm_create_timer_cb(NULL, cras_tm_create_timer_cb_data);
-  EXPECT_EQ(3, cras_tm_create_timer_called);
-  EXPECT_EQ(1, cras_hfp_ag_remove_conflict_called);
-  EXPECT_EQ(1, cras_a2dp_start_called);
-  EXPECT_EQ(1, cras_hfp_ag_start_called);
-
-  cras_bt_device_remove(device);
-  FreeMockDBusMessage(msg_root);
-}
-
-TEST_F(BtDeviceTestSuite, DevConnectedConflictCheck) {
-  struct cras_bt_device* device;
-  struct MockDBusMessage *msg_root, *cur;
-
-  ResetStubData();
-
-  device = cras_bt_device_create(NULL, FAKE_OBJ_PATH);
-  EXPECT_NE((void*)NULL, device);
-
-  cras_bt_device_set_supported_profiles(
-      device, CRAS_BT_DEVICE_PROFILE_A2DP_SINK |
-                  CRAS_BT_DEVICE_PROFILE_HSP_HEADSET |
-                  CRAS_BT_DEVICE_PROFILE_HFP_HANDSFREE);
-
-  cur = msg_root = NewMockDBusConnectedMessage(1);
-  cras_bt_device_update_properties(device, (DBusMessageIter*)&cur, NULL);
-  cras_bt_device_audio_gateway_initialized(device);
-  cras_bt_device_a2dp_configured(device);
-  EXPECT_EQ(1, cras_tm_create_timer_called);
-
-  /* Fake that a different device already connected with A2DP */
-  cras_a2dp_connected_device_ret =
-      reinterpret_cast<struct cras_bt_device*>(0x99);
-  cras_tm_create_timer_cb(NULL, cras_tm_create_timer_cb_data);
-  EXPECT_EQ(1, cras_tm_create_timer_called);
-
-  /* Expect check conflict in HFP AG and A2DP. */
-  EXPECT_EQ(1, cras_hfp_ag_remove_conflict_called);
-  EXPECT_EQ(1, cras_a2dp_suspend_connected_device_called);
-  EXPECT_EQ(cras_a2dp_suspend_connected_device_dev,
-            cras_a2dp_connected_device_ret);
-
-  EXPECT_EQ(1, cras_a2dp_start_called);
-  EXPECT_EQ(1, cras_hfp_ag_start_called);
-
-  cras_bt_device_remove(device);
-  FreeMockDBusMessage(msg_root);
-}
-
-TEST_F(BtDeviceTestSuite, A2dpDropped) {
-  struct cras_bt_device* device;
-  struct MockDBusMessage *msg_root, *cur;
-
-  ResetStubData();
-
-  device = cras_bt_device_create(NULL, FAKE_OBJ_PATH);
-  EXPECT_NE((void*)NULL, device);
-
-  cras_bt_device_set_supported_profiles(
-      device, CRAS_BT_DEVICE_PROFILE_A2DP_SINK |
-                  CRAS_BT_DEVICE_PROFILE_HSP_HEADSET |
-                  CRAS_BT_DEVICE_PROFILE_HFP_HANDSFREE);
-
-  cur = msg_root = NewMockDBusConnectedMessage(1);
-  cras_bt_device_update_properties(device, (DBusMessageIter*)&cur, NULL);
-  cras_bt_device_audio_gateway_initialized(device);
-  cras_bt_device_a2dp_configured(device);
-  EXPECT_EQ(1, cras_tm_create_timer_called);
-  EXPECT_NE((void*)NULL, cras_tm_create_timer_cb);
-
-  cras_bt_device_notify_profile_dropped(device,
-                                        CRAS_BT_DEVICE_PROFILE_A2DP_SINK);
-  EXPECT_EQ(2, cras_tm_create_timer_called);
-
-  /* Expect suspend timer is scheduled. */
-  cras_tm_create_timer_cb(NULL, cras_tm_create_timer_cb_data);
-  EXPECT_EQ(1, cras_a2dp_suspend_connected_device_called);
-  EXPECT_EQ(1, cras_hfp_ag_suspend_connected_device_called);
-  EXPECT_EQ(1, dbus_message_new_method_call_called);
-  EXPECT_STREQ("Disconnect", dbus_message_new_method_call_method);
-
-  cras_bt_device_remove(device);
-  FreeMockDBusMessage(msg_root);
-}
-
-TEST_F(BtDeviceTestSuite, DevConnectDisconnectBackToBack) {
-  struct cras_bt_device* device;
-  struct MockDBusMessage *msg_root, *cur;
-
-  ResetStubData();
-
-  device = cras_bt_device_create(NULL, FAKE_OBJ_PATH);
-  EXPECT_NE((void*)NULL, device);
-
-  cras_bt_device_set_supported_profiles(
-      device, CRAS_BT_DEVICE_PROFILE_A2DP_SINK |
-                  CRAS_BT_DEVICE_PROFILE_HSP_HEADSET |
-                  CRAS_BT_DEVICE_PROFILE_HFP_HANDSFREE);
-
-  cur = msg_root = NewMockDBusConnectedMessage(1);
-  cras_bt_device_update_properties(device, (DBusMessageIter*)&cur, NULL);
-  EXPECT_EQ(1, cras_tm_create_timer_called);
-  EXPECT_NE((void*)NULL, cras_tm_create_timer_cb);
-  FreeMockDBusMessage(msg_root);
-
-  cras_bt_device_a2dp_configured(device);
-  cras_bt_device_audio_gateway_initialized(device);
-
-  /* Expect suspend timer is scheduled. */
-  cras_tm_create_timer_ret = reinterpret_cast<struct cras_timer*>(0x101);
-  cras_bt_device_notify_profile_dropped(device,
-                                        CRAS_BT_DEVICE_PROFILE_A2DP_SINK);
-  EXPECT_EQ(2, cras_tm_create_timer_called);
-  /* Another profile drop won't schedule another timer because one is
-   * already armed. */
-  EXPECT_NE((void*)NULL, cras_tm_create_timer_cb);
-  cras_bt_device_notify_profile_dropped(device,
-                                        CRAS_BT_DEVICE_PROFILE_HFP_HANDSFREE);
-  EXPECT_EQ(2, cras_tm_create_timer_called);
-
-  cur = msg_root = NewMockDBusConnectedMessage(0);
-  cras_bt_device_update_properties(device, (DBusMessageIter*)&cur, NULL);
-
-  /* When BlueZ reports headset disconnection, cancel the pending timer.  */
-  EXPECT_EQ(cras_tm_cancel_timer_called, 1);
-  EXPECT_EQ(cras_tm_cancel_timer_arg, (void*)0x101);
-  FreeMockDBusMessage(msg_root);
-
-  /* Headset connects again. */
-  cur = msg_root = NewMockDBusConnectedMessage(1);
-  cras_bt_device_update_properties(device, (DBusMessageIter*)&cur, NULL);
-  EXPECT_EQ(3, cras_tm_create_timer_called);
-  EXPECT_NE((void*)NULL, cras_tm_create_timer_cb);
-  FreeMockDBusMessage(msg_root);
-
-  /* Headset disconnects, later profile drop events shouldn't trigger
-   * suspend timer because headset is already in disconnected stats.
-   */
-  cur = msg_root = NewMockDBusConnectedMessage(0);
-  cras_bt_device_update_properties(device, (DBusMessageIter*)&cur, NULL);
-  FreeMockDBusMessage(msg_root);
-
-  cras_tm_create_timer_called = 0;
-  cras_bt_device_notify_profile_dropped(device,
-                                        CRAS_BT_DEVICE_PROFILE_A2DP_SINK);
-  EXPECT_EQ(0, cras_tm_create_timer_called);
-  cras_bt_device_notify_profile_dropped(device,
-                                        CRAS_BT_DEVICE_PROFILE_HFP_HANDSFREE);
-  EXPECT_EQ(0, cras_tm_create_timer_called);
-
-  cras_bt_device_remove(device);
-}
-
-TEST_F(BtDeviceTestSuite, ConnectionWatchTimeout) {
-  struct cras_bt_device* device;
-  struct MockDBusMessage *msg_root, *cur;
-
-  ResetStubData();
-
-  device = cras_bt_device_create(NULL, FAKE_OBJ_PATH);
-  EXPECT_NE((void*)NULL, device);
-
-  cras_bt_device_set_supported_profiles(
-      device, CRAS_BT_DEVICE_PROFILE_A2DP_SINK |
-                  CRAS_BT_DEVICE_PROFILE_HSP_HEADSET |
-                  CRAS_BT_DEVICE_PROFILE_HFP_HANDSFREE);
-
-  cur = msg_root = NewMockDBusConnectedMessage(1);
-  cras_bt_device_update_properties(device, (DBusMessageIter*)&cur, NULL);
-  EXPECT_EQ(1, cras_tm_create_timer_called);
-  EXPECT_NE((void*)NULL, cras_tm_create_timer_cb);
-
-  cras_bt_device_a2dp_configured(device);
-
-  for (unsigned int i = 0; i < CONN_WATCH_MAX_RETRIES; i++) {
-    cras_tm_create_timer_cb(NULL, cras_tm_create_timer_cb_data);
-    EXPECT_EQ(i + 2, cras_tm_create_timer_called);
-    EXPECT_EQ(0, cras_a2dp_start_called);
-    EXPECT_EQ(0, cras_hfp_ag_start_called);
-    EXPECT_EQ(0, cras_hfp_ag_remove_conflict_called);
-  }
-
-  dbus_message_new_method_call_called = 0;
-
-  /* Expect suspend timer is scheduled. */
-  cras_tm_create_timer_cb(NULL, cras_tm_create_timer_cb_data);
-  EXPECT_EQ(1, cras_a2dp_suspend_connected_device_called);
-  EXPECT_EQ(1, cras_hfp_ag_suspend_connected_device_called);
-  EXPECT_EQ(1, dbus_message_new_method_call_called);
-  EXPECT_STREQ("Disconnect", dbus_message_new_method_call_method);
-
-  cras_bt_device_remove(device);
-  FreeMockDBusMessage(msg_root);
-}
-
-/* Stubs */
-extern "C" {
-
-struct cras_bt_event_log* btlog;
-
-/* From bt_io */
-struct cras_iodev* cras_bt_io_create(struct cras_bt_device* device,
-                                     struct cras_iodev* dev,
-                                     enum cras_bt_device_profile profile) {
-  cras_bt_io_create_called++;
-  cras_bt_io_create_profile_val = profile;
-  return cras_bt_io_create_profile_ret;
-}
-void cras_bt_io_destroy(struct cras_iodev* bt_iodev) {
-  cras_bt_io_destroy_called++;
-}
-struct cras_ionode* cras_bt_io_get_profile(
-    struct cras_iodev* bt_iodev,
-    enum cras_bt_device_profile profile) {
-  return cras_bt_io_get_profile_ret;
-}
-int cras_bt_io_append(struct cras_iodev* bt_iodev,
-                      struct cras_iodev* dev,
-                      enum cras_bt_device_profile profile) {
-  cras_bt_io_append_called++;
-  cras_bt_io_append_profile_val = profile;
-  cras_bt_io_append_btio_val = bt_iodev;
-  return 0;
-}
-int cras_bt_io_on_profile(struct cras_iodev* bt_iodev,
-                          enum cras_bt_device_profile profile) {
-  return 0;
-}
-unsigned int cras_bt_io_try_remove(struct cras_iodev* bt_iodev,
-                                   struct cras_iodev* dev) {
-  return cras_bt_io_try_remove_ret;
-}
-int cras_bt_io_remove(struct cras_iodev* bt_iodev, struct cras_iodev* dev) {
-  cras_bt_io_remove_called++;
-  return 0;
-}
-
-/* From bt_adapter */
-struct cras_bt_adapter* cras_bt_adapter_get(const char* object_path) {
-  return NULL;
-}
-const char* cras_bt_adapter_address(const struct cras_bt_adapter* adapter) {
-  return NULL;
-}
-
-int cras_bt_adapter_on_usb(struct cras_bt_adapter* adapter) {
-  return 1;
-}
-
-/* From bt_profile */
-void cras_bt_profile_on_device_disconnected(struct cras_bt_device* device) {}
-
-/* From hfp_ag_profile */
-struct hfp_slc_handle* cras_hfp_ag_get_slc(struct cras_bt_device* device) {
-  return NULL;
-}
-
-void cras_hfp_ag_suspend_connected_device(struct cras_bt_device* device) {
-  cras_hfp_ag_suspend_connected_device_called++;
-}
-
-void cras_a2dp_suspend_connected_device(struct cras_bt_device* device) {
-  cras_a2dp_suspend_connected_device_called++;
-  cras_a2dp_suspend_connected_device_dev = device;
-}
-
-void cras_a2dp_start(struct cras_bt_device* device) {
-  cras_a2dp_start_called++;
-}
-
-struct cras_bt_device* cras_a2dp_connected_device() {
-  return cras_a2dp_connected_device_ret;
-}
-
-int cras_hfp_ag_remove_conflict(struct cras_bt_device* device) {
-  cras_hfp_ag_remove_conflict_called++;
-  return 0;
-}
-
-int cras_hfp_ag_start(struct cras_bt_device* device) {
-  cras_hfp_ag_start_called++;
-  return 0;
-}
-
-void cras_hfp_ag_suspend() {}
-
-/* From hfp_slc */
-int hfp_event_speaker_gain(struct hfp_slc_handle* handle, int gain) {
-  return 0;
-}
-
-/* From iodev_list */
-
-int cras_iodev_open(struct cras_iodev* dev,
-                    unsigned int cb_level,
-                    const struct cras_audio_format* fmt) {
-  return 0;
-}
-
-int cras_iodev_close(struct cras_iodev* dev) {
-  return 0;
-}
-
-void cras_iodev_set_node_plugged(struct cras_ionode* ionode, int plugged) {
-  cras_iodev_set_node_plugged_called++;
-  cras_iodev_set_node_plugged_value = plugged;
-}
-
-int cras_iodev_list_dev_is_enabled(const struct cras_iodev* dev) {
-  return 0;
-}
-
-void cras_iodev_list_suspend_dev(struct cras_iodev* dev) {}
-
-void cras_iodev_list_resume_dev(struct cras_iodev* dev) {}
-
-void cras_iodev_list_notify_node_volume(struct cras_ionode* node) {}
-
-int cras_main_message_send(struct cras_main_message* msg) {
-  // cras_main_message is a local variable from caller, we should allocate
-  // memory from heap and copy its data
-  if (cras_main_message_send_msg)
-    free(cras_main_message_send_msg);
-  cras_main_message_send_msg =
-      (struct cras_main_message*)calloc(1, msg->length);
-  memcpy((void*)cras_main_message_send_msg, (void*)msg, msg->length);
-  return 0;
-}
-
-int cras_main_message_add_handler(enum CRAS_MAIN_MESSAGE_TYPE type,
-                                  cras_message_callback callback,
-                                  void* callback_data) {
-  cras_main_message_add_handler_callback = callback;
-  cras_main_message_add_handler_callback_data = callback_data;
-  return 0;
-}
-
-/* From cras_system_state */
-struct cras_tm* cras_system_state_get_tm() {
-  return NULL;
-}
-
-/* From cras_tm */
-struct cras_timer* cras_tm_create_timer(struct cras_tm* tm,
-                                        unsigned int ms,
-                                        void (*cb)(struct cras_timer* t,
-                                                   void* data),
-                                        void* cb_data) {
-  cras_tm_create_timer_called++;
-  cras_tm_create_timer_cb = cb;
-  cras_tm_create_timer_cb_data = cb_data;
-  return cras_tm_create_timer_ret;
-}
-
-void cras_tm_cancel_timer(struct cras_tm* tm, struct cras_timer* t) {
-  cras_tm_cancel_timer_called++;
-  cras_tm_cancel_timer_arg = t;
-}
-
-DBusMessage* dbus_message_new_method_call(const char* destination,
-                                          const char* path,
-                                          const char* iface,
-                                          const char* method) {
-  dbus_message_new_method_call_called++;
-  dbus_message_new_method_call_method = method;
-  return reinterpret_cast<DBusMessage*>(0x456);
-}
-
-void dbus_message_unref(DBusMessage* message) {}
-
-dbus_bool_t dbus_message_append_args(DBusMessage* message,
-                                     int first_arg_type,
-                                     ...) {
-  return true;
-}
-
-dbus_bool_t dbus_connection_send_with_reply(DBusConnection* connection,
-                                            DBusMessage* message,
-                                            DBusPendingCall** pending_return,
-                                            int timeout_milliseconds) {
-  return true;
-}
-
-dbus_bool_t dbus_pending_call_set_notify(DBusPendingCall* pending,
-                                         DBusPendingCallNotifyFunction function,
-                                         void* user_data,
-                                         DBusFreeFunction free_user_data) {
-  return true;
-}
-
-void dbus_message_iter_recurse(DBusMessageIter* iter, DBusMessageIter* sub) {
-  MockDBusMessage* msg = *(MockDBusMessage**)iter;
-  MockDBusMessage** cur = (MockDBusMessage**)sub;
-  *cur = msg->recurse;
-}
-
-dbus_bool_t dbus_message_iter_next(DBusMessageIter* iter) {
-  MockDBusMessage** cur = (MockDBusMessage**)iter;
-  MockDBusMessage* msg = *cur;
-  *cur = msg->next;
-  return true;
-}
-
-int dbus_message_iter_get_arg_type(DBusMessageIter* iter) {
-  MockDBusMessage* msg;
-
-  if (iter == NULL)
-    return DBUS_TYPE_INVALID;
-
-  msg = *(MockDBusMessage**)iter;
-  if (msg == NULL)
-    return DBUS_TYPE_INVALID;
-
-  return msg->type;
-}
-
-void dbus_message_iter_get_basic(DBusMessageIter* iter, void* value) {
-  MockDBusMessage* msg = *(MockDBusMessage**)iter;
-  switch (msg->type) {
-    case DBUS_TYPE_BOOLEAN:
-      memcpy(value, &msg->value, sizeof(int));
-      break;
-    case DBUS_TYPE_STRING:
-      memcpy(value, &msg->value, sizeof(char*));
-      break;
-  }
-}
-
-}  // extern "C"
-}  // namespace
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tests/bt_io_unittest.cc b/cras/src/tests/bt_io_unittest.cc
deleted file mode 100644
index dd02652..0000000
--- a/cras/src/tests/bt_io_unittest.cc
+++ /dev/null
@@ -1,493 +0,0 @@
-// Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <gtest/gtest.h>
-
-extern "C" {
-
-// To test static functions.
-#include "cras_bt_io.c"
-#include "utlist.h"
-}
-
-static struct cras_bt_device* fake_device =
-    reinterpret_cast<struct cras_bt_device*>(0x123);
-static unsigned int cras_iodev_add_node_called;
-static unsigned int cras_iodev_rm_node_called;
-static unsigned int cras_iodev_free_format_called;
-static unsigned int cras_iodev_free_resources_called;
-static unsigned int cras_iodev_set_active_node_called;
-static unsigned int cras_iodev_list_add_output_called;
-static unsigned int cras_iodev_list_rm_output_called;
-static unsigned int cras_iodev_list_add_input_called;
-static unsigned int cras_iodev_list_rm_input_called;
-static unsigned int cras_bt_device_set_active_profile_called;
-static unsigned int cras_bt_device_set_active_profile_val;
-static int cras_bt_device_get_active_profile_ret;
-static int cras_bt_device_switch_profile_enable_dev_called;
-static int cras_bt_device_switch_profile_called;
-static int cras_bt_device_can_switch_to_a2dp_ret;
-static int cras_bt_device_has_a2dp_ret;
-static int is_utf8_string_ret_value;
-
-void ResetStubData() {
-  cras_iodev_add_node_called = 0;
-  cras_iodev_rm_node_called = 0;
-  cras_iodev_free_format_called = 0;
-  cras_iodev_free_resources_called = 0;
-  cras_iodev_set_active_node_called = 0;
-  cras_iodev_list_add_output_called = 0;
-  cras_iodev_list_rm_output_called = 0;
-  cras_iodev_list_add_input_called = 0;
-  cras_iodev_list_rm_input_called = 0;
-  cras_bt_device_set_active_profile_called = 0;
-  cras_bt_device_set_active_profile_val = 0;
-  cras_bt_device_get_active_profile_ret = 0;
-  cras_bt_device_switch_profile_enable_dev_called = 0;
-  cras_bt_device_switch_profile_called = 0;
-  cras_bt_device_can_switch_to_a2dp_ret = 0;
-  cras_bt_device_has_a2dp_ret = 0;
-  is_utf8_string_ret_value = 1;
-}
-
-namespace {
-
-class BtIoBasicSuite : public testing::Test {
- protected:
-  virtual void SetUp() {
-    ResetStubData();
-    SetUpIodev(&iodev_, CRAS_STREAM_OUTPUT);
-    SetUpIodev(&iodev2_, CRAS_STREAM_OUTPUT);
-    iodev_.active_node = &node_;
-    iodev2_.active_node = &node2_;
-
-    update_supported_formats_called_ = 0;
-    frames_queued_called_ = 0;
-    delay_frames_called_ = 0;
-    get_buffer_called_ = 0;
-    put_buffer_called_ = 0;
-    configure_dev_called_ = 0;
-    close_dev_called_ = 0;
-  }
-
-  virtual void TearDown() {}
-
-  static void SetUpIodev(struct cras_iodev* d, enum CRAS_STREAM_DIRECTION dir) {
-    d->direction = dir;
-    d->update_supported_formats = update_supported_formats;
-    d->frames_queued = frames_queued;
-    d->delay_frames = delay_frames;
-    d->get_buffer = get_buffer;
-    d->put_buffer = put_buffer;
-    d->configure_dev = configure_dev;
-    d->close_dev = close_dev;
-    d->supported_rates = NULL;
-    d->supported_channel_counts = NULL;
-    d->supported_formats = NULL;
-  }
-
-  // Stub functions for the iodev structure.
-  static int update_supported_formats(struct cras_iodev* iodev) {
-    free(iodev->supported_rates);
-    free(iodev->supported_channel_counts);
-    free(iodev->supported_formats);
-    iodev->supported_rates =
-        (size_t*)calloc(2, sizeof(*iodev->supported_rates));
-    iodev->supported_rates[0] = 48000;
-    iodev->supported_rates[1] = 0;
-    iodev->supported_channel_counts =
-        (size_t*)calloc(2, sizeof(*iodev->supported_channel_counts));
-    iodev->supported_channel_counts[0] = 2;
-    iodev->supported_channel_counts[1] = 0;
-    iodev->supported_formats =
-        (snd_pcm_format_t*)calloc(2, sizeof(*iodev->supported_formats));
-    iodev->supported_formats[0] = SND_PCM_FORMAT_S16_LE;
-    iodev->supported_formats[1] = (snd_pcm_format_t)0;
-    update_supported_formats_called_++;
-    return 0;
-  }
-  static int frames_queued(const cras_iodev* iodev, struct timespec* tstamp) {
-    frames_queued_called_++;
-    return 0;
-  }
-  static int delay_frames(const cras_iodev* iodev) {
-    delay_frames_called_++;
-    return 0;
-  }
-  static int get_buffer(cras_iodev* iodev,
-                        struct cras_audio_area** area,
-                        unsigned int* num) {
-    get_buffer_called_++;
-    return 0;
-  }
-  static int put_buffer(cras_iodev* iodev, unsigned int num) {
-    put_buffer_called_++;
-    return 0;
-  }
-  static int configure_dev(cras_iodev* iodev) {
-    configure_dev_called_++;
-    return 0;
-  }
-  static int close_dev(cras_iodev* iodev) {
-    free(iodev->format);
-    iodev->format = NULL;
-    close_dev_called_++;
-    return 0;
-  }
-
-  static struct cras_iodev* bt_iodev;
-  static struct cras_iodev iodev_;
-  static struct cras_iodev iodev2_;
-  static struct cras_ionode node_;
-  static struct cras_ionode node2_;
-  static unsigned int update_supported_formats_called_;
-  static unsigned int frames_queued_called_;
-  static unsigned int delay_frames_called_;
-  static unsigned int get_buffer_called_;
-  static unsigned int put_buffer_called_;
-  static unsigned int configure_dev_called_;
-  static unsigned int close_dev_called_;
-};
-
-struct cras_iodev* BtIoBasicSuite::bt_iodev;
-struct cras_iodev BtIoBasicSuite::iodev_;
-struct cras_iodev BtIoBasicSuite::iodev2_;
-struct cras_ionode BtIoBasicSuite::node_;
-struct cras_ionode BtIoBasicSuite::node2_;
-unsigned int BtIoBasicSuite::update_supported_formats_called_;
-unsigned int BtIoBasicSuite::frames_queued_called_;
-unsigned int BtIoBasicSuite::delay_frames_called_;
-unsigned int BtIoBasicSuite::get_buffer_called_;
-unsigned int BtIoBasicSuite::put_buffer_called_;
-unsigned int BtIoBasicSuite::configure_dev_called_;
-unsigned int BtIoBasicSuite::close_dev_called_;
-
-TEST_F(BtIoBasicSuite, CreateBtIo) {
-  struct cras_audio_area* fake_area;
-  struct cras_audio_format fake_fmt;
-  struct timespec tstamp;
-  unsigned fr;
-  bt_iodev = cras_bt_io_create(fake_device, &iodev_,
-                               CRAS_BT_DEVICE_PROFILE_A2DP_SOURCE);
-  EXPECT_NE((void*)NULL, bt_iodev);
-  EXPECT_EQ(&iodev_, active_profile_dev(bt_iodev));
-  EXPECT_EQ(1, cras_iodev_list_add_output_called);
-  bt_iodev->open_dev(bt_iodev);
-  bt_iodev->format = &fake_fmt;
-  bt_iodev->update_supported_formats(bt_iodev);
-  EXPECT_EQ(1, update_supported_formats_called_);
-
-  bt_iodev->state = CRAS_IODEV_STATE_OPEN;
-  bt_iodev->configure_dev(bt_iodev);
-  EXPECT_EQ(1, configure_dev_called_);
-  bt_iodev->frames_queued(bt_iodev, &tstamp);
-  EXPECT_EQ(1, frames_queued_called_);
-  bt_iodev->get_buffer(bt_iodev, &fake_area, &fr);
-  EXPECT_EQ(1, get_buffer_called_);
-  bt_iodev->put_buffer(bt_iodev, fr);
-  EXPECT_EQ(1, put_buffer_called_);
-  bt_iodev->close_dev(bt_iodev);
-  EXPECT_EQ(1, close_dev_called_);
-  EXPECT_EQ(1, cras_iodev_free_format_called);
-  cras_bt_io_destroy(bt_iodev);
-  EXPECT_EQ(1, cras_iodev_free_resources_called);
-  EXPECT_EQ(1, cras_iodev_list_rm_output_called);
-
-  free(iodev_.supported_rates);
-  free(iodev_.supported_channel_counts);
-  free(iodev_.supported_formats);
-}
-
-TEST_F(BtIoBasicSuite, SwitchProfileOnOpenDevForInputDev) {
-  ResetStubData();
-  iodev_.direction = CRAS_STREAM_INPUT;
-  bt_iodev = cras_bt_io_create(fake_device, &iodev_,
-                               CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY);
-
-  cras_bt_device_get_active_profile_ret = CRAS_BT_DEVICE_PROFILE_A2DP_SOURCE;
-  bt_iodev->open_dev(bt_iodev);
-
-  EXPECT_EQ(CRAS_BT_DEVICE_PROFILE_HSP_AUDIOGATEWAY |
-                CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY,
-            cras_bt_device_set_active_profile_val);
-  EXPECT_EQ(1, cras_bt_device_switch_profile_enable_dev_called);
-  cras_bt_io_destroy(bt_iodev);
-}
-
-TEST_F(BtIoBasicSuite, NoSwitchProfileOnOpenDevForInputDevAlreadyOnHfp) {
-  ResetStubData();
-  iodev_.direction = CRAS_STREAM_INPUT;
-  bt_iodev = cras_bt_io_create(fake_device, &iodev_,
-                               CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY);
-
-  /* No need to switch profile if already on HFP. */
-  cras_bt_device_get_active_profile_ret =
-      CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY;
-  bt_iodev->open_dev(bt_iodev);
-
-  EXPECT_EQ(0, cras_bt_device_switch_profile_enable_dev_called);
-  cras_bt_io_destroy(bt_iodev);
-}
-
-TEST_F(BtIoBasicSuite, SwitchProfileOnCloseInputDev) {
-  ResetStubData();
-  iodev_.direction = CRAS_STREAM_INPUT;
-  bt_iodev = cras_bt_io_create(fake_device, &iodev_,
-                               CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY);
-  bt_iodev->state = CRAS_IODEV_STATE_OPEN;
-
-  cras_bt_device_get_active_profile_ret =
-      CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY |
-      CRAS_BT_DEVICE_PROFILE_HSP_AUDIOGATEWAY;
-  cras_bt_device_has_a2dp_ret = 1;
-  bt_iodev->close_dev(bt_iodev);
-
-  EXPECT_EQ(CRAS_BT_DEVICE_PROFILE_A2DP_SOURCE,
-            cras_bt_device_set_active_profile_val);
-  EXPECT_EQ(1, cras_bt_device_switch_profile_called);
-  cras_bt_io_destroy(bt_iodev);
-}
-
-TEST_F(BtIoBasicSuite, NoSwitchProfileOnCloseInputDevNoSupportA2dp) {
-  ResetStubData();
-  iodev_.direction = CRAS_STREAM_INPUT;
-  bt_iodev = cras_bt_io_create(fake_device, &iodev_,
-                               CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY);
-  bt_iodev->state = CRAS_IODEV_STATE_OPEN;
-
-  cras_bt_device_get_active_profile_ret =
-      CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY |
-      CRAS_BT_DEVICE_PROFILE_HSP_AUDIOGATEWAY;
-  cras_bt_device_has_a2dp_ret = 0;
-  bt_iodev->close_dev(bt_iodev);
-
-  EXPECT_EQ(0, cras_bt_device_switch_profile_called);
-  cras_bt_io_destroy(bt_iodev);
-}
-
-TEST_F(BtIoBasicSuite, NoSwitchProfileOnCloseInputDevInCloseState) {
-  ResetStubData();
-  iodev_.direction = CRAS_STREAM_INPUT;
-  bt_iodev = cras_bt_io_create(fake_device, &iodev_,
-                               CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY);
-  bt_iodev->state = CRAS_IODEV_STATE_CLOSE;
-
-  cras_bt_device_get_active_profile_ret =
-      CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY |
-      CRAS_BT_DEVICE_PROFILE_HSP_AUDIOGATEWAY;
-  cras_bt_device_has_a2dp_ret = 1;
-  bt_iodev->close_dev(bt_iodev);
-
-  EXPECT_EQ(0, cras_bt_device_switch_profile_called);
-  cras_bt_io_destroy(bt_iodev);
-}
-
-TEST_F(BtIoBasicSuite, SwitchProfileOnAppendA2dpDev) {
-  ResetStubData();
-  bt_iodev = cras_bt_io_create(fake_device, &iodev_,
-                               CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY);
-
-  cras_bt_device_can_switch_to_a2dp_ret = 1;
-  cras_bt_io_append(bt_iodev, &iodev2_, CRAS_BT_DEVICE_PROFILE_A2DP_SOURCE);
-
-  EXPECT_EQ(CRAS_BT_DEVICE_PROFILE_A2DP_SOURCE,
-            cras_bt_device_set_active_profile_val);
-  EXPECT_EQ(0, cras_bt_device_switch_profile_enable_dev_called);
-  EXPECT_EQ(1, cras_bt_device_switch_profile_called);
-  cras_bt_io_destroy(bt_iodev);
-}
-
-TEST_F(BtIoBasicSuite, NoSwitchProfileOnAppendHfpDev) {
-  ResetStubData();
-  bt_iodev = cras_bt_io_create(fake_device, &iodev_,
-                               CRAS_BT_DEVICE_PROFILE_A2DP_SOURCE);
-
-  cras_bt_device_can_switch_to_a2dp_ret = 1;
-  cras_bt_io_append(bt_iodev, &iodev2_,
-                    CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY);
-
-  EXPECT_EQ(0, cras_bt_device_switch_profile_enable_dev_called);
-  cras_bt_io_destroy(bt_iodev);
-}
-
-TEST_F(BtIoBasicSuite, CreateSetDeviceActiveProfileToA2DP) {
-  ResetStubData();
-  cras_bt_device_get_active_profile_ret =
-      CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY;
-  cras_bt_device_can_switch_to_a2dp_ret = 1;
-  bt_iodev = cras_bt_io_create(fake_device, &iodev_,
-                               CRAS_BT_DEVICE_PROFILE_A2DP_SOURCE);
-
-  EXPECT_EQ(1, cras_bt_device_set_active_profile_called);
-  EXPECT_EQ(CRAS_BT_DEVICE_PROFILE_A2DP_SOURCE,
-            cras_bt_device_set_active_profile_val);
-  cras_bt_io_destroy(bt_iodev);
-}
-
-TEST_F(BtIoBasicSuite, CreateNoSetDeviceActiveProfileToA2DP) {
-  ResetStubData();
-  cras_bt_device_get_active_profile_ret =
-      CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY;
-  cras_bt_device_can_switch_to_a2dp_ret = 0;
-  bt_iodev = cras_bt_io_create(fake_device, &iodev_,
-                               CRAS_BT_DEVICE_PROFILE_A2DP_SOURCE);
-
-  EXPECT_EQ(0, cras_bt_device_set_active_profile_called);
-  cras_bt_io_destroy(bt_iodev);
-}
-
-TEST_F(BtIoBasicSuite, CreateSetDeviceActiveProfileToHFP) {
-  ResetStubData();
-  cras_bt_device_get_active_profile_ret = 0;
-  bt_iodev = cras_bt_io_create(fake_device, &iodev_,
-                               CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY);
-
-  EXPECT_EQ(CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY |
-                CRAS_BT_DEVICE_PROFILE_HSP_AUDIOGATEWAY,
-            cras_bt_device_set_active_profile_val);
-  cras_bt_io_destroy(bt_iodev);
-}
-
-TEST_F(BtIoBasicSuite, CreateDeviceWithInvalidUTF8Name) {
-  ResetStubData();
-  strcpy(iodev_.info.name, "Something BT");
-  iodev_.info.name[0] = 0xfe;
-  is_utf8_string_ret_value = 0;
-  bt_iodev = cras_bt_io_create(fake_device, &iodev_,
-                               CRAS_BT_DEVICE_PROFILE_A2DP_SOURCE);
-
-  ASSERT_STREQ("BLUETOOTH", bt_iodev->active_node->name);
-  cras_bt_io_destroy(bt_iodev);
-}
-
-}  // namespace
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
-
-extern "C" {
-
-// Cras iodev
-void cras_iodev_add_node(struct cras_iodev* iodev, struct cras_ionode* node) {
-  cras_iodev_add_node_called++;
-  DL_APPEND(iodev->nodes, node);
-}
-
-void cras_iodev_rm_node(struct cras_iodev* iodev, struct cras_ionode* node) {
-  cras_iodev_rm_node_called++;
-  DL_DELETE(iodev->nodes, node);
-}
-
-void cras_iodev_free_format(struct cras_iodev* iodev) {
-  cras_iodev_free_format_called++;
-}
-
-void cras_iodev_set_active_node(struct cras_iodev* iodev,
-                                struct cras_ionode* node) {
-  cras_iodev_set_active_node_called++;
-  iodev->active_node = node;
-}
-
-int cras_iodev_set_node_attr(struct cras_ionode* ionode,
-                             enum ionode_attr attr,
-                             int value) {
-  return 0;
-}
-
-void cras_iodev_free_resources(struct cras_iodev* iodev) {
-  cras_iodev_free_resources_called++;
-}
-
-//  From iodev list.
-int cras_iodev_list_add_output(struct cras_iodev* output) {
-  cras_iodev_list_add_output_called++;
-  return 0;
-}
-
-int cras_iodev_list_rm_output(struct cras_iodev* dev) {
-  cras_iodev_list_rm_output_called++;
-  return 0;
-}
-
-int cras_iodev_list_add_input(struct cras_iodev* output) {
-  cras_iodev_list_add_input_called++;
-  return 0;
-}
-
-int cras_iodev_list_rm_input(struct cras_iodev* dev) {
-  cras_iodev_list_rm_input_called++;
-  return 0;
-}
-
-// From bt device
-unsigned int cras_bt_device_get_active_profile(
-    const struct cras_bt_device* device) {
-  return cras_bt_device_get_active_profile_ret;
-}
-
-void cras_bt_device_set_active_profile(struct cras_bt_device* device,
-                                       unsigned int profile) {
-  cras_bt_device_set_active_profile_called++;
-  cras_bt_device_set_active_profile_val = profile;
-}
-
-int cras_bt_device_has_a2dp(struct cras_bt_device* device) {
-  return cras_bt_device_has_a2dp_ret;
-}
-
-int cras_bt_device_can_switch_to_a2dp(struct cras_bt_device* device) {
-  return cras_bt_device_can_switch_to_a2dp_ret;
-}
-
-int cras_bt_device_switch_profile(struct cras_bt_device* device,
-                                  struct cras_iodev* bt_iodev) {
-  cras_bt_device_switch_profile_called++;
-  return 0;
-}
-
-int cras_bt_device_switch_profile_enable_dev(struct cras_bt_device* device,
-                                             struct cras_iodev* bt_iodev) {
-  cras_bt_device_switch_profile_enable_dev_called++;
-  return 0;
-}
-
-const char* cras_bt_device_object_path(const struct cras_bt_device* device) {
-  return "/fake/object/path";
-}
-
-int cras_bt_device_get_stable_id(const struct cras_bt_device* device) {
-  return 123;
-}
-
-int cras_bt_device_get_use_hardware_volume(struct cras_bt_device* device) {
-  return 1;
-}
-
-int is_utf8_string(const char* string) {
-  return is_utf8_string_ret_value;
-}
-
-int cras_iodev_default_no_stream_playback(struct cras_iodev* odev, int enable) {
-  return 0;
-}
-
-int cras_iodev_frames_queued(struct cras_iodev* iodev,
-                             struct timespec* hw_tstamp) {
-  return 0;
-}
-
-unsigned int cras_iodev_default_frames_to_play_in_sleep(
-    struct cras_iodev* odev,
-    unsigned int* hw_level,
-    struct timespec* hw_tstamp) {
-  return 0;
-}
-
-int hfp_iodev_is_hsp(struct cras_iodev* iodev) {
-  return 0;
-}
-
-}  // extern "C"
diff --git a/cras/src/tests/bt_profile_unittest.cc b/cras/src/tests/bt_profile_unittest.cc
deleted file mode 100644
index 0758b44..0000000
--- a/cras/src/tests/bt_profile_unittest.cc
+++ /dev/null
@@ -1,182 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <dbus/dbus.h>
-#include <gtest/gtest.h>
-#include <stdio.h>
-#include <sys/socket.h>
-
-#include "dbus_test.h"
-
-extern "C" {
-#include "cras_bt_constants.h"
-#include "cras_bt_profile.h"
-}
-
-namespace {
-
-static struct cras_bt_profile fake_profile;
-static struct cras_bt_transport* fake_transport;
-static int profile_release_called;
-static struct cras_bt_profile* profile_release_arg_value;
-static int profile_new_connection_called;
-static struct cras_bt_transport* profile_new_connection_arg_value;
-static int profile_request_disconnection_called;
-static struct cras_bt_transport* profile_request_disconnection_arg_value;
-static int profile_cancel_called;
-static struct cras_bt_profile* profile_cancel_arg_value;
-static int cras_bt_transport_get_called;
-static const char* cras_bt_transport_get_arg_value;
-
-void fake_profile_release(struct cras_bt_profile* profile);
-void fake_profile_new_connection(struct cras_bt_profile* profile,
-                                 struct cras_bt_transport* transport);
-void fake_profile_request_disconnection(struct cras_bt_profile* profile,
-                                        struct cras_bt_transport* transport);
-void fake_profile_cancel(struct cras_bt_profile* profile);
-
-class BtProfileTestSuite : public DBusTest {
-  virtual void SetUp() {
-    DBusTest::SetUp();
-
-    profile_release_called = 0;
-    profile_new_connection_called = 0;
-    profile_request_disconnection_called = 0;
-    profile_cancel_called = 0;
-
-    fake_profile.name = "fake";
-    fake_profile.object_path = "/fake";
-    fake_profile.uuid = "0";
-    fake_profile.version = 0;
-    fake_profile.role = NULL;
-    fake_profile.features = 0;
-    fake_profile.release = fake_profile_release;
-    fake_profile.new_connection = fake_profile_new_connection;
-    fake_profile.request_disconnection = fake_profile_request_disconnection;
-    fake_profile.cancel = fake_profile_cancel;
-
-    fake_transport = reinterpret_cast<struct cras_bt_transport*>(0x321);
-    cras_bt_transport_get_called = 0;
-  }
-};
-
-TEST_F(BtProfileTestSuite, RegisterProfile) {
-  struct cras_bt_profile* profile;
-
-  ExpectMethodCall(PROFILE_MANAGER_OBJ_PATH, BLUEZ_PROFILE_MGMT_INTERFACE,
-                   "RegisterProfile")
-      .WithObjectPath("/fake")
-      .SendReply();
-
-  cras_bt_add_profile(conn_, &fake_profile);
-  cras_bt_register_profiles(conn_);
-
-  WaitForMatches();
-  profile = cras_bt_profile_get("/fake");
-
-  EXPECT_TRUE(profile == &fake_profile);
-}
-
-TEST_F(BtProfileTestSuite, ResetProfile) {
-  cras_bt_add_profile(conn_, &fake_profile);
-  cras_bt_profile_reset();
-
-  ASSERT_EQ(1, profile_release_called);
-}
-
-TEST_F(BtProfileTestSuite, HandleMessage) {
-  ExpectMethodCall(PROFILE_MANAGER_OBJ_PATH, BLUEZ_PROFILE_MGMT_INTERFACE,
-                   "RegisterProfile")
-      .WithObjectPath("/fake")
-      .SendReply();
-
-  cras_bt_add_profile(conn_, &fake_profile);
-  cras_bt_register_profiles(conn_);
-
-  WaitForMatches();
-
-  /* Use stdin as mock fd */
-  CreateMessageCall("/fake", "org.bluez.Profile1", "NewConnection")
-      .WithString("device")
-      .WithUnixFd(0)
-      .Send();
-
-  WaitForMatches();
-  ASSERT_EQ(1, profile_new_connection_called);
-  ASSERT_STREQ("device", cras_bt_transport_get_arg_value);
-  ASSERT_EQ(1, cras_bt_transport_get_called);
-  ASSERT_EQ(fake_transport, profile_new_connection_arg_value);
-
-  CreateMessageCall("/fake", "org.bluez.Profile1", "RequestDisconnection")
-      .WithString("device")
-      .Send();
-  WaitForMatches();
-  ASSERT_EQ(2, cras_bt_transport_get_called);
-  ASSERT_EQ(1, profile_request_disconnection_called);
-  ASSERT_EQ(fake_transport, profile_request_disconnection_arg_value);
-
-  CreateMessageCall("/fake", "org.bluez.Profile1", "Release").Send();
-  WaitForMatches();
-  ASSERT_EQ(1, profile_release_called);
-  ASSERT_EQ(&fake_profile, profile_release_arg_value);
-
-  CreateMessageCall("/fake", "org.bluez.Profile1", "Cancel").Send();
-  WaitForMatches();
-  ASSERT_EQ(1, profile_cancel_called);
-  ASSERT_EQ(&fake_profile, profile_cancel_arg_value);
-}
-
-void fake_profile_release(struct cras_bt_profile* profile) {
-  profile_release_arg_value = profile;
-  profile_release_called++;
-}
-
-void fake_profile_new_connection(struct cras_bt_profile* profile,
-                                 struct cras_bt_transport* transport) {
-  profile_new_connection_arg_value = transport;
-  profile_new_connection_called++;
-}
-
-void fake_profile_request_disconnection(struct cras_bt_profile* profile,
-                                        struct cras_bt_transport* transport) {
-  profile_request_disconnection_arg_value = transport;
-  profile_request_disconnection_called++;
-}
-
-void fake_profile_cancel(struct cras_bt_profile* profile) {
-  profile_cancel_arg_value = profile;
-  profile_cancel_called++;
-}
-
-}  // namespace
-
-extern "C" {
-dbus_bool_t append_key_value(DBusMessageIter* iter,
-                             const char* key,
-                             int type,
-                             const char* type_string,
-                             void* value) {
-  return TRUE;
-}
-
-struct cras_bt_transport* cras_bt_transport_get(const char* object_path) {
-  cras_bt_transport_get_called++;
-  cras_bt_transport_get_arg_value = object_path;
-  return fake_transport;
-}
-
-void cras_bt_transport_destroy(struct cras_bt_transport* transport) {}
-
-struct cras_bt_transport* cras_bt_transport_create(DBusConnection* conn,
-                                                   const char* object_path) {
-  return fake_transport;
-}
-
-}  // extern "C"
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tests/buffer_share_unittest.cc b/cras/src/tests/buffer_share_unittest.cc
deleted file mode 100644
index f16456b..0000000
--- a/cras/src/tests/buffer_share_unittest.cc
+++ /dev/null
@@ -1,114 +0,0 @@
-// Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <gtest/gtest.h>
-#include <stdio.h>
-
-extern "C" {
-#include "buffer_share.h"
-#include "cras_types.h"
-}
-
-namespace {
-
-class BufferShareTestSuite : public testing::Test {
- protected:
-  virtual void SetUp() {}
-
-  virtual void TearDown() {}
-};
-
-TEST_F(BufferShareTestSuite, Create) {
-  buffer_share* dm = buffer_share_create(1024);
-  EXPECT_NE(static_cast<buffer_share*>(NULL), dm);
-  buffer_share_destroy(dm);
-}
-
-TEST_F(BufferShareTestSuite, AddRmDev) {
-  buffer_share* dm = buffer_share_create(1024);
-  int rc;
-
-  rc = buffer_share_add_id(dm, 0xf00, NULL);
-  EXPECT_EQ(0, rc);
-  rc = buffer_share_add_id(dm, 0xf00, NULL);
-  EXPECT_NE(0, rc);
-
-  rc = buffer_share_rm_id(dm, 0xf00);
-  EXPECT_EQ(0, rc);
-  rc = buffer_share_rm_id(dm, 0xf00);
-  EXPECT_NE(0, rc);
-
-  buffer_share_destroy(dm);
-}
-
-TEST_F(BufferShareTestSuite, AddManyDevs) {
-  buffer_share* dm = buffer_share_create(1024);
-
-  for (unsigned int i = 0; i < INITIAL_ID_SIZE; i++)
-    EXPECT_EQ(0, buffer_share_add_id(dm, 0xf00 + i, NULL));
-
-  EXPECT_EQ(0, buffer_share_add_id(dm, 0xf00 + INITIAL_ID_SIZE, NULL));
-  EXPECT_EQ(0, buffer_share_rm_id(dm, 0xf00 + INITIAL_ID_SIZE));
-
-  for (unsigned int i = 0; i < INITIAL_ID_SIZE; i++)
-    EXPECT_EQ(0, buffer_share_rm_id(dm, 0xf00 + i));
-
-  buffer_share_destroy(dm);
-}
-
-TEST_F(BufferShareTestSuite, OneDev) {
-  buffer_share* dm = buffer_share_create(1024);
-  int rc;
-
-  rc = buffer_share_add_id(dm, 0xf00, NULL);
-  EXPECT_EQ(0, rc);
-
-  buffer_share_offset_update(dm, 0xf00, 500);
-  EXPECT_EQ(500, buffer_share_get_new_write_point(dm));
-
-  buffer_share_offset_update(dm, 0xf00, 500);
-  EXPECT_EQ(500, buffer_share_get_new_write_point(dm));
-
-  buffer_share_offset_update(dm, 0xf00, 500);
-  EXPECT_EQ(500, buffer_share_get_new_write_point(dm));
-
-  buffer_share_offset_update(dm, 0xf00, 500);
-  EXPECT_EQ(500, buffer_share_get_new_write_point(dm));
-
-  buffer_share_destroy(dm);
-}
-
-TEST_F(BufferShareTestSuite, TwoDevs) {
-  buffer_share* dm = buffer_share_create(1024);
-  int rc;
-
-  rc = buffer_share_add_id(dm, 0xf00, NULL);
-  EXPECT_EQ(0, rc);
-  rc = buffer_share_add_id(dm, 0xf02, NULL);
-  EXPECT_EQ(0, rc);
-
-  buffer_share_offset_update(dm, 0xf00, 500);
-  EXPECT_EQ(0, buffer_share_get_new_write_point(dm));
-
-  buffer_share_offset_update(dm, 0xf02, 750);
-  EXPECT_EQ(500, buffer_share_get_new_write_point(dm));
-
-  buffer_share_offset_update(dm, 0xf00, 500);
-  EXPECT_EQ(250, buffer_share_get_new_write_point(dm));
-
-  buffer_share_offset_update(dm, 0xf02, 750);
-  EXPECT_EQ(250, buffer_share_get_new_write_point(dm));
-
-  buffer_share_offset_update(dm, 0xf00, 500);
-  EXPECT_EQ(500, buffer_share_get_new_write_point(dm));
-
-  buffer_share_destroy(dm);
-}
-
-}  //  namespace
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tests/byte_buffer_unittest.cc b/cras/src/tests/byte_buffer_unittest.cc
deleted file mode 100644
index 7b28b0f..0000000
--- a/cras/src/tests/byte_buffer_unittest.cc
+++ /dev/null
@@ -1,103 +0,0 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "byte_buffer.h"
-
-#include <gtest/gtest.h>
-
-namespace {
-
-TEST(ByteBuffer, ReadWrite) {
-  struct byte_buffer* b;
-  uint8_t* data;
-  unsigned int data_size;
-
-  b = byte_buffer_create(100);
-  EXPECT_EQ(100, buf_available(b));
-  EXPECT_EQ(0, buf_queued(b));
-
-  data = buf_read_pointer_size(b, &data_size);
-  EXPECT_NE((void*)NULL, data);
-  EXPECT_EQ(0, data_size);
-
-  data = buf_write_pointer_size(b, &data_size);
-  EXPECT_NE((void*)NULL, data);
-  EXPECT_EQ(100, data_size);
-
-  buf_increment_write(b, 50);
-  data = buf_read_pointer_size(b, &data_size);
-  EXPECT_NE((void*)NULL, data);
-  EXPECT_EQ(50, data_size);
-
-  buf_increment_read(b, 40);
-  EXPECT_EQ(10, buf_queued(b));
-  EXPECT_EQ(90, buf_available(b));
-
-  /* Test write to the end of ring buffer. */
-  data = buf_write_pointer_size(b, &data_size);
-  EXPECT_NE((void*)NULL, data);
-  EXPECT_EQ(50, data_size);
-
-  buf_increment_write(b, 50);
-  data = buf_write_pointer_size(b, &data_size);
-  EXPECT_NE((void*)NULL, data);
-  EXPECT_EQ(40, data_size);
-
-  byte_buffer_destroy(&b);
-}
-
-TEST(ByteBuffer, SetUsedSizeReadWrite) {
-  struct byte_buffer* b;
-  uint8_t* data;
-  unsigned int data_size;
-
-  b = byte_buffer_create(100);
-  EXPECT_EQ(100, buf_available(b));
-  EXPECT_EQ(0, buf_queued(b));
-
-  /* Test set used_size to limit the initial allocated max size. */
-  byte_buffer_set_used_size(b, 90);
-  EXPECT_EQ(90, buf_available(b));
-
-  data = buf_write_pointer_size(b, &data_size);
-  EXPECT_NE((void*)NULL, data);
-  EXPECT_EQ(90, data_size);
-
-  buf_increment_write(b, 90);
-  data = buf_read_pointer_size(b, &data_size);
-  EXPECT_NE((void*)NULL, data);
-  EXPECT_EQ(90, data_size);
-
-  buf_increment_read(b, 50);
-  EXPECT_EQ(50, buf_available(b));
-  EXPECT_EQ(40, buf_queued(b));
-
-  data = buf_write_pointer_size(b, &data_size);
-  EXPECT_NE((void*)NULL, data);
-  EXPECT_EQ(50, data_size);
-
-  buf_increment_write(b, 50);
-  data = buf_write_pointer_size(b, &data_size);
-  EXPECT_NE((void*)NULL, data);
-  EXPECT_EQ(0, data_size);
-
-  /* Test read to the end of ring buffer. */
-  data = buf_read_pointer_size(b, &data_size);
-  EXPECT_NE((void*)NULL, data);
-  EXPECT_EQ(40, data_size);
-
-  buf_increment_read(b, 40);
-  data = buf_read_pointer_size(b, &data_size);
-  EXPECT_NE((void*)NULL, data);
-  EXPECT_EQ(50, data_size);
-
-  byte_buffer_destroy(&b);
-}
-
-}  // namespace
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
\ No newline at end of file
diff --git a/cras/src/tests/capture_rclient_unittest.cc b/cras/src/tests/capture_rclient_unittest.cc
deleted file mode 100644
index 446fddf..0000000
--- a/cras/src/tests/capture_rclient_unittest.cc
+++ /dev/null
@@ -1,278 +0,0 @@
-// Copyright 2019 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <gtest/gtest.h>
-#include <stdio.h>
-#include <unistd.h>
-
-extern "C" {
-#include "audio_thread.h"
-#include "cras_bt_log.h"
-#include "cras_messages.h"
-#include "cras_rclient.h"
-#include "cras_rstream.h"
-#include "cras_system_state.h"
-
-// Access to data structures and static functions.
-#include "cras_capture_rclient.c"
-#include "cras_rclient_util.c"
-}
-static unsigned int cras_make_fd_nonblocking_called;
-static unsigned int cras_observer_remove_called;
-static int stream_list_add_called;
-static int stream_list_add_return;
-static unsigned int stream_list_rm_called;
-static struct cras_audio_shm mock_shm;
-static struct cras_rstream mock_rstream;
-
-void ResetStubData() {
-  cras_make_fd_nonblocking_called = 0;
-  cras_observer_remove_called = 0;
-  stream_list_add_called = 0;
-  stream_list_add_return = 0;
-  stream_list_rm_called = 0;
-}
-
-namespace {
-
-TEST(RClientSuite, CreateSendMessage) {
-  struct cras_rclient* rclient;
-  int rc;
-  struct cras_client_connected msg;
-  int pipe_fds[2];
-
-  ResetStubData();
-
-  rc = pipe(pipe_fds);
-  ASSERT_EQ(0, rc);
-
-  rclient = cras_capture_rclient_create(pipe_fds[1], 800);
-  ASSERT_NE((void*)NULL, rclient);
-  EXPECT_EQ(800, rclient->id);
-
-  rc = read(pipe_fds[0], &msg, sizeof(msg));
-  EXPECT_EQ(sizeof(msg), rc);
-  EXPECT_EQ(CRAS_CLIENT_CONNECTED, msg.header.id);
-
-  rclient->ops->destroy(rclient);
-  EXPECT_EQ(1, cras_observer_remove_called);
-  close(pipe_fds[0]);
-  close(pipe_fds[1]);
-}
-
-class CCRMessageSuite : public testing::Test {
- protected:
-  virtual void SetUp() {
-    int rc;
-    struct cras_client_connected msg;
-
-    rc = pipe(pipe_fds_);
-    if (rc < 0)
-      return;
-
-    rclient_ = cras_capture_rclient_create(pipe_fds_[1], 1);
-    rc = read(pipe_fds_[0], &msg, sizeof(msg));
-    if (rc < 0)
-      return;
-
-    fmt = {
-        .format = SND_PCM_FORMAT_S16_LE,
-        .frame_rate = 48000,
-        .num_channels = 2,
-    };
-    cras_audio_format_set_default_channel_layout(&fmt);
-    ResetStubData();
-  }
-
-  virtual void TearDown() {
-    rclient_->ops->destroy(rclient_);
-    close(pipe_fds_[0]);
-    close(pipe_fds_[1]);
-  }
-
-  struct cras_rclient* rclient_;
-  struct cras_audio_format fmt;
-  int pipe_fds_[2];
-  int fd_;
-};
-
-TEST_F(CCRMessageSuite, StreamConnectMessage) {
-  struct cras_client_stream_connected out_msg;
-  int rc;
-
-  struct cras_connect_message msg;
-  cras_stream_id_t stream_id = 0x10002;
-  cras_fill_connect_message(&msg, CRAS_STREAM_INPUT, stream_id,
-                            CRAS_STREAM_TYPE_DEFAULT, CRAS_CLIENT_TYPE_UNKNOWN,
-                            480, 240, /*flags=*/0, /*effects=*/0, fmt,
-                            NO_DEVICE);
-  ASSERT_EQ(stream_id, msg.stream_id);
-
-  fd_ = 100;
-  rclient_->ops->handle_message_from_client(rclient_, &msg.header, &fd_, 1);
-  EXPECT_EQ(1, cras_make_fd_nonblocking_called);
-  EXPECT_EQ(1, stream_list_add_called);
-  EXPECT_EQ(0, stream_list_rm_called);
-
-  rc = read(pipe_fds_[0], &out_msg, sizeof(out_msg));
-  EXPECT_EQ(sizeof(out_msg), rc);
-  EXPECT_EQ(stream_id, out_msg.stream_id);
-}
-
-TEST_F(CCRMessageSuite, StreamConnectMessageInvalidDirection) {
-  struct cras_client_stream_connected out_msg;
-  int rc;
-
-  struct cras_connect_message msg;
-  cras_stream_id_t stream_id = 0x10002;
-
-  for (int i = 0; i < CRAS_NUM_DIRECTIONS; i++) {
-    const auto dir = static_cast<CRAS_STREAM_DIRECTION>(i);
-    if (dir == CRAS_STREAM_INPUT)
-      continue;
-    cras_fill_connect_message(&msg, dir, stream_id, CRAS_STREAM_TYPE_DEFAULT,
-                              CRAS_CLIENT_TYPE_UNKNOWN, 480, 240, /*flags=*/0,
-                              /*effects=*/0, fmt, NO_DEVICE);
-    ASSERT_EQ(stream_id, msg.stream_id);
-
-    fd_ = 100;
-    rc = rclient_->ops->handle_message_from_client(rclient_, &msg.header, &fd_,
-                                                   1);
-    EXPECT_EQ(0, rc);
-    EXPECT_EQ(0, cras_make_fd_nonblocking_called);
-    EXPECT_EQ(0, stream_list_add_called);
-    EXPECT_EQ(0, stream_list_rm_called);
-
-    rc = read(pipe_fds_[0], &out_msg, sizeof(out_msg));
-    EXPECT_EQ(sizeof(out_msg), rc);
-    EXPECT_EQ(-EINVAL, out_msg.err);
-    EXPECT_EQ(stream_id, out_msg.stream_id);
-  }
-}
-
-TEST_F(CCRMessageSuite, StreamConnectMessageInvalidClientId) {
-  struct cras_client_stream_connected out_msg;
-  int rc;
-
-  struct cras_connect_message msg;
-  cras_stream_id_t stream_id = 0x20002;  // stream_id with invalid client_id
-  cras_fill_connect_message(&msg, CRAS_STREAM_INPUT, stream_id,
-                            CRAS_STREAM_TYPE_DEFAULT, CRAS_CLIENT_TYPE_UNKNOWN,
-                            480, 240, /*flags=*/0, /*effects=*/0, fmt,
-                            NO_DEVICE);
-  ASSERT_EQ(stream_id, msg.stream_id);
-
-  fd_ = 100;
-  rc =
-      rclient_->ops->handle_message_from_client(rclient_, &msg.header, &fd_, 1);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(0, cras_make_fd_nonblocking_called);
-  EXPECT_EQ(0, stream_list_add_called);
-  EXPECT_EQ(0, stream_list_rm_called);
-
-  rc = read(pipe_fds_[0], &out_msg, sizeof(out_msg));
-  EXPECT_EQ(sizeof(out_msg), rc);
-  EXPECT_EQ(-EINVAL, out_msg.err);
-  EXPECT_EQ(stream_id, out_msg.stream_id);
-}
-
-TEST_F(CCRMessageSuite, StreamDisconnectMessage) {
-  struct cras_disconnect_stream_message msg;
-  cras_stream_id_t stream_id = 0x10002;
-  cras_fill_disconnect_stream_message(&msg, stream_id);
-
-  rclient_->ops->handle_message_from_client(rclient_, &msg.header, NULL, 0);
-  EXPECT_EQ(0, stream_list_add_called);
-  EXPECT_EQ(1, stream_list_rm_called);
-}
-
-TEST_F(CCRMessageSuite, StreamDisconnectMessageInvalidClientId) {
-  struct cras_disconnect_stream_message msg;
-  cras_stream_id_t stream_id = 0x20002;  // stream_id with invalid client_id
-  cras_fill_disconnect_stream_message(&msg, stream_id);
-
-  rclient_->ops->handle_message_from_client(rclient_, &msg.header, NULL, 0);
-  EXPECT_EQ(0, stream_list_add_called);
-  EXPECT_EQ(0, stream_list_rm_called);
-}
-}  // namespace
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
-
-/* stubs */
-extern "C" {
-
-struct stream_list* cras_iodev_list_get_stream_list() {
-  return NULL;
-}
-
-int cras_make_fd_nonblocking(int fd) {
-  cras_make_fd_nonblocking_called++;
-  return 0;
-}
-
-void cras_observer_remove(struct cras_observer_client* client) {
-  cras_observer_remove_called++;
-}
-
-unsigned int cras_rstream_get_effects(const struct cras_rstream* stream) {
-  return 0;
-}
-
-int cras_send_with_fds(int sockfd,
-                       const void* buf,
-                       size_t len,
-                       int* fd,
-                       unsigned int num_fds) {
-  return write(sockfd, buf, len);
-}
-
-key_t cras_sys_state_shm_fd() {
-  return 1;
-}
-
-void cras_system_set_suspended(int suspended) {}
-
-int stream_list_rm_all_client_streams(struct stream_list* list,
-                                      struct cras_rclient* rclient) {
-  return 0;
-}
-
-int stream_list_rm(struct stream_list* list, cras_stream_id_t id) {
-  stream_list_rm_called++;
-  return 0;
-}
-
-int stream_list_add(struct stream_list* list,
-                    struct cras_rstream_config* config,
-                    struct cras_rstream** stream) {
-  int ret;
-
-  *stream = &mock_rstream;
-
-  stream_list_add_called++;
-  ret = stream_list_add_return;
-  if (ret)
-    stream_list_add_return = -EINVAL;
-
-  mock_rstream.shm = &mock_shm;
-  mock_rstream.direction = config->direction;
-  mock_rstream.stream_id = config->stream_id;
-
-  return ret;
-}
-
-bool cras_audio_format_valid(const struct cras_audio_format* fmt) {
-  return true;
-}
-
-void detect_rtc_stream_pair(struct stream_list* list,
-                            struct cras_rstream* stream) {
-  return;
-}
-
-}  // extern "C"
diff --git a/cras/src/tests/card_config_unittest.cc b/cras/src/tests/card_config_unittest.cc
deleted file mode 100644
index 4616515..0000000
--- a/cras/src/tests/card_config_unittest.cc
+++ /dev/null
@@ -1,283 +0,0 @@
-// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <gtest/gtest.h>
-#include <stdio.h>
-
-extern "C" {
-#include "cras_card_config.h"
-#include "cras_types.h"
-}
-
-namespace {
-
-static unsigned int cras_volume_curve_create_default_called;
-static struct cras_volume_curve* cras_volume_curve_create_default_return;
-static unsigned int cras_volume_curve_create_simple_step_called;
-static long cras_volume_curve_create_simple_step_max_volume;
-static long cras_volume_curve_create_simple_step_volume_step;
-static struct cras_volume_curve* cras_volume_curve_create_simple_step_return;
-static unsigned int cras_volume_curve_create_explicit_called;
-static long cras_explicit_curve[101];
-static struct cras_volume_curve* cras_volume_curve_create_explicit_return;
-
-static const char CONFIG_PATH[] = CRAS_UT_TMPDIR;
-
-void CreateConfigFile(const char* name, const char* config_text) {
-  FILE* f;
-  char card_path[128];
-
-  snprintf(card_path, sizeof(card_path), "%s/%s", CONFIG_PATH, name);
-  f = fopen(card_path, "w");
-  if (f == NULL)
-    return;
-
-  fprintf(f, "%s", config_text);
-
-  fclose(f);
-}
-
-class CardConfigTestSuite : public testing::Test {
- protected:
-  virtual void SetUp() {
-    cras_volume_curve_create_default_called = 0;
-    cras_volume_curve_create_default_return =
-        reinterpret_cast<struct cras_volume_curve*>(0x55);
-    cras_volume_curve_create_simple_step_return =
-        reinterpret_cast<struct cras_volume_curve*>(0x56);
-    cras_volume_curve_create_explicit_return =
-        reinterpret_cast<struct cras_volume_curve*>(0x57);
-    cras_volume_curve_create_simple_step_called = 0;
-    cras_volume_curve_create_simple_step_return = NULL;
-    cras_volume_curve_create_explicit_called = 0;
-    cras_volume_curve_create_explicit_return = NULL;
-  }
-};
-
-// Test that no config is returned if the file doesn't exist.
-TEST_F(CardConfigTestSuite, NoConfigFound) {
-  struct cras_card_config* config;
-
-  config = cras_card_config_create(CONFIG_PATH, "no_effing_way_this_exists");
-  EXPECT_EQ(NULL, config);
-}
-
-// Test an empty config file, should return a null volume curve.
-TEST_F(CardConfigTestSuite, EmptyConfigFileReturnsNullVolumeCurve) {
-  static const char empty_config_text[] = "";
-  static const char empty_config_name[] = "EmptyConfigCard";
-  struct cras_card_config* config;
-  struct cras_volume_curve* curve;
-
-  CreateConfigFile(empty_config_name, empty_config_text);
-
-  config = cras_card_config_create(CONFIG_PATH, empty_config_name);
-  EXPECT_NE(static_cast<struct cras_card_config*>(NULL), config);
-
-  curve = cras_card_config_get_volume_curve_for_control(config, "asdf");
-  EXPECT_EQ(0, cras_volume_curve_create_default_called);
-  EXPECT_EQ(static_cast<struct cras_volume_curve*>(NULL), curve);
-
-  cras_card_config_destroy(config);
-}
-
-// Getting a curve from a null config should always return null volume curve.
-TEST_F(CardConfigTestSuite, NullConfigGivesDefaultVolumeCurve) {
-  struct cras_volume_curve* curve;
-
-  curve = cras_card_config_get_volume_curve_for_control(NULL, "asdf");
-  EXPECT_EQ(0, cras_volume_curve_create_default_called);
-  EXPECT_EQ(static_cast<struct cras_volume_curve*>(NULL), curve);
-}
-
-// Test getting a curve from a simple_step configuration.
-TEST_F(CardConfigTestSuite, SimpleStepConfig) {
-  static const char simple_config_name[] = "simple";
-  static const char simple_config_text[] =
-      "[Card1]\n"
-      "volume_curve = simple_step\n"
-      "volume_step = 75\n"
-      "max_volume = -600\n";
-  struct cras_card_config* config;
-  struct cras_volume_curve* curve;
-
-  CreateConfigFile(simple_config_name, simple_config_text);
-
-  config = cras_card_config_create(CONFIG_PATH, simple_config_name);
-  EXPECT_NE(static_cast<struct cras_card_config*>(NULL), config);
-
-  // Unknown config should return default curve.
-  curve = cras_card_config_get_volume_curve_for_control(NULL, "asdf");
-  EXPECT_EQ(0, cras_volume_curve_create_default_called);
-  EXPECT_EQ(static_cast<struct cras_volume_curve*>(NULL), curve);
-
-  // Test a config that specifies simple_step.
-  curve = cras_card_config_get_volume_curve_for_control(config, "Card1");
-  EXPECT_EQ(cras_volume_curve_create_simple_step_return, curve);
-  EXPECT_EQ(0, cras_volume_curve_create_default_called);
-  EXPECT_EQ(1, cras_volume_curve_create_simple_step_called);
-  EXPECT_EQ(-600, cras_volume_curve_create_simple_step_max_volume);
-  EXPECT_EQ(75, cras_volume_curve_create_simple_step_volume_step);
-
-  cras_card_config_destroy(config);
-}
-
-// Test getting a curve from an explicit configuration.
-TEST_F(CardConfigTestSuite, ExplicitCurveConfig) {
-  static const char explicit_config_name[] = "explicit";
-  static const char explicit_config_text[] =
-      "[Card1]\n"
-      "volume_curve = explicit\n"
-      "dB_at_0 = -9950\n"
-      "dB_at_1 = -9850\n"
-      "dB_at_2 = -9750\n"
-      "dB_at_3 = -9650\n"
-      "dB_at_4 = -9550\n"
-      "dB_at_5 = -9450\n"
-      "dB_at_6 = -9350\n"
-      "dB_at_7 = -9250\n"
-      "dB_at_8 = -9150\n"
-      "dB_at_9 = -9050\n"
-      "dB_at_10 = -8950\n"
-      "dB_at_11 = -8850\n"
-      "dB_at_12 = -8750\n"
-      "dB_at_13 = -8650\n"
-      "dB_at_14 = -8550\n"
-      "dB_at_15 = -8450\n"
-      "dB_at_16 = -8350\n"
-      "dB_at_17 = -8250\n"
-      "dB_at_18 = -8150\n"
-      "dB_at_19 = -8050\n"
-      "dB_at_20 = -7950\n"
-      "dB_at_21 = -7850\n"
-      "dB_at_22 = -7750\n"
-      "dB_at_23 = -7650\n"
-      "dB_at_24 = -7550\n"
-      "dB_at_25 = -7450\n"
-      "dB_at_26 = -7350\n"
-      "dB_at_27 = -7250\n"
-      "dB_at_28 = -7150\n"
-      "dB_at_29 = -7050\n"
-      "dB_at_30 = -6950\n"
-      "dB_at_31 = -6850\n"
-      "dB_at_32 = -6750\n"
-      "dB_at_33 = -6650\n"
-      "dB_at_34 = -6550\n"
-      "dB_at_35 = -6450\n"
-      "dB_at_36 = -6350\n"
-      "dB_at_37 = -6250\n"
-      "dB_at_38 = -6150\n"
-      "dB_at_39 = -6050\n"
-      "dB_at_40 = -5950\n"
-      "dB_at_41 = -5850\n"
-      "dB_at_42 = -5750\n"
-      "dB_at_43 = -5650\n"
-      "dB_at_44 = -5550\n"
-      "dB_at_45 = -5450\n"
-      "dB_at_46 = -5350\n"
-      "dB_at_47 = -5250\n"
-      "dB_at_48 = -5150\n"
-      "dB_at_49 = -5050\n"
-      "dB_at_50 = -4950\n"
-      "dB_at_51 = -4850\n"
-      "dB_at_52 = -4750\n"
-      "dB_at_53 = -4650\n"
-      "dB_at_54 = -4550\n"
-      "dB_at_55 = -4450\n"
-      "dB_at_56 = -4350\n"
-      "dB_at_57 = -4250\n"
-      "dB_at_58 = -4150\n"
-      "dB_at_59 = -4050\n"
-      "dB_at_60 = -3950\n"
-      "dB_at_61 = -3850\n"
-      "dB_at_62 = -3750\n"
-      "dB_at_63 = -3650\n"
-      "dB_at_64 = -3550\n"
-      "dB_at_65 = -3450\n"
-      "dB_at_66 = -3350\n"
-      "dB_at_67 = -3250\n"
-      "dB_at_68 = -3150\n"
-      "dB_at_69 = -3050\n"
-      "dB_at_70 = -2950\n"
-      "dB_at_71 = -2850\n"
-      "dB_at_72 = -2750\n"
-      "dB_at_73 = -2650\n"
-      "dB_at_74 = -2550\n"
-      "dB_at_75 = -2450\n"
-      "dB_at_76 = -2350\n"
-      "dB_at_77 = -2250\n"
-      "dB_at_78 = -2150\n"
-      "dB_at_79 = -2050\n"
-      "dB_at_80 = -1950\n"
-      "dB_at_81 = -1850\n"
-      "dB_at_82 = -1750\n"
-      "dB_at_83 = -1650\n"
-      "dB_at_84 = -1550\n"
-      "dB_at_85 = -1450\n"
-      "dB_at_86 = -1350\n"
-      "dB_at_87 = -1250\n"
-      "dB_at_88 = -1150\n"
-      "dB_at_89 = -1050\n"
-      "dB_at_90 = -950\n"
-      "dB_at_91 = -850\n"
-      "dB_at_92 = -750\n"
-      "dB_at_93 = -650\n"
-      "dB_at_94 = -550\n"
-      "dB_at_95 = -450\n"
-      "dB_at_96 = -350\n"
-      "dB_at_97 = -250\n"
-      "dB_at_98 = -150\n"
-      "dB_at_99 = -50\n"
-      "dB_at_100 = 50\n";
-  struct cras_card_config* config;
-  struct cras_volume_curve* curve;
-
-  CreateConfigFile(explicit_config_name, explicit_config_text);
-
-  config = cras_card_config_create(CONFIG_PATH, explicit_config_name);
-  EXPECT_NE(static_cast<struct cras_card_config*>(NULL), config);
-
-  // Test a explicit curve config.
-  curve = cras_card_config_get_volume_curve_for_control(config, "Card1");
-  EXPECT_EQ(0, cras_volume_curve_create_default_called);
-  EXPECT_EQ(0, cras_volume_curve_create_simple_step_called);
-  EXPECT_EQ(1, cras_volume_curve_create_explicit_called);
-  EXPECT_EQ(cras_volume_curve_create_explicit_return, curve);
-  for (unsigned int i = 0; i < 101; i++) {
-    EXPECT_EQ((static_cast<long>(i) - 100) * 100 + 50, cras_explicit_curve[i]);
-  }
-
-  cras_card_config_destroy(config);
-}
-
-// Stubs.
-extern "C" {
-
-struct cras_volume_curve* cras_volume_curve_create_default() {
-  cras_volume_curve_create_default_called++;
-  return cras_volume_curve_create_default_return;
-}
-
-struct cras_volume_curve* cras_volume_curve_create_simple_step(
-    long max_volume,
-    long volume_step) {
-  cras_volume_curve_create_simple_step_called++;
-  cras_volume_curve_create_simple_step_max_volume = max_volume;
-  cras_volume_curve_create_simple_step_volume_step = volume_step;
-  return cras_volume_curve_create_simple_step_return;
-}
-
-struct cras_volume_curve* cras_volume_curve_create_explicit(long dB_vals[101]) {
-  cras_volume_curve_create_explicit_called++;
-  memcpy(cras_explicit_curve, dB_vals, sizeof(cras_explicit_curve));
-  return cras_volume_curve_create_explicit_return;
-}
-}
-
-}  //  namespace
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tests/checksum_unittest.cc b/cras/src/tests/checksum_unittest.cc
deleted file mode 100644
index 4d54b2c..0000000
--- a/cras/src/tests/checksum_unittest.cc
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <gtest/gtest.h>
-
-#include "cras_checksum.h"
-#include "cras_util.h"
-
-namespace {
-
-struct TestCase {
-  const char* input;
-  uint32_t output;
-};
-
-static TestCase test_case[] = {
-    /* The answers can be obtained by a command like "echo -n a | cksum" */
-    {"", 4294967295U},
-    {"a", 1220704766U},
-    {"12345678901234567890", 970143720U},
-};
-
-TEST(ChecksumTest, All) {
-  for (size_t i = 0; i < ARRAY_SIZE(test_case); i++) {
-    const char* input = test_case[i].input;
-    uint32_t output = test_case[i].output;
-    EXPECT_EQ(output, crc32_checksum((unsigned char*)input, strlen(input)));
-  }
-}
-
-}  //  namespace
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tests/control_rclient_unittest.cc b/cras/src/tests/control_rclient_unittest.cc
deleted file mode 100644
index 63e3c8f..0000000
--- a/cras/src/tests/control_rclient_unittest.cc
+++ /dev/null
@@ -1,977 +0,0 @@
-// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <gtest/gtest.h>
-#include <stdio.h>
-#include <unistd.h>
-
-extern "C" {
-#include "audio_thread.h"
-#include "cras_bt_log.h"
-#include "cras_main_thread_log.h"
-#include "cras_messages.h"
-#include "cras_rclient.h"
-#include "cras_rstream.h"
-#include "cras_system_state.h"
-
-// Access to data structures and static functions.
-#include "cras_control_rclient.c"
-#include "cras_rclient_util.c"
-}
-
-//  Stub data.
-static int audio_thread_config_global_remix_called;
-static float audio_thread_config_global_remix_copy[CRAS_MAX_REMIX_CHANNELS *
-                                                   CRAS_MAX_REMIX_CHANNELS];
-static int cras_rstream_create_return;
-static struct cras_rstream* cras_rstream_create_stream_out;
-static int cras_iodev_attach_stream_retval;
-static size_t cras_system_set_volume_value;
-static int cras_system_set_volume_called;
-static size_t cras_system_set_mute_value;
-static int cras_system_set_mute_called;
-static size_t cras_system_set_user_mute_value;
-static int cras_system_set_user_mute_called;
-static size_t cras_system_set_mute_locked_value;
-static int cras_system_set_mute_locked_called;
-static size_t cras_system_set_capture_mute_value;
-static int cras_system_set_capture_mute_called;
-static size_t cras_system_set_capture_mute_locked_value;
-static int cras_system_set_capture_mute_locked_called;
-static int cras_system_state_dump_snapshots_called;
-static size_t cras_make_fd_nonblocking_called;
-static audio_thread* iodev_get_thread_return;
-static int stream_list_add_stream_return;
-static unsigned int stream_list_add_stream_called;
-static unsigned int stream_list_disconnect_stream_called;
-static unsigned int cras_iodev_list_rm_input_called;
-static unsigned int cras_iodev_list_rm_output_called;
-static struct cras_audio_shm mock_shm;
-static struct cras_rstream mock_rstream;
-static size_t cras_observer_num_ops_registered;
-static size_t cras_observer_register_notify_called;
-static size_t cras_observer_add_called;
-static void* cras_observer_add_context_value;
-static struct cras_observer_client* cras_observer_add_return_value;
-static size_t cras_observer_get_ops_called;
-static struct cras_observer_ops cras_observer_ops_value;
-static size_t cras_observer_set_ops_called;
-static size_t cras_observer_ops_are_empty_called;
-static struct cras_observer_ops cras_observer_ops_are_empty_empty_ops;
-static size_t cras_observer_remove_called;
-
-void ResetStubData() {
-  audio_thread_config_global_remix_called = 0;
-  memset(audio_thread_config_global_remix_copy, 0,
-         sizeof(audio_thread_config_global_remix_copy));
-  cras_rstream_create_return = 0;
-  cras_rstream_create_stream_out = (struct cras_rstream*)NULL;
-  cras_iodev_attach_stream_retval = 0;
-  cras_system_set_volume_value = 0;
-  cras_system_set_volume_called = 0;
-  cras_system_set_mute_value = 0;
-  cras_system_set_mute_called = 0;
-  cras_system_set_user_mute_value = 0;
-  cras_system_set_user_mute_called = 0;
-  cras_system_set_mute_locked_value = 0;
-  cras_system_set_mute_locked_called = 0;
-  cras_system_set_capture_mute_value = 0;
-  cras_system_set_capture_mute_called = 0;
-  cras_system_set_capture_mute_locked_value = 0;
-  cras_system_set_capture_mute_locked_called = 0;
-  cras_system_state_dump_snapshots_called = 0;
-  cras_make_fd_nonblocking_called = 0;
-  iodev_get_thread_return = reinterpret_cast<audio_thread*>(0xad);
-  stream_list_add_stream_return = 0;
-  stream_list_add_stream_called = 0;
-  stream_list_disconnect_stream_called = 0;
-  cras_iodev_list_rm_output_called = 0;
-  cras_iodev_list_rm_input_called = 0;
-  cras_observer_num_ops_registered = 0;
-  cras_observer_register_notify_called = 0;
-  cras_observer_add_called = 0;
-  cras_observer_add_return_value =
-      reinterpret_cast<struct cras_observer_client*>(1);
-  cras_observer_add_context_value = NULL;
-  cras_observer_get_ops_called = 0;
-  memset(&cras_observer_ops_value, 0, sizeof(cras_observer_ops_value));
-  cras_observer_set_ops_called = 0;
-  cras_observer_ops_are_empty_called = 0;
-  memset(&cras_observer_ops_are_empty_empty_ops, 0,
-         sizeof(cras_observer_ops_are_empty_empty_ops));
-  cras_observer_remove_called = 0;
-}
-
-namespace {
-
-TEST(RClientSuite, CreateSendMessage) {
-  struct cras_rclient* rclient;
-  int rc;
-  struct cras_client_connected msg;
-  int pipe_fds[2];
-
-  ResetStubData();
-
-  rc = pipe(pipe_fds);
-  ASSERT_EQ(0, rc);
-
-  rclient = cras_control_rclient_create(pipe_fds[1], 800);
-  ASSERT_NE((void*)NULL, rclient);
-
-  rc = read(pipe_fds[0], &msg, sizeof(msg));
-  EXPECT_EQ(sizeof(msg), rc);
-  EXPECT_EQ(CRAS_CLIENT_CONNECTED, msg.header.id);
-
-  rclient->ops->destroy(rclient);
-  close(pipe_fds[0]);
-  close(pipe_fds[1]);
-}
-
-class RClientMessagesSuite : public testing::Test {
- protected:
-  virtual void SetUp() {
-    int rc;
-    struct cras_client_connected msg;
-
-    rc = pipe(pipe_fds_);
-    if (rc < 0)
-      return;
-    rclient_ = cras_control_rclient_create(pipe_fds_[1], 1);
-    rc = read(pipe_fds_[0], &msg, sizeof(msg));
-    if (rc < 0)
-      return;
-
-    rstream_ = (struct cras_rstream*)calloc(1, sizeof(*rstream_));
-
-    stream_id_ = 0x10002;
-    connect_msg_.header.id = CRAS_SERVER_CONNECT_STREAM;
-    connect_msg_.header.length = sizeof(connect_msg_);
-    connect_msg_.proto_version = CRAS_PROTO_VER;
-    connect_msg_.stream_type = CRAS_STREAM_TYPE_DEFAULT;
-    connect_msg_.direction = CRAS_STREAM_OUTPUT;
-    connect_msg_.stream_id = stream_id_;
-    connect_msg_.buffer_frames = 480;
-    connect_msg_.cb_threshold = 240;
-    connect_msg_.flags = 0;
-    connect_msg_.format.num_channels = 2;
-    connect_msg_.format.frame_rate = 48000;
-    connect_msg_.format.format = SND_PCM_FORMAT_S16_LE;
-    connect_msg_.dev_idx = NO_DEVICE;
-    connect_msg_.client_shm_size = 0;
-    btlog = cras_bt_event_log_init();
-    main_log = main_thread_event_log_init();
-    ResetStubData();
-  }
-
-  virtual void TearDown() {
-    rclient_->ops->destroy(rclient_);
-    free(rstream_);
-    close(pipe_fds_[0]);
-    close(pipe_fds_[1]);
-    cras_bt_event_log_deinit(btlog);
-    main_thread_event_log_deinit(main_log);
-  }
-
-  void RegisterNotification(enum CRAS_CLIENT_MESSAGE_ID msg_id,
-                            void* callback,
-                            void** ops_address);
-
-  struct cras_connect_message connect_msg_;
-  struct cras_rclient* rclient_;
-  struct cras_rstream* rstream_;
-  size_t stream_id_;
-  int pipe_fds_[2];
-  int fd_;
-};
-
-TEST_F(RClientMessagesSuite, AudThreadAttachFail) {
-  struct cras_client_stream_connected out_msg;
-  int rc;
-
-  cras_rstream_create_stream_out = rstream_;
-  stream_list_add_stream_return = -EINVAL;
-
-  fd_ = 100;
-  rc = rclient_->ops->handle_message_from_client(rclient_, &connect_msg_.header,
-                                                 &fd_, 1);
-  EXPECT_EQ(0, rc);
-
-  rc = read(pipe_fds_[0], &out_msg, sizeof(out_msg));
-  EXPECT_EQ(sizeof(out_msg), rc);
-  EXPECT_EQ(stream_id_, out_msg.stream_id);
-  EXPECT_NE(0, out_msg.err);
-  EXPECT_EQ(0, cras_iodev_list_rm_output_called);
-  EXPECT_EQ(1, stream_list_add_stream_called);
-  EXPECT_EQ(0, stream_list_disconnect_stream_called);
-}
-
-TEST_F(RClientMessagesSuite, ConnectMsgWithBadFd) {
-  struct cras_client_stream_connected out_msg;
-  int rc;
-
-  rc = rclient_->ops->handle_message_from_client(rclient_, &connect_msg_.header,
-                                                 NULL, 0);
-  EXPECT_EQ(0, rc);
-
-  rc = read(pipe_fds_[0], &out_msg, sizeof(out_msg));
-  EXPECT_EQ(sizeof(out_msg), rc);
-  EXPECT_EQ(stream_id_, out_msg.stream_id);
-  EXPECT_NE(0, out_msg.err);
-  EXPECT_EQ(stream_list_add_stream_called,
-            stream_list_disconnect_stream_called);
-}
-
-TEST_F(RClientMessagesSuite, StreamConnectMessageValidDirection) {
-  struct cras_client_stream_connected out_msg;
-  int rc;
-  int called = 0;
-
-  for (int i = 0; i < CRAS_NUM_DIRECTIONS; i++) {
-    connect_msg_.direction = static_cast<CRAS_STREAM_DIRECTION>(i);
-    if (connect_msg_.direction == CRAS_STREAM_UNDEFINED)
-      continue;
-    called++;
-    cras_rstream_create_stream_out = rstream_;
-    cras_iodev_attach_stream_retval = 0;
-
-    fd_ = 100;
-    rc = rclient_->ops->handle_message_from_client(
-        rclient_, &connect_msg_.header, &fd_, 1);
-    EXPECT_EQ(0, rc);
-    EXPECT_EQ(called, cras_make_fd_nonblocking_called);
-
-    rc = read(pipe_fds_[0], &out_msg, sizeof(out_msg));
-    EXPECT_EQ(sizeof(out_msg), rc);
-    EXPECT_EQ(stream_id_, out_msg.stream_id);
-    EXPECT_EQ(0, out_msg.err);
-    EXPECT_EQ(called, stream_list_add_stream_called);
-    EXPECT_EQ(0, stream_list_disconnect_stream_called);
-  }
-}
-
-TEST_F(RClientMessagesSuite, StreamConnectMessageInvalidDirection) {
-  struct cras_client_stream_connected out_msg;
-  int rc;
-
-  connect_msg_.direction = CRAS_STREAM_UNDEFINED;
-  cras_rstream_create_stream_out = rstream_;
-  cras_iodev_attach_stream_retval = 0;
-
-  fd_ = 100;
-  rc = rclient_->ops->handle_message_from_client(rclient_, &connect_msg_.header,
-                                                 &fd_, 1);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(0, cras_make_fd_nonblocking_called);
-
-  rc = read(pipe_fds_[0], &out_msg, sizeof(out_msg));
-  EXPECT_EQ(sizeof(out_msg), rc);
-  EXPECT_EQ(stream_id_, out_msg.stream_id);
-  EXPECT_EQ(-EINVAL, out_msg.err);
-  EXPECT_EQ(0, stream_list_add_stream_called);
-  EXPECT_EQ(0, stream_list_disconnect_stream_called);
-}
-
-TEST_F(RClientMessagesSuite, StreamConnectMessageInvalidClientId) {
-  struct cras_client_stream_connected out_msg;
-  int rc;
-
-  connect_msg_.stream_id = 0x20002;  // stream_id with invalid client_id
-
-  fd_ = 100;
-  rc = rclient_->ops->handle_message_from_client(rclient_, &connect_msg_.header,
-                                                 &fd_, 1);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(0, cras_make_fd_nonblocking_called);
-  EXPECT_EQ(0, stream_list_add_stream_called);
-  EXPECT_EQ(0, stream_list_disconnect_stream_called);
-
-  rc = read(pipe_fds_[0], &out_msg, sizeof(out_msg));
-  EXPECT_EQ(sizeof(out_msg), rc);
-  EXPECT_EQ(-EINVAL, out_msg.err);
-  EXPECT_EQ(connect_msg_.stream_id, out_msg.stream_id);
-}
-
-TEST_F(RClientMessagesSuite, SuccessReply) {
-  struct cras_client_stream_connected out_msg;
-  int rc;
-
-  cras_rstream_create_stream_out = rstream_;
-  cras_iodev_attach_stream_retval = 0;
-
-  fd_ = 100;
-  rc = rclient_->ops->handle_message_from_client(rclient_, &connect_msg_.header,
-                                                 &fd_, 1);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(1, cras_make_fd_nonblocking_called);
-
-  rc = read(pipe_fds_[0], &out_msg, sizeof(out_msg));
-  EXPECT_EQ(sizeof(out_msg), rc);
-  EXPECT_EQ(stream_id_, out_msg.stream_id);
-  EXPECT_EQ(0, out_msg.err);
-  EXPECT_EQ(1, stream_list_add_stream_called);
-  EXPECT_EQ(0, stream_list_disconnect_stream_called);
-}
-
-TEST_F(RClientMessagesSuite, SuccessCreateThreadReply) {
-  struct cras_client_stream_connected out_msg;
-  int rc;
-
-  cras_rstream_create_stream_out = rstream_;
-  cras_iodev_attach_stream_retval = 0;
-
-  fd_ = 100;
-  rc = rclient_->ops->handle_message_from_client(rclient_, &connect_msg_.header,
-                                                 &fd_, 1);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(1, cras_make_fd_nonblocking_called);
-
-  rc = read(pipe_fds_[0], &out_msg, sizeof(out_msg));
-  EXPECT_EQ(sizeof(out_msg), rc);
-  EXPECT_EQ(stream_id_, out_msg.stream_id);
-  EXPECT_EQ(0, out_msg.err);
-  EXPECT_EQ(1, stream_list_add_stream_called);
-  EXPECT_EQ(0, stream_list_disconnect_stream_called);
-}
-
-TEST_F(RClientMessagesSuite, SetVolume) {
-  struct cras_set_system_volume msg;
-  int rc;
-
-  msg.header.id = CRAS_SERVER_SET_SYSTEM_VOLUME;
-  msg.header.length = sizeof(msg);
-  msg.volume = 66;
-
-  rc =
-      rclient_->ops->handle_message_from_client(rclient_, &msg.header, NULL, 0);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(1, cras_system_set_volume_called);
-  EXPECT_EQ(66, cras_system_set_volume_value);
-}
-
-TEST_F(RClientMessagesSuite, SetMute) {
-  struct cras_set_system_mute msg;
-  int rc;
-
-  msg.header.id = CRAS_SERVER_SET_SYSTEM_MUTE;
-  msg.header.length = sizeof(msg);
-  msg.mute = 1;
-
-  rc =
-      rclient_->ops->handle_message_from_client(rclient_, &msg.header, NULL, 0);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(1, cras_system_set_mute_called);
-  EXPECT_EQ(1, cras_system_set_mute_value);
-
-  msg.header.id = CRAS_SERVER_SET_SYSTEM_MUTE_LOCKED;
-  rc =
-      rclient_->ops->handle_message_from_client(rclient_, &msg.header, NULL, 0);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(1, cras_system_set_mute_locked_called);
-  EXPECT_EQ(1, cras_system_set_mute_locked_value);
-}
-
-TEST_F(RClientMessagesSuite, SetUserMute) {
-  struct cras_set_system_mute msg;
-  int rc;
-
-  msg.header.id = CRAS_SERVER_SET_USER_MUTE;
-  msg.header.length = sizeof(msg);
-  msg.mute = 1;
-
-  rc =
-      rclient_->ops->handle_message_from_client(rclient_, &msg.header, NULL, 0);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(1, cras_system_set_user_mute_called);
-  EXPECT_EQ(1, cras_system_set_user_mute_value);
-}
-
-TEST_F(RClientMessagesSuite, SetCaptureMute) {
-  struct cras_set_system_mute msg;
-  int rc;
-
-  msg.header.id = CRAS_SERVER_SET_SYSTEM_CAPTURE_MUTE;
-  msg.header.length = sizeof(msg);
-  msg.mute = 1;
-
-  rc =
-      rclient_->ops->handle_message_from_client(rclient_, &msg.header, NULL, 0);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(1, cras_system_set_capture_mute_called);
-  EXPECT_EQ(1, cras_system_set_capture_mute_value);
-
-  msg.header.id = CRAS_SERVER_SET_SYSTEM_CAPTURE_MUTE_LOCKED;
-  rc =
-      rclient_->ops->handle_message_from_client(rclient_, &msg.header, NULL, 0);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(1, cras_system_set_capture_mute_locked_called);
-  EXPECT_EQ(1, cras_system_set_capture_mute_locked_value);
-}
-
-TEST_F(RClientMessagesSuite, DumpSnapshots) {
-  struct cras_dump_snapshots msg;
-  int rc;
-  cras_fill_dump_snapshots(&msg);
-  rc =
-      rclient_->ops->handle_message_from_client(rclient_, &msg.header, NULL, 0);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(1, cras_system_state_dump_snapshots_called);
-}
-
-TEST_F(RClientMessagesSuite, ConfigGlobalRemix) {
-  int rc;
-  struct cras_config_global_remix msg;
-  const int num_channels = 2;
-  float coefficient[4] = {0.1, 0.2, 0.3, 0.4};
-  cras_fill_config_global_remix_command(&msg, num_channels, coefficient,
-                                        num_channels * num_channels);
-
-  rc =
-      rclient_->ops->handle_message_from_client(rclient_, &msg.header, NULL, 0);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(1, audio_thread_config_global_remix_called);
-  for (unsigned i = 0; i < (unsigned)num_channels * num_channels; i++) {
-    EXPECT_EQ(audio_thread_config_global_remix_copy[i], coefficient[i]);
-  }
-}
-
-void RClientMessagesSuite::RegisterNotification(
-    enum CRAS_CLIENT_MESSAGE_ID msg_id,
-    void* callback,
-    void** ops_address) {
-  struct cras_register_notification msg;
-  int do_register = callback != NULL ? 1 : 0;
-  int rc;
-
-  cras_observer_register_notify_called++;
-
-  cras_fill_register_notification_message(&msg, msg_id, do_register);
-  EXPECT_EQ(msg.header.length, sizeof(msg));
-  EXPECT_EQ(msg.header.id, CRAS_SERVER_REGISTER_NOTIFICATION);
-  EXPECT_EQ(msg.do_register, do_register);
-  EXPECT_EQ(msg.msg_id, msg_id);
-
-  rc =
-      rclient_->ops->handle_message_from_client(rclient_, &msg.header, NULL, 0);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(cras_observer_register_notify_called, cras_observer_get_ops_called);
-  EXPECT_EQ(cras_observer_register_notify_called,
-            cras_observer_ops_are_empty_called);
-  if (msg.do_register)
-    cras_observer_num_ops_registered++;
-  if (cras_observer_num_ops_registered == 1) {
-    if (msg.do_register) {
-      EXPECT_EQ(1, cras_observer_add_called);
-      EXPECT_EQ(rclient_, cras_observer_add_context_value);
-      EXPECT_EQ(rclient_->observer, cras_observer_add_return_value);
-    } else {
-      EXPECT_EQ(1, cras_observer_remove_called);
-      EXPECT_EQ(rclient_->observer, (struct cras_observer_client*)NULL);
-    }
-  } else {
-    EXPECT_EQ(cras_observer_register_notify_called - 1,
-              cras_observer_set_ops_called);
-  }
-  if (!msg.do_register)
-    cras_observer_num_ops_registered--;
-  if (cras_observer_num_ops_registered) {
-    EXPECT_EQ(callback, *ops_address);
-  }
-}
-
-TEST_F(RClientMessagesSuite, RegisterStatusNotification) {
-  /* First registration for this client. */
-  RegisterNotification(CRAS_CLIENT_OUTPUT_VOLUME_CHANGED,
-                       (void*)send_output_volume_changed,
-                       (void**)&cras_observer_ops_value.output_volume_changed);
-
-  /* Second registration for this client. */
-  RegisterNotification(CRAS_CLIENT_CAPTURE_GAIN_CHANGED,
-                       (void*)send_capture_gain_changed,
-                       (void**)&cras_observer_ops_value.capture_gain_changed);
-
-  /* Deregister output_volume. */
-  RegisterNotification(CRAS_CLIENT_OUTPUT_VOLUME_CHANGED, NULL,
-                       (void**)&cras_observer_ops_value.output_volume_changed);
-
-  /* Register/deregister all msg_ids. */
-
-  RegisterNotification(CRAS_CLIENT_OUTPUT_MUTE_CHANGED,
-                       (void*)send_output_mute_changed,
-                       (void**)&cras_observer_ops_value.output_mute_changed);
-  RegisterNotification(CRAS_CLIENT_OUTPUT_MUTE_CHANGED, NULL,
-                       (void**)&cras_observer_ops_value.output_mute_changed);
-
-  RegisterNotification(CRAS_CLIENT_CAPTURE_MUTE_CHANGED,
-                       (void*)send_capture_mute_changed,
-                       (void**)&cras_observer_ops_value.capture_mute_changed);
-  RegisterNotification(CRAS_CLIENT_CAPTURE_MUTE_CHANGED, NULL,
-                       (void**)&cras_observer_ops_value.capture_mute_changed);
-
-  RegisterNotification(CRAS_CLIENT_NODES_CHANGED, (void*)send_nodes_changed,
-                       (void**)&cras_observer_ops_value.nodes_changed);
-  RegisterNotification(CRAS_CLIENT_NODES_CHANGED, NULL,
-                       (void**)&cras_observer_ops_value.nodes_changed);
-
-  RegisterNotification(CRAS_CLIENT_ACTIVE_NODE_CHANGED,
-                       (void*)send_active_node_changed,
-                       (void**)&cras_observer_ops_value.active_node_changed);
-  RegisterNotification(CRAS_CLIENT_ACTIVE_NODE_CHANGED, NULL,
-                       (void**)&cras_observer_ops_value.active_node_changed);
-
-  RegisterNotification(
-      CRAS_CLIENT_OUTPUT_NODE_VOLUME_CHANGED,
-      (void*)send_output_node_volume_changed,
-      (void**)&cras_observer_ops_value.output_node_volume_changed);
-  RegisterNotification(
-      CRAS_CLIENT_OUTPUT_NODE_VOLUME_CHANGED, NULL,
-      (void**)&cras_observer_ops_value.output_node_volume_changed);
-
-  RegisterNotification(
-      CRAS_CLIENT_NODE_LEFT_RIGHT_SWAPPED_CHANGED,
-      (void*)send_node_left_right_swapped_changed,
-      (void**)&cras_observer_ops_value.node_left_right_swapped_changed);
-  RegisterNotification(
-      CRAS_CLIENT_NODE_LEFT_RIGHT_SWAPPED_CHANGED, NULL,
-      (void**)&cras_observer_ops_value.node_left_right_swapped_changed);
-
-  RegisterNotification(
-      CRAS_CLIENT_INPUT_NODE_GAIN_CHANGED, (void*)send_input_node_gain_changed,
-      (void**)&cras_observer_ops_value.input_node_gain_changed);
-  RegisterNotification(
-      CRAS_CLIENT_INPUT_NODE_GAIN_CHANGED, NULL,
-      (void**)&cras_observer_ops_value.input_node_gain_changed);
-
-  RegisterNotification(
-      CRAS_CLIENT_NUM_ACTIVE_STREAMS_CHANGED,
-      (void*)send_num_active_streams_changed,
-      (void**)&cras_observer_ops_value.num_active_streams_changed);
-  RegisterNotification(
-      CRAS_CLIENT_NUM_ACTIVE_STREAMS_CHANGED, NULL,
-      (void**)&cras_observer_ops_value.num_active_streams_changed);
-
-  /* Deregister last. */
-  RegisterNotification(CRAS_CLIENT_CAPTURE_GAIN_CHANGED, NULL,
-                       (void**)&cras_observer_ops_value.capture_gain_changed);
-}
-
-TEST_F(RClientMessagesSuite, SendOutputVolumeChanged) {
-  void* void_client = reinterpret_cast<void*>(rclient_);
-  char buf[1024];
-  ssize_t rc;
-  struct cras_client_volume_changed* msg =
-      (struct cras_client_volume_changed*)buf;
-  const int32_t volume = 90;
-
-  send_output_volume_changed(void_client, volume);
-  rc = read(pipe_fds_[0], buf, sizeof(buf));
-  ASSERT_EQ(rc, (ssize_t)sizeof(*msg));
-  EXPECT_EQ(msg->header.id, CRAS_CLIENT_OUTPUT_VOLUME_CHANGED);
-  EXPECT_EQ(msg->volume, volume);
-}
-
-TEST_F(RClientMessagesSuite, SendOutputMuteChanged) {
-  void* void_client = reinterpret_cast<void*>(rclient_);
-  char buf[1024];
-  ssize_t rc;
-  struct cras_client_mute_changed* msg = (struct cras_client_mute_changed*)buf;
-  const int muted = 1;
-  const int user_muted = 0;
-  const int mute_locked = 1;
-
-  send_output_mute_changed(void_client, muted, user_muted, mute_locked);
-  rc = read(pipe_fds_[0], buf, sizeof(buf));
-  ASSERT_EQ(rc, (ssize_t)sizeof(*msg));
-  EXPECT_EQ(msg->header.id, CRAS_CLIENT_OUTPUT_MUTE_CHANGED);
-  EXPECT_EQ(msg->muted, muted);
-  EXPECT_EQ(msg->user_muted, user_muted);
-  EXPECT_EQ(msg->mute_locked, mute_locked);
-}
-
-TEST_F(RClientMessagesSuite, SendCaptureMuteChanged) {
-  void* void_client = reinterpret_cast<void*>(rclient_);
-  char buf[1024];
-  ssize_t rc;
-  struct cras_client_mute_changed* msg = (struct cras_client_mute_changed*)buf;
-  const int muted = 1;
-  const int mute_locked = 0;
-
-  send_capture_mute_changed(void_client, muted, mute_locked);
-  rc = read(pipe_fds_[0], buf, sizeof(buf));
-  ASSERT_EQ(rc, (ssize_t)sizeof(*msg));
-  EXPECT_EQ(msg->header.id, CRAS_CLIENT_CAPTURE_MUTE_CHANGED);
-  EXPECT_EQ(msg->muted, muted);
-  EXPECT_EQ(msg->mute_locked, mute_locked);
-}
-
-TEST_F(RClientMessagesSuite, SendNodesChanged) {
-  void* void_client = reinterpret_cast<void*>(rclient_);
-  char buf[1024];
-  ssize_t rc;
-  struct cras_client_nodes_changed* msg =
-      (struct cras_client_nodes_changed*)buf;
-
-  send_nodes_changed(void_client);
-  rc = read(pipe_fds_[0], buf, sizeof(buf));
-  ASSERT_EQ(rc, (ssize_t)sizeof(*msg));
-  EXPECT_EQ(msg->header.id, CRAS_CLIENT_NODES_CHANGED);
-}
-
-TEST_F(RClientMessagesSuite, SendActiveNodeChanged) {
-  void* void_client = reinterpret_cast<void*>(rclient_);
-  char buf[1024];
-  ssize_t rc;
-  struct cras_client_active_node_changed* msg =
-      (struct cras_client_active_node_changed*)buf;
-  const enum CRAS_STREAM_DIRECTION dir = CRAS_STREAM_INPUT;
-  const cras_node_id_t node_id = 0x0001000200030004;
-
-  send_active_node_changed(void_client, dir, node_id);
-  rc = read(pipe_fds_[0], buf, sizeof(buf));
-  ASSERT_EQ(rc, (ssize_t)sizeof(*msg));
-  EXPECT_EQ(msg->header.id, CRAS_CLIENT_ACTIVE_NODE_CHANGED);
-  EXPECT_EQ(msg->direction, (int32_t)dir);
-  EXPECT_EQ((uint64_t)msg->node_id, node_id);
-}
-
-TEST_F(RClientMessagesSuite, SendOutputNodeVolumeChanged) {
-  void* void_client = reinterpret_cast<void*>(rclient_);
-  char buf[1024];
-  ssize_t rc;
-  struct cras_client_node_value_changed* msg =
-      (struct cras_client_node_value_changed*)buf;
-  const cras_node_id_t node_id = 0x0001000200030004;
-  const int32_t value = 90;
-
-  send_output_node_volume_changed(void_client, node_id, value);
-  rc = read(pipe_fds_[0], buf, sizeof(buf));
-  ASSERT_EQ(rc, (ssize_t)sizeof(*msg));
-  EXPECT_EQ(msg->header.id, CRAS_CLIENT_OUTPUT_NODE_VOLUME_CHANGED);
-  EXPECT_EQ(msg->node_id, node_id);
-  EXPECT_EQ(msg->value, value);
-}
-
-TEST_F(RClientMessagesSuite, SendNodeLeftRightSwappedChanged) {
-  void* void_client = reinterpret_cast<void*>(rclient_);
-  char buf[1024];
-  ssize_t rc;
-  struct cras_client_node_value_changed* msg =
-      (struct cras_client_node_value_changed*)buf;
-  const cras_node_id_t node_id = 0x0001000200030004;
-  const int32_t value = 0;
-
-  send_node_left_right_swapped_changed(void_client, node_id, value);
-  rc = read(pipe_fds_[0], buf, sizeof(buf));
-  ASSERT_EQ(rc, (ssize_t)sizeof(*msg));
-  EXPECT_EQ(msg->header.id, CRAS_CLIENT_NODE_LEFT_RIGHT_SWAPPED_CHANGED);
-  EXPECT_EQ(msg->node_id, node_id);
-  EXPECT_EQ(msg->value, value);
-}
-
-TEST_F(RClientMessagesSuite, SendNodeInputNodeGainChanged) {
-  void* void_client = reinterpret_cast<void*>(rclient_);
-  char buf[1024];
-  ssize_t rc;
-  struct cras_client_node_value_changed* msg =
-      (struct cras_client_node_value_changed*)buf;
-  const cras_node_id_t node_id = 0x0001000200030004;
-  const int32_t value = -19;
-
-  send_input_node_gain_changed(void_client, node_id, value);
-  rc = read(pipe_fds_[0], buf, sizeof(buf));
-  ASSERT_EQ(rc, (ssize_t)sizeof(*msg));
-  EXPECT_EQ(msg->header.id, CRAS_CLIENT_INPUT_NODE_GAIN_CHANGED);
-  EXPECT_EQ(msg->node_id, node_id);
-  EXPECT_EQ(msg->value, value);
-}
-
-TEST_F(RClientMessagesSuite, SendNumActiveStreamsChanged) {
-  void* void_client = reinterpret_cast<void*>(rclient_);
-  char buf[1024];
-  ssize_t rc;
-  struct cras_client_num_active_streams_changed* msg =
-      (struct cras_client_num_active_streams_changed*)buf;
-  const enum CRAS_STREAM_DIRECTION dir = CRAS_STREAM_INPUT;
-  const uint32_t num_active_streams = 3;
-
-  send_num_active_streams_changed(void_client, dir, num_active_streams);
-  rc = read(pipe_fds_[0], buf, sizeof(buf));
-  ASSERT_EQ(rc, (ssize_t)sizeof(*msg));
-  EXPECT_EQ(msg->header.id, CRAS_CLIENT_NUM_ACTIVE_STREAMS_CHANGED);
-  EXPECT_EQ(msg->direction, (int32_t)dir);
-  EXPECT_EQ(msg->num_active_streams, num_active_streams);
-}
-
-}  //  namespace
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
-
-/* stubs */
-extern "C" {
-
-struct cras_bt_event_log* btlog;
-struct main_thread_event_log* main_log;
-
-struct audio_thread* cras_iodev_list_get_audio_thread() {
-  return iodev_get_thread_return;
-}
-
-void cras_iodev_list_add_active_node(enum CRAS_STREAM_DIRECTION dir,
-                                     cras_node_id_t node_id) {}
-
-void cras_iodev_list_rm_active_node(enum CRAS_STREAM_DIRECTION dir,
-                                    cras_node_id_t node_id) {}
-
-int audio_thread_rm_stream(audio_thread* thread, cras_rstream* stream) {
-  return 0;
-}
-
-void audio_thread_add_output_dev(struct audio_thread* thread,
-                                 struct cras_iodev* odev) {}
-
-int audio_thread_dump_thread_info(struct audio_thread* thread,
-                                  struct audio_debug_info* info) {
-  return 0;
-}
-
-int audio_thread_suspend(struct audio_thread* thread) {
-  return 0;
-}
-
-int audio_thread_resume(struct audio_thread* thread) {
-  return 0;
-}
-
-int audio_thread_config_global_remix(struct audio_thread* thread,
-                                     unsigned int num_channels,
-                                     const float* coefficient) {
-  audio_thread_config_global_remix_called++;
-  memcpy(audio_thread_config_global_remix_copy, coefficient,
-         num_channels * num_channels * sizeof(coefficient));
-  return 0;
-}
-
-int audio_thread_set_aec_dump(struct audio_thread* thread,
-                              cras_stream_id_t stream_id,
-                              unsigned int start,
-                              int fd) {
-  return 0;
-}
-
-int audio_thread_event_log_shm_fd() {
-  return -1;
-}
-
-#ifdef HAVE_WEBRTC_APM
-void cras_apm_list_reload_aec_config() {}
-#endif
-
-void cras_system_set_bt_wbs_enabled(bool enabled) {}
-
-const char* cras_config_get_socket_file_dir() {
-  return CRAS_UT_TMPDIR;
-}
-
-int cras_rstream_create(struct cras_rstream_config* stream_config,
-                        struct cras_rstream** stream_out) {
-  *stream_out = cras_rstream_create_stream_out;
-  return cras_rstream_create_return;
-}
-
-unsigned int cras_rstream_get_effects(const struct cras_rstream* stream) {
-  return 0;
-}
-
-int cras_iodev_move_stream_type(uint32_t type, uint32_t index) {
-  return 0;
-}
-
-int cras_iodev_list_rm_output(struct cras_iodev* output) {
-  cras_iodev_list_rm_output_called++;
-  return 0;
-}
-
-int cras_iodev_list_rm_input(struct cras_iodev* input) {
-  cras_iodev_list_rm_input_called++;
-  return 0;
-}
-
-int cras_server_disconnect_from_client_socket(int socket_fd) {
-  return 0;
-}
-
-int cras_make_fd_nonblocking(int fd) {
-  cras_make_fd_nonblocking_called++;
-  return 0;
-}
-
-void cras_system_state_dump_snapshots() {
-  cras_system_state_dump_snapshots_called++;
-}
-
-void cras_system_set_volume(size_t volume) {
-  cras_system_set_volume_value = volume;
-  cras_system_set_volume_called++;
-}
-
-//  From system_state.
-void cras_system_set_mute(int mute) {
-  cras_system_set_mute_value = mute;
-  cras_system_set_mute_called++;
-}
-void cras_system_set_user_mute(int mute) {
-  cras_system_set_user_mute_value = mute;
-  cras_system_set_user_mute_called++;
-}
-void cras_system_set_mute_locked(int mute) {
-  cras_system_set_mute_locked_value = mute;
-  cras_system_set_mute_locked_called++;
-}
-void cras_system_set_capture_mute(int mute) {
-  cras_system_set_capture_mute_value = mute;
-  cras_system_set_capture_mute_called++;
-}
-void cras_system_set_capture_mute_locked(int mute) {
-  cras_system_set_capture_mute_locked_value = mute;
-  cras_system_set_capture_mute_locked_called++;
-}
-
-int cras_system_remove_alsa_card(size_t alsa_card_index) {
-  return -1;
-}
-
-void cras_system_set_suspended(int suspended) {}
-
-struct cras_server_state* cras_system_state_get_no_lock() {
-  return NULL;
-}
-
-key_t cras_sys_state_shm_fd() {
-  return 1;
-}
-
-void cras_dsp_reload_ini() {}
-
-void cras_dsp_dump_info() {}
-
-int cras_iodev_list_set_node_attr(cras_node_id_t id,
-                                  enum ionode_attr attr,
-                                  int value) {
-  return 0;
-}
-
-void cras_iodev_list_select_node(enum CRAS_STREAM_DIRECTION direction,
-                                 cras_node_id_t node_id) {}
-
-void cras_iodev_list_add_test_dev(enum TEST_IODEV_TYPE type) {}
-
-struct stream_list* cras_iodev_list_get_stream_list() {
-  return NULL;
-}
-
-/* Handles sending a command to a test iodev. */
-void cras_iodev_list_test_dev_command(unsigned int iodev_idx,
-                                      enum CRAS_TEST_IODEV_CMD command,
-                                      unsigned int data_len,
-                                      const uint8_t* data) {}
-
-void cras_iodev_list_configure_global_remix_converter(
-    unsigned int num_channels,
-    const float* coefficient) {}
-
-int stream_list_add(struct stream_list* list,
-                    struct cras_rstream_config* config,
-                    struct cras_rstream** stream) {
-  int ret;
-
-  *stream = &mock_rstream;
-
-  stream_list_add_stream_called++;
-  ret = stream_list_add_stream_return;
-  if (ret)
-    stream_list_add_stream_return = -EINVAL;
-
-  mock_rstream.shm = &mock_shm;
-  mock_rstream.direction = config->direction;
-  mock_rstream.stream_id = config->stream_id;
-
-  return ret;
-}
-
-int stream_list_rm(struct stream_list* list, cras_stream_id_t id) {
-  stream_list_disconnect_stream_called++;
-  return 0;
-}
-
-int stream_list_rm_all_client_streams(struct stream_list* list,
-                                      struct cras_rclient* rclient) {
-  return 0;
-}
-
-int cras_send_with_fds(int sockfd,
-                       const void* buf,
-                       size_t len,
-                       int* fd,
-                       unsigned int num_fds) {
-  return write(sockfd, buf, len);
-}
-
-char* cras_iodev_list_get_hotword_models(cras_node_id_t node_id) {
-  return NULL;
-}
-
-int cras_iodev_list_set_hotword_model(cras_node_id_t id,
-                                      const char* model_name) {
-  return 0;
-}
-
-struct cras_observer_client* cras_observer_add(
-    const struct cras_observer_ops* ops,
-    void* context) {
-  cras_observer_add_called++;
-  cras_observer_add_context_value = context;
-  memcpy(&cras_observer_ops_value, ops, sizeof(cras_observer_ops_value));
-  return cras_observer_add_return_value;
-}
-
-void cras_observer_get_ops(const struct cras_observer_client* client,
-                           struct cras_observer_ops* ops) {
-  cras_observer_get_ops_called++;
-  memcpy(ops, &cras_observer_ops_value, sizeof(*ops));
-}
-
-void cras_observer_set_ops(struct cras_observer_client* client,
-                           const struct cras_observer_ops* ops) {
-  cras_observer_set_ops_called++;
-  memcpy(&cras_observer_ops_value, ops, sizeof(cras_observer_ops_value));
-}
-
-int cras_observer_ops_are_empty(const struct cras_observer_ops* ops) {
-  cras_observer_ops_are_empty_called++;
-  return memcmp(&cras_observer_ops_are_empty_empty_ops, ops,
-                sizeof(cras_observer_ops_are_empty_empty_ops)) == 0;
-}
-
-void cras_observer_remove(struct cras_observer_client* client) {
-  cras_observer_remove_called++;
-}
-
-bool cras_audio_format_valid(const struct cras_audio_format* fmt) {
-  return true;
-}
-
-struct packet_status_logger* cras_hfp_ag_get_wbs_logger() {
-  return NULL;
-}
-
-void detect_rtc_stream_pair(struct stream_list* list,
-                            struct cras_rstream* stream) {
-  return;
-}
-
-void cras_system_set_hotword_pause_at_suspend(bool pause) {}
-
-}  // extern "C"
diff --git a/cras/src/tests/cras_abi_unittest.cc b/cras/src/tests/cras_abi_unittest.cc
deleted file mode 100644
index d566a9b..0000000
--- a/cras/src/tests/cras_abi_unittest.cc
+++ /dev/null
@@ -1,139 +0,0 @@
-/* Copyright 2021 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <gtest/gtest.h>
-
-extern "C" {
-#include "cras_client.c"
-#include "cras_client.h"
-
-inline int libcras_unsupported_func(struct libcras_client* client) {
-  CHECK_VERSION(client, INT_MAX);
-  return 0;
-}
-
-cras_stream_id_t cb_stream_id;
-uint8_t* cb_buf;
-unsigned int cb_frames;
-struct timespec cb_latency;
-void* cb_usr_arg;
-int get_stream_cb_called;
-struct timespec now;
-
-int get_stream_cb(struct libcras_stream_cb_data* data) {
-  get_stream_cb_called++;
-  EXPECT_NE((void*)NULL, data);
-  EXPECT_EQ(0, libcras_stream_cb_data_get_stream_id(data, &cb_stream_id));
-  EXPECT_EQ(0, libcras_stream_cb_data_get_buf(data, &cb_buf));
-  EXPECT_EQ(0, libcras_stream_cb_data_get_frames(data, &cb_frames));
-  EXPECT_EQ(0, libcras_stream_cb_data_get_latency(data, &cb_latency));
-  EXPECT_EQ(0, libcras_stream_cb_data_get_usr_arg(data, &cb_usr_arg));
-  return 0;
-}
-}
-
-namespace {
-class CrasAbiTestSuite : public testing::Test {
- protected:
-  struct cras_audio_shm* InitShm(int frames) {
-    struct cras_audio_shm* shm =
-        static_cast<struct cras_audio_shm*>(calloc(1, sizeof(*shm)));
-    shm->header =
-        static_cast<cras_audio_shm_header*>(calloc(1, sizeof(*shm->header)));
-    cras_shm_set_frame_bytes(shm, 4);
-    uint32_t used_size = frames * 4;
-    cras_shm_set_used_size(shm, used_size);
-    shm->samples_info.length = used_size * 2;
-    memcpy(&shm->header->config, &shm->config, sizeof(shm->config));
-    return shm;
-  }
-
-  void DestroyShm(struct cras_audio_shm* shm) {
-    if (shm)
-      free(shm->header);
-    free(shm);
-  }
-
-  virtual void SetUp() { get_stream_cb_called = 0; }
-};
-
-TEST_F(CrasAbiTestSuite, CheckUnsupportedFunction) {
-  auto* client = libcras_client_create();
-  EXPECT_NE((void*)NULL, client);
-  EXPECT_EQ(-ENOSYS, libcras_unsupported_func(client));
-  libcras_client_destroy(client);
-}
-
-TEST_F(CrasAbiTestSuite, BasicStream) {
-  auto* client = libcras_client_create();
-  EXPECT_NE((void*)NULL, client);
-  auto* stream = libcras_stream_params_create();
-  EXPECT_NE((void*)NULL, stream);
-  /* Returns timeout because there is no real CRAS server in unittest. */
-  EXPECT_EQ(-ETIMEDOUT, libcras_client_connect_timeout(client, 0));
-  EXPECT_EQ(0, libcras_client_run_thread(client));
-  EXPECT_EQ(0, libcras_stream_params_set(stream, CRAS_STREAM_INPUT, 480, 480,
-                                         CRAS_STREAM_TYPE_DEFAULT,
-                                         CRAS_CLIENT_TYPE_TEST, 0, NULL, NULL,
-                                         NULL, 48000, SND_PCM_FORMAT_S16, 2));
-  cras_stream_id_t id;
-  /* Fails to add a stream because the stream callback is not set. */
-  EXPECT_EQ(-EINVAL, libcras_client_add_pinned_stream(client, 0, &id, stream));
-  /* Fails to set a stream volume because the stream is not added. */
-  EXPECT_EQ(-EINVAL, libcras_client_set_stream_volume(client, id, 1.0));
-  EXPECT_EQ(0, libcras_client_rm_stream(client, id));
-  EXPECT_EQ(0, libcras_client_stop(client));
-  libcras_stream_params_destroy(stream);
-  libcras_client_destroy(client);
-}
-
-TEST_F(CrasAbiTestSuite, StreamCallback) {
-  struct client_stream stream;
-  struct cras_stream_params params;
-  stream.id = 0x123;
-  stream.direction = CRAS_STREAM_INPUT;
-  stream.flags = 0;
-  stream.config = &params;
-  params.stream_cb = get_stream_cb;
-  params.cb_threshold = 480;
-  params.user_data = (void*)0x321;
-  stream.shm = InitShm(960);
-  stream.shm->header->write_offset[0] = 960 * 4;
-  stream.shm->header->write_buf_idx = 0;
-  stream.shm->header->read_offset[0] = 0;
-  stream.shm->header->read_buf_idx = 0;
-  now.tv_sec = 100;
-  now.tv_nsec = 0;
-  stream.shm->header->ts.tv_sec = 90;
-  stream.shm->header->ts.tv_nsec = 0;
-
-  handle_capture_data_ready(&stream, 480);
-
-  EXPECT_EQ(1, get_stream_cb_called);
-  EXPECT_EQ(stream.id, cb_stream_id);
-  EXPECT_EQ(cras_shm_get_write_buffer_base(stream.shm), cb_buf);
-  EXPECT_EQ(480, cb_frames);
-  EXPECT_EQ(10, cb_latency.tv_sec);
-  EXPECT_EQ(0, cb_latency.tv_nsec);
-  EXPECT_EQ((void*)0x321, cb_usr_arg);
-
-  DestroyShm(stream.shm);
-}
-
-}  // namespace
-
-extern "C" {
-
-int clock_gettime(clockid_t clk_id, struct timespec* tp) {
-  *tp = now;
-  return 0;
-}
-}
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  openlog(NULL, LOG_PERROR, LOG_USER);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tests/cras_client_unittest.cc b/cras/src/tests/cras_client_unittest.cc
deleted file mode 100644
index c1103af..0000000
--- a/cras/src/tests/cras_client_unittest.cc
+++ /dev/null
@@ -1,432 +0,0 @@
-// Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <gtest/gtest.h>
-#include <stdio.h>
-
-extern "C" {
-#include "cras_messages.h"
-
-//  Include C file to test static functions.
-#include "cras_client.c"
-}
-
-static const cras_stream_id_t FIRST_STREAM_ID = 1;
-
-static int pthread_create_called;
-static int pthread_join_called;
-static int pthread_cond_timedwait_called;
-static int pthread_cond_timedwait_retval;
-static int close_called;
-static int sendmsg_called;
-static void* mmap_return_value;
-static int samples_ready_called;
-static int samples_ready_frames_value;
-static uint8_t* samples_ready_samples_value;
-
-static int pthread_create_returned_value;
-
-namespace {
-
-void InitStaticVariables() {
-  pthread_create_called = 0;
-  pthread_join_called = 0;
-  pthread_cond_timedwait_called = 0;
-  pthread_cond_timedwait_retval = 0;
-  close_called = 0;
-  sendmsg_called = 0;
-  pthread_create_returned_value = 0;
-  mmap_return_value = NULL;
-  samples_ready_called = 0;
-  samples_ready_frames_value = 0;
-}
-
-class CrasClientTestSuite : public testing::Test {
- protected:
-  struct cras_audio_shm* InitShm() {
-    struct cras_audio_shm* shm =
-        static_cast<struct cras_audio_shm*>(calloc(1, sizeof(*shm)));
-    shm->header =
-        static_cast<cras_audio_shm_header*>(calloc(1, sizeof(*shm->header)));
-    cras_shm_set_frame_bytes(shm, 4);
-    uint32_t used_size = shm_writable_frames_ * 4;
-    cras_shm_set_used_size(shm, used_size);
-    shm->samples_info.length = used_size * 2;
-    memcpy(&shm->header->config, &shm->config, sizeof(shm->config));
-    return shm;
-  }
-
-  virtual void SetUp() {
-    shm_writable_frames_ = 100;
-    InitStaticVariables();
-
-    memset(&client_, 0, sizeof(client_));
-    client_.server_fd_state = CRAS_SOCKET_STATE_CONNECTED;
-    memset(&stream_, 0, sizeof(stream_));
-    stream_.id = FIRST_STREAM_ID;
-
-    struct cras_stream_params* config =
-        static_cast<cras_stream_params*>(calloc(1, sizeof(*config)));
-    config->buffer_frames = 1024;
-    config->cb_threshold = 512;
-    stream_.config = config;
-  }
-
-  virtual void TearDown() {
-    if (stream_.config) {
-      free(stream_.config);
-      stream_.config = NULL;
-    }
-
-    if (stream_.shm) {
-      free(stream_.shm->header);
-    }
-    free(stream_.shm);
-    stream_.shm = NULL;
-  }
-
-  void StreamConnected(CRAS_STREAM_DIRECTION direction);
-
-  void StreamConnectedFail(CRAS_STREAM_DIRECTION direction);
-
-  struct client_stream stream_;
-  struct cras_client client_;
-  int shm_writable_frames_;
-};
-
-void set_audio_format(struct cras_audio_format* format,
-                      snd_pcm_format_t pcm_format,
-                      size_t frame_rate,
-                      size_t num_channels) {
-  format->format = pcm_format;
-  format->frame_rate = frame_rate;
-  format->num_channels = num_channels;
-  for (size_t i = 0; i < CRAS_CH_MAX; ++i)
-    format->channel_layout[i] = i < num_channels ? i : -1;
-}
-
-int capture_samples_ready(cras_client* client,
-                          cras_stream_id_t stream_id,
-                          uint8_t* samples,
-                          size_t frames,
-                          const timespec* sample_ts,
-                          void* arg) {
-  samples_ready_called++;
-  samples_ready_samples_value = samples;
-  samples_ready_frames_value = frames;
-  return frames;
-}
-
-TEST_F(CrasClientTestSuite, HandleCaptureDataReady) {
-  struct cras_audio_shm* shm;
-
-  stream_.direction = CRAS_STREAM_INPUT;
-
-  shm_writable_frames_ = 480;
-  shm = InitShm();
-  stream_.shm = shm;
-  stream_.config->buffer_frames = 480;
-  stream_.config->cb_threshold = 480;
-  stream_.config->aud_cb = capture_samples_ready;
-  stream_.config->unified_cb = 0;
-
-  shm->header->write_buf_idx = 0;
-  shm->header->read_buf_idx = 0;
-  shm->header->write_offset[0] = 480 * 4;
-  shm->header->read_offset[0] = 0;
-
-  /* Normal scenario: read buffer has full of data written,
-   * handle_capture_data_ready() should consume all 480 frames and move
-   * read_buf_idx to the next buffer. */
-  handle_capture_data_ready(&stream_, 480);
-  EXPECT_EQ(1, samples_ready_called);
-  EXPECT_EQ(480, samples_ready_frames_value);
-  EXPECT_EQ(cras_shm_buff_for_idx(shm, 0), samples_ready_samples_value);
-  EXPECT_EQ(1, shm->header->read_buf_idx);
-  EXPECT_EQ(0, shm->header->write_offset[0]);
-  EXPECT_EQ(0, shm->header->read_offset[0]);
-
-  /* At the beginning of overrun: handle_capture_data_ready() should not
-   * proceed to call audio_cb because there's no data captured. */
-  shm->header->read_buf_idx = 0;
-  shm->header->write_offset[0] = 0;
-  shm->header->read_offset[0] = 0;
-  handle_capture_data_ready(&stream_, 480);
-  EXPECT_EQ(1, samples_ready_called);
-  EXPECT_EQ(0, shm->header->read_buf_idx);
-
-  /* In the middle of overrun: partially written buffer should trigger
-   * audio_cb, feed the full-sized read buffer to client. */
-  shm->header->read_buf_idx = 0;
-  shm->header->write_offset[0] = 123;
-  shm->header->read_offset[0] = 0;
-  handle_capture_data_ready(&stream_, 480);
-  EXPECT_EQ(1, samples_ready_called);
-  EXPECT_EQ(0, shm->header->read_buf_idx);
-}
-
-void CrasClientTestSuite::StreamConnected(CRAS_STREAM_DIRECTION direction) {
-  struct cras_client_stream_connected msg;
-  int shm_fds[2] = {0, 1};
-  int shm_max_size = 600;
-  size_t format_bytes;
-  size_t effects = 123;
-  struct cras_audio_shm_header* header;
-
-  stream_.direction = direction;
-  set_audio_format(&stream_.config->format, SND_PCM_FORMAT_S16_LE, 48000, 4);
-
-  struct cras_audio_format server_format;
-  set_audio_format(&server_format, SND_PCM_FORMAT_S16_LE, 44100, 2);
-
-  // Initialize shm area
-  format_bytes = cras_get_format_bytes(&server_format);
-  header = (struct cras_audio_shm_header*)calloc(1, sizeof(*header));
-  header->config.frame_bytes = format_bytes;
-  header->config.used_size = shm_writable_frames_ * format_bytes;
-
-  mmap_return_value = header;
-
-  cras_fill_client_stream_connected(&msg, 0, stream_.id, &server_format,
-                                    shm_max_size, effects);
-
-  stream_connected(&stream_, &msg, shm_fds, 2);
-
-  EXPECT_EQ(CRAS_THREAD_RUNNING, stream_.thread.state);
-  EXPECT_EQ(header, stream_.shm->header);
-}
-
-TEST_F(CrasClientTestSuite, InputStreamConnected) {
-  StreamConnected(CRAS_STREAM_INPUT);
-}
-
-TEST_F(CrasClientTestSuite, OutputStreamConnected) {
-  StreamConnected(CRAS_STREAM_OUTPUT);
-}
-
-void CrasClientTestSuite::StreamConnectedFail(CRAS_STREAM_DIRECTION direction) {
-  struct cras_client_stream_connected msg;
-  int shm_fds[2] = {0, 1};
-  int shm_max_size = 600;
-  size_t format_bytes;
-  size_t effects = 123;
-  struct cras_audio_shm_header header;
-  int rc;
-
-  stream_.direction = direction;
-  set_audio_format(&stream_.config->format, SND_PCM_FORMAT_S16_LE, 48000, 4);
-
-  struct cras_audio_format server_format;
-  set_audio_format(&server_format, SND_PCM_FORMAT_S16_LE, 44100, 2);
-
-  // Thread setup
-  rc = pipe(stream_.wake_fds);
-  ASSERT_EQ(0, rc);
-  stream_.thread.state = CRAS_THREAD_WARMUP;
-
-  // Initialize shm area
-  format_bytes = cras_get_format_bytes(&server_format);
-  memset(&header, 0, sizeof(header));
-  header.config.frame_bytes = format_bytes;
-  header.config.used_size = shm_writable_frames_ * format_bytes;
-
-  mmap_return_value = &header;
-
-  // Put an error in the message.
-  cras_fill_client_stream_connected(&msg, 1, stream_.id, &server_format,
-                                    shm_max_size, effects);
-
-  stream_connected(&stream_, &msg, shm_fds, 2);
-
-  EXPECT_EQ(CRAS_THREAD_STOP, stream_.thread.state);
-  EXPECT_EQ(4, close_called);  // close the pipefds and shm_fds
-}
-
-TEST_F(CrasClientTestSuite, InputStreamConnectedFail) {
-  StreamConnectedFail(CRAS_STREAM_INPUT);
-}
-
-TEST_F(CrasClientTestSuite, OutputStreamConnectedFail) {
-  StreamConnectedFail(CRAS_STREAM_OUTPUT);
-}
-
-TEST_F(CrasClientTestSuite, AddAndRemoveStream) {
-  cras_stream_id_t stream_id;
-  struct cras_disconnect_stream_message msg;
-  int serv_fds[2];
-  int rc;
-
-  // Dynamically allocate the stream so that it can be freed later.
-  struct client_stream* stream_ptr =
-      (struct client_stream*)malloc(sizeof(*stream_ptr));
-  memcpy(stream_ptr, &stream_, sizeof(client_stream));
-
-  stream_ptr->config =
-      (struct cras_stream_params*)malloc(sizeof(*(stream_ptr->config)));
-  memcpy(stream_ptr->config, stream_.config, sizeof(*(stream_.config)));
-
-  stream_ptr->wake_fds[0] = -1;
-  stream_ptr->wake_fds[1] = -1;
-
-  pthread_cond_timedwait_retval = ETIMEDOUT;
-  EXPECT_EQ(-ETIMEDOUT, client_thread_add_stream(&client_, stream_ptr,
-                                                 &stream_id, NO_DEVICE));
-  EXPECT_EQ(pthread_cond_timedwait_called, 1);
-  EXPECT_EQ(pthread_join_called, 0);
-
-  InitStaticVariables();
-  EXPECT_EQ(
-      0, client_thread_add_stream(&client_, stream_ptr, &stream_id, NO_DEVICE));
-  EXPECT_EQ(&client_, stream_ptr->client);
-  EXPECT_EQ(stream_id, stream_ptr->id);
-  EXPECT_EQ(pthread_create_called, 1);
-  EXPECT_NE(-1, stream_ptr->wake_fds[0]);
-  EXPECT_NE(-1, stream_ptr->wake_fds[1]);
-  EXPECT_EQ(1, sendmsg_called);  // send connect message to server
-  EXPECT_EQ(stream_ptr, stream_from_id(&client_, stream_id));
-
-  stream_ptr->thread.state = CRAS_THREAD_RUNNING;
-
-  rc = pipe(serv_fds);
-  EXPECT_EQ(0, rc);
-  client_.server_fd = serv_fds[1];
-  client_.server_fd_state = CRAS_SOCKET_STATE_CONNECTED;
-  EXPECT_EQ(0, client_thread_rm_stream(&client_, stream_id));
-
-  rc = read(serv_fds[0], &msg, sizeof(msg));
-  EXPECT_EQ(sizeof(msg), rc);
-  EXPECT_EQ(stream_id, msg.stream_id);
-  EXPECT_EQ(1, pthread_join_called);
-
-  EXPECT_EQ(NULL, stream_from_id(&client_, stream_id));
-}
-
-TEST_F(CrasClientTestSuite, SetOutputStreamVolume) {
-  cras_stream_id_t stream_id;
-
-  client_thread_add_stream(&client_, &stream_, &stream_id, NO_DEVICE);
-  EXPECT_EQ(&stream_, stream_from_id(&client_, stream_id));
-
-  /* Set volume before stream connected. */
-  client_thread_set_stream_volume(&client_, stream_id, 0.3f);
-  StreamConnected(CRAS_STREAM_OUTPUT);
-  EXPECT_EQ(0.3f, cras_shm_get_volume_scaler(stream_.shm));
-
-  /* Set volume after stream connected. */
-  client_thread_set_stream_volume(&client_, stream_id, 0.6f);
-  EXPECT_EQ(0.6f, cras_shm_get_volume_scaler(stream_.shm));
-}
-
-TEST_F(CrasClientTestSuite, SetInputStreamVolume) {
-  cras_stream_id_t stream_id;
-
-  client_thread_add_stream(&client_, &stream_, &stream_id, NO_DEVICE);
-  EXPECT_EQ(&stream_, stream_from_id(&client_, stream_id));
-
-  /* Set volume before stream connected. */
-  client_thread_set_stream_volume(&client_, stream_id, 0.3f);
-  StreamConnected(CRAS_STREAM_INPUT);
-  EXPECT_EQ(0.3f, cras_shm_get_volume_scaler(stream_.shm));
-
-  /* Set volume after stream connected. */
-  client_thread_set_stream_volume(&client_, stream_id, 0.6f);
-  EXPECT_EQ(0.6f, cras_shm_get_volume_scaler(stream_.shm));
-}
-
-TEST(CrasClientTest, InitStreamVolume) {
-  cras_stream_id_t stream_id;
-  struct cras_stream_params config;
-  struct add_stream_command_message cmd_msg;
-  int rc;
-  struct cras_client client;
-
-  memset(&client, 0, sizeof(client));
-  memset(&config, 0, sizeof(config));
-  client.server_fd_state = CRAS_SOCKET_STATE_CONNECTED;
-
-  config.aud_cb = reinterpret_cast<cras_playback_cb_t>(0x123);
-  config.err_cb = reinterpret_cast<cras_error_cb_t>(0x456);
-  client.thread.state = CRAS_THREAD_RUNNING;
-  rc = pipe(client.command_reply_fds);
-  EXPECT_EQ(0, rc);
-  rc = pipe(client.command_fds);
-  EXPECT_EQ(0, rc);
-
-  rc = write(client.command_reply_fds[1], &rc, sizeof(rc));
-  cras_client_add_stream(&client, &stream_id, &config);
-
-  rc = read(client.command_fds[0], &cmd_msg, sizeof(cmd_msg));
-  EXPECT_EQ(sizeof(cmd_msg), rc);
-  EXPECT_NE((void*)NULL, cmd_msg.stream);
-
-  EXPECT_EQ(1.0f, cmd_msg.stream->volume_scaler);
-
-  if (cmd_msg.stream->config)
-    free(cmd_msg.stream->config);
-  free(cmd_msg.stream);
-}
-
-}  // namespace
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
-
-/* stubs */
-extern "C" {
-
-ssize_t sendmsg(int sockfd, const struct msghdr* msg, int flags) {
-  ++sendmsg_called;
-  return msg->msg_iov->iov_len;
-}
-
-int close(int fd) {
-  ++close_called;
-  return 0;
-}
-
-int pthread_create(pthread_t* thread,
-                   const pthread_attr_t* attr,
-                   void* (*start_routine)(void*),
-                   void* arg) {
-  ++pthread_create_called;
-  return pthread_create_returned_value;
-}
-
-int pthread_join(pthread_t thread, void** retval) {
-  ++pthread_join_called;
-  return 0;
-}
-
-int pthread_cond_timedwait(pthread_cond_t* __restrict cond,
-                           pthread_mutex_t* __restrict mutex,
-                           const struct timespec* __restrict timeout) {
-  ++pthread_cond_timedwait_called;
-  return pthread_cond_timedwait_retval;
-}
-
-int clock_gettime(clockid_t clk_id, struct timespec* tp) {
-  tp->tv_sec = 0;
-  tp->tv_nsec = 0;
-  return 0;
-}
-
-void* mmap(void* addr,
-           size_t length,
-           int prot,
-           int flags,
-           int fd,
-           off_t offset) {
-  return mmap_return_value;
-}
-
-struct cras_audio_format* cras_audio_format_create(snd_pcm_format_t format,
-                                                   size_t frame_rate,
-                                                   size_t num_channels) {
-  return reinterpret_cast<struct cras_audio_format*>(0x123);
-}
-
-void cras_audio_format_destroy(struct cras_audio_format* fmt) {}
-}
diff --git a/cras/src/tests/cras_dsp_pipeline_unittest.cc b/cras/src/tests/cras_dsp_pipeline_unittest.cc
deleted file mode 100644
index b6c733a..0000000
--- a/cras/src/tests/cras_dsp_pipeline_unittest.cc
+++ /dev/null
@@ -1,518 +0,0 @@
-// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cras_dsp_pipeline.h"
-
-#include <gtest/gtest.h>
-
-#include "cras_config.h"
-#include "cras_dsp_module.h"
-
-#define MAX_MODULES 10
-#define MAX_MOCK_PORTS 30
-#define FILENAME_TEMPLATE "DspIniTest.XXXXXX"
-
-static void fill_test_data(int16_t* data, size_t size) {
-  for (size_t i = 0; i < size; i++)
-    data[i] = i;
-}
-
-static void verify_processed_data(int16_t* data, size_t size, int times) {
-  /* Each time the audio data flow through the mock plugin, the data
-   * will be multiplied by 2 in module->run() below, so if there are n
-   * plugins, the data will be multiplied by (1 << n). */
-  int multiples = (1 << times);
-  for (size_t i = 0; i < size; i++) {
-    EXPECT_EQ(i * multiples, data[i]);
-    if ((int16_t)i * multiples != data[i])
-      return;
-  }
-}
-
-struct data {
-  const char* title;
-  int nr_ports;
-  port_direction port_dir[MAX_MOCK_PORTS];
-  int nr_in_audio;
-  int nr_in_control;
-  int nr_out_audio;
-  int nr_out_control;
-  int in_audio[MAX_MOCK_PORTS];
-  int in_control[MAX_MOCK_PORTS];
-  int out_audio[MAX_MOCK_PORTS];
-  int out_control[MAX_MOCK_PORTS];
-  int properties;
-
-  int instantiate_called;
-  int sample_rate;
-
-  int connect_port_called[MAX_MOCK_PORTS];
-  float* data_location[MAX_MOCK_PORTS];
-
-  int run_called;
-  float input[MAX_MOCK_PORTS];
-  float output[MAX_MOCK_PORTS];
-
-  int sample_count;
-
-  int get_delay_called;
-  int deinstantiate_called;
-  int free_module_called;
-  int get_properties_called;
-};
-
-static int instantiate(struct dsp_module* module, unsigned long sample_rate) {
-  struct data* data = (struct data*)module->data;
-  data->instantiate_called++;
-  data->sample_rate = sample_rate;
-  return 0;
-}
-
-static void connect_port(struct dsp_module* module,
-                         unsigned long port,
-                         float* data_location) {
-  struct data* data = (struct data*)module->data;
-  data->connect_port_called[port]++;
-  data->data_location[port] = data_location;
-}
-
-static int get_delay(struct dsp_module* module) {
-  struct data* data = (struct data*)module->data;
-  data->get_delay_called++;
-
-  /* If the module title is "mN", then use N as the delay. */
-  int delay = 0;
-  sscanf(data->title, "m%d", &delay);
-  return delay;
-}
-
-static void run(struct dsp_module* module, unsigned long sample_count) {
-  struct data* data = (struct data*)module->data;
-  data->run_called++;
-  data->sample_count = sample_count;
-
-  for (int i = 0; i < data->nr_ports; i++) {
-    if (data->port_dir[i] == PORT_INPUT)
-      data->input[i] = *data->data_location[i];
-  }
-
-  /* copy the control port data */
-  for (int i = 0; i < std::min(data->nr_in_control, data->nr_out_control);
-       i++) {
-    int from = data->in_control[i];
-    int to = data->out_control[i];
-    data->data_location[to][0] = data->data_location[from][0];
-  }
-
-  /* multiply the audio port data by 2 */
-  for (int i = 0; i < std::min(data->nr_in_audio, data->nr_out_audio); i++) {
-    int from = data->in_audio[i];
-    int to = data->out_audio[i];
-    for (unsigned int j = 0; j < sample_count; j++)
-      data->data_location[to][j] = data->data_location[from][j] * 2;
-  }
-}
-
-static void deinstantiate(struct dsp_module* module) {
-  struct data* data = (struct data*)module->data;
-  data->deinstantiate_called++;
-}
-
-static void free_module(struct dsp_module* module) {
-  struct data* data = (struct data*)module->data;
-  data->free_module_called++;
-}
-
-static void really_free_module(struct dsp_module* module) {
-  struct data* data = (struct data*)module->data;
-  free(data);
-  free(module);
-}
-
-static int get_properties(struct dsp_module* module) {
-  struct data* data = (struct data*)module->data;
-  data->get_properties_called++;
-  return data->properties;
-}
-static void dump(struct dsp_module* module, struct dumper* d) {}
-
-static struct dsp_module* create_mock_module(struct plugin* plugin) {
-  struct data* data;
-  struct dsp_module* module;
-
-  data = (struct data*)calloc(1, sizeof(struct data));
-  data->title = plugin->title;
-  data->nr_ports = ARRAY_COUNT(&plugin->ports);
-  for (int i = 0; i < data->nr_ports; i++) {
-    struct port* port = ARRAY_ELEMENT(&plugin->ports, i);
-    data->port_dir[i] = port->direction;
-
-    if (port->direction == PORT_INPUT) {
-      if (port->type == PORT_AUDIO)
-        data->in_audio[data->nr_in_audio++] = i;
-      else
-        data->in_control[data->nr_in_control++] = i;
-    } else {
-      if (port->type == PORT_AUDIO)
-        data->out_audio[data->nr_out_audio++] = i;
-      else
-        data->out_control[data->nr_out_control++] = i;
-    }
-  }
-  if (strcmp(plugin->label, "inplace_broken") == 0) {
-    data->properties = MODULE_INPLACE_BROKEN;
-  } else {
-    data->properties = 0;
-  }
-
-  module = (struct dsp_module*)calloc(1, sizeof(struct dsp_module));
-  module->data = data;
-  module->instantiate = &instantiate;
-  module->connect_port = &connect_port;
-  module->get_delay = &get_delay;
-  module->run = &run;
-  module->deinstantiate = &deinstantiate;
-  module->free_module = &free_module;
-  module->get_properties = &get_properties;
-  module->dump = &dump;
-  return module;
-}
-
-static struct dsp_module* modules[MAX_MODULES];
-static struct dsp_module* cras_dsp_module_set_sink_ext_module_val;
-static int num_modules;
-static struct dsp_module* find_module(const char* name) {
-  for (int i = 0; i < num_modules; i++) {
-    struct data* data = (struct data*)modules[i]->data;
-    if (strcmp(name, data->title) == 0)
-      return modules[i];
-  }
-  return NULL;
-}
-
-extern "C" {
-struct dsp_module* cras_dsp_module_load_ladspa(struct plugin* plugin) {
-  return NULL;
-}
-struct dsp_module* cras_dsp_module_load_builtin(struct plugin* plugin) {
-  struct dsp_module* module = create_mock_module(plugin);
-  modules[num_modules++] = module;
-  return module;
-}
-void cras_dsp_module_set_sink_ext_module(struct dsp_module* module,
-                                         struct ext_dsp_module* ext_module) {
-  cras_dsp_module_set_sink_ext_module_val = module;
-}
-}
-
-namespace {
-
-class DspPipelineTestSuite : public testing::Test {
- protected:
-  virtual void SetUp() {
-    num_modules = 0;
-    strcpy(filename, FILENAME_TEMPLATE);
-    int fd = mkstemp(filename);
-    fp = fdopen(fd, "w");
-  }
-
-  virtual void TearDown() {
-    CloseFile();
-    unlink(filename);
-  }
-
-  virtual void CloseFile() {
-    if (fp) {
-      fclose(fp);
-      fp = NULL;
-    }
-  }
-
-  char filename[sizeof(FILENAME_TEMPLATE) + 1];
-  FILE* fp;
-  struct ext_dsp_module ext_mod;
-};
-
-TEST_F(DspPipelineTestSuite, Simple) {
-  const char* content =
-      "[M1]\n"
-      "library=builtin\n"
-      "label=source\n"
-      "purpose=capture\n"
-      "output_0={audio}\n"
-      "output_1=<control>\n"
-      "input_2=3.0\n"
-      "[M2]\n"
-      "library=builtin\n"
-      "label=sink\n"
-      "purpose=capture\n"
-      "input_0=<control>\n"
-      "input_1={audio}\n"
-      "\n";
-  fprintf(fp, "%s", content);
-  CloseFile();
-
-  struct cras_expr_env env = CRAS_EXPR_ENV_INIT;
-  struct ini* ini = cras_dsp_ini_create(filename);
-  ASSERT_TRUE(ini);
-  struct pipeline* p = cras_dsp_pipeline_create(ini, &env, "capture");
-  ASSERT_TRUE(p);
-  ASSERT_EQ(0, cras_dsp_pipeline_load(p));
-
-  ASSERT_EQ(2, num_modules);
-  struct dsp_module* m1 = find_module("m1");
-  struct dsp_module* m2 = find_module("m2");
-  ASSERT_TRUE(m1);
-  ASSERT_TRUE(m2);
-
-  ASSERT_EQ(1, cras_dsp_pipeline_get_num_input_channels(p));
-  ASSERT_EQ(0, cras_dsp_pipeline_instantiate(p, 48000));
-
-  struct data* d1 = (struct data*)m1->data;
-  struct data* d2 = (struct data*)m2->data;
-
-  /* check m1 */
-  ASSERT_STREQ("m1", d1->title);
-  ASSERT_EQ(3, d1->nr_ports);
-  ASSERT_EQ(PORT_OUTPUT, d1->port_dir[0]);
-  ASSERT_EQ(PORT_OUTPUT, d1->port_dir[1]);
-  ASSERT_EQ(PORT_INPUT, d1->port_dir[2]);
-  ASSERT_EQ(1, d1->instantiate_called);
-  ASSERT_EQ(1, d1->get_delay_called);
-  ASSERT_EQ(48000, d1->sample_rate);
-  ASSERT_EQ(1, d1->connect_port_called[0]);
-  ASSERT_EQ(1, d1->connect_port_called[1]);
-  ASSERT_EQ(1, d1->connect_port_called[2]);
-  ASSERT_TRUE(d1->data_location[0]);
-  ASSERT_TRUE(d1->data_location[1]);
-  ASSERT_TRUE(d1->data_location[2]);
-  ASSERT_EQ(0, d1->run_called);
-  ASSERT_EQ(0, d1->deinstantiate_called);
-  ASSERT_EQ(0, d1->free_module_called);
-  ASSERT_EQ(1, d1->get_properties_called);
-
-  /* check m2 */
-  ASSERT_STREQ("m2", d2->title);
-  ASSERT_EQ(2, d2->nr_ports);
-  ASSERT_EQ(PORT_INPUT, d2->port_dir[0]);
-  ASSERT_EQ(PORT_INPUT, d2->port_dir[1]);
-  ASSERT_EQ(1, d2->instantiate_called);
-  ASSERT_EQ(1, d2->get_delay_called);
-  ASSERT_EQ(48000, d2->sample_rate);
-  ASSERT_EQ(1, d2->connect_port_called[0]);
-  ASSERT_EQ(1, d2->connect_port_called[1]);
-  ASSERT_TRUE(d2->data_location[0]);
-  ASSERT_TRUE(d2->data_location[1]);
-  ASSERT_EQ(0, d2->run_called);
-  ASSERT_EQ(0, d2->deinstantiate_called);
-  ASSERT_EQ(0, d2->free_module_called);
-  ASSERT_EQ(1, d2->get_properties_called);
-
-  /* check the buffer is shared */
-  ASSERT_EQ(d1->data_location[0], d2->data_location[1]);
-  ASSERT_EQ(d1->data_location[1], d2->data_location[0]);
-  ASSERT_EQ(1, cras_dsp_pipeline_get_peak_audio_buffers(p));
-
-  d1->data_location[0][0] = 100;
-  cras_dsp_pipeline_run(p, DSP_BUFFER_SIZE);
-  ASSERT_EQ(1, d1->run_called);
-  ASSERT_EQ(1, d2->run_called);
-  ASSERT_EQ(3, d1->input[2]);
-  ASSERT_EQ(3, d2->input[0]);
-  ASSERT_EQ(100, d2->input[1]);
-
-  d1->data_location[0][0] = 1000;
-  cras_dsp_pipeline_run(p, DSP_BUFFER_SIZE);
-  ASSERT_EQ(2, d1->run_called);
-  ASSERT_EQ(2, d2->run_called);
-  ASSERT_EQ(3, d1->input[2]);
-  ASSERT_EQ(3, d2->input[0]);
-  ASSERT_EQ(1000, d2->input[1]);
-
-  /* Expect the sink module "m2" is set. */
-  cras_dsp_pipeline_set_sink_ext_module(p, &ext_mod);
-  struct data* d = (struct data*)cras_dsp_module_set_sink_ext_module_val->data;
-  ASSERT_STREQ("m2", d->title);
-
-  cras_dsp_pipeline_deinstantiate(p);
-  ASSERT_EQ(1, d1->deinstantiate_called);
-  ASSERT_EQ(1, d2->deinstantiate_called);
-
-  cras_dsp_pipeline_free(p);
-  ASSERT_EQ(1, d1->free_module_called);
-  ASSERT_EQ(1, d2->free_module_called);
-
-  cras_dsp_ini_free(ini);
-  cras_expr_env_free(&env);
-
-  really_free_module(m1);
-  really_free_module(m2);
-}
-
-TEST_F(DspPipelineTestSuite, Complex) {
-  /*
-   *                   / --(b)-- 2 --(c)-- \
-   *   0 ==(a0, a1)== 1                     4 ==(f0,f1)== 5
-   *                   \ --(d)-- 3 --(e)-- /
-   *
-   *
-   *                     --(g)-- 6 --(h)--
-   */
-
-  const char* content =
-      "[M6]\n"
-      "library=builtin\n"
-      "label=foo\n"
-      "input_0={g}\n"
-      "output_1={h}\n"
-      "[M5]\n"
-      "library=builtin\n"
-      "label=sink\n"
-      "purpose=playback\n"
-      "input_0={f0}\n"
-      "input_1={f1}\n"
-      "[M4]\n"
-      "library=builtin\n"
-      "label=foo\n"
-      "disable=(equal? output_device \"HDMI\")\n"
-      "input_0=3.14\n"
-      "input_1={c}\n"
-      "output_2={f0}\n"
-      "input_3={e}\n"
-      "output_4={f1}\n"
-      "[M3]\n"
-      "library=builtin\n"
-      "label=foo\n"
-      "input_0={d}\n"
-      "output_1={e}\n"
-      "[M2]\n"
-      "library=builtin\n"
-      "label=inplace_broken\n"
-      "input_0={b}\n"
-      "output_1={c}\n"
-      "[M1]\n"
-      "library=builtin\n"
-      "label=foo\n"
-      "disable=(equal? output_device \"USB\")\n"
-      "input_0={a0}\n"
-      "input_1={a1}\n"
-      "output_2={b}\n"
-      "output_3={d}\n"
-      "[M0]\n"
-      "library=builtin\n"
-      "label=source\n"
-      "purpose=playback\n"
-      "output_0={a0}\n"
-      "output_1={a1}\n";
-  fprintf(fp, "%s", content);
-  CloseFile();
-
-  struct cras_expr_env env = CRAS_EXPR_ENV_INIT;
-  cras_expr_env_install_builtins(&env);
-  cras_expr_env_set_variable_string(&env, "output_device", "HDMI");
-  cras_expr_env_set_variable_boolean(&env, "swap_lr_disabled", 1);
-
-  struct ini* ini = cras_dsp_ini_create(filename);
-  ASSERT_TRUE(ini);
-  struct pipeline* p = cras_dsp_pipeline_create(ini, &env, "playback");
-  ASSERT_TRUE(p);
-  ASSERT_EQ(0, cras_dsp_pipeline_load(p));
-
-  ASSERT_EQ(5, num_modules); /* one not connected, one disabled */
-  struct dsp_module* m0 = find_module("m0");
-  struct dsp_module* m1 = find_module("m1");
-  struct dsp_module* m2 = find_module("m2");
-  struct dsp_module* m3 = find_module("m3");
-  struct dsp_module* m5 = find_module("m5");
-
-  ASSERT_TRUE(m0);
-  ASSERT_TRUE(m1);
-  ASSERT_TRUE(m2);
-  ASSERT_TRUE(m3);
-  ASSERT_FALSE(find_module("m4"));
-  ASSERT_TRUE(m5);
-  ASSERT_FALSE(find_module("m6"));
-
-  ASSERT_EQ(2, cras_dsp_pipeline_get_num_input_channels(p));
-  ASSERT_EQ(0, cras_dsp_pipeline_instantiate(p, 48000));
-
-  struct data* d0 = (struct data*)m0->data;
-  struct data* d1 = (struct data*)m1->data;
-  struct data* d2 = (struct data*)m2->data;
-  struct data* d3 = (struct data*)m3->data;
-  struct data* d5 = (struct data*)m5->data;
-
-  /*
-   *                   / --(b)-- 2 --(c)-- \
-   *   0 ==(a0, a1)== 1                     4 ==(f0,f1)== 5
-   *                   \ --(d)-- 3 --(e)-- /
-   *
-   *
-   *                     --(g)-- 6 --(h)--
-   */
-
-  ASSERT_EQ(d0->data_location[0], d1->data_location[0]);
-  ASSERT_EQ(d0->data_location[1], d1->data_location[1]);
-  ASSERT_EQ(d1->data_location[2], d2->data_location[0]);
-  ASSERT_EQ(d1->data_location[3], d3->data_location[0]);
-  ASSERT_NE(d2->data_location[0], d2->data_location[1]); /* inplace-broken */
-  ASSERT_EQ(d2->data_location[1], d5->data_location[0]); /* m4 is disabled */
-  ASSERT_EQ(d3->data_location[1], d5->data_location[1]);
-
-  /* need 3 buffers because m2 has inplace-broken flag */
-  ASSERT_EQ(3, cras_dsp_pipeline_get_peak_audio_buffers(p));
-
-  int16_t* samples = new int16_t[DSP_BUFFER_SIZE];
-  fill_test_data(samples, DSP_BUFFER_SIZE);
-  cras_dsp_pipeline_apply(p, (uint8_t*)samples, SND_PCM_FORMAT_S16_LE, 100);
-  /* the data flow through 2 plugins because m4 is disabled. */
-  verify_processed_data(samples, 100, 2);
-  delete[] samples;
-
-  ASSERT_EQ(1, d1->run_called);
-  ASSERT_EQ(1, d3->run_called);
-
-  /* check m5 */
-  ASSERT_EQ(1, d5->run_called);
-  ASSERT_EQ(100, d5->sample_count);
-
-  /* Expect the sink module "m5" is set. */
-  cras_dsp_pipeline_set_sink_ext_module(p, &ext_mod);
-  struct data* d = (struct data*)cras_dsp_module_set_sink_ext_module_val->data;
-  ASSERT_STREQ("m5", d->title);
-
-  /* re-instantiate */
-  ASSERT_EQ(1, d5->instantiate_called);
-  ASSERT_EQ(1, d5->get_delay_called);
-  ASSERT_EQ(1 + 3 + 5, cras_dsp_pipeline_get_delay(p));
-
-  cras_dsp_pipeline_deinstantiate(p);
-  cras_dsp_pipeline_instantiate(p, 44100);
-
-  ASSERT_EQ(1, d5->deinstantiate_called);
-  ASSERT_EQ(2, d5->instantiate_called);
-  ASSERT_EQ(2, d5->get_delay_called);
-  ASSERT_EQ(1 + 3 + 5, cras_dsp_pipeline_get_delay(p));
-  ASSERT_EQ(0, d5->free_module_called);
-  ASSERT_EQ(44100, d5->sample_rate);
-  ASSERT_EQ(2, d5->connect_port_called[0]);
-  ASSERT_EQ(2, d5->connect_port_called[1]);
-
-  cras_dsp_pipeline_free(p);
-  cras_dsp_ini_free(ini);
-  cras_expr_env_free(&env);
-
-  really_free_module(m0);
-  really_free_module(m1);
-  really_free_module(m2);
-  really_free_module(m3);
-  really_free_module(m5);
-}
-
-}  //  namespace
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tests/cras_selinux_helper_unittest.c b/cras/src/tests/cras_selinux_helper_unittest.c
deleted file mode 100644
index 64fce14..0000000
--- a/cras/src/tests/cras_selinux_helper_unittest.c
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright 2018 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cras_shm.h"
-
-/* Define a stub cras_selinux_restorecon() which doesn't do anything */
-int cras_selinux_restorecon(const char* pathname) {
-  return 0;
-}
diff --git a/cras/src/tests/cras_tm_unittest.cc b/cras/src/tests/cras_tm_unittest.cc
deleted file mode 100644
index 3f5521e..0000000
--- a/cras/src/tests/cras_tm_unittest.cc
+++ /dev/null
@@ -1,198 +0,0 @@
-// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <gtest/gtest.h>
-#include <stdio.h>
-
-extern "C" {
-#include "cras_tm.h"
-#include "cras_types.h"
-}
-
-namespace {
-
-class TimerTestSuite : public testing::Test {
- protected:
-  virtual void SetUp() {
-    tm_ = cras_tm_init();
-    ASSERT_TRUE(tm_);
-  }
-
-  virtual void TearDown() { cras_tm_deinit(tm_); }
-
-  struct cras_tm* tm_;
-};
-
-static struct timespec time_now;
-static unsigned int test_cb_called;
-static unsigned int test_cb2_called;
-
-void test_cb(struct cras_timer* t, void* data) {
-  test_cb_called++;
-}
-
-void test_cb2(struct cras_timer* t, void* data) {
-  test_cb2_called++;
-}
-
-TEST_F(TimerTestSuite, InitNoTimers) {
-  struct timespec ts;
-  int timers_active;
-
-  timers_active = cras_tm_get_next_timeout(tm_, &ts);
-  EXPECT_FALSE(timers_active);
-}
-
-TEST_F(TimerTestSuite, AddTimer) {
-  struct cras_timer* t;
-
-  t = cras_tm_create_timer(tm_, 10, test_cb, this);
-  EXPECT_TRUE(t);
-}
-
-TEST_F(TimerTestSuite, AddLongTimer) {
-  struct timespec ts;
-  struct cras_timer* t;
-  int timers_active;
-
-  time_now.tv_sec = 0;
-  time_now.tv_nsec = 0;
-  t = cras_tm_create_timer(tm_, 10000, test_cb, this);
-  EXPECT_TRUE(t);
-
-  timers_active = cras_tm_get_next_timeout(tm_, &ts);
-  ASSERT_TRUE(timers_active);
-  EXPECT_EQ(10, ts.tv_sec);
-  EXPECT_EQ(0, ts.tv_nsec);
-
-  // All timers already fired.
-  time_now.tv_sec = 12;
-  time_now.tv_nsec = 0;
-  timers_active = cras_tm_get_next_timeout(tm_, &ts);
-  ASSERT_TRUE(timers_active);
-  EXPECT_EQ(0, ts.tv_sec);
-  EXPECT_EQ(0, ts.tv_nsec);
-
-  cras_tm_cancel_timer(tm_, t);
-  timers_active = cras_tm_get_next_timeout(tm_, &ts);
-  EXPECT_FALSE(timers_active);
-}
-
-TEST_F(TimerTestSuite, AddRemoveTimer) {
-  struct timespec ts;
-  struct cras_timer* t;
-  int timers_active;
-
-  time_now.tv_sec = 0;
-  time_now.tv_nsec = 0;
-  t = cras_tm_create_timer(tm_, 10, test_cb, this);
-  EXPECT_TRUE(t);
-
-  timers_active = cras_tm_get_next_timeout(tm_, &ts);
-  ASSERT_TRUE(timers_active);
-  EXPECT_EQ(0, ts.tv_sec);
-  EXPECT_EQ(10 * 1000000, ts.tv_nsec);
-
-  // All timers already fired.
-  time_now.tv_sec = 1;
-  time_now.tv_nsec = 0;
-  timers_active = cras_tm_get_next_timeout(tm_, &ts);
-  ASSERT_TRUE(timers_active);
-  EXPECT_EQ(0, ts.tv_sec);
-  EXPECT_EQ(0, ts.tv_nsec);
-
-  cras_tm_cancel_timer(tm_, t);
-  timers_active = cras_tm_get_next_timeout(tm_, &ts);
-  EXPECT_FALSE(timers_active);
-}
-
-TEST_F(TimerTestSuite, AddTwoTimers) {
-  struct timespec ts;
-  struct cras_timer *t1, *t2;
-  int timers_active;
-  static const unsigned int t1_to = 10;
-  static const unsigned int t2_offset = 5;
-  static const unsigned int t2_to = 7;
-
-  time_now.tv_sec = 0;
-  time_now.tv_nsec = 0;
-  t1 = cras_tm_create_timer(tm_, t1_to, test_cb, this);
-  ASSERT_TRUE(t1);
-
-  time_now.tv_sec = 0;
-  time_now.tv_nsec = t2_offset;
-  t2 = cras_tm_create_timer(tm_, t2_to, test_cb2, this);
-  ASSERT_TRUE(t2);
-
-  /* Check That the right calls are made at the right times. */
-  test_cb_called = 0;
-  test_cb2_called = 0;
-  time_now.tv_sec = 0;
-  time_now.tv_nsec = t2_to * 1000000 + t2_offset;
-  cras_tm_call_callbacks(tm_);
-  EXPECT_EQ(0, test_cb_called);
-  EXPECT_EQ(1, test_cb2_called);
-  timers_active = cras_tm_get_next_timeout(tm_, &ts);
-  ASSERT_TRUE(timers_active);
-
-  time_now.tv_sec = 0;
-  time_now.tv_nsec = t2_offset;
-  t2 = cras_tm_create_timer(tm_, t2_to, test_cb2, this);
-  ASSERT_TRUE(t2);
-
-  test_cb_called = 0;
-  test_cb2_called = 0;
-  time_now.tv_sec = 0;
-  time_now.tv_nsec = t1_to * 1000000;
-  cras_tm_call_callbacks(tm_);
-  EXPECT_EQ(1, test_cb_called);
-  EXPECT_EQ(1, test_cb2_called);
-  timers_active = cras_tm_get_next_timeout(tm_, &ts);
-  EXPECT_FALSE(timers_active);
-
-  time_now.tv_sec = 0;
-  time_now.tv_nsec = 0;
-  t1 = cras_tm_create_timer(tm_, t1_to, test_cb, this);
-  ASSERT_TRUE(t1);
-
-  time_now.tv_sec = 0;
-  time_now.tv_nsec = t2_offset;
-  t2 = cras_tm_create_timer(tm_, t2_to, test_cb2, this);
-  ASSERT_TRUE(t2);
-
-  /* Timeout values returned are correct. */
-  time_now.tv_sec = 0;
-  time_now.tv_nsec = 50;
-  timers_active = cras_tm_get_next_timeout(tm_, &ts);
-  ASSERT_TRUE(timers_active);
-  EXPECT_EQ(0, ts.tv_sec);
-  EXPECT_EQ(t2_to * 1000000 + t2_offset - time_now.tv_nsec, ts.tv_nsec);
-
-  cras_tm_cancel_timer(tm_, t2);
-
-  time_now.tv_sec = 0;
-  time_now.tv_nsec = 60;
-  timers_active = cras_tm_get_next_timeout(tm_, &ts);
-  ASSERT_TRUE(timers_active);
-  EXPECT_EQ(0, ts.tv_sec);
-  EXPECT_EQ(t1_to * 1000000 - time_now.tv_nsec, ts.tv_nsec);
-  cras_tm_cancel_timer(tm_, t1);
-}
-
-/* Stubs */
-extern "C" {
-
-int clock_gettime(clockid_t clk_id, struct timespec* tp) {
-  *tp = time_now;
-  return 0;
-}
-
-}  // extern "C"
-
-}  //  namespace
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tests/dbus_test.cc b/cras/src/tests/dbus_test.cc
deleted file mode 100644
index b435825..0000000
--- a/cras/src/tests/dbus_test.cc
+++ /dev/null
@@ -1,734 +0,0 @@
-// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "dbus_test.h"
-
-#include <stdlib.h>
-#include <sys/select.h>
-#include <unistd.h>
-
-#include <algorithm>
-
-namespace {
-
-const char kServerAddress[] = "unix:abstract=/org/chromium/DBusTest";
-
-}  // namespace
-
-DBusMatch::DBusMatch()
-    : message_type_(DBUS_MESSAGE_TYPE_INVALID),
-      as_property_dictionary_(false),
-      send_reply_(false),
-      send_error_(false),
-      expect_serial_(false),
-      matched_(false) {}
-
-DBusMatch& DBusMatch::WithString(std::string value) {
-  Arg arg;
-  arg.type = DBUS_TYPE_STRING;
-  arg.array = false;
-  arg.string_value = value;
-
-  if (send_reply_)
-    reply_args_.push_back(arg);
-  else
-    args_.push_back(arg);
-  return *this;
-}
-
-DBusMatch& DBusMatch::WithUnixFd(int value) {
-  Arg arg;
-  arg.type = DBUS_TYPE_UNIX_FD;
-  arg.array = false;
-  arg.int_value = value;
-
-  if (send_reply_)
-    reply_args_.push_back(arg);
-  else
-    args_.push_back(arg);
-  return *this;
-}
-
-DBusMatch& DBusMatch::WithObjectPath(std::string value) {
-  Arg arg;
-  arg.type = DBUS_TYPE_OBJECT_PATH;
-  arg.array = false;
-  arg.string_value = value;
-
-  if (send_reply_)
-    reply_args_.push_back(arg);
-  else
-    args_.push_back(arg);
-  return *this;
-}
-
-DBusMatch& DBusMatch::WithArrayOfStrings(std::vector<std::string> values) {
-  Arg arg;
-  arg.type = DBUS_TYPE_STRING;
-  arg.array = true;
-  arg.string_values = values;
-
-  if (send_reply_)
-    reply_args_.push_back(arg);
-  else
-    args_.push_back(arg);
-  return *this;
-}
-
-DBusMatch& DBusMatch::WithArrayOfObjectPaths(std::vector<std::string> values) {
-  Arg arg;
-  arg.type = DBUS_TYPE_OBJECT_PATH;
-  arg.array = true;
-  arg.string_values = values;
-
-  if (send_reply_)
-    reply_args_.push_back(arg);
-  else
-    args_.push_back(arg);
-  return *this;
-}
-
-DBusMatch& DBusMatch::WithNoMoreArgs() {
-  Arg arg;
-  arg.type = DBUS_TYPE_INVALID;
-
-  args_.push_back(arg);
-  return *this;
-}
-
-DBusMatch& DBusMatch::AsPropertyDictionary() {
-  as_property_dictionary_ = true;
-  return *this;
-}
-
-DBusMatch& DBusMatch::SendReply() {
-  send_reply_ = true;
-  expect_serial_ = true;
-  return *this;
-}
-
-DBusMatch& DBusMatch::SendError(std::string error_name,
-                                std::string error_message) {
-  send_error_ = true;
-  error_name_ = error_name;
-  error_message_ = error_message;
-  expect_serial_ = true;
-  return *this;
-}
-
-DBusMatch& DBusMatch::SendReplyNoWait() {
-  send_reply_ = true;
-  expect_serial_ = false;
-  return *this;
-}
-
-DBusMatch& DBusMatch::Send() {
-  DBusMessage* message;
-  if (message_type_ == DBUS_MESSAGE_TYPE_SIGNAL)
-    message = dbus_message_new_signal(path_.c_str(), interface_.c_str(),
-                                      member_.c_str());
-  else if (message_type_ == DBUS_MESSAGE_TYPE_METHOD_CALL)
-    message = dbus_message_new_method_call(NULL, path_.c_str(),
-                                           interface_.c_str(), member_.c_str());
-  else
-    return *this;
-
-  AppendArgsToMessage(message, &args_);
-  SendMessage(conn_, message);
-
-  dbus_message_unref(message);
-
-  return *this;
-}
-
-void DBusMatch::ExpectMethodCall(std::string path,
-                                 std::string interface,
-                                 std::string method) {
-  message_type_ = DBUS_MESSAGE_TYPE_METHOD_CALL;
-  path_ = path;
-  interface_ = interface;
-  member_ = method;
-}
-
-void DBusMatch::CreateSignal(DBusConnection* conn,
-                             std::string path,
-                             std::string interface,
-                             std::string signal_name) {
-  message_type_ = DBUS_MESSAGE_TYPE_SIGNAL;
-  path_ = path;
-  interface_ = interface;
-  member_ = signal_name;
-
-  conn_ = conn;
-  expect_serial_ = true;
-  matched_ = true;
-}
-
-void DBusMatch::CreateMessageCall(DBusConnection* conn,
-                                  std::string path,
-                                  std::string interface,
-                                  std::string method_name) {
-  message_type_ = DBUS_MESSAGE_TYPE_METHOD_CALL;
-  path_ = path;
-  interface_ = interface;
-  member_ = method_name;
-
-  conn_ = conn;
-  expect_serial_ = true;
-  matched_ = true;
-}
-
-bool DBusMatch::MatchMessageArgs(DBusMessage* message, std::vector<Arg>* args) {
-  DBusMessageIter iter;
-  dbus_message_iter_init(message, &iter);
-  for (std::vector<Arg>::iterator it = args->begin(); it != args->end(); ++it) {
-    Arg& arg = *it;
-
-    int type = dbus_message_iter_get_arg_type(&iter);
-    if (type != arg.type)
-      return false;
-
-    if (arg.type == DBUS_TYPE_STRING || arg.type == DBUS_TYPE_OBJECT_PATH) {
-      const char* str_value;
-      dbus_message_iter_get_basic(&iter, &str_value);
-      if (strcmp(str_value, arg.string_value.c_str()) != 0)
-        return false;
-    }
-    // TODO(keybuk): additional argument types
-
-    dbus_message_iter_next(&iter);
-  }
-
-  return true;
-}
-
-void DBusMatch::AppendArgsToMessage(DBusMessage* message,
-                                    std::vector<Arg>* args) {
-  DBusMessageIter message_iter;
-  DBusMessageIter dict_array_iter;
-  DBusMessageIter struct_iter;
-  DBusMessageIter iter;
-
-  if (as_property_dictionary_) {
-    dbus_message_iter_init_append(message, &message_iter);
-    dbus_message_iter_open_container(&message_iter, DBUS_TYPE_ARRAY, "{sv}",
-                                     &dict_array_iter);
-  } else {
-    dbus_message_iter_init_append(message, &iter);
-  }
-
-  for (std::vector<Arg>::iterator it = args->begin(); it != args->end(); ++it) {
-    Arg& arg = *it;
-
-    if (as_property_dictionary_) {
-      dbus_message_iter_open_container(&dict_array_iter, DBUS_TYPE_DICT_ENTRY,
-                                       NULL, &struct_iter);
-
-      const char* str_value = arg.string_value.c_str();
-      dbus_message_iter_append_basic(&struct_iter, arg.type, &str_value);
-
-      arg = *(++it);
-    }
-
-    const char *array_type, *element_type;
-    switch (arg.type) {
-      case DBUS_TYPE_STRING:
-        array_type = DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_STRING_AS_STRING;
-        element_type = DBUS_TYPE_STRING_AS_STRING;
-        break;
-      case DBUS_TYPE_OBJECT_PATH:
-        array_type = DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_OBJECT_PATH_AS_STRING;
-        element_type = DBUS_TYPE_OBJECT_PATH_AS_STRING;
-        break;
-      case DBUS_TYPE_UNIX_FD:
-        array_type = DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_UNIX_FD_AS_STRING;
-        element_type = DBUS_TYPE_UNIX_FD_AS_STRING;
-        break;
-      default:
-        abort();
-        // TODO(keybuk): additional argument types
-    }
-
-    if (as_property_dictionary_) {
-      dbus_message_iter_open_container(&struct_iter, DBUS_TYPE_VARIANT,
-                                       arg.array ? array_type : element_type,
-                                       &iter);
-    }
-
-    DBusMessageIter array_iter;
-    if (arg.array) {
-      dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, element_type,
-                                       &array_iter);
-
-      if (arg.type == DBUS_TYPE_STRING || arg.type == DBUS_TYPE_OBJECT_PATH) {
-        for (std::vector<std::string>::const_iterator vit =
-                 arg.string_values.begin();
-             vit != arg.string_values.end(); ++vit) {
-          const char* str_value = vit->c_str();
-          dbus_message_iter_append_basic(&array_iter, arg.type, &str_value);
-        }
-      }
-      // TODO(keybuk): additional element types
-
-      dbus_message_iter_close_container(&iter, &array_iter);
-    } else {
-      if (arg.type == DBUS_TYPE_STRING || arg.type == DBUS_TYPE_OBJECT_PATH) {
-        const char* str_value = arg.string_value.c_str();
-        dbus_message_iter_append_basic(&iter, arg.type, &str_value);
-      } else if (arg.type == DBUS_TYPE_UNIX_FD) {
-        dbus_message_iter_append_basic(&iter, arg.type, &arg.int_value);
-      }
-      // TODO(keybuk): additional argument types
-    }
-
-    if (as_property_dictionary_) {
-      dbus_message_iter_close_container(&struct_iter, &iter);
-      dbus_message_iter_close_container(&dict_array_iter, &struct_iter);
-    }
-  }
-
-  if (as_property_dictionary_)
-    dbus_message_iter_close_container(&message_iter, &dict_array_iter);
-}
-
-void DBusMatch::SendMessage(DBusConnection* conn, DBusMessage* message) {
-  dbus_bool_t success;
-  dbus_uint32_t serial;
-  success = dbus_connection_send(conn, message, &serial);
-
-  if (success && expect_serial_)
-    expected_serials_.push_back(serial);
-}
-
-bool DBusMatch::HandleServerMessage(DBusConnection* conn,
-                                    DBusMessage* message) {
-  // Make sure we're expecting a method call or signal of this name
-  if (message_type_ == DBUS_MESSAGE_TYPE_METHOD_CALL &&
-      !dbus_message_is_method_call(message, interface_.c_str(),
-                                   member_.c_str()))
-    return false;
-  else if (message_type_ == DBUS_MESSAGE_TYPE_SIGNAL &&
-           !dbus_message_is_signal(message, interface_.c_str(),
-                                   member_.c_str()))
-    return false;
-
-  // Make sure the path is what we expected.
-  if (path_.length() &&
-      strcmp(path_.c_str(), dbus_message_get_path(message)) != 0)
-    return false;
-
-  // And the arguments.
-  if (!MatchMessageArgs(message, &args_))
-    return false;
-
-  // Handle any actions.
-  matched_ = true;
-  if (send_reply_ || send_error_) {
-    // Send out the reply
-    DBusMessage* reply = NULL;
-    if (send_reply_)
-      reply = dbus_message_new_method_return(message);
-    else if (send_error_)
-      reply = dbus_message_new_error(message, error_name_.c_str(),
-                                     error_message_.c_str());
-
-    AppendArgsToMessage(reply, &reply_args_);
-    SendMessage(conn, reply);
-
-    dbus_message_unref(reply);
-  }
-
-  return true;
-}
-
-bool DBusMatch::HandleClientMessage(DBusConnection* conn,
-                                    DBusMessage* message) {
-  // From the client side we check whether the message has a serial number
-  // we generated on our server side, and if so, remove it from the list of
-  // those we're expecting to see.
-  for (std::vector<dbus_uint32_t>::iterator it = expected_serials_.begin();
-       it != expected_serials_.end(); ++it) {
-    if (*it == dbus_message_get_serial(message)) {
-      expected_serials_.erase(it);
-      return true;
-    }
-  }
-
-  return false;
-}
-
-bool DBusMatch::Complete() {
-  return matched_ && expected_serials_.size() == 0;
-}
-
-DBusTest::DBusTest()
-    : conn_(NULL), server_(NULL), server_conn_(NULL), dispatch_(false) {}
-
-DBusTest::~DBusTest() {}
-
-DBusMatch& DBusTest::ExpectMethodCall(std::string path,
-                                      std::string interface,
-                                      std::string method) {
-  DBusMatch match;
-  match.ExpectMethodCall(path, interface, method);
-  pthread_mutex_lock(&mutex_);
-  matches_.push_back(match);
-  DBusMatch& ref = matches_.back();
-  pthread_mutex_unlock(&mutex_);
-  return ref;
-}
-
-DBusMatch& DBusTest::CreateSignal(std::string path,
-                                  std::string interface,
-                                  std::string signal_name) {
-  DBusMatch match;
-  match.CreateSignal(server_conn_, path, interface, signal_name);
-  pthread_mutex_lock(&mutex_);
-  matches_.push_back(match);
-  DBusMatch& ref = matches_.back();
-  pthread_mutex_unlock(&mutex_);
-  return ref;
-}
-
-DBusMatch& DBusTest::CreateMessageCall(std::string path,
-                                       std::string interface,
-                                       std::string signal_name) {
-  DBusMatch match;
-  match.CreateMessageCall(server_conn_, path, interface, signal_name);
-  pthread_mutex_lock(&mutex_);
-  matches_.push_back(match);
-  DBusMatch& ref = matches_.back();
-  pthread_mutex_unlock(&mutex_);
-  return ref;
-}
-
-void DBusTest::WaitForMatches() {
-  for (;;) {
-    pthread_mutex_lock(&mutex_);
-    size_t incomplete_matches = 0;
-    for (std::vector<DBusMatch>::iterator it = matches_.begin();
-         it != matches_.end(); ++it) {
-      DBusMatch& match = *it;
-      if (!match.Complete())
-        ++incomplete_matches;
-    }
-    pthread_mutex_unlock(&mutex_);
-
-    if (!incomplete_matches)
-      break;
-
-    // Fish a message from the queue.
-    DBusMessage* message;
-    while ((message = dbus_connection_borrow_message(conn_)) == NULL)
-      dbus_connection_read_write(conn_, -1);
-
-    // Allow matches to verify the serial of the message.
-    pthread_mutex_lock(&mutex_);
-    for (std::vector<DBusMatch>::iterator it = matches_.begin();
-         it != matches_.end(); ++it) {
-      DBusMatch& match = *it;
-
-      if (match.HandleClientMessage(conn_, message))
-        break;
-    }
-    pthread_mutex_unlock(&mutex_);
-
-    // Throw it back and dispatch.
-    dbus_connection_return_message(conn_, message);
-    dbus_connection_dispatch(conn_);
-  }
-
-  pthread_mutex_lock(&mutex_);
-  matches_.erase(matches_.begin(), matches_.end());
-  pthread_mutex_unlock(&mutex_);
-}
-
-void DBusTest::SetUp() {
-  dbus_threads_init_default();
-
-  // Create the D-Bus server that will accept a connection for us, since
-  // there's no "just give me a socketpair" option in libdbus.
-  server_ = dbus_server_listen(kServerAddress, NULL);
-  ASSERT_TRUE(server_ != NULL);
-
-  dbus_server_set_new_connection_function(server_, NewConnectionThunk, this,
-                                          NULL);
-
-  dbus_bool_t success;
-  success = dbus_server_set_watch_functions(
-      server_, AddWatchThunk, RemoveWatchThunk, WatchToggledThunk, this, NULL);
-  ASSERT_TRUE(success);
-
-  success = dbus_server_set_timeout_functions(server_, AddTimeoutThunk,
-                                              RemoveTimeoutThunk,
-                                              TimeoutToggledThunk, this, NULL);
-  ASSERT_TRUE(success);
-
-  // Open a connection to our server, this returns the "client" side of the
-  // connection.
-  conn_ = dbus_connection_open_private(kServerAddress, NULL);
-  ASSERT_TRUE(conn_ != NULL);
-
-  // The "server" side of the connection comes from the NewConnection method
-  // we set above. Dispatch until we have it.
-  while (!server_conn_)
-    DispatchOnce();
-
-  // Now we set off "main loop" in the background to dispatch until the
-  // client is disconnected by the TearDown method.
-  int r;
-  r = pthread_mutex_init(&mutex_, NULL);
-  ASSERT_EQ(0, r);
-
-  dispatch_ = true;
-  r = pthread_create(&thread_id_, NULL, DispatchLoopThunk, this);
-  ASSERT_EQ(0, r);
-}
-
-void DBusTest::TearDown() {
-  WaitForMatches();
-
-  // Close the client end of the connection, this will result in a signal
-  // within the dispatch loop of the server.
-  if (conn_) {
-    dbus_connection_flush(conn_);
-    dbus_connection_close(conn_);
-    dbus_connection_unref(conn_);
-    conn_ = NULL;
-  }
-
-  // Join the thread and wait for it to finish dispatch.
-  if (dispatch_)
-    pthread_join(thread_id_, NULL);
-  pthread_mutex_destroy(&mutex_);
-
-  // Clean up the server end of the connection and the server itself.
-  if (server_conn_) {
-    dbus_connection_flush(server_conn_);
-    dbus_connection_close(server_conn_);
-    dbus_connection_unref(server_conn_);
-    server_conn_ = NULL;
-  }
-
-  dbus_server_disconnect(server_);
-  dbus_server_unref(server_);
-  server_ = NULL;
-
-  dbus_shutdown();
-}
-
-void DBusTest::NewConnectionThunk(DBusServer* server,
-                                  DBusConnection* conn,
-                                  void* data) {
-  DBusTest* test = static_cast<DBusTest*>(data);
-  test->NewConnection(server, conn);
-}
-
-void DBusTest::NewConnection(DBusServer* server, DBusConnection* conn) {
-  ASSERT_TRUE(server_conn_ == NULL);
-
-  dbus_bool_t success;
-  success = dbus_connection_set_watch_functions(
-      conn, AddWatchThunk, RemoveWatchThunk, WatchToggledThunk, this, NULL);
-  ASSERT_TRUE(success);
-
-  success = dbus_connection_set_timeout_functions(
-      conn, AddTimeoutThunk, RemoveTimeoutThunk, TimeoutToggledThunk, this,
-      NULL);
-  ASSERT_TRUE(success);
-
-  success = dbus_connection_add_filter(conn, HandleMessageThunk, this, NULL);
-  ASSERT_TRUE(success);
-
-  server_conn_ = conn;
-  dbus_connection_ref(server_conn_);
-}
-
-dbus_bool_t DBusTest::AddWatchThunk(DBusWatch* watch, void* data) {
-  DBusTest* test = static_cast<DBusTest*>(data);
-  return test->AddWatch(watch);
-}
-
-dbus_bool_t DBusTest::AddWatch(DBusWatch* watch) {
-  watches_.push_back(watch);
-  return TRUE;
-}
-
-void DBusTest::RemoveWatchThunk(DBusWatch* watch, void* data) {
-  DBusTest* test = static_cast<DBusTest*>(data);
-  test->RemoveWatch(watch);
-}
-
-void DBusTest::RemoveWatch(DBusWatch* watch) {
-  std::vector<DBusWatch*>::iterator it =
-      find(watches_.begin(), watches_.end(), watch);
-  if (it != watches_.end())
-    watches_.erase(it);
-}
-
-void DBusTest::WatchToggledThunk(DBusWatch* watch, void* data) {
-  DBusTest* test = static_cast<DBusTest*>(data);
-  test->WatchToggled(watch);
-}
-
-void DBusTest::WatchToggled(DBusWatch* watch) {}
-
-dbus_bool_t DBusTest::AddTimeoutThunk(DBusTimeout* timeout, void* data) {
-  DBusTest* test = static_cast<DBusTest*>(data);
-  return test->AddTimeout(timeout);
-}
-
-dbus_bool_t DBusTest::AddTimeout(DBusTimeout* timeout) {
-  timeouts_.push_back(timeout);
-  return TRUE;
-}
-
-void DBusTest::RemoveTimeoutThunk(DBusTimeout* timeout, void* data) {
-  DBusTest* test = static_cast<DBusTest*>(data);
-  test->RemoveTimeout(timeout);
-}
-
-void DBusTest::RemoveTimeout(DBusTimeout* timeout) {
-  std::vector<DBusTimeout*>::iterator it =
-      find(timeouts_.begin(), timeouts_.end(), timeout);
-  if (it != timeouts_.end())
-    timeouts_.erase(it);
-}
-
-void DBusTest::TimeoutToggledThunk(DBusTimeout* timeout, void* data) {
-  DBusTest* test = static_cast<DBusTest*>(data);
-  test->TimeoutToggled(timeout);
-}
-
-void DBusTest::TimeoutToggled(DBusTimeout* timeout) {}
-
-DBusHandlerResult DBusTest::HandleMessageThunk(DBusConnection* conn,
-                                               DBusMessage* message,
-                                               void* data) {
-  DBusTest* test = static_cast<DBusTest*>(data);
-  return test->HandleMessage(conn, message);
-}
-
-DBusHandlerResult DBusTest::HandleMessage(DBusConnection* conn,
-                                          DBusMessage* message) {
-  if (dbus_message_is_signal(message, DBUS_INTERFACE_LOCAL, "Disconnected")) {
-    dispatch_ = false;
-    return DBUS_HANDLER_RESULT_HANDLED;
-  }
-
-  pthread_mutex_lock(&mutex_);
-  for (std::vector<DBusMatch>::iterator it = matches_.begin();
-       it != matches_.end(); ++it) {
-    DBusMatch& match = *it;
-
-    if (match.HandleServerMessage(conn, message)) {
-      pthread_mutex_unlock(&mutex_);
-      return DBUS_HANDLER_RESULT_HANDLED;
-    }
-  }
-  pthread_mutex_unlock(&mutex_);
-
-  return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-}
-
-void* DBusTest::DispatchLoopThunk(void* ptr) {
-  DBusTest* test = static_cast<DBusTest*>(ptr);
-  return test->DispatchLoop();
-}
-
-void* DBusTest::DispatchLoop() {
-  while (dispatch_)
-    DispatchOnce();
-
-  return NULL;
-}
-
-void DBusTest::DispatchOnce() {
-  fd_set readfds, writefds;
-  int nfds = 0;
-  int r;
-
-  // Ideally we'd just use dbus_connection_read_write_dispatch() here, but
-  // we have to deal with both the server itself and its connection, so we
-  // have to do it all by hand.
-  FD_ZERO(&readfds);
-  FD_ZERO(&writefds);
-
-  for (std::vector<DBusWatch*>::iterator it = watches_.begin();
-       it != watches_.end(); ++it) {
-    DBusWatch* watch = *it;
-
-    if (!dbus_watch_get_enabled(watch))
-      continue;
-
-    int fd = dbus_watch_get_unix_fd(watch);
-    if (fd + 1 > nfds)
-      nfds = fd + 1;
-
-    unsigned int flags = dbus_watch_get_flags(watch);
-    if (flags & DBUS_WATCH_READABLE)
-      FD_SET(fd, &readfds);
-    if (flags & DBUS_WATCH_WRITABLE)
-      FD_SET(fd, &writefds);
-  }
-
-  // Only block in select for the interval of the smallest timeout; this
-  // isn't quite right according to the D-Bus spec, since the interval is
-  // supposed to be since the time the timeout was added or toggled, but
-  // it's good enough for the purposes of testing.
-  DBusTimeout* earliest_timeout = NULL;
-  struct timeval timeval;
-
-  for (std::vector<DBusTimeout*>::iterator it = timeouts_.begin();
-       it != timeouts_.end(); ++it) {
-    DBusTimeout* timeout = *it;
-
-    if (!dbus_timeout_get_enabled(timeout))
-      continue;
-
-    if (!earliest_timeout || (dbus_timeout_get_interval(timeout) <
-                              dbus_timeout_get_interval(earliest_timeout)))
-      earliest_timeout = timeout;
-  }
-
-  if (earliest_timeout) {
-    int interval = dbus_timeout_get_interval(earliest_timeout);
-    timeval.tv_sec = interval / 1000;
-    timeval.tv_usec = (interval % 1000) * 1000;
-
-    r = select(nfds, &readfds, &writefds, NULL, &timeval);
-  } else {
-    r = select(nfds, &readfds, &writefds, NULL, NULL);
-  }
-
-  ASSERT_LE(0, r);
-
-  // Handle the timeout if we didn't poll for anything else.
-  if (r == 0 && earliest_timeout)
-    dbus_timeout_handle(earliest_timeout);
-
-  // Handle the watches, use a copy of the vector since a watch handler
-  // might remove other watches in the vector.
-  std::vector<DBusWatch*> immutable_watches = watches_;
-  for (std::vector<DBusWatch*>::iterator it = immutable_watches.begin();
-       it != immutable_watches.end(); ++it) {
-    DBusWatch* watch = *it;
-
-    int fd = dbus_watch_get_unix_fd(watch);
-    unsigned int flags = 0;
-
-    if (FD_ISSET(fd, &readfds))
-      flags |= DBUS_WATCH_READABLE;
-    if (FD_ISSET(fd, &writefds))
-      flags |= DBUS_WATCH_WRITABLE;
-
-    if (flags)
-      dbus_watch_handle(watch, flags);
-  }
-
-  // Dispatch data on the server-side of the connection.
-  while (server_conn_ &&
-         dbus_connection_dispatch(server_conn_) == DBUS_DISPATCH_DATA_REMAINS)
-    ;
-}
diff --git a/cras/src/tests/dbus_test.h b/cras/src/tests/dbus_test.h
deleted file mode 100644
index d266037..0000000
--- a/cras/src/tests/dbus_test.h
+++ /dev/null
@@ -1,325 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef CRAS_DBUS_TEST_H_
-#define CRAS_DBUS_TEST_H_
-
-#include <dbus/dbus.h>
-#include <gtest/gtest.h>
-#include <pthread.h>
-#include <stdint.h>
-
-#include <string>
-#include <vector>
-
-/* DBusTest, and the related DBusMatch class, are used to provide a
- * GMock-like experience for testing D-Bus code within cras.
- *
- * It works by providing a connection to a private D-Bus Server for use
- * by code you intend to test. Before making calls, you set expectations
- * of method calls that the server should receive and reply to, or
- * instructions for the server to send signals that your connection
- * should receive and handle.
- *
- * The code style is similar to GMock for purposes of familiarity.
- *
- * Examples
- * --------
- *
- * To create a test suite class implementing a SetUp and TearDown method,
- * be sure to call the base-class methods at the appropriate time.
- *
- *   class ExampleTestSuite : public DBusTest {
- *     virtual void SetUp() {
- *       DBusTest::SetUp();
- *       // your setup code here
- *     }
- *
- *     virtual void TearDown() {
- *       // your teardown code here
- *       DBusTest::TearDown();
- *     }
- *   };
- *
- * To expect a method call to be made against the server; matching the
- * object path, interface and method name and then generating an empty
- * reply. The test code ensures that the reply is received during the
- * TearDown method.
- *
- *   TEST_F(ExampleTestSuite, ExampleTest) {
- *     ExpectMethodCall("/object/path", "object.Interface", "MethodName")
- *         .SendReply();
- *
- *     // code to generate the method call here
- *   }
- *
- * Due to the asynchronous nature of D-Bus, if you need to check some
- * state, it's not enough to immediately follow the code that generates
- * the method call. You must instead ensure that all expectations up to
- * that point have been met:
- *
- *   TEST_F(ExampleTestSuite, ExampleTest) {
- *     ExpectMethodCall("/object/path", "object.Interface", "MethodName")
- *         .SendReply();
- *
- *     // code to generate the method call here
- *
- *     WaitForMatches();
- *
- *     // code to examine state here
- *   }
- *
- * To verify the arguments to method calls, place .With*() calls before
- * sending the reply:
- *
- *   ExpectMethodCall("/object/path", "object.Interface", "MethodName")
- *       .WithObjectPath("/arg0/object/path")
- *       .WithString("arg1")
- *       .WithString("arg2")
- *       .SendReply();
- *
- * Normally additional arguments are permitted, since most D-Bus services
- * don't go out of their way to check they aren't provided; to verify
- * there are no more arguments use .WithNoMoreArgs():
- *
- *   ExpectMethodCall("/object/path", "object.Interface", "MethodName")
- *       .WithString("arg0")
- *       .WithNoMoreArgs()
- *       .SendReply();
- *
- * To append arguments to the reply, place .With*() calls after the
- * instruction to send the reply:
- *
- *   ExpectMethodCall("/object/path", "object.Interface", "MethodName")
- *       .SendReply()
- *       .WithString("arg0")
- *       .WithObjectPath("/arg1/object/path");
- *
- * Property dictionaries are sufficiently difficult to deal with that
- * there is special handling for them; to append one to the reply use
- * .AsPropertyDictionary() and follow with alternate .WithString() and
- * other .With*() calls for each property:
- *
- *  ExpectMethodCall("/object/path", "object.Interface", "GetProperties")
- *       .SendReply()
- *       .AsPropertyDictionary()
- *       .WithString("Keyword")
- *       .WithObjectPath("/value/of/keyword");
- *
- * To reply with an error use .SendError() instead of .SendReply(),
- * passing the error name and message
- *
- *   ExpectMethodCall("/object/path", "object.Interface", "MethodName")
- *       .SendError("some.error.Name", "Message for error");
- *
- * In some cases (notably "AddMatch" method calls) the method call will
- * be handled by libdbus itself and the mechanism DBusTest uses to verify
- * that the reply is recieved does not work. In which case you need to use
- * .SendReplyNoWait() instead.
- *
- *    ExpectMethodCall("", DBUS_INTERFACE_DBUS, "AddMatch")
- *        .SendReplyNoWait();
- *
- * Sending signals from the server side is very similar:
- *
- *    CreateSignal("/object/path", "object.Interface", "SignalName")
- *        .WithString("arg0")
- *        .WithObjectPat("/arg1/object/path")
- *        .Send();
- *
- * Create messages from server side:
- *    CreateMessageCall("/object/path". "object.Interface", "MethodName")
- *        .WithString("arg0")
- *        .WithUnixFd(arg1)
- *        .Send();
- *
- * The TearDown() method will verify that it is received by the client,
- * use WaitForMatches() to force verification earlier in order to check
- * state.
- */
-
-class DBusTest;
-
-class DBusMatch {
- public:
-  DBusMatch();
-
-  struct Arg {
-    int type;
-    bool array;
-    std::string string_value;
-    int int_value;
-    std::vector<std::string> string_values;
-  };
-
-  // Append arguments to a match.
-  DBusMatch& WithString(std::string value);
-  DBusMatch& WithUnixFd(int value);
-  DBusMatch& WithObjectPath(std::string value);
-  DBusMatch& WithArrayOfStrings(std::vector<std::string> values);
-  DBusMatch& WithArrayOfObjectPaths(std::vector<std::string> values);
-  DBusMatch& WithNoMoreArgs();
-
-  // Indicates that all arguments in either the method call or reply
-  // should be wrapped into a property dictionary with a string for keys
-  // and a variant for the data.
-  DBusMatch& AsPropertyDictionary();
-
-  // Send a reply to a method call and wait for it to be received by the
-  // client; may be followed by methods to append arguments.
-  DBusMatch& SendReply();
-
-  // Send an error in reply to a method call and wait for it to be received
-  // by the client; may also be followed by methods to append arguments.
-  DBusMatch& SendError(std::string error_name, std::string error_message);
-
-  // Send a reply to a method call but do not wait for it to be received;
-  // mostly needed for internal D-Bus messages.
-  DBusMatch& SendReplyNoWait();
-
-  // Send a created signal.
-  DBusMatch& Send();
-
- private:
-  friend class DBusTest;
-
-  // Methods used by DBusTest after constructing the DBusMatch instance
-  // to set the type of match.
-  void ExpectMethodCall(std::string path,
-                        std::string interface,
-                        std::string method);
-
-  void CreateSignal(DBusConnection* conn,
-                    std::string path,
-                    std::string interface,
-                    std::string signal_name);
-
-  void CreateMessageCall(DBusConnection* conn,
-                         std::string path,
-                         std::string interface,
-                         std::string signal_name);
-
-  // Determine whether a message matches a set of arguments.
-  bool MatchMessageArgs(DBusMessage* message, std::vector<Arg>* args);
-
-  // Append a set of arguments to a message.
-  void AppendArgsToMessage(DBusMessage* message, std::vector<Arg>* args);
-
-  // Send a message on a connection.
-  void SendMessage(DBusConnection* conn, DBusMessage* message);
-
-  // Handle a message received by the server connection.
-  bool HandleServerMessage(DBusConnection* conn, DBusMessage* message);
-
-  // Handle a message received by the client connection.
-  bool HandleClientMessage(DBusConnection* conn, DBusMessage* message);
-
-  // Verify whether the match is complete.
-  bool Complete();
-
-  int message_type_;
-  std::string path_;
-  std::string interface_;
-  std::string member_;
-
-  bool as_property_dictionary_;
-  std::vector<Arg> args_;
-
-  DBusConnection* conn_;
-
-  bool send_reply_;
-  std::vector<Arg> reply_args_;
-
-  bool send_error_;
-  std::string error_name_;
-  std::string error_message_;
-
-  bool expect_serial_;
-  std::vector<dbus_uint32_t> expected_serials_;
-
-  bool matched_;
-};
-
-class DBusTest : public ::testing::Test {
- public:
-  DBusTest();
-  virtual ~DBusTest();
-
- protected:
-  // Connection to the D-Bus server, this may be used during tests as the
-  // "bus" connection, all messages go to and from the internal D-Bus server.
-  DBusConnection* conn_;
-
-  // Expect a method call to be received by the server.
-  DBusMatch& ExpectMethodCall(std::string path,
-                              std::string interface,
-                              std::string method);
-
-  // Send a signal from the client to the server.
-  DBusMatch& CreateSignal(std::string path,
-                          std::string interface,
-                          std::string signal_name);
-
-  // Send a message from the client to the server.
-  DBusMatch& CreateMessageCall(std::string path,
-                               std::string interface,
-                               std::string signal_name);
-
-  // Wait for all matches created by Expect*() or Create*() methods to
-  // be complete.
-  void WaitForMatches();
-
-  // When overriding be sure to call these parent methods to allow the
-  // D-Bus server thread to be cleanly initialized and shut down.
-  virtual void SetUp();
-  virtual void TearDown();
-
- private:
-  DBusServer* server_;
-  DBusConnection* server_conn_;
-
-  std::vector<DBusWatch*> watches_;
-  std::vector<DBusTimeout*> timeouts_;
-
-  pthread_t thread_id_;
-  pthread_mutex_t mutex_;
-  bool dispatch_;
-
-  std::vector<DBusMatch> matches_;
-
-  static void NewConnectionThunk(DBusServer* server,
-                                 DBusConnection* conn,
-                                 void* data);
-  void NewConnection(DBusServer* server, DBusConnection* conn);
-
-  static dbus_bool_t AddWatchThunk(DBusWatch* watch, void* data);
-  dbus_bool_t AddWatch(DBusWatch* watch);
-
-  static void RemoveWatchThunk(DBusWatch* watch, void* data);
-  void RemoveWatch(DBusWatch* watch);
-
-  static void WatchToggledThunk(DBusWatch* watch, void* data);
-  void WatchToggled(DBusWatch* watch);
-
-  static dbus_bool_t AddTimeoutThunk(DBusTimeout* timeout, void* data);
-  dbus_bool_t AddTimeout(DBusTimeout* timeout);
-
-  static void RemoveTimeoutThunk(DBusTimeout* timeout, void* data);
-  void RemoveTimeout(DBusTimeout* timeout);
-
-  static void TimeoutToggledThunk(DBusTimeout* timeout, void* data);
-  void TimeoutToggled(DBusTimeout* timeout);
-
-  static DBusHandlerResult HandleMessageThunk(DBusConnection* conn,
-                                              DBusMessage* message,
-                                              void* data);
-  DBusHandlerResult HandleMessage(DBusConnection* conn, DBusMessage* message);
-
-  static void* DispatchLoopThunk(void* ptr);
-  void* DispatchLoop();
-  void DispatchOnce();
-};
-
-#endif /* CRAS_DBUS_TEST_H_ */
diff --git a/cras/src/tests/dev_io_stubs.cc b/cras/src/tests/dev_io_stubs.cc
deleted file mode 100644
index d97dde5..0000000
--- a/cras/src/tests/dev_io_stubs.cc
+++ /dev/null
@@ -1,169 +0,0 @@
-// Copyright 2017 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <stdint.h>
-#include <stdio.h>
-#include <time.h>
-
-#include <algorithm>
-#include <memory>
-
-extern "C" {
-#include "cras_iodev.h"
-#include "cras_rstream.h"
-#include "cras_shm.h"
-#include "cras_types.h"
-#include "dev_stream.h"
-#include "utlist.h"
-}
-
-#include "dev_io_stubs.h"
-
-ShmPtr create_shm(size_t cb_threshold) {
-  uint32_t frame_bytes = 4;
-  uint32_t used_size = cb_threshold * 2 * frame_bytes;
-
-  ShmPtr shm(reinterpret_cast<struct cras_audio_shm*>(
-                 calloc(1, sizeof(struct cras_audio_shm))),
-             destroy_shm);
-
-  shm->header = reinterpret_cast<struct cras_audio_shm_header*>(
-      calloc(1, sizeof(struct cras_audio_shm_header)));
-  shm->header->config.used_size = used_size;
-  shm->header->config.frame_bytes = frame_bytes;
-  shm->config = shm->header->config;
-
-  uint32_t samples_size = cras_shm_calculate_samples_size(used_size);
-  shm->samples = reinterpret_cast<uint8_t*>(calloc(1, samples_size));
-  shm->samples_info.length = samples_size;
-  return shm;
-}
-
-void destroy_shm(struct cras_audio_shm* shm) {
-  free(shm->header);
-  free(shm->samples);
-  free(shm);
-}
-
-RstreamPtr create_rstream(cras_stream_id_t id,
-                          CRAS_STREAM_DIRECTION direction,
-                          size_t cb_threshold,
-                          const cras_audio_format* format,
-                          cras_audio_shm* shm) {
-  RstreamPtr rstream(
-      reinterpret_cast<cras_rstream*>(calloc(1, sizeof(cras_rstream))), free);
-  rstream->stream_id = id;
-  rstream->direction = direction;
-  rstream->fd = RSTREAM_FAKE_POLL_FD;
-  rstream->buffer_frames = cb_threshold * 2;
-  rstream->cb_threshold = cb_threshold;
-  rstream->shm = shm;
-  rstream->format = *format;
-  cras_frames_to_time(cb_threshold, rstream->format.frame_rate,
-                      &rstream->sleep_interval_ts);
-  return rstream;
-}
-
-DevStreamPtr create_dev_stream(unsigned int dev_id, cras_rstream* rstream) {
-  DevStreamPtr dstream(
-      reinterpret_cast<dev_stream*>(calloc(1, sizeof(dev_stream))), free);
-  dstream->dev_id = dev_id;
-  dstream->stream = rstream;
-  dstream->dev_rate = rstream->format.frame_rate;
-  dstream->is_running = true;
-  return dstream;
-}
-
-StreamPtr create_stream(cras_stream_id_t id,
-                        unsigned int dev_id,
-                        CRAS_STREAM_DIRECTION direction,
-                        size_t cb_threshold,
-                        const cras_audio_format* format) {
-  ShmPtr shm = create_shm(cb_threshold);
-  RstreamPtr rstream =
-      create_rstream(1, CRAS_STREAM_INPUT, cb_threshold, format, shm.get());
-  DevStreamPtr dstream = create_dev_stream(1, rstream.get());
-  StreamPtr s(
-      new Stream(std::move(shm), std::move(rstream), std::move(dstream)));
-  return s;
-}
-
-void AddFakeDataToStream(Stream* stream, unsigned int frames) {
-  cras_shm_check_write_overrun(stream->rstream->shm);
-  cras_shm_buffer_written(stream->rstream->shm, frames);
-}
-
-int delay_frames_stub(const struct cras_iodev* iodev) {
-  return 0;
-}
-
-IonodePtr create_ionode(CRAS_NODE_TYPE type) {
-  IonodePtr ionode(
-      reinterpret_cast<cras_ionode*>(calloc(1, sizeof(cras_ionode))), free);
-  ionode->type = type;
-  return ionode;
-}
-
-int fake_flush_buffer(struct cras_iodev* iodev) {
-  return 0;
-}
-
-IodevPtr create_open_iodev(CRAS_STREAM_DIRECTION direction,
-                           size_t cb_threshold,
-                           cras_audio_format* format,
-                           cras_ionode* active_node) {
-  IodevPtr iodev(reinterpret_cast<cras_iodev*>(calloc(1, sizeof(cras_iodev))),
-                 free);
-  iodev->is_enabled = 1;
-  iodev->direction = direction;
-  iodev->format = format;
-  iodev->state = CRAS_IODEV_STATE_OPEN;
-  iodev->delay_frames = delay_frames_stub;
-  iodev->active_node = active_node;
-  iodev->buffer_size = cb_threshold * 2;
-  iodev->min_cb_level = UINT_MAX;
-  iodev->max_cb_level = 0;
-  iodev->largest_cb_level = 0;
-  iodev->flush_buffer = &fake_flush_buffer;
-  return iodev;
-}
-
-DevicePtr create_device(CRAS_STREAM_DIRECTION direction,
-                        size_t cb_threshold,
-                        cras_audio_format* format,
-                        CRAS_NODE_TYPE active_node_type) {
-  IonodePtr node = create_ionode(active_node_type);
-  IodevPtr dev = create_open_iodev(direction, cb_threshold, format, node.get());
-  OpendevPtr odev(reinterpret_cast<open_dev*>(calloc(1, sizeof(open_dev))),
-                  free);
-  odev->dev = dev.get();
-
-  DevicePtr d(new Device(std::move(dev), std::move(node), std::move(odev)));
-  return d;
-}
-
-void add_stream_to_dev(IodevPtr& dev, const StreamPtr& stream) {
-  DL_APPEND(dev->streams, stream->dstream.get());
-  dev->min_cb_level = std::min(stream->rstream->cb_threshold,
-                               static_cast<size_t>(dev->min_cb_level));
-  dev->max_cb_level = std::max(stream->rstream->cb_threshold,
-                               static_cast<size_t>(dev->max_cb_level));
-  dev->largest_cb_level = std::max(stream->rstream->cb_threshold,
-                                   static_cast<size_t>(dev->max_cb_level));
-
-  if (stream->rstream->main_dev.dev_id == NO_DEVICE) {
-    stream->rstream->main_dev.dev_id = dev->info.idx;
-    stream->rstream->main_dev.dev_ptr = dev.get();
-  }
-}
-
-void fill_audio_format(cras_audio_format* format, unsigned int rate) {
-  format->format = SND_PCM_FORMAT_S16_LE;
-  format->frame_rate = rate;
-  format->num_channels = 2;
-  format->channel_layout[0] = 0;
-  format->channel_layout[1] = 1;
-  for (int i = 2; i < CRAS_CH_MAX; i++)
-    format->channel_layout[i] = -1;
-}
diff --git a/cras/src/tests/dev_io_stubs.h b/cras/src/tests/dev_io_stubs.h
deleted file mode 100644
index 9db193c..0000000
--- a/cras/src/tests/dev_io_stubs.h
+++ /dev/null
@@ -1,81 +0,0 @@
-// Copyright 2017 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <stdint.h>
-#include <stdio.h>
-#include <time.h>
-
-#include <memory>
-
-extern "C" {
-#include "cras_iodev.h"
-#include "cras_rstream.h"
-#include "cras_shm.h"
-#include "cras_types.h"
-#include "dev_io.h"
-#include "dev_stream.h"
-#include "utlist.h"
-}
-
-#include "iodev_stub.h"
-#include "rstream_stub.h"
-
-#define RSTREAM_FAKE_POLL_FD 33
-
-using DevStreamPtr = std::unique_ptr<dev_stream, decltype(free)*>;
-using IodevPtr = std::unique_ptr<cras_iodev, decltype(free)*>;
-using IonodePtr = std::unique_ptr<cras_ionode, decltype(free)*>;
-using OpendevPtr = std::unique_ptr<open_dev, decltype(free)*>;
-using RstreamPtr = std::unique_ptr<cras_rstream, decltype(free)*>;
-
-void destroy_shm(struct cras_audio_shm* shm);
-using ShmPtr = std::unique_ptr<cras_audio_shm, decltype(destroy_shm)*>;
-ShmPtr create_shm(size_t cb_threshold);
-
-// Holds the rstream and devstream pointers for an attached stream.
-struct Stream {
-  Stream(ShmPtr shm, RstreamPtr rstream, DevStreamPtr dstream)
-      : shm(std::move(shm)),
-        rstream(std::move(rstream)),
-        dstream(std::move(dstream)) {}
-  ShmPtr shm;
-  RstreamPtr rstream;
-  DevStreamPtr dstream;
-};
-using StreamPtr = std::unique_ptr<Stream>;
-
-// Holds the iodev and ionode pointers for an attached device.
-struct Device {
-  Device(IodevPtr dev, IonodePtr node, OpendevPtr odev)
-      : dev(std::move(dev)), node(std::move(node)), odev(std::move(odev)) {}
-  IodevPtr dev;
-  IonodePtr node;
-  OpendevPtr odev;
-};
-using DevicePtr = std::unique_ptr<Device>;
-
-RstreamPtr create_rstream(cras_stream_id_t id,
-                          CRAS_STREAM_DIRECTION direction,
-                          size_t cb_threshold,
-                          const cras_audio_format* format,
-                          cras_audio_shm* shm);
-DevStreamPtr create_dev_stream(unsigned int dev_id, cras_rstream* rstream);
-StreamPtr create_stream(cras_stream_id_t id,
-                        unsigned int dev_id,
-                        CRAS_STREAM_DIRECTION direction,
-                        size_t cb_threshold,
-                        const cras_audio_format* format);
-void AddFakeDataToStream(Stream* stream, unsigned int frames);
-int delay_frames_stub(const struct cras_iodev* iodev);
-IonodePtr create_ionode(CRAS_NODE_TYPE type);
-IodevPtr create_open_iodev(CRAS_STREAM_DIRECTION direction,
-                           size_t cb_threshold,
-                           cras_audio_format* format,
-                           cras_ionode* active_node);
-DevicePtr create_device(CRAS_STREAM_DIRECTION direction,
-                        size_t cb_threshold,
-                        cras_audio_format* format,
-                        CRAS_NODE_TYPE active_node_type);
-void add_stream_to_dev(IodevPtr& dev, const StreamPtr& stream);
-void fill_audio_format(cras_audio_format* format, unsigned int rate);
diff --git a/cras/src/tests/dev_io_unittest.cc b/cras/src/tests/dev_io_unittest.cc
deleted file mode 100644
index 2dbf344..0000000
--- a/cras/src/tests/dev_io_unittest.cc
+++ /dev/null
@@ -1,468 +0,0 @@
-// Copyright 2017 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <gtest/gtest.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <time.h>
-
-#include <memory>
-#include <unordered_map>
-
-extern "C" {
-#include "cras_iodev.h"    // stubbed
-#include "cras_rstream.h"  // stubbed
-#include "cras_shm.h"
-#include "cras_types.h"
-#include "dev_io.h"      // tested
-#include "dev_stream.h"  // stubbed
-#include "utlist.h"
-
-struct audio_thread_event_log* atlog;
-}
-
-#include "dev_io_stubs.h"
-#include "iodev_stub.h"
-#include "metrics_stub.h"
-#include "rstream_stub.h"
-
-static float dev_stream_capture_software_gain_scaler_val;
-static float input_data_get_software_gain_scaler_val;
-static unsigned int dev_stream_capture_avail_ret = 480;
-struct set_dev_rate_data {
-  unsigned int dev_rate;
-  double dev_rate_ratio;
-  double main_rate_ratio;
-  int coarse_rate_adjust;
-};
-std::unordered_map<struct dev_stream*, set_dev_rate_data> set_dev_rate_map;
-
-namespace {
-
-class DevIoSuite : public testing::Test {
- protected:
-  virtual void SetUp() {
-    atlog = static_cast<audio_thread_event_log*>(calloc(1, sizeof(*atlog)));
-    iodev_stub_reset();
-    rstream_stub_reset();
-    fill_audio_format(&format, 48000);
-    set_dev_rate_map.clear();
-    stream = create_stream(1, 1, CRAS_STREAM_INPUT, cb_threshold, &format);
-  }
-
-  virtual void TearDown() { free(atlog); }
-
-  size_t cb_threshold = 480;
-  cras_audio_format format;
-  StreamPtr stream;
-};
-
-TEST_F(DevIoSuite, SendCapturedFails) {
-  // rstream's next callback is now and there is enough data to fill.
-  struct timespec start;
-  clock_gettime(CLOCK_MONOTONIC_RAW, &start);
-  stream->rstream->next_cb_ts = start;
-  AddFakeDataToStream(stream.get(), 480);
-
-  struct open_dev* dev_list = NULL;
-  DevicePtr dev = create_device(CRAS_STREAM_INPUT, cb_threshold, &format,
-                                CRAS_NODE_TYPE_MIC);
-  DL_APPEND(dev_list, dev->odev.get());
-  add_stream_to_dev(dev->dev, stream);
-
-  // Set failure response from frames_queued.
-  iodev_stub_frames_queued(dev->dev.get(), -3, start);
-
-  EXPECT_EQ(-3, dev_io_send_captured_samples(dev_list));
-}
-
-TEST_F(DevIoSuite, CaptureGain) {
-  struct open_dev* dev_list = NULL;
-  struct open_dev* odev_list = NULL;
-  struct timespec ts;
-  DevicePtr dev = create_device(CRAS_STREAM_INPUT, cb_threshold, &format,
-                                CRAS_NODE_TYPE_MIC);
-
-  dev->dev->state = CRAS_IODEV_STATE_NORMAL_RUN;
-  iodev_stub_frames_queued(dev->dev.get(), 20, ts);
-  DL_APPEND(dev_list, dev->odev.get());
-  add_stream_to_dev(dev->dev, stream);
-
-  /* The applied scaler gain should match what is reported by input_data. */
-  dev->dev->active_node->ui_gain_scaler = 1.0f;
-  input_data_get_software_gain_scaler_val = 1.0f;
-  dev_io_capture(&dev_list, &odev_list);
-  EXPECT_EQ(1.0f, dev_stream_capture_software_gain_scaler_val);
-
-  input_data_get_software_gain_scaler_val = 0.99f;
-  dev_io_capture(&dev_list, &odev_list);
-  EXPECT_EQ(0.99f, dev_stream_capture_software_gain_scaler_val);
-
-  dev->dev->active_node->ui_gain_scaler = 0.6f;
-  input_data_get_software_gain_scaler_val = 0.7f;
-  dev_io_capture(&dev_list, &odev_list);
-  EXPECT_FLOAT_EQ(0.42f, dev_stream_capture_software_gain_scaler_val);
-}
-
-/*
- * When input and output devices are on the internal sound card,
- * and their device rates are the same, use the estimated rate
- * on the output device as the estimated rate of input device.
- */
-TEST_F(DevIoSuite, CopyOutputEstimatedRate) {
-  struct open_dev* idev_list = NULL;
-  struct open_dev* odev_list = NULL;
-  struct timespec ts;
-  DevicePtr out_dev = create_device(CRAS_STREAM_OUTPUT, cb_threshold, &format,
-                                    CRAS_NODE_TYPE_INTERNAL_SPEAKER);
-  DevicePtr in_dev = create_device(CRAS_STREAM_INPUT, cb_threshold, &format,
-                                   CRAS_NODE_TYPE_MIC);
-
-  in_dev->dev->state = CRAS_IODEV_STATE_NORMAL_RUN;
-  iodev_stub_frames_queued(in_dev->dev.get(), 20, ts);
-  DL_APPEND(idev_list, in_dev->odev.get());
-  add_stream_to_dev(in_dev->dev, stream);
-  DL_APPEND(odev_list, out_dev->odev.get());
-  iodev_stub_on_internal_card(out_dev->dev->active_node, 1);
-  iodev_stub_on_internal_card(in_dev->dev->active_node, 1);
-
-  iodev_stub_est_rate_ratio(in_dev->dev.get(), 0.8f);
-  iodev_stub_est_rate_ratio(out_dev->dev.get(), 1.2f);
-
-  dev_io_capture(&idev_list, &odev_list);
-
-  EXPECT_FLOAT_EQ(1.2f, set_dev_rate_map[stream->dstream.get()].dev_rate_ratio);
-}
-
-/*
- * When input and output devices are not both on the internal sound card,
- * estimated rates are independent.
- */
-TEST_F(DevIoSuite, InputOutputIndependentEstimatedRate) {
-  struct open_dev* idev_list = NULL;
-  struct open_dev* odev_list = NULL;
-  struct timespec ts;
-  DevicePtr out_dev = create_device(CRAS_STREAM_OUTPUT, cb_threshold, &format,
-                                    CRAS_NODE_TYPE_INTERNAL_SPEAKER);
-  DevicePtr in_dev = create_device(CRAS_STREAM_INPUT, cb_threshold, &format,
-                                   CRAS_NODE_TYPE_USB);
-
-  in_dev->dev->state = CRAS_IODEV_STATE_NORMAL_RUN;
-  iodev_stub_frames_queued(in_dev->dev.get(), 20, ts);
-  DL_APPEND(idev_list, in_dev->odev.get());
-  add_stream_to_dev(in_dev->dev, stream);
-  DL_APPEND(odev_list, out_dev->odev.get());
-  iodev_stub_on_internal_card(out_dev->dev->active_node, 1);
-  iodev_stub_on_internal_card(in_dev->dev->active_node, 0);
-
-  iodev_stub_est_rate_ratio(in_dev->dev.get(), 0.8f);
-  iodev_stub_est_rate_ratio(out_dev->dev.get(), 1.2f);
-  iodev_stub_update_rate(in_dev->dev.get(), 1);
-
-  dev_io_capture(&idev_list, &odev_list);
-
-  EXPECT_FLOAT_EQ(0.8f, set_dev_rate_map[stream->dstream.get()].dev_rate_ratio);
-}
-
-/*
- * If any hw_level is larger than 1.5 * largest_cb_level and
- * DROP_FRAMES_THRESHOLD_MS, reset all input devices.
- */
-TEST_F(DevIoSuite, SendCapturedNeedToResetDevices) {
-  struct timespec start;
-  struct timespec drop_time;
-  struct open_dev* dev_list = NULL;
-  bool rc;
-
-  clock_gettime(CLOCK_MONOTONIC_RAW, &start);
-  AddFakeDataToStream(stream.get(), 0);
-
-  DevicePtr dev1 =
-      create_device(CRAS_STREAM_INPUT, 1000, &format, CRAS_NODE_TYPE_MIC);
-  DevicePtr dev2 =
-      create_device(CRAS_STREAM_INPUT, 10000, &format, CRAS_NODE_TYPE_MIC);
-  DL_APPEND(dev_list, dev1->odev.get());
-  DL_APPEND(dev_list, dev2->odev.get());
-  add_stream_to_dev(dev1->dev, stream);
-  add_stream_to_dev(dev2->dev, stream);
-
-  iodev_stub_frames_queued(dev1->dev.get(), 2880, start);
-  iodev_stub_frames_queued(dev2->dev.get(), 4800, start);
-  EXPECT_EQ(0, dev_io_send_captured_samples(dev_list));
-
-  /*
-   * Should drop frames to one min_cb_level, which is MIN(2880, 4800) - 480 =
-   * 2400 (50ms).
-   */
-  rc = iodev_stub_get_drop_time(dev1->dev.get(), &drop_time);
-  EXPECT_EQ(true, rc);
-  EXPECT_EQ(0, drop_time.tv_sec);
-  EXPECT_EQ(50000000, drop_time.tv_nsec);
-
-  rc = iodev_stub_get_drop_time(dev2->dev.get(), &drop_time);
-  EXPECT_EQ(true, rc);
-  EXPECT_EQ(0, drop_time.tv_sec);
-  EXPECT_EQ(50000000, drop_time.tv_nsec);
-}
-
-/*
- * If any hw_level is larger than 0.5 * buffer_size and
- * DROP_FRAMES_THRESHOLD_MS, reset all input devices.
- */
-
-TEST_F(DevIoSuite, SendCapturedNeedToResetDevices2) {
-  struct timespec start;
-  struct timespec drop_time;
-  struct open_dev* dev_list = NULL;
-  bool rc;
-
-  stream = create_stream(1, 1, CRAS_STREAM_INPUT, 2000, &format);
-
-  clock_gettime(CLOCK_MONOTONIC_RAW, &start);
-  AddFakeDataToStream(stream.get(), 0);
-
-  DevicePtr dev1 =
-      create_device(CRAS_STREAM_INPUT, 2048, &format, CRAS_NODE_TYPE_MIC);
-  DevicePtr dev2 =
-      create_device(CRAS_STREAM_INPUT, 10000, &format, CRAS_NODE_TYPE_MIC);
-  DL_APPEND(dev_list, dev1->odev.get());
-  DL_APPEND(dev_list, dev2->odev.get());
-  add_stream_to_dev(dev1->dev, stream);
-  add_stream_to_dev(dev2->dev, stream);
-
-  iodev_stub_frames_queued(dev1->dev.get(), 2480, start);
-  iodev_stub_frames_queued(dev2->dev.get(), 2480, start);
-  EXPECT_EQ(0, dev_io_send_captured_samples(dev_list));
-
-  /*
-   * Should drop frames to one min_cb_level, which is 2480 - 2000 = 480 (10ms).
-   */
-  rc = iodev_stub_get_drop_time(dev1->dev.get(), &drop_time);
-  EXPECT_EQ(true, rc);
-  EXPECT_EQ(0, drop_time.tv_sec);
-  EXPECT_EQ(10000000, drop_time.tv_nsec);
-
-  rc = iodev_stub_get_drop_time(dev2->dev.get(), &drop_time);
-  EXPECT_EQ(true, rc);
-  EXPECT_EQ(0, drop_time.tv_sec);
-  EXPECT_EQ(10000000, drop_time.tv_nsec);
-}
-
-/*
- * If the hw_level is larger than 1.5 * largest_cb_level but less than
- * DROP_FRAMES_THRESHOLD_MS, do nothing.
- */
-TEST_F(DevIoSuite, SendCapturedLevelLessThanThreshold) {
-  struct timespec start;
-  struct timespec drop_time;
-  struct open_dev* dev_list = NULL;
-  bool rc;
-
-  clock_gettime(CLOCK_MONOTONIC_RAW, &start);
-  AddFakeDataToStream(stream.get(), 0);
-
-  DevicePtr dev =
-      create_device(CRAS_STREAM_INPUT, 480, &format, CRAS_NODE_TYPE_MIC);
-  DL_APPEND(dev_list, dev->odev.get());
-  add_stream_to_dev(dev->dev, stream);
-
-  iodev_stub_frames_queued(dev->dev.get(), 2048, start);
-  EXPECT_EQ(0, dev_io_send_captured_samples(dev_list));
-
-  rc = iodev_stub_get_drop_time(dev->dev.get(), &drop_time);
-  EXPECT_EQ(false, rc);
-}
-
-/*
- * If all hw_level is less than 1.5 * largest_cb_level and 0.5 * buffer_size,
- * do nothing.
- */
-TEST_F(DevIoSuite, SendCapturedNoNeedToResetDevices) {
-  struct timespec start;
-  struct timespec drop_time;
-  struct open_dev* dev_list = NULL;
-  bool rc;
-
-  clock_gettime(CLOCK_MONOTONIC_RAW, &start);
-  AddFakeDataToStream(stream.get(), 0);
-
-  DevicePtr dev1 =
-      create_device(CRAS_STREAM_INPUT, 1000, &format, CRAS_NODE_TYPE_MIC);
-  DevicePtr dev2 =
-      create_device(CRAS_STREAM_INPUT, 10000, &format, CRAS_NODE_TYPE_MIC);
-  DL_APPEND(dev_list, dev1->odev.get());
-  DL_APPEND(dev_list, dev2->odev.get());
-  add_stream_to_dev(dev1->dev, stream);
-  add_stream_to_dev(dev2->dev, stream);
-
-  iodev_stub_frames_queued(dev1->dev.get(), 400, start);
-  iodev_stub_frames_queued(dev2->dev.get(), 400, start);
-  EXPECT_EQ(0, dev_io_send_captured_samples(dev_list));
-
-  rc = iodev_stub_get_drop_time(dev1->dev.get(), &drop_time);
-  EXPECT_EQ(false, rc);
-
-  rc = iodev_stub_get_drop_time(dev2->dev.get(), &drop_time);
-  EXPECT_EQ(false, rc);
-}
-
-/*
- * On loopback and hotword devices, if any hw_level is larger than
- *  1.5 * largest_cb_level and DROP_FRAMES_THRESHOLD_MS, do nothing.
- */
-TEST_F(DevIoSuite, SendCapturedNoNeedToDrop) {
-  struct timespec start;
-  struct timespec drop_time;
-  struct open_dev* dev_list = NULL;
-  bool rc;
-
-  clock_gettime(CLOCK_MONOTONIC_RAW, &start);
-  AddFakeDataToStream(stream.get(), 0);
-
-  DevicePtr dev1 =
-      create_device(CRAS_STREAM_INPUT, 480, &format, CRAS_NODE_TYPE_HOTWORD);
-  DevicePtr dev2 = create_device(CRAS_STREAM_INPUT, 480, &format,
-                                 CRAS_NODE_TYPE_POST_MIX_PRE_DSP);
-  DevicePtr dev3 =
-      create_device(CRAS_STREAM_INPUT, 480, &format, CRAS_NODE_TYPE_POST_DSP);
-
-  DL_APPEND(dev_list, dev1->odev.get());
-  DL_APPEND(dev_list, dev2->odev.get());
-  DL_APPEND(dev_list, dev3->odev.get());
-
-  add_stream_to_dev(dev1->dev, stream);
-  add_stream_to_dev(dev2->dev, stream);
-  add_stream_to_dev(dev3->dev, stream);
-
-  iodev_stub_frames_queued(dev1->dev.get(), 4800, start);
-  iodev_stub_frames_queued(dev2->dev.get(), 4800, start);
-  iodev_stub_frames_queued(dev2->dev.get(), 4800, start);
-
-  EXPECT_EQ(0, dev_io_send_captured_samples(dev_list));
-
-  rc = iodev_stub_get_drop_time(dev1->dev.get(), &drop_time);
-  EXPECT_EQ(false, rc);
-
-  rc = iodev_stub_get_drop_time(dev2->dev.get(), &drop_time);
-  EXPECT_EQ(false, rc);
-
-  rc = iodev_stub_get_drop_time(dev3->dev.get(), &drop_time);
-  EXPECT_EQ(false, rc);
-}
-
-/* Stubs */
-extern "C" {
-
-int input_data_get_for_stream(struct input_data* data,
-                              struct cras_rstream* stream,
-                              struct buffer_share* offsets,
-                              struct cras_audio_area** area,
-                              unsigned int* offset) {
-  return 0;
-}
-
-int input_data_put_for_stream(struct input_data* data,
-                              struct cras_rstream* stream,
-                              struct buffer_share* offsets,
-                              unsigned int frames) {
-  return 0;
-}
-
-float input_data_get_software_gain_scaler(struct input_data* data,
-                                          float idev_sw_gain_scaler,
-                                          struct cras_rstream* stream) {
-  return input_data_get_software_gain_scaler_val;
-}
-
-int cras_audio_thread_event_drop_samples() {
-  return 0;
-}
-
-int cras_audio_thread_event_severe_underrun() {
-  return 0;
-}
-
-int dev_stream_attached_devs(const struct dev_stream* dev_stream) {
-  return 0;
-}
-void dev_stream_update_frames(const struct dev_stream* dev_stream) {}
-int dev_stream_playback_frames(const struct dev_stream* dev_stream) {
-  return 0;
-}
-int dev_stream_is_pending_reply(const struct dev_stream* dev_stream) {
-  return 0;
-}
-int dev_stream_mix(struct dev_stream* dev_stream,
-                   const struct cras_audio_format* fmt,
-                   uint8_t* dst,
-                   unsigned int num_to_write) {
-  return 0;
-}
-void dev_stream_set_dev_rate(struct dev_stream* dev_stream,
-                             unsigned int dev_rate,
-                             double dev_rate_ratio,
-                             double main_rate_ratio,
-                             int coarse_rate_adjust) {
-  set_dev_rate_data new_data;
-  new_data.dev_rate = dev_rate;
-  new_data.dev_rate_ratio = dev_rate_ratio;
-  new_data.main_rate_ratio = main_rate_ratio;
-  new_data.coarse_rate_adjust = coarse_rate_adjust;
-
-  set_dev_rate_map[dev_stream] = new_data;
-}
-int dev_stream_capture_update_rstream(struct dev_stream* dev_stream) {
-  return 0;
-}
-int dev_stream_wake_time(struct dev_stream* dev_stream,
-                         unsigned int curr_level,
-                         struct timespec* level_tstamp,
-                         unsigned int cap_limit,
-                         int is_cap_limit_stream,
-                         struct timespec* wake_time_out) {
-  return 0;
-}
-int dev_stream_flush_old_audio_messages(struct dev_stream* dev_stream) {
-  return 0;
-}
-void dev_stream_set_delay(const struct dev_stream* dev_stream,
-                          unsigned int delay_frames) {}
-unsigned int dev_stream_capture(struct dev_stream* dev_stream,
-                                const struct cras_audio_area* area,
-                                unsigned int area_offset,
-                                float software_gain_scaler) {
-  dev_stream_capture_software_gain_scaler_val = software_gain_scaler;
-  return 0;
-}
-void dev_stream_update_next_wake_time(struct dev_stream* dev_stream) {}
-int dev_stream_request_playback_samples(struct dev_stream* dev_stream,
-                                        const struct timespec* now) {
-  return 0;
-}
-int dev_stream_playback_update_rstream(struct dev_stream* dev_stream) {
-  return 0;
-}
-void dev_stream_destroy(struct dev_stream* dev_stream) {}
-unsigned int dev_stream_capture_avail(const struct dev_stream* dev_stream) {
-  return dev_stream_capture_avail_ret;
-}
-struct dev_stream* dev_stream_create(struct cras_rstream* stream,
-                                     unsigned int dev_id,
-                                     const struct cras_audio_format* dev_fmt,
-                                     void* dev_ptr,
-                                     struct timespec* cb_ts,
-                                     const struct timespec* sleep_interval_ts) {
-  return 0;
-}
-int cras_device_monitor_error_close(unsigned int dev_idx) {
-  return 0;
-}
-}  // extern "C"
-
-}  //  namespace
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tests/dev_stream_unittest.cc b/cras/src/tests/dev_stream_unittest.cc
deleted file mode 100644
index 700376f..0000000
--- a/cras/src/tests/dev_stream_unittest.cc
+++ /dev/null
@@ -1,1336 +0,0 @@
-// Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <gtest/gtest.h>
-#include <stdio.h>
-
-extern "C" {
-#include "audio_thread_log.h"
-#include "byte_buffer.h"
-#include "cras_audio_area.h"
-#include "cras_rstream.h"
-#include "cras_shm.h"
-#include "cras_types.h"
-#include "dev_stream.h"
-}
-
-namespace {
-
-extern "C" {
-struct audio_thread_event_log* atlog;
-// For audio_thread_log.h use.
-int atlog_rw_shm_fd;
-int atlog_ro_shm_fd;
-unsigned int max_frames_for_conversion(unsigned int stream_frames,
-                                       unsigned int stream_rate,
-                                       unsigned int device_rate);
-};
-
-static struct timespec clock_gettime_retspec;
-static struct timespec cb_ts;
-
-static const int kBufferFrames = 1024;
-static const struct cras_audio_format fmt_s16le_44_1 = {
-    SND_PCM_FORMAT_S16_LE,
-    44100,
-    2,
-};
-static const struct cras_audio_format fmt_s16le_48 = {
-    SND_PCM_FORMAT_S16_LE,
-    48000,
-    2,
-};
-static const struct cras_audio_format fmt_s16le_48_mono = {
-    SND_PCM_FORMAT_S16_LE,
-    48000,
-    1,
-};
-static const struct cras_audio_format fmt_s16le_8 = {
-    SND_PCM_FORMAT_S16_LE,
-    8000,
-    2,
-};
-
-struct cras_audio_area_copy_call {
-  const struct cras_audio_area* dst;
-  unsigned int dst_offset;
-  unsigned int dst_format_bytes;
-  const struct cras_audio_area* src;
-  unsigned int src_offset;
-  float software_gain_scaler;
-};
-
-struct fmt_conv_call {
-  struct cras_fmt_conv* conv;
-  uint8_t* in_buf;
-  uint8_t* out_buf;
-  size_t in_frames;
-  size_t out_frames;
-};
-
-struct mix_add_call {
-  int16_t* dst;
-  int16_t* src;
-  unsigned int count;
-  unsigned int index;
-  int mute;
-  float mix_vol;
-};
-
-struct rstream_get_readable_call {
-  struct cras_rstream* rstream;
-  unsigned int offset;
-  unsigned int num_called;
-};
-
-static int config_format_converter_called;
-static const struct cras_audio_format* config_format_converter_from_fmt;
-static int config_format_converter_frames;
-static struct cras_fmt_conv* config_format_converter_conv;
-static struct cras_audio_format in_fmt;
-static struct cras_audio_format out_fmt;
-static struct cras_audio_area_copy_call copy_area_call;
-static struct fmt_conv_call conv_frames_call;
-static int cras_audio_area_create_num_channels_val;
-static int cras_fmt_conversion_needed_val;
-static int cras_fmt_conv_set_linear_resample_rates_called;
-static float cras_fmt_conv_set_linear_resample_rates_from;
-static float cras_fmt_conv_set_linear_resample_rates_to;
-
-static unsigned int rstream_playable_frames_ret;
-static struct mix_add_call mix_add_call;
-static struct rstream_get_readable_call rstream_get_readable_call;
-static unsigned int rstream_get_readable_num;
-static uint8_t* rstream_get_readable_ptr;
-
-static struct cras_audio_format* cras_rstream_post_processing_format_val;
-static int cras_rstream_audio_ready_called;
-static int cras_rstream_audio_ready_count;
-static int cras_rstream_is_pending_reply_ret;
-static int cras_rstream_flush_old_audio_messages_called;
-static int cras_server_metrics_missed_cb_event_called;
-
-static char* atlog_name;
-
-class CreateSuite : public testing::Test {
- protected:
-  virtual void SetUp() {
-    in_fmt.format = SND_PCM_FORMAT_S16_LE;
-    out_fmt.format = SND_PCM_FORMAT_S16_LE;
-    in_fmt.num_channels = 2;
-    out_fmt.num_channels = 2;
-
-    SetupShm(&rstream_.shm);
-
-    rstream_.stream_id = 0x10001;
-    rstream_.buffer_frames = kBufferFrames;
-    rstream_.cb_threshold = kBufferFrames / 2;
-    rstream_.is_draining = 0;
-    rstream_.stream_type = CRAS_STREAM_TYPE_DEFAULT;
-    rstream_.direction = CRAS_STREAM_OUTPUT;
-    rstream_.format.format = SND_PCM_FORMAT_S16_LE;
-    rstream_.format.num_channels = 2;
-    rstream_.format = fmt_s16le_44_1;
-    rstream_.flags = 0;
-    rstream_.num_missed_cb = 0;
-
-    config_format_converter_from_fmt = NULL;
-    config_format_converter_called = 0;
-    cras_fmt_conversion_needed_val = 0;
-    cras_fmt_conv_set_linear_resample_rates_called = 0;
-
-    cras_rstream_audio_ready_called = 0;
-    cras_rstream_audio_ready_count = 0;
-    cras_rstream_is_pending_reply_ret = 0;
-    cras_rstream_flush_old_audio_messages_called = 0;
-    cras_server_metrics_missed_cb_event_called = 0;
-
-    memset(&copy_area_call, 0xff, sizeof(copy_area_call));
-    memset(&conv_frames_call, 0xff, sizeof(conv_frames_call));
-
-    ASSERT_FALSE(asprintf(&atlog_name, "/ATlog-%d", getpid()) < 0);
-    /* To avoid un-used variable warning. */
-    atlog_rw_shm_fd = atlog_ro_shm_fd = -1;
-    atlog = audio_thread_event_log_init(atlog_name);
-
-    devstr.stream = &rstream_;
-    devstr.conv = NULL;
-    devstr.conv_buffer = NULL;
-    devstr.conv_buffer_size_frames = 0;
-
-    area = (struct cras_audio_area*)calloc(
-        1, sizeof(*area) + 2 * sizeof(struct cras_channel_area));
-    area->num_channels = 2;
-    channel_area_set_channel(&area->channels[0], CRAS_CH_FL);
-    channel_area_set_channel(&area->channels[1], CRAS_CH_FR);
-    area->channels[0].step_bytes = 4;
-    area->channels[0].buf = (uint8_t*)(cap_buf);
-    area->channels[1].step_bytes = 4;
-    area->channels[1].buf = (uint8_t*)(cap_buf + 1);
-    area->frames = kBufferFrames;
-
-    stream_area = (struct cras_audio_area*)calloc(
-        1, sizeof(*area) + 2 * sizeof(struct cras_channel_area));
-    stream_area->num_channels = 2;
-    rstream_.audio_area = stream_area;
-    int16_t* shm_samples = (int16_t*)rstream_.shm->samples;
-    stream_area->channels[0].step_bytes = 4;
-    stream_area->channels[0].buf = (uint8_t*)(shm_samples);
-    stream_area->channels[1].step_bytes = 4;
-    stream_area->channels[1].buf = (uint8_t*)(shm_samples + 1);
-  }
-
-  virtual void TearDown() {
-    free(area);
-    free(stream_area);
-    free(rstream_.shm->header);
-    free(rstream_.shm->samples);
-    free(rstream_.shm);
-    audio_thread_event_log_deinit(atlog, atlog_name);
-    free(atlog_name);
-  }
-
-  void SetupShm(struct cras_audio_shm** shm_out) {
-    int16_t* buf;
-    struct cras_audio_shm* shm;
-    uint32_t used_size;
-
-    shm = static_cast<struct cras_audio_shm*>(
-        calloc(1, sizeof(struct cras_audio_shm)));
-
-    shm->header = static_cast<struct cras_audio_shm_header*>(
-        calloc(1, sizeof(struct cras_audio_shm_header)));
-    cras_shm_set_frame_bytes(shm, 4);
-    used_size = kBufferFrames * cras_shm_frame_bytes(shm);
-    cras_shm_set_used_size(shm, used_size);
-
-    shm->samples = static_cast<uint8_t*>(
-        calloc(1, cras_shm_calculate_samples_size(used_size)));
-    shm->samples_info.length = cras_shm_calculate_samples_size(used_size);
-
-    buf = (int16_t*)shm->samples;
-    for (size_t i = 0; i < kBufferFrames * 2; i++)
-      buf[i] = i;
-    cras_shm_set_mute(shm, 0);
-    cras_shm_set_volume_scaler(shm, 1.0);
-
-    *shm_out = shm;
-  }
-
-  void SetUpFmtConv(unsigned int in_rate,
-                    unsigned int out_rate,
-                    unsigned int conv_buf_size) {
-    in_fmt.frame_rate = in_rate;
-    out_fmt.frame_rate = out_rate;
-    cras_fmt_conversion_needed_val = 1;
-
-    devstr.conv = (struct cras_fmt_conv*)0xdead;
-    devstr.conv_buffer =
-        (struct byte_buffer*)byte_buffer_create(conv_buf_size * 4);
-    devstr.conv_buffer_size_frames = kBufferFrames * 2;
-
-    devstr.conv_area = (struct cras_audio_area*)calloc(
-        1, sizeof(*area) + 2 * sizeof(*area->channels));
-    devstr.conv_area->num_channels = 2;
-    devstr.conv_area->channels[0].step_bytes = 4;
-    devstr.conv_area->channels[0].buf = (uint8_t*)(devstr.conv_buffer->bytes);
-    devstr.conv_area->channels[1].step_bytes = 4;
-    devstr.conv_area->channels[1].buf =
-        (uint8_t*)(devstr.conv_buffer->bytes + 1);
-  }
-
-  struct dev_stream devstr;
-  struct cras_audio_area* area;
-  struct cras_audio_area* stream_area;
-  int16_t cap_buf[kBufferFrames * 2];
-  struct cras_rstream rstream_;
-};
-
-TEST_F(CreateSuite, CaptureNoSRC) {
-  float software_gain_scaler = 10;
-
-  dev_stream_capture(&devstr, area, 0, software_gain_scaler);
-
-  EXPECT_EQ(stream_area, copy_area_call.dst);
-  EXPECT_EQ(0, copy_area_call.dst_offset);
-  EXPECT_EQ(4, copy_area_call.dst_format_bytes);
-  EXPECT_EQ(area, copy_area_call.src);
-  EXPECT_EQ(software_gain_scaler, copy_area_call.software_gain_scaler);
-}
-
-TEST_F(CreateSuite, CaptureSRCSmallConverterBuffer) {
-  float software_gain_scaler = 10;
-  unsigned int conv_buf_avail_at_input_rate;
-  int nread;
-
-  SetUpFmtConv(44100, 32000, kBufferFrames / 4);
-  nread = dev_stream_capture(&devstr, area, 0, software_gain_scaler);
-
-  // |nread| is bound by small converter buffer size (kBufferFrames / 4)
-  conv_buf_avail_at_input_rate = cras_frames_at_rate(
-      out_fmt.frame_rate, (kBufferFrames / 4), in_fmt.frame_rate);
-
-  EXPECT_EQ(conv_buf_avail_at_input_rate, nread);
-  EXPECT_EQ((struct cras_fmt_conv*)0xdead, conv_frames_call.conv);
-  EXPECT_EQ((uint8_t*)cap_buf, conv_frames_call.in_buf);
-  EXPECT_EQ(devstr.conv_buffer->bytes, conv_frames_call.out_buf);
-
-  EXPECT_EQ(conv_buf_avail_at_input_rate, conv_frames_call.in_frames);
-
-  // Expect number of output frames is limited by the size of converter buffer.
-  EXPECT_EQ(kBufferFrames / 4, conv_frames_call.out_frames);
-
-  EXPECT_EQ(stream_area, copy_area_call.dst);
-  EXPECT_EQ(0, copy_area_call.dst_offset);
-  EXPECT_EQ(4, copy_area_call.dst_format_bytes);
-  EXPECT_EQ(devstr.conv_area, copy_area_call.src);
-  EXPECT_EQ(software_gain_scaler, copy_area_call.software_gain_scaler);
-
-  free(devstr.conv_area);
-  byte_buffer_destroy(&devstr.conv_buffer);
-}
-
-TEST_F(CreateSuite, CaptureSRCLargeConverterBuffer) {
-  float software_gain_scaler = 10;
-  unsigned int stream_avail_at_input_rate;
-  int nread;
-
-  SetUpFmtConv(44100, 32000, kBufferFrames * 2);
-  nread = dev_stream_capture(&devstr, area, 0, software_gain_scaler);
-
-  // Available frames at stream side is bound by cb_threshold, which
-  // equals to kBufferFrames / 2.
-  stream_avail_at_input_rate = cras_frames_at_rate(
-      out_fmt.frame_rate, (kBufferFrames / 2), in_fmt.frame_rate);
-
-  EXPECT_EQ(stream_avail_at_input_rate, nread);
-  EXPECT_EQ((struct cras_fmt_conv*)0xdead, conv_frames_call.conv);
-  EXPECT_EQ((uint8_t*)cap_buf, conv_frames_call.in_buf);
-  EXPECT_EQ(devstr.conv_buffer->bytes, conv_frames_call.out_buf);
-
-  // Expect number of input frames is limited by |stream_avail_at_input_rate|
-  // at format conversion.
-  EXPECT_EQ(stream_avail_at_input_rate, conv_frames_call.in_frames);
-
-  // Expect number of output frames is limited by the size of converter buffer.
-  EXPECT_EQ(kBufferFrames * 2, conv_frames_call.out_frames);
-
-  EXPECT_EQ(stream_area, copy_area_call.dst);
-  EXPECT_EQ(0, copy_area_call.dst_offset);
-  EXPECT_EQ(4, copy_area_call.dst_format_bytes);
-  EXPECT_EQ(devstr.conv_area, copy_area_call.src);
-  EXPECT_EQ(software_gain_scaler, copy_area_call.software_gain_scaler);
-
-  free(devstr.conv_area);
-  byte_buffer_destroy(&devstr.conv_buffer);
-}
-
-TEST_F(CreateSuite, CreateSRC44to48) {
-  struct dev_stream* dev_stream;
-
-  rstream_.format = fmt_s16le_44_1;
-  in_fmt.frame_rate = 44100;   // Input to converter is stream rate.
-  out_fmt.frame_rate = 48000;  // Output from converter is device rate.
-  config_format_converter_conv = reinterpret_cast<struct cras_fmt_conv*>(0x33);
-  dev_stream =
-      dev_stream_create(&rstream_, 0, &fmt_s16le_48, (void*)0x55, &cb_ts, NULL);
-  EXPECT_EQ(1, config_format_converter_called);
-  EXPECT_NE(static_cast<byte_buffer*>(NULL), dev_stream->conv_buffer);
-  // Converter tmp and output buffers are large enough for device output.
-  unsigned int device_frames =
-      cras_frames_at_rate(in_fmt.frame_rate, kBufferFrames, out_fmt.frame_rate);
-  EXPECT_LE(kBufferFrames, device_frames);  // Soundness check.
-  EXPECT_LE(device_frames, config_format_converter_frames);
-  EXPECT_LE(device_frames, dev_stream->conv_buffer_size_frames);
-  dev_stream_destroy(dev_stream);
-}
-
-TEST_F(CreateSuite, CreateOutputWithSchedule) {
-  struct dev_stream* dev_stream;
-  unsigned int dev_id = 9;
-  // init_cb_ts and non-null init_sleep_ts will be used.
-  struct timespec init_cb_ts = {1, 2};
-  struct timespec init_sleep_ts = {3, 4};
-
-  rstream_.direction = CRAS_STREAM_OUTPUT;
-  dev_stream = dev_stream_create(&rstream_, dev_id, &fmt_s16le_48, (void*)0x55,
-                                 &init_cb_ts, &init_sleep_ts);
-
-  EXPECT_EQ(init_cb_ts.tv_sec, rstream_.next_cb_ts.tv_sec);
-  EXPECT_EQ(init_cb_ts.tv_nsec, rstream_.next_cb_ts.tv_nsec);
-  EXPECT_EQ(init_sleep_ts.tv_sec, rstream_.sleep_interval_ts.tv_sec);
-  EXPECT_EQ(init_sleep_ts.tv_nsec, rstream_.sleep_interval_ts.tv_nsec);
-  dev_stream_destroy(dev_stream);
-}
-
-TEST_F(CreateSuite, CreateSRC44from48Input) {
-  struct dev_stream* dev_stream;
-  struct cras_audio_format processed_fmt = fmt_s16le_48;
-
-  processed_fmt.num_channels = 1;
-  rstream_.format = fmt_s16le_44_1;
-  rstream_.direction = CRAS_STREAM_INPUT;
-  in_fmt.frame_rate = 48000;   // Input to converter is device rate.
-  out_fmt.frame_rate = 44100;  // Output from converter is stream rate.
-  config_format_converter_conv = reinterpret_cast<struct cras_fmt_conv*>(0x33);
-  cras_rstream_post_processing_format_val = &processed_fmt;
-  dev_stream =
-      dev_stream_create(&rstream_, 0, &fmt_s16le_48, (void*)0x55, &cb_ts, NULL);
-  EXPECT_EQ(1, config_format_converter_called);
-  EXPECT_NE(static_cast<byte_buffer*>(NULL), dev_stream->conv_buffer);
-  // Converter tmp and output buffers are large enough for device input.
-  unsigned int device_frames =
-      cras_frames_at_rate(out_fmt.frame_rate, kBufferFrames, in_fmt.frame_rate);
-  EXPECT_LE(kBufferFrames, device_frames);  // Soundness check.
-  EXPECT_LE(device_frames, config_format_converter_frames);
-  EXPECT_EQ(&processed_fmt, config_format_converter_from_fmt);
-  EXPECT_LE(device_frames, dev_stream->conv_buffer_size_frames);
-  dev_stream_destroy(dev_stream);
-}
-
-TEST_F(CreateSuite, CreateSRC48to44) {
-  struct dev_stream* dev_stream;
-
-  rstream_.format = fmt_s16le_48;
-  in_fmt.frame_rate = 48000;   // Stream rate.
-  out_fmt.frame_rate = 44100;  // Device rate.
-  config_format_converter_conv = reinterpret_cast<struct cras_fmt_conv*>(0x33);
-  dev_stream = dev_stream_create(&rstream_, 0, &fmt_s16le_44_1, (void*)0x55,
-                                 &cb_ts, NULL);
-  EXPECT_EQ(1, config_format_converter_called);
-  EXPECT_NE(static_cast<byte_buffer*>(NULL), dev_stream->conv_buffer);
-  // Converter tmp and output buffers are large enough for stream input.
-  EXPECT_LE(kBufferFrames, config_format_converter_frames);
-  EXPECT_LE(kBufferFrames, dev_stream->conv_buffer_size_frames);
-  dev_stream_destroy(dev_stream);
-}
-
-TEST_F(CreateSuite, CreateSRC48from44Input) {
-  struct dev_stream* dev_stream;
-
-  rstream_.format = fmt_s16le_48;
-  rstream_.direction = CRAS_STREAM_INPUT;
-  in_fmt.frame_rate = 44100;   // Device rate.
-  out_fmt.frame_rate = 48000;  // Stream rate.
-  config_format_converter_conv = reinterpret_cast<struct cras_fmt_conv*>(0x33);
-  dev_stream = dev_stream_create(&rstream_, 0, &fmt_s16le_44_1, (void*)0x55,
-                                 &cb_ts, NULL);
-  EXPECT_EQ(1, config_format_converter_called);
-  EXPECT_NE(static_cast<byte_buffer*>(NULL), dev_stream->conv_buffer);
-  // Converter tmp and output buffers are large enough for stream output.
-  EXPECT_LE(kBufferFrames, config_format_converter_frames);
-  EXPECT_LE(kBufferFrames, dev_stream->conv_buffer_size_frames);
-  dev_stream_destroy(dev_stream);
-}
-
-TEST_F(CreateSuite, CreateSRC8to48) {
-  struct dev_stream* dev_stream;
-
-  rstream_.format = fmt_s16le_8;
-  in_fmt.frame_rate = 8000;    // Stream rate.
-  out_fmt.frame_rate = 48000;  // Device rate.
-  config_format_converter_conv = reinterpret_cast<struct cras_fmt_conv*>(0x33);
-  dev_stream =
-      dev_stream_create(&rstream_, 0, &fmt_s16le_48, (void*)0x55, &cb_ts, NULL);
-  EXPECT_EQ(1, config_format_converter_called);
-  EXPECT_NE(static_cast<byte_buffer*>(NULL), dev_stream->conv_buffer);
-  // Converter tmp and output buffers are large enough for device output.
-  unsigned int device_frames =
-      cras_frames_at_rate(in_fmt.frame_rate, kBufferFrames, out_fmt.frame_rate);
-  EXPECT_LE(kBufferFrames, device_frames);  // Soundness check.
-  EXPECT_LE(device_frames, config_format_converter_frames);
-  EXPECT_LE(device_frames, dev_stream->conv_buffer_size_frames);
-  dev_stream_destroy(dev_stream);
-}
-
-TEST_F(CreateSuite, CreateSRC8from48Input) {
-  struct dev_stream* dev_stream;
-
-  rstream_.format = fmt_s16le_8;
-  rstream_.direction = CRAS_STREAM_INPUT;
-  in_fmt.frame_rate = 48000;  // Device rate.
-  out_fmt.frame_rate = 8000;  // Stream rate.
-  config_format_converter_conv = reinterpret_cast<struct cras_fmt_conv*>(0x33);
-  dev_stream =
-      dev_stream_create(&rstream_, 0, &fmt_s16le_48, (void*)0x55, &cb_ts, NULL);
-  EXPECT_EQ(1, config_format_converter_called);
-  EXPECT_NE(static_cast<byte_buffer*>(NULL), dev_stream->conv_buffer);
-  // Converter tmp and output buffers are large enough for device input.
-  unsigned int device_frames =
-      cras_frames_at_rate(out_fmt.frame_rate, kBufferFrames, in_fmt.frame_rate);
-  EXPECT_LE(kBufferFrames, device_frames);  // Soundness check.
-  EXPECT_LE(device_frames, config_format_converter_frames);
-  EXPECT_LE(device_frames, dev_stream->conv_buffer_size_frames);
-  dev_stream_destroy(dev_stream);
-}
-
-TEST_F(CreateSuite, CreateSRC48to8) {
-  struct dev_stream* dev_stream;
-
-  rstream_.format = fmt_s16le_48;
-  in_fmt.frame_rate = 48000;  // Stream rate.
-  out_fmt.frame_rate = 8000;  // Device rate.
-  config_format_converter_conv = reinterpret_cast<struct cras_fmt_conv*>(0x33);
-  dev_stream =
-      dev_stream_create(&rstream_, 0, &fmt_s16le_8, (void*)0x55, &cb_ts, NULL);
-  EXPECT_EQ(1, config_format_converter_called);
-  EXPECT_NE(static_cast<byte_buffer*>(NULL), dev_stream->conv_buffer);
-  // Converter tmp and output buffers are large enough for stream input.
-  EXPECT_LE(kBufferFrames, config_format_converter_frames);
-  EXPECT_LE(kBufferFrames, dev_stream->conv_buffer_size_frames);
-  dev_stream_destroy(dev_stream);
-}
-
-TEST_F(CreateSuite, CreateSRC48from8Input) {
-  struct dev_stream* dev_stream;
-
-  rstream_.format = fmt_s16le_48;
-  rstream_.direction = CRAS_STREAM_INPUT;
-  in_fmt.frame_rate = 8000;    // Device rate.
-  out_fmt.frame_rate = 48000;  // Stream rate.
-  config_format_converter_conv = reinterpret_cast<struct cras_fmt_conv*>(0x33);
-  dev_stream =
-      dev_stream_create(&rstream_, 0, &fmt_s16le_8, (void*)0x55, &cb_ts, NULL);
-  EXPECT_EQ(1, config_format_converter_called);
-  EXPECT_NE(static_cast<byte_buffer*>(NULL), dev_stream->conv_buffer);
-  // Converter tmp and output buffers are large enough for stream output.
-  EXPECT_LE(kBufferFrames, config_format_converter_frames);
-  EXPECT_LE(kBufferFrames, dev_stream->conv_buffer_size_frames);
-  dev_stream_destroy(dev_stream);
-}
-
-TEST_F(CreateSuite, CreateSRC48MonoFrom44StereoInput) {
-  struct dev_stream* dev_stream;
-
-  rstream_.format = fmt_s16le_48_mono;
-  rstream_.direction = CRAS_STREAM_INPUT;
-  in_fmt.frame_rate = 44100;   // Device rate.
-  out_fmt.frame_rate = 48000;  // Stream rate.
-  config_format_converter_conv = reinterpret_cast<struct cras_fmt_conv*>(0x33);
-  dev_stream = dev_stream_create(&rstream_, 0, &fmt_s16le_44_1, (void*)0x55,
-                                 &cb_ts, NULL);
-  EXPECT_EQ(1, config_format_converter_called);
-  EXPECT_NE(static_cast<byte_buffer*>(NULL), dev_stream->conv_buffer);
-  // Converter tmp and output buffers are large enough for stream output.
-  EXPECT_LE(kBufferFrames, config_format_converter_frames);
-  EXPECT_LE(kBufferFrames, dev_stream->conv_buffer_size_frames);
-  EXPECT_EQ(dev_stream->conv_buffer_size_frames * 4,
-            dev_stream->conv_buffer->max_size);
-  EXPECT_EQ(2, cras_audio_area_create_num_channels_val);
-  dev_stream_destroy(dev_stream);
-}
-
-TEST_F(CreateSuite, CaptureAvailConvBufHasSamples) {
-  struct dev_stream* dev_stream;
-  unsigned int avail;
-
-  rstream_.format = fmt_s16le_48;
-  rstream_.direction = CRAS_STREAM_INPUT;
-  config_format_converter_conv = reinterpret_cast<struct cras_fmt_conv*>(0x33);
-  dev_stream = dev_stream_create(&rstream_, 0, &fmt_s16le_44_1, (void*)0x55,
-                                 &cb_ts, NULL);
-  EXPECT_EQ(1, config_format_converter_called);
-  EXPECT_NE(static_cast<byte_buffer*>(NULL), dev_stream->conv_buffer);
-  EXPECT_LE(
-      cras_frames_at_rate(in_fmt.frame_rate, kBufferFrames, out_fmt.frame_rate),
-      dev_stream->conv_buffer_size_frames);
-  EXPECT_EQ(dev_stream->conv_buffer_size_frames * 4,
-            dev_stream->conv_buffer->max_size);
-  EXPECT_EQ(2, cras_audio_area_create_num_channels_val);
-
-  buf_increment_write(dev_stream->conv_buffer, 50 * 4);
-  avail = dev_stream_capture_avail(dev_stream);
-
-  EXPECT_EQ(cras_frames_at_rate(48000, 512 - 50, 44100), avail);
-
-  dev_stream_destroy(dev_stream);
-}
-
-TEST_F(CreateSuite, SetDevRateNotMainDev) {
-  struct dev_stream* dev_stream;
-  unsigned int dev_id = 9;
-
-  rstream_.format = fmt_s16le_48;
-  rstream_.direction = CRAS_STREAM_INPUT;
-  rstream_.main_dev.dev_id = 4;
-  config_format_converter_conv = reinterpret_cast<struct cras_fmt_conv*>(0x33);
-  dev_stream = dev_stream_create(&rstream_, dev_id, &fmt_s16le_44_1,
-                                 (void*)0x55, &cb_ts, NULL);
-
-  dev_stream_set_dev_rate(dev_stream, 44100, 1.01, 1.0, 0);
-  EXPECT_EQ(1, cras_fmt_conv_set_linear_resample_rates_called);
-  EXPECT_EQ(44100, cras_fmt_conv_set_linear_resample_rates_from);
-  EXPECT_EQ(44541, cras_fmt_conv_set_linear_resample_rates_to);
-
-  dev_stream_set_dev_rate(dev_stream, 44100, 1.01, 1.0, 1);
-  EXPECT_EQ(2, cras_fmt_conv_set_linear_resample_rates_called);
-  EXPECT_EQ(44100, cras_fmt_conv_set_linear_resample_rates_from);
-  EXPECT_LE(44541, cras_fmt_conv_set_linear_resample_rates_to);
-
-  dev_stream_set_dev_rate(dev_stream, 44100, 1.0, 1.01, -1);
-  EXPECT_EQ(3, cras_fmt_conv_set_linear_resample_rates_called);
-  EXPECT_EQ(44100, cras_fmt_conv_set_linear_resample_rates_from);
-  EXPECT_GE(43663, cras_fmt_conv_set_linear_resample_rates_to);
-  dev_stream_destroy(dev_stream);
-}
-
-TEST_F(CreateSuite, SetDevRateMainDev) {
-  struct dev_stream* dev_stream;
-  unsigned int dev_id = 9;
-  unsigned int expected_ts_nsec;
-
-  rstream_.format = fmt_s16le_48;
-  rstream_.direction = CRAS_STREAM_INPUT;
-  rstream_.main_dev.dev_id = dev_id;
-  config_format_converter_conv = reinterpret_cast<struct cras_fmt_conv*>(0x33);
-  dev_stream = dev_stream_create(&rstream_, dev_id, &fmt_s16le_44_1,
-                                 (void*)0x55, &cb_ts, NULL);
-
-  dev_stream_set_dev_rate(dev_stream, 44100, 1.01, 1.0, 0);
-  EXPECT_EQ(1, cras_fmt_conv_set_linear_resample_rates_called);
-  EXPECT_EQ(44100, cras_fmt_conv_set_linear_resample_rates_from);
-  EXPECT_EQ(44100, cras_fmt_conv_set_linear_resample_rates_to);
-  expected_ts_nsec = 1000000000.0 * kBufferFrames / 2.0 / 48000.0 / 1.01;
-  EXPECT_EQ(0, rstream_.sleep_interval_ts.tv_sec);
-  EXPECT_EQ(expected_ts_nsec, rstream_.sleep_interval_ts.tv_nsec);
-
-  dev_stream_set_dev_rate(dev_stream, 44100, 1.01, 1.0, 1);
-  EXPECT_EQ(2, cras_fmt_conv_set_linear_resample_rates_called);
-  EXPECT_EQ(44100, cras_fmt_conv_set_linear_resample_rates_from);
-  EXPECT_LE(44100, cras_fmt_conv_set_linear_resample_rates_to);
-  expected_ts_nsec = 1000000000.0 * kBufferFrames / 2.0 / 48000.0 / 1.01;
-  EXPECT_EQ(0, rstream_.sleep_interval_ts.tv_sec);
-  EXPECT_EQ(expected_ts_nsec, rstream_.sleep_interval_ts.tv_nsec);
-
-  dev_stream_set_dev_rate(dev_stream, 44100, 1.0, 1.33, -1);
-  EXPECT_EQ(3, cras_fmt_conv_set_linear_resample_rates_called);
-  EXPECT_EQ(44100, cras_fmt_conv_set_linear_resample_rates_from);
-  EXPECT_GE(44100, cras_fmt_conv_set_linear_resample_rates_to);
-  expected_ts_nsec = 1000000000.0 * kBufferFrames / 2.0 / 48000.0;
-  EXPECT_EQ(0, rstream_.sleep_interval_ts.tv_sec);
-  EXPECT_EQ(expected_ts_nsec, rstream_.sleep_interval_ts.tv_nsec);
-  dev_stream_destroy(dev_stream);
-}
-
-TEST_F(CreateSuite, StreamMixNoFrames) {
-  struct dev_stream dev_stream;
-  struct cras_audio_format fmt;
-
-  dev_stream.conv = NULL;
-  rstream_playable_frames_ret = 0;
-  fmt.num_channels = 2;
-  fmt.format = SND_PCM_FORMAT_S16_LE;
-  EXPECT_EQ(0, dev_stream_mix(&dev_stream, &fmt, 0, 3));
-}
-
-TEST_F(CreateSuite, StreamMixNoConv) {
-  struct dev_stream dev_stream;
-  const unsigned int nfr = 100;
-  struct cras_audio_format fmt;
-
-  dev_stream.conv = NULL;
-  dev_stream.stream = reinterpret_cast<cras_rstream*>(0x5446);
-  rstream_playable_frames_ret = nfr;
-  rstream_get_readable_num = nfr;
-  rstream_get_readable_ptr = reinterpret_cast<uint8_t*>(0x4000);
-  rstream_get_readable_call.num_called = 0;
-  fmt.num_channels = 2;
-  fmt.format = SND_PCM_FORMAT_S16_LE;
-  EXPECT_EQ(nfr, dev_stream_mix(&dev_stream, &fmt, (uint8_t*)0x5000, nfr));
-  EXPECT_EQ((int16_t*)0x5000, mix_add_call.dst);
-  EXPECT_EQ((int16_t*)0x4000, mix_add_call.src);
-  EXPECT_EQ(200, mix_add_call.count);
-  EXPECT_EQ(1, mix_add_call.index);
-  EXPECT_EQ(dev_stream.stream, rstream_get_readable_call.rstream);
-  EXPECT_EQ(0, rstream_get_readable_call.offset);
-  EXPECT_EQ(1, rstream_get_readable_call.num_called);
-}
-
-TEST_F(CreateSuite, StreamMixNoConvTwoPass) {
-  struct dev_stream dev_stream;
-  const unsigned int nfr = 100;
-  const unsigned int bytes_per_sample = 2;
-  const unsigned int num_channels = 2;
-  const unsigned int bytes_per_frame = bytes_per_sample * num_channels;
-  struct cras_audio_format fmt;
-
-  dev_stream.conv = NULL;
-  dev_stream.stream = reinterpret_cast<cras_rstream*>(0x5446);
-  rstream_playable_frames_ret = nfr;
-  rstream_get_readable_num = nfr / 2;
-  rstream_get_readable_ptr = reinterpret_cast<uint8_t*>(0x4000);
-  rstream_get_readable_call.num_called = 0;
-  fmt.num_channels = 2;
-  fmt.format = SND_PCM_FORMAT_S16_LE;
-  EXPECT_EQ(nfr, dev_stream_mix(&dev_stream, &fmt, (uint8_t*)0x5000, nfr));
-  const unsigned int half_offset = nfr / 2 * bytes_per_frame;
-  EXPECT_EQ((int16_t*)(0x5000 + half_offset), mix_add_call.dst);
-  EXPECT_EQ((int16_t*)0x4000, mix_add_call.src);
-  EXPECT_EQ(nfr / 2 * num_channels, mix_add_call.count);
-  EXPECT_EQ(1, mix_add_call.index);
-  EXPECT_EQ(dev_stream.stream, rstream_get_readable_call.rstream);
-  EXPECT_EQ(nfr / 2, rstream_get_readable_call.offset);
-  EXPECT_EQ(2, rstream_get_readable_call.num_called);
-}
-
-TEST_F(CreateSuite, DevStreamFlushAudioMessages) {
-  struct dev_stream* dev_stream;
-  unsigned int dev_id = 9;
-
-  dev_stream = dev_stream_create(&rstream_, dev_id, &fmt_s16le_44_1,
-                                 (void*)0x55, &cb_ts, NULL);
-
-  dev_stream_flush_old_audio_messages(dev_stream);
-  EXPECT_EQ(1, cras_rstream_flush_old_audio_messages_called);
-  dev_stream_destroy(dev_stream);
-}
-
-TEST_F(CreateSuite, DevStreamIsPending) {
-  struct dev_stream* dev_stream;
-  unsigned int dev_id = 9;
-
-  dev_stream = dev_stream_create(&rstream_, dev_id, &fmt_s16le_44_1,
-                                 (void*)0x55, &cb_ts, NULL);
-
-  // dev_stream_is_pending_reply is only a wrapper.
-  cras_rstream_is_pending_reply_ret = 0;
-  EXPECT_EQ(0, dev_stream_is_pending_reply(dev_stream));
-
-  cras_rstream_is_pending_reply_ret = 1;
-  EXPECT_EQ(1, dev_stream_is_pending_reply(dev_stream));
-
-  dev_stream_destroy(dev_stream);
-}
-
-TEST_F(CreateSuite, StreamCanSend) {
-  struct dev_stream* dev_stream;
-  unsigned int dev_id = 9;
-  int written_frames;
-  int rc;
-  struct timespec expected_next_cb_ts;
-
-  rstream_.direction = CRAS_STREAM_INPUT;
-  dev_stream = dev_stream_create(&rstream_, dev_id, &fmt_s16le_44_1,
-                                 (void*)0x55, &cb_ts, NULL);
-
-  // Assume there is a next_cb_ts on rstream.
-  rstream_.next_cb_ts.tv_sec = 1;
-  rstream_.next_cb_ts.tv_nsec = 0;
-
-  // Case 1: Not enough samples. Time is not late enough.
-  //         Stream can not send data to client.
-  clock_gettime_retspec.tv_sec = 0;
-  clock_gettime_retspec.tv_nsec = 0;
-  rc = dev_stream_capture_update_rstream(dev_stream);
-  EXPECT_EQ(0, cras_rstream_audio_ready_called);
-  EXPECT_EQ(0, cras_server_metrics_missed_cb_event_called);
-  EXPECT_EQ(0, rc);
-
-  // Case 2: Not enough samples. Time is late enough.
-  //         Stream can not send data to client.
-
-  // Assume time is greater than next_cb_ts.
-  clock_gettime_retspec.tv_sec = 1;
-  clock_gettime_retspec.tv_nsec = 500;
-  // However, written frames is less than cb_threshold.
-  // Stream still can not send samples to client.
-  rc = dev_stream_capture_update_rstream(dev_stream);
-  EXPECT_EQ(0, cras_rstream_audio_ready_called);
-  EXPECT_EQ(0, cras_server_metrics_missed_cb_event_called);
-  EXPECT_EQ(0, rc);
-
-  // Case 3: Enough samples. Time is not late enough.
-  //         Stream can not send data to client.
-
-  // Assume time is less than next_cb_ts.
-  clock_gettime_retspec.tv_sec = 0;
-  clock_gettime_retspec.tv_nsec = 0;
-  // Enough samples are written.
-  written_frames = rstream_.cb_threshold + 10;
-  cras_shm_buffer_written(rstream_.shm, written_frames);
-  // Stream still can not send samples to client.
-  rc = dev_stream_capture_update_rstream(dev_stream);
-  EXPECT_EQ(0, cras_rstream_audio_ready_called);
-  EXPECT_EQ(0, cras_server_metrics_missed_cb_event_called);
-  EXPECT_EQ(0, rc);
-
-  // Case 4: Enough samples. Time is late enough.
-  //         Stream should send one cb_threshold to client.
-  clock_gettime_retspec.tv_sec = 1;
-  clock_gettime_retspec.tv_nsec = 500;
-  rc = dev_stream_capture_update_rstream(dev_stream);
-  EXPECT_EQ(1, cras_rstream_audio_ready_called);
-  EXPECT_EQ(rstream_.cb_threshold, cras_rstream_audio_ready_count);
-  EXPECT_EQ(0, cras_server_metrics_missed_cb_event_called);
-  EXPECT_EQ(0, rc);
-
-  // Check next_cb_ts is increased by one sleep interval.
-  expected_next_cb_ts.tv_sec = 1;
-  expected_next_cb_ts.tv_nsec = 0;
-  add_timespecs(&expected_next_cb_ts, &rstream_.sleep_interval_ts);
-  EXPECT_EQ(expected_next_cb_ts.tv_sec, rstream_.next_cb_ts.tv_sec);
-  EXPECT_EQ(expected_next_cb_ts.tv_nsec, rstream_.next_cb_ts.tv_nsec);
-
-  // Reset stub data of interest.
-  cras_rstream_audio_ready_called = 0;
-  cras_rstream_audio_ready_count = 0;
-  rstream_.next_cb_ts.tv_sec = 1;
-  rstream_.next_cb_ts.tv_nsec = 0;
-
-  // Case 5: Enough samples. Time is late enough and it is too late
-  //         such that a new next_cb_ts is in the past.
-  //         Stream should send one cb_threshold to client and reset schedule.
-  clock_gettime_retspec.tv_sec = 2;
-  clock_gettime_retspec.tv_nsec = 0;
-  rc = dev_stream_capture_update_rstream(dev_stream);
-  EXPECT_EQ(1, cras_rstream_audio_ready_called);
-  EXPECT_EQ(rstream_.cb_threshold, cras_rstream_audio_ready_count);
-  EXPECT_EQ(1, cras_server_metrics_missed_cb_event_called);
-  EXPECT_EQ(0, rc);
-
-  // Check next_cb_ts is rest to be now plus one sleep interval.
-  expected_next_cb_ts.tv_sec = 2;
-  expected_next_cb_ts.tv_nsec = 0;
-  add_timespecs(&expected_next_cb_ts, &rstream_.sleep_interval_ts);
-  EXPECT_EQ(expected_next_cb_ts.tv_sec, rstream_.next_cb_ts.tv_sec);
-  EXPECT_EQ(expected_next_cb_ts.tv_nsec, rstream_.next_cb_ts.tv_nsec);
-
-  dev_stream_destroy(dev_stream);
-}
-
-TEST_F(CreateSuite, StreamCanSendBulkAudio) {
-  struct dev_stream* dev_stream;
-  unsigned int dev_id = 9;
-  int written_frames;
-  int rc;
-  struct timespec expected_next_cb_ts;
-
-  rstream_.direction = CRAS_STREAM_INPUT;
-  rstream_.flags |= BULK_AUDIO_OK;
-  dev_stream = dev_stream_create(&rstream_, dev_id, &fmt_s16le_44_1,
-                                 (void*)0x55, &cb_ts, NULL);
-
-  // Assume there is a next_cb_ts on rstream.
-  rstream_.next_cb_ts.tv_sec = 1;
-  rstream_.next_cb_ts.tv_nsec = 0;
-
-  // Case 1: Not enough samples. Time is not late enough.
-  //         Bulk audio stream can not send data to client.
-  clock_gettime_retspec.tv_sec = 0;
-  clock_gettime_retspec.tv_nsec = 0;
-  rc = dev_stream_capture_update_rstream(dev_stream);
-  EXPECT_EQ(0, cras_rstream_audio_ready_called);
-  EXPECT_EQ(0, rc);
-
-  // Case 2: Not enough samples. Time is late enough.
-  //         Bulk audio stream can not send data to client.
-
-  // Assume time is greater than next_cb_ts.
-  clock_gettime_retspec.tv_sec = 1;
-  clock_gettime_retspec.tv_nsec = 500;
-  // However, written frames is less than cb_threshold.
-  // Stream still can not send samples to client.
-  rc = dev_stream_capture_update_rstream(dev_stream);
-  EXPECT_EQ(0, cras_rstream_audio_ready_called);
-  EXPECT_EQ(0, rc);
-
-  // Case 3: Enough samples. Time is not late enough.
-  //         Bulk audio stream CAN send data to client.
-
-  // Assume time is less than next_cb_ts.
-  clock_gettime_retspec.tv_sec = 0;
-  clock_gettime_retspec.tv_nsec = 0;
-  // Enough samples are written.
-  written_frames = rstream_.cb_threshold + 10;
-  cras_shm_buffer_written(rstream_.shm, written_frames);
-  // Bulk audio stream can send all written samples to client.
-  rc = dev_stream_capture_update_rstream(dev_stream);
-  EXPECT_EQ(1, cras_rstream_audio_ready_called);
-  EXPECT_EQ(written_frames, cras_rstream_audio_ready_count);
-  EXPECT_EQ(0, rc);
-
-  // Case 4: Enough samples. Time is late enough.
-  //         Bulk audio stream can send all written samples to client.
-
-  // Reset stub data of interest.
-  cras_rstream_audio_ready_called = 0;
-  cras_rstream_audio_ready_count = 0;
-  rstream_.next_cb_ts.tv_sec = 1;
-  rstream_.next_cb_ts.tv_nsec = 0;
-
-  clock_gettime_retspec.tv_sec = 1;
-  clock_gettime_retspec.tv_nsec = 500;
-  rc = dev_stream_capture_update_rstream(dev_stream);
-  EXPECT_EQ(1, cras_rstream_audio_ready_called);
-  EXPECT_EQ(written_frames, cras_rstream_audio_ready_count);
-  EXPECT_EQ(0, rc);
-
-  // Check next_cb_ts is increased by one sleep interval.
-  expected_next_cb_ts.tv_sec = 1;
-  expected_next_cb_ts.tv_nsec = 0;
-  add_timespecs(&expected_next_cb_ts, &rstream_.sleep_interval_ts);
-  EXPECT_EQ(expected_next_cb_ts.tv_sec, rstream_.next_cb_ts.tv_sec);
-  EXPECT_EQ(expected_next_cb_ts.tv_nsec, rstream_.next_cb_ts.tv_nsec);
-
-  dev_stream_destroy(dev_stream);
-}
-
-TEST_F(CreateSuite, TriggerOnlyStreamSendOnlyOnce) {
-  struct dev_stream* dev_stream;
-  unsigned int dev_id = 9;
-
-  rstream_.direction = CRAS_STREAM_INPUT;
-  dev_stream = dev_stream_create(&rstream_, dev_id, &fmt_s16le_44_1,
-                                 (void*)0x55, &cb_ts, NULL);
-  dev_stream->stream->flags = TRIGGER_ONLY;
-  dev_stream->stream->triggered = 0;
-
-  // Check first trigger callback called.
-  cras_shm_buffer_written(rstream_.shm, rstream_.cb_threshold);
-  clock_gettime_retspec.tv_sec = 1;
-  clock_gettime_retspec.tv_nsec = 0;
-  dev_stream_capture_update_rstream(dev_stream);
-  EXPECT_EQ(1, cras_rstream_audio_ready_called);
-  EXPECT_EQ(1, dev_stream->stream->triggered);
-
-  // No future callback will be called for TRIGGER_ONLY streams.
-  cras_shm_buffer_written(rstream_.shm, rstream_.cb_threshold);
-  clock_gettime_retspec.tv_sec = 2;
-  clock_gettime_retspec.tv_nsec = 0;
-  dev_stream_capture_update_rstream(dev_stream);
-  EXPECT_EQ(1, cras_rstream_audio_ready_called);
-  dev_stream_destroy(dev_stream);
-}
-
-TEST_F(CreateSuite, InputDevStreamWakeTimeByNextCbTs) {
-  struct dev_stream* dev_stream;
-  unsigned int dev_id = 9;
-  int rc;
-  unsigned int curr_level = 0;
-  int written_frames;
-  struct timespec level_tstamp = {.tv_sec = 1, .tv_nsec = 0};
-  struct timespec wake_time_out = {.tv_sec = 0, .tv_nsec = 0};
-
-  rstream_.direction = CRAS_STREAM_INPUT;
-  dev_stream = dev_stream_create(&rstream_, dev_id, &fmt_s16le_44_1,
-                                 (void*)0x55, &cb_ts, NULL);
-
-  // Assume there is a next_cb_ts on rstream.
-  rstream_.next_cb_ts.tv_sec = 1;
-  rstream_.next_cb_ts.tv_nsec = 500000;
-
-  // Assume there are enough samples for stream.
-  written_frames = rstream_.cb_threshold + 10;
-  cras_shm_buffer_written(rstream_.shm, written_frames);
-
-  rc = dev_stream_wake_time(dev_stream, curr_level, &level_tstamp,
-                            rstream_.cb_threshold, 0, &wake_time_out);
-
-  // The next wake up time is determined by next_cb_ts on dev_stream.
-  EXPECT_EQ(rstream_.next_cb_ts.tv_sec, wake_time_out.tv_sec);
-  EXPECT_EQ(rstream_.next_cb_ts.tv_nsec, wake_time_out.tv_nsec);
-  EXPECT_EQ(0, rc);
-  dev_stream_destroy(dev_stream);
-}
-
-TEST_F(CreateSuite, InputDevStreamWakeTimeByDevice) {
-  struct dev_stream* dev_stream;
-  unsigned int dev_id = 9;
-  int rc;
-  unsigned int curr_level = 100;
-  int written_frames;
-  struct timespec level_tstamp = {.tv_sec = 1, .tv_nsec = 0};
-  struct timespec wake_time_out = {.tv_sec = 0, .tv_nsec = 0};
-  struct timespec expected_tstamp = {.tv_sec = 0, .tv_nsec = 0};
-  struct timespec needed_time_for_device = {.tv_sec = 0, .tv_nsec = 0};
-  int needed_frames_from_device = 0;
-
-  rstream_.direction = CRAS_STREAM_INPUT;
-  dev_stream = dev_stream_create(&rstream_, dev_id, &fmt_s16le_48, (void*)0x55,
-                                 &cb_ts, NULL);
-
-  // Assume there is a next_cb_ts on rstream, that is, 1.005 seconds.
-  rstream_.next_cb_ts.tv_sec = 1;
-  rstream_.next_cb_ts.tv_nsec = 5000000;  // 5ms
-
-  // Assume there are not enough samples for stream.
-  written_frames = 123;
-  cras_shm_buffer_written(rstream_.shm, written_frames);
-
-  // Compute wake up time for device level to reach enough samples
-  // for one cb_threshold:
-  // Device has 100 samples (48K rate).
-  // Stream has 123 samples (44.1K rate)
-  // cb_threshold = 512 samples.
-  // Stream needs 512 - 123 = 389 samples.
-  // Converted to device rate => 389 * 48000.0 / 44100 = 423.4 samples
-  // => 424 samples.
-  // Device needs another 424 - 100 = 324 samples.
-  // Time for 252 samples = 324 / 48000 = 0.00675 sec.
-  // So expected wake up time for samples is at level_tstamp + 0.00675 sec =
-  // 1.00675 seconds.
-  needed_frames_from_device =
-      cras_frames_at_rate(44100, rstream_.cb_threshold - written_frames, 48000);
-  needed_frames_from_device -= curr_level;
-  cras_frames_to_time(needed_frames_from_device, 48000,
-                      &needed_time_for_device);
-
-  expected_tstamp.tv_sec = level_tstamp.tv_sec;
-  expected_tstamp.tv_nsec = level_tstamp.tv_nsec;
-
-  add_timespecs(&expected_tstamp, &needed_time_for_device);
-
-  // Set the stub data for cras_fmt_conv_out_frames_to_in.
-  out_fmt.frame_rate = 44100;
-  in_fmt.frame_rate = 48000;
-
-  rc = dev_stream_wake_time(dev_stream, curr_level, &level_tstamp,
-                            rstream_.cb_threshold, 0, &wake_time_out);
-
-  // The next wake up time is determined by needed time for device level
-  // to reach enough samples for one cb_threshold.
-  EXPECT_EQ(expected_tstamp.tv_sec, wake_time_out.tv_sec);
-  EXPECT_EQ(expected_tstamp.tv_nsec, wake_time_out.tv_nsec);
-  EXPECT_EQ(0, rc);
-
-  // Assume current level is larger than cb_threshold.
-  // The wake up time is determined by next_cb_ts.
-  curr_level += rstream_.cb_threshold;
-  rc = dev_stream_wake_time(dev_stream, curr_level, &level_tstamp,
-                            rstream_.cb_threshold, 0, &wake_time_out);
-  EXPECT_EQ(rstream_.next_cb_ts.tv_sec, wake_time_out.tv_sec);
-  EXPECT_EQ(rstream_.next_cb_ts.tv_nsec, wake_time_out.tv_nsec);
-  EXPECT_EQ(0, rc);
-  dev_stream_destroy(dev_stream);
-}
-
-TEST_F(CreateSuite, UpdateNextWakeTime) {
-  struct dev_stream* dev_stream;
-  unsigned int dev_id = 9;
-  struct timespec expected_next_cb_ts;
-
-  rstream_.direction = CRAS_STREAM_OUTPUT;
-  dev_stream = dev_stream_create(&rstream_, dev_id, &fmt_s16le_44_1,
-                                 (void*)0x55, &cb_ts, NULL);
-
-  // Case 1: The new next_cb_ts is greater than now. Do not need to reschedule.
-  rstream_.next_cb_ts.tv_sec = 2;
-  rstream_.next_cb_ts.tv_nsec = 0;
-  clock_gettime_retspec.tv_sec = 2;
-  clock_gettime_retspec.tv_nsec = 500;
-  expected_next_cb_ts = rstream_.next_cb_ts;
-
-  dev_stream_update_next_wake_time(dev_stream);
-  EXPECT_EQ(0, cras_server_metrics_missed_cb_event_called);
-  add_timespecs(&expected_next_cb_ts, &rstream_.sleep_interval_ts);
-  EXPECT_EQ(expected_next_cb_ts.tv_sec, rstream_.next_cb_ts.tv_sec);
-  EXPECT_EQ(expected_next_cb_ts.tv_nsec, rstream_.next_cb_ts.tv_nsec);
-
-  // Case 2: The new next_cb_ts is less than now. Need to reset schedule.
-  rstream_.next_cb_ts.tv_sec = 2;
-  rstream_.next_cb_ts.tv_nsec = 0;
-  clock_gettime_retspec.tv_sec = 3;
-  clock_gettime_retspec.tv_nsec = 0;
-  expected_next_cb_ts = clock_gettime_retspec;
-
-  dev_stream_update_next_wake_time(dev_stream);
-  EXPECT_EQ(1, cras_server_metrics_missed_cb_event_called);
-  add_timespecs(&expected_next_cb_ts, &rstream_.sleep_interval_ts);
-  EXPECT_EQ(expected_next_cb_ts.tv_sec, rstream_.next_cb_ts.tv_sec);
-  EXPECT_EQ(expected_next_cb_ts.tv_nsec, rstream_.next_cb_ts.tv_nsec);
-  dev_stream_destroy(dev_stream);
-}
-
-//  Test set_playback_timestamp.
-TEST(DevStreamTimimg, SetPlaybackTimeStampSimple) {
-  struct cras_timespec ts;
-
-  clock_gettime_retspec.tv_sec = 1;
-  clock_gettime_retspec.tv_nsec = 0;
-  cras_set_playback_timestamp(48000, 24000, &ts);
-  EXPECT_EQ(1, ts.tv_sec);
-  EXPECT_GE(ts.tv_nsec, 499900000);
-  EXPECT_LE(ts.tv_nsec, 500100000);
-}
-
-TEST(DevStreamTimimg, SetPlaybackTimeStampWrap) {
-  struct cras_timespec ts;
-
-  clock_gettime_retspec.tv_sec = 1;
-  clock_gettime_retspec.tv_nsec = 750000000;
-  cras_set_playback_timestamp(48000, 24000, &ts);
-  EXPECT_EQ(2, ts.tv_sec);
-  EXPECT_GE(ts.tv_nsec, 249900000);
-  EXPECT_LE(ts.tv_nsec, 250100000);
-}
-
-TEST(DevStreamTimimg, SetPlaybackTimeStampWrapTwice) {
-  struct cras_timespec ts;
-
-  clock_gettime_retspec.tv_sec = 1;
-  clock_gettime_retspec.tv_nsec = 750000000;
-  cras_set_playback_timestamp(48000, 72000, &ts);
-  EXPECT_EQ(3, ts.tv_sec);
-  EXPECT_GE(ts.tv_nsec, 249900000);
-  EXPECT_LE(ts.tv_nsec, 250100000);
-}
-
-//  Test set_capture_timestamp.
-TEST(DevStreamTimimg, SetCaptureTimeStampSimple) {
-  struct cras_timespec ts;
-
-  clock_gettime_retspec.tv_sec = 1;
-  clock_gettime_retspec.tv_nsec = 750000000;
-  cras_set_capture_timestamp(48000, 24000, &ts);
-  EXPECT_EQ(1, ts.tv_sec);
-  EXPECT_GE(ts.tv_nsec, 249900000);
-  EXPECT_LE(ts.tv_nsec, 250100000);
-}
-
-TEST(DevStreamTimimg, SetCaptureTimeStampWrap) {
-  struct cras_timespec ts;
-
-  clock_gettime_retspec.tv_sec = 1;
-  clock_gettime_retspec.tv_nsec = 0;
-  cras_set_capture_timestamp(48000, 24000, &ts);
-  EXPECT_EQ(0, ts.tv_sec);
-  EXPECT_GE(ts.tv_nsec, 499900000);
-  EXPECT_LE(ts.tv_nsec, 500100000);
-}
-
-TEST(DevStreamTimimg, SetCaptureTimeStampWrapPartial) {
-  struct cras_timespec ts;
-
-  clock_gettime_retspec.tv_sec = 2;
-  clock_gettime_retspec.tv_nsec = 750000000;
-  cras_set_capture_timestamp(48000, 72000, &ts);
-  EXPECT_EQ(1, ts.tv_sec);
-  EXPECT_GE(ts.tv_nsec, 249900000);
-  EXPECT_LE(ts.tv_nsec, 250100000);
-}
-
-TEST(MaxFramesForConverter, 8to48) {
-  EXPECT_EQ(481, max_frames_for_conversion(80,       // Stream frames.
-                                           8000,     // Stream rate.
-                                           48000));  // Device rate.
-}
-
-TEST(MaxFramesForConverter, 48to8) {
-  EXPECT_EQ(81, max_frames_for_conversion(80,      // Stream frames.
-                                          48000,   // Stream rate.
-                                          8000));  // Device rate.
-}
-
-/* Stubs */
-extern "C" {
-
-int cras_rstream_audio_ready(struct cras_rstream* stream, size_t count) {
-  cras_rstream_audio_ready_count = count;
-  cras_rstream_audio_ready_called++;
-  return 0;
-}
-
-int cras_rstream_request_audio(struct cras_rstream* stream,
-                               const struct timespec* now) {
-  return 0;
-}
-
-void cras_rstream_record_fetch_interval(struct cras_rstream* rstream,
-                                        const struct timespec* now) {}
-
-void cras_rstream_update_input_write_pointer(struct cras_rstream* rstream) {}
-
-void cras_rstream_update_output_read_pointer(struct cras_rstream* rstream) {}
-
-void cras_rstream_dev_offset_update(struct cras_rstream* rstream,
-                                    unsigned int frames,
-                                    unsigned int dev_id) {}
-
-void cras_rstream_dev_attach(struct cras_rstream* rstream,
-                             unsigned int dev_id,
-                             void* dev_ptr) {}
-
-void cras_rstream_dev_detach(struct cras_rstream* rstream,
-                             unsigned int dev_id) {}
-
-unsigned int cras_rstream_dev_offset(const struct cras_rstream* rstream,
-                                     unsigned int dev_id) {
-  return 0;
-}
-
-unsigned int cras_rstream_playable_frames(struct cras_rstream* rstream,
-                                          unsigned int dev_id) {
-  return rstream_playable_frames_ret;
-}
-
-float cras_rstream_get_volume_scaler(struct cras_rstream* rstream) {
-  return 1.0;
-}
-
-uint8_t* cras_rstream_get_readable_frames(struct cras_rstream* rstream,
-                                          unsigned int offset,
-                                          size_t* frames) {
-  rstream_get_readable_call.rstream = rstream;
-  rstream_get_readable_call.offset = offset;
-  rstream_get_readable_call.num_called++;
-  *frames = rstream_get_readable_num;
-  return rstream_get_readable_ptr;
-}
-
-int cras_rstream_get_mute(const struct cras_rstream* rstream) {
-  return 0;
-}
-void cras_rstream_update_queued_frames(struct cras_rstream* rstream) {}
-
-struct cras_audio_format* cras_rstream_post_processing_format(
-    const struct cras_rstream* stream,
-    void* dev_ptr) {
-  return cras_rstream_post_processing_format_val;
-}
-void* buffer_share_get_data(const struct buffer_share* mix, unsigned int id) {
-  return NULL;
-};
-void cras_apm_list_start_apm(struct cras_apm_list* list, void* dev_ptr){};
-void cras_apm_list_stop_apm(struct cras_apm_list* list, void* dev_ptr){};
-
-int config_format_converter(struct cras_fmt_conv** conv,
-                            enum CRAS_STREAM_DIRECTION dir,
-                            const struct cras_audio_format* from,
-                            const struct cras_audio_format* to,
-                            unsigned int frames) {
-  config_format_converter_called++;
-  config_format_converter_from_fmt = from;
-  config_format_converter_frames = frames;
-  *conv = config_format_converter_conv;
-  return 0;
-}
-
-void cras_fmt_conv_destroy(struct cras_fmt_conv* conv) {}
-
-size_t cras_fmt_conv_convert_frames(struct cras_fmt_conv* conv,
-                                    uint8_t* in_buf,
-                                    uint8_t* out_buf,
-                                    unsigned int* in_frames,
-                                    unsigned int out_frames) {
-  unsigned int ret;
-  conv_frames_call.conv = conv;
-  conv_frames_call.in_buf = in_buf;
-  conv_frames_call.out_buf = out_buf;
-  conv_frames_call.in_frames = *in_frames;
-  ret = cras_frames_at_rate(in_fmt.frame_rate, *in_frames, out_fmt.frame_rate);
-  conv_frames_call.out_frames = out_frames;
-  if (ret > out_frames) {
-    ret = out_frames;
-    *in_frames =
-        cras_frames_at_rate(out_fmt.frame_rate, ret, in_fmt.frame_rate);
-  }
-
-  return ret;
-}
-
-void cras_mix_add(snd_pcm_format_t fmt,
-                  uint8_t* dst,
-                  uint8_t* src,
-                  unsigned int count,
-                  unsigned int index,
-                  int mute,
-                  float mix_vol) {
-  mix_add_call.dst = (int16_t*)dst;
-  mix_add_call.src = (int16_t*)src;
-  mix_add_call.count = count;
-  mix_add_call.index = index;
-  mix_add_call.mute = mute;
-  mix_add_call.mix_vol = mix_vol;
-}
-
-struct cras_audio_area* cras_audio_area_create(int num_channels) {
-  cras_audio_area_create_num_channels_val = num_channels;
-  return NULL;
-}
-
-void cras_audio_area_destroy(struct cras_audio_area* area) {}
-
-void cras_audio_area_config_buf_pointers(struct cras_audio_area* area,
-                                         const struct cras_audio_format* fmt,
-                                         uint8_t* base_buffer) {}
-
-void cras_audio_area_config_channels(struct cras_audio_area* area,
-                                     const struct cras_audio_format* fmt) {}
-
-unsigned int cras_audio_area_copy(const struct cras_audio_area* dst,
-                                  unsigned int dst_offset,
-                                  const struct cras_audio_format* dst_fmt,
-                                  const struct cras_audio_area* src,
-                                  unsigned int src_offset,
-                                  float software_gain_scaler) {
-  copy_area_call.dst = dst;
-  copy_area_call.dst_offset = dst_offset;
-  copy_area_call.dst_format_bytes = cras_get_format_bytes(dst_fmt);
-  copy_area_call.src = src;
-  copy_area_call.src_offset = src_offset;
-  copy_area_call.software_gain_scaler = software_gain_scaler;
-  return src->frames;
-}
-
-size_t cras_fmt_conv_in_frames_to_out(struct cras_fmt_conv* conv,
-                                      size_t in_frames) {
-  return cras_frames_at_rate(in_fmt.frame_rate, in_frames, out_fmt.frame_rate);
-}
-
-size_t cras_fmt_conv_out_frames_to_in(struct cras_fmt_conv* conv,
-                                      size_t out_frames) {
-  return cras_frames_at_rate(out_fmt.frame_rate, out_frames, in_fmt.frame_rate);
-}
-
-const struct cras_audio_format* cras_fmt_conv_in_format(
-    const struct cras_fmt_conv* conv) {
-  return &in_fmt;
-}
-
-const struct cras_audio_format* cras_fmt_conv_out_format(
-    const struct cras_fmt_conv* conv) {
-  return &out_fmt;
-}
-
-int cras_fmt_conversion_needed(const struct cras_fmt_conv* conv) {
-  return cras_fmt_conversion_needed_val;
-}
-
-void cras_fmt_conv_set_linear_resample_rates(struct cras_fmt_conv* conv,
-                                             float from,
-                                             float to) {
-  cras_fmt_conv_set_linear_resample_rates_from = from;
-  cras_fmt_conv_set_linear_resample_rates_to = to;
-  cras_fmt_conv_set_linear_resample_rates_called++;
-}
-
-int cras_rstream_is_pending_reply(const struct cras_rstream* stream) {
-  return cras_rstream_is_pending_reply_ret;
-}
-
-int cras_rstream_flush_old_audio_messages(struct cras_rstream* stream) {
-  cras_rstream_flush_old_audio_messages_called++;
-  return 0;
-}
-
-int cras_server_metrics_missed_cb_event(struct cras_rstream* stream) {
-  cras_server_metrics_missed_cb_event_called++;
-  return 0;
-}
-
-//  From librt.
-int clock_gettime(clockid_t clk_id, struct timespec* tp) {
-  tp->tv_sec = clock_gettime_retspec.tv_sec;
-  tp->tv_nsec = clock_gettime_retspec.tv_nsec;
-  return 0;
-}
-
-}  // extern "C"
-
-}  //  namespace
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tests/device_blocklist_unittest.cc b/cras/src/tests/device_blocklist_unittest.cc
deleted file mode 100644
index 44a976e..0000000
--- a/cras/src/tests/device_blocklist_unittest.cc
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <gtest/gtest.h>
-#include <stdio.h>
-
-extern "C" {
-#include "cras_device_blocklist.h"
-}
-
-namespace {
-
-static const char CONFIG_PATH[] = CRAS_UT_TMPDIR;
-static const char CONFIG_FILENAME[] = "device_blocklist";
-
-void CreateConfigFile(const char* config_text) {
-  FILE* f;
-  char card_path[128];
-
-  snprintf(card_path, sizeof(card_path), "%s/%s", CONFIG_PATH, CONFIG_FILENAME);
-  f = fopen(card_path, "w");
-  if (f == NULL)
-    return;
-
-  fprintf(f, "%s", config_text);
-
-  fclose(f);
-}
-
-TEST(Blocklist, EmptyBlocklist) {
-  static const char empty_config_text[] = "";
-  struct cras_device_blocklist* blocklist;
-
-  CreateConfigFile(empty_config_text);
-
-  blocklist = cras_device_blocklist_create(CONFIG_PATH);
-  ASSERT_NE(static_cast<cras_device_blocklist*>(NULL), blocklist);
-  EXPECT_EQ(0, cras_device_blocklist_check(blocklist, 0x0d8c, 0x0008, 0, 0));
-
-  cras_device_blocklist_destroy(blocklist);
-}
-
-TEST(Blocklist, BlockListOneUsbOutput) {
-  static const char usb_output_config_text[] =
-      "[USB_Outputs]\n"
-      "0d8c_0008_00000012_0 = 1\n";
-  struct cras_device_blocklist* blocklist;
-
-  CreateConfigFile(usb_output_config_text);
-
-  blocklist = cras_device_blocklist_create(CONFIG_PATH);
-  ASSERT_NE(static_cast<cras_device_blocklist*>(NULL), blocklist);
-
-  EXPECT_EQ(0, cras_device_blocklist_check(blocklist, 0x0d8d, 0x0008, 0x12, 0));
-  EXPECT_EQ(0, cras_device_blocklist_check(blocklist, 0x0d8c, 0x0009, 0x12, 0));
-  EXPECT_EQ(0, cras_device_blocklist_check(blocklist, 0x0d8c, 0x0008, 0x13, 0));
-  EXPECT_EQ(0, cras_device_blocklist_check(blocklist, 0x0d8c, 0x0008, 0x12, 1));
-  EXPECT_EQ(1, cras_device_blocklist_check(blocklist, 0x0d8c, 0x0008, 0x12, 0));
-
-  cras_device_blocklist_destroy(blocklist);
-}
-
-TEST(Blocklist, BlockListTwoUsbOutput) {
-  static const char usb_output_config_text[] =
-      "[USB_Outputs]\n"
-      "0d8c_0008_00000000_0 = 1\n"
-      "0d8c_0009_00000000_0 = 1\n";
-  struct cras_device_blocklist* blocklist;
-
-  CreateConfigFile(usb_output_config_text);
-
-  blocklist = cras_device_blocklist_create(CONFIG_PATH);
-  ASSERT_NE(static_cast<cras_device_blocklist*>(NULL), blocklist);
-
-  EXPECT_EQ(1, cras_device_blocklist_check(blocklist, 0x0d8c, 0x0009, 0, 0));
-  EXPECT_EQ(1, cras_device_blocklist_check(blocklist, 0x0d8c, 0x0008, 0, 0));
-  EXPECT_EQ(0, cras_device_blocklist_check(blocklist, 0x0d8c, 0x0008, 0, 1));
-
-  cras_device_blocklist_destroy(blocklist);
-}
-
-}  //  namespace
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tests/device_monitor_unittest.cc b/cras/src/tests/device_monitor_unittest.cc
deleted file mode 100644
index 31c2e8c..0000000
--- a/cras/src/tests/device_monitor_unittest.cc
+++ /dev/null
@@ -1,150 +0,0 @@
-// Copyright 2016 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <gtest/gtest.h>
-#include <stdio.h>
-
-extern "C" {
-#include "cras_device_monitor.c"
-#include "cras_iodev.h"
-#include "cras_main_message.h"
-}
-
-static enum CRAS_MAIN_MESSAGE_TYPE type_set;
-static struct cras_device_monitor_message* sent_msg;
-static int resume_dev_called;
-unsigned int resume_dev_idx;
-static int suspend_dev_called;
-unsigned int suspend_dev_idx;
-static int set_mute_called;
-unsigned int mute_dev_idx;
-unsigned int fake_dev_idx = 123;
-
-void ResetStubData() {
-  type_set = (enum CRAS_MAIN_MESSAGE_TYPE)0;
-  resume_dev_called = 0;
-  resume_dev_idx = 0;
-  suspend_dev_called = 0;
-  suspend_dev_idx = 0;
-  set_mute_called = 0;
-  mute_dev_idx = 0;
-}
-
-namespace {
-
-TEST(DeviceMonitorTestSuite, Init) {
-  ResetStubData();
-
-  cras_device_monitor_init();
-
-  EXPECT_EQ(type_set, CRAS_MAIN_MONITOR_DEVICE);
-}
-
-TEST(DeviceMonitorTestSuite, ResetDevice) {
-  ResetStubData();
-  // sent_msg will be filled with message content in cras_main_message_send.
-  sent_msg = (struct cras_device_monitor_message*)calloc(1, sizeof(*sent_msg));
-
-  cras_device_monitor_reset_device(fake_dev_idx);
-
-  EXPECT_EQ(sent_msg->header.type, CRAS_MAIN_MONITOR_DEVICE);
-  EXPECT_EQ(sent_msg->header.length, sizeof(*sent_msg));
-  EXPECT_EQ(sent_msg->message_type, RESET_DEVICE);
-  EXPECT_EQ(sent_msg->dev_idx, fake_dev_idx);
-
-  free(sent_msg);
-}
-
-TEST(DeviceMonitorTestSuite, HandleResetDevice) {
-  struct cras_device_monitor_message msg;
-  struct cras_main_message* main_message =
-      reinterpret_cast<struct cras_main_message*>(&msg);
-
-  ResetStubData();
-
-  // Filled msg with message content for resetting device.
-  init_device_msg(&msg, RESET_DEVICE, fake_dev_idx);
-  // Assume the pipe works fine and main message handler receives the same
-  // message.
-  handle_device_message(main_message, NULL);
-
-  // Verify that disable/enable functions are called with correct device.
-  EXPECT_EQ(resume_dev_called, 1);
-  EXPECT_EQ(resume_dev_idx, fake_dev_idx);
-  EXPECT_EQ(suspend_dev_called, 1);
-  EXPECT_EQ(suspend_dev_idx, fake_dev_idx);
-}
-
-TEST(DeviceMonitorTestSuite, MuteDevice) {
-  ResetStubData();
-  // sent_msg will be filled with message content in cras_main_message_send.
-  sent_msg = (struct cras_device_monitor_message*)calloc(1, sizeof(*sent_msg));
-
-  cras_device_monitor_set_device_mute_state(fake_dev_idx);
-
-  EXPECT_EQ(sent_msg->header.type, CRAS_MAIN_MONITOR_DEVICE);
-  EXPECT_EQ(sent_msg->header.length, sizeof(*sent_msg));
-  EXPECT_EQ(sent_msg->message_type, SET_MUTE_STATE);
-  EXPECT_EQ(sent_msg->dev_idx, fake_dev_idx);
-
-  free(sent_msg);
-}
-
-TEST(DeviceMonitorTestSuite, HandleMuteDevice) {
-  struct cras_device_monitor_message msg;
-  struct cras_main_message* main_message =
-      reinterpret_cast<struct cras_main_message*>(&msg);
-
-  ResetStubData();
-
-  // Filled msg with message content for device mute/unmute.
-  init_device_msg(&msg, SET_MUTE_STATE, fake_dev_idx);
-  // Assume the pipe works fine and main message handler receives the same
-  // message.
-  handle_device_message(main_message, NULL);
-
-  // Verify that cras_iodev_set_mute is called with correct device.
-  EXPECT_EQ(set_mute_called, 1);
-  EXPECT_EQ(mute_dev_idx, fake_dev_idx);
-}
-
-extern "C" {
-
-int cras_main_message_add_handler(enum CRAS_MAIN_MESSAGE_TYPE type,
-                                  cras_message_callback callback,
-                                  void* callback_data) {
-  type_set = type;
-  return 0;
-}
-
-int cras_main_message_send(struct cras_main_message* msg) {
-  // Copy the sent message so we can examine it in the test later.
-  memcpy(sent_msg, msg, sizeof(*sent_msg));
-  return 0;
-};
-
-void cras_iodev_list_resume_dev(unsigned int dev_idx) {
-  resume_dev_called++;
-  resume_dev_idx = dev_idx;
-}
-
-void cras_iodev_list_suspend_dev(unsigned int dev_idx) {
-  suspend_dev_called++;
-  suspend_dev_idx = dev_idx;
-}
-
-void cras_iodev_list_set_dev_mute(unsigned int dev_idx) {
-  set_mute_called++;
-  mute_dev_idx = dev_idx;
-}
-
-}  // extern "C"
-}  // namespace
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  int rc = RUN_ALL_TESTS();
-
-  return rc;
-}
diff --git a/cras/src/tests/dsp_core_unittest.cc b/cras/src/tests/dsp_core_unittest.cc
deleted file mode 100644
index 82c7957..0000000
--- a/cras/src/tests/dsp_core_unittest.cc
+++ /dev/null
@@ -1,433 +0,0 @@
-// Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <gtest/gtest.h>
-#include <math.h>
-
-#include "crossover.h"
-#include "crossover2.h"
-#include "drc.h"
-#include "dsp_util.h"
-#include "eq.h"
-#include "eq2.h"
-
-namespace {
-
-/* Adds amplitude * sin(pi*freq*i + offset) to the data array. */
-static void add_sine(float* data,
-                     size_t len,
-                     float freq,
-                     float offset,
-                     float amplitude) {
-  for (size_t i = 0; i < len; i++)
-    data[i] += amplitude * sinf((float)M_PI * freq * i + offset);
-}
-
-/* Calculates the magnitude at normalized frequency f. The output is
- * the result of DFT, multiplied by 2/len. */
-static float magnitude_at(float* data, size_t len, float f) {
-  double re = 0, im = 0;
-  f *= (float)M_PI;
-  for (size_t i = 0; i < len; i++) {
-    re += data[i] * cos(i * f);
-    im += data[i] * sin(i * f);
-  }
-  return sqrt(re * re + im * im) * (2.0 / len);
-}
-
-TEST(InterleaveTest, All) {
-  const int FRAMES = 12;
-  const int SAMPLES = FRAMES * 2;
-
-  /* Repeat the same data twice, so it will exercise neon/sse
-   * optimized functions. */
-  int16_t input[SAMPLES] = {
-      -32768, -32767, -32766, -2, -1, 0, 1, 2, 3, 32765, 32766, 32767,
-      -32768, -32767, -32766, -2, -1, 0, 1, 2, 3, 32765, 32766, 32767};
-
-  float answer[SAMPLES] = {-1,
-                           -32766 / 32768.0f,
-                           -1 / 32768.0f,
-                           1 / 32768.0f,
-                           3 / 32768.0f,
-                           32766 / 32768.0f,
-                           -1,
-                           -32766 / 32768.0f,
-                           -1 / 32768.0f,
-                           1 / 32768.0f,
-                           3 / 32768.0f,
-                           32766 / 32768.0f,
-                           -32767 / 32768.0f,
-                           -2 / 32768.0f,
-                           0,
-                           2 / 32768.0f,
-                           32765 / 32768.0f,
-                           32767 / 32768.0f,
-                           -32767 / 32768.0f,
-                           -2 / 32768.0f,
-                           0,
-                           2 / 32768.0f,
-                           32765 / 32768.0f,
-                           32767 / 32768.0f};
-
-  float output[SAMPLES];
-  float* out_ptr[] = {output, output + FRAMES};
-
-  dsp_util_deinterleave((uint8_t*)input, out_ptr, 2, SND_PCM_FORMAT_S16_LE,
-                        FRAMES);
-
-  for (int i = 0; i < SAMPLES; i++) {
-    EXPECT_EQ(answer[i], output[i]);
-  }
-
-  /* dsp_util_interleave() should round to nearest number. */
-  for (int i = 0; i < SAMPLES; i += 2) {
-    output[i] += 0.499 / 32768.0f;
-    output[i + 1] -= 0.499 / 32768.0f;
-  }
-
-  int16_t output2[SAMPLES];
-  dsp_util_interleave(out_ptr, (uint8_t*)output2, 2, SND_PCM_FORMAT_S16_LE,
-                      FRAMES);
-  for (int i = 0; i < SAMPLES; i++) {
-    EXPECT_EQ(input[i], output2[i]);
-  }
-}
-
-TEST(EqTest, All) {
-  struct eq* eq;
-  size_t len = 44100;
-  float NQ = len / 2;
-  float f_low = 10 / NQ;
-  float f_mid = 100 / NQ;
-  float f_high = 1000 / NQ;
-  float* data = (float*)malloc(sizeof(float) * len);
-
-  dsp_enable_flush_denormal_to_zero();
-  /* low pass */
-  memset(data, 0, sizeof(float) * len);
-  add_sine(data, len, f_low, 0, 1);  // 10Hz sine, magnitude = 1
-  EXPECT_FLOAT_EQ(1, magnitude_at(data, len, f_low));
-  add_sine(data, len, f_high, 0, 1);  // 1000Hz sine, magnitude = 1
-  EXPECT_FLOAT_EQ(1, magnitude_at(data, len, f_low));
-  EXPECT_FLOAT_EQ(1, magnitude_at(data, len, f_high));
-
-  eq = eq_new();
-  EXPECT_EQ(0, eq_append_biquad(eq, BQ_LOWPASS, f_mid, 0, 0));
-  eq_process(eq, data, len);
-  EXPECT_NEAR(1, magnitude_at(data, len, f_low), 0.01);
-  EXPECT_NEAR(0, magnitude_at(data, len, f_high), 0.01);
-
-  /* Test for empty input */
-  eq_process(eq, NULL, 0);
-
-  eq_free(eq);
-
-  /* high pass */
-  memset(data, 0, sizeof(float) * len);
-  add_sine(data, len, f_low, 0, 1);
-  add_sine(data, len, f_high, 0, 1);
-
-  eq = eq_new();
-  EXPECT_EQ(0, eq_append_biquad(eq, BQ_HIGHPASS, f_mid, 0, 0));
-  eq_process(eq, data, len);
-  EXPECT_NEAR(0, magnitude_at(data, len, f_low), 0.01);
-  EXPECT_NEAR(1, magnitude_at(data, len, f_high), 0.01);
-  eq_free(eq);
-
-  /* peaking */
-  memset(data, 0, sizeof(float) * len);
-  add_sine(data, len, f_low, 0, 1);
-  add_sine(data, len, f_high, 0, 1);
-
-  eq = eq_new();
-  EXPECT_EQ(0,
-            eq_append_biquad(eq, BQ_PEAKING, f_high, 5, 6));  // Q=5, 6dB gain
-  eq_process(eq, data, len);
-  EXPECT_NEAR(1, magnitude_at(data, len, f_low), 0.01);
-  EXPECT_NEAR(2, magnitude_at(data, len, f_high), 0.01);
-  eq_free(eq);
-
-  free(data);
-
-  /* Too many biquads */
-  eq = eq_new();
-  for (int i = 0; i < MAX_BIQUADS_PER_EQ; i++) {
-    EXPECT_EQ(0, eq_append_biquad(eq, BQ_PEAKING, f_high, 5, 6));
-  }
-  EXPECT_EQ(-1, eq_append_biquad(eq, BQ_PEAKING, f_high, 5, 6));
-  eq_free(eq);
-}
-
-TEST(Eq2Test, All) {
-  struct eq2* eq2;
-  size_t len = 44100;
-  float NQ = len / 2;
-  float f_low = 10 / NQ;
-  float f_mid = 100 / NQ;
-  float f_high = 1000 / NQ;
-  float* data0 = (float*)malloc(sizeof(float) * len);
-  float* data1 = (float*)malloc(sizeof(float) * len);
-
-  dsp_enable_flush_denormal_to_zero();
-
-  /* a mixture of 10Hz an 1000Hz sine */
-  memset(data0, 0, sizeof(float) * len);
-  memset(data1, 0, sizeof(float) * len);
-  add_sine(data0, len, f_low, 0, 1);   // 10Hz sine, magnitude = 1
-  add_sine(data0, len, f_high, 0, 1);  // 1000Hz sine, magnitude = 1
-  add_sine(data1, len, f_low, 0, 1);   // 10Hz sine, magnitude = 1
-  add_sine(data1, len, f_high, 0, 1);  // 1000Hz sine, magnitude = 1
-
-  /* low pass at left and high pass at right */
-  eq2 = eq2_new();
-  EXPECT_EQ(0, eq2_append_biquad(eq2, 0, BQ_LOWPASS, f_mid, 0, 0));
-  EXPECT_EQ(0, eq2_append_biquad(eq2, 1, BQ_HIGHPASS, f_mid, 0, 0));
-  eq2_process(eq2, data0, data1, len);
-  EXPECT_NEAR(1, magnitude_at(data0, len, f_low), 0.01);
-  EXPECT_NEAR(0, magnitude_at(data0, len, f_high), 0.01);
-  EXPECT_NEAR(0, magnitude_at(data1, len, f_low), 0.01);
-  EXPECT_NEAR(1, magnitude_at(data1, len, f_high), 0.01);
-
-  /* Test for empty input */
-  eq2_process(eq2, NULL, NULL, 0);
-  eq2_free(eq2);
-
-  /* a mixture of 10Hz and 1000Hz sine */
-  memset(data0, 0, sizeof(float) * len);
-  memset(data1, 0, sizeof(float) * len);
-  add_sine(data0, len, f_low, 0, 1);
-  add_sine(data0, len, f_high, 0, 1);
-  add_sine(data1, len, f_low, 0, 1);
-  add_sine(data1, len, f_high, 0, 1);
-
-  /* one high-shelving biquad at left and two low-shelving biquads at right */
-  eq2 = eq2_new();
-  EXPECT_EQ(0, eq2_append_biquad(eq2, 0, BQ_HIGHSHELF, f_mid, 5, 6));
-  EXPECT_EQ(0, eq2_append_biquad(eq2, 1, BQ_LOWSHELF, f_mid, 0, -6));
-  EXPECT_EQ(0, eq2_append_biquad(eq2, 1, BQ_LOWSHELF, f_mid, 0, -6));
-
-  eq2_process(eq2, data0, data1, len);
-  EXPECT_NEAR(1, magnitude_at(data0, len, f_low), 0.01);
-  EXPECT_NEAR(2, magnitude_at(data0, len, f_high), 0.01);
-  EXPECT_NEAR(0.25, magnitude_at(data1, len, f_low), 0.01);
-  EXPECT_NEAR(1, magnitude_at(data1, len, f_high), 0.01);
-  eq2_free(eq2);
-
-  free(data0);
-  free(data1);
-
-  /* Too many biquads */
-  eq2 = eq2_new();
-  for (int i = 0; i < MAX_BIQUADS_PER_EQ2; i++) {
-    EXPECT_EQ(0, eq2_append_biquad(eq2, 0, BQ_PEAKING, f_high, 5, 6));
-    EXPECT_EQ(0, eq2_append_biquad(eq2, 1, BQ_PEAKING, f_high, 5, 6));
-  }
-  EXPECT_EQ(-1, eq2_append_biquad(eq2, 0, BQ_PEAKING, f_high, 5, 6));
-  EXPECT_EQ(-1, eq2_append_biquad(eq2, 1, BQ_PEAKING, f_high, 5, 6));
-  eq2_free(eq2);
-}
-
-TEST(CrossoverTest, All) {
-  struct crossover xo;
-  size_t len = 44100;
-  float NQ = len / 2;
-  float f0 = 62.5 / NQ;
-  float f1 = 250 / NQ;
-  float f2 = 1000 / NQ;
-  float f3 = 4000 / NQ;
-  float f4 = 16000 / NQ;
-  float* data = (float*)malloc(sizeof(float) * len);
-  float* data1 = (float*)malloc(sizeof(float) * len);
-  float* data2 = (float*)malloc(sizeof(float) * len);
-
-  dsp_enable_flush_denormal_to_zero();
-  crossover_init(&xo, f1, f3);
-  memset(data, 0, sizeof(float) * len);
-  add_sine(data, len, f0, 0, 1);
-  add_sine(data, len, f2, 0, 1);
-  add_sine(data, len, f4, 0, 1);
-
-  crossover_process(&xo, len, data, data1, data2);
-
-  // low band
-  EXPECT_NEAR(1, magnitude_at(data, len, f0), 0.01);
-  EXPECT_NEAR(0, magnitude_at(data, len, f2), 0.01);
-  EXPECT_NEAR(0, magnitude_at(data, len, f4), 0.01);
-
-  // mid band
-  EXPECT_NEAR(0, magnitude_at(data1, len, f0), 0.01);
-  EXPECT_NEAR(1, magnitude_at(data1, len, f2), 0.01);
-  EXPECT_NEAR(0, magnitude_at(data1, len, f4), 0.01);
-
-  // high band
-  EXPECT_NEAR(0, magnitude_at(data2, len, f0), 0.01);
-  EXPECT_NEAR(0, magnitude_at(data2, len, f2), 0.01);
-  EXPECT_NEAR(1, magnitude_at(data2, len, f4), 0.01);
-
-  /* Test for empty input */
-  crossover_process(&xo, 0, NULL, NULL, NULL);
-
-  free(data);
-  free(data1);
-  free(data2);
-}
-
-TEST(Crossover2Test, All) {
-  struct crossover2 xo2;
-  size_t len = 44100;
-  float NQ = len / 2;
-  float f0 = 62.5 / NQ;
-  float f1 = 250 / NQ;
-  float f2 = 1000 / NQ;
-  float f3 = 4000 / NQ;
-  float f4 = 16000 / NQ;
-  float* data0L = (float*)malloc(sizeof(float) * len);
-  float* data1L = (float*)malloc(sizeof(float) * len);
-  float* data2L = (float*)malloc(sizeof(float) * len);
-  float* data0R = (float*)malloc(sizeof(float) * len);
-  float* data1R = (float*)malloc(sizeof(float) * len);
-  float* data2R = (float*)malloc(sizeof(float) * len);
-
-  dsp_enable_flush_denormal_to_zero();
-  crossover2_init(&xo2, f1, f3);
-  memset(data0L, 0, sizeof(float) * len);
-  memset(data0R, 0, sizeof(float) * len);
-
-  add_sine(data0L, len, f0, 0, 1);
-  add_sine(data0L, len, f2, 0, 1);
-  add_sine(data0L, len, f4, 0, 1);
-
-  add_sine(data0R, len, f0, 0, 0.5);
-  add_sine(data0R, len, f2, 0, 0.5);
-  add_sine(data0R, len, f4, 0, 0.5);
-
-  crossover2_process(&xo2, len, data0L, data0R, data1L, data1R, data2L, data2R);
-
-  // left low band
-  EXPECT_NEAR(1, magnitude_at(data0L, len, f0), 0.01);
-  EXPECT_NEAR(0, magnitude_at(data0L, len, f2), 0.01);
-  EXPECT_NEAR(0, magnitude_at(data0L, len, f4), 0.01);
-
-  // left mid band
-  EXPECT_NEAR(0, magnitude_at(data1L, len, f0), 0.01);
-  EXPECT_NEAR(1, magnitude_at(data1L, len, f2), 0.01);
-  EXPECT_NEAR(0, magnitude_at(data1L, len, f4), 0.01);
-
-  // left high band
-  EXPECT_NEAR(0, magnitude_at(data2L, len, f0), 0.01);
-  EXPECT_NEAR(0, magnitude_at(data2L, len, f2), 0.01);
-  EXPECT_NEAR(1, magnitude_at(data2L, len, f4), 0.01);
-
-  // right low band
-  EXPECT_NEAR(0.5, magnitude_at(data0R, len, f0), 0.005);
-  EXPECT_NEAR(0, magnitude_at(data0R, len, f2), 0.005);
-  EXPECT_NEAR(0, magnitude_at(data0R, len, f4), 0.005);
-
-  // right mid band
-  EXPECT_NEAR(0, magnitude_at(data1R, len, f0), 0.005);
-  EXPECT_NEAR(0.5, magnitude_at(data1R, len, f2), 0.005);
-  EXPECT_NEAR(0, magnitude_at(data1R, len, f4), 0.005);
-
-  // right high band
-  EXPECT_NEAR(0, magnitude_at(data2R, len, f0), 0.005);
-  EXPECT_NEAR(0, magnitude_at(data2R, len, f2), 0.005);
-  EXPECT_NEAR(0.5, magnitude_at(data2R, len, f4), 0.005);
-
-  /* Test for empty input */
-  crossover2_process(&xo2, 0, NULL, NULL, NULL, NULL, NULL, NULL);
-
-  free(data0L);
-  free(data1L);
-  free(data2L);
-  free(data0R);
-  free(data1R);
-  free(data2R);
-}
-
-TEST(DrcTest, All) {
-  size_t len = 44100;
-  float NQ = len / 2;
-  float f0 = 62.5 / NQ;
-  float f1 = 250 / NQ;
-  float f2 = 1000 / NQ;
-  float f3 = 4000 / NQ;
-  float f4 = 16000 / NQ;
-  float* data_left = (float*)malloc(sizeof(float) * len);
-  float* data_right = (float*)malloc(sizeof(float) * len);
-  float* data[] = {data_left, data_right};
-  float* data_empty[] = {NULL, NULL};
-  struct drc* drc;
-
-  dsp_enable_flush_denormal_to_zero();
-  drc = drc_new(44100);
-
-  drc_set_param(drc, 0, PARAM_CROSSOVER_LOWER_FREQ, 0);
-  drc_set_param(drc, 0, PARAM_ENABLED, 1);
-  drc_set_param(drc, 0, PARAM_THRESHOLD, -30);
-  drc_set_param(drc, 0, PARAM_KNEE, 0);
-  drc_set_param(drc, 0, PARAM_RATIO, 3);
-  drc_set_param(drc, 0, PARAM_ATTACK, 0.02);
-  drc_set_param(drc, 0, PARAM_RELEASE, 0.2);
-  drc_set_param(drc, 0, PARAM_POST_GAIN, 0);
-
-  drc_set_param(drc, 1, PARAM_CROSSOVER_LOWER_FREQ, f1);
-  drc_set_param(drc, 1, PARAM_ENABLED, 0);
-  drc_set_param(drc, 1, PARAM_THRESHOLD, -30);
-  drc_set_param(drc, 1, PARAM_KNEE, 0);
-  drc_set_param(drc, 1, PARAM_RATIO, 3);
-  drc_set_param(drc, 1, PARAM_ATTACK, 0.02);
-  drc_set_param(drc, 1, PARAM_RELEASE, 0.2);
-  drc_set_param(drc, 1, PARAM_POST_GAIN, 0);
-
-  drc_set_param(drc, 2, PARAM_CROSSOVER_LOWER_FREQ, f3);
-  drc_set_param(drc, 2, PARAM_ENABLED, 1);
-  drc_set_param(drc, 2, PARAM_THRESHOLD, -30);
-  drc_set_param(drc, 2, PARAM_KNEE, 0);
-  drc_set_param(drc, 2, PARAM_RATIO, 1);
-  drc_set_param(drc, 2, PARAM_ATTACK, 0.02);
-  drc_set_param(drc, 2, PARAM_RELEASE, 0.2);
-  drc_set_param(drc, 2, PARAM_POST_GAIN, 20);
-
-  drc_init(drc);
-
-  memset(data_left, 0, sizeof(float) * len);
-  memset(data_right, 0, sizeof(float) * len);
-  add_sine(data_left, len, f0, 0, 1);
-  add_sine(data_left, len, f2, 0, 1);
-  add_sine(data_left, len, f4, 0, 1);
-  add_sine(data_right, len, f0, 0, 1);
-  add_sine(data_right, len, f2, 0, 1);
-  add_sine(data_right, len, f4, 0, 1);
-
-  for (size_t start = 0; start < len; start += DRC_PROCESS_MAX_FRAMES) {
-    int chunk = std::min(len - start, (size_t)DRC_PROCESS_MAX_FRAMES);
-    drc_process(drc, data, chunk);
-    data[0] += chunk;
-    data[1] += chunk;
-  }
-
-  /* This is -8dB because there is a 12dB makeup (20dB^0.6) inside the DRC */
-  EXPECT_NEAR(0.4, magnitude_at(data_right, len, f0), 0.1);
-
-  /* This is 0dB because the DRC is disabled */
-  EXPECT_NEAR(1, magnitude_at(data_right, len, f2), 0.1);
-
-  /* This is 20dB because of the post gain */
-  EXPECT_NEAR(10, magnitude_at(data_right, len, f4), 1);
-
-  /* Test for empty input */
-  drc_process(drc, data_empty, 0);
-
-  drc_free(drc);
-  free(data_left);
-  free(data_right);
-}
-
-}  //  namespace
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tests/dsp_ini_unittest.cc b/cras/src/tests/dsp_ini_unittest.cc
deleted file mode 100644
index ee18790..0000000
--- a/cras/src/tests/dsp_ini_unittest.cc
+++ /dev/null
@@ -1,308 +0,0 @@
-// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <gtest/gtest.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "cras_dsp_ini.h"
-
-#define FILENAME_TEMPLATE "DspIniTest.XXXXXX"
-
-namespace {
-
-class DspIniTestSuite : public testing::Test {
- protected:
-  virtual void SetUp() {
-    strcpy(filename, FILENAME_TEMPLATE);
-    int fd = mkstemp(filename);
-    fp = fdopen(fd, "w");
-  }
-
-  virtual void TearDown() {
-    CloseFile();
-    unlink(filename);
-  }
-
-  virtual void CloseFile() {
-    if (fp) {
-      fclose(fp);
-      fp = NULL;
-    }
-  }
-
-  char filename[sizeof(FILENAME_TEMPLATE) + 1];
-  FILE* fp;
-};
-
-TEST_F(DspIniTestSuite, EmptyIni) {
-  struct ini* ini = cras_dsp_ini_create(filename);
-  EXPECT_EQ(0, ARRAY_COUNT(&ini->plugins));
-  EXPECT_EQ(0, ARRAY_COUNT(&ini->flows));
-  cras_dsp_ini_free(ini);
-}
-
-TEST_F(DspIniTestSuite, NoLibraryOrLabel) {
-  fprintf(fp, "[Test]\n");
-  CloseFile();
-
-  struct ini* ini = cras_dsp_ini_create(filename);
-  /* NULL because a plugin doesn't have library or label */
-  EXPECT_EQ(NULL, ini);
-}
-
-TEST_F(DspIniTestSuite, OneSimplePlugin) {
-  fprintf(fp, "[Test]\n");
-  fprintf(fp, "library=foo.so\n");
-  fprintf(fp, "label=bar\n");
-  fprintf(fp, "disable=\"#f\"\n");
-  CloseFile();
-
-  struct ini* ini = cras_dsp_ini_create(filename);
-  EXPECT_EQ(1, ARRAY_COUNT(&ini->plugins));
-  EXPECT_EQ(0, ARRAY_COUNT(&ini->flows));
-
-  struct plugin* plugin = ARRAY_ELEMENT(&ini->plugins, 0);
-  EXPECT_STREQ("test", plugin->title);
-  EXPECT_STREQ("foo.so", plugin->library);
-  EXPECT_STREQ("bar", plugin->label);
-  EXPECT_TRUE(plugin->disable_expr);
-  EXPECT_EQ(0, ARRAY_COUNT(&plugin->ports));
-
-  cras_dsp_ini_free(ini);
-}
-
-TEST_F(DspIniTestSuite, BuiltinPlugin) {
-  fprintf(fp, "[foo]\n");
-  fprintf(fp, "library=builtin\n");
-  fprintf(fp, "label=source\n");
-  fprintf(fp, "purpose=playback\n");
-  fprintf(fp, "[bar]\n");
-  fprintf(fp, "library=builtin\n");
-  fprintf(fp, "label=sink\n");
-  fprintf(fp, "purpose=capture\n");
-  CloseFile();
-
-  struct ini* ini = cras_dsp_ini_create(filename);
-  EXPECT_EQ(2, ARRAY_COUNT(&ini->plugins));
-  EXPECT_EQ(0, ARRAY_COUNT(&ini->flows));
-  EXPECT_STREQ(ARRAY_ELEMENT(&ini->plugins, 0)->purpose, "playback");
-  EXPECT_STREQ(ARRAY_ELEMENT(&ini->plugins, 1)->purpose, "capture");
-  cras_dsp_ini_free(ini);
-}
-
-TEST_F(DspIniTestSuite, Ports) {
-  fprintf(fp, "[foo]\n");
-  fprintf(fp, "library=bar\n");
-  fprintf(fp, "label=baz\n");
-  fprintf(fp, "input_0=10\n");
-  CloseFile();
-
-  struct ini* ini = cras_dsp_ini_create(filename);
-  EXPECT_EQ(1, ARRAY_COUNT(&ini->plugins));
-  EXPECT_EQ(0, ARRAY_COUNT(&ini->flows));
-  struct plugin* plugin = ARRAY_ELEMENT(&ini->plugins, 0);
-  EXPECT_EQ(1, ARRAY_COUNT(&plugin->ports));
-  struct port* port = ARRAY_ELEMENT(&plugin->ports, 0);
-  EXPECT_EQ(PORT_INPUT, port->direction);
-  EXPECT_EQ(PORT_CONTROL, port->type);
-  EXPECT_EQ(INVALID_FLOW_ID, port->flow_id);
-  EXPECT_EQ(10, port->init_value);
-  cras_dsp_ini_free(ini);
-}
-
-TEST_F(DspIniTestSuite, Flows) {
-  fprintf(fp, "[foo]\n");
-  fprintf(fp, "library=foo\n");
-  fprintf(fp, "label=foo\n");
-  fprintf(fp, "output_0=<control>\n");
-  fprintf(fp, "output_1={audio}\n");
-  fprintf(fp, "[bar]\n");
-  fprintf(fp, "library=bar\n");
-  fprintf(fp, "label=bar\n");
-  fprintf(fp, "input_0={audio}\n");
-  fprintf(fp, "input_1=<control>\n");
-
-  CloseFile();
-
-  struct ini* ini = cras_dsp_ini_create(filename);
-  EXPECT_EQ(2, ARRAY_COUNT(&ini->plugins));
-  struct plugin* foo = ARRAY_ELEMENT(&ini->plugins, 0);
-  struct plugin* bar = ARRAY_ELEMENT(&ini->plugins, 1);
-  EXPECT_EQ(2, ARRAY_COUNT(&foo->ports));
-  EXPECT_EQ(2, ARRAY_COUNT(&bar->ports));
-
-  struct port* foo0 = ARRAY_ELEMENT(&foo->ports, 0);
-  struct port* foo1 = ARRAY_ELEMENT(&foo->ports, 1);
-  EXPECT_EQ(PORT_OUTPUT, foo0->direction);
-  EXPECT_EQ(PORT_CONTROL, foo0->type);
-  EXPECT_EQ(PORT_OUTPUT, foo1->direction);
-  EXPECT_EQ(PORT_AUDIO, foo1->type);
-  EXPECT_EQ(0, foo0->flow_id);
-  EXPECT_EQ(1, foo1->flow_id);
-
-  struct port* bar0 = ARRAY_ELEMENT(&bar->ports, 0);
-  struct port* bar1 = ARRAY_ELEMENT(&bar->ports, 1);
-  EXPECT_EQ(PORT_INPUT, bar0->direction);
-  EXPECT_EQ(PORT_AUDIO, bar0->type);
-  EXPECT_EQ(PORT_INPUT, bar1->direction);
-  EXPECT_EQ(PORT_CONTROL, bar1->type);
-  EXPECT_EQ(1, bar0->flow_id);
-  EXPECT_EQ(0, bar1->flow_id);
-
-  EXPECT_EQ(2, ARRAY_COUNT(&ini->flows));
-  struct flow* flow0 = ARRAY_ELEMENT(&ini->flows, 0);
-  struct flow* flow1 = ARRAY_ELEMENT(&ini->flows, 1);
-
-  EXPECT_EQ(PORT_CONTROL, flow0->type);
-  EXPECT_STREQ("<control>", flow0->name);
-
-  EXPECT_EQ(PORT_AUDIO, flow1->type);
-  EXPECT_STREQ("{audio}", flow1->name);
-
-  EXPECT_EQ(flow0->from, foo);
-  EXPECT_EQ(flow0->to, bar);
-  EXPECT_EQ(flow0->from_port, 0);
-  EXPECT_EQ(flow0->to_port, 1);
-
-  EXPECT_EQ(flow1->from, foo);
-  EXPECT_EQ(flow1->to, bar);
-  EXPECT_EQ(flow1->from_port, 1);
-  EXPECT_EQ(flow1->to_port, 0);
-
-  cras_dsp_ini_free(ini);
-}
-
-TEST_F(DspIniTestSuite, TwoChannelWithSwap) {
-  /*
-   *  Stated in ini:
-   *
-   *   m0 ==(a0, a1)== m1 ==(b0, b1)== m2
-   *
-   *  After inserting swap_lr plugin:
-   *
-   *   m0 ==(a0, a1)== m1 ==(b0, b1)== m_swap_lr ==(swap_lr_0, swap_lr_1)== m2
-   *
-   */
-
-  const char* content =
-      "[M0]\n"
-      "library=builtin\n"
-      "label=source\n"
-      "purpose=playback\n"
-      "output_0={a0}\n"
-      "output_1={a1}\n"
-      "[M1]\n"
-      "library=builtin\n"
-      "label=foo\n"
-      "purpose=playback\n"
-      "input_0={a0}\n"
-      "input_1={a1}\n"
-      "output_2={b0}\n"
-      "output_3={b1}\n"
-      "[M2]\n"
-      "library=builtin\n"
-      "label=sink\n"
-      "purpose=playback\n"
-      "input_0={b0}\n"
-      "input_1={b1}\n";
-  fprintf(fp, "%s", content);
-  CloseFile();
-
-  struct ini* ini = cras_dsp_ini_create(filename);
-
-  /* 3 plugins and 1 swap_lr plugin. */
-  EXPECT_EQ(4, ARRAY_COUNT(&ini->plugins));
-
-  struct plugin* m0 = ARRAY_ELEMENT(&ini->plugins, 0);
-  struct plugin* m1 = ARRAY_ELEMENT(&ini->plugins, 1);
-  struct plugin* m2 = ARRAY_ELEMENT(&ini->plugins, 2);
-  struct plugin* m_swap_lr = ARRAY_ELEMENT(&ini->plugins, 3);
-
-  EXPECT_EQ(2, ARRAY_COUNT(&m0->ports));
-  EXPECT_EQ(4, ARRAY_COUNT(&m1->ports));
-  EXPECT_EQ(4, ARRAY_COUNT(&m_swap_lr->ports));
-  EXPECT_EQ(2, ARRAY_COUNT(&m2->ports));
-
-  struct port* m0_0 = ARRAY_ELEMENT(&m0->ports, 0);
-  struct port* m0_1 = ARRAY_ELEMENT(&m0->ports, 1);
-  struct port* m1_0 = ARRAY_ELEMENT(&m1->ports, 0);
-  struct port* m1_1 = ARRAY_ELEMENT(&m1->ports, 1);
-  struct port* m1_2 = ARRAY_ELEMENT(&m1->ports, 2);
-  struct port* m1_3 = ARRAY_ELEMENT(&m1->ports, 3);
-  struct port* m_swap_lr_0 = ARRAY_ELEMENT(&m_swap_lr->ports, 0);
-  struct port* m_swap_lr_1 = ARRAY_ELEMENT(&m_swap_lr->ports, 1);
-  struct port* m_swap_lr_2 = ARRAY_ELEMENT(&m_swap_lr->ports, 2);
-  struct port* m_swap_lr_3 = ARRAY_ELEMENT(&m_swap_lr->ports, 3);
-  struct port* m2_0 = ARRAY_ELEMENT(&m2->ports, 0);
-  struct port* m2_1 = ARRAY_ELEMENT(&m2->ports, 1);
-
-  /* flow       flow_id       from port       to port
-   * ------------------------------------------------------------
-   * a0            0            m0_0           m1_0
-   * a1            1            m0_1           m1_1
-   * b0            2            m1_2           m_swap_lr_0
-   * b1            3            m1_3           m_swap_lr_1
-   * swap_lr_0     4            m_swap_lr_2    m2_0
-   * swap_lr_1     5            m_swap_lr_3    m2_1
-   */
-  EXPECT_EQ(0, m0_0->flow_id);
-  EXPECT_EQ(1, m0_1->flow_id);
-  EXPECT_EQ(0, m1_0->flow_id);
-  EXPECT_EQ(1, m1_1->flow_id);
-  EXPECT_EQ(2, m1_2->flow_id);
-  EXPECT_EQ(3, m1_3->flow_id);
-  EXPECT_EQ(2, m_swap_lr_0->flow_id);
-  EXPECT_EQ(3, m_swap_lr_1->flow_id);
-  EXPECT_EQ(4, m_swap_lr_2->flow_id);
-  EXPECT_EQ(5, m_swap_lr_3->flow_id);
-  EXPECT_EQ(4, m2_0->flow_id);
-  EXPECT_EQ(5, m2_1->flow_id);
-
-  struct flow* flow_a0 = ARRAY_ELEMENT(&ini->flows, 0);
-  struct flow* flow_a1 = ARRAY_ELEMENT(&ini->flows, 1);
-  struct flow* flow_b0 = ARRAY_ELEMENT(&ini->flows, 2);
-  struct flow* flow_b1 = ARRAY_ELEMENT(&ini->flows, 3);
-  struct flow* flow_swap_lr_0 = ARRAY_ELEMENT(&ini->flows, 4);
-  struct flow* flow_swap_lr_1 = ARRAY_ELEMENT(&ini->flows, 5);
-
-  EXPECT_EQ(flow_a0->from, m0);
-  EXPECT_EQ(flow_a0->from_port, 0);
-  EXPECT_EQ(flow_a0->to, m1);
-  EXPECT_EQ(flow_a0->to_port, 0);
-
-  EXPECT_EQ(flow_a1->from, m0);
-  EXPECT_EQ(flow_a1->from_port, 1);
-  EXPECT_EQ(flow_a1->to, m1);
-  EXPECT_EQ(flow_a1->to_port, 1);
-
-  EXPECT_EQ(flow_b0->from, m1);
-  EXPECT_EQ(flow_b0->from_port, 2);
-  EXPECT_EQ(flow_b0->to, m_swap_lr);
-  EXPECT_EQ(flow_b0->to_port, 0);
-
-  EXPECT_EQ(flow_b1->from, m1);
-  EXPECT_EQ(flow_b1->from_port, 3);
-  EXPECT_EQ(flow_b1->to, m_swap_lr);
-  EXPECT_EQ(flow_b1->to_port, 1);
-
-  EXPECT_EQ(flow_swap_lr_0->from, m_swap_lr);
-  EXPECT_EQ(flow_swap_lr_0->from_port, 2);
-  EXPECT_EQ(flow_swap_lr_0->to, m2);
-  EXPECT_EQ(flow_swap_lr_0->to_port, 0);
-
-  EXPECT_EQ(flow_swap_lr_1->from, m_swap_lr);
-  EXPECT_EQ(flow_swap_lr_1->from_port, 3);
-  EXPECT_EQ(flow_swap_lr_1->to, m2);
-  EXPECT_EQ(flow_swap_lr_1->to_port, 1);
-
-  cras_dsp_ini_free(ini);
-}
-
-}  //  namespace
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tests/dsp_unittest.cc b/cras/src/tests/dsp_unittest.cc
deleted file mode 100644
index b1f4c4e..0000000
--- a/cras/src/tests/dsp_unittest.cc
+++ /dev/null
@@ -1,155 +0,0 @@
-// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <gtest/gtest.h>
-
-#include "cras_dsp.h"
-#include "cras_dsp_module.h"
-
-#define FILENAME_TEMPLATE "DspTest.XXXXXX"
-
-namespace {
-
-extern "C" {
-struct dsp_module* cras_dsp_module_load_ladspa(struct plugin* plugin) {
-  return NULL;
-}
-}
-
-class DspTestSuite : public testing::Test {
- protected:
-  virtual void SetUp() {
-    strcpy(filename, FILENAME_TEMPLATE);
-    int fd = mkstemp(filename);
-    fp = fdopen(fd, "w");
-  }
-
-  virtual void TearDown() {
-    CloseFile();
-    unlink(filename);
-  }
-
-  virtual void CloseFile() {
-    if (fp) {
-      fclose(fp);
-      fp = NULL;
-    }
-  }
-
-  char filename[sizeof(FILENAME_TEMPLATE) + 1];
-  FILE* fp;
-};
-
-TEST_F(DspTestSuite, Simple) {
-  const char* content =
-      "[M1]\n"
-      "library=builtin\n"
-      "label=source\n"
-      "purpose=capture\n"
-      "output_0={audio}\n"
-      "disable=(not (equal? variable \"foo\"))\n"
-      "[M2]\n"
-      "library=builtin\n"
-      "label=sink\n"
-      "purpose=capture\n"
-      "input_0={audio}\n"
-      "\n";
-  fprintf(fp, "%s", content);
-  CloseFile();
-
-  cras_dsp_init(filename);
-  struct cras_dsp_context *ctx1, *ctx3, *ctx4;
-  ctx1 = cras_dsp_context_new(44100, "playback"); /* wrong purpose */
-  ctx3 = cras_dsp_context_new(44100, "capture");
-  ctx4 = cras_dsp_context_new(44100, "capture");
-
-  cras_dsp_set_variable_string(ctx1, "variable", "foo");
-  cras_dsp_set_variable_string(ctx3, "variable", "bar"); /* wrong value */
-  cras_dsp_set_variable_string(ctx4, "variable", "foo");
-
-  cras_dsp_load_pipeline(ctx1);
-  cras_dsp_load_pipeline(ctx3);
-  cras_dsp_load_pipeline(ctx4);
-
-  /* only ctx4 should load the pipeline successfully */
-  ASSERT_EQ(NULL, cras_dsp_get_pipeline(ctx1));
-  ASSERT_EQ(NULL, cras_dsp_get_pipeline(ctx3));
-
-  struct pipeline* pipeline = cras_dsp_get_pipeline(ctx4);
-  ASSERT_TRUE(pipeline);
-  cras_dsp_put_pipeline(ctx4);
-
-  /* change the variable to a wrong value, and we should fail to reload. */
-  cras_dsp_set_variable_string(ctx4, "variable", "bar");
-  cras_dsp_load_pipeline(ctx4);
-  ASSERT_EQ(NULL, cras_dsp_get_pipeline(ctx4));
-
-  /* change the variable back, and we should reload successfully. */
-  cras_dsp_set_variable_string(ctx4, "variable", "foo");
-  cras_dsp_reload_ini();
-  ASSERT_TRUE(cras_dsp_get_pipeline(ctx4));
-
-  cras_dsp_context_free(ctx1);
-  cras_dsp_context_free(ctx3);
-  cras_dsp_context_free(ctx4);
-  cras_dsp_stop();
-}
-
-static int empty_instantiate(struct dsp_module* module,
-                             unsigned long sample_rate) {
-  return 0;
-}
-
-static void empty_connect_port(struct dsp_module* module,
-                               unsigned long port,
-                               float* data_location) {}
-
-static int empty_get_delay(struct dsp_module* module) {
-  return 0;
-}
-
-static void empty_run(struct dsp_module* module, unsigned long sample_count) {}
-
-static void empty_deinstantiate(struct dsp_module* module) {}
-
-static void empty_free_module(struct dsp_module* module) {
-  free(module);
-}
-
-static int empty_get_properties(struct dsp_module* module) {
-  return 0;
-}
-
-static void empty_dump(struct dsp_module* module, struct dumper* d) {
-  dumpf(d, "built-in module\n");
-}
-
-static void empty_init_module(struct dsp_module* module) {
-  module->instantiate = &empty_instantiate;
-  module->connect_port = &empty_connect_port;
-  module->get_delay = &empty_get_delay;
-  module->run = &empty_run;
-  module->deinstantiate = &empty_deinstantiate;
-  module->free_module = &empty_free_module;
-  module->get_properties = &empty_get_properties;
-  module->dump = &empty_dump;
-}
-
-}  //  namespace
-
-extern "C" {
-struct dsp_module* cras_dsp_module_load_builtin(struct plugin* plugin) {
-  struct dsp_module* module;
-  module = (struct dsp_module*)calloc(1, sizeof(struct dsp_module));
-  empty_init_module(module);
-  return module;
-}
-void cras_dsp_module_set_sink_ext_module(struct dsp_module* module,
-                                         struct ext_dsp_module* ext_module) {}
-}  // extern "C"
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tests/dumper_unittest.cc b/cras/src/tests/dumper_unittest.cc
deleted file mode 100644
index 7bd1421..0000000
--- a/cras/src/tests/dumper_unittest.cc
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "dumper.h"
-
-#include <gtest/gtest.h>
-#include <syslog.h>
-
-namespace {
-
-TEST(DumperTest, SyslogDumper) {
-  struct dumper* dumper = syslog_dumper_create(LOG_ERR);
-  dumpf(dumper, "hello %d", 1);
-  dumpf(dumper, "world %d\n123", 2);
-  dumpf(dumper, "456\n");
-  // The following should appear in syslog:
-  // dumper_unittest: hello 1world 2
-  // dumper_unittest: 123456
-  syslog_dumper_free(dumper);
-}
-
-TEST(DumperTest, MemDumper) {
-  struct dumper* dumper = mem_dumper_create();
-  char* buf;
-  int size, i;
-
-  mem_dumper_get(dumper, &buf, &size);
-  EXPECT_STREQ("", buf);
-
-  dumpf(dumper, "hello %d\n", 1);
-  mem_dumper_get(dumper, &buf, &size);
-  EXPECT_STREQ("hello 1\n", buf);
-  EXPECT_EQ(8, size);
-
-  dumpf(dumper, "world %d", 2);
-  mem_dumper_get(dumper, &buf, &size);
-  EXPECT_STREQ("hello 1\nworld 2", buf);
-  EXPECT_EQ(15, size);
-
-  mem_dumper_clear(dumper);
-  mem_dumper_get(dumper, &buf, &size);
-  EXPECT_STREQ("", buf);
-  EXPECT_EQ(0, size);
-
-  for (i = 0; i < 1000; i++) {
-    dumpf(dumper, "a");
-  }
-  mem_dumper_get(dumper, &buf, &size);
-  EXPECT_EQ(1000, strlen(buf));
-  EXPECT_EQ(1000, 1000);
-
-  mem_dumper_free(dumper);
-}
-
-}  //  namespace
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tests/edid_utils_unittest.cc b/cras/src/tests/edid_utils_unittest.cc
deleted file mode 100644
index 6b059af..0000000
--- a/cras/src/tests/edid_utils_unittest.cc
+++ /dev/null
@@ -1,274 +0,0 @@
-// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "edid_utils.h"
-
-#include <gtest/gtest.h>
-#include <stdint.h>
-#include <stdio.h>
-
-#include "cras_util.h"
-
-namespace {
-
-class EDIDTestSuite : public testing::Test {
- protected:
-  virtual void SetUp() {
-    static const uint8_t header[] = {
-        0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
-    };
-
-    memcpy(edid_, header, sizeof(header));
-    SetChecksum();
-  }
-
-  void SetChecksum() {
-    uint8_t sum = 0;
-
-    for (unsigned int i = 0; i < 127; i++)
-      sum += edid_[i];
-
-    edid_[127] = 256 - sum;
-  }
-
-  uint8_t edid_[2048];
-};
-
-TEST_F(EDIDTestSuite, EDIDValid) {
-  EXPECT_TRUE(edid_valid(edid_));
-}
-
-TEST_F(EDIDTestSuite, EDIDBadHeader) {
-  static const uint8_t bad_header[] = {
-      0x00, 0xff, 0xff, 0xff, 0xff, 0xee, 0xff, 0x00,
-  };
-
-  memcpy(edid_, bad_header, sizeof(bad_header));
-  SetChecksum();
-
-  EXPECT_FALSE(edid_valid(edid_));
-}
-
-// Actual EDIDs read from sinks.
-
-static const uint8_t test_no_aud_edid1[256] = {
-    0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x06, 0xaf, 0x5c, 0x20,
-    0x00, 0x00, 0x00, 0x00, 0x01, 0x12, 0x01, 0x03, 0x80, 0x1a, 0x0e, 0x78,
-    0x0a, 0x99, 0x85, 0x95, 0x55, 0x56, 0x92, 0x28, 0x22, 0x50, 0x54, 0x00,
-    0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
-    0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x96, 0x19, 0x56, 0x28, 0x50, 0x00,
-    0x08, 0x30, 0x18, 0x10, 0x24, 0x00, 0x00, 0x90, 0x10, 0x00, 0x00, 0x18,
-    0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x41,
-    0x55, 0x4f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-    0x00, 0x00, 0x00, 0xfe, 0x00, 0x42, 0x31, 0x31, 0x36, 0x58, 0x57, 0x30,
-    0x32, 0x20, 0x56, 0x30, 0x20, 0x0a, 0x00, 0xf8};
-
-static const uint8_t test_no_aud_edid2[256] = {
-    0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x30, 0xe4, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x01, 0x03, 0x80, 0x1a, 0x0e, 0x78,
-    0x0a, 0xbf, 0x45, 0x95, 0x58, 0x52, 0x8a, 0x28, 0x25, 0x50, 0x54, 0x00,
-    0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
-    0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x84, 0x1c, 0x56, 0xa8, 0x50, 0x00,
-    0x19, 0x30, 0x30, 0x20, 0x35, 0x00, 0x00, 0x90, 0x10, 0x00, 0x00, 0x1b,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x4c,
-    0x47, 0x20, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x0a, 0x20, 0x20,
-    0x00, 0x00, 0x00, 0xfc, 0x00, 0x4c, 0x50, 0x31, 0x31, 0x36, 0x57, 0x48,
-    0x31, 0x2d, 0x54, 0x4c, 0x4e, 0x31, 0x00, 0x4e};
-
-/* Has DTD that is too wide */
-static const uint8_t test_no_aud_edid3[256] = {
-    0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x10, 0xac, 0x63, 0x40,
-    0x4c, 0x35, 0x31, 0x33, 0x0c, 0x15, 0x01, 0x03, 0x80, 0x40, 0x28, 0x78,
-    0xea, 0x8d, 0x85, 0xad, 0x4f, 0x35, 0xb1, 0x25, 0x0e, 0x50, 0x54, 0xa5,
-    0x4b, 0x00, 0x71, 0x4f, 0x81, 0x00, 0x81, 0x80, 0xa9, 0x40, 0xd1, 0x00,
-    0xd1, 0x40, 0x01, 0x01, 0x01, 0x01, 0xe2, 0x68, 0x00, 0xa0, 0xa0, 0x40,
-    0x2e, 0x60, 0x30, 0x20, 0x36, 0x00, 0x81, 0x91, 0x21, 0x00, 0x00, 0x1a,
-    0x00, 0x00, 0x00, 0xff, 0x00, 0x50, 0x48, 0x35, 0x4e, 0x59, 0x31, 0x33,
-    0x4d, 0x33, 0x31, 0x35, 0x4c, 0x0a, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x44,
-    0x45, 0x4c, 0x4c, 0x20, 0x55, 0x33, 0x30, 0x31, 0x31, 0x0a, 0x20, 0x20,
-    0x00, 0x00, 0x00, 0xfd, 0x00, 0x31, 0x56, 0x1d, 0x71, 0x1c, 0x00, 0x0a,
-    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0xb0};
-
-static const uint8_t test_edid1[256] = {
-    0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x4d, 0xd9, 0x02, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x01, 0x03, 0x80, 0x00, 0x00, 0x78,
-    0x0a, 0x0d, 0xc9, 0xa0, 0x57, 0x47, 0x98, 0x27, 0x12, 0x48, 0x4c, 0x00,
-    0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
-    0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x1d, 0x80, 0xd0, 0x72, 0x1c,
-    0x16, 0x20, 0x10, 0x2c, 0x25, 0x80, 0xc4, 0x8e, 0x21, 0x00, 0x00, 0x9e,
-    0x01, 0x1d, 0x80, 0x18, 0x71, 0x1c, 0x16, 0x20, 0x58, 0x2c, 0x25, 0x00,
-    0xc4, 0x8e, 0x21, 0x00, 0x00, 0x9e, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x48,
-    0x44, 0x4d, 0x49, 0x20, 0x4c, 0x4c, 0x43, 0x0a, 0x20, 0x20, 0x20, 0x20,
-    0x00, 0x00, 0x00, 0xfd, 0x00, 0x3b, 0x3d, 0x0f, 0x2d, 0x08, 0x00, 0x0a,
-    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x01, 0xc0, 0x02, 0x03, 0x1e, 0x47,
-    0x4f, 0x94, 0x13, 0x05, 0x03, 0x04, 0x02, 0x01, 0x16, 0x15, 0x07, 0x06,
-    0x11, 0x10, 0x12, 0x1f, 0x23, 0x09, 0x07, 0x01, 0x65, 0x03, 0x0c, 0x00,
-    0x10, 0x00, 0x8c, 0x0a, 0xd0, 0x90, 0x20, 0x40, 0x31, 0x20, 0x0c, 0x40,
-    0x55, 0x00, 0x13, 0x8e, 0x21, 0x00, 0x00, 0x18, 0x01, 0x1d, 0x00, 0xbc,
-    0x52, 0xd0, 0x1e, 0x20, 0xb8, 0x28, 0x55, 0x40, 0xc4, 0x8e, 0x21, 0x00,
-    0x00, 0x1e, 0x8c, 0x0a, 0xd0, 0x8a, 0x20, 0xe0, 0x2d, 0x10, 0x10, 0x3e,
-    0x96, 0x00, 0xc4, 0x8e, 0x21, 0x00, 0x00, 0x18, 0x01, 0x1d, 0x00, 0x72,
-    0x51, 0xd0, 0x1e, 0x20, 0x6e, 0x28, 0x55, 0x00, 0xc4, 0x8e, 0x21, 0x00,
-    0x00, 0x1e, 0x8c, 0x0a, 0xd0, 0x8a, 0x20, 0xe0, 0x2d, 0x10, 0x10, 0x3e,
-    0x96, 0x00, 0x13, 0x8e, 0x21, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0xfb};
-
-static const uint8_t test_edid2[256] = {
-    0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x4c, 0x2d, 0x10, 0x02,
-    0x00, 0x00, 0x00, 0x00, 0x31, 0x0f, 0x01, 0x03, 0x80, 0x10, 0x09, 0x8c,
-    0x0a, 0xe2, 0xbd, 0xa1, 0x5b, 0x4a, 0x98, 0x24, 0x15, 0x47, 0x4a, 0x20,
-    0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
-    0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x1d, 0x00, 0x72, 0x51, 0xd0,
-    0x1e, 0x20, 0x6e, 0x28, 0x55, 0x00, 0xa0, 0x5a, 0x00, 0x00, 0x00, 0x1e,
-    0x01, 0x1d, 0x80, 0x18, 0x71, 0x1c, 0x16, 0x20, 0x58, 0x2c, 0x25, 0x00,
-    0xa0, 0x5a, 0x00, 0x00, 0x00, 0x9e, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x3b,
-    0x3d, 0x1e, 0x2e, 0x08, 0x00, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-    0x00, 0x00, 0x00, 0xfc, 0x00, 0x53, 0x41, 0x4d, 0x53, 0x55, 0x4e, 0x47,
-    0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x01, 0x8d, 0x02, 0x03, 0x16, 0x71,
-    0x43, 0x84, 0x05, 0x03, 0x23, 0x09, 0x07, 0x07, 0x83, 0x01, 0x00, 0x00,
-    0x65, 0x03, 0x0c, 0x00, 0x20, 0x00, 0x8c, 0x0a, 0xd0, 0x8a, 0x20, 0xe0,
-    0x2d, 0x10, 0x10, 0x3e, 0x96, 0x00, 0xa0, 0x5a, 0x00, 0x00, 0x00, 0x18,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x30};
-
-static const uint8_t test_edid3[256] = {
-    0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x3d, 0xcb, 0x61, 0x07,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x01, 0x03, 0x80, 0x00, 0x00, 0x78,
-    0x0a, 0x0d, 0xc9, 0xa0, 0x57, 0x47, 0x98, 0x27, 0x12, 0x48, 0x4c, 0x00,
-    0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
-    0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x1d, 0x80, 0x18, 0x71, 0x1c,
-    0x16, 0x20, 0x58, 0x2c, 0x25, 0x00, 0xc4, 0x8e, 0x21, 0x00, 0x00, 0x9e,
-    0x01, 0x1d, 0x80, 0xd0, 0x72, 0x1c, 0x16, 0x20, 0x10, 0x2c, 0x25, 0x80,
-    0xc4, 0x8e, 0x21, 0x00, 0x00, 0x9e, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x54,
-    0x58, 0x2d, 0x53, 0x52, 0x36, 0x30, 0x35, 0x0a, 0x20, 0x20, 0x20, 0x20,
-    0x00, 0x00, 0x00, 0xfd, 0x00, 0x17, 0xf0, 0x0f, 0x7e, 0x11, 0x00, 0x0a,
-    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x01, 0x93, 0x02, 0x03, 0x3b, 0x72,
-    0x55, 0x85, 0x04, 0x03, 0x02, 0x0e, 0x0f, 0x07, 0x23, 0x24, 0x10, 0x94,
-    0x13, 0x12, 0x11, 0x1d, 0x1e, 0x16, 0x25, 0x26, 0x01, 0x1f, 0x35, 0x09,
-    0x7f, 0x07, 0x0f, 0x7f, 0x07, 0x17, 0x07, 0x50, 0x3f, 0x06, 0xc0, 0x57,
-    0x06, 0x00, 0x5f, 0x7e, 0x01, 0x67, 0x5e, 0x00, 0x83, 0x4f, 0x00, 0x00,
-    0x66, 0x03, 0x0c, 0x00, 0x20, 0x00, 0x80, 0x8c, 0x0a, 0xd0, 0x8a, 0x20,
-    0xe0, 0x2d, 0x10, 0x10, 0x3e, 0x96, 0x00, 0xc4, 0x8e, 0x21, 0x00, 0x00,
-    0x18, 0x8c, 0x0a, 0xd0, 0x90, 0x20, 0x40, 0x31, 0x20, 0x0c, 0x40, 0x55,
-    0x00, 0xc4, 0x8e, 0x21, 0x00, 0x00, 0x18, 0x01, 0x1d, 0x00, 0x72, 0x51,
-    0xd0, 0x1e, 0x20, 0x6e, 0x28, 0x55, 0x00, 0xc4, 0x8e, 0x21, 0x00, 0x00,
-    0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0xdd};
-
-static const uint8_t test_edid4[256] = {
-    0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x04, 0x72, 0x30, 0x02,
-    0x01, 0x00, 0x00, 0x00, 0x18, 0x14, 0x01, 0x03, 0x80, 0x33, 0x1d, 0x78,
-    0x0a, 0xdc, 0x55, 0xa3, 0x59, 0x48, 0x9e, 0x24, 0x11, 0x50, 0x54, 0xbf,
-    0x6f, 0x00, 0x71, 0x4f, 0x81, 0xc0, 0xd1, 0xc0, 0xb3, 0x00, 0x81, 0x80,
-    0x95, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x3a, 0x80, 0x18, 0x71, 0x38,
-    0x2d, 0x40, 0x58, 0x2c, 0x45, 0x00, 0xfe, 0x22, 0x11, 0x00, 0x00, 0x18,
-    0x01, 0x1d, 0x00, 0x72, 0x51, 0xd0, 0x1e, 0x20, 0x6e, 0x28, 0x55, 0x00,
-    0xfe, 0x22, 0x11, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x38,
-    0x4c, 0x1e, 0x4b, 0x0f, 0x00, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-    0x00, 0x00, 0x00, 0xfc, 0x00, 0x4d, 0x32, 0x33, 0x30, 0x41, 0x0a, 0x20,
-    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x01, 0xf0, 0x02, 0x03, 0x18, 0x74,
-    0x45, 0x04, 0x05, 0x90, 0x03, 0x01, 0x23, 0x09, 0x17, 0x07, 0x83, 0x01,
-    0x00, 0x00, 0x65, 0x03, 0x0c, 0x00, 0x30, 0x00, 0x01, 0x1d, 0x80, 0x18,
-    0x71, 0x1c, 0x16, 0x20, 0x58, 0x2c, 0x25, 0x00, 0xfe, 0x22, 0x11, 0x00,
-    0x00, 0x9e, 0x8c, 0x0a, 0xd0, 0x8a, 0x20, 0xe0, 0x2d, 0x10, 0x10, 0x3e,
-    0x96, 0x00, 0xfe, 0x22, 0x11, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0xd0,
-};
-
-static const uint8_t test_monitor_edid[256] = {
-    0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x4d, 0xd9, 0x02, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x01, 0x03, 0x80, 0x00, 0x00, 0x78,
-    0x0a, 0x0d, 0xc9, 0xa0, 0x57, 0x47, 0x98, 0x27, 0x12, 0x48, 0x4c, 0x00,
-    0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
-    0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x1d, 0x80, 0xd0, 0x72, 0x1c,
-    0x16, 0x20, 0x10, 0x2c, 0x25, 0x80, 0xc4, 0x8e, 0x21, 0x00, 0x00, 0x9e,
-    0x01, 0x1d, 0x80, 0x18, 0x71, 0x1c, 0x16, 0x20, 0x58, 0x2c, 0x25, 0x00,
-    0xc4, 0x8e, 0x21, 0x00, 0x00, 0x9e, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x48,
-    0x44, 0x4d, 0x49, 0x20, 0x4c, 0x4c, 0x43, 0x20, 0x41, 0x42, 0x43, 0x44,
-    0x00, 0x00, 0x00, 0xfd, 0x00, 0x3b, 0x3d, 0x0f, 0x2d, 0x08, 0x00, 0x0a,
-    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x01, 0xc0, 0x02, 0x03, 0x1e, 0x47,
-    0x4f, 0x94, 0x13, 0x05, 0x03, 0x04, 0x02, 0x01, 0x16, 0x15, 0x07, 0x06,
-    0x11, 0x10, 0x12, 0x1f, 0x23, 0x09, 0x07, 0x01, 0x65, 0x03, 0x0c, 0x00,
-    0x10, 0x00, 0x8c, 0x0a, 0xd0, 0x90, 0x20, 0x40, 0x31, 0x20, 0x0c, 0x40,
-    0x55, 0x00, 0x13, 0x8e, 0x21, 0x00, 0x00, 0x18, 0x01, 0x1d, 0x00, 0xbc,
-    0x52, 0xd0, 0x1e, 0x20, 0xb8, 0x28, 0x55, 0x40, 0xc4, 0x8e, 0x21, 0x00,
-    0x00, 0x1e, 0x8c, 0x0a, 0xd0, 0x8a, 0x20, 0xe0, 0x2d, 0x10, 0x10, 0x3e,
-    0x96, 0x00, 0xc4, 0x8e, 0x21, 0x00, 0x00, 0x18, 0x01, 0x1d, 0x00, 0x72,
-    0x51, 0xd0, 0x1e, 0x20, 0x6e, 0x28, 0x55, 0x00, 0xc4, 0x8e, 0x21, 0x00,
-    0x00, 0x1e, 0x8c, 0x0a, 0xd0, 0x8a, 0x20, 0xe0, 0x2d, 0x10, 0x10, 0x3e,
-    0x96, 0x00, 0x13, 0x8e, 0x21, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0xfb};
-
-static const uint8_t* test_no_aud_edids[] = {
-    test_no_aud_edid1,
-    test_no_aud_edid2,
-    test_no_aud_edid3,
-};
-
-static const uint8_t* test_edids[] = {
-    test_edid1,
-    test_edid2,
-    test_edid3,
-    test_edid4,
-};
-
-static const char* monitor_names[] = {
-    "HDMI LLC",
-    "SAMSUNG",
-    "TX-SR605",
-    "M230A",
-};
-
-TEST_F(EDIDTestSuite, NoAudEDID) {
-  unsigned int i;
-
-  for (i = 0; i < ARRAY_SIZE(test_no_aud_edids); i++) {
-    EXPECT_TRUE(edid_valid(test_no_aud_edids[i]));
-    EXPECT_FALSE(edid_lpcm_support(test_no_aud_edids[i], 1));
-  }
-}
-
-TEST_F(EDIDTestSuite, AudEDID) {
-  unsigned int i;
-
-  for (i = 0; i < ARRAY_SIZE(test_edids); i++) {
-    EXPECT_TRUE(edid_valid(test_edids[i]));
-    EXPECT_TRUE(edid_lpcm_support(test_edids[i], 1));
-  }
-}
-
-TEST_F(EDIDTestSuite, EDIDMonitorName) {
-  unsigned int i;
-  char buf[DTD_SIZE];
-
-  for (i = 0; i < ARRAY_SIZE(test_edids); i++) {
-    EXPECT_EQ(0, edid_get_monitor_name(test_edids[i], buf, DTD_SIZE));
-    EXPECT_STREQ(monitor_names[i], buf);
-  }
-
-  EXPECT_EQ(0, edid_get_monitor_name(test_monitor_edid, buf, DTD_SIZE));
-  EXPECT_STREQ("HDMI LLC ABCD", buf);
-  EXPECT_EQ(0, edid_get_monitor_name(test_monitor_edid, buf, 11));
-  EXPECT_STREQ("HDMI LLC A", buf);
-}
-
-}  //  namespace
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tests/empty_audio_stub.cc b/cras/src/tests/empty_audio_stub.cc
deleted file mode 100644
index 00ede69..0000000
--- a/cras/src/tests/empty_audio_stub.cc
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Copyright 2018 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-extern "C" {
-#include "polled_interval_checker.h"
-
-struct polled_interval* pic_polled_interval_create(int interval_sec) {
-  return NULL;
-}
-
-int pic_interval_elapsed(const struct polled_interval* interval) {
-  return 0;
-}
-
-void pic_interval_reset(struct polled_interval* interval) {}
-
-void pic_polled_interval_destroy(struct polled_interval** interval) {}
-
-void pic_update_current_time() {}
-
-void cras_non_empty_audio_send_msg(int non_empty) {}
-}
diff --git a/cras/src/tests/empty_iodev_unittest.cc b/cras/src/tests/empty_iodev_unittest.cc
deleted file mode 100644
index 148d530..0000000
--- a/cras/src/tests/empty_iodev_unittest.cc
+++ /dev/null
@@ -1,100 +0,0 @@
-/* Copyright 2019 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <gtest/gtest.h>
-
-extern "C" {
-#include "cras_audio_area.h"
-#include "cras_empty_iodev.h"
-#include "cras_iodev.h"
-}
-
-static struct timespec clock_gettime_retspec;
-static struct cras_audio_format fake_format;
-static cras_audio_area mock_audio_area;
-
-namespace {
-
-TEST(EmptyIodev, GetInputBuffer) {
-  struct cras_iodev* iodev;
-  struct timespec ts;
-  cras_audio_area* area;
-  unsigned nframes;
-
-  iodev = empty_iodev_create(CRAS_STREAM_INPUT, CRAS_NODE_TYPE_FALLBACK_NORMAL);
-
-  clock_gettime_retspec.tv_sec = 0;
-  clock_gettime_retspec.tv_nsec = 10000000;
-  fake_format.frame_rate = 48000;
-  iodev->format = &fake_format;
-  iodev->configure_dev(iodev);
-
-  clock_gettime_retspec.tv_nsec = 20000000;
-  nframes = iodev->frames_queued(iodev, &ts);
-  ASSERT_EQ(480, nframes);
-
-  /* If client takes too long to get input data, number of frames
-   * returned shouldn't exceeds device's own buffer size. */
-  nframes = 5000;
-  clock_gettime_retspec.tv_sec = 1;
-  iodev->get_buffer(iodev, &area, &nframes);
-  ASSERT_EQ(4096, nframes);
-
-  iodev->close_dev(iodev);
-  empty_iodev_destroy(iodev);
-}
-
-}  // namespace
-
-extern "C" {
-
-void cras_iodev_free_format(struct cras_iodev* iodev) {}
-
-int cras_iodev_default_no_stream_playback(struct cras_iodev* odev, int enable) {
-  return 0;
-}
-
-void cras_iodev_init_audio_area(struct cras_iodev* iodev, int num_channels) {
-  iodev->area = &mock_audio_area;
-}
-
-void cras_iodev_free_audio_area(struct cras_iodev* iodev) {}
-
-void cras_audio_area_config_buf_pointers(struct cras_audio_area* area,
-                                         const struct cras_audio_format* fmt,
-                                         uint8_t* base_buffer) {}
-
-int cras_iodev_list_rm_input(struct cras_iodev* input) {
-  return 0;
-}
-
-int cras_iodev_list_rm_output(struct cras_iodev* output) {
-  return 0;
-}
-
-void cras_iodev_free_resources(struct cras_iodev* iodev) {}
-
-void cras_iodev_add_node(struct cras_iodev* iodev, struct cras_ionode* node) {
-  iodev->nodes = node;
-}
-
-void cras_iodev_set_active_node(struct cras_iodev* iodev,
-                                struct cras_ionode* node) {
-  iodev->active_node = node;
-}
-
-//  From librt.
-int clock_gettime(clockid_t clk_id, struct timespec* tp) {
-  tp->tv_sec = clock_gettime_retspec.tv_sec;
-  tp->tv_nsec = clock_gettime_retspec.tv_nsec;
-  return 0;
-}
-
-}  // extern "C"
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tests/ewma_power_unittest.cc b/cras/src/tests/ewma_power_unittest.cc
deleted file mode 100644
index 10f0318..0000000
--- a/cras/src/tests/ewma_power_unittest.cc
+++ /dev/null
@@ -1,129 +0,0 @@
-// Copyright (c) 2020 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <gtest/gtest.h>
-
-extern "C" {
-#include "ewma_power.h"
-}
-
-namespace {
-
-TEST(EWMAPower, RelativePowerValue) {
-  struct ewma_power ewma;
-  int16_t buf[480];
-  float f;
-  int i;
-
-  for (i = 0; i < 480; i++)
-    buf[i] = 0x00fe;
-
-  ewma_power_init(&ewma, 48000);
-  EXPECT_EQ(48, ewma.step_fr);
-
-  ewma_power_calculate(&ewma, buf, 1, 480);
-  EXPECT_LT(0.0f, ewma.power);
-
-  // After 10ms of silence the power value decreases.
-  f = ewma.power;
-  for (i = 0; i < 480; i++)
-    buf[i] = 0x00;
-  ewma_power_calculate(&ewma, buf, 1, 480);
-  EXPECT_LT(ewma.power, f);
-
-  // After 300ms of silence the power value decreases to insignificant low.
-  for (i = 0; i < 30; i++)
-    ewma_power_calculate(&ewma, buf, 1, 480);
-  EXPECT_LT(ewma.power, 1.0e-10);
-}
-
-TEST(EWMAPower, PowerInStereoData) {
-  struct ewma_power ewma;
-  int16_t buf[960];
-  int i;
-  float f;
-
-  ewma_power_init(&ewma, 48000);
-
-  for (i = 0; i < 960; i += 2) {
-    buf[i] = 0x0;
-    buf[i + 1] = 0x00fe;
-  }
-  ewma_power_calculate(&ewma, buf, 2, 480);
-  EXPECT_LT(0.0f, ewma.power);
-
-  // After 10ms of silence the power value decreases.
-  f = ewma.power;
-  for (i = 0; i < 960; i++)
-    buf[i] = 0x0;
-  ewma_power_calculate(&ewma, buf, 2, 480);
-  EXPECT_LT(ewma.power, f);
-
-  // After 300ms of silence the power value decreases to insignificant low.
-  for (i = 0; i < 30; i++)
-    ewma_power_calculate(&ewma, buf, 2, 480);
-  EXPECT_LT(ewma.power, 1.0e-10);
-
-  // Assume the data is silent in the other channel.
-  ewma_power_init(&ewma, 48000);
-
-  for (i = 0; i < 960; i += 2) {
-    buf[i] = 0x0ffe;
-    buf[i + 1] = 0x0;
-  }
-  ewma_power_calculate(&ewma, buf, 2, 480);
-  EXPECT_LT(0.0f, ewma.power);
-}
-
-TEST(EWMAPower, PowerInAudioArea) {
-  struct ewma_power ewma;
-  struct cras_audio_area* area = cras_audio_area_create(4);
-  struct cras_audio_format* fmt =
-      cras_audio_format_create(SND_PCM_FORMAT_S16_LE, 48000, 4);
-  int8_t layout[CRAS_CH_MAX] = {0, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1};
-  int16_t buf[1920];
-  int i;
-  float f;
-
-  cras_audio_format_set_channel_layout(fmt, layout);
-  cras_audio_area_config_channels(area, fmt);
-
-  for (i = 0; i < 1920; i += 4) {
-    buf[i] = 0x0ffe;
-    buf[i + 1] = 0x0;
-    buf[i + 2] = 0x0;
-    buf[i + 3] = 0x0ffe;
-  }
-  ewma_power_init(&ewma, 48000);
-  ewma_power_calculate_area(&ewma, buf, area, 480);
-  f = ewma.power;
-  EXPECT_LT(0.0f, f);
-
-  /* Change the layout in the same audio area. Expect the power be lower because
-   * one of the channel is now silent. */
-  layout[CRAS_CH_FR] = 2;
-  cras_audio_format_set_channel_layout(fmt, layout);
-  cras_audio_area_config_channels(area, fmt);
-  ewma_power_init(&ewma, 48000);
-  ewma_power_calculate_area(&ewma, buf, area, 480);
-  EXPECT_GT(f, ewma.power);
-
-  /* Change layout to the two silent channels. Expect power is 0.0f. */
-  layout[CRAS_CH_FL] = 1;
-  cras_audio_format_set_channel_layout(fmt, layout);
-  cras_audio_area_config_channels(area, fmt);
-  ewma_power_init(&ewma, 48000);
-  ewma_power_calculate_area(&ewma, buf, area, 480);
-  EXPECT_EQ(0.0f, ewma.power);
-
-  cras_audio_format_destroy(fmt);
-  cras_audio_area_destroy(area);
-}
-
-}  // namespace
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tests/expr_unittest.cc b/cras/src/tests/expr_unittest.cc
deleted file mode 100644
index dbfdb46..0000000
--- a/cras/src/tests/expr_unittest.cc
+++ /dev/null
@@ -1,248 +0,0 @@
-// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <gtest/gtest.h>
-
-#include "cras_expr.h"
-
-namespace {
-
-TEST(ExprTest, UnparsibleExpression) {
-  struct cras_expr_expression* expr;
-
-  /* un-parsable input */
-  expr = cras_expr_expression_parse("#");
-  EXPECT_EQ(NULL, expr);
-
-  expr = cras_expr_expression_parse(NULL);
-  EXPECT_EQ(NULL, expr);
-
-  cras_expr_expression_free(expr);
-}
-
-TEST(ExprTest, LiteralExpression) {
-  struct cras_expr_expression* expr;
-  struct cras_expr_value value = CRAS_EXPR_VALUE_INIT;
-  struct cras_expr_env env = CRAS_EXPR_ENV_INIT;
-  int integer = 0;
-
-  /* parse integer literal */
-  expr = cras_expr_expression_parse(" -2");
-  EXPECT_EQ(EXPR_TYPE_LITERAL, expr->type);
-  EXPECT_EQ(CRAS_EXPR_VALUE_TYPE_INT, expr->u.literal.type);
-  EXPECT_EQ(-2, expr->u.literal.u.integer);
-
-  /* evaluate integer literal */
-  cras_expr_expression_eval(expr, &env, &value);
-  EXPECT_EQ(CRAS_EXPR_VALUE_TYPE_INT, value.type);
-  EXPECT_EQ(-2, value.u.integer);
-
-  EXPECT_EQ(0, cras_expr_expression_eval_int(expr, &env, &integer));
-  EXPECT_EQ(-2, integer);
-  cras_expr_expression_free(expr);
-
-  /* parse string literal */
-  expr = cras_expr_expression_parse("\"hello\" ");
-  EXPECT_EQ(EXPR_TYPE_LITERAL, expr->type);
-  EXPECT_EQ(CRAS_EXPR_VALUE_TYPE_STRING, expr->u.literal.type);
-  EXPECT_STREQ("hello", expr->u.literal.u.string);
-
-  /* evaluate string literal */
-  cras_expr_expression_eval(expr, &env, &value);
-  ASSERT_EQ(CRAS_EXPR_VALUE_TYPE_STRING, value.type);
-  EXPECT_STREQ("hello", value.u.string);
-
-  cras_expr_value_free(&value);
-  cras_expr_expression_free(expr);
-  cras_expr_env_free(&env);
-}
-
-TEST(ExprTest, Variable) {
-  struct cras_expr_expression* expr;
-  struct cras_expr_value value = CRAS_EXPR_VALUE_INIT;
-  struct cras_expr_env env = CRAS_EXPR_ENV_INIT;
-  int integer = 0;
-
-  /* parse variable */
-  expr = cras_expr_expression_parse("a");
-  ASSERT_EQ(EXPR_TYPE_VARIABLE, expr->type);
-  EXPECT_STREQ("a", expr->u.variable);
-
-  /* evaluate variable (undefined now) */
-  cras_expr_expression_eval(expr, &env, &value);
-  EXPECT_EQ(CRAS_EXPR_VALUE_TYPE_NONE, value.type);
-
-  /* undefined variable */
-  EXPECT_EQ(-1, cras_expr_expression_eval_int(expr, &env, &integer));
-
-  /* now define a variable with integer value 2 */
-  cras_expr_env_set_variable_integer(&env, "a", 2);
-
-  /* re-evaluate the variable */
-  EXPECT_EQ(0, cras_expr_expression_eval_int(expr, &env, &integer));
-  EXPECT_EQ(2, integer);
-
-  cras_expr_value_free(&value);
-  cras_expr_expression_free(expr);
-  cras_expr_env_free(&env);
-}
-
-TEST(ExprTest, Compound) {
-  struct cras_expr_expression *expr, *expr1, *expr2;
-  struct cras_expr_value value = CRAS_EXPR_VALUE_INIT;
-  struct cras_expr_env env = CRAS_EXPR_ENV_INIT;
-
-  /* parse empty compound expression */
-  expr = cras_expr_expression_parse("()");
-  ASSERT_EQ(EXPR_TYPE_COMPOUND, expr->type);
-  EXPECT_EQ(0, ARRAY_COUNT(&expr->u.children));
-
-  /* evaluate empty compound expression */
-  cras_expr_expression_eval(expr, &env, &value);
-  EXPECT_EQ(CRAS_EXPR_VALUE_TYPE_NONE, value.type);
-  cras_expr_expression_free(expr);
-
-  /* parse non-empty compound expression */
-  expr = cras_expr_expression_parse("(foo bar)");
-  ASSERT_EQ(EXPR_TYPE_COMPOUND, expr->type);
-  EXPECT_EQ(2, ARRAY_COUNT(&expr->u.children));
-
-  /* evaluate non-empty compound expression */
-  cras_expr_expression_eval(expr, &env, &value);
-  EXPECT_EQ(CRAS_EXPR_VALUE_TYPE_NONE, value.type);
-  cras_expr_expression_free(expr);
-
-  /* parse nested compound expression */
-  expr = cras_expr_expression_parse("((foo 3)bar )");
-  ASSERT_EQ(EXPR_TYPE_COMPOUND, expr->type);
-  ASSERT_EQ(2, ARRAY_COUNT(&expr->u.children));
-
-  expr1 = *ARRAY_ELEMENT(&expr->u.children, 0);
-  ASSERT_EQ(EXPR_TYPE_COMPOUND, expr1->type);
-  ASSERT_EQ(2, ARRAY_COUNT(&expr1->u.children));
-
-  expr2 = *ARRAY_ELEMENT(&expr1->u.children, 1);
-  ASSERT_EQ(EXPR_TYPE_LITERAL, expr2->type);
-  EXPECT_EQ(CRAS_EXPR_VALUE_TYPE_INT, expr2->u.literal.type);
-  EXPECT_EQ(3, expr2->u.literal.u.integer);
-
-  /* evaluate nested compound expression */
-  cras_expr_expression_eval(expr, &env, &value);
-  EXPECT_EQ(CRAS_EXPR_VALUE_TYPE_NONE, value.type);
-  cras_expr_expression_free(expr);
-
-  cras_expr_value_free(&value);
-  cras_expr_env_free(&env);
-}
-
-TEST(ExprTest, Environment) {
-  struct cras_expr_expression* expr;
-  struct cras_expr_value value = CRAS_EXPR_VALUE_INIT;
-  struct cras_expr_env env1 = CRAS_EXPR_ENV_INIT;
-  struct cras_expr_env env2 = CRAS_EXPR_ENV_INIT;
-  int integer = 0;
-  char boolean = 0;
-
-  /* parse variable */
-  expr = cras_expr_expression_parse("baz");
-
-  /* put baz=4 into env1 */
-  cras_expr_env_set_variable_integer(&env1, "baz", 4);
-
-  /* evaluate expr against env1 and env2 */
-  EXPECT_EQ(0, cras_expr_expression_eval_int(expr, &env1, &integer));
-  EXPECT_EQ(4, integer);
-  EXPECT_EQ(-1, cras_expr_expression_eval_int(expr, &env2, &integer));
-
-  /* put baz=5 into env2 */
-  cras_expr_env_set_variable_integer(&env2, "baz", 5);
-
-  /* evaluate again */
-  EXPECT_EQ(0, cras_expr_expression_eval_int(expr, &env1, &integer));
-  EXPECT_EQ(4, integer);
-  EXPECT_EQ(0, cras_expr_expression_eval_int(expr, &env2, &integer));
-  EXPECT_EQ(5, integer);
-
-  /* an integer is not a boolean */
-  EXPECT_EQ(-1, cras_expr_expression_eval_boolean(expr, &env2, &boolean));
-
-  cras_expr_value_free(&value);
-  cras_expr_expression_free(expr);
-  cras_expr_env_free(&env1);
-  cras_expr_env_free(&env2);
-}
-
-static void expect_int(int expected,
-                       const char* str,
-                       struct cras_expr_env* env) {
-  struct cras_expr_expression* expr;
-  struct cras_expr_value value = CRAS_EXPR_VALUE_INIT;
-
-  expr = cras_expr_expression_parse(str);
-  cras_expr_expression_eval(expr, env, &value);
-  EXPECT_EQ(CRAS_EXPR_VALUE_TYPE_INT, value.type);
-  EXPECT_EQ(expected, value.u.integer);
-  cras_expr_expression_free(expr);
-}
-
-static void expect_boolean(char expected,
-                           const char* str,
-                           struct cras_expr_env* env) {
-  struct cras_expr_expression* expr;
-  struct cras_expr_value value = CRAS_EXPR_VALUE_INIT;
-
-  expr = cras_expr_expression_parse(str);
-  cras_expr_expression_eval(expr, env, &value);
-  EXPECT_EQ(CRAS_EXPR_VALUE_TYPE_BOOLEAN, value.type);
-  EXPECT_EQ(expected, value.u.boolean);
-  cras_expr_expression_free(expr);
-}
-
-TEST(ExprTest, Builtin) {
-  struct cras_expr_expression* expr;
-  struct cras_expr_value value = CRAS_EXPR_VALUE_INIT;
-  struct cras_expr_env env = CRAS_EXPR_ENV_INIT;
-
-  cras_expr_env_install_builtins(&env);
-
-  /* parse variable */
-  expr = cras_expr_expression_parse("or");
-  cras_expr_expression_eval(expr, &env, &value);
-  EXPECT_EQ(CRAS_EXPR_VALUE_TYPE_FUNCTION, value.type);
-  cras_expr_expression_free(expr);
-
-  /* test builtin functions */
-  expect_boolean(1, "(and)", &env);
-  expect_boolean(1, "(and #t)", &env);
-  expect_boolean(1, "(and #t #t)", &env);
-  expect_int(3, "(and 1 2 3)", &env);
-  expect_boolean(0, "(and #f 4)", &env);
-  expect_boolean(0, "(or)", &env);
-  expect_boolean(1, "(or #t)", &env);
-  expect_boolean(0, "(or #f #f)", &env);
-  expect_int(2, "(or #f #f 2)", &env);
-  expect_int(3, "(or #f (or 3))", &env);
-  expect_boolean(0, "(equal? \"hello\" 3)", &env);
-  expect_boolean(1, "(equal? \"hello\" \"hello\")", &env);
-
-  /* a more complex example a="hello" b="world"*/
-  expr = cras_expr_expression_parse("(or (equal? \"test\" a) b)");
-  cras_expr_env_set_variable_string(&env, "a", "hello");
-  cras_expr_env_set_variable_string(&env, "b", "world");
-
-  cras_expr_expression_eval(expr, &env, &value);
-  EXPECT_EQ(CRAS_EXPR_VALUE_TYPE_STRING, value.type);
-  EXPECT_STREQ("world", value.u.string);
-  cras_expr_expression_free(expr);
-
-  cras_expr_value_free(&value);
-  cras_expr_env_free(&env);
-}
-
-}  //  namespace
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tests/file_wait_unittest.cc b/cras/src/tests/file_wait_unittest.cc
deleted file mode 100644
index 87cd53c..0000000
--- a/cras/src/tests/file_wait_unittest.cc
+++ /dev/null
@@ -1,277 +0,0 @@
-// Copyright 2016 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <fcntl.h>
-#include <gtest/gtest.h>
-#include <stdlib.h>
-
-#include <string>
-
-#include "cras_file_wait.h"
-#include "cras_util.h"
-
-extern "C" {
-// This function is not exported in cras_util.h.
-void cras_file_wait_mock_race_condition(struct cras_file_wait* file_wait);
-}
-
-namespace {
-
-// Executes "rm -rf <path>".
-static int RmRF(const std::string& path) {
-  std::string cmd("rm -rf \"");
-  cmd += path + "\"";
-
-  if (path == "/")
-    return -EINVAL;
-
-  int rc = system(cmd.c_str());
-  if (rc < 0)
-    return -errno;
-  return WEXITSTATUS(rc);
-}
-
-// Filled-in by the FileWaitCallback.
-struct FileWaitResult {
-  size_t called;
-  cras_file_wait_event_t event;
-};
-
-// Called by the file wait code for an event.
-static void FileWaitCallback(void* context,
-                             cras_file_wait_event_t event,
-                             const char* filename) {
-  FileWaitResult* result = reinterpret_cast<FileWaitResult*>(context);
-  result->called++;
-  result->event = event;
-}
-
-// Do all of the EXPECTed steps for a simple wait for one file.
-static void SimpleFileWait(const char* file_path) {
-  struct cras_file_wait* file_wait;
-  FileWaitResult file_wait_result;
-  struct pollfd poll_fd;
-  struct timespec timeout = {0, 100000000};
-  struct stat stat_buf;
-  int stat_rc;
-
-  stat_rc = stat(file_path, &stat_buf);
-  if (stat_rc < 0)
-    stat_rc = -errno;
-
-  file_wait_result.called = 0;
-  EXPECT_EQ(0, cras_file_wait_create(file_path, CRAS_FILE_WAIT_FLAG_NONE,
-                                     FileWaitCallback, &file_wait_result,
-                                     &file_wait));
-  EXPECT_NE(reinterpret_cast<struct cras_file_wait*>(NULL), file_wait);
-  if (stat_rc == 0) {
-    EXPECT_EQ(1, file_wait_result.called);
-    EXPECT_EQ(CRAS_FILE_WAIT_EVENT_CREATED, file_wait_result.event);
-  } else {
-    EXPECT_EQ(0, file_wait_result.called);
-  }
-  poll_fd.events = POLLIN;
-  poll_fd.fd = cras_file_wait_get_fd(file_wait);
-
-  file_wait_result.called = 0;
-  if (stat_rc == 0)
-    EXPECT_EQ(0, RmRF(file_path));
-  else
-    EXPECT_EQ(0, mknod(file_path, S_IFREG | 0600, 0));
-  EXPECT_EQ(1, cras_poll(&poll_fd, 1, &timeout, NULL));
-  EXPECT_EQ(0, cras_file_wait_dispatch(file_wait));
-  EXPECT_EQ(1, file_wait_result.called);
-  if (stat_rc == 0)
-    EXPECT_EQ(CRAS_FILE_WAIT_EVENT_DELETED, file_wait_result.event);
-  else
-    EXPECT_EQ(CRAS_FILE_WAIT_EVENT_CREATED, file_wait_result.event);
-  EXPECT_EQ(-EAGAIN, cras_file_wait_dispatch(file_wait));
-  cras_file_wait_destroy(file_wait);
-}
-
-// Test the cras_file_wait functions including multiple path components
-// missing and path components deleted and recreated.
-TEST(Util, FileWait) {
-  struct cras_file_wait* file_wait;
-  FileWaitResult file_wait_result;
-  pid_t pid = getpid();
-  struct pollfd poll_fd;
-  int current_dir;
-  struct timespec timeout = {0, 100000000};
-  char pid_buf[32];
-  std::string tmp_dir(CRAS_UT_TMPDIR);
-  std::string dir_path;
-  std::string subdir_path;
-  std::string file_path;
-
-  snprintf(pid_buf, sizeof(pid_buf), "%d", pid);
-  dir_path = tmp_dir + "/" + pid_buf;
-  subdir_path = dir_path + "/subdir";
-  file_path = subdir_path + "/does_not_exist";
-
-  // Test arguments.
-  // Null file path.
-  EXPECT_EQ(-EINVAL, cras_file_wait_create(NULL, CRAS_FILE_WAIT_FLAG_NONE,
-                                           FileWaitCallback, &file_wait_result,
-                                           &file_wait));
-  // Empty file path.
-  EXPECT_EQ(-EINVAL, cras_file_wait_create("", CRAS_FILE_WAIT_FLAG_NONE,
-                                           FileWaitCallback, &file_wait_result,
-                                           &file_wait));
-  // No callback structure.
-  EXPECT_EQ(-EINVAL, cras_file_wait_create(".", CRAS_FILE_WAIT_FLAG_NONE, NULL,
-                                           NULL, &file_wait));
-  // No file wait structure.
-  EXPECT_EQ(-EINVAL,
-            cras_file_wait_create(".", CRAS_FILE_WAIT_FLAG_NONE,
-                                  FileWaitCallback, &file_wait_result, NULL));
-  EXPECT_EQ(-EINVAL, cras_file_wait_dispatch(NULL));
-  EXPECT_EQ(-EINVAL, cras_file_wait_get_fd(NULL));
-
-  // Make sure that /tmp exists.
-  file_wait_result.called = 0;
-  EXPECT_EQ(0, cras_file_wait_create(CRAS_UT_TMPDIR, CRAS_FILE_WAIT_FLAG_NONE,
-                                     FileWaitCallback, &file_wait_result,
-                                     &file_wait));
-  EXPECT_NE(reinterpret_cast<struct cras_file_wait*>(NULL), file_wait);
-  EXPECT_EQ(file_wait_result.called, 1);
-  ASSERT_EQ(file_wait_result.event, CRAS_FILE_WAIT_EVENT_CREATED);
-  cras_file_wait_destroy(file_wait);
-
-  // Create our temporary dir.
-  ASSERT_EQ(0, RmRF(dir_path));
-  ASSERT_EQ(0, mkdir(dir_path.c_str(), 0700));
-
-  // Start looking for our file '.../does_not_exist'.
-  EXPECT_EQ(0, cras_file_wait_create(file_path.c_str(),
-                                     CRAS_FILE_WAIT_FLAG_NONE, FileWaitCallback,
-                                     &file_wait_result, &file_wait));
-  EXPECT_NE(reinterpret_cast<struct cras_file_wait*>(NULL), file_wait);
-  poll_fd.events = POLLIN;
-  poll_fd.fd = cras_file_wait_get_fd(file_wait);
-  EXPECT_NE(0, poll_fd.fd >= 0);
-
-  // Create a sub-directory in the path.
-  file_wait_result.called = 0;
-  EXPECT_EQ(0, mkdir(subdir_path.c_str(), 0700));
-  EXPECT_EQ(1, cras_poll(&poll_fd, 1, &timeout, NULL));
-  EXPECT_EQ(0, cras_file_wait_dispatch(file_wait));
-  EXPECT_EQ(0, file_wait_result.called);
-  // Removing a watch causes generation of an IN_IGNORED event for the previous
-  // watch_id. cras_file_wait_dispatch will ignore this and return 0.
-  EXPECT_EQ(0, cras_file_wait_dispatch(file_wait));
-  EXPECT_EQ(-EAGAIN, cras_file_wait_dispatch(file_wait));
-
-  // Remove the directory that we're watching.
-  EXPECT_EQ(0, RmRF(subdir_path));
-  timeout.tv_sec = 0;
-  timeout.tv_nsec = 100000000;
-  EXPECT_EQ(1, cras_poll(&poll_fd, 1, &timeout, NULL));
-  EXPECT_EQ(0, cras_file_wait_dispatch(file_wait));
-  EXPECT_EQ(0, file_wait_result.called);
-  EXPECT_EQ(-EAGAIN, cras_file_wait_dispatch(file_wait));
-
-  // Create a sub-directory in the path (again).
-  EXPECT_EQ(0, mkdir(subdir_path.c_str(), 0700));
-  timeout.tv_sec = 0;
-  timeout.tv_nsec = 100000000;
-  EXPECT_EQ(1, cras_poll(&poll_fd, 1, &timeout, NULL));
-  EXPECT_EQ(0, cras_file_wait_dispatch(file_wait));
-  EXPECT_EQ(0, file_wait_result.called);
-  // See IN_IGNORED above.
-  EXPECT_EQ(0, cras_file_wait_dispatch(file_wait));
-  EXPECT_EQ(-EAGAIN, cras_file_wait_dispatch(file_wait));
-
-  // Create the file we're looking for.
-  EXPECT_EQ(0, mknod(file_path.c_str(), S_IFREG | 0600, 0));
-  timeout.tv_sec = 0;
-  timeout.tv_nsec = 100000000;
-  EXPECT_EQ(1, cras_poll(&poll_fd, 1, &timeout, NULL));
-  EXPECT_EQ(0, cras_file_wait_dispatch(file_wait));
-  EXPECT_EQ(1, file_wait_result.called);
-  EXPECT_EQ(CRAS_FILE_WAIT_EVENT_CREATED, file_wait_result.event);
-  EXPECT_EQ(-EAGAIN, cras_file_wait_dispatch(file_wait));
-
-  // Remove the file.
-  file_wait_result.called = 0;
-  EXPECT_EQ(0, unlink(file_path.c_str()));
-  timeout.tv_sec = 0;
-  timeout.tv_nsec = 100000000;
-  EXPECT_EQ(1, cras_poll(&poll_fd, 1, &timeout, NULL));
-  EXPECT_EQ(0, cras_file_wait_dispatch(file_wait));
-  EXPECT_EQ(1, file_wait_result.called);
-  EXPECT_EQ(CRAS_FILE_WAIT_EVENT_DELETED, file_wait_result.event);
-  EXPECT_EQ(-EAGAIN, cras_file_wait_dispatch(file_wait));
-
-  // Re-create the file.
-  file_wait_result.called = 0;
-  EXPECT_EQ(0, mknod(file_path.c_str(), S_IFREG | 0600, 0));
-  timeout.tv_sec = 0;
-  timeout.tv_nsec = 100000000;
-  EXPECT_EQ(1, cras_poll(&poll_fd, 1, &timeout, NULL));
-  EXPECT_EQ(0, cras_file_wait_dispatch(file_wait));
-  EXPECT_EQ(1, file_wait_result.called);
-  EXPECT_EQ(CRAS_FILE_WAIT_EVENT_CREATED, file_wait_result.event);
-  EXPECT_EQ(-EAGAIN, cras_file_wait_dispatch(file_wait));
-
-  // Remove the subdir.
-  file_wait_result.called = 0;
-  EXPECT_EQ(0, RmRF(subdir_path));
-  timeout.tv_sec = 0;
-  timeout.tv_nsec = 100000000;
-  EXPECT_EQ(1, cras_poll(&poll_fd, 1, &timeout, NULL));
-  EXPECT_EQ(0, cras_file_wait_dispatch(file_wait));
-  EXPECT_EQ(1, file_wait_result.called);
-  EXPECT_EQ(CRAS_FILE_WAIT_EVENT_DELETED, file_wait_result.event);
-  EXPECT_EQ(-EAGAIN, cras_file_wait_dispatch(file_wait));
-
-  // Create a sub-directory in the path (again), and this time mock a race
-  // condition for creation of the file.
-  file_wait_result.called = 0;
-  EXPECT_EQ(0, mkdir(subdir_path.c_str(), 0700));
-  timeout.tv_sec = 0;
-  timeout.tv_nsec = 100000000;
-  EXPECT_EQ(1, cras_poll(&poll_fd, 1, &timeout, NULL));
-  cras_file_wait_mock_race_condition(file_wait);
-  EXPECT_EQ(0, cras_file_wait_dispatch(file_wait));
-  EXPECT_EQ(1, file_wait_result.called);
-  EXPECT_EQ(CRAS_FILE_WAIT_EVENT_CREATED, file_wait_result.event);
-  EXPECT_EQ(0, cras_file_wait_dispatch(file_wait));
-  EXPECT_EQ(1, file_wait_result.called);
-  EXPECT_EQ(-EAGAIN, cras_file_wait_dispatch(file_wait));
-
-  // Cleanup.
-  cras_file_wait_destroy(file_wait);
-
-  // Treat consecutive '/' as one.
-  file_path = dir_path + "//does_not_exist_too";
-  SimpleFileWait(file_path.c_str());
-
-  // Stash the current directory.
-  current_dir = open(".", O_RDONLY | O_PATH | O_DIRECTORY);
-  ASSERT_NE(0, current_dir >= 0);
-
-  // Search for a file in the current directory.
-  ASSERT_EQ(0, chdir(dir_path.c_str()));
-  SimpleFileWait("does_not_exist_either");
-
-  // Test notification of deletion in the current directory.
-  SimpleFileWait("does_not_exist_either");
-
-  // Search for a file in the current directory (variation).
-  SimpleFileWait("./does_not_exist_either_too");
-
-  // Return to the start directory.
-  EXPECT_EQ(0, fchdir(current_dir));
-
-  // Clean up.
-  EXPECT_EQ(0, RmRF(dir_path));
-}
-
-}  //  namespace
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tests/float_buffer_unittest.cc b/cras/src/tests/float_buffer_unittest.cc
deleted file mode 100644
index eee523b..0000000
--- a/cras/src/tests/float_buffer_unittest.cc
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2018 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "float_buffer.h"
-
-#include <gtest/gtest.h>
-
-namespace {
-TEST(FloatBuffer, ReadWrite) {
-  unsigned int readable = 10;
-  struct float_buffer* b = float_buffer_create(10, 2);
-  EXPECT_EQ(10, float_buffer_writable(b));
-
-  // (w, r)=(8, 0)
-  float_buffer_written(b, 8);
-  EXPECT_EQ(8, float_buffer_level(b));
-
-  float_buffer_read_pointer(b, 0, &readable);
-  EXPECT_EQ(8, readable);
-  EXPECT_EQ(2, float_buffer_writable(b));
-
-  readable = 10;
-  float_buffer_read_pointer(b, 3, &readable);
-  EXPECT_EQ(5, readable);
-
-  // (w, r)=(8, 6)
-  float_buffer_read(b, 6);
-  EXPECT_EQ(2, float_buffer_writable(b));
-
-  // (w, r)=(0, 6)
-  float_buffer_written(b, 2);
-  EXPECT_EQ(6, float_buffer_writable(b));
-
-  // (w, r)=(3, 6)
-  readable = 10;
-  float_buffer_written(b, 3);
-  float_buffer_read_pointer(b, 0, &readable);
-  EXPECT_EQ(4, readable);
-
-  readable = 10;
-  float_buffer_read_pointer(b, 1, &readable);
-  EXPECT_EQ(3, readable);
-
-  float_buffer_destroy(&b);
-}
-
-}  // namespace
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tests/fmt_conv_ops_unittest.cc b/cras/src/tests/fmt_conv_ops_unittest.cc
deleted file mode 100644
index 0baf37b..0000000
--- a/cras/src/tests/fmt_conv_ops_unittest.cc
+++ /dev/null
@@ -1,855 +0,0 @@
-// Copyright 2019 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <gtest/gtest.h>
-#include <limits.h>
-#include <math.h>
-#include <stdint.h>
-#include <sys/param.h>
-
-#include <memory>
-
-extern "C" {
-#include "cras_fmt_conv_ops.h"
-#include "cras_types.h"
-}
-
-static uint8_t* AllocateRandomBytes(size_t size) {
-  uint8_t* buf = (uint8_t*)malloc(size);
-  while (size--)
-    buf[size] = rand() & 0xff;
-  return buf;
-}
-
-using U8Ptr = std::unique_ptr<uint8_t[], decltype(free)*>;
-using S16LEPtr = std::unique_ptr<int16_t[], decltype(free)*>;
-using S243LEPtr = std::unique_ptr<uint8_t[], decltype(free)*>;
-using S24LEPtr = std::unique_ptr<int32_t[], decltype(free)*>;
-using S32LEPtr = std::unique_ptr<int32_t[], decltype(free)*>;
-using FloatPtr = std::unique_ptr<float[], decltype(free)*>;
-
-static U8Ptr CreateU8(size_t size) {
-  uint8_t* buf = AllocateRandomBytes(size * sizeof(uint8_t));
-  U8Ptr ret(buf, free);
-  return ret;
-}
-
-static S16LEPtr CreateS16LE(size_t size) {
-  uint8_t* buf = AllocateRandomBytes(size * sizeof(int16_t));
-  S16LEPtr ret(reinterpret_cast<int16_t*>(buf), free);
-  return ret;
-}
-
-static S243LEPtr CreateS243LE(size_t size) {
-  uint8_t* buf = AllocateRandomBytes(size * sizeof(uint8_t) * 3);
-  S243LEPtr ret(buf, free);
-  return ret;
-}
-
-static S24LEPtr CreateS24LE(size_t size) {
-  uint8_t* buf = AllocateRandomBytes(size * sizeof(int32_t));
-  S24LEPtr ret(reinterpret_cast<int32_t*>(buf), free);
-  return ret;
-}
-
-static S32LEPtr CreateS32LE(size_t size) {
-  uint8_t* buf = AllocateRandomBytes(size * sizeof(int32_t));
-  S32LEPtr ret(reinterpret_cast<int32_t*>(buf), free);
-  return ret;
-}
-
-static FloatPtr CreateFloat(size_t size) {
-  float* buf = (float*)malloc(size * sizeof(float));
-  while (size--)
-    buf[size] = (float)(rand() & 0xff) / 0xfff;
-  FloatPtr ret(buf, free);
-  return ret;
-}
-
-static int32_t ToS243LE(const uint8_t* in) {
-  int32_t ret = 0;
-
-  ret |= in[2];
-  ret <<= 8;
-  ret |= in[1];
-  ret <<= 8;
-  ret |= in[0];
-  return ret;
-}
-
-static int16_t S16AddAndClip(int16_t a, int16_t b) {
-  int32_t sum;
-
-  sum = (int32_t)a + (int32_t)b;
-  sum = MAX(sum, SHRT_MIN);
-  sum = MIN(sum, SHRT_MAX);
-  return sum;
-}
-
-// Test U8 to S16_LE conversion.
-TEST(FormatConverterOpsTest, ConvertU8ToS16LE) {
-  const size_t frames = 4096;
-  const size_t in_ch = 2;
-  const size_t out_ch = 2;
-
-  U8Ptr src = CreateU8(frames * in_ch);
-  S16LEPtr dst = CreateS16LE(frames * out_ch);
-
-  convert_u8_to_s16le(src.get(), frames * in_ch, (uint8_t*)dst.get());
-
-  for (size_t i = 0; i < frames * in_ch; ++i) {
-    EXPECT_EQ((int16_t)((uint16_t)((int16_t)(int8_t)src[i] - 0x80) << 8),
-              dst[i]);
-  }
-}
-
-// Test S24_3LE to S16_LE conversion.
-TEST(FormatConverterOpsTest, ConvertS243LEToS16LE) {
-  const size_t frames = 4096;
-  const size_t in_ch = 2;
-  const size_t out_ch = 2;
-
-  S243LEPtr src = CreateS243LE(frames * in_ch);
-  S16LEPtr dst = CreateS16LE(frames * out_ch);
-
-  convert_s243le_to_s16le(src.get(), frames * in_ch, (uint8_t*)dst.get());
-
-  uint8_t* p = src.get();
-  for (size_t i = 0; i < frames * in_ch; ++i) {
-    EXPECT_EQ((int16_t)(ToS243LE(p) >> 8), dst[i]);
-    p += 3;
-  }
-}
-
-// Test S24_LE to S16_LE conversion.
-TEST(FormatConverterOpsTest, ConvertS24LEToS16LE) {
-  const size_t frames = 4096;
-  const size_t in_ch = 2;
-  const size_t out_ch = 2;
-
-  S24LEPtr src = CreateS24LE(frames * in_ch);
-  S16LEPtr dst = CreateS16LE(frames * out_ch);
-
-  convert_s24le_to_s16le((uint8_t*)src.get(), frames * in_ch,
-                         (uint8_t*)dst.get());
-
-  for (size_t i = 0; i < frames * in_ch; ++i) {
-    EXPECT_EQ((int16_t)(src[i] >> 8), dst[i]);
-  }
-}
-
-// Test S32_LE to S16_LE conversion.
-TEST(FormatConverterOpsTest, ConvertS32LEToS16LE) {
-  const size_t frames = 4096;
-  const size_t in_ch = 2;
-  const size_t out_ch = 2;
-
-  S32LEPtr src = CreateS32LE(frames * in_ch);
-  S16LEPtr dst = CreateS16LE(frames * out_ch);
-
-  convert_s32le_to_s16le((uint8_t*)src.get(), frames * in_ch,
-                         (uint8_t*)dst.get());
-
-  for (size_t i = 0; i < frames * in_ch; ++i) {
-    EXPECT_EQ((int16_t)(src[i] >> 16), dst[i]);
-  }
-}
-
-// Test S16_LE to U8 conversion.
-TEST(FormatConverterOpsTest, ConvertS16LEToU8) {
-  const size_t frames = 4096;
-  const size_t in_ch = 2;
-  const size_t out_ch = 2;
-
-  S16LEPtr src = CreateS16LE(frames * in_ch);
-  U8Ptr dst = CreateU8(frames * out_ch);
-
-  convert_s16le_to_u8((uint8_t*)src.get(), frames * in_ch, dst.get());
-
-  for (size_t i = 0; i < frames * in_ch; ++i) {
-    EXPECT_EQ((uint8_t)(int8_t)((src[i] >> 8) + 0x80), dst[i]);
-  }
-}
-
-// Test S16_LE to S24_3LE conversion.
-TEST(FormatConverterOpsTest, ConvertS16LEToS243LE) {
-  const size_t frames = 4096;
-  const size_t in_ch = 2;
-  const size_t out_ch = 2;
-
-  S16LEPtr src = CreateS16LE(frames * in_ch);
-  S243LEPtr dst = CreateS243LE(frames * out_ch);
-
-  convert_s16le_to_s243le((uint8_t*)src.get(), frames * in_ch, dst.get());
-
-  uint8_t* p = dst.get();
-  for (size_t i = 0; i < frames * in_ch; ++i) {
-    EXPECT_EQ((int32_t)((uint32_t)src[i] << 8) & 0x00ffffff,
-              ToS243LE(p) & 0x00ffffff);
-    p += 3;
-  }
-}
-
-// Test S16_LE to S24_LE conversion.
-TEST(FormatConverterOpsTest, ConvertS16LEToS24LE) {
-  const size_t frames = 4096;
-  const size_t in_ch = 2;
-  const size_t out_ch = 2;
-
-  S16LEPtr src = CreateS16LE(frames * in_ch);
-  S24LEPtr dst = CreateS24LE(frames * out_ch);
-
-  convert_s16le_to_s24le((uint8_t*)src.get(), frames * in_ch,
-                         (uint8_t*)dst.get());
-
-  for (size_t i = 0; i < frames * in_ch; ++i) {
-    EXPECT_EQ((int32_t)((uint32_t)src[i] << 8) & 0x00ffffff,
-              dst[i] & 0x00ffffff);
-  }
-}
-
-// Test S16_LE to S32_LE conversion.
-TEST(FormatConverterOpsTest, ConvertS16LEToS32LE) {
-  const size_t frames = 4096;
-  const size_t in_ch = 2;
-  const size_t out_ch = 2;
-
-  S16LEPtr src = CreateS16LE(frames * in_ch);
-  S32LEPtr dst = CreateS32LE(frames * out_ch);
-
-  convert_s16le_to_s32le((uint8_t*)src.get(), frames * in_ch,
-                         (uint8_t*)dst.get());
-
-  for (size_t i = 0; i < frames * in_ch; ++i) {
-    EXPECT_EQ((int32_t)((uint32_t)src[i] << 16) & 0xffffff00,
-              dst[i] & 0xffffff00);
-  }
-}
-
-// Test Mono to Stereo conversion.  S16_LE.
-TEST(FormatConverterOpsTest, MonoToStereoS16LE) {
-  const size_t frames = 4096;
-  const size_t in_ch = 1;
-  const size_t out_ch = 2;
-
-  S16LEPtr src = CreateS16LE(frames * in_ch);
-  S16LEPtr dst = CreateS16LE(frames * out_ch);
-
-  size_t ret =
-      s16_mono_to_stereo((uint8_t*)src.get(), frames, (uint8_t*)dst.get());
-  EXPECT_EQ(ret, frames);
-
-  for (size_t i = 0; i < frames; ++i) {
-    EXPECT_EQ(src[i], dst[i * 2 + 0]);
-    EXPECT_EQ(src[i], dst[i * 2 + 1]);
-  }
-}
-
-// Test Stereo to Mono conversion.  S16_LE.
-TEST(FormatConverterOpsTest, StereoToMonoS16LE) {
-  const size_t frames = 4096;
-  const size_t in_ch = 2;
-  const size_t out_ch = 1;
-
-  S16LEPtr src = CreateS16LE(frames * in_ch);
-  S16LEPtr dst = CreateS16LE(frames * out_ch);
-  for (size_t i = 0; i < frames; ++i) {
-    src[i * 2 + 0] = 13450;
-    src[i * 2 + 1] = -13449;
-  }
-
-  size_t ret =
-      s16_stereo_to_mono((uint8_t*)src.get(), frames, (uint8_t*)dst.get());
-  EXPECT_EQ(ret, frames);
-
-  for (size_t i = 0; i < frames; ++i) {
-    EXPECT_EQ(1, dst[i]);
-  }
-}
-
-// Test Stereo to Mono conversion.  S16_LE, Overflow.
-TEST(FormatConverterOpsTest, StereoToMonoS16LEOverflow) {
-  const size_t frames = 4096;
-  const size_t in_ch = 2;
-  const size_t out_ch = 1;
-
-  S16LEPtr src = CreateS16LE(frames * in_ch);
-  S16LEPtr dst = CreateS16LE(frames * out_ch);
-  for (size_t i = 0; i < frames; ++i) {
-    src[i * 2 + 0] = 0x7fff;
-    src[i * 2 + 1] = 1;
-  }
-
-  size_t ret =
-      s16_stereo_to_mono((uint8_t*)src.get(), frames, (uint8_t*)dst.get());
-  EXPECT_EQ(ret, frames);
-
-  for (size_t i = 0; i < frames; ++i) {
-    EXPECT_EQ(0x7fff, dst[i]);
-  }
-}
-
-// Test Stereo to Mono conversion.  S16_LE, Underflow.
-TEST(FormatConverterOpsTest, StereoToMonoS16LEUnderflow) {
-  const size_t frames = 4096;
-  const size_t in_ch = 2;
-  const size_t out_ch = 1;
-
-  S16LEPtr src = CreateS16LE(frames * in_ch);
-  S16LEPtr dst = CreateS16LE(frames * out_ch);
-  for (size_t i = 0; i < frames; ++i) {
-    src[i * 2 + 0] = -0x8000;
-    src[i * 2 + 1] = -0x1;
-  }
-
-  size_t ret =
-      s16_stereo_to_mono((uint8_t*)src.get(), frames, (uint8_t*)dst.get());
-  EXPECT_EQ(ret, frames);
-
-  for (size_t i = 0; i < frames; ++i) {
-    EXPECT_EQ(-0x8000, dst[i]);
-  }
-}
-
-// Test Mono to 5.1 conversion.  S16_LE, Center.
-TEST(FormatConverterOpsTest, MonoTo51S16LECenter) {
-  const size_t frames = 4096;
-  const size_t in_ch = 1;
-  const size_t out_ch = 6;
-  const size_t left = 0;
-  const size_t right = 1;
-  const size_t center = 4;
-
-  S16LEPtr src = CreateS16LE(frames * in_ch);
-  S16LEPtr dst = CreateS16LE(frames * out_ch);
-
-  size_t ret = s16_mono_to_51(left, right, center, (uint8_t*)src.get(), frames,
-                              (uint8_t*)dst.get());
-  EXPECT_EQ(ret, frames);
-
-  for (size_t i = 0; i < frames; ++i) {
-    for (size_t k = 0; k < 6; ++k) {
-      if (k == center)
-        EXPECT_EQ(src[i], dst[i * 6 + k]);
-      else
-        EXPECT_EQ(0, dst[i * 6 + k]);
-    }
-  }
-}
-
-// Test Mono to 5.1 conversion.  S16_LE, LeftRight.
-TEST(FormatConverterOpsTest, MonoTo51S16LELeftRight) {
-  const size_t frames = 4096;
-  const size_t in_ch = 1;
-  const size_t out_ch = 6;
-  const size_t left = 0;
-  const size_t right = 1;
-  const size_t center = -1;
-
-  S16LEPtr src = CreateS16LE(frames * in_ch);
-  S16LEPtr dst = CreateS16LE(frames * out_ch);
-
-  size_t ret = s16_mono_to_51(left, right, center, (uint8_t*)src.get(), frames,
-                              (uint8_t*)dst.get());
-  EXPECT_EQ(ret, frames);
-
-  for (size_t i = 0; i < frames; ++i) {
-    for (size_t k = 0; k < 6; ++k) {
-      if (k == left)
-        EXPECT_EQ(src[i] / 2, dst[i * 6 + k]);
-      else if (k == right)
-        EXPECT_EQ(src[i] / 2, dst[i * 6 + k]);
-      else
-        EXPECT_EQ(0, dst[i * 6 + k]);
-    }
-  }
-}
-
-// Test Mono to 5.1 conversion.  S16_LE, Unknown.
-TEST(FormatConverterOpsTest, MonoTo51S16LEUnknown) {
-  const size_t frames = 4096;
-  const size_t in_ch = 1;
-  const size_t out_ch = 6;
-  const size_t left = -1;
-  const size_t right = -1;
-  const size_t center = -1;
-
-  S16LEPtr src = CreateS16LE(frames * in_ch);
-  S16LEPtr dst = CreateS16LE(frames * out_ch);
-
-  size_t ret = s16_mono_to_51(left, right, center, (uint8_t*)src.get(), frames,
-                              (uint8_t*)dst.get());
-  EXPECT_EQ(ret, frames);
-
-  for (size_t i = 0; i < frames; ++i) {
-    for (size_t k = 0; k < 6; ++k) {
-      if (k == 0)
-        EXPECT_EQ(src[i], dst[i * 6 + k]);
-      else
-        EXPECT_EQ(0, dst[6 * i + k]);
-    }
-  }
-}
-
-// Test Stereo to 5.1 conversion.  S16_LE, Center.
-TEST(FormatConverterOpsTest, StereoTo51S16LECenter) {
-  const size_t frames = 4096;
-  const size_t in_ch = 2;
-  const size_t out_ch = 6;
-  const size_t left = -1;
-  const size_t right = 1;
-  const size_t center = 4;
-
-  S16LEPtr src = CreateS16LE(frames * in_ch);
-  S16LEPtr dst = CreateS16LE(frames * out_ch);
-
-  size_t ret = s16_stereo_to_51(left, right, center, (uint8_t*)src.get(),
-                                frames, (uint8_t*)dst.get());
-  EXPECT_EQ(ret, frames);
-
-  for (size_t i = 0; i < frames; ++i) {
-    for (size_t k = 0; k < 6; ++k) {
-      if (k == center)
-        EXPECT_EQ(S16AddAndClip(src[i * 2], src[i * 2 + 1]), dst[i * 6 + k]);
-      else
-        EXPECT_EQ(0, dst[i * 6 + k]);
-    }
-  }
-}
-
-// Test Quad to 5.1 conversion. S16_LE.
-TEST(FormatConverterOpsTest, QuadTo51S16LE) {
-  const size_t frames = 4096;
-  const size_t in_ch = 4;
-  const size_t out_ch = 6;
-  const unsigned int fl_quad = 0;
-  const unsigned int fr_quad = 1;
-  const unsigned int rl_quad = 2;
-  const unsigned int rr_quad = 3;
-
-  const unsigned int fl_51 = 0;
-  const unsigned int fr_51 = 1;
-  const unsigned int center_51 = 2;
-  const unsigned int lfe_51 = 3;
-  const unsigned int rl_51 = 4;
-  const unsigned int rr_51 = 5;
-
-  S16LEPtr src = CreateS16LE(frames * in_ch);
-  S16LEPtr dst = CreateS16LE(frames * out_ch);
-
-  size_t ret = s16_quad_to_51(fl_51, fr_51, rl_51, rr_51, (uint8_t*)src.get(),
-                              frames, (uint8_t*)dst.get());
-  EXPECT_EQ(ret, frames);
-  for (size_t i = 0; i < frames; ++i) {
-    EXPECT_EQ(0, dst[i * 6 + center_51]);
-    EXPECT_EQ(0, dst[i * 6 + lfe_51]);
-    EXPECT_EQ(src[i * 4 + fl_quad], dst[i * 6 + fl_51]);
-    EXPECT_EQ(src[i * 4 + fr_quad], dst[i * 6 + fr_51]);
-    EXPECT_EQ(src[i * 4 + rl_quad], dst[i * 6 + rl_51]);
-    EXPECT_EQ(src[i * 4 + rr_quad], dst[i * 6 + rr_51]);
-  }
-}
-
-// Test Stereo to 5.1 conversion.  S16_LE, LeftRight.
-TEST(FormatConverterOpsTest, StereoTo51S16LELeftRight) {
-  const size_t frames = 4096;
-  const size_t in_ch = 2;
-  const size_t out_ch = 6;
-  const size_t left = 0;
-  const size_t right = 1;
-  const size_t center = -1;
-
-  S16LEPtr src = CreateS16LE(frames * in_ch);
-  S16LEPtr dst = CreateS16LE(frames * out_ch);
-
-  size_t ret = s16_stereo_to_51(left, right, center, (uint8_t*)src.get(),
-                                frames, (uint8_t*)dst.get());
-  EXPECT_EQ(ret, frames);
-
-  for (size_t i = 0; i < frames; ++i) {
-    for (size_t k = 0; k < 6; ++k) {
-      if (k == left)
-        EXPECT_EQ(src[i * 2 + 0], dst[i * 6 + k]);
-      else if (k == right)
-        EXPECT_EQ(src[i * 2 + 1], dst[i * 6 + k]);
-      else
-        EXPECT_EQ(0, dst[i * 6 + k]);
-    }
-  }
-}
-
-// Test Stereo to 5.1 conversion.  S16_LE, Unknown.
-TEST(FormatConverterOpsTest, StereoTo51S16LEUnknown) {
-  const size_t frames = 4096;
-  const size_t in_ch = 2;
-  const size_t out_ch = 6;
-  const size_t left = -1;
-  const size_t right = -1;
-  const size_t center = -1;
-
-  S16LEPtr src = CreateS16LE(frames * in_ch);
-  S16LEPtr dst = CreateS16LE(frames * out_ch);
-
-  size_t ret = s16_stereo_to_51(left, right, center, (uint8_t*)src.get(),
-                                frames, (uint8_t*)dst.get());
-  EXPECT_EQ(ret, frames);
-
-  for (size_t i = 0; i < frames; ++i) {
-    for (size_t k = 0; k < 6; ++k) {
-      if (k == 0 || k == 1)
-        EXPECT_EQ(src[i * 2 + k], dst[i * 6 + k]);
-      else
-        EXPECT_EQ(0, dst[i * 6 + k]);
-    }
-  }
-}
-
-// Test 5.1 to Stereo conversion.  S16_LE.
-TEST(FormatConverterOpsTest, _51ToStereoS16LE) {
-  const size_t frames = 4096;
-  const size_t in_ch = 6;
-  const size_t out_ch = 2;
-  const size_t left = 0;
-  const size_t right = 1;
-  const size_t center = 2;
-
-  S16LEPtr src = CreateS16LE(frames * in_ch);
-  S16LEPtr dst = CreateS16LE(frames * out_ch);
-
-  size_t ret =
-      s16_51_to_stereo((uint8_t*)src.get(), frames, (uint8_t*)dst.get());
-  EXPECT_EQ(ret, frames);
-
-  /* Use the normalized_factor from the left channel = 1 / (|1| + |0.707|)
-   * to prevent mixing overflow.
-   */
-  const float normalized_factor = 0.585;
-
-  for (size_t i = 0; i < frames; ++i) {
-    int16_t half_center = src[i * 6 + center] * 0.707 * normalized_factor;
-    int16_t l = normalized_factor * src[i * 6 + left] + half_center;
-    int16_t r = normalized_factor * src[i * 6 + right] + half_center;
-
-    EXPECT_EQ(l, dst[i * 2 + left]);
-    EXPECT_EQ(r, dst[i * 2 + right]);
-  }
-}
-
-// Test 5.1 to Quad conversion.  S16_LE.
-TEST(FormatConverterOpsTest, _51ToQuadS16LE) {
-  const size_t frames = 4096;
-  const size_t in_ch = 6;
-  const size_t out_ch = 4;
-  const unsigned int fl_quad = 0;
-  const unsigned int fr_quad = 1;
-  const unsigned int rl_quad = 2;
-  const unsigned int rr_quad = 3;
-
-  const unsigned int fl_51 = 0;
-  const unsigned int fr_51 = 1;
-  const unsigned int center_51 = 2;
-  const unsigned int lfe_51 = 3;
-  const unsigned int rl_51 = 4;
-  const unsigned int rr_51 = 5;
-
-  S16LEPtr src = CreateS16LE(frames * in_ch);
-  S16LEPtr dst = CreateS16LE(frames * out_ch);
-
-  size_t ret = s16_51_to_quad((uint8_t*)src.get(), frames, (uint8_t*)dst.get());
-  EXPECT_EQ(ret, frames);
-
-  /* Use normalized_factor from the left channel = 1 / (|1| + |0.707| + |0.5|)
-   * to prevent overflow. */
-  const float normalized_factor = 0.453;
-  for (size_t i = 0; i < frames; ++i) {
-    int16_t half_center = src[i * 6 + center_51] * 0.707 * normalized_factor;
-    int16_t lfe = src[6 * i + lfe_51] * 0.5 * normalized_factor;
-    int16_t fl = normalized_factor * src[6 * i + fl_51] + half_center + lfe;
-    int16_t fr = normalized_factor * src[6 * i + fr_51] + half_center + lfe;
-    int16_t rl = normalized_factor * src[6 * i + rl_51] + lfe;
-    int16_t rr = normalized_factor * src[6 * i + rr_51] + lfe;
-    EXPECT_EQ(fl, dst[4 * i + fl_quad]);
-    EXPECT_EQ(fr, dst[4 * i + fr_quad]);
-    EXPECT_EQ(rl, dst[4 * i + rl_quad]);
-    EXPECT_EQ(rr, dst[4 * i + rr_quad]);
-  }
-}
-
-// Test Stereo to Quad conversion.  S16_LE, Specify.
-TEST(FormatConverterOpsTest, StereoToQuadS16LESpecify) {
-  const size_t frames = 4096;
-  const size_t in_ch = 2;
-  const size_t out_ch = 4;
-  const size_t front_left = 2;
-  const size_t front_right = 3;
-  const size_t rear_left = 0;
-  const size_t rear_right = 1;
-
-  S16LEPtr src = CreateS16LE(frames * in_ch);
-  S16LEPtr dst = CreateS16LE(frames * out_ch);
-
-  size_t ret =
-      s16_stereo_to_quad(front_left, front_right, rear_left, rear_right,
-                         (uint8_t*)src.get(), frames, (uint8_t*)dst.get());
-  EXPECT_EQ(ret, frames);
-
-  for (size_t i = 0; i < frames; ++i) {
-    EXPECT_EQ(src[i * 2 + 0], dst[i * 4 + front_left]);
-    EXPECT_EQ(src[i * 2 + 0], dst[i * 4 + rear_left]);
-    EXPECT_EQ(src[i * 2 + 1], dst[i * 4 + front_right]);
-    EXPECT_EQ(src[i * 2 + 1], dst[i * 4 + rear_right]);
-  }
-}
-
-// Test Stereo to Quad conversion.  S16_LE, Default.
-TEST(FormatConverterOpsTest, StereoToQuadS16LEDefault) {
-  const size_t frames = 4096;
-  const size_t in_ch = 2;
-  const size_t out_ch = 4;
-  const size_t front_left = -1;
-  const size_t front_right = -1;
-  const size_t rear_left = -1;
-  const size_t rear_right = -1;
-
-  S16LEPtr src = CreateS16LE(frames * in_ch);
-  S16LEPtr dst = CreateS16LE(frames * out_ch);
-
-  size_t ret =
-      s16_stereo_to_quad(front_left, front_right, rear_left, rear_right,
-                         (uint8_t*)src.get(), frames, (uint8_t*)dst.get());
-  EXPECT_EQ(ret, frames);
-
-  for (size_t i = 0; i < frames; ++i) {
-    EXPECT_EQ(src[i * 2 + 0], dst[i * 4 + 0]);
-    EXPECT_EQ(src[i * 2 + 0], dst[i * 4 + 2]);
-    EXPECT_EQ(src[i * 2 + 1], dst[i * 4 + 1]);
-    EXPECT_EQ(src[i * 2 + 1], dst[i * 4 + 3]);
-  }
-}
-
-// Test Quad to Stereo conversion.  S16_LE, Specify.
-TEST(FormatConverterOpsTest, QuadToStereoS16LESpecify) {
-  const size_t frames = 4096;
-  const size_t in_ch = 4;
-  const size_t out_ch = 2;
-  const size_t front_left = 2;
-  const size_t front_right = 3;
-  const size_t rear_left = 0;
-  const size_t rear_right = 1;
-
-  S16LEPtr src = CreateS16LE(frames * in_ch);
-  S16LEPtr dst = CreateS16LE(frames * out_ch);
-
-  size_t ret =
-      s16_quad_to_stereo(front_left, front_right, rear_left, rear_right,
-                         (uint8_t*)src.get(), frames, (uint8_t*)dst.get());
-  EXPECT_EQ(ret, frames);
-
-  for (size_t i = 0; i < frames; ++i) {
-    int16_t left =
-        S16AddAndClip(src[i * 4 + front_left], src[i * 4 + rear_left] / 4);
-    int16_t right =
-        S16AddAndClip(src[i * 4 + front_right], src[i * 4 + rear_right] / 4);
-    EXPECT_EQ(left, dst[i * 2 + 0]);
-    EXPECT_EQ(right, dst[i * 2 + 1]);
-  }
-}
-
-// Test Quad to Stereo conversion.  S16_LE, Default.
-TEST(FormatConverterOpsTest, QuadToStereoS16LEDefault) {
-  const size_t frames = 4096;
-  const size_t in_ch = 4;
-  const size_t out_ch = 2;
-  const size_t front_left = -1;
-  const size_t front_right = -1;
-  const size_t rear_left = -1;
-  const size_t rear_right = -1;
-
-  S16LEPtr src = CreateS16LE(frames * in_ch);
-  S16LEPtr dst = CreateS16LE(frames * out_ch);
-
-  size_t ret =
-      s16_quad_to_stereo(front_left, front_right, rear_left, rear_right,
-                         (uint8_t*)src.get(), frames, (uint8_t*)dst.get());
-  EXPECT_EQ(ret, frames);
-
-  for (size_t i = 0; i < frames; ++i) {
-    int16_t left = S16AddAndClip(src[i * 4 + 0], src[i * 4 + 2] / 4);
-    int16_t right = S16AddAndClip(src[i * 4 + 1], src[i * 4 + 3] / 4);
-    EXPECT_EQ(left, dst[i * 2 + 0]);
-    EXPECT_EQ(right, dst[i * 2 + 1]);
-  }
-}
-
-// Test Stereo to 3ch conversion.  S16_LE.
-TEST(FormatConverterOpsTest, StereoTo3chS16LE) {
-  const size_t frames = 4096;
-  const size_t in_ch = 2;
-  const size_t out_ch = 3;
-  struct cras_audio_format fmt = {
-      .format = SND_PCM_FORMAT_S16_LE,
-      .frame_rate = 48000,
-      .num_channels = 3,
-  };
-
-  S16LEPtr src = CreateS16LE(frames * in_ch);
-  S16LEPtr dst = CreateS16LE(frames * out_ch);
-
-  size_t ret = s16_default_all_to_all(&fmt, in_ch, out_ch, (uint8_t*)src.get(),
-                                      frames, (uint8_t*)dst.get());
-  EXPECT_EQ(ret, frames);
-
-  for (size_t i = 0; i < frames; ++i) {
-    int32_t sum = 0;
-    for (size_t k = 0; k < in_ch; ++k)
-      sum += (int32_t)src[i * in_ch + k];
-    src[i * in_ch + 0] = (int16_t)(sum / (int32_t)in_ch);
-  }
-  for (size_t i = 0; i < frames; ++i) {
-    for (size_t k = 0; k < out_ch; ++k)
-      EXPECT_EQ(src[i * in_ch + 0], dst[i * out_ch + k]);
-  }
-}
-
-// Test 6ch to 8ch conversion.  S16_LE.
-TEST(FormatConverterOpsTest, 6chTo8chS16LE) {
-  const size_t frames = 65536;
-  const size_t in_ch = 6;
-  const size_t out_ch = 8;
-  struct cras_audio_format fmt = {
-      .format = SND_PCM_FORMAT_S16_LE,
-      .frame_rate = 48000,
-      .num_channels = 8,
-  };
-
-  S16LEPtr src = CreateS16LE(frames * in_ch);
-  S16LEPtr dst = CreateS16LE(frames * out_ch);
-  for (size_t i = 0; i < frames; ++i) {
-    for (size_t k = 0; k < in_ch; k++) {
-      src[i * in_ch + k] = (k == 0) ? (INT16_MIN + (int16_t)i) : 0;
-    }
-  }
-
-  size_t ret = s16_default_all_to_all(&fmt, in_ch, out_ch, (uint8_t*)src.get(),
-                                      frames, (uint8_t*)dst.get());
-  EXPECT_EQ(ret, frames);
-
-  for (size_t i = 0; i < frames; ++i) {
-    src[i * in_ch + 0] /= (int16_t)in_ch;
-    for (size_t k = 0; k < out_ch; ++k)
-      EXPECT_EQ(src[i * in_ch + 0], dst[i * out_ch + k]);
-  }
-}
-
-// Test Multiply with Coef.  S16_LE.
-TEST(FormatConverterOpsTest, MultiplyWithCoefS16LE) {
-  const size_t buf_size = 4096;
-
-  S16LEPtr buf = CreateS16LE(buf_size);
-  FloatPtr coef = CreateFloat(buf_size);
-
-  int16_t ret = s16_multiply_buf_with_coef(coef.get(), buf.get(), buf_size);
-
-  int32_t exp = 0;
-  for (size_t i = 0; i < buf_size; ++i)
-    exp += coef[i] * buf[i];
-  exp = MIN(MAX(exp, SHRT_MIN), SHRT_MAX);
-
-  EXPECT_EQ((int16_t)exp, ret);
-}
-
-// Test Convert Channels.  S16_LE.
-TEST(FormatConverterOpsTest, ConvertChannelsS16LE) {
-  const size_t frames = 4096;
-  const size_t in_ch = 2;
-  const size_t out_ch = 3;
-
-  S16LEPtr src = CreateS16LE(frames * in_ch);
-  S16LEPtr dst = CreateS16LE(frames * out_ch);
-  FloatPtr ch_conv_mtx = CreateFloat(out_ch * in_ch);
-  std::unique_ptr<float*[]> mtx(new float*[out_ch]);
-  for (size_t i = 0; i < out_ch; ++i)
-    mtx[i] = &ch_conv_mtx[i * in_ch];
-
-  size_t ret =
-      s16_convert_channels(mtx.get(), in_ch, out_ch, (uint8_t*)src.get(),
-                           frames, (uint8_t*)dst.get());
-  EXPECT_EQ(ret, frames);
-
-  for (size_t fr = 0; fr < frames; ++fr) {
-    for (size_t i = 0; i < out_ch; ++i) {
-      int16_t exp = 0;
-      for (size_t k = 0; k < in_ch; ++k)
-        exp += mtx[i][k] * src[fr * in_ch + k];
-      exp = MIN(MAX(exp, SHRT_MIN), SHRT_MAX);
-      EXPECT_EQ(exp, dst[fr * out_ch + i]);
-    }
-  }
-}
-
-// Test Stereo to 20ch conversion.  S16_LE.
-TEST(FormatConverterOpsTest, TwoToTwentyS16LE) {
-  const size_t frames = 4096;
-  const size_t in_ch = 2;
-  const size_t out_ch = 20;
-  struct cras_audio_format fmt = {
-      .format = SND_PCM_FORMAT_S16_LE,
-      .frame_rate = 48000,
-      .num_channels = 20,
-  };
-
-  S16LEPtr src = CreateS16LE(frames * in_ch);
-  S16LEPtr dst = CreateS16LE(frames * out_ch);
-
-  size_t ret = s16_some_to_some(&fmt, in_ch, out_ch, (uint8_t*)src.get(),
-                                frames, (uint8_t*)dst.get());
-  EXPECT_EQ(ret, frames);
-
-  for (size_t i = 0; i < frames; ++i) {
-    size_t k;
-    // Input channles should be directly copied over.
-    for (k = 0; k < in_ch; ++k) {
-        EXPECT_EQ(src[i * in_ch + k], dst[i * out_ch + k]);
-    }
-    // The rest should be zeroed.
-    for (; k < out_ch; ++k) {
-        EXPECT_EQ(0, dst[i * out_ch + k]);
-    }
-
-  }
-}
-
-// Test 20ch to Stereo.  S16_LE.
-TEST(FormatConverterOpsTest, TwentyToTwoS16LE) {
-  const size_t frames = 4096;
-  const size_t in_ch = 20;
-  const size_t out_ch = 2;
-  struct cras_audio_format fmt = {
-      .format = SND_PCM_FORMAT_S16_LE,
-      .frame_rate = 48000,
-      .num_channels = 2,
-  };
-
-  S16LEPtr src = CreateS16LE(frames * in_ch);
-  S16LEPtr dst = CreateS16LE(frames * out_ch);
-
-  size_t ret = s16_some_to_some(&fmt, in_ch, out_ch, (uint8_t*)src.get(),
-                                frames, (uint8_t*)dst.get());
-  EXPECT_EQ(ret, frames);
-
-  for (size_t i = 0; i < frames; ++i) {
-    size_t k;
-    // Input channles should be directly copied over.
-    for (k = 0; k < out_ch; ++k) {
-        EXPECT_EQ(src[i * in_ch + k], dst[i * out_ch + k]);
-    }
-  }
-}
-
-extern "C" {}  // extern "C"
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tests/fmt_conv_unittest.cc b/cras/src/tests/fmt_conv_unittest.cc
deleted file mode 100644
index c66984e..0000000
--- a/cras/src/tests/fmt_conv_unittest.cc
+++ /dev/null
@@ -1,1781 +0,0 @@
-// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <gtest/gtest.h>
-#include <math.h>
-#include <sys/param.h>
-
-extern "C" {
-#include "cras_fmt_conv.h"
-#include "cras_types.h"
-}
-
-static int mono_channel_layout[CRAS_CH_MAX] = {-1, -1, -1, -1, 0, -1,
-                                               -1, -1, -1, -1, -1};
-static int stereo_channel_layout[CRAS_CH_MAX] = {0,  1,  -1, -1, -1, -1,
-                                                 -1, -1, -1, -1, -1};
-static int surround_channel_center_layout[CRAS_CH_MAX] = {0,  1,  2,  3,  4, 5,
-                                                          -1, -1, -1, -1, -1};
-static int surround_channel_left_right_layout[CRAS_CH_MAX] = {
-    0, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
-static int surround_channel_unknown_layout[CRAS_CH_MAX] = {
-    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
-static int quad_channel_layout[CRAS_CH_MAX] = {0,  1,  2,  3,  -1, -1,
-                                               -1, -1, -1, -1, -1};
-static int linear_resampler_needed_val;
-static double linear_resampler_ratio = 1.0;
-static unsigned int linear_resampler_num_channels;
-static unsigned int linear_resampler_format_bytes;
-static int linear_resampler_src_rate;
-static int linear_resampler_dst_rate;
-
-void ResetStub() {
-  linear_resampler_needed_val = 0;
-  linear_resampler_ratio = 1.0;
-}
-
-// Like malloc or calloc, but fill the memory with random bytes.
-static void* ralloc(size_t size) {
-  unsigned char* buf = (unsigned char*)malloc(size);
-  while (size--)
-    buf[size] = rand() & 0xff;
-  return buf;
-}
-
-static void swap_channel_layout(int8_t* layout,
-                                CRAS_CHANNEL a,
-                                CRAS_CHANNEL b) {
-  int8_t tmp = layout[a];
-  layout[a] = layout[b];
-  layout[b] = tmp;
-}
-
-TEST(FormatConverterTest, SmallFramesSRCWithLinearResampler) {
-  struct cras_audio_format in_fmt;
-  struct cras_audio_format out_fmt;
-  struct cras_fmt_conv* c;
-  int16_t* in_buf;
-  int16_t* out_buf;
-  unsigned int in_frames = 1;
-  unsigned int out_frames = 2;
-
-  ResetStub();
-  in_fmt.format = out_fmt.format = SND_PCM_FORMAT_S16_LE;
-  in_fmt.num_channels = out_fmt.num_channels = 1;
-  in_fmt.frame_rate = 16000;
-  out_fmt.frame_rate = 48000;
-  linear_resampler_needed_val = 1;
-
-  in_buf = (int16_t*)malloc(10 * 2 * 2);
-  out_buf = (int16_t*)malloc(10 * 2 * 2);
-
-  c = cras_fmt_conv_create(&in_fmt, &out_fmt, 10, 1);
-  EXPECT_NE((void*)NULL, c);
-  EXPECT_EQ(out_fmt.frame_rate, linear_resampler_src_rate);
-  EXPECT_EQ(out_fmt.frame_rate, linear_resampler_dst_rate);
-
-  /* When process on small buffers doing SRC 16KHz -> 48KHz,
-   * speex does the work in two steps:
-   *
-   * (1) 0 -> 2 frames in output
-   * (2) 1 -> 1 frame in output
-   *
-   * Total result is 1 frame consumed in input and generated
-   * 3 frames in output.
-   */
-  out_frames = cras_fmt_conv_convert_frames(
-      c, (uint8_t*)in_buf, (uint8_t*)out_buf, &in_frames, out_frames);
-  EXPECT_EQ(2, out_frames);
-  EXPECT_EQ(0, in_frames);
-
-  in_frames = 1;
-  out_frames = 2;
-  out_frames = cras_fmt_conv_convert_frames(
-      c, (uint8_t*)in_buf, (uint8_t*)out_buf, &in_frames, out_frames);
-  EXPECT_EQ(1, out_frames);
-  EXPECT_EQ(1, in_frames);
-
-  cras_fmt_conv_destroy(&c);
-  free(in_buf);
-  free(out_buf);
-}
-
-// Only support LE, BE should fail.
-TEST(FormatConverterTest, InvalidParamsOnlyLE) {
-  struct cras_audio_format in_fmt;
-  struct cras_audio_format out_fmt;
-  struct cras_fmt_conv* c;
-
-  ResetStub();
-  in_fmt.format = out_fmt.format = SND_PCM_FORMAT_S32_BE;
-  in_fmt.num_channels = out_fmt.num_channels = 2;
-  c = cras_fmt_conv_create(&in_fmt, &out_fmt, 4096, 0);
-  EXPECT_EQ(NULL, c);
-}
-
-// Test Mono to Stereo mix.
-TEST(FormatConverterTest, MonoToStereo) {
-  struct cras_fmt_conv* c;
-  struct cras_audio_format in_fmt;
-  struct cras_audio_format out_fmt;
-
-  size_t out_frames;
-  int16_t* in_buff;
-  int16_t* out_buff;
-  const size_t buf_size = 4096;
-  unsigned int in_buf_size = 4096;
-
-  ResetStub();
-  in_fmt.format = SND_PCM_FORMAT_S16_LE;
-  out_fmt.format = SND_PCM_FORMAT_S16_LE;
-  in_fmt.num_channels = 1;
-  out_fmt.num_channels = 2;
-  in_fmt.frame_rate = 48000;
-  out_fmt.frame_rate = 48000;
-
-  c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0);
-  ASSERT_NE(c, (void*)NULL);
-
-  out_frames = cras_fmt_conv_out_frames_to_in(c, buf_size);
-  EXPECT_EQ(buf_size, out_frames);
-
-  out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size);
-  EXPECT_EQ(buf_size, out_frames);
-
-  in_buff = (int16_t*)ralloc(buf_size * 2 * cras_get_format_bytes(&in_fmt));
-  out_buff = (int16_t*)ralloc(buf_size * 2 * cras_get_format_bytes(&out_fmt));
-  out_frames = cras_fmt_conv_convert_frames(
-      c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size);
-  EXPECT_EQ(buf_size, out_frames);
-  for (size_t i = 0; i < buf_size; i++) {
-    if (in_buff[i] != out_buff[i * 2] || in_buff[i] != out_buff[i * 2 + 1]) {
-      EXPECT_TRUE(false);
-      break;
-    }
-  }
-
-  cras_fmt_conv_destroy(&c);
-  free(in_buff);
-  free(out_buff);
-}
-
-// Test Stereo to Mono mix.
-TEST(FormatConverterTest, StereoToMono) {
-  struct cras_fmt_conv* c;
-  struct cras_audio_format in_fmt;
-  struct cras_audio_format out_fmt;
-
-  size_t out_frames;
-  int16_t* in_buff;
-  int16_t* out_buff;
-  unsigned int i;
-  const size_t buf_size = 4096;
-  unsigned int in_buf_size = 4096;
-
-  ResetStub();
-  in_fmt.format = SND_PCM_FORMAT_S16_LE;
-  out_fmt.format = SND_PCM_FORMAT_S16_LE;
-  in_fmt.num_channels = 2;
-  out_fmt.num_channels = 1;
-  in_fmt.frame_rate = 48000;
-  out_fmt.frame_rate = 48000;
-
-  c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0);
-  ASSERT_NE(c, (void*)NULL);
-
-  out_frames = cras_fmt_conv_out_frames_to_in(c, buf_size);
-  EXPECT_EQ(buf_size, out_frames);
-
-  out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size);
-  EXPECT_EQ(buf_size, out_frames);
-
-  in_buff = (int16_t*)malloc(buf_size * 2 * cras_get_format_bytes(&in_fmt));
-  out_buff = (int16_t*)malloc(buf_size * cras_get_format_bytes(&out_fmt));
-  for (i = 0; i < buf_size; i++) {
-    in_buff[i * 2] = 13450;
-    in_buff[i * 2 + 1] = -13449;
-  }
-  out_frames = cras_fmt_conv_convert_frames(
-      c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size);
-  EXPECT_EQ(buf_size, out_frames);
-  for (i = 0; i < buf_size; i++) {
-    EXPECT_EQ(1, out_buff[i]);
-  }
-
-  cras_fmt_conv_destroy(&c);
-  free(in_buff);
-  free(out_buff);
-}
-
-// Test Stereo to Mono mix.  Overflow.
-TEST(FormatConverterTest, StereoToMonoOverflow) {
-  struct cras_fmt_conv* c;
-  struct cras_audio_format in_fmt;
-  struct cras_audio_format out_fmt;
-
-  size_t out_frames;
-  int16_t* in_buff;
-  int16_t* out_buff;
-  unsigned int i;
-  const size_t buf_size = 4096;
-  unsigned int in_buf_size = 4096;
-
-  ResetStub();
-  in_fmt.format = SND_PCM_FORMAT_S16_LE;
-  out_fmt.format = SND_PCM_FORMAT_S16_LE;
-  in_fmt.num_channels = 2;
-  out_fmt.num_channels = 1;
-  in_fmt.frame_rate = 48000;
-  out_fmt.frame_rate = 48000;
-
-  c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0);
-  ASSERT_NE(c, (void*)NULL);
-
-  out_frames = cras_fmt_conv_out_frames_to_in(c, buf_size);
-  EXPECT_EQ(buf_size, out_frames);
-
-  out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size);
-  EXPECT_EQ(buf_size, out_frames);
-
-  in_buff = (int16_t*)malloc(buf_size * 2 * cras_get_format_bytes(&in_fmt));
-  out_buff = (int16_t*)malloc(buf_size * cras_get_format_bytes(&out_fmt));
-  for (i = 0; i < buf_size; i++) {
-    in_buff[i * 2] = 0x7fff;
-    in_buff[i * 2 + 1] = 1;
-  }
-  out_frames = cras_fmt_conv_convert_frames(
-      c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size);
-  EXPECT_EQ(buf_size, out_frames);
-  for (i = 0; i < buf_size; i++) {
-    EXPECT_EQ(0x7fff, out_buff[i]);
-  }
-
-  cras_fmt_conv_destroy(&c);
-  free(in_buff);
-  free(out_buff);
-}
-
-// Test Stereo to Mono mix.  Underflow.
-TEST(FormatConverterTest, StereoToMonoUnderflow) {
-  struct cras_fmt_conv* c;
-  struct cras_audio_format in_fmt;
-  struct cras_audio_format out_fmt;
-
-  size_t out_frames;
-  int16_t* in_buff;
-  int16_t* out_buff;
-  unsigned int i;
-  const size_t buf_size = 4096;
-  unsigned int in_buf_size = 4096;
-
-  ResetStub();
-  in_fmt.format = SND_PCM_FORMAT_S16_LE;
-  out_fmt.format = SND_PCM_FORMAT_S16_LE;
-  in_fmt.num_channels = 2;
-  out_fmt.num_channels = 1;
-  in_fmt.frame_rate = 48000;
-  out_fmt.frame_rate = 48000;
-
-  c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0);
-  ASSERT_NE(c, (void*)NULL);
-
-  out_frames = cras_fmt_conv_out_frames_to_in(c, buf_size);
-  EXPECT_EQ(buf_size, out_frames);
-
-  out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size);
-  EXPECT_EQ(buf_size, out_frames);
-
-  in_buff = (int16_t*)malloc(buf_size * 2 * cras_get_format_bytes(&in_fmt));
-  out_buff = (int16_t*)malloc(buf_size * cras_get_format_bytes(&out_fmt));
-  for (i = 0; i < buf_size; i++) {
-    in_buff[i * 2] = -0x8000;
-    in_buff[i * 2 + 1] = -1;
-  }
-  out_frames = cras_fmt_conv_convert_frames(
-      c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size);
-  EXPECT_EQ(buf_size, out_frames);
-  for (i = 0; i < buf_size; i++) {
-    EXPECT_EQ(-0x8000, out_buff[i]);
-  }
-
-  cras_fmt_conv_destroy(&c);
-  free(in_buff);
-  free(out_buff);
-}
-
-// Test Stereo to Mono mix 24 and 32 bit.
-TEST(FormatConverterTest, StereoToMono24bit) {
-  struct cras_fmt_conv* c;
-  struct cras_audio_format in_fmt;
-  struct cras_audio_format out_fmt;
-
-  size_t out_frames;
-  int32_t* in_buff;
-  int32_t* out_buff;
-  unsigned int i;
-  const size_t buf_size = 100;
-  unsigned int in_buf_size = 100;
-  unsigned int test;
-
-  for (test = 0; test < 2; test++) {
-    ResetStub();
-    if (test == 0) {
-      in_fmt.format = SND_PCM_FORMAT_S24_LE;
-      out_fmt.format = SND_PCM_FORMAT_S24_LE;
-    } else {
-      in_fmt.format = SND_PCM_FORMAT_S32_LE;
-      out_fmt.format = SND_PCM_FORMAT_S32_LE;
-    }
-    in_fmt.num_channels = 2;
-    out_fmt.num_channels = 1;
-    in_fmt.frame_rate = 48000;
-    out_fmt.frame_rate = 48000;
-
-    c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0);
-    ASSERT_NE(c, (void*)NULL);
-
-    out_frames = cras_fmt_conv_out_frames_to_in(c, buf_size);
-    EXPECT_EQ(buf_size, out_frames);
-
-    out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size);
-    EXPECT_EQ(buf_size, out_frames);
-
-    in_buff = (int32_t*)malloc(buf_size * cras_get_format_bytes(&in_fmt));
-    out_buff = (int32_t*)malloc(buf_size * cras_get_format_bytes(&out_fmt));
-    // TODO(dgreid) - s/0x10000/1/ once it stays full bits the whole way.
-    for (i = 0; i < buf_size; i++) {
-      in_buff[i * 2] = 13450 << 16;
-      in_buff[i * 2 + 1] = -in_buff[i * 2] + 0x10000;
-    }
-    out_frames = cras_fmt_conv_convert_frames(
-        c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size);
-    EXPECT_EQ(buf_size, out_frames);
-    for (i = 0; i < buf_size; i++) {
-      EXPECT_EQ(0x10000, out_buff[i]);
-    }
-
-    cras_fmt_conv_destroy(&c);
-    free(in_buff);
-    free(out_buff);
-  }
-}
-
-// Test 5.1 to Stereo mix.
-TEST(FormatConverterTest, SurroundToStereo) {
-  struct cras_fmt_conv* c;
-  struct cras_audio_format in_fmt;
-  struct cras_audio_format out_fmt;
-
-  size_t out_frames;
-  int16_t* in_buff;
-  int16_t* out_buff;
-  unsigned int i;
-  const size_t buf_size = 4096;
-  unsigned int in_buf_size = 4096;
-
-  ResetStub();
-  in_fmt.format = SND_PCM_FORMAT_S16_LE;
-  out_fmt.format = SND_PCM_FORMAT_S16_LE;
-  in_fmt.num_channels = 6;
-  out_fmt.num_channels = 2;
-  in_fmt.frame_rate = 48000;
-  out_fmt.frame_rate = 48000;
-  for (i = 0; i < CRAS_CH_MAX; i++)
-    in_fmt.channel_layout[i] = surround_channel_center_layout[i];
-
-  c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0);
-  ASSERT_NE(c, (void*)NULL);
-
-  out_frames = cras_fmt_conv_out_frames_to_in(c, buf_size);
-  EXPECT_EQ(buf_size, out_frames);
-
-  out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size);
-  EXPECT_EQ(buf_size, out_frames);
-
-  in_buff = (int16_t*)malloc(buf_size * 2 * cras_get_format_bytes(&in_fmt));
-
-  /* Swap channel to FL = 13450, RL = -100.
-   * Assert right channel is silent.
-   */
-  for (i = 0; i < buf_size; i++) {
-    in_buff[i * 6] = 13450;
-    in_buff[i * 6 + 1] = 0;
-    in_buff[i * 6 + 2] = -100;
-    in_buff[i * 6 + 3] = 0;
-    in_buff[i * 6 + 4] = 0;
-    in_buff[i * 6 + 5] = 0;
-  }
-  out_buff = (int16_t*)malloc(buf_size * 2 * cras_get_format_bytes(&out_fmt));
-  out_frames = cras_fmt_conv_convert_frames(
-      c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size);
-  EXPECT_EQ(buf_size, out_frames);
-  for (i = 0; i < buf_size; i++)
-    EXPECT_LT(0, out_buff[i * 2]);
-  cras_fmt_conv_destroy(&c);
-
-  /* Swap channel to FR = 13450, RR = -100.
-   * Assert left channel is silent.
-   */
-  swap_channel_layout(in_fmt.channel_layout, CRAS_CH_FL, CRAS_CH_FR);
-  swap_channel_layout(in_fmt.channel_layout, CRAS_CH_RL, CRAS_CH_RR);
-  c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0);
-  out_frames = cras_fmt_conv_convert_frames(
-      c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size);
-  EXPECT_EQ(buf_size, out_frames);
-  for (i = 0; i < buf_size; i++)
-    EXPECT_LT(0, out_buff[i * 2 + 1]);
-  cras_fmt_conv_destroy(&c);
-
-  /* Swap channel to FC = 13450, LFE = -100.
-   * Assert output left and right has equal magnitude.
-   */
-  swap_channel_layout(in_fmt.channel_layout, CRAS_CH_FR, CRAS_CH_FC);
-  swap_channel_layout(in_fmt.channel_layout, CRAS_CH_RR, CRAS_CH_LFE);
-  c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0);
-  out_frames = cras_fmt_conv_convert_frames(
-      c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size);
-  EXPECT_EQ(buf_size, out_frames);
-  for (i = 0; i < buf_size; i++) {
-    EXPECT_NE(0, out_buff[i * 2]);
-    EXPECT_EQ(out_buff[i * 2], out_buff[i * 2 + 1]);
-  }
-  cras_fmt_conv_destroy(&c);
-
-  /* Swap channel to FR = 13450, FL = -100.
-   * Assert output left is positive and right is negative. */
-  swap_channel_layout(in_fmt.channel_layout, CRAS_CH_LFE, CRAS_CH_FR);
-  swap_channel_layout(in_fmt.channel_layout, CRAS_CH_FC, CRAS_CH_FL);
-  c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0);
-  out_frames = cras_fmt_conv_convert_frames(
-      c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size);
-  EXPECT_EQ(buf_size, out_frames);
-  for (i = 0; i < buf_size; i++) {
-    EXPECT_LT(0, out_buff[i * 2]);
-    EXPECT_GT(0, out_buff[i * 2 + 1]);
-  }
-
-  cras_fmt_conv_destroy(&c);
-  free(in_buff);
-  free(out_buff);
-}
-
-// Test 5.1 to Quad mix.
-TEST(FormatConverterTest, SurroundToQuad) {
-  struct cras_fmt_conv* c;
-  struct cras_audio_format in_fmt;
-  struct cras_audio_format out_fmt;
-
-  size_t out_frames;
-  int16_t* in_buff;
-  int16_t* out_buff;
-  unsigned int i;
-  const size_t buf_size = 4096;
-  unsigned int in_buf_size = 4096;
-
-  ResetStub();
-  in_fmt.format = SND_PCM_FORMAT_S16_LE;
-  out_fmt.format = SND_PCM_FORMAT_S16_LE;
-  in_fmt.num_channels = 6;
-  out_fmt.num_channels = 4;
-  in_fmt.frame_rate = 48000;
-  out_fmt.frame_rate = 48000;
-  for (i = 0; i < CRAS_CH_MAX; i++)
-    in_fmt.channel_layout[i] = surround_channel_center_layout[i];
-
-  c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0);
-  ASSERT_NE(c, (void*)NULL);
-
-  out_frames = cras_fmt_conv_out_frames_to_in(c, buf_size);
-  EXPECT_EQ(buf_size, out_frames);
-
-  out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size);
-  EXPECT_EQ(buf_size, out_frames);
-
-  in_buff = (int16_t*)malloc(buf_size * 2 * cras_get_format_bytes(&in_fmt));
-
-  const int16_t in_fl = 100;
-  const int16_t in_fr = 200;
-  const int16_t in_rl = 200;
-  const int16_t in_rr = 300;
-  const int16_t in_fc = 60;
-  const int16_t in_lfe = 90;
-
-  for (i = 0; i < buf_size; i++) {
-    in_buff[i * 6 + CRAS_CH_FL] = in_fl;
-    in_buff[i * 6 + CRAS_CH_FR] = in_fr;
-    in_buff[i * 6 + CRAS_CH_RL] = in_rl;
-    in_buff[i * 6 + CRAS_CH_RR] = in_rr;
-    in_buff[i * 6 + CRAS_CH_FC] = in_fc;
-    in_buff[i * 6 + CRAS_CH_LFE] = in_lfe;
-  }
-  out_buff = (int16_t*)malloc(buf_size * 2 * cras_get_format_bytes(&out_fmt));
-  out_frames = cras_fmt_conv_convert_frames(
-      c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size);
-  EXPECT_EQ(buf_size, out_frames);
-
-  // This is the sum of mtx[CRAS_CH_FL] coefficients.
-  const float normalize_factor = 1.0 / (1 + 0.707 + 0.5);
-
-  for (i = 0; i < buf_size; i++) {
-    int16_t lfe = 0.5 * normalize_factor * in_lfe;
-    int16_t center = 0.707 * normalize_factor * in_fc;
-    int16_t fl = normalize_factor * in_fl + center + lfe;
-    int16_t fr = normalize_factor * in_fr + center + lfe;
-    int16_t rl = normalize_factor * in_rl + lfe;
-    int16_t rr = normalize_factor * in_rr + lfe;
-
-    EXPECT_EQ(fl, out_buff[i * 4 + CRAS_CH_FL]);
-    EXPECT_EQ(fr, out_buff[i * 4 + CRAS_CH_FR]);
-    EXPECT_EQ(rl, out_buff[i * 4 + CRAS_CH_RL]);
-    EXPECT_EQ(rr, out_buff[i * 4 + CRAS_CH_RR]);
-  }
-  cras_fmt_conv_destroy(&c);
-  free(in_buff);
-  free(out_buff);
-}
-
-// Test Quad to Stereo mix.
-TEST(FormatConverterTest, QuadToStereo) {
-  struct cras_fmt_conv* c;
-  struct cras_audio_format in_fmt;
-  struct cras_audio_format out_fmt;
-
-  size_t out_frames;
-  int16_t* in_buff;
-  int16_t* out_buff;
-  unsigned int i;
-  const size_t buf_size = 4096;
-  unsigned int in_buf_size = 4096;
-
-  ResetStub();
-  in_fmt.format = SND_PCM_FORMAT_S16_LE;
-  out_fmt.format = SND_PCM_FORMAT_S16_LE;
-  in_fmt.num_channels = 4;
-  out_fmt.num_channels = 2;
-  in_fmt.frame_rate = 48000;
-  out_fmt.frame_rate = 48000;
-  for (i = 0; i < CRAS_CH_MAX; i++)
-    in_fmt.channel_layout[i] = quad_channel_layout[i];
-
-  c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0);
-  ASSERT_NE(c, (void*)NULL);
-
-  out_frames = cras_fmt_conv_out_frames_to_in(c, buf_size);
-  EXPECT_EQ(buf_size, out_frames);
-
-  out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size);
-  EXPECT_EQ(buf_size, out_frames);
-
-  in_buff = (int16_t*)malloc(buf_size * 2 * cras_get_format_bytes(&in_fmt));
-
-  /*
-   * Set left channel positive, right channel negative, assert values are
-   * copied and scaled as expected.
-   */
-  for (i = 0; i < buf_size; i++) {
-    in_buff[i * 4] = 800;
-    in_buff[i * 4 + 1] = -800;
-    in_buff[i * 4 + 2] = 80;
-    in_buff[i * 4 + 3] = -80;
-  }
-  out_buff = (int16_t*)malloc(buf_size * 2 * cras_get_format_bytes(&out_fmt));
-
-  out_frames = cras_fmt_conv_convert_frames(
-      c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size);
-  EXPECT_EQ(buf_size, out_frames);
-  for (i = 0; i < buf_size; i++) {
-    EXPECT_EQ(820, out_buff[i * 2]);
-    EXPECT_EQ(-820, out_buff[i * 2 + 1]);
-  }
-  cras_fmt_conv_destroy(&c);
-
-  /*
-   * Swap left and right channels, check channel map is respected.
-   */
-  swap_channel_layout(in_fmt.channel_layout, CRAS_CH_FL, CRAS_CH_FR);
-  swap_channel_layout(in_fmt.channel_layout, CRAS_CH_RL, CRAS_CH_RR);
-  c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0);
-  out_frames = cras_fmt_conv_convert_frames(
-      c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size);
-  EXPECT_EQ(buf_size, out_frames);
-  for (i = 0; i < buf_size; i++) {
-    EXPECT_EQ(-820, out_buff[i * 2]);
-    EXPECT_EQ(820, out_buff[i * 2 + 1]);
-  }
-  cras_fmt_conv_destroy(&c);
-
-  /*
-   * Swap front and rear, check channel map is respected.
-   */
-  swap_channel_layout(in_fmt.channel_layout, CRAS_CH_FR, CRAS_CH_RR);
-  swap_channel_layout(in_fmt.channel_layout, CRAS_CH_FL, CRAS_CH_RL);
-  c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0);
-  out_frames = cras_fmt_conv_convert_frames(
-      c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size);
-  EXPECT_EQ(buf_size, out_frames);
-  for (i = 0; i < buf_size; i++) {
-    EXPECT_EQ(-280, out_buff[i * 2]);
-    EXPECT_EQ(280, out_buff[i * 2 + 1]);
-  }
-  cras_fmt_conv_destroy(&c);
-
-  /*
-   * Empty channel map, check default behavior is applied.
-   */
-  for (i = 0; i < CRAS_CH_MAX; i++)
-    in_fmt.channel_layout[i] = -1;
-  c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0);
-  out_frames = cras_fmt_conv_convert_frames(
-      c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size);
-  EXPECT_EQ(buf_size, out_frames);
-  for (i = 0; i < buf_size; i++) {
-    EXPECT_EQ(820, out_buff[i * 2]);
-    EXPECT_EQ(-820, out_buff[i * 2 + 1]);
-  }
-  cras_fmt_conv_destroy(&c);
-
-  free(in_buff);
-  free(out_buff);
-}
-
-// Test 2 to 1 SRC.
-TEST(FormatConverterTest, Convert2To1) {
-  struct cras_fmt_conv* c;
-  struct cras_audio_format in_fmt;
-  struct cras_audio_format out_fmt;
-
-  size_t out_frames;
-  int16_t* in_buff;
-  int16_t* out_buff;
-  const size_t buf_size = 4096;
-  unsigned int in_buf_size = 4096;
-
-  ResetStub();
-  in_fmt.format = out_fmt.format = SND_PCM_FORMAT_S16_LE;
-  in_fmt.num_channels = out_fmt.num_channels = 2;
-  in_fmt.frame_rate = 96000;
-  out_fmt.frame_rate = 48000;
-
-  c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0);
-  ASSERT_NE(c, (void*)NULL);
-
-  out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size);
-  EXPECT_EQ(buf_size / 2, out_frames);
-
-  in_buff = (int16_t*)ralloc(buf_size * 2 * cras_get_format_bytes(&in_fmt));
-  out_buff = (int16_t*)ralloc(buf_size / 2 * cras_get_format_bytes(&out_fmt));
-  out_frames = cras_fmt_conv_convert_frames(
-      c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size / 2);
-  cras_fmt_conv_destroy(&c);
-  free(in_buff);
-  free(out_buff);
-}
-
-// Test 1 to 2 SRC.
-TEST(FormatConverterTest, Convert1To2) {
-  struct cras_fmt_conv* c;
-  struct cras_audio_format in_fmt;
-  struct cras_audio_format out_fmt;
-  size_t out_frames;
-  int16_t* in_buff;
-  int16_t* out_buff;
-  const size_t buf_size = 4096;
-  unsigned int in_buf_size = 4096;
-
-  ResetStub();
-  in_fmt.format = out_fmt.format = SND_PCM_FORMAT_S16_LE;
-  in_fmt.num_channels = out_fmt.num_channels = 2;
-  in_fmt.frame_rate = 22050;
-  out_fmt.frame_rate = 44100;
-
-  c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0);
-  ASSERT_NE(c, (void*)NULL);
-
-  out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size);
-  EXPECT_EQ(buf_size * 2, out_frames);
-
-  in_buff = (int16_t*)ralloc(buf_size * 2 * cras_get_format_bytes(&in_fmt));
-  out_buff = (int16_t*)ralloc(buf_size * 2 * cras_get_format_bytes(&out_fmt));
-  out_frames = cras_fmt_conv_convert_frames(
-      c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size * 2);
-  cras_fmt_conv_destroy(&c);
-  free(in_buff);
-  free(out_buff);
-}
-
-// Test 1 to 2 SRC with mono to stereo conversion.
-TEST(FormatConverterTest, Convert1To2MonoToStereo) {
-  struct cras_fmt_conv* c;
-  struct cras_audio_format in_fmt;
-  struct cras_audio_format out_fmt;
-  size_t out_frames;
-  int16_t* in_buff;
-  int16_t* out_buff;
-  const size_t buf_size = 4096;
-  unsigned int in_buf_size = 4096;
-
-  ResetStub();
-  in_fmt.format = out_fmt.format = SND_PCM_FORMAT_S16_LE;
-  in_fmt.num_channels = 1;
-  out_fmt.num_channels = 2;
-  in_fmt.frame_rate = 22050;
-  out_fmt.frame_rate = 44100;
-
-  c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0);
-  ASSERT_NE(c, (void*)NULL);
-
-  out_frames = cras_fmt_conv_out_frames_to_in(c, buf_size);
-  EXPECT_EQ(buf_size / 2, out_frames);
-
-  out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size);
-  EXPECT_EQ(buf_size * 2, out_frames);
-
-  in_buff = (int16_t*)ralloc(buf_size * 2 * cras_get_format_bytes(&in_fmt));
-  out_buff = (int16_t*)ralloc(buf_size * 2 * cras_get_format_bytes(&out_fmt));
-  out_frames = cras_fmt_conv_convert_frames(
-      c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size * 2);
-  cras_fmt_conv_destroy(&c);
-  free(in_buff);
-  free(out_buff);
-}
-
-// Test 32 to 16 bit conversion.
-TEST(FormatConverterTest, ConvertS32LEToS16LE) {
-  struct cras_fmt_conv* c;
-  struct cras_audio_format in_fmt;
-  struct cras_audio_format out_fmt;
-
-  size_t out_frames;
-  int32_t* in_buff;
-  int16_t* out_buff;
-  const size_t buf_size = 4096;
-  unsigned int in_buf_size = 4096;
-
-  ResetStub();
-  in_fmt.format = SND_PCM_FORMAT_S32_LE;
-  out_fmt.format = SND_PCM_FORMAT_S16_LE;
-  in_fmt.num_channels = out_fmt.num_channels = 2;
-  in_fmt.frame_rate = 48000;
-  out_fmt.frame_rate = 48000;
-
-  c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0);
-  ASSERT_NE(c, (void*)NULL);
-
-  out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size);
-  EXPECT_EQ(buf_size, out_frames);
-
-  in_buff = (int32_t*)ralloc(buf_size * 2 * cras_get_format_bytes(&in_fmt));
-  out_buff = (int16_t*)ralloc(buf_size * cras_get_format_bytes(&out_fmt));
-  out_frames = cras_fmt_conv_convert_frames(
-      c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size);
-  EXPECT_EQ(buf_size, out_frames);
-  for (unsigned int i = 0; i < buf_size; i++)
-    EXPECT_EQ((int16_t)(in_buff[i] >> 16), out_buff[i]);
-
-  cras_fmt_conv_destroy(&c);
-  free(in_buff);
-  free(out_buff);
-}
-
-// Test 24 to 16 bit conversion.
-TEST(FormatConverterTest, ConvertS24LEToS16LE) {
-  struct cras_fmt_conv* c;
-  struct cras_audio_format in_fmt;
-  struct cras_audio_format out_fmt;
-
-  size_t out_frames;
-  int32_t* in_buff;
-  int16_t* out_buff;
-  const size_t buf_size = 4096;
-  unsigned int in_buf_size = 4096;
-
-  ResetStub();
-  in_fmt.format = SND_PCM_FORMAT_S24_LE;
-  out_fmt.format = SND_PCM_FORMAT_S16_LE;
-  in_fmt.num_channels = out_fmt.num_channels = 2;
-  in_fmt.frame_rate = 48000;
-  out_fmt.frame_rate = 48000;
-
-  c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0);
-  ASSERT_NE(c, (void*)NULL);
-
-  out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size);
-  EXPECT_EQ(buf_size, out_frames);
-
-  in_buff = (int32_t*)ralloc(buf_size * 2 * cras_get_format_bytes(&in_fmt));
-  out_buff = (int16_t*)ralloc(buf_size * cras_get_format_bytes(&out_fmt));
-  out_frames = cras_fmt_conv_convert_frames(
-      c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size);
-  EXPECT_EQ(buf_size, out_frames);
-  for (unsigned int i = 0; i < buf_size; i++)
-    EXPECT_EQ((int16_t)(in_buff[i] >> 8), out_buff[i]);
-
-  cras_fmt_conv_destroy(&c);
-  free(in_buff);
-  free(out_buff);
-}
-
-// Test 8 to 16 bit conversion.
-TEST(FormatConverterTest, ConvertU8LEToS16LE) {
-  struct cras_fmt_conv* c;
-  struct cras_audio_format in_fmt;
-  struct cras_audio_format out_fmt;
-
-  size_t out_frames;
-  uint8_t* in_buff;
-  int16_t* out_buff;
-  const size_t buf_size = 4096;
-  unsigned int in_buf_size = 4096;
-
-  ResetStub();
-  in_fmt.format = SND_PCM_FORMAT_U8;
-  out_fmt.format = SND_PCM_FORMAT_S16_LE;
-  in_fmt.num_channels = 2;
-  out_fmt.num_channels = 2;
-  in_fmt.frame_rate = 48000;
-  out_fmt.frame_rate = 48000;
-
-  c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0);
-  ASSERT_NE(c, (void*)NULL);
-
-  out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size);
-  EXPECT_EQ(buf_size, out_frames);
-
-  in_buff = (uint8_t*)ralloc(buf_size * 2 * cras_get_format_bytes(&in_fmt));
-  out_buff = (int16_t*)ralloc(buf_size * cras_get_format_bytes(&out_fmt));
-  out_frames = cras_fmt_conv_convert_frames(
-      c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size);
-  EXPECT_EQ(buf_size, out_frames);
-  for (unsigned int i = 0; i < buf_size; i++)
-    EXPECT_EQ((int16_t)((uint16_t)((int16_t)(in_buff[i]) - 128) << 8),
-              out_buff[i]);
-
-  cras_fmt_conv_destroy(&c);
-  free(in_buff);
-  free(out_buff);
-}
-
-// Test 16 to 32 bit conversion.
-TEST(FormatConverterTest, ConvertS16LEToS32LE) {
-  struct cras_fmt_conv* c;
-  struct cras_audio_format in_fmt;
-  struct cras_audio_format out_fmt;
-
-  size_t out_frames;
-  int16_t* in_buff;
-  int32_t* out_buff;
-  const size_t buf_size = 4096;
-  unsigned int in_buf_size = 4096;
-
-  ResetStub();
-  in_fmt.format = SND_PCM_FORMAT_S16_LE;
-  out_fmt.format = SND_PCM_FORMAT_S32_LE;
-  in_fmt.num_channels = out_fmt.num_channels = 2;
-  in_fmt.frame_rate = 48000;
-  out_fmt.frame_rate = 48000;
-
-  c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0);
-  ASSERT_NE(c, (void*)NULL);
-
-  out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size);
-  EXPECT_EQ(buf_size, out_frames);
-
-  in_buff = (int16_t*)ralloc(buf_size * cras_get_format_bytes(&in_fmt));
-  out_buff = (int32_t*)ralloc(buf_size * cras_get_format_bytes(&out_fmt));
-  out_frames = cras_fmt_conv_convert_frames(
-      c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size);
-  EXPECT_EQ(buf_size, out_frames);
-  for (unsigned int i = 0; i < buf_size; i++)
-    EXPECT_EQ((int32_t)((uint32_t)(int32_t)in_buff[i] << 16), out_buff[i]);
-
-  cras_fmt_conv_destroy(&c);
-  free(in_buff);
-  free(out_buff);
-}
-
-// Test 16 to 24 bit conversion.
-TEST(FormatConverterTest, ConvertS16LEToS24LE) {
-  struct cras_fmt_conv* c;
-  struct cras_audio_format in_fmt;
-  struct cras_audio_format out_fmt;
-
-  size_t out_frames;
-  int16_t* in_buff;
-  int32_t* out_buff;
-  const size_t buf_size = 4096;
-  unsigned int in_buf_size = 4096;
-
-  ResetStub();
-  in_fmt.format = SND_PCM_FORMAT_S16_LE;
-  out_fmt.format = SND_PCM_FORMAT_S24_LE;
-  in_fmt.num_channels = out_fmt.num_channels = 2;
-  in_fmt.frame_rate = 48000;
-  out_fmt.frame_rate = 48000;
-
-  c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0);
-  ASSERT_NE(c, (void*)NULL);
-
-  out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size);
-  EXPECT_EQ(buf_size, out_frames);
-
-  in_buff = (int16_t*)ralloc(buf_size * cras_get_format_bytes(&in_fmt));
-  out_buff = (int32_t*)ralloc(buf_size * 2 * cras_get_format_bytes(&out_fmt));
-  out_frames = cras_fmt_conv_convert_frames(
-      c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size);
-  EXPECT_EQ(buf_size, out_frames);
-  for (unsigned int i = 0; i < buf_size; i++)
-    EXPECT_EQ((int32_t)((uint32_t)(int32_t)in_buff[i] << 8), out_buff[i]);
-
-  cras_fmt_conv_destroy(&c);
-  free(in_buff);
-  free(out_buff);
-}
-
-// Test 16 to 8 bit conversion.
-TEST(FormatConverterTest, ConvertS16LEToU8) {
-  struct cras_fmt_conv* c;
-  struct cras_audio_format in_fmt;
-  struct cras_audio_format out_fmt;
-
-  size_t out_frames;
-  int16_t* in_buff;
-  uint8_t* out_buff;
-  const size_t buf_size = 4096;
-  unsigned int in_buf_size = 4096;
-
-  ResetStub();
-  in_fmt.format = SND_PCM_FORMAT_S16_LE;
-  out_fmt.format = SND_PCM_FORMAT_U8;
-  in_fmt.num_channels = 2;
-  out_fmt.num_channels = 2;
-  in_fmt.frame_rate = 48000;
-  out_fmt.frame_rate = 48000;
-
-  c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0);
-  ASSERT_NE(c, (void*)NULL);
-
-  out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size);
-  EXPECT_EQ(buf_size, out_frames);
-
-  in_buff = (int16_t*)ralloc(buf_size * cras_get_format_bytes(&in_fmt));
-  out_buff = (uint8_t*)ralloc(buf_size * cras_get_format_bytes(&out_fmt));
-  out_frames = cras_fmt_conv_convert_frames(
-      c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size);
-  EXPECT_EQ(buf_size, out_frames);
-  for (unsigned int i = 0; i < buf_size; i++)
-    EXPECT_EQ((in_buff[i] >> 8) + 128, out_buff[i]);
-
-  cras_fmt_conv_destroy(&c);
-  free(in_buff);
-  free(out_buff);
-}
-
-// Test 32 bit 5.1 to 16 bit stereo conversion.
-TEST(FormatConverterTest, ConvertS32LEToS16LEDownmix51ToStereo) {
-  struct cras_fmt_conv* c;
-  struct cras_audio_format in_fmt;
-  struct cras_audio_format out_fmt;
-
-  size_t out_frames;
-  int32_t* in_buff;
-  int16_t* out_buff;
-  const size_t buf_size = 4096;
-  unsigned int in_buf_size = 4096;
-  int i;
-
-  ResetStub();
-  in_fmt.format = SND_PCM_FORMAT_S32_LE;
-  out_fmt.format = SND_PCM_FORMAT_S16_LE;
-  in_fmt.num_channels = 6;
-  out_fmt.num_channels = 2;
-  in_fmt.frame_rate = 48000;
-  out_fmt.frame_rate = 48000;
-  for (i = 0; i < CRAS_CH_MAX; i++)
-    in_fmt.channel_layout[i] = surround_channel_center_layout[i];
-
-  c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0);
-  ASSERT_NE(c, (void*)NULL);
-
-  out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size);
-  EXPECT_EQ(buf_size, out_frames);
-
-  in_buff = (int32_t*)ralloc(buf_size * 2 * cras_get_format_bytes(&in_fmt));
-  out_buff = (int16_t*)ralloc(buf_size * cras_get_format_bytes(&out_fmt));
-  out_frames = cras_fmt_conv_convert_frames(
-      c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size);
-  EXPECT_EQ(buf_size, out_frames);
-
-  cras_fmt_conv_destroy(&c);
-  free(in_buff);
-  free(out_buff);
-}
-
-// Test 16 bit stereo to 5.1 conversion.
-TEST(FormatConverterTest, ConvertS16LEToS16LEStereoTo51) {
-  struct cras_fmt_conv* c;
-  struct cras_audio_format in_fmt;
-  struct cras_audio_format out_fmt;
-
-  size_t out_frames;
-  int16_t* in_buff;
-  int16_t* out_buff;
-  const size_t buf_size = 4096;
-  unsigned int in_buf_size = 4096;
-  int i;
-
-  ResetStub();
-  in_fmt.format = SND_PCM_FORMAT_S16_LE;
-  out_fmt.format = SND_PCM_FORMAT_S16_LE;
-  in_fmt.num_channels = 2;
-  out_fmt.num_channels = 6;
-  in_fmt.frame_rate = 48000;
-  out_fmt.frame_rate = 48000;
-  for (i = 0; i < CRAS_CH_MAX; i++)
-    out_fmt.channel_layout[i] = surround_channel_center_layout[i];
-
-  c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0);
-  ASSERT_NE(c, (void*)NULL);
-
-  out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size);
-  EXPECT_EQ(buf_size, out_frames);
-
-  in_buff = (int16_t*)ralloc(buf_size * cras_get_format_bytes(&in_fmt));
-  out_buff = (int16_t*)ralloc(buf_size * cras_get_format_bytes(&out_fmt));
-  out_frames = cras_fmt_conv_convert_frames(
-      c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size);
-  EXPECT_EQ(buf_size, out_frames);
-  for (unsigned int i = 0; i < buf_size; i++) {
-    /* Check mono be converted to CRAS_CH_FL and CRAS_CH_FR */
-    EXPECT_EQ(in_buff[2 * i], out_buff[6 * i]);
-    EXPECT_EQ(in_buff[2 * i + 1], out_buff[6 * i + 1]);
-    EXPECT_EQ(0, out_buff[6 * i + 2]);
-    EXPECT_EQ(0, out_buff[6 * i + 3]);
-    EXPECT_EQ(0, out_buff[6 * i + 4]);
-    EXPECT_EQ(0, out_buff[6 * i + 5]);
-  }
-
-  cras_fmt_conv_destroy(&c);
-  free(in_buff);
-  free(out_buff);
-}
-
-// Test 16 bit mono to 5.1 conversion.  Center.
-TEST(FormatConverterTest, ConvertS16LEToS16LEMonoTo51Center) {
-  struct cras_fmt_conv* c;
-  struct cras_audio_format in_fmt;
-  struct cras_audio_format out_fmt;
-
-  size_t out_frames;
-  int16_t* in_buff;
-  int16_t* out_buff;
-  const size_t buf_size = 4096;
-  unsigned int in_buf_size = 4096;
-  int i;
-
-  ResetStub();
-  in_fmt.format = SND_PCM_FORMAT_S16_LE;
-  out_fmt.format = SND_PCM_FORMAT_S16_LE;
-  in_fmt.num_channels = 1;
-  out_fmt.num_channels = 6;
-  in_fmt.frame_rate = 48000;
-  out_fmt.frame_rate = 48000;
-  for (i = 0; i < CRAS_CH_MAX; i++)
-    out_fmt.channel_layout[i] = surround_channel_center_layout[i];
-
-  c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0);
-  ASSERT_NE(c, (void*)NULL);
-
-  out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size);
-  EXPECT_EQ(buf_size, out_frames);
-
-  in_buff = (int16_t*)ralloc(buf_size * cras_get_format_bytes(&in_fmt));
-  out_buff = (int16_t*)ralloc(buf_size * cras_get_format_bytes(&out_fmt));
-  out_frames = cras_fmt_conv_convert_frames(
-      c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size);
-  EXPECT_EQ(buf_size, out_frames);
-  for (unsigned int i = 0; i < buf_size; i++) {
-    /* Check mono be converted to CRAS_CH_FC */
-    EXPECT_EQ(in_buff[i], out_buff[6 * i + 4]);
-    EXPECT_EQ(0, out_buff[6 * i + 0]);
-    EXPECT_EQ(0, out_buff[6 * i + 1]);
-    EXPECT_EQ(0, out_buff[6 * i + 2]);
-    EXPECT_EQ(0, out_buff[6 * i + 3]);
-    EXPECT_EQ(0, out_buff[6 * i + 5]);
-  }
-
-  cras_fmt_conv_destroy(&c);
-  free(in_buff);
-  free(out_buff);
-}
-
-// Test 16 bit mono to 5.1 conversion.  Left Right.
-TEST(FormatConverterTest, ConvertS16LEToS16LEMonoTo51LeftRight) {
-  struct cras_fmt_conv* c;
-  struct cras_audio_format in_fmt;
-  struct cras_audio_format out_fmt;
-
-  size_t out_frames;
-  int16_t* in_buff;
-  int16_t* out_buff;
-  const size_t buf_size = 4096;
-  unsigned int in_buf_size = 4096;
-  unsigned int i, left, right;
-
-  ResetStub();
-  in_fmt.format = SND_PCM_FORMAT_S16_LE;
-  out_fmt.format = SND_PCM_FORMAT_S16_LE;
-  in_fmt.num_channels = 1;
-  out_fmt.num_channels = 6;
-  in_fmt.frame_rate = 48000;
-  out_fmt.frame_rate = 48000;
-  for (i = 0; i < CRAS_CH_MAX; i++)
-    out_fmt.channel_layout[i] = surround_channel_left_right_layout[i];
-  left = surround_channel_left_right_layout[CRAS_CH_FL];
-  right = surround_channel_left_right_layout[CRAS_CH_FR];
-
-  c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0);
-  ASSERT_NE(c, (void*)NULL);
-
-  out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size);
-  EXPECT_EQ(buf_size, out_frames);
-
-  in_buff = (int16_t*)ralloc(buf_size * cras_get_format_bytes(&in_fmt));
-  out_buff = (int16_t*)ralloc(buf_size * cras_get_format_bytes(&out_fmt));
-  out_frames = cras_fmt_conv_convert_frames(
-      c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size);
-  EXPECT_EQ(buf_size, out_frames);
-  for (unsigned int i = 0; i < buf_size; i++) {
-    /* Check mono be converted to CRAS_CH_FL and CRAS_CH_FR */
-    for (unsigned int k = 0; k < 6; ++k) {
-      if (k == left)
-        EXPECT_EQ(in_buff[i] / 2, out_buff[6 * i + left]);
-      else if (k == right)
-        EXPECT_EQ(in_buff[i] / 2, out_buff[6 * i + right]);
-      else
-        EXPECT_EQ(0, out_buff[6 * i + k]);
-    }
-  }
-
-  cras_fmt_conv_destroy(&c);
-  free(in_buff);
-  free(out_buff);
-}
-
-// Test 16 bit mono to 5.1 conversion.  Unknown.
-TEST(FormatConverterTest, ConvertS16LEToS16LEMonoTo51Unknown) {
-  struct cras_fmt_conv* c;
-  struct cras_audio_format in_fmt;
-  struct cras_audio_format out_fmt;
-
-  size_t out_frames;
-  int16_t* in_buff;
-  int16_t* out_buff;
-  const size_t buf_size = 4096;
-  unsigned int in_buf_size = 4096;
-  int i;
-
-  ResetStub();
-  in_fmt.format = SND_PCM_FORMAT_S16_LE;
-  out_fmt.format = SND_PCM_FORMAT_S16_LE;
-  in_fmt.num_channels = 1;
-  out_fmt.num_channels = 6;
-  in_fmt.frame_rate = 48000;
-  out_fmt.frame_rate = 48000;
-  for (i = 0; i < CRAS_CH_MAX; i++)
-    out_fmt.channel_layout[i] = surround_channel_unknown_layout[i];
-
-  c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0);
-  ASSERT_NE(c, (void*)NULL);
-
-  out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size);
-  EXPECT_EQ(buf_size, out_frames);
-
-  in_buff = (int16_t*)ralloc(buf_size * cras_get_format_bytes(&in_fmt));
-  out_buff = (int16_t*)ralloc(buf_size * cras_get_format_bytes(&out_fmt));
-  out_frames = cras_fmt_conv_convert_frames(
-      c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size);
-  EXPECT_EQ(buf_size, out_frames);
-  for (unsigned int i = 0; i < buf_size; i++) {
-    /* Check mono be converted to CRAS_CH_FL */
-    EXPECT_EQ(in_buff[i], out_buff[6 * i + 0]);
-    EXPECT_EQ(0, out_buff[6 * i + 1]);
-    EXPECT_EQ(0, out_buff[6 * i + 2]);
-    EXPECT_EQ(0, out_buff[6 * i + 3]);
-    EXPECT_EQ(0, out_buff[6 * i + 4]);
-    EXPECT_EQ(0, out_buff[6 * i + 5]);
-  }
-
-  cras_fmt_conv_destroy(&c);
-  free(in_buff);
-  free(out_buff);
-}
-
-// Test 16 bit stereo to quad conversion.
-TEST(FormatConverterTest, ConvertS16LEToS16LEStereoToQuad) {
-  struct cras_fmt_conv* c;
-  struct cras_audio_format in_fmt;
-  struct cras_audio_format out_fmt;
-
-  size_t out_frames;
-  int16_t* in_buff;
-  int16_t* out_buff;
-  const size_t buf_size = 4096;
-  unsigned int in_buf_size = 4096;
-
-  ResetStub();
-  in_fmt.format = SND_PCM_FORMAT_S16_LE;
-  out_fmt.format = SND_PCM_FORMAT_S16_LE;
-  in_fmt.num_channels = 2;
-  out_fmt.num_channels = 4;
-  in_fmt.frame_rate = 48000;
-  out_fmt.frame_rate = 48000;
-  for (unsigned int i = 0; i < CRAS_CH_MAX; i++)
-    out_fmt.channel_layout[i] = quad_channel_layout[i];
-
-  c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0);
-  ASSERT_NE(c, (void*)NULL);
-
-  out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size);
-  EXPECT_EQ(buf_size, out_frames);
-
-  in_buff = (int16_t*)malloc(buf_size * cras_get_format_bytes(&in_fmt));
-  for (unsigned int i = 0; i < in_buf_size; i++) {
-    in_buff[i * 2] = 40;
-    in_buff[i * 2 + 1] = 80;
-  }
-
-  out_buff = (int16_t*)malloc(buf_size * cras_get_format_bytes(&out_fmt));
-  out_frames = cras_fmt_conv_convert_frames(
-      c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size);
-  EXPECT_EQ(buf_size, out_frames);
-  for (unsigned int i = 0; i < buf_size; i++) {
-    EXPECT_EQ(40, out_buff[4 * i]);
-    EXPECT_EQ(80, out_buff[4 * i + 1]);
-    EXPECT_EQ(40, out_buff[4 * i + 2]);
-    EXPECT_EQ(80, out_buff[4 * i + 3]);
-  }
-  cras_fmt_conv_destroy(&c);
-
-  // Swap channels and check channel layout is respected.
-  swap_channel_layout(out_fmt.channel_layout, CRAS_CH_FL, CRAS_CH_RR);
-  swap_channel_layout(out_fmt.channel_layout, CRAS_CH_RL, CRAS_CH_FR);
-  c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0);
-  out_frames = cras_fmt_conv_convert_frames(
-      c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size);
-  EXPECT_EQ(buf_size, out_frames);
-  for (unsigned int i = 0; i < buf_size; i++) {
-    EXPECT_EQ(80, out_buff[4 * i]);
-    EXPECT_EQ(40, out_buff[4 * i + 1]);
-    EXPECT_EQ(80, out_buff[4 * i + 2]);
-    EXPECT_EQ(40, out_buff[4 * i + 3]);
-  }
-
-  cras_fmt_conv_destroy(&c);
-  free(in_buff);
-  free(out_buff);
-}
-
-// Test 32 bit 5.1 to 16 bit stereo conversion with SRC 1 to 2.
-TEST(FormatConverterTest, ConvertS32LEToS16LEDownmix51ToStereo48To96) {
-  struct cras_fmt_conv* c;
-  struct cras_audio_format in_fmt;
-  struct cras_audio_format out_fmt;
-
-  size_t out_frames;
-  int32_t* in_buff;
-  int16_t* out_buff;
-  const size_t buf_size = 4096;
-  unsigned int in_buf_size = 4096;
-  int i;
-
-  ResetStub();
-  in_fmt.format = SND_PCM_FORMAT_S32_LE;
-  out_fmt.format = SND_PCM_FORMAT_S16_LE;
-  in_fmt.num_channels = 6;
-  out_fmt.num_channels = 2;
-  in_fmt.frame_rate = 48000;
-  out_fmt.frame_rate = 96000;
-  for (i = 0; i < CRAS_CH_MAX; i++)
-    in_fmt.channel_layout[i] = surround_channel_center_layout[i];
-
-  c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0);
-  ASSERT_NE(c, (void*)NULL);
-
-  out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size);
-  EXPECT_EQ(buf_size * 2, out_frames);
-
-  in_buff = (int32_t*)ralloc(buf_size * cras_get_format_bytes(&in_fmt));
-  out_buff = (int16_t*)ralloc(buf_size * 2 * cras_get_format_bytes(&out_fmt));
-  out_frames = cras_fmt_conv_convert_frames(
-      c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size * 2);
-  EXPECT_EQ(buf_size * 2, out_frames);
-
-  cras_fmt_conv_destroy(&c);
-  free(in_buff);
-  free(out_buff);
-}
-
-// Test 32 bit 5.1 to 16 bit stereo conversion with SRC 2 to 1.
-TEST(FormatConverterTest, ConvertS32LEToS16LEDownmix51ToStereo96To48) {
-  struct cras_fmt_conv* c;
-  struct cras_audio_format in_fmt;
-  struct cras_audio_format out_fmt;
-
-  size_t out_frames;
-  int32_t* in_buff;
-  int16_t* out_buff;
-  const size_t buf_size = 4096;
-  unsigned int in_buf_size = 4096;
-  int i;
-
-  ResetStub();
-  in_fmt.format = SND_PCM_FORMAT_S32_LE;
-  out_fmt.format = SND_PCM_FORMAT_S16_LE;
-  in_fmt.num_channels = 6;
-  out_fmt.num_channels = 2;
-  in_fmt.frame_rate = 96000;
-  out_fmt.frame_rate = 48000;
-  for (i = 0; i < CRAS_CH_MAX; i++)
-    in_fmt.channel_layout[i] = surround_channel_center_layout[i];
-
-  c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0);
-  ASSERT_NE(c, (void*)NULL);
-
-  out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size);
-  EXPECT_EQ(buf_size / 2, out_frames);
-
-  in_buff = (int32_t*)ralloc(buf_size * cras_get_format_bytes(&in_fmt));
-  out_buff = (int16_t*)ralloc(buf_size / 2 * cras_get_format_bytes(&out_fmt));
-  out_frames = cras_fmt_conv_convert_frames(
-      c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size / 2);
-  EXPECT_EQ(buf_size / 2, out_frames);
-
-  cras_fmt_conv_destroy(&c);
-  free(in_buff);
-  free(out_buff);
-}
-
-// Test 32 bit 5.1 to 16 bit stereo conversion with SRC 48 to 44.1.
-TEST(FormatConverterTest, ConvertS32LEToS16LEDownmix51ToStereo48To441) {
-  struct cras_fmt_conv* c;
-  struct cras_audio_format in_fmt;
-  struct cras_audio_format out_fmt;
-
-  size_t out_frames;
-  size_t ret_frames;
-  int32_t* in_buff;
-  int16_t* out_buff;
-  const size_t buf_size = 4096;
-  unsigned int in_buf_size = 4096;
-  int i;
-
-  ResetStub();
-  in_fmt.format = SND_PCM_FORMAT_S32_LE;
-  out_fmt.format = SND_PCM_FORMAT_S16_LE;
-  in_fmt.num_channels = 6;
-  out_fmt.num_channels = 2;
-  in_fmt.frame_rate = 48000;
-  out_fmt.frame_rate = 44100;
-  for (i = 0; i < CRAS_CH_MAX; i++)
-    in_fmt.channel_layout[i] = surround_channel_center_layout[i];
-
-  c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0);
-  ASSERT_NE(c, (void*)NULL);
-
-  out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size);
-  EXPECT_LT(out_frames, buf_size);
-
-  in_buff = (int32_t*)ralloc(buf_size * cras_get_format_bytes(&in_fmt));
-  out_buff = (int16_t*)ralloc(out_frames * cras_get_format_bytes(&out_fmt));
-  ret_frames = cras_fmt_conv_convert_frames(
-      c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, out_frames);
-  EXPECT_EQ(out_frames, ret_frames);
-
-  cras_fmt_conv_destroy(&c);
-  free(in_buff);
-  free(out_buff);
-}
-
-// Test 32 bit 5.1 to 16 bit stereo conversion with SRC 441 to 48.
-TEST(FormatConverterTest, ConvertS32LEToS16LEDownmix51ToStereo441To48) {
-  struct cras_fmt_conv* c;
-  struct cras_audio_format in_fmt;
-  struct cras_audio_format out_fmt;
-
-  size_t out_frames;
-  size_t ret_frames;
-  int32_t* in_buff;
-  int16_t* out_buff;
-  const size_t buf_size = 4096;
-  unsigned int in_buf_size = 4096;
-  int i;
-
-  ResetStub();
-  in_fmt.format = SND_PCM_FORMAT_S32_LE;
-  out_fmt.format = SND_PCM_FORMAT_S16_LE;
-  in_fmt.num_channels = 6;
-  out_fmt.num_channels = 2;
-  in_fmt.frame_rate = 44100;
-  out_fmt.frame_rate = 48000;
-  for (i = 0; i < CRAS_CH_MAX; i++)
-    in_fmt.channel_layout[i] = surround_channel_center_layout[i];
-
-  c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0);
-  ASSERT_NE(c, (void*)NULL);
-
-  out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size);
-  EXPECT_GT(out_frames, buf_size);
-
-  in_buff = (int32_t*)ralloc(buf_size * cras_get_format_bytes(&in_fmt));
-  out_buff =
-      (int16_t*)ralloc((out_frames - 1) * cras_get_format_bytes(&out_fmt));
-  ret_frames = cras_fmt_conv_convert_frames(
-      c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, out_frames - 1);
-  EXPECT_EQ(out_frames - 1, ret_frames);
-
-  cras_fmt_conv_destroy(&c);
-  free(in_buff);
-  free(out_buff);
-}
-
-// Test Invalid buffer length just truncates.
-TEST(FormatConverterTest, ConvertS32LEToS16LEDownmix51ToStereo96To48Short) {
-  struct cras_fmt_conv* c;
-  struct cras_audio_format in_fmt;
-  struct cras_audio_format out_fmt;
-
-  size_t out_frames;
-  size_t ret_frames;
-  int32_t* in_buff;
-  int16_t* out_buff;
-  const size_t buf_size = 4096;
-  unsigned int in_buf_size = 4096;
-  int i;
-
-  ResetStub();
-  in_fmt.format = SND_PCM_FORMAT_S32_LE;
-  out_fmt.format = SND_PCM_FORMAT_S16_LE;
-  in_fmt.num_channels = 6;
-  out_fmt.num_channels = 2;
-  in_fmt.frame_rate = 96000;
-  out_fmt.frame_rate = 48000;
-  for (i = 0; i < CRAS_CH_MAX; i++)
-    in_fmt.channel_layout[i] = surround_channel_center_layout[i];
-
-  c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0);
-  ASSERT_NE(c, (void*)NULL);
-
-  out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size);
-  EXPECT_EQ(buf_size / 2, out_frames);
-
-  in_buff = (int32_t*)ralloc(buf_size * cras_get_format_bytes(&in_fmt));
-  out_buff =
-      (int16_t*)ralloc((out_frames - 2) * cras_get_format_bytes(&out_fmt));
-  ret_frames = cras_fmt_conv_convert_frames(
-      c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, out_frames - 2);
-  EXPECT_EQ(out_frames - 2, ret_frames);
-
-  cras_fmt_conv_destroy(&c);
-  free(in_buff);
-  free(out_buff);
-}
-
-// Test format convert pre linear resample and then follows SRC from 96 to 48.
-TEST(FormatConverterTest, Convert96to48PreLinearResample) {
-  struct cras_fmt_conv* c;
-  struct cras_audio_format in_fmt;
-  struct cras_audio_format out_fmt;
-
-  size_t out_frames;
-  int32_t* in_buff;
-  int16_t* out_buff;
-  const size_t buf_size = 4096;
-  unsigned int in_buf_size = 4096;
-  unsigned int expected_fr;
-  int i;
-
-  ResetStub();
-  in_fmt.format = SND_PCM_FORMAT_S16_LE;
-  out_fmt.format = SND_PCM_FORMAT_S16_LE;
-  in_fmt.num_channels = 2;
-  out_fmt.num_channels = 2;
-  in_fmt.frame_rate = 96000;
-  out_fmt.frame_rate = 48000;
-  for (i = 0; i < CRAS_CH_MAX; i++) {
-    in_fmt.channel_layout[i] = surround_channel_center_layout[i];
-    out_fmt.channel_layout[i] = surround_channel_center_layout[i];
-  }
-
-  c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size * 2, 1);
-  ASSERT_NE(c, (void*)NULL);
-  EXPECT_EQ(out_fmt.frame_rate, linear_resampler_src_rate);
-  EXPECT_EQ(out_fmt.frame_rate, linear_resampler_dst_rate);
-
-  linear_resampler_needed_val = 1;
-  linear_resampler_ratio = 1.01;
-  expected_fr = buf_size / 2 * linear_resampler_ratio;
-  out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size);
-  EXPECT_EQ(expected_fr, out_frames);
-
-  in_buff = (int32_t*)ralloc(buf_size * cras_get_format_bytes(&in_fmt));
-  out_buff = (int16_t*)ralloc(buf_size * cras_get_format_bytes(&out_fmt));
-  out_frames = cras_fmt_conv_convert_frames(
-      c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, out_frames);
-  EXPECT_EQ(expected_fr, out_frames);
-
-  cras_fmt_conv_destroy(&c);
-  free(in_buff);
-  free(out_buff);
-}
-
-// Test format convert SRC from 96 to 48 and then post linear resample.
-TEST(FormatConverterTest, Convert96to48PostLinearResample) {
-  struct cras_fmt_conv* c;
-  struct cras_audio_format in_fmt;
-  struct cras_audio_format out_fmt;
-
-  size_t out_frames;
-  int32_t* in_buff;
-  int16_t* out_buff;
-  const size_t buf_size = 4096;
-  unsigned int in_buf_size = 4096;
-  unsigned int expected_fr;
-  int i;
-
-  ResetStub();
-  in_fmt.format = SND_PCM_FORMAT_S16_LE;
-  out_fmt.format = SND_PCM_FORMAT_S16_LE;
-  in_fmt.num_channels = 2;
-  out_fmt.num_channels = 2;
-  in_fmt.frame_rate = 96000;
-  out_fmt.frame_rate = 48000;
-  for (i = 0; i < CRAS_CH_MAX; i++) {
-    in_fmt.channel_layout[i] = surround_channel_center_layout[i];
-    out_fmt.channel_layout[i] = surround_channel_center_layout[i];
-  }
-
-  c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size * 2, 0);
-  ASSERT_NE(c, (void*)NULL);
-  EXPECT_EQ(out_fmt.frame_rate, linear_resampler_src_rate);
-  EXPECT_EQ(out_fmt.frame_rate, linear_resampler_dst_rate);
-
-  linear_resampler_needed_val = 1;
-  linear_resampler_ratio = 0.99;
-  expected_fr = buf_size / 2 * linear_resampler_ratio;
-  out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size);
-  EXPECT_EQ(expected_fr, out_frames);
-
-  in_buff = (int32_t*)ralloc(buf_size * cras_get_format_bytes(&in_fmt));
-  out_buff = (int16_t*)ralloc(buf_size * cras_get_format_bytes(&out_fmt));
-  out_frames = cras_fmt_conv_convert_frames(
-      c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size);
-  EXPECT_EQ(expected_fr, out_frames);
-
-  cras_fmt_conv_destroy(&c);
-  free(in_buff);
-  free(out_buff);
-}
-
-// Test format converter created in config_format_converter
-TEST(FormatConverterTest, ConfigConverter) {
-  int i;
-  struct cras_fmt_conv* c = NULL;
-  struct cras_audio_format in_fmt;
-  struct cras_audio_format out_fmt;
-
-  ResetStub();
-  in_fmt.format = SND_PCM_FORMAT_S16_LE;
-  out_fmt.format = SND_PCM_FORMAT_S16_LE;
-  in_fmt.num_channels = 1;
-  out_fmt.num_channels = 2;
-  in_fmt.frame_rate = 96000;
-  out_fmt.frame_rate = 48000;
-  for (i = 0; i < CRAS_CH_MAX; i++) {
-    in_fmt.channel_layout[i] = mono_channel_layout[i];
-    out_fmt.channel_layout[i] = stereo_channel_layout[i];
-  }
-
-  config_format_converter(&c, CRAS_STREAM_OUTPUT, &in_fmt, &out_fmt, 4096);
-  ASSERT_NE(c, (void*)NULL);
-
-  cras_fmt_conv_destroy(&c);
-}
-
-// Test format converter not created when in/out format conversion is not
-// needed.
-TEST(FormatConverterTest, ConfigConverterNoNeed) {
-  int i;
-  struct cras_fmt_conv* c = NULL;
-  struct cras_audio_format in_fmt;
-  struct cras_audio_format out_fmt;
-
-  ResetStub();
-  in_fmt.format = SND_PCM_FORMAT_S16_LE;
-  out_fmt.format = SND_PCM_FORMAT_S16_LE;
-  in_fmt.num_channels = 2;
-  out_fmt.num_channels = 2;
-  in_fmt.frame_rate = 48000;
-  out_fmt.frame_rate = 48000;
-  for (i = 0; i < CRAS_CH_MAX; i++) {
-    in_fmt.channel_layout[i] = stereo_channel_layout[i];
-    out_fmt.channel_layout[i] = stereo_channel_layout[i];
-  }
-
-  config_format_converter(&c, CRAS_STREAM_OUTPUT, &in_fmt, &out_fmt, 4096);
-  EXPECT_NE(c, (void*)NULL);
-  EXPECT_EQ(0, cras_fmt_conversion_needed(c));
-  cras_fmt_conv_destroy(&c);
-}
-
-// Test format converter not created for input when in/out format differs
-// at channel count or layout.
-TEST(FormatConverterTest, ConfigConverterNoNeedForInput) {
-  static int kmic_channel_layout[CRAS_CH_MAX] = {0,  1,  -1, -1, 2, -1,
-                                                 -1, -1, -1, -1, -1};
-  int i;
-  struct cras_fmt_conv* c = NULL;
-  struct cras_audio_format in_fmt;
-  struct cras_audio_format out_fmt;
-
-  ResetStub();
-  in_fmt.format = SND_PCM_FORMAT_S16_LE;
-  out_fmt.format = SND_PCM_FORMAT_S16_LE;
-  in_fmt.num_channels = 2;
-  out_fmt.num_channels = 3;
-  in_fmt.frame_rate = 48000;
-  out_fmt.frame_rate = 48000;
-  for (i = 0; i < CRAS_CH_MAX; i++) {
-    in_fmt.channel_layout[i] = stereo_channel_layout[i];
-    out_fmt.channel_layout[i] = kmic_channel_layout[i];
-  }
-
-  config_format_converter(&c, CRAS_STREAM_INPUT, &in_fmt, &out_fmt, 4096);
-  EXPECT_NE(c, (void*)NULL);
-  EXPECT_EQ(0, cras_fmt_conversion_needed(c));
-  cras_fmt_conv_destroy(&c);
-}
-
-TEST(ChannelRemixTest, ChannelRemixAppliedOrNot) {
-  float coeff[4] = {0.5, 0.5, 0.26, 0.73};
-  struct cras_fmt_conv* conv;
-  struct cras_audio_format fmt;
-  int16_t *buf, *res;
-  unsigned i;
-
-  fmt.num_channels = 2;
-  conv = cras_channel_remix_conv_create(2, coeff);
-
-  buf = (int16_t*)ralloc(50 * 4);
-  res = (int16_t*)malloc(50 * 4);
-
-  memcpy(res, buf, 50 * 4);
-
-  /* Remix conversion will not apply for non S16_LE format. */
-  fmt.format = SND_PCM_FORMAT_S24_LE;
-  cras_channel_remix_convert(conv, &fmt, (uint8_t*)buf, 50);
-  for (i = 0; i < 100; i++)
-    EXPECT_EQ(res[i], buf[i]);
-
-  for (i = 0; i < 100; i += 2) {
-    res[i] = coeff[0] * buf[i];
-    res[i] += coeff[1] * buf[i + 1];
-    res[i + 1] = coeff[2] * buf[i];
-    res[i + 1] += coeff[3] * buf[i + 1];
-  }
-
-  fmt.format = SND_PCM_FORMAT_S16_LE;
-  cras_channel_remix_convert(conv, &fmt, (uint8_t*)buf, 50);
-  for (i = 0; i < 100; i++)
-    EXPECT_EQ(res[i], buf[i]);
-
-  /* If num_channels not match, remix conversion will not apply. */
-  fmt.num_channels = 6;
-  cras_channel_remix_convert(conv, &fmt, (uint8_t*)buf, 50);
-  for (i = 0; i < 100; i++)
-    EXPECT_EQ(res[i], buf[i]);
-
-  cras_fmt_conv_destroy(&conv);
-  free(buf);
-  free(res);
-}
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
-
-extern "C" {
-float** cras_channel_conv_matrix_alloc(size_t in_ch, size_t out_ch) {
-  int i;
-  float** conv_mtx;
-  conv_mtx = (float**)calloc(CRAS_CH_MAX, sizeof(*conv_mtx));
-  for (i = 0; i < CRAS_CH_MAX; i++)
-    conv_mtx[i] = (float*)calloc(CRAS_CH_MAX, sizeof(*conv_mtx[i]));
-  return conv_mtx;
-}
-void cras_channel_conv_matrix_destroy(float** mtx, size_t out_ch) {
-  int i;
-  for (i = 0; i < CRAS_CH_MAX; i++)
-    free(mtx[i]);
-  free(mtx);
-}
-float** cras_channel_conv_matrix_create(const struct cras_audio_format* in,
-                                        const struct cras_audio_format* out) {
-  return cras_channel_conv_matrix_alloc(in->num_channels, out->num_channels);
-}
-struct linear_resampler* linear_resampler_create(unsigned int num_channels,
-                                                 unsigned int format_bytes,
-                                                 float src_rate,
-                                                 float dst_rate) {
-  linear_resampler_format_bytes = format_bytes;
-  linear_resampler_num_channels = num_channels;
-  linear_resampler_src_rate = src_rate;
-  linear_resampler_dst_rate = dst_rate;
-  return reinterpret_cast<struct linear_resampler*>(0x33);
-  ;
-}
-
-int linear_resampler_needed(struct linear_resampler* lr) {
-  return linear_resampler_needed_val;
-}
-
-void linear_resampler_set_rates(struct linear_resampler* lr,
-                                unsigned int from,
-                                unsigned int to) {
-  linear_resampler_src_rate = from;
-  linear_resampler_dst_rate = to;
-}
-
-unsigned int linear_resampler_out_frames_to_in(struct linear_resampler* lr,
-                                               unsigned int frames) {
-  return (double)frames / linear_resampler_ratio;
-}
-
-/* Converts the frames count from input rate to output rate. */
-unsigned int linear_resampler_in_frames_to_out(struct linear_resampler* lr,
-                                               unsigned int frames) {
-  return (double)frames * linear_resampler_ratio;
-}
-
-unsigned int linear_resampler_resample(struct linear_resampler* lr,
-                                       uint8_t* src,
-                                       unsigned int* src_frames,
-                                       uint8_t* dst,
-                                       unsigned dst_frames) {
-  unsigned int resampled_fr = *src_frames * linear_resampler_ratio;
-
-  if (resampled_fr > dst_frames) {
-    resampled_fr = dst_frames;
-    *src_frames = dst_frames / linear_resampler_ratio;
-  }
-  unsigned int resampled_bytes = resampled_fr * linear_resampler_format_bytes *
-                                 linear_resampler_num_channels;
-  for (size_t i = 0; i < resampled_bytes; i++)
-    dst[i] = (uint8_t)rand() & 0xff;
-
-  return resampled_fr;
-}
-
-void linear_resampler_destroy(struct linear_resampler* lr) {}
-}  // extern "C"
diff --git a/cras/src/tests/hfp_ag_profile_unittest.cc b/cras/src/tests/hfp_ag_profile_unittest.cc
deleted file mode 100644
index 3ecd240..0000000
--- a/cras/src/tests/hfp_ag_profile_unittest.cc
+++ /dev/null
@@ -1,310 +0,0 @@
-/* Copyright 2019 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <gtest/gtest.h>
-
-extern "C" {
-#include "cras_bt_log.h"
-#include "cras_bt_profile.h"
-#include "cras_hfp_ag_profile.h"
-#include "cras_iodev.h"
-}
-
-static int with_sco_pcm;
-static struct cras_iodev fake_sco_out, fake_sco_in;
-static struct cras_bt_device* fake_device;
-static struct cras_bt_profile* internal_bt_profile;
-
-static size_t hfp_alsa_iodev_create_called;
-static size_t hfp_alsa_iodev_destroy_called;
-static size_t hfp_iodev_create_called;
-static size_t hfp_iodev_destroy_called;
-static size_t cras_bt_device_notify_profile_dropped_called;
-static struct cras_bt_device* cras_bt_device_notify_profile_dropped_dev;
-static enum cras_bt_device_profile
-    cras_bt_device_notify_profile_dropped_profile;
-
-static void ResetStubData() {
-  hfp_alsa_iodev_create_called = 0;
-  hfp_alsa_iodev_destroy_called = 0;
-  hfp_iodev_create_called = 0;
-  hfp_iodev_destroy_called = 0;
-  cras_bt_device_notify_profile_dropped_called = 0;
-}
-
-namespace {
-
-class HfpAgProfile : public testing::Test {
- protected:
-  virtual void SetUp() {
-    btlog = cras_bt_event_log_init();
-    ResetStubData();
-  }
-
-  virtual void TearDown() { cras_bt_event_log_deinit(btlog); }
-};
-
-TEST_F(HfpAgProfile, StartWithoutScoPCM) {
-  int ret;
-  struct cras_bt_profile* bt_profile;
-
-  with_sco_pcm = 0;
-  fake_device = (struct cras_bt_device*)0xdeadbeef;
-  /* to get the cras_hfp_ag_profile */
-  cras_hfp_ag_profile_create(NULL);
-  bt_profile = internal_bt_profile;
-  bt_profile->new_connection(NULL, bt_profile, fake_device, 0);
-
-  ret = cras_hfp_ag_start(fake_device);
-
-  EXPECT_EQ(0, ret);
-  EXPECT_EQ(2, hfp_iodev_create_called);
-
-  /* Start ag twice won't create more iodev. */
-  ret = cras_hfp_ag_start(fake_device);
-  EXPECT_EQ(0, ret);
-  EXPECT_EQ(2, hfp_iodev_create_called);
-
-  bt_profile->release(bt_profile);
-
-  EXPECT_EQ(2, hfp_iodev_destroy_called);
-}
-
-TEST_F(HfpAgProfile, StartWithScoPCM) {
-  int ret;
-  struct cras_bt_profile* bt_profile;
-
-  with_sco_pcm = 1;
-  fake_device = (struct cras_bt_device*)0xdeadbeef;
-  /* to get the cras_hfp_ag_profile */
-  cras_hfp_ag_profile_create(NULL);
-  bt_profile = internal_bt_profile;
-  bt_profile->new_connection(NULL, bt_profile, fake_device, 0);
-
-  ret = cras_hfp_ag_start(fake_device);
-
-  EXPECT_EQ(0, ret);
-  EXPECT_EQ(2, hfp_alsa_iodev_create_called);
-
-  bt_profile->release(bt_profile);
-
-  EXPECT_EQ(2, hfp_alsa_iodev_destroy_called);
-}
-
-TEST_F(HfpAgProfile, RemoveConflictAG) {
-  struct cras_bt_profile* bt_profile;
-  struct cras_bt_device* new_dev =
-      reinterpret_cast<struct cras_bt_device*>(0x123);
-  ;
-
-  with_sco_pcm = 0;
-  fake_device = (struct cras_bt_device*)0xdeadbeef;
-  /* to get the cras_hfp_ag_profile */
-  cras_hfp_ag_profile_create(NULL);
-  bt_profile = internal_bt_profile;
-  bt_profile->new_connection(NULL, bt_profile, fake_device, 0);
-
-  bt_profile->new_connection(NULL, bt_profile, new_dev, 0);
-
-  /* Expect removing conflict of new_dev triggers profile drop on
-   * fake_device. */
-  cras_hfp_ag_remove_conflict(new_dev);
-  EXPECT_EQ(1, cras_bt_device_notify_profile_dropped_called);
-  EXPECT_EQ(fake_device, cras_bt_device_notify_profile_dropped_dev);
-  EXPECT_EQ(CRAS_BT_DEVICE_PROFILE_HFP_HANDSFREE,
-            cras_bt_device_notify_profile_dropped_profile);
-
-  bt_profile->release(bt_profile);
-}
-
-}  // namespace
-
-extern "C" {
-
-struct cras_bt_event_log* btlog;
-
-struct cras_iodev* cras_iodev_list_get_sco_pcm_iodev(
-    enum CRAS_STREAM_DIRECTION direction) {
-  if (with_sco_pcm) {
-    if (direction == CRAS_STREAM_OUTPUT)
-      return &fake_sco_out;
-    else
-      return &fake_sco_in;
-  }
-
-  return NULL;
-}
-
-struct cras_iodev* hfp_alsa_iodev_create(enum CRAS_STREAM_DIRECTION dir,
-                                         struct cras_bt_device* device,
-                                         struct hfp_slc_handle* slc,
-                                         enum cras_bt_device_profile profile) {
-  hfp_alsa_iodev_create_called++;
-  return (struct cras_iodev*)0xdeadbeef;
-}
-
-void hfp_alsa_iodev_destroy(struct cras_iodev* iodev) {
-  hfp_alsa_iodev_destroy_called++;
-}
-
-struct cras_iodev* hfp_iodev_create(enum CRAS_STREAM_DIRECTION dir,
-                                    struct cras_bt_device* device,
-                                    struct hfp_slc_handle* slc,
-                                    enum cras_bt_device_profile profile,
-                                    struct hfp_info* info) {
-  hfp_iodev_create_called++;
-  return (struct cras_iodev*)0xdeadbeef;
-}
-
-void hfp_iodev_destroy(struct cras_iodev* iodev) {
-  hfp_iodev_destroy_called++;
-}
-
-int cras_bt_add_profile(DBusConnection* conn, struct cras_bt_profile* profile) {
-  internal_bt_profile = profile;
-  return 0;
-}
-
-int cras_bt_rm_profile(DBusConnection* conn, struct cras_bt_profile* profile) {
-  internal_bt_profile = NULL;
-  return 0;
-}
-
-int cras_bt_register_profile(DBusConnection* conn,
-                             struct cras_bt_profile* profile) {
-  return 0;
-}
-
-int cras_bt_register_profiles(DBusConnection* conn) {
-  return 0;
-}
-
-int cras_bt_unregister_profile(DBusConnection* conn,
-                               struct cras_bt_profile* profile) {
-  return 0;
-}
-
-struct hfp_info* hfp_info_create() {
-  return NULL;
-}
-
-int hfp_info_running(struct hfp_info* info) {
-  return 0;
-}
-
-int hfp_info_stop(struct hfp_info* info) {
-  return 0;
-}
-
-void hfp_info_destroy(struct hfp_info* info) {}
-
-void hfp_slc_destroy(struct hfp_slc_handle* slc_handle) {}
-
-int cras_bt_device_has_a2dp(struct cras_bt_device* device) {
-  return 0;
-}
-
-int cras_bt_device_disconnect(DBusConnection* conn,
-                              struct cras_bt_device* device) {
-  return 0;
-}
-
-const char* cras_bt_device_name(const struct cras_bt_device* device) {
-  return NULL;
-}
-
-void cras_bt_device_set_append_iodev_cb(struct cras_bt_device* device,
-                                        void (*cb)(void* data)) {}
-
-enum cras_bt_device_profile cras_bt_device_profile_from_uuid(const char* uuid) {
-  return CRAS_BT_DEVICE_PROFILE_HSP_AUDIOGATEWAY;
-}
-
-struct cras_bt_adapter* cras_bt_device_adapter(
-    const struct cras_bt_device* device) {
-  return reinterpret_cast<struct cras_bt_adapter*>(0x123);
-}
-
-int cras_bt_adapter_wbs_supported(struct cras_bt_adapter* adapter) {
-  return 1;
-}
-
-struct hfp_slc_handle* hfp_slc_create(int fd,
-                                      int is_hsp,
-                                      int ag_supported_features,
-                                      struct cras_bt_device* device,
-                                      hfp_slc_init_cb init_cb,
-                                      hfp_slc_disconnect_cb disconnect_cb) {
-  return NULL;
-}
-
-int hfp_slc_get_selected_codec(struct hfp_slc_handle* handle) {
-  return HFP_CODEC_ID_CVSD;
-}
-int hfp_slc_get_ag_codec_negotiation_supported(struct hfp_slc_handle* handle) {
-  return 1;
-}
-
-int hfp_slc_get_hf_codec_negotiation_supported(struct hfp_slc_handle* handle) {
-  return 1;
-}
-
-int hfp_slc_get_hf_supports_battery_indicator(struct hfp_slc_handle* handle) {
-  return 0;
-}
-
-int hfp_slc_get_hf_battery_level(struct hfp_slc_handle* handle) {
-  return -1;
-}
-
-struct cras_bt_device* cras_a2dp_connected_device() {
-  return NULL;
-}
-
-int cras_bt_device_supports_profile(const struct cras_bt_device* device,
-                                    enum cras_bt_device_profile profile) {
-  return 0;
-}
-
-void cras_a2dp_suspend_connected_device(struct cras_bt_device* device) {}
-
-const char* cras_bt_device_address(const struct cras_bt_device* device) {
-  return "";
-}
-
-int cras_bt_device_audio_gateway_initialized(struct cras_bt_device* device) {
-  return 0;
-}
-
-void cras_bt_device_notify_profile_dropped(
-    struct cras_bt_device* device,
-    enum cras_bt_device_profile profile) {
-  cras_bt_device_notify_profile_dropped_called++;
-  cras_bt_device_notify_profile_dropped_dev = device;
-  cras_bt_device_notify_profile_dropped_profile = profile;
-}
-
-void hfp_info_set_wbs_logger(struct hfp_info* info,
-                             struct packet_status_logger* wbs_logger) {}
-
-void cras_observer_notify_bt_battery_changed(const char* address,
-                                             uint32_t level) {
-  return;
-}
-
-bool cras_system_get_bt_wbs_enabled() {
-  return true;
-}
-
-int cras_server_metrics_hfp_wideband_selected_codec(int codec) {
-  return HFP_CODEC_ID_MSBC;
-}
-
-}  // extern "C"
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tests/hfp_alsa_iodev_unittest.cc b/cras/src/tests/hfp_alsa_iodev_unittest.cc
deleted file mode 100644
index 8756c20..0000000
--- a/cras/src/tests/hfp_alsa_iodev_unittest.cc
+++ /dev/null
@@ -1,543 +0,0 @@
-/* Copyright 2019 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <gtest/gtest.h>
-
-extern "C" {
-#include "cras_audio_format.h"
-#include "cras_hfp_alsa_iodev.h"
-#include "cras_hfp_slc.h"
-#include "cras_iodev.h"
-}
-
-struct hfp_alsa_io {
-  struct cras_iodev base;
-  struct cras_bt_device* device;
-  struct hfp_slc_handle* slc;
-  struct cras_iodev* aio;
-};
-
-static struct cras_iodev fake_sco_out, fake_sco_in;
-static struct cras_bt_device* fake_device;
-static struct hfp_slc_handle* fake_slc;
-static struct cras_audio_format fake_format;
-
-static size_t cras_bt_device_append_iodev_called;
-static size_t cras_bt_device_rm_iodev_called;
-static size_t cras_iodev_add_node_called;
-static size_t cras_iodev_rm_node_called;
-static size_t cras_iodev_set_active_node_called;
-static size_t cras_iodev_free_format_called;
-static size_t cras_iodev_free_resources_called;
-static size_t cras_iodev_set_format_called;
-static size_t hfp_set_call_status_called;
-static size_t hfp_event_speaker_gain_called;
-
-#define _FAKE_CALL1(name)             \
-  static size_t fake_##name##_called; \
-  static int fake_##name(void* a) {   \
-    fake_##name##_called++;           \
-    return 0;                         \
-  }
-#define _FAKE_CALL2(name)                    \
-  static size_t fake_##name##_called;        \
-  static int fake_##name(void* a, void* b) { \
-    fake_##name##_called++;                  \
-    return 0;                                \
-  }
-#define _FAKE_CALL3(name)                             \
-  static size_t fake_##name##_called;                 \
-  static int fake_##name(void* a, void* b, void* c) { \
-    fake_##name##_called++;                           \
-    return 0;                                         \
-  }
-
-_FAKE_CALL1(open_dev);
-_FAKE_CALL1(update_supported_formats);
-_FAKE_CALL1(configure_dev);
-_FAKE_CALL1(close_dev);
-_FAKE_CALL1(output_underrun);
-_FAKE_CALL2(frames_queued);
-_FAKE_CALL1(delay_frames);
-_FAKE_CALL3(get_buffer);
-_FAKE_CALL2(put_buffer);
-_FAKE_CALL1(flush_buffer);
-_FAKE_CALL3(update_active_node);
-_FAKE_CALL1(start);
-_FAKE_CALL2(no_stream);
-_FAKE_CALL1(is_free_running);
-_FAKE_CALL2(get_valid_frames);
-
-static void ResetStubData() {
-  cras_bt_device_append_iodev_called = 0;
-  cras_bt_device_rm_iodev_called = 0;
-  cras_iodev_add_node_called = 0;
-  cras_iodev_rm_node_called = 0;
-  cras_iodev_set_active_node_called = 0;
-  cras_iodev_free_format_called = 0;
-  cras_iodev_free_resources_called = 0;
-  cras_iodev_set_format_called = 0;
-  hfp_set_call_status_called = 0;
-  hfp_event_speaker_gain_called = 0;
-
-  fake_sco_out.open_dev = fake_sco_in.open_dev =
-      (int (*)(struct cras_iodev*))fake_open_dev;
-  fake_open_dev_called = 0;
-
-  fake_sco_out.update_supported_formats = fake_sco_in.update_supported_formats =
-      (int (*)(struct cras_iodev*))fake_update_supported_formats;
-  fake_update_supported_formats_called = 0;
-
-  fake_sco_out.configure_dev = fake_sco_in.configure_dev =
-      (int (*)(struct cras_iodev*))fake_configure_dev;
-  fake_configure_dev_called = 0;
-
-  fake_sco_out.close_dev = fake_sco_in.close_dev =
-      (int (*)(struct cras_iodev*))fake_close_dev;
-  fake_close_dev_called = 0;
-
-  fake_sco_out.frames_queued = fake_sco_in.frames_queued =
-      (int (*)(const struct cras_iodev*, struct timespec*))fake_frames_queued;
-  fake_frames_queued_called = 0;
-
-  fake_sco_out.delay_frames = fake_sco_in.delay_frames =
-      (int (*)(const struct cras_iodev*))fake_delay_frames;
-  fake_delay_frames_called = 0;
-
-  fake_sco_out.get_buffer = fake_sco_in.get_buffer = (int (*)(
-      struct cras_iodev*, struct cras_audio_area**, unsigned*))fake_get_buffer;
-  fake_get_buffer_called = 0;
-
-  fake_sco_out.put_buffer = fake_sco_in.put_buffer =
-      (int (*)(struct cras_iodev*, unsigned))fake_put_buffer;
-  fake_put_buffer_called = 0;
-
-  fake_sco_out.flush_buffer = fake_sco_in.flush_buffer =
-      (int (*)(struct cras_iodev*))fake_flush_buffer;
-  fake_flush_buffer_called = 0;
-
-  fake_sco_out.update_active_node = fake_sco_in.update_active_node =
-      (void (*)(struct cras_iodev*, unsigned, unsigned))fake_update_active_node;
-  fake_update_active_node_called = 0;
-
-  fake_sco_out.start = fake_sco_in.start =
-      (int (*)(const struct cras_iodev*))fake_start;
-  fake_start_called = 0;
-
-  fake_sco_out.no_stream = fake_sco_in.no_stream =
-      (int (*)(struct cras_iodev*, int))fake_no_stream;
-  fake_no_stream_called = 0;
-
-  fake_sco_out.is_free_running = fake_sco_in.is_free_running =
-      (int (*)(const struct cras_iodev*))fake_is_free_running;
-  fake_is_free_running_called = 0;
-
-  fake_sco_out.output_underrun =
-      (int (*)(struct cras_iodev*))fake_output_underrun;
-  fake_output_underrun_called = 0;
-
-  fake_sco_out.get_valid_frames =
-      (int (*)(struct cras_iodev*, struct timespec*))fake_get_valid_frames;
-  fake_get_valid_frames_called = 0;
-}
-
-namespace {
-
-class HfpAlsaIodev : public testing::Test {
- protected:
-  virtual void SetUp() { ResetStubData(); }
-
-  virtual void TearDown() {}
-};
-
-TEST_F(HfpAlsaIodev, CreateHfpAlsaOutputIodev) {
-  struct cras_iodev* iodev;
-  struct hfp_alsa_io* hfp_alsa_io;
-
-  fake_sco_out.direction = CRAS_STREAM_OUTPUT;
-  iodev = hfp_alsa_iodev_create(&fake_sco_out, fake_device, fake_slc,
-                                CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY);
-  hfp_alsa_io = (struct hfp_alsa_io*)iodev;
-
-  EXPECT_EQ(CRAS_STREAM_OUTPUT, iodev->direction);
-  EXPECT_EQ(1, cras_bt_device_append_iodev_called);
-  EXPECT_EQ(1, cras_iodev_add_node_called);
-  EXPECT_EQ(1, cras_iodev_set_active_node_called);
-  EXPECT_EQ(&fake_sco_out, hfp_alsa_io->aio);
-
-  hfp_alsa_iodev_destroy(iodev);
-
-  EXPECT_EQ(1, cras_bt_device_rm_iodev_called);
-  EXPECT_EQ(1, cras_iodev_rm_node_called);
-  EXPECT_EQ(1, cras_iodev_free_resources_called);
-}
-
-TEST_F(HfpAlsaIodev, CreateHfpAlsaInputIodev) {
-  struct cras_iodev* iodev;
-  struct hfp_alsa_io* hfp_alsa_io;
-
-  fake_sco_in.direction = CRAS_STREAM_INPUT;
-  iodev = hfp_alsa_iodev_create(&fake_sco_in, fake_device, fake_slc,
-                                CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY);
-  hfp_alsa_io = (struct hfp_alsa_io*)iodev;
-
-  EXPECT_EQ(CRAS_STREAM_INPUT, iodev->direction);
-  EXPECT_EQ(1, cras_bt_device_append_iodev_called);
-  EXPECT_EQ(1, cras_iodev_add_node_called);
-  EXPECT_EQ(1, cras_iodev_set_active_node_called);
-  EXPECT_EQ(&fake_sco_in, hfp_alsa_io->aio);
-  /* Input device does not use software gain. */
-  EXPECT_EQ(0, iodev->software_volume_needed);
-
-  hfp_alsa_iodev_destroy(iodev);
-
-  EXPECT_EQ(1, cras_bt_device_rm_iodev_called);
-  EXPECT_EQ(1, cras_iodev_rm_node_called);
-  EXPECT_EQ(1, cras_iodev_free_resources_called);
-}
-
-TEST_F(HfpAlsaIodev, OpenDev) {
-  struct cras_iodev* iodev;
-
-  fake_sco_out.direction = CRAS_STREAM_OUTPUT;
-  iodev = hfp_alsa_iodev_create(&fake_sco_out, fake_device, fake_slc,
-                                CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY);
-  iodev->open_dev(iodev);
-
-  EXPECT_EQ(1, fake_open_dev_called);
-
-  hfp_alsa_iodev_destroy(iodev);
-}
-
-TEST_F(HfpAlsaIodev, UpdateSupportedFormat) {
-  struct cras_iodev* iodev;
-  size_t supported_rates[] = {8000, 0};
-  size_t supported_channel_counts[] = {1, 0};
-  snd_pcm_format_t supported_formats[] = {SND_PCM_FORMAT_S16_LE,
-                                          (snd_pcm_format_t)0};
-
-  fake_sco_out.supported_rates = supported_rates;
-  fake_sco_out.supported_channel_counts = supported_channel_counts;
-  fake_sco_out.supported_formats = supported_formats;
-
-  fake_sco_out.direction = CRAS_STREAM_OUTPUT;
-  iodev = hfp_alsa_iodev_create(&fake_sco_out, fake_device, fake_slc,
-                                CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY);
-  iodev->update_supported_formats(iodev);
-
-  // update_supported_format on alsa_io is not called.
-  EXPECT_EQ(0, fake_update_supported_formats_called);
-  for (size_t i = 0; i < 2; ++i) {
-    EXPECT_EQ(supported_rates[i], iodev->supported_rates[i]);
-    EXPECT_EQ(supported_channel_counts[i], iodev->supported_channel_counts[i]);
-    EXPECT_EQ(supported_formats[i], iodev->supported_formats[i]);
-  }
-
-  hfp_alsa_iodev_destroy(iodev);
-}
-
-TEST_F(HfpAlsaIodev, ConfigureDev) {
-  struct cras_iodev* iodev;
-  size_t buf_size = 8192;
-  struct hfp_alsa_io* hfp_alsa_io;
-
-  fake_sco_out.direction = CRAS_STREAM_OUTPUT;
-  fake_sco_out.buffer_size = buf_size;
-  iodev = hfp_alsa_iodev_create(&fake_sco_out, fake_device, fake_slc,
-                                CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY);
-  hfp_alsa_io = (struct hfp_alsa_io*)iodev;
-  iodev->format = &fake_format;
-  iodev->configure_dev(iodev);
-
-  EXPECT_EQ(fake_format.num_channels, hfp_alsa_io->aio->format->num_channels);
-  EXPECT_EQ(fake_format.frame_rate, hfp_alsa_io->aio->format->frame_rate);
-  EXPECT_EQ(fake_format.format, hfp_alsa_io->aio->format->format);
-  for (int i = 0; i < CRAS_CH_MAX; i++)
-    EXPECT_EQ(fake_format.channel_layout[i],
-              hfp_alsa_io->aio->format->channel_layout[i]);
-
-  EXPECT_EQ(1, fake_configure_dev_called);
-  EXPECT_EQ(1, hfp_set_call_status_called);
-  EXPECT_EQ(buf_size, iodev->buffer_size);
-
-  hfp_alsa_iodev_destroy(iodev);
-}
-
-TEST_F(HfpAlsaIodev, CloseDev) {
-  struct cras_iodev* iodev;
-
-  fake_sco_out.direction = CRAS_STREAM_OUTPUT;
-  iodev = hfp_alsa_iodev_create(&fake_sco_out, fake_device, fake_slc,
-                                CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY);
-  iodev->close_dev(iodev);
-
-  EXPECT_EQ(1, hfp_set_call_status_called);
-  EXPECT_EQ(1, cras_iodev_free_format_called);
-  EXPECT_EQ(1, fake_close_dev_called);
-
-  hfp_alsa_iodev_destroy(iodev);
-}
-
-TEST_F(HfpAlsaIodev, FramesQueued) {
-  struct cras_iodev* iodev;
-
-  fake_sco_out.direction = CRAS_STREAM_OUTPUT;
-  iodev = hfp_alsa_iodev_create(&fake_sco_out, fake_device, fake_slc,
-                                CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY);
-  iodev->frames_queued(iodev, (struct timespec*)NULL);
-
-  EXPECT_EQ(1, fake_frames_queued_called);
-
-  hfp_alsa_iodev_destroy(iodev);
-}
-
-TEST_F(HfpAlsaIodev, DelayFrames) {
-  struct cras_iodev* iodev;
-
-  fake_sco_out.direction = CRAS_STREAM_OUTPUT;
-  iodev = hfp_alsa_iodev_create(&fake_sco_out, fake_device, fake_slc,
-                                CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY);
-  iodev->delay_frames(iodev);
-
-  EXPECT_EQ(1, fake_delay_frames_called);
-
-  hfp_alsa_iodev_destroy(iodev);
-}
-
-TEST_F(HfpAlsaIodev, GetBuffer) {
-  struct cras_iodev* iodev;
-
-  fake_sco_out.direction = CRAS_STREAM_OUTPUT;
-  iodev = hfp_alsa_iodev_create(&fake_sco_out, fake_device, fake_slc,
-                                CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY);
-  iodev->get_buffer(iodev, (struct cras_audio_area**)NULL, (unsigned*)NULL);
-
-  EXPECT_EQ(1, fake_get_buffer_called);
-
-  hfp_alsa_iodev_destroy(iodev);
-}
-
-TEST_F(HfpAlsaIodev, PutBuffer) {
-  struct cras_iodev* iodev;
-
-  fake_sco_out.direction = CRAS_STREAM_OUTPUT;
-  iodev = hfp_alsa_iodev_create(&fake_sco_out, fake_device, fake_slc,
-                                CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY);
-  iodev->put_buffer(iodev, 0xdeadbeef);
-
-  EXPECT_EQ(1, fake_put_buffer_called);
-
-  hfp_alsa_iodev_destroy(iodev);
-}
-
-TEST_F(HfpAlsaIodev, FlushBuffer) {
-  struct cras_iodev* iodev;
-
-  fake_sco_out.direction = CRAS_STREAM_OUTPUT;
-  iodev = hfp_alsa_iodev_create(&fake_sco_out, fake_device, fake_slc,
-                                CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY);
-  iodev->flush_buffer(iodev);
-
-  EXPECT_EQ(1, fake_flush_buffer_called);
-
-  hfp_alsa_iodev_destroy(iodev);
-}
-
-TEST_F(HfpAlsaIodev, UpdateActiveNode) {
-  struct cras_iodev* iodev;
-
-  fake_sco_out.direction = CRAS_STREAM_OUTPUT;
-  iodev = hfp_alsa_iodev_create(&fake_sco_out, fake_device, fake_slc,
-                                CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY);
-  iodev->update_active_node(iodev, 0xdeadbeef, 0xdeadbeef);
-
-  EXPECT_EQ(1, fake_update_active_node_called);
-
-  hfp_alsa_iodev_destroy(iodev);
-}
-
-TEST_F(HfpAlsaIodev, Start) {
-  struct cras_iodev* iodev;
-
-  fake_sco_out.direction = CRAS_STREAM_OUTPUT;
-  iodev = hfp_alsa_iodev_create(&fake_sco_out, fake_device, fake_slc,
-                                CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY);
-  iodev->start(iodev);
-
-  EXPECT_EQ(1, fake_start_called);
-
-  hfp_alsa_iodev_destroy(iodev);
-}
-
-TEST_F(HfpAlsaIodev, SetVolume) {
-  struct cras_iodev* iodev;
-
-  fake_sco_out.direction = CRAS_STREAM_OUTPUT;
-  iodev = hfp_alsa_iodev_create(&fake_sco_out, fake_device, fake_slc,
-                                CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY);
-  iodev->set_volume(iodev);
-
-  EXPECT_EQ(1, hfp_event_speaker_gain_called);
-
-  hfp_alsa_iodev_destroy(iodev);
-}
-
-TEST_F(HfpAlsaIodev, NoStream) {
-  struct cras_iodev* iodev;
-
-  fake_sco_out.direction = CRAS_STREAM_OUTPUT;
-  iodev = hfp_alsa_iodev_create(&fake_sco_out, fake_device, fake_slc,
-                                CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY);
-  iodev->min_cb_level = 0xab;
-  iodev->max_cb_level = 0xcd;
-
-  iodev->no_stream(iodev, 1);
-
-  EXPECT_EQ(0xab, fake_sco_out.min_cb_level);
-  EXPECT_EQ(0xcd, fake_sco_out.max_cb_level);
-  EXPECT_EQ(1, fake_no_stream_called);
-
-  hfp_alsa_iodev_destroy(iodev);
-}
-
-TEST_F(HfpAlsaIodev, IsFreeRunning) {
-  struct cras_iodev* iodev;
-
-  fake_sco_out.direction = CRAS_STREAM_OUTPUT;
-  iodev = hfp_alsa_iodev_create(&fake_sco_out, fake_device, fake_slc,
-                                CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY);
-  iodev->is_free_running(iodev);
-
-  EXPECT_EQ(1, fake_is_free_running_called);
-
-  hfp_alsa_iodev_destroy(iodev);
-}
-
-TEST_F(HfpAlsaIodev, OutputUnderrun) {
-  struct cras_iodev* iodev;
-
-  fake_sco_out.direction = CRAS_STREAM_OUTPUT;
-  iodev = hfp_alsa_iodev_create(&fake_sco_out, fake_device, fake_slc,
-                                CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY);
-  iodev->min_cb_level = 0xab;
-  iodev->max_cb_level = 0xcd;
-
-  iodev->output_underrun(iodev);
-
-  EXPECT_EQ(0xab, fake_sco_out.min_cb_level);
-  EXPECT_EQ(0xcd, fake_sco_out.max_cb_level);
-  EXPECT_EQ(1, fake_output_underrun_called);
-
-  hfp_alsa_iodev_destroy(iodev);
-}
-
-TEST_F(HfpAlsaIodev, GetValidFrames) {
-  struct cras_iodev* iodev;
-  struct timespec ts;
-
-  fake_sco_out.direction = CRAS_STREAM_OUTPUT;
-  iodev = hfp_alsa_iodev_create(&fake_sco_out, fake_device, fake_slc,
-                                CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY);
-
-  iodev->get_valid_frames(iodev, &ts);
-
-  EXPECT_EQ(1, fake_get_valid_frames_called);
-
-  hfp_alsa_iodev_destroy(iodev);
-}
-}  // namespace
-
-extern "C" {
-
-int cras_iodev_set_format(struct cras_iodev* iodev,
-                          const struct cras_audio_format* fmt) {
-  cras_iodev_set_format_called++;
-  return 0;
-}
-
-void cras_iodev_free_format(struct cras_iodev* iodev) {
-  cras_iodev_free_format_called++;
-}
-
-void cras_iodev_add_node(struct cras_iodev* iodev, struct cras_ionode* node) {
-  cras_iodev_add_node_called++;
-  iodev->nodes = node;
-}
-
-void cras_iodev_rm_node(struct cras_iodev* iodev, struct cras_ionode* node) {
-  cras_iodev_rm_node_called++;
-  iodev->nodes = NULL;
-}
-
-void cras_iodev_set_active_node(struct cras_iodev* iodev,
-                                struct cras_ionode* node) {
-  cras_iodev_set_active_node_called++;
-  iodev->active_node = node;
-}
-
-// From ewma_power
-void ewma_power_disable(struct ewma_power* ewma) {}
-
-size_t cras_system_get_volume() {
-  return 0;
-}
-
-const char* cras_bt_device_name(const struct cras_bt_device* device) {
-  return "fake-device-name";
-}
-
-const char* cras_bt_device_address(const struct cras_bt_device* device) {
-  return "1A:2B:3C:4D:5E:6F";
-}
-
-void cras_bt_device_append_iodev(struct cras_bt_device* device,
-                                 struct cras_iodev* iodev,
-                                 enum cras_bt_device_profile profile) {
-  cras_bt_device_append_iodev_called++;
-}
-
-void cras_bt_device_rm_iodev(struct cras_bt_device* device,
-                             struct cras_iodev* iodev) {
-  cras_bt_device_rm_iodev_called++;
-}
-
-const char* cras_bt_device_object_path(const struct cras_bt_device* device) {
-  return "/fake/object/path";
-}
-
-int cras_bt_device_get_stable_id(const struct cras_bt_device* device) {
-  return 123;
-}
-
-void cras_iodev_free_resources(struct cras_iodev* iodev) {
-  cras_iodev_free_resources_called++;
-}
-
-int hfp_set_call_status(struct hfp_slc_handle* handle, int call) {
-  hfp_set_call_status_called++;
-  return 0;
-}
-
-int hfp_event_speaker_gain(struct hfp_slc_handle* handle, int gain) {
-  hfp_event_speaker_gain_called++;
-  return 0;
-}
-
-int cras_bt_device_get_sco(struct cras_bt_device* device, int codec) {
-  return 0;
-}
-
-void cras_bt_device_put_sco(struct cras_bt_device* device) {}
-
-int hfp_slc_get_selected_codec(struct hfp_slc_handle* handle) {
-  return HFP_CODEC_ID_CVSD;
-}
-
-}  // extern "C"
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tests/hfp_info_unittest.cc b/cras/src/tests/hfp_info_unittest.cc
deleted file mode 100644
index 24f536a..0000000
--- a/cras/src/tests/hfp_info_unittest.cc
+++ /dev/null
@@ -1,586 +0,0 @@
-/* Copyright 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <gmock/gmock.h>
-#include <gtest/gtest.h>
-#include <stdint.h>
-#include <time.h>
-
-using testing::MatchesRegex;
-using testing::internal::CaptureStdout;
-using testing::internal::GetCapturedStdout;
-
-extern "C" {
-#include "cras_hfp_info.c"
-#include "sbc_codec_stub.h"
-}
-static struct hfp_info* info;
-static struct cras_iodev dev;
-static cras_audio_format format;
-
-static int cras_msbc_plc_create_called;
-static int cras_msbc_plc_handle_good_frames_called;
-static int cras_msbc_plc_handle_bad_frames_called;
-
-static thread_callback thread_cb;
-static void* cb_data;
-static timespec ts;
-
-void ResetStubData() {
-  sbc_codec_stub_reset();
-  cras_msbc_plc_create_called = 0;
-
-  format.format = SND_PCM_FORMAT_S16_LE;
-  format.num_channels = 1;
-  format.frame_rate = 8000;
-  dev.format = &format;
-}
-
-namespace {
-
-TEST(HfpInfo, AddRmDev) {
-  ResetStubData();
-
-  info = hfp_info_create();
-  ASSERT_NE(info, (void*)NULL);
-  dev.direction = CRAS_STREAM_OUTPUT;
-
-  /* Test add dev */
-  ASSERT_EQ(0, hfp_info_add_iodev(info, dev.direction, dev.format));
-  ASSERT_TRUE(hfp_info_has_iodev(info));
-
-  /* Test remove dev */
-  ASSERT_EQ(0, hfp_info_rm_iodev(info, dev.direction));
-  ASSERT_FALSE(hfp_info_has_iodev(info));
-
-  hfp_info_destroy(info);
-}
-
-TEST(HfpInfo, AddRmDevInvalid) {
-  ResetStubData();
-
-  info = hfp_info_create();
-  ASSERT_NE(info, (void*)NULL);
-
-  dev.direction = CRAS_STREAM_OUTPUT;
-
-  /* Remove an iodev which doesn't exist */
-  ASSERT_NE(0, hfp_info_rm_iodev(info, dev.direction));
-
-  /* Adding an iodev twice returns error code */
-  ASSERT_EQ(0, hfp_info_add_iodev(info, dev.direction, dev.format));
-  ASSERT_NE(0, hfp_info_add_iodev(info, dev.direction, dev.format));
-
-  hfp_info_destroy(info);
-}
-
-TEST(HfpInfo, AcquirePlaybackBuffer) {
-  unsigned buffer_frames, buffer_frames2, queued;
-  uint8_t* samples;
-
-  ResetStubData();
-
-  info = hfp_info_create();
-  ASSERT_NE(info, (void*)NULL);
-
-  hfp_info_start(1, 48, HFP_CODEC_ID_CVSD, info);
-  dev.direction = CRAS_STREAM_OUTPUT;
-  ASSERT_EQ(0, hfp_info_add_iodev(info, dev.direction, dev.format));
-
-  buffer_frames = 500;
-  hfp_buf_acquire(info, dev.direction, &samples, &buffer_frames);
-  ASSERT_EQ(500, buffer_frames);
-
-  hfp_buf_release(info, dev.direction, 500);
-  ASSERT_EQ(500, hfp_buf_queued(info, dev.direction));
-
-  /* Assert the amount of frames of available buffer + queued buf is
-   * greater than or equal to the buffer size, 2 bytes per frame
-   */
-  queued = hfp_buf_queued(info, dev.direction);
-  buffer_frames = 500;
-  hfp_buf_acquire(info, dev.direction, &samples, &buffer_frames);
-  ASSERT_GE(info->playback_buf->used_size / 2, buffer_frames + queued);
-
-  /* Consume all queued data from read buffer */
-  buf_increment_read(info->playback_buf, queued * 2);
-
-  queued = hfp_buf_queued(info, dev.direction);
-  ASSERT_EQ(0, queued);
-
-  /* Assert consecutive acquire buffer will acquire full used size of buffer */
-  buffer_frames = 500;
-  hfp_buf_acquire(info, dev.direction, &samples, &buffer_frames);
-  hfp_buf_release(info, dev.direction, buffer_frames);
-
-  buffer_frames2 = 500;
-  hfp_buf_acquire(info, dev.direction, &samples, &buffer_frames2);
-  hfp_buf_release(info, dev.direction, buffer_frames2);
-
-  ASSERT_GE(info->playback_buf->used_size / 2, buffer_frames + buffer_frames2);
-
-  hfp_info_destroy(info);
-}
-
-TEST(HfpInfo, AcquireCaptureBuffer) {
-  unsigned buffer_frames, buffer_frames2;
-  uint8_t* samples;
-
-  ResetStubData();
-
-  info = hfp_info_create();
-  ASSERT_NE(info, (void*)NULL);
-
-  hfp_info_start(1, 48, HFP_CODEC_ID_CVSD, info);
-  dev.direction = CRAS_STREAM_INPUT;
-  ASSERT_EQ(0, hfp_info_add_iodev(info, dev.direction, dev.format));
-
-  /* Put fake data 100 bytes(50 frames) in capture buf for test */
-  buf_increment_write(info->capture_buf, 100);
-
-  /* Assert successfully acquire and release 100 bytes of data */
-  buffer_frames = 50;
-  hfp_buf_acquire(info, dev.direction, &samples, &buffer_frames);
-  ASSERT_EQ(50, buffer_frames);
-
-  hfp_buf_release(info, dev.direction, buffer_frames);
-  ASSERT_EQ(0, hfp_buf_queued(info, dev.direction));
-
-  /* Push fake data to capture buffer */
-  buf_increment_write(info->capture_buf, info->capture_buf->used_size - 100);
-  buf_increment_write(info->capture_buf, 100);
-
-  /* Assert consecutive acquire call will consume the whole buffer */
-  buffer_frames = 1000;
-  hfp_buf_acquire(info, dev.direction, &samples, &buffer_frames);
-  hfp_buf_release(info, dev.direction, buffer_frames);
-  ASSERT_GE(1000, buffer_frames);
-
-  buffer_frames2 = 1000;
-  hfp_buf_acquire(info, dev.direction, &samples, &buffer_frames2);
-  hfp_buf_release(info, dev.direction, buffer_frames2);
-
-  ASSERT_GE(info->capture_buf->used_size / 2, buffer_frames + buffer_frames2);
-
-  hfp_info_destroy(info);
-}
-
-TEST(HfpInfo, HfpReadWriteFD) {
-  int rc;
-  int sock[2];
-  uint8_t sample[480];
-  uint8_t* buf;
-  unsigned buffer_count;
-
-  ResetStubData();
-
-  ASSERT_EQ(0, socketpair(AF_UNIX, SOCK_STREAM, 0, sock));
-
-  info = hfp_info_create();
-  ASSERT_NE(info, (void*)NULL);
-
-  dev.direction = CRAS_STREAM_INPUT;
-  hfp_info_start(sock[1], 48, HFP_CODEC_ID_CVSD, info);
-  ASSERT_EQ(0, hfp_info_add_iodev(info, dev.direction, dev.format));
-
-  /* Mock the sco fd and send some fake data */
-  send(sock[0], sample, 48, 0);
-
-  rc = hfp_read(info);
-  ASSERT_EQ(48, rc);
-
-  rc = hfp_buf_queued(info, dev.direction);
-  ASSERT_EQ(48 / 2, rc);
-
-  /* Fill the write buffer*/
-  buffer_count = info->capture_buf->used_size;
-  buf = buf_write_pointer_size(info->capture_buf, &buffer_count);
-  buf_increment_write(info->capture_buf, buffer_count);
-  ASSERT_NE((void*)NULL, buf);
-
-  rc = hfp_read(info);
-  ASSERT_EQ(0, rc);
-
-  ASSERT_EQ(0, hfp_info_rm_iodev(info, dev.direction));
-  dev.direction = CRAS_STREAM_OUTPUT;
-  ASSERT_EQ(0, hfp_info_add_iodev(info, dev.direction, dev.format));
-
-  /* Initial buffer is empty */
-  rc = hfp_write(info);
-  ASSERT_EQ(0, rc);
-
-  buffer_count = 1024;
-  buf = buf_write_pointer_size(info->playback_buf, &buffer_count);
-  buf_increment_write(info->playback_buf, buffer_count);
-
-  rc = hfp_write(info);
-  ASSERT_EQ(48, rc);
-
-  rc = recv(sock[0], sample, 48, 0);
-  ASSERT_EQ(48, rc);
-
-  hfp_info_destroy(info);
-}
-
-TEST(HfpInfo, StartHfpInfo) {
-  int sock[2];
-
-  ASSERT_EQ(0, socketpair(AF_UNIX, SOCK_STREAM, 0, sock));
-
-  info = hfp_info_create();
-  ASSERT_NE(info, (void*)NULL);
-
-  hfp_info_start(sock[0], 48, HFP_CODEC_ID_CVSD, info);
-  ASSERT_EQ(1, hfp_info_running(info));
-  ASSERT_EQ(cb_data, (void*)info);
-
-  hfp_info_stop(info);
-  ASSERT_EQ(0, hfp_info_running(info));
-  ASSERT_EQ(NULL, cb_data);
-
-  hfp_info_destroy(info);
-}
-
-TEST(HfpInfo, StartHfpInfoAndRead) {
-  int rc;
-  int sock[2];
-  uint8_t sample[480];
-
-  ResetStubData();
-
-  ASSERT_EQ(0, socketpair(AF_UNIX, SOCK_STREAM, 0, sock));
-
-  info = hfp_info_create();
-  ASSERT_NE(info, (void*)NULL);
-
-  /* Start and send two chunk of fake data */
-  hfp_info_start(sock[1], 48, HFP_CODEC_ID_CVSD, info);
-  send(sock[0], sample, 48, 0);
-  send(sock[0], sample, 48, 0);
-
-  /* Trigger thread callback */
-  thread_cb((struct hfp_info*)cb_data, POLLIN);
-
-  dev.direction = CRAS_STREAM_INPUT;
-  ASSERT_EQ(0, hfp_info_add_iodev(info, dev.direction, dev.format));
-
-  /* Expect no data read, since no idev present at previous thread callback */
-  rc = hfp_buf_queued(info, dev.direction);
-  ASSERT_EQ(0, rc);
-
-  /* Trigger thread callback after idev added. */
-  ts.tv_sec = 0;
-  ts.tv_nsec = 5000000;
-  thread_cb((struct hfp_info*)cb_data, POLLIN);
-
-  rc = hfp_buf_queued(info, dev.direction);
-  ASSERT_EQ(48 / 2, rc);
-
-  /* Assert wait time is unchanged. */
-  ASSERT_EQ(0, ts.tv_sec);
-  ASSERT_EQ(5000000, ts.tv_nsec);
-
-  hfp_info_stop(info);
-  ASSERT_EQ(0, hfp_info_running(info));
-
-  hfp_info_destroy(info);
-}
-
-TEST(HfpInfo, StartHfpInfoAndWrite) {
-  int rc;
-  int sock[2];
-  uint8_t sample[480];
-
-  ResetStubData();
-
-  ASSERT_EQ(0, socketpair(AF_UNIX, SOCK_STREAM, 0, sock));
-
-  info = hfp_info_create();
-  ASSERT_NE(info, (void*)NULL);
-
-  hfp_info_start(sock[1], 48, HFP_CODEC_ID_CVSD, info);
-  send(sock[0], sample, 48, 0);
-  send(sock[0], sample, 48, 0);
-
-  /* Trigger thread callback */
-  thread_cb((struct hfp_info*)cb_data, POLLIN);
-
-  /* Without odev in presence, zero packet should be sent. */
-  rc = recv(sock[0], sample, 48, 0);
-  ASSERT_EQ(48, rc);
-
-  dev.direction = CRAS_STREAM_OUTPUT;
-  ASSERT_EQ(0, hfp_info_add_iodev(info, dev.direction, dev.format));
-
-  /* Assert queued samples unchanged before output device added */
-  ASSERT_EQ(0, hfp_buf_queued(info, dev.direction));
-
-  /* Put some fake data and trigger thread callback again */
-  buf_increment_write(info->playback_buf, 1008);
-  thread_cb((struct hfp_info*)cb_data, POLLIN);
-
-  /* Assert some samples written */
-  rc = recv(sock[0], sample, 48, 0);
-  ASSERT_EQ(48, rc);
-  ASSERT_EQ(480, hfp_buf_queued(info, dev.direction));
-
-  hfp_info_stop(info);
-  hfp_info_destroy(info);
-}
-
-void send_mSBC_packet(int fd, unsigned seq, int broken_pkt) {
-  /* The first three bytes of hci_sco_buf are h2 header, frame count and mSBC
-   * sync word. The second octet of H2 header is composed by 4 bits fixed 0x8
-   * and 4 bits sequence number 0000, 0011, 1100, 1111.
-   */
-  uint8_t headers[4] = {0x08, 0x38, 0xc8, 0xf8};
-  uint8_t hci_sco_buf[] = {
-      0x01, 0x00, 0xAD, 0xad, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, 0x00, 0x77,
-      0x6d, 0xb6, 0xdd, 0xdb, 0x6d, 0xb7, 0x76, 0xdb, 0x6d, 0xdd, 0xb6, 0xdb,
-      0x77, 0x6d, 0xb6, 0xdd, 0xdb, 0x6d, 0xb7, 0x76, 0xdb, 0x6d, 0xdd, 0xb6,
-      0xdb, 0x77, 0x6d, 0xb6, 0xdd, 0xdb, 0x6d, 0xb7, 0x76, 0xdb, 0x6d, 0xdd,
-      0xb6, 0xdb, 0x77, 0x6d, 0xb6, 0xdd, 0xdb, 0x6d, 0xb7, 0x76, 0xdb, 0x6c};
-  struct msghdr msg = {0};
-  struct iovec iov;
-  struct cmsghdr* cmsg;
-  const unsigned int control_size = CMSG_SPACE(sizeof(int));
-  char control[control_size] = {0};
-  uint8_t pkt_status = 0;
-
-  hci_sco_buf[1] = headers[seq % 4];
-
-  /* Assume typical 60 bytes case. */
-  msg.msg_iov = &iov;
-  msg.msg_iovlen = 1;
-  iov.iov_base = hci_sco_buf;
-  iov.iov_len = 60;
-  msg.msg_control = control;
-  msg.msg_controllen = control_size;
-
-  if (broken_pkt)
-    pkt_status = 0x11;
-
-  cmsg = CMSG_FIRSTHDR(&msg);
-  cmsg->cmsg_level = SOL_BLUETOOTH;
-  cmsg->cmsg_type = BT_SCM_PKT_STATUS;
-  cmsg->cmsg_len = CMSG_LEN(sizeof(pkt_status));
-  memcpy(CMSG_DATA(cmsg), &pkt_status, sizeof(pkt_status));
-
-  sendmsg(fd, &msg, 0);
-}
-
-TEST(HfpInfo, StartHfpInfoAndReadMsbc) {
-  int sock[2];
-  int pkt_count = 0;
-  int rc;
-  uint8_t sample[480];
-  ResetStubData();
-
-  ASSERT_EQ(0, socketpair(AF_UNIX, SOCK_STREAM, 0, sock));
-
-  set_sbc_codec_decoded_out(MSBC_CODE_SIZE);
-
-  info = hfp_info_create();
-  ASSERT_NE(info, (void*)NULL);
-  ASSERT_EQ(0, get_msbc_codec_create_called());
-  ASSERT_EQ(0, cras_msbc_plc_create_called);
-
-  /* Start and send an mSBC packets with all zero samples */
-  hfp_info_start(sock[1], 63, HFP_CODEC_ID_MSBC, info);
-  ASSERT_EQ(2, get_msbc_codec_create_called());
-  ASSERT_EQ(1, cras_msbc_plc_create_called);
-  send_mSBC_packet(sock[0], pkt_count++, 0);
-
-  /* Trigger thread callback */
-  thread_cb((struct hfp_info*)cb_data, POLLIN);
-
-  /* Expect one empty mSBC packet is send, because no odev in presence. */
-  rc = recv(sock[0], sample, MSBC_PKT_SIZE, 0);
-  ASSERT_EQ(MSBC_PKT_SIZE, rc);
-
-  dev.direction = CRAS_STREAM_INPUT;
-  ASSERT_EQ(0, hfp_info_add_iodev(info, dev.direction, dev.format));
-
-  /* Expect no data read, since no idev present at previous thread callback */
-  ASSERT_EQ(0, hfp_buf_queued(info, dev.direction));
-
-  send_mSBC_packet(sock[0], pkt_count, 0);
-
-  /* Trigger thread callback after idev added. */
-  thread_cb((struct hfp_info*)cb_data, POLLIN);
-  rc = recv(sock[0], sample, MSBC_PKT_SIZE, 0);
-  ASSERT_EQ(MSBC_PKT_SIZE, rc);
-
-  ASSERT_EQ(pkt_count * MSBC_CODE_SIZE / 2,
-            hfp_buf_queued(info, dev.direction));
-  ASSERT_EQ(2, cras_msbc_plc_handle_good_frames_called);
-  pkt_count++;
-  /* When the third packet is lost, we should call the handle_bad_packet and
-   * still have right size of samples queued
-   */
-  pkt_count++;
-  send_mSBC_packet(sock[0], pkt_count, 0);
-  thread_cb((struct hfp_info*)cb_data, POLLIN);
-  rc = recv(sock[0], sample, MSBC_PKT_SIZE, 0);
-  ASSERT_EQ(MSBC_PKT_SIZE, rc);
-
-  /* Packet 1, 2, 4 are all good frames */
-  ASSERT_EQ(3, cras_msbc_plc_handle_good_frames_called);
-  ASSERT_EQ(1, cras_msbc_plc_handle_bad_frames_called);
-  ASSERT_EQ(pkt_count * MSBC_CODE_SIZE / 2,
-            hfp_buf_queued(info, dev.direction));
-  pkt_count++;
-  /* If the erroneous data reporting marks the packet as broken, we should
-   * also call the handle_bad_packet and have the right size of samples queued.
-   */
-  send_mSBC_packet(sock[0], pkt_count, 1);
-
-  set_sbc_codec_decoded_fail(1);
-
-  thread_cb((struct hfp_info*)cb_data, POLLIN);
-  rc = recv(sock[0], sample, MSBC_PKT_SIZE, 0);
-  ASSERT_EQ(MSBC_PKT_SIZE, rc);
-
-  ASSERT_EQ(3, cras_msbc_plc_handle_good_frames_called);
-  ASSERT_EQ(2, cras_msbc_plc_handle_bad_frames_called);
-  ASSERT_EQ(pkt_count * MSBC_CODE_SIZE / 2,
-            hfp_buf_queued(info, dev.direction));
-  pkt_count++;
-  /* If we can't decode the packet, we should also call the handle_bad_packet
-   * and have the right size of samples queued
-   */
-  send_mSBC_packet(sock[0], pkt_count, 0);
-
-  set_sbc_codec_decoded_fail(1);
-
-  thread_cb((struct hfp_info*)cb_data, POLLIN);
-  rc = recv(sock[0], sample, MSBC_PKT_SIZE, 0);
-  ASSERT_EQ(MSBC_PKT_SIZE, rc);
-
-  ASSERT_EQ(3, cras_msbc_plc_handle_good_frames_called);
-  ASSERT_EQ(3, cras_msbc_plc_handle_bad_frames_called);
-  ASSERT_EQ(pkt_count * MSBC_CODE_SIZE / 2,
-            hfp_buf_queued(info, dev.direction));
-
-  hfp_info_stop(info);
-  ASSERT_EQ(0, hfp_info_running(info));
-
-  hfp_info_destroy(info);
-}
-
-TEST(HfpInfo, StartHfpInfoAndWriteMsbc) {
-  int rc;
-  int sock[2];
-  uint8_t sample[480];
-
-  ResetStubData();
-
-  set_sbc_codec_encoded_out(57);
-  ASSERT_EQ(0, socketpair(AF_UNIX, SOCK_STREAM, 0, sock));
-
-  info = hfp_info_create();
-  ASSERT_NE(info, (void*)NULL);
-
-  hfp_info_start(sock[1], 63, HFP_CODEC_ID_MSBC, info);
-  send(sock[0], sample, 63, 0);
-
-  /* Trigger thread callback */
-  thread_cb((struct hfp_info*)cb_data, POLLIN);
-
-  dev.direction = CRAS_STREAM_OUTPUT;
-  ASSERT_EQ(0, hfp_info_add_iodev(info, dev.direction, dev.format));
-
-  /* Assert queued samples unchanged before output device added */
-  ASSERT_EQ(0, hfp_buf_queued(info, dev.direction));
-
-  /* Put some fake data and trigger thread callback again */
-  send(sock[0], sample, 63, 0);
-  buf_increment_write(info->playback_buf, 240);
-  thread_cb((struct hfp_info*)cb_data, POLLIN);
-
-  /* Assert some samples written */
-  rc = recv(sock[0], sample, 60, 0);
-  ASSERT_EQ(60, rc);
-  ASSERT_EQ(0, hfp_buf_queued(info, dev.direction));
-
-  hfp_info_stop(info);
-  hfp_info_destroy(info);
-}
-
-TEST(HfpInfo, WBSLoggerPacketStatusDumpBinary) {
-  struct packet_status_logger logger;
-  char log_regex[64];
-  int num_wraps[5] = {0, 0, 0, 1, 1};
-  int wp[5] = {40, 150, 162, 100, 32};
-
-  /* Expect the log line wraps at correct length to avoid feedback redact. */
-  snprintf(log_regex, 64, "([01D]{%d}\n)*", PACKET_STATUS_LOG_LINE_WRAP);
-
-  packet_status_logger_init(&logger);
-  logger.size = PACKET_STATUS_LEN_BYTES * 8;
-  for (int i = 0; i < 5; i++) {
-    CaptureStdout();
-    logger.num_wraps = num_wraps[i];
-    logger.wp = wp[i];
-    packet_status_logger_dump_binary(&logger);
-    EXPECT_THAT(GetCapturedStdout(), MatchesRegex(log_regex));
-  }
-}
-
-}  // namespace
-
-extern "C" {
-
-struct audio_thread* cras_iodev_list_get_audio_thread() {
-  return NULL;
-}
-
-void audio_thread_add_events_callback(int fd,
-                                      thread_callback cb,
-                                      void* data,
-                                      int events) {
-  thread_cb = cb;
-  cb_data = data;
-  return;
-}
-
-int audio_thread_rm_callback_sync(struct audio_thread* thread, int fd) {
-  thread_cb = NULL;
-  cb_data = NULL;
-  return 0;
-}
-
-void audio_thread_rm_callback(int fd) {}
-
-struct cras_msbc_plc* cras_msbc_plc_create() {
-  cras_msbc_plc_create_called++;
-  return NULL;
-}
-
-void cras_msbc_plc_destroy(struct cras_msbc_plc* plc) {}
-
-int cras_msbc_plc_handle_bad_frames(struct cras_msbc_plc* plc,
-                                    struct cras_audio_codec* codec,
-                                    uint8_t* output) {
-  cras_msbc_plc_handle_bad_frames_called++;
-  return MSBC_CODE_SIZE;
-}
-
-int cras_msbc_plc_handle_good_frames(struct cras_msbc_plc* plc,
-                                     const uint8_t* input,
-                                     uint8_t* output) {
-  cras_msbc_plc_handle_good_frames_called++;
-  return MSBC_CODE_SIZE;
-}
-void packet_status_logger_init(struct packet_status_logger* logger) {}
-
-void packet_status_logger_update(struct packet_status_logger* logger,
-                                 bool val) {}
-}
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tests/hfp_iodev_unittest.cc b/cras/src/tests/hfp_iodev_unittest.cc
deleted file mode 100644
index 1275ef2..0000000
--- a/cras/src/tests/hfp_iodev_unittest.cc
+++ /dev/null
@@ -1,409 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <gtest/gtest.h>
-
-extern "C" {
-#include "cras_audio_area.h"
-#include "cras_hfp_info.h"
-#include "cras_hfp_iodev.h"
-#include "cras_hfp_slc.h"
-#include "cras_iodev.h"
-}
-
-static struct cras_iodev* iodev;
-static struct cras_bt_device* fake_device;
-static struct hfp_slc_handle* fake_slc;
-static struct hfp_info* fake_info;
-struct cras_audio_format fake_format;
-static size_t cras_bt_device_append_iodev_called;
-static size_t cras_bt_device_rm_iodev_called;
-static size_t cras_iodev_add_node_called;
-static size_t cras_iodev_rm_node_called;
-static size_t cras_iodev_set_active_node_called;
-static size_t cras_iodev_free_format_called;
-static size_t cras_iodev_free_resources_called;
-static size_t cras_bt_device_sco_connect_called;
-static int cras_bt_transport_sco_connect_return_val;
-static size_t hfp_info_add_iodev_called;
-static size_t hfp_info_rm_iodev_called;
-static size_t hfp_info_running_called;
-static int hfp_info_running_return_val;
-static size_t hfp_info_has_iodev_called;
-static int hfp_info_has_iodev_return_val;
-static size_t hfp_info_start_called;
-static size_t hfp_info_stop_called;
-static size_t hfp_buf_acquire_called;
-static unsigned hfp_buf_acquire_return_val;
-static size_t hfp_buf_release_called;
-static unsigned hfp_buf_release_nwritten_val;
-static size_t hfp_fill_output_with_zeros_called;
-static size_t hfp_force_output_level_called;
-static size_t hfp_force_output_level_target;
-static size_t fake_buffer_size = 500;
-static cras_audio_area* mock_audio_area;
-
-void ResetStubData() {
-  cras_bt_device_append_iodev_called = 0;
-  cras_bt_device_rm_iodev_called = 0;
-  cras_iodev_add_node_called = 0;
-  cras_iodev_rm_node_called = 0;
-  cras_iodev_set_active_node_called = 0;
-  cras_iodev_free_format_called = 0;
-  cras_iodev_free_resources_called = 0;
-  cras_bt_device_sco_connect_called = 0;
-  cras_bt_transport_sco_connect_return_val = 0;
-  hfp_info_add_iodev_called = 0;
-  hfp_info_rm_iodev_called = 0;
-  hfp_info_running_called = 0;
-  hfp_info_running_return_val = 1;
-  hfp_info_has_iodev_called = 0;
-  hfp_info_has_iodev_return_val = 0;
-  hfp_info_start_called = 0;
-  hfp_info_stop_called = 0;
-  hfp_buf_acquire_called = 0;
-  hfp_buf_acquire_return_val = 0;
-  hfp_buf_release_called = 0;
-  hfp_buf_release_nwritten_val = 0;
-  hfp_fill_output_with_zeros_called = 0;
-  hfp_force_output_level_called = 0;
-  hfp_force_output_level_target = 0;
-
-  fake_info = reinterpret_cast<struct hfp_info*>(0x123);
-
-  if (!mock_audio_area) {
-    mock_audio_area = (cras_audio_area*)calloc(
-        1, sizeof(*mock_audio_area) + sizeof(cras_channel_area) * 2);
-  }
-}
-
-namespace {
-
-class HfpIodev : public testing::Test {
- protected:
-  virtual void SetUp() { ResetStubData(); }
-
-  virtual void TearDown() {
-    free(mock_audio_area);
-    mock_audio_area = NULL;
-  }
-};
-
-TEST_F(HfpIodev, CreateHfpOutputIodev) {
-  iodev = hfp_iodev_create(CRAS_STREAM_OUTPUT, fake_device, fake_slc,
-                           CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY, fake_info);
-
-  ASSERT_EQ(CRAS_STREAM_OUTPUT, iodev->direction);
-  ASSERT_EQ(1, cras_bt_device_append_iodev_called);
-  ASSERT_EQ(1, cras_iodev_add_node_called);
-  ASSERT_EQ(1, cras_iodev_set_active_node_called);
-
-  hfp_iodev_destroy(iodev);
-
-  ASSERT_EQ(1, cras_bt_device_rm_iodev_called);
-  ASSERT_EQ(1, cras_iodev_rm_node_called);
-  ASSERT_EQ(1, cras_iodev_free_resources_called);
-}
-
-TEST_F(HfpIodev, CreateHfpInputIodev) {
-  iodev = hfp_iodev_create(CRAS_STREAM_INPUT, fake_device, fake_slc,
-                           CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY, fake_info);
-
-  ASSERT_EQ(CRAS_STREAM_INPUT, iodev->direction);
-  ASSERT_EQ(1, cras_bt_device_append_iodev_called);
-  ASSERT_EQ(1, cras_iodev_add_node_called);
-  ASSERT_EQ(1, cras_iodev_set_active_node_called);
-  /* Input device does not use software gain. */
-  ASSERT_EQ(0, iodev->software_volume_needed);
-
-  hfp_iodev_destroy(iodev);
-
-  ASSERT_EQ(1, cras_bt_device_rm_iodev_called);
-  ASSERT_EQ(1, cras_iodev_rm_node_called);
-  ASSERT_EQ(1, cras_iodev_free_resources_called);
-}
-
-TEST_F(HfpIodev, OpenHfpIodev) {
-  iodev = hfp_iodev_create(CRAS_STREAM_OUTPUT, fake_device, fake_slc,
-                           CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY, fake_info);
-  iodev->format = &fake_format;
-
-  /* hfp_info not start yet */
-  hfp_info_running_return_val = 0;
-  iodev->configure_dev(iodev);
-
-  ASSERT_EQ(1, cras_bt_device_sco_connect_called);
-  ASSERT_EQ(1, hfp_info_start_called);
-  ASSERT_EQ(1, hfp_info_add_iodev_called);
-
-  /* hfp_info is running now */
-  hfp_info_running_return_val = 1;
-
-  iodev->close_dev(iodev);
-  hfp_iodev_destroy(iodev);
-  ASSERT_EQ(1, hfp_info_rm_iodev_called);
-  ASSERT_EQ(1, hfp_info_stop_called);
-  ASSERT_EQ(1, cras_iodev_free_format_called);
-  ASSERT_EQ(1, cras_iodev_free_resources_called);
-}
-
-TEST_F(HfpIodev, OpenIodevWithHfpInfoAlreadyRunning) {
-  iodev = hfp_iodev_create(CRAS_STREAM_INPUT, fake_device, fake_slc,
-                           CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY, fake_info);
-
-  iodev->format = &fake_format;
-
-  /* hfp_info already started by another device */
-  hfp_info_running_return_val = 1;
-  iodev->configure_dev(iodev);
-
-  ASSERT_EQ(0, cras_bt_device_sco_connect_called);
-  ASSERT_EQ(0, hfp_info_start_called);
-  ASSERT_EQ(1, hfp_info_add_iodev_called);
-
-  hfp_info_has_iodev_return_val = 1;
-  iodev->close_dev(iodev);
-  hfp_iodev_destroy(iodev);
-  ASSERT_EQ(1, hfp_info_rm_iodev_called);
-  ASSERT_EQ(0, hfp_info_stop_called);
-  ASSERT_EQ(1, cras_iodev_free_format_called);
-  ASSERT_EQ(1, cras_iodev_free_resources_called);
-}
-
-TEST_F(HfpIodev, PutGetBuffer) {
-  cras_audio_area* area;
-  unsigned frames;
-
-  ResetStubData();
-  iodev = hfp_iodev_create(CRAS_STREAM_OUTPUT, fake_device, fake_slc,
-                           CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY, fake_info);
-  iodev->format = &fake_format;
-  iodev->configure_dev(iodev);
-
-  hfp_buf_acquire_return_val = 100;
-  iodev->get_buffer(iodev, &area, &frames);
-
-  ASSERT_EQ(1, hfp_buf_acquire_called);
-  ASSERT_EQ(100, frames);
-
-  iodev->put_buffer(iodev, 40);
-  ASSERT_EQ(1, hfp_buf_release_called);
-  ASSERT_EQ(40, hfp_buf_release_nwritten_val);
-  hfp_iodev_destroy(iodev);
-  ASSERT_EQ(1, cras_iodev_free_resources_called);
-}
-
-TEST_F(HfpIodev, NoStreamState) {
-  cras_audio_area* area;
-  unsigned frames;
-
-  ResetStubData();
-  iodev = hfp_iodev_create(CRAS_STREAM_OUTPUT, fake_device, fake_slc,
-                           CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY, fake_info);
-  iodev->format = &fake_format;
-  iodev->configure_dev(iodev);
-  iodev->min_cb_level = iodev->buffer_size / 2;
-
-  hfp_buf_acquire_return_val = 100;
-  iodev->get_buffer(iodev, &area, &frames);
-  iodev->put_buffer(iodev, 100);
-
-  iodev->no_stream(iodev, 1);
-  ASSERT_EQ(1, hfp_fill_output_with_zeros_called);
-
-  iodev->no_stream(iodev, 0);
-  ASSERT_EQ(1, hfp_force_output_level_called);
-  ASSERT_EQ(fake_buffer_size / 2, hfp_force_output_level_target);
-
-  hfp_iodev_destroy(iodev);
-}
-
-}  // namespace
-
-extern "C" {
-void cras_iodev_free_format(struct cras_iodev* iodev) {
-  cras_iodev_free_format_called++;
-}
-
-void cras_iodev_add_node(struct cras_iodev* iodev, struct cras_ionode* node) {
-  cras_iodev_add_node_called++;
-  iodev->nodes = node;
-}
-
-void cras_iodev_rm_node(struct cras_iodev* iodev, struct cras_ionode* node) {
-  cras_iodev_rm_node_called++;
-  iodev->nodes = NULL;
-}
-
-void cras_iodev_set_active_node(struct cras_iodev* iodev,
-                                struct cras_ionode* node) {
-  cras_iodev_set_active_node_called++;
-  iodev->active_node = node;
-}
-
-// From ewma_power
-void ewma_power_disable(struct ewma_power* ewma) {}
-
-//  From system_state.
-size_t cras_system_get_volume() {
-  return 0;
-}
-
-// From bt device
-int cras_bt_device_sco_connect(struct cras_bt_device* device, int codec) {
-  cras_bt_device_sco_connect_called++;
-  return cras_bt_transport_sco_connect_return_val;
-}
-
-const char* cras_bt_device_name(const struct cras_bt_device* device) {
-  return "fake-device-name";
-}
-
-const char* cras_bt_device_address(const struct cras_bt_device* device) {
-  return "1A:2B:3C:4D:5E:6F";
-}
-
-void cras_bt_device_append_iodev(struct cras_bt_device* device,
-                                 struct cras_iodev* iodev,
-                                 enum cras_bt_device_profile profile) {
-  cras_bt_device_append_iodev_called++;
-}
-
-void cras_bt_device_rm_iodev(struct cras_bt_device* device,
-                             struct cras_iodev* iodev) {
-  cras_bt_device_rm_iodev_called++;
-}
-
-int cras_bt_device_sco_packet_size(struct cras_bt_device* device,
-                                   int sco_socket,
-                                   int codec) {
-  return 48;
-}
-const char* cras_bt_device_object_path(const struct cras_bt_device* device) {
-  return "/fake/object/path";
-}
-
-int cras_bt_device_get_stable_id(const struct cras_bt_device* device) {
-  return 123;
-}
-
-// From cras_hfp_info
-int hfp_info_add_iodev(struct hfp_info* info,
-                       enum CRAS_STREAM_DIRECTION direction,
-                       struct cras_audio_format* format) {
-  hfp_info_add_iodev_called++;
-  return 0;
-}
-
-int hfp_info_rm_iodev(struct hfp_info* info,
-                      enum CRAS_STREAM_DIRECTION direction) {
-  hfp_info_rm_iodev_called++;
-  return 0;
-}
-
-int hfp_info_has_iodev(struct hfp_info* info) {
-  hfp_info_has_iodev_called++;
-  return hfp_info_has_iodev_return_val;
-}
-
-int hfp_info_running(struct hfp_info* info) {
-  hfp_info_running_called++;
-  return hfp_info_running_return_val;
-}
-
-int hfp_info_start(int fd, unsigned int mtu, int codec, struct hfp_info* info) {
-  hfp_info_start_called++;
-  return 0;
-}
-
-int hfp_info_stop(struct hfp_info* info) {
-  hfp_info_stop_called++;
-  return 0;
-}
-
-int hfp_buf_queued(struct hfp_info* info,
-                   const enum CRAS_STREAM_DIRECTION direction) {
-  return 0;
-}
-
-int hfp_buf_size(struct hfp_info* info, enum CRAS_STREAM_DIRECTION direction) {
-  return fake_buffer_size;
-}
-
-void hfp_buf_acquire(struct hfp_info* info,
-                     enum CRAS_STREAM_DIRECTION direction,
-                     uint8_t** buf,
-                     unsigned* count) {
-  hfp_buf_acquire_called++;
-  *count = hfp_buf_acquire_return_val;
-}
-
-void hfp_buf_release(struct hfp_info* info,
-                     enum CRAS_STREAM_DIRECTION direction,
-                     unsigned written_bytes) {
-  hfp_buf_release_called++;
-  hfp_buf_release_nwritten_val = written_bytes;
-}
-
-int hfp_fill_output_with_zeros(struct hfp_info* info, unsigned int nframes) {
-  hfp_fill_output_with_zeros_called++;
-  return 0;
-}
-
-void hfp_force_output_level(struct hfp_info* info, unsigned int level) {
-  hfp_force_output_level_called++;
-  hfp_force_output_level_target = level;
-}
-
-void cras_iodev_init_audio_area(struct cras_iodev* iodev, int num_channels) {
-  iodev->area = mock_audio_area;
-}
-
-void cras_iodev_free_audio_area(struct cras_iodev* iodev) {}
-
-void cras_iodev_free_resources(struct cras_iodev* iodev) {
-  cras_iodev_free_resources_called++;
-}
-
-int cras_iodev_fill_odev_zeros(struct cras_iodev* odev, unsigned int frames) {
-  return 0;
-}
-
-void cras_audio_area_config_buf_pointers(struct cras_audio_area* area,
-                                         const struct cras_audio_format* fmt,
-                                         uint8_t* base_buffer) {
-  mock_audio_area->channels[0].buf = base_buffer;
-}
-
-int hfp_set_call_status(struct hfp_slc_handle* handle, int call) {
-  return 0;
-}
-
-int hfp_event_speaker_gain(struct hfp_slc_handle* handle, int gain) {
-  return 0;
-}
-
-int hfp_slc_get_selected_codec(struct hfp_slc_handle* handle) {
-  return HFP_CODEC_ID_CVSD;
-}
-
-bool hfp_slc_get_wideband_speech_supported(struct hfp_slc_handle* handle) {
-  return false;
-}
-
-int hfp_slc_codec_connection_setup(struct hfp_slc_handle* handle) {
-  return 0;
-}
-
-int hfp_slc_is_hsp(struct hfp_slc_handle* handle) {
-  return 0;
-}
-
-}  // extern "C"
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tests/hfp_slc_unittest.cc b/cras/src/tests/hfp_slc_unittest.cc
deleted file mode 100644
index 966278f..0000000
--- a/cras/src/tests/hfp_slc_unittest.cc
+++ /dev/null
@@ -1,457 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <gtest/gtest.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <sys/socket.h>
-
-extern "C" {
-#include "cras_bt_log.h"
-#include "cras_hfp_slc.h"
-#include "cras_telephony.h"
-}
-
-static struct hfp_slc_handle* handle;
-static struct cras_telephony_handle fake_telephony;
-static int cras_bt_device_update_hardware_volume_called;
-static int cras_observer_notify_bt_batter_changed_called;
-static int slc_initialized_cb_called;
-static int slc_disconnected_cb_called;
-static int cras_system_add_select_fd_called;
-static void (*slc_cb)(void* data);
-static void* slc_cb_data;
-static int fake_errno;
-static struct cras_bt_device* device =
-    reinterpret_cast<struct cras_bt_device*>(2);
-static void (*cras_tm_timer_cb)(struct cras_timer* t, void* data);
-static void* cras_tm_timer_cb_data;
-
-int slc_initialized_cb(struct hfp_slc_handle* handle);
-int slc_disconnected_cb(struct hfp_slc_handle* handle);
-
-void ResetStubData() {
-  slc_initialized_cb_called = 0;
-  cras_system_add_select_fd_called = 0;
-  cras_bt_device_update_hardware_volume_called = 0;
-  cras_observer_notify_bt_batter_changed_called = 0;
-  slc_cb = NULL;
-  slc_cb_data = NULL;
-}
-
-namespace {
-
-TEST(HfpSlc, CreateSlcHandle) {
-  ResetStubData();
-
-  handle = hfp_slc_create(0, 0, AG_ENHANCED_CALL_STATUS, device,
-                          slc_initialized_cb, slc_disconnected_cb);
-  ASSERT_EQ(1, cras_system_add_select_fd_called);
-  ASSERT_EQ(handle, slc_cb_data);
-
-  hfp_slc_destroy(handle);
-}
-
-TEST(HfpSlc, InitializeSlc) {
-  int err;
-  int sock[2];
-  char buf[256];
-  char* chp;
-  ResetStubData();
-
-  btlog = cras_bt_event_log_init();
-
-  ASSERT_EQ(0, socketpair(AF_UNIX, SOCK_STREAM, 0, sock));
-  handle = hfp_slc_create(sock[0], 0, AG_ENHANCED_CALL_STATUS, device,
-                          slc_initialized_cb, slc_disconnected_cb);
-
-  err = write(sock[1], "AT+CIND=?\r", 10);
-  ASSERT_EQ(10, err);
-  slc_cb(slc_cb_data);
-  err = read(sock[1], buf, 256);
-
-  /* Assert "\r\n+CIND: ... \r\n" response is received */
-  chp = strstr(buf, "\r\n");
-  ASSERT_NE((void*)NULL, (void*)chp);
-  ASSERT_EQ(0, strncmp("\r\n+CIND:", chp, 8));
-  chp += 2;
-  chp = strstr(chp, "\r\n");
-  ASSERT_NE((void*)NULL, (void*)chp);
-
-  /* Assert "\r\nOK\r\n" response is received */
-  chp += 2;
-  chp = strstr(chp, "\r\n");
-  ASSERT_NE((void*)NULL, (void*)chp);
-  ASSERT_EQ(0, strncmp("\r\nOK", chp, 4));
-
-  err = write(sock[1], "AT+CMER=3,0,0,1\r", 16);
-  ASSERT_EQ(16, err);
-  slc_cb(slc_cb_data);
-
-  ASSERT_EQ(1, slc_initialized_cb_called);
-
-  /* Assert "\r\nOK\r\n" response is received */
-  err = read(sock[1], buf, 256);
-
-  chp = strstr(buf, "\r\n");
-  ASSERT_NE((void*)NULL, (void*)chp);
-  ASSERT_EQ(0, strncmp("\r\nOK", chp, 4));
-
-  err = write(sock[1], "AT+VGS=13\r", 10);
-  ASSERT_EQ(err, 10);
-  slc_cb(slc_cb_data);
-
-  err = read(sock[1], buf, 256);
-
-  chp = strstr(buf, "\r\n");
-  ASSERT_NE((void*)NULL, (void*)chp);
-  ASSERT_EQ(0, strncmp("\r\nOK", chp, 4));
-
-  ASSERT_EQ(1, cras_bt_device_update_hardware_volume_called);
-
-  hfp_slc_destroy(handle);
-  cras_bt_event_log_deinit(btlog);
-}
-
-TEST(HfpSlc, DisconnectSlc) {
-  int sock[2];
-  ResetStubData();
-
-  ASSERT_EQ(0, socketpair(AF_UNIX, SOCK_STREAM, 0, sock));
-  handle = hfp_slc_create(sock[0], 0, AG_ENHANCED_CALL_STATUS, device,
-                          slc_initialized_cb, slc_disconnected_cb);
-  /* Close socket right away to make read() get negative err code, and
-   * fake the errno to ECONNRESET. */
-  close(sock[0]);
-  close(sock[1]);
-  fake_errno = 104;
-  slc_cb(slc_cb_data);
-
-  ASSERT_EQ(1, slc_disconnected_cb_called);
-
-  hfp_slc_destroy(handle);
-}
-
-TEST(HfpSlc, InitializeSlcSupportsHfIndicator) {
-  int err;
-  int sock[2];
-  char buf[256];
-  char* chp;
-  ResetStubData();
-
-  btlog = cras_bt_event_log_init();
-
-  ASSERT_EQ(0, socketpair(AF_UNIX, SOCK_STREAM, 0, sock));
-  handle = hfp_slc_create(sock[0], 0, AG_ENHANCED_CALL_STATUS, device,
-                          slc_initialized_cb, slc_disconnected_cb);
-
-  /* Fake that HF supports HF indicator. */
-  err = write(sock[1], "AT+BRSF=256\r", 12);
-  ASSERT_EQ(err, 12);
-  slc_cb(slc_cb_data);
-  err = read(sock[1], buf, 256);
-
-  err = write(sock[1], "AT+CIND=?\r", 10);
-  ASSERT_EQ(10, err);
-  slc_cb(slc_cb_data);
-  err = read(sock[1], buf, 256);
-
-  /* Assert "\r\n+CIND: ... \r\n" response is received */
-  chp = strstr(buf, "\r\n");
-  ASSERT_NE((void*)NULL, (void*)chp);
-  ASSERT_EQ(0, strncmp("\r\n+CIND:", chp, 8));
-  chp += 2;
-  chp = strstr(chp, "\r\n");
-  ASSERT_NE((void*)NULL, (void*)chp);
-
-  /* Assert "\r\nOK\r\n" response is received */
-  chp += 2;
-  chp = strstr(chp, "\r\n");
-  ASSERT_NE((void*)NULL, (void*)chp);
-  ASSERT_EQ(0, strncmp("\r\nOK", chp, 4));
-
-  err = write(sock[1], "AT+CMER=3,0,0,1\r", 16);
-  ASSERT_EQ(16, err);
-  slc_cb(slc_cb_data);
-
-  ASSERT_NE((void*)NULL, cras_tm_timer_cb);
-  ASSERT_EQ(0, slc_initialized_cb_called);
-
-  /* Assert "\r\nOK\r\n" response is received */
-  err = read(sock[1], buf, 256);
-
-  chp = strstr(buf, "\r\nOK\r\n");
-  ASSERT_NE((void*)NULL, (void*)chp);
-
-  err = write(sock[1], "AT+BIND=2\r", 10);
-  ASSERT_EQ(err, 10);
-  slc_cb(slc_cb_data);
-
-  /* Assert "\r\nOK\r\n" response is received */
-  err = read(sock[1], buf, 256);
-
-  chp = strstr(buf, "\r\nOK\r\n");
-  ASSERT_NE((void*)NULL, (void*)chp);
-
-  err = write(sock[1], "AT+BIND=?\r", 10);
-  ASSERT_EQ(err, 10);
-  slc_cb(slc_cb_data);
-
-  /* Assert "\r\n+BIND: (2)\r\n" response is received */
-  err = read(sock[1], buf, 256);
-
-  chp = strstr(buf, "\r\n+BIND: (1,2)\r\n");
-  ASSERT_NE((void*)NULL, (void*)chp);
-  chp = strstr(buf, "\r\nOK\r\n");
-  ASSERT_NE((void*)NULL, (void*)chp);
-
-  err = write(sock[1], "AT+BIND?\r", 9);
-  ASSERT_EQ(err, 9);
-  slc_cb(slc_cb_data);
-
-  /* Assert "\r\n+BIND: 2,1\r\n" response is received */
-  err = read(sock[1], buf, 256);
-
-  chp = strstr(buf, "\r\n+BIND: 2,1\r\n");
-  ASSERT_NE((void*)NULL, (void*)chp);
-  chp = strstr(buf, "\r\nOK\r\n");
-  ASSERT_NE((void*)NULL, (void*)chp);
-
-  ASSERT_EQ(1, slc_initialized_cb_called);
-
-  err = write(sock[1], "AT+VGS=13\r", 10);
-  ASSERT_EQ(err, 10);
-  slc_cb(slc_cb_data);
-
-  err = read(sock[1], buf, 256);
-
-  chp = strstr(buf, "\r\nOK\r\n");
-  ASSERT_NE((void*)NULL, (void*)chp);
-
-  ASSERT_EQ(1, cras_bt_device_update_hardware_volume_called);
-
-  hfp_slc_destroy(handle);
-  cras_bt_event_log_deinit(btlog);
-}
-
-TEST(HfpSlc, CodecNegotiation) {
-  int codec;
-  int err;
-  int sock[2];
-  char buf[256];
-  char* pos;
-  ResetStubData();
-
-  btlog = cras_bt_event_log_init();
-
-  ASSERT_EQ(0, socketpair(AF_UNIX, SOCK_STREAM, 0, sock));
-  handle = hfp_slc_create(sock[0], 0, AG_CODEC_NEGOTIATION, device,
-                          slc_initialized_cb, slc_disconnected_cb);
-
-  codec = hfp_slc_get_selected_codec(handle);
-  EXPECT_EQ(HFP_CODEC_ID_CVSD, codec);
-
-  /* Fake that HF supports codec negotiation. */
-  err = write(sock[1], "AT+BRSF=128\r", 12);
-  ASSERT_EQ(err, 12);
-  slc_cb(slc_cb_data);
-  err = read(sock[1], buf, 256);
-
-  /* Fake that HF supports mSBC codec. */
-  err = write(sock[1], "AT+BAC=1,2\r", 11);
-  ASSERT_EQ(err, 11);
-  slc_cb(slc_cb_data);
-  err = read(sock[1], buf, 256);
-
-  /* Fake event reporting command to indicate SLC established. */
-  err = write(sock[1], "AT+CMER=3,0,0,1\r", 16);
-  ASSERT_EQ(err, 16);
-  slc_cb(slc_cb_data);
-
-  /* Assert that AG side prefers mSBC codec. */
-  codec = hfp_slc_get_selected_codec(handle);
-  EXPECT_EQ(HFP_CODEC_ID_MSBC, codec);
-
-  /* Fake HF selects mSBC codec. */
-  err = write(sock[1], "AT+BCS=2\r", 9);
-  ASSERT_EQ(err, 9);
-
-  err = hfp_slc_codec_connection_setup(handle);
-  /* Assert CRAS initiates codec selection to mSBC. */
-  memset(buf, 0, 256);
-  err = read(sock[1], buf, 256);
-  pos = strstr(buf, "\r\n+BCS:2\r\n");
-  ASSERT_NE((void*)NULL, pos);
-
-  err = write(sock[1], "AT+VGS=9\r", 9);
-  ASSERT_EQ(err, 9);
-  slc_cb(slc_cb_data);
-
-  hfp_slc_destroy(handle);
-  cras_bt_event_log_deinit(btlog);
-}
-
-TEST(HfpSlc, CodecNegotiationCapabilityChanged) {
-  int codec;
-  int err;
-  int sock[2];
-  char buf[256];
-  char* pos;
-  ResetStubData();
-
-  btlog = cras_bt_event_log_init();
-
-  ASSERT_EQ(0, socketpair(AF_UNIX, SOCK_STREAM, 0, sock));
-  handle = hfp_slc_create(sock[0], 0, AG_CODEC_NEGOTIATION, device,
-                          slc_initialized_cb, slc_disconnected_cb);
-
-  codec = hfp_slc_get_selected_codec(handle);
-  EXPECT_EQ(HFP_CODEC_ID_CVSD, codec);
-
-  /* Fake that HF supports codec negotiation. */
-  err = write(sock[1], "AT+BRSF=128\r", 12);
-  ASSERT_EQ(err, 12);
-  slc_cb(slc_cb_data);
-  err = read(sock[1], buf, 256);
-
-  /* Fake that HF supports mSBC codec. */
-  err = write(sock[1], "AT+BAC=1,2\r", 11);
-  ASSERT_EQ(err, 11);
-  slc_cb(slc_cb_data);
-  err = read(sock[1], buf, 256);
-
-  /* Fake event reporting command to indicate SLC established. */
-  err = write(sock[1], "AT+CMER=3,0,0,1\r", 16);
-  ASSERT_EQ(err, 16);
-  slc_cb(slc_cb_data);
-
-  /* Assert that AG side prefers mSBC codec. */
-  codec = hfp_slc_get_selected_codec(handle);
-  EXPECT_EQ(HFP_CODEC_ID_MSBC, codec);
-
-  /* Fake HF selects mSBC codec. */
-  err = write(sock[1], "AT+BCS=2\r", 9);
-  ASSERT_EQ(err, 9);
-
-  err = hfp_slc_codec_connection_setup(handle);
-  /* Assert CRAS initiates codec selection to mSBC. */
-  memset(buf, 0, 256);
-  err = read(sock[1], buf, 256);
-  pos = strstr(buf, "\r\n+BCS:2\r\n");
-  ASSERT_NE((void*)NULL, pos);
-
-  /* Fake that HF changes supported codecs. */
-  err = write(sock[1], "AT+BAC=1\r", 9);
-  ASSERT_EQ(err, 9);
-  slc_cb(slc_cb_data);
-  err = read(sock[1], buf, 256);
-
-  /* Fake HF selects CVSD codec. */
-  err = write(sock[1], "AT+BCS=1\r", 9);
-  ASSERT_EQ(err, 9);
-
-  err = hfp_slc_codec_connection_setup(handle);
-  /* Assert CRAS initiates codec selection to CVSD. */
-  memset(buf, 0, 256);
-  err = read(sock[1], buf, 256);
-  pos = strstr(buf, "\r\n+BCS:1\r\n");
-  ASSERT_NE((void*)NULL, pos);
-
-  codec = hfp_slc_get_selected_codec(handle);
-  EXPECT_EQ(HFP_CODEC_ID_CVSD, codec);
-
-  hfp_slc_destroy(handle);
-  cras_bt_event_log_deinit(btlog);
-}
-
-}  // namespace
-
-int slc_initialized_cb(struct hfp_slc_handle* handle) {
-  slc_initialized_cb_called++;
-  return 0;
-}
-
-int slc_disconnected_cb(struct hfp_slc_handle* handle) {
-  slc_disconnected_cb_called++;
-  return 0;
-}
-
-extern "C" {
-
-struct cras_bt_event_log* btlog;
-
-int cras_system_add_select_fd(int fd,
-                              void (*callback)(void* data),
-                              void* callback_data) {
-  cras_system_add_select_fd_called++;
-  slc_cb = callback;
-  slc_cb_data = callback_data;
-  return 0;
-}
-
-void cras_system_rm_select_fd(int fd) {}
-
-const char* cras_bt_device_address(struct cras_bt_device* device) {
-  return "";
-}
-
-void cras_bt_device_update_hardware_volume(struct cras_bt_device* device,
-                                           int volume) {
-  cras_bt_device_update_hardware_volume_called++;
-}
-
-void cras_observer_notify_bt_battery_changed(const char* address,
-                                             uint32_t level) {
-  cras_observer_notify_bt_batter_changed_called++;
-}
-
-/* To return fake errno */
-int* __errno_location() {
-  return &fake_errno;
-}
-
-struct cras_tm* cras_system_state_get_tm() {
-  return NULL;
-}
-
-struct cras_timer* cras_tm_create_timer(struct cras_tm* tm,
-                                        unsigned int ms,
-                                        void (*cb)(struct cras_timer* t,
-                                                   void* data),
-                                        void* cb_data) {
-  cras_tm_timer_cb = cb;
-  cras_tm_timer_cb_data = cb_data;
-  return reinterpret_cast<struct cras_timer*>(0x404);
-}
-
-int cras_poll(struct pollfd* fds,
-              nfds_t nfds,
-              struct timespec* timeout,
-              const sigset_t* sigmask) {
-  return 1;
-}
-
-void cras_tm_cancel_timer(struct cras_tm* tm, struct cras_timer* t) {}
-}
-
-// For telephony
-struct cras_telephony_handle* cras_telephony_get() {
-  return &fake_telephony;
-}
-
-void cras_telephony_store_dial_number(int len, const char* num) {}
-
-int cras_telephony_event_answer_call() {
-  return 0;
-}
-
-int cras_telephony_event_terminate_call() {
-  return 0;
-}
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tests/input_data_unittest.cc b/cras/src/tests/input_data_unittest.cc
deleted file mode 100644
index 3c6ae9f..0000000
--- a/cras/src/tests/input_data_unittest.cc
+++ /dev/null
@@ -1,148 +0,0 @@
-// Copyright 2019 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <gtest/gtest.h>
-#include <stdio.h>
-
-extern "C" {
-#include "buffer_share.c"
-#include "cras_audio_area.h"
-#include "cras_rstream.h"
-#include "input_data.h"
-}
-
-namespace {
-
-#define FAKE_CRAS_APM_PTR reinterpret_cast<struct cras_apm*>(0x99)
-
-#ifdef HAVE_WEBRTC_APM
-static struct cras_audio_area apm_area;
-static unsigned int cras_apm_list_process_offset_val;
-static unsigned int cras_apm_list_process_called;
-static struct cras_apm* cras_apm_list_get_active_ret = NULL;
-static bool cras_apm_list_get_use_tuned_settings_val;
-#endif  // HAVE_WEBRTC_APM
-static float cras_rstream_get_volume_scaler_val;
-
-TEST(InputData, GetForInputStream) {
-  void* dev_ptr = reinterpret_cast<void*>(0x123);
-  struct input_data* data;
-  struct cras_rstream stream;
-  struct buffer_share* offsets;
-  struct cras_audio_area* area;
-  struct cras_audio_area dev_area;
-  unsigned int offset;
-
-#ifdef HAVE_WEBRTC_APM
-  cras_apm_list_process_called = 0;
-#endif  // HAVE_WEBRTC_APM
-  stream.stream_id = 111;
-
-  data = input_data_create(dev_ptr);
-  data->ext.configure(&data->ext, 8192, 2, 48000);
-
-  // Prepare offsets data for 2 streams.
-  offsets = buffer_share_create(8192);
-  buffer_share_add_id(offsets, 111, NULL);
-  buffer_share_add_id(offsets, 222, NULL);
-  buffer_share_offset_update(offsets, 111, 2048);
-
-  dev_area.frames = 600;
-  data->area = &dev_area;
-
-  stream.apm_list = NULL;
-  input_data_get_for_stream(data, &stream, offsets, &area, &offset);
-
-  // Assert offset is clipped by area->frames
-  EXPECT_EQ(600, area->frames);
-  EXPECT_EQ(600, offset);
-#ifdef HAVE_WEBRTC_APM
-  EXPECT_EQ(0, cras_apm_list_process_called);
-  cras_apm_list_get_active_ret = FAKE_CRAS_APM_PTR;
-#endif  // HAVE_WEBRTC_APM
-
-  input_data_get_for_stream(data, &stream, offsets, &area, &offset);
-
-#ifdef HAVE_WEBRTC_APM
-  // Assert APM process uses correct stream offset not the clipped one
-  // used for audio area.
-  EXPECT_EQ(1, cras_apm_list_process_called);
-  EXPECT_EQ(2048, cras_apm_list_process_offset_val);
-  EXPECT_EQ(0, offset);
-#else
-  // Without the APM, the offset shouldn't be changed.
-  EXPECT_EQ(600, offset);
-#endif  // HAVE_WEBRTC_APM
-
-  input_data_destroy(&data);
-  buffer_share_destroy(offsets);
-}
-
-TEST(InputData, GetSWCaptureGain) {
-  void* dev_ptr = reinterpret_cast<void*>(0x123);
-  struct input_data* data = NULL;
-  struct cras_rstream stream;
-  float gain;
-
-  cras_rstream_get_volume_scaler_val = 0.8f;
-  stream.stream_id = 123;
-
-#ifdef HAVE_WEBRTC_APM
-  data = input_data_create(dev_ptr);
-
-  cras_apm_list_get_active_ret = FAKE_CRAS_APM_PTR;
-  cras_apm_list_get_use_tuned_settings_val = 1;
-  gain = input_data_get_software_gain_scaler(data, 0.7f, &stream);
-  EXPECT_FLOAT_EQ(1.0f, gain);
-
-  cras_apm_list_get_active_ret = NULL;
-  gain = input_data_get_software_gain_scaler(data, 0.7f, &stream);
-  EXPECT_FLOAT_EQ(0.56f, gain);
-
-  cras_apm_list_get_active_ret = FAKE_CRAS_APM_PTR;
-  cras_apm_list_get_use_tuned_settings_val = 0;
-  gain = input_data_get_software_gain_scaler(data, 0.6f, &stream);
-  EXPECT_FLOAT_EQ(0.48f, gain);
-  input_data_destroy(&data);
-#endif  // HAVE_WEBRTC_APM
-
-  data = input_data_create(dev_ptr);
-  gain = input_data_get_software_gain_scaler(data, 0.6f, &stream);
-  EXPECT_FLOAT_EQ(0.48f, gain);
-  input_data_destroy(&data);
-}
-
-extern "C" {
-#ifdef HAVE_WEBRTC_APM
-struct cras_apm* cras_apm_list_get_active_apm(void* stream_ptr, void* dev_ptr) {
-  return cras_apm_list_get_active_ret;
-}
-int cras_apm_list_process(struct cras_apm* apm,
-                          struct float_buffer* input,
-                          unsigned int offset) {
-  cras_apm_list_process_called++;
-  cras_apm_list_process_offset_val = offset;
-  return 0;
-}
-
-struct cras_audio_area* cras_apm_list_get_processed(struct cras_apm* apm) {
-  return &apm_area;
-}
-void cras_apm_list_remove_apm(struct cras_apm_list* list, void* dev_ptr) {}
-void cras_apm_list_put_processed(struct cras_apm* apm, unsigned int frames) {}
-bool cras_apm_list_get_use_tuned_settings(struct cras_apm* apm) {
-  return cras_apm_list_get_use_tuned_settings_val;
-}
-#endif  // HAVE_WEBRTC_APM
-
-float cras_rstream_get_volume_scaler(struct cras_rstream* rstream) {
-  return cras_rstream_get_volume_scaler_val;
-}
-}  // extern "C"
-}  // namespace
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tests/iodev_list_unittest.cc b/cras/src/tests/iodev_list_unittest.cc
deleted file mode 100644
index 8c71214..0000000
--- a/cras/src/tests/iodev_list_unittest.cc
+++ /dev/null
@@ -1,2362 +0,0 @@
-// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <gtest/gtest.h>
-#include <stdio.h>
-
-#include <algorithm>
-#include <map>
-
-extern "C" {
-#include "audio_thread.h"
-#include "cras_iodev.h"
-#include "cras_iodev_list.h"
-#include "cras_main_thread_log.h"
-#include "cras_observer_ops.h"
-#include "cras_ramp.h"
-#include "cras_rstream.h"
-#include "cras_system_state.h"
-#include "cras_tm.h"
-#include "stream_list.h"
-#include "utlist.h"
-}
-
-namespace {
-
-struct cras_server_state server_state_stub;
-struct cras_server_state* server_state_update_begin_return;
-int system_get_mute_return;
-
-/* Data for stubs. */
-static struct cras_observer_ops* observer_ops;
-static int add_stream_called;
-static int rm_stream_called;
-static unsigned int set_node_plugged_called;
-static cras_iodev* audio_thread_remove_streams_active_dev;
-static cras_iodev* audio_thread_set_active_dev_val;
-static int audio_thread_set_active_dev_called;
-static cras_iodev* audio_thread_add_open_dev_dev;
-static int audio_thread_add_open_dev_called;
-static int audio_thread_rm_open_dev_called;
-static int audio_thread_is_dev_open_ret;
-static struct audio_thread thread;
-static struct cras_iodev loopback_input;
-static int cras_iodev_close_called;
-static struct cras_iodev* cras_iodev_close_dev;
-static struct cras_iodev mock_hotword_iodev;
-static struct cras_iodev mock_empty_iodev[2];
-static stream_callback* stream_add_cb;
-static stream_callback* stream_rm_cb;
-static struct cras_rstream* stream_list_get_ret;
-static int server_stream_create_called;
-static int server_stream_destroy_called;
-static int audio_thread_drain_stream_return;
-static int audio_thread_drain_stream_called;
-static int cras_tm_create_timer_called;
-static int cras_tm_cancel_timer_called;
-static void (*cras_tm_timer_cb)(struct cras_timer* t, void* data);
-static void* cras_tm_timer_cb_data;
-static struct timespec clock_gettime_retspec;
-static struct cras_iodev* device_enabled_dev;
-static int device_enabled_count;
-static struct cras_iodev* device_disabled_dev;
-static int device_disabled_count;
-static void* device_enabled_cb_data;
-static void* device_disabled_cb_data;
-static struct cras_rstream* audio_thread_add_stream_stream;
-static struct cras_iodev* audio_thread_add_stream_dev;
-static struct cras_iodev* audio_thread_disconnect_stream_dev;
-static int audio_thread_add_stream_called;
-static unsigned update_active_node_called;
-static struct cras_iodev* update_active_node_iodev_val[5];
-static unsigned update_active_node_node_idx_val[5];
-static unsigned update_active_node_dev_enabled_val[5];
-static int set_swap_mode_for_node_called;
-static int set_swap_mode_for_node_enable;
-static int cras_iodev_start_volume_ramp_called;
-static size_t cras_observer_add_called;
-static size_t cras_observer_remove_called;
-static size_t cras_observer_notify_nodes_called;
-static size_t cras_observer_notify_active_node_called;
-static size_t cras_observer_notify_output_node_volume_called;
-static size_t cras_observer_notify_node_left_right_swapped_called;
-static size_t cras_observer_notify_input_node_gain_called;
-static int cras_iodev_open_called;
-static int cras_iodev_open_ret[8];
-static struct cras_audio_format cras_iodev_open_fmt;
-static int set_mute_called;
-static std::vector<struct cras_iodev*> set_mute_dev_vector;
-static std::vector<unsigned int> audio_thread_dev_start_ramp_dev_vector;
-static int audio_thread_dev_start_ramp_called;
-static enum CRAS_IODEV_RAMP_REQUEST audio_thread_dev_start_ramp_req;
-static std::map<int, bool> stream_list_has_pinned_stream_ret;
-static struct cras_rstream* audio_thread_disconnect_stream_stream;
-static int audio_thread_disconnect_stream_called;
-static struct cras_iodev fake_sco_in_dev, fake_sco_out_dev;
-static struct cras_ionode fake_sco_in_node, fake_sco_out_node;
-static int server_state_hotword_pause_at_suspend;
-
-int dev_idx_in_vector(std::vector<unsigned int> v, unsigned int idx) {
-  return std::find(v.begin(), v.end(), idx) != v.end();
-}
-
-int device_in_vector(std::vector<struct cras_iodev*> v,
-                     struct cras_iodev* dev) {
-  return std::find(v.begin(), v.end(), dev) != v.end();
-}
-
-class IoDevTestSuite : public testing::Test {
- protected:
-  virtual void SetUp() {
-    cras_iodev_list_reset();
-
-    cras_iodev_close_called = 0;
-    stream_list_get_ret = 0;
-    server_stream_create_called = 0;
-    server_stream_destroy_called = 0;
-    audio_thread_drain_stream_return = 0;
-    audio_thread_drain_stream_called = 0;
-    cras_tm_create_timer_called = 0;
-    cras_tm_cancel_timer_called = 0;
-
-    audio_thread_disconnect_stream_called = 0;
-    audio_thread_disconnect_stream_stream = NULL;
-    audio_thread_is_dev_open_ret = 0;
-    stream_list_has_pinned_stream_ret.clear();
-
-    sample_rates_[0] = 44100;
-    sample_rates_[1] = 48000;
-    sample_rates_[2] = 0;
-
-    channel_counts_[0] = 2;
-    channel_counts_[1] = 0;
-
-    fmt_.format = SND_PCM_FORMAT_S16_LE;
-    fmt_.frame_rate = 48000;
-    fmt_.num_channels = 2;
-
-    memset(&d1_, 0, sizeof(d1_));
-    memset(&d2_, 0, sizeof(d2_));
-    memset(&d3_, 0, sizeof(d3_));
-
-    memset(&node1, 0, sizeof(node1));
-    memset(&node2, 0, sizeof(node2));
-    memset(&node3, 0, sizeof(node3));
-
-    d1_.set_volume = NULL;
-    d1_.set_capture_gain = NULL;
-    d1_.set_capture_mute = NULL;
-    d1_.update_supported_formats = NULL;
-    d1_.update_active_node = update_active_node;
-    d1_.set_swap_mode_for_node = set_swap_mode_for_node;
-    d1_.format = NULL;
-    d1_.direction = CRAS_STREAM_OUTPUT;
-    d1_.info.idx = -999;
-    d1_.nodes = &node1;
-    d1_.active_node = &node1;
-    strcpy(d1_.info.name, "d1");
-    d1_.supported_rates = sample_rates_;
-    d1_.supported_channel_counts = channel_counts_;
-    d2_.set_volume = NULL;
-    d2_.set_capture_gain = NULL;
-    d2_.set_capture_mute = NULL;
-    d2_.update_supported_formats = NULL;
-    d2_.update_active_node = update_active_node;
-    d2_.format = NULL;
-    d2_.direction = CRAS_STREAM_OUTPUT;
-    d2_.info.idx = -999;
-    d2_.nodes = &node2;
-    d2_.active_node = &node2;
-    strcpy(d2_.info.name, "d2");
-    d2_.supported_rates = sample_rates_;
-    d2_.supported_channel_counts = channel_counts_;
-    d3_.set_volume = NULL;
-    d3_.set_capture_gain = NULL;
-    d3_.set_capture_mute = NULL;
-    d3_.update_supported_formats = NULL;
-    d3_.update_active_node = update_active_node;
-    d3_.format = NULL;
-    d3_.direction = CRAS_STREAM_OUTPUT;
-    d3_.info.idx = -999;
-    d3_.nodes = &node3;
-    d3_.active_node = &node3;
-    strcpy(d3_.info.name, "d3");
-    d3_.supported_rates = sample_rates_;
-    d3_.supported_channel_counts = channel_counts_;
-
-    loopback_input.set_volume = NULL;
-    loopback_input.set_capture_gain = NULL;
-    loopback_input.set_capture_mute = NULL;
-    loopback_input.update_supported_formats = NULL;
-    loopback_input.update_active_node = update_active_node;
-    loopback_input.format = NULL;
-    loopback_input.direction = CRAS_STREAM_INPUT;
-    loopback_input.info.idx = -999;
-    loopback_input.nodes = &node3;
-    loopback_input.active_node = &node3;
-    strcpy(loopback_input.info.name, "loopback_input");
-    loopback_input.supported_rates = sample_rates_;
-    loopback_input.supported_channel_counts = channel_counts_;
-
-    server_state_update_begin_return = &server_state_stub;
-    system_get_mute_return = false;
-
-    /* Reset stub data. */
-    add_stream_called = 0;
-    rm_stream_called = 0;
-    set_node_plugged_called = 0;
-    audio_thread_rm_open_dev_called = 0;
-    audio_thread_add_open_dev_called = 0;
-    audio_thread_set_active_dev_called = 0;
-    audio_thread_add_stream_called = 0;
-    update_active_node_called = 0;
-    cras_observer_add_called = 0;
-    cras_observer_remove_called = 0;
-    cras_observer_notify_nodes_called = 0;
-    cras_observer_notify_active_node_called = 0;
-    cras_observer_notify_output_node_volume_called = 0;
-    cras_observer_notify_node_left_right_swapped_called = 0;
-    cras_observer_notify_input_node_gain_called = 0;
-    cras_iodev_open_called = 0;
-    memset(cras_iodev_open_ret, 0, sizeof(cras_iodev_open_ret));
-    set_mute_called = 0;
-    set_mute_dev_vector.clear();
-    set_swap_mode_for_node_called = 0;
-    set_swap_mode_for_node_enable = 0;
-    cras_iodev_start_volume_ramp_called = 0;
-    audio_thread_dev_start_ramp_dev_vector.clear();
-    audio_thread_dev_start_ramp_called = 0;
-    audio_thread_dev_start_ramp_req = CRAS_IODEV_RAMP_REQUEST_UP_START_PLAYBACK;
-    for (int i = 0; i < 5; i++)
-      update_active_node_iodev_val[i] = NULL;
-    DL_APPEND(fake_sco_in_dev.nodes, &fake_sco_in_node);
-    DL_APPEND(fake_sco_out_dev.nodes, &fake_sco_out_node);
-    fake_sco_in_node.is_sco_pcm = 0;
-    fake_sco_out_node.is_sco_pcm = 0;
-    mock_empty_iodev[0].state = CRAS_IODEV_STATE_CLOSE;
-    mock_empty_iodev[0].update_active_node = update_active_node;
-    mock_empty_iodev[1].state = CRAS_IODEV_STATE_CLOSE;
-    mock_empty_iodev[1].update_active_node = update_active_node;
-    mock_hotword_iodev.update_active_node = update_active_node;
-    server_state_hotword_pause_at_suspend = 0;
-  }
-
-  virtual void TearDown() {
-    cras_iodev_list_reset();
-  }
-
-  static void set_volume_1(struct cras_iodev* iodev) { set_volume_1_called_++; }
-
-  static void set_capture_gain_1(struct cras_iodev* iodev) {
-    set_capture_gain_1_called_++;
-  }
-
-  static void set_capture_mute_1(struct cras_iodev* iodev) {
-    set_capture_mute_1_called_++;
-  }
-
-  static void update_active_node(struct cras_iodev* iodev,
-                                 unsigned node_idx,
-                                 unsigned dev_enabled) {
-    int i = update_active_node_called++ % 5;
-    update_active_node_iodev_val[i] = iodev;
-    update_active_node_node_idx_val[i] = node_idx;
-    update_active_node_dev_enabled_val[i] = dev_enabled;
-  }
-
-  static int set_swap_mode_for_node(struct cras_iodev* iodev,
-                                    struct cras_ionode* node,
-                                    int enable) {
-    set_swap_mode_for_node_called++;
-    set_swap_mode_for_node_enable = enable;
-    return 0;
-  }
-
-  struct cras_iodev d1_;
-  struct cras_iodev d2_;
-  struct cras_iodev d3_;
-  struct cras_audio_format fmt_;
-  size_t sample_rates_[3];
-  size_t channel_counts_[2];
-  static int set_volume_1_called_;
-  static int set_capture_gain_1_called_;
-  static int set_capture_mute_1_called_;
-  struct cras_ionode node1, node2, node3;
-};
-
-int IoDevTestSuite::set_volume_1_called_;
-int IoDevTestSuite::set_capture_gain_1_called_;
-int IoDevTestSuite::set_capture_mute_1_called_;
-
-// Check that Init registers observer client. */
-TEST_F(IoDevTestSuite, InitSetup) {
-  cras_iodev_list_init();
-  EXPECT_EQ(1, cras_observer_add_called);
-  cras_iodev_list_deinit();
-  EXPECT_EQ(1, cras_observer_remove_called);
-}
-
-/* Check that the suspend alert from cras_system will trigger suspend
- * and resume call of all iodevs. */
-TEST_F(IoDevTestSuite, SetSuspendResume) {
-  struct cras_rstream rstream, rstream2, rstream3;
-  struct cras_rstream* stream_list = NULL;
-  int rc;
-
-  memset(&rstream, 0, sizeof(rstream));
-  memset(&rstream2, 0, sizeof(rstream2));
-  memset(&rstream3, 0, sizeof(rstream3));
-
-  cras_iodev_list_init();
-
-  d1_.direction = CRAS_STREAM_OUTPUT;
-  rc = cras_iodev_list_add_output(&d1_);
-  ASSERT_EQ(0, rc);
-
-  d1_.format = &fmt_;
-
-  audio_thread_add_open_dev_called = 0;
-  cras_iodev_list_add_active_node(CRAS_STREAM_OUTPUT,
-                                  cras_make_node_id(d1_.info.idx, 1));
-  DL_APPEND(stream_list, &rstream);
-  stream_add_cb(&rstream);
-  EXPECT_EQ(1, audio_thread_add_stream_called);
-  EXPECT_EQ(1, audio_thread_add_open_dev_called);
-
-  DL_APPEND(stream_list, &rstream2);
-  stream_add_cb(&rstream2);
-  EXPECT_EQ(2, audio_thread_add_stream_called);
-
-  audio_thread_rm_open_dev_called = 0;
-  observer_ops->suspend_changed(NULL, 1);
-  EXPECT_EQ(1, audio_thread_rm_open_dev_called);
-
-  /* Test disable/enable dev won't cause add_stream to audio_thread. */
-  audio_thread_add_stream_called = 0;
-  cras_iodev_list_disable_dev(&d1_, false);
-  cras_iodev_list_enable_dev(&d1_);
-  EXPECT_EQ(0, audio_thread_add_stream_called);
-
-  audio_thread_drain_stream_return = 0;
-  DL_DELETE(stream_list, &rstream2);
-  stream_rm_cb(&rstream2);
-  EXPECT_EQ(1, audio_thread_drain_stream_called);
-
-  /* Test stream_add_cb won't cause add_stream to audio_thread. */
-  audio_thread_add_stream_called = 0;
-  DL_APPEND(stream_list, &rstream3);
-  stream_add_cb(&rstream3);
-  EXPECT_EQ(0, audio_thread_add_stream_called);
-
-  audio_thread_add_open_dev_called = 0;
-  audio_thread_add_stream_called = 0;
-  stream_list_get_ret = stream_list;
-  observer_ops->suspend_changed(NULL, 0);
-  EXPECT_EQ(1, audio_thread_add_open_dev_called);
-  EXPECT_EQ(2, audio_thread_add_stream_called);
-  EXPECT_EQ(&rstream3, audio_thread_add_stream_stream);
-
-  cras_iodev_list_deinit();
-  EXPECT_EQ(3, cras_observer_notify_active_node_called);
-}
-
-/* Check that the suspend/resume call of active iodev will be triggered and
- * fallback device will be transciently enabled while adding a new stream whose
- * channel count is higher than the active iodev. */
-TEST_F(IoDevTestSuite, ReopenDevForHigherChannels) {
-  struct cras_rstream rstream, rstream2;
-  struct cras_rstream* stream_list = NULL;
-  int rc;
-
-  memset(&rstream, 0, sizeof(rstream));
-  memset(&rstream2, 0, sizeof(rstream2));
-  rstream.format = fmt_;
-  rstream2.format = fmt_;
-  rstream2.format.num_channels = 6;
-
-  cras_iodev_list_init();
-
-  d1_.direction = CRAS_STREAM_OUTPUT;
-  rc = cras_iodev_list_add_output(&d1_);
-  ASSERT_EQ(0, rc);
-
-  d1_.format = &fmt_;
-  d1_.info.max_supported_channels = 2;
-
-  audio_thread_add_open_dev_called = 0;
-  cras_iodev_list_add_active_node(CRAS_STREAM_OUTPUT,
-                                  cras_make_node_id(d1_.info.idx, 1));
-  DL_APPEND(stream_list, &rstream);
-  stream_list_get_ret = stream_list;
-  stream_add_cb(&rstream);
-  EXPECT_EQ(1, audio_thread_add_stream_called);
-  EXPECT_EQ(1, audio_thread_add_open_dev_called);
-  EXPECT_EQ(1, cras_iodev_open_called);
-  EXPECT_EQ(2, cras_iodev_open_fmt.num_channels);
-
-  audio_thread_add_stream_called = 0;
-  audio_thread_add_open_dev_called = 0;
-  cras_iodev_open_called = 0;
-
-  /* stream_list should be descending ordered by channel count. */
-  DL_PREPEND(stream_list, &rstream2);
-  stream_list_get_ret = stream_list;
-  stream_add_cb(&rstream2);
-  /* The channel count(=6) of rstream2 exceeds d1's max_supported_channels(=2),
-   * rstream2 will be added directly to d1, which will not be re-opened. */
-  EXPECT_EQ(1, audio_thread_add_stream_called);
-  EXPECT_EQ(0, audio_thread_add_open_dev_called);
-  EXPECT_EQ(0, cras_iodev_open_called);
-
-  d1_.info.max_supported_channels = 6;
-  stream_rm_cb(&rstream2);
-
-  audio_thread_add_stream_called = 0;
-  audio_thread_add_open_dev_called = 0;
-  cras_iodev_open_called = 0;
-
-  stream_add_cb(&rstream2);
-  /* Added both rstreams to fallback device, then re-opened d1. */
-  EXPECT_EQ(4, audio_thread_add_stream_called);
-  EXPECT_EQ(2, audio_thread_add_open_dev_called);
-  EXPECT_EQ(2, cras_iodev_open_called);
-  EXPECT_EQ(6, cras_iodev_open_fmt.num_channels);
-
-  cras_iodev_list_deinit();
-}
-
-/* Check that after resume, all output devices enter ramp mute state if there is
- * any output stream. */
-TEST_F(IoDevTestSuite, RampMuteAfterResume) {
-  struct cras_rstream rstream, rstream2;
-  struct cras_rstream* stream_list = NULL;
-  int rc;
-
-  memset(&rstream, 0, sizeof(rstream));
-
-  cras_iodev_list_init();
-
-  d1_.direction = CRAS_STREAM_OUTPUT;
-  d1_.initial_ramp_request = CRAS_IODEV_RAMP_REQUEST_UP_START_PLAYBACK;
-  rc = cras_iodev_list_add_output(&d1_);
-  ASSERT_EQ(0, rc);
-
-  d2_.direction = CRAS_STREAM_INPUT;
-  d2_.initial_ramp_request = CRAS_IODEV_RAMP_REQUEST_UP_START_PLAYBACK;
-  rc = cras_iodev_list_add_input(&d2_);
-  ASSERT_EQ(0, rc);
-
-  d1_.format = &fmt_;
-  d2_.format = &fmt_;
-
-  audio_thread_add_open_dev_called = 0;
-  cras_iodev_list_add_active_node(CRAS_STREAM_OUTPUT,
-                                  cras_make_node_id(d1_.info.idx, 1));
-
-  rstream.direction = CRAS_STREAM_OUTPUT;
-  DL_APPEND(stream_list, &rstream);
-  stream_add_cb(&rstream);
-  EXPECT_EQ(1, audio_thread_add_stream_called);
-  EXPECT_EQ(1, audio_thread_add_open_dev_called);
-
-  rstream2.direction = CRAS_STREAM_INPUT;
-  DL_APPEND(stream_list, &rstream2);
-  stream_add_cb(&rstream2);
-
-  /* Suspend and resume */
-  observer_ops->suspend_changed(NULL, 1);
-  stream_list_get_ret = stream_list;
-  observer_ops->suspend_changed(NULL, 0);
-
-  /* Test only output device that has stream will be muted after resume */
-  EXPECT_EQ(d1_.initial_ramp_request, CRAS_IODEV_RAMP_REQUEST_RESUME_MUTE);
-  EXPECT_EQ(CRAS_IODEV_RAMP_REQUEST_UP_START_PLAYBACK,
-            d2_.initial_ramp_request);
-
-  /* Reset d1 ramp_mute and remove output stream to test again */
-  d1_.initial_ramp_request = CRAS_IODEV_RAMP_REQUEST_UP_START_PLAYBACK;
-  DL_DELETE(stream_list, &rstream);
-  stream_list_get_ret = stream_list;
-  stream_rm_cb(&rstream);
-
-  /* Suspend and resume */
-  observer_ops->suspend_changed(NULL, 1);
-  stream_list_get_ret = stream_list;
-  observer_ops->suspend_changed(NULL, 0);
-
-  EXPECT_EQ(CRAS_IODEV_RAMP_REQUEST_UP_START_PLAYBACK,
-            d1_.initial_ramp_request);
-  EXPECT_EQ(CRAS_IODEV_RAMP_REQUEST_UP_START_PLAYBACK,
-            d2_.initial_ramp_request);
-
-  cras_iodev_list_deinit();
-}
-
-TEST_F(IoDevTestSuite, InitDevFailShouldEnableFallback) {
-  int rc;
-  struct cras_rstream rstream;
-  struct cras_rstream* stream_list = NULL;
-
-  memset(&rstream, 0, sizeof(rstream));
-  cras_iodev_list_init();
-
-  d1_.direction = CRAS_STREAM_OUTPUT;
-  rc = cras_iodev_list_add_output(&d1_);
-  ASSERT_EQ(0, rc);
-
-  d1_.format = &fmt_;
-
-  cras_iodev_list_select_node(CRAS_STREAM_OUTPUT,
-                              cras_make_node_id(d1_.info.idx, 0));
-
-  cras_iodev_open_ret[0] = -5;
-  cras_iodev_open_ret[1] = 0;
-
-  DL_APPEND(stream_list, &rstream);
-  stream_list_get_ret = stream_list;
-  stream_add_cb(&rstream);
-  /* open dev called twice, one for fallback device. */
-  EXPECT_EQ(2, cras_iodev_open_called);
-  EXPECT_EQ(1, audio_thread_add_stream_called);
-  cras_iodev_list_deinit();
-}
-
-TEST_F(IoDevTestSuite, InitDevWithEchoRef) {
-  int rc;
-  struct cras_rstream rstream;
-  struct cras_rstream* stream_list = NULL;
-
-  memset(&rstream, 0, sizeof(rstream));
-  cras_iodev_list_init();
-
-  d1_.direction = CRAS_STREAM_OUTPUT;
-  d1_.echo_reference_dev = &d2_;
-  rc = cras_iodev_list_add_output(&d1_);
-  ASSERT_EQ(0, rc);
-
-  d2_.direction = CRAS_STREAM_INPUT;
-  snprintf(d2_.active_node->name, CRAS_NODE_NAME_BUFFER_SIZE, "echo ref");
-  rc = cras_iodev_list_add_input(&d2_);
-  ASSERT_EQ(0, rc);
-
-  d1_.format = &fmt_;
-  d2_.format = &fmt_;
-
-  cras_iodev_list_select_node(CRAS_STREAM_OUTPUT,
-                              cras_make_node_id(d1_.info.idx, 0));
-  /* No close call happened, because no stream exists. */
-  EXPECT_EQ(0, cras_iodev_close_called);
-
-  cras_iodev_open_ret[1] = 0;
-
-  DL_APPEND(stream_list, &rstream);
-  stream_list_get_ret = stream_list;
-  stream_add_cb(&rstream);
-
-  EXPECT_EQ(1, cras_iodev_open_called);
-  EXPECT_EQ(1, server_stream_create_called);
-  EXPECT_EQ(1, audio_thread_add_stream_called);
-
-  DL_DELETE(stream_list, &rstream);
-  stream_list_get_ret = stream_list;
-  stream_rm_cb(&rstream);
-
-  clock_gettime_retspec.tv_sec = 11;
-  clock_gettime_retspec.tv_nsec = 0;
-  cras_tm_timer_cb(NULL, NULL);
-
-  EXPECT_EQ(1, cras_iodev_close_called);
-  EXPECT_EQ(1, server_stream_destroy_called);
-
-  cras_iodev_list_deinit();
-}
-
-TEST_F(IoDevTestSuite, SelectNodeOpenFailShouldScheduleRetry) {
-  struct cras_rstream rstream;
-  struct cras_rstream* stream_list = NULL;
-  int rc;
-
-  memset(&rstream, 0, sizeof(rstream));
-  cras_iodev_list_init();
-
-  d1_.direction = CRAS_STREAM_OUTPUT;
-  rc = cras_iodev_list_add_output(&d1_);
-  ASSERT_EQ(0, rc);
-
-  d2_.direction = CRAS_STREAM_OUTPUT;
-  rc = cras_iodev_list_add_output(&d2_);
-  ASSERT_EQ(0, rc);
-
-  d1_.format = &fmt_;
-  d2_.format = &fmt_;
-
-  cras_iodev_list_select_node(CRAS_STREAM_OUTPUT,
-                              cras_make_node_id(d1_.info.idx, 1));
-  DL_APPEND(stream_list, &rstream);
-  stream_list_get_ret = stream_list;
-  stream_add_cb(&rstream);
-
-  /* Select node triggers: fallback open, d1 close, d2 open, fallback close. */
-  cras_iodev_close_called = 0;
-  cras_iodev_open_called = 0;
-  cras_iodev_list_select_node(CRAS_STREAM_OUTPUT,
-                              cras_make_node_id(d2_.info.idx, 1));
-  EXPECT_EQ(2, cras_iodev_close_called);
-  EXPECT_EQ(2, cras_iodev_open_called);
-  EXPECT_EQ(0, cras_tm_create_timer_called);
-  EXPECT_EQ(0, cras_tm_cancel_timer_called);
-
-  /* Test that if select to d1 and open d1 fail, fallback doesn't close. */
-  cras_iodev_open_called = 0;
-  cras_iodev_open_ret[0] = 0;
-  cras_iodev_open_ret[1] = -5;
-  cras_iodev_open_ret[2] = 0;
-  cras_tm_timer_cb = NULL;
-  cras_iodev_list_select_node(CRAS_STREAM_OUTPUT,
-                              cras_make_node_id(d1_.info.idx, 1));
-  EXPECT_EQ(3, cras_iodev_close_called);
-  EXPECT_EQ(&d2_, cras_iodev_close_dev);
-  EXPECT_EQ(2, cras_iodev_open_called);
-  EXPECT_EQ(0, cras_tm_cancel_timer_called);
-
-  /* Assert a timer is scheduled to retry open. */
-  EXPECT_NE((void*)NULL, cras_tm_timer_cb);
-  EXPECT_EQ(1, cras_tm_create_timer_called);
-
-  audio_thread_add_stream_called = 0;
-  cras_tm_timer_cb(NULL, cras_tm_timer_cb_data);
-  EXPECT_EQ(3, cras_iodev_open_called);
-  EXPECT_EQ(1, audio_thread_add_stream_called);
-
-  /* Retry open success will close fallback dev. */
-  EXPECT_EQ(4, cras_iodev_close_called);
-  EXPECT_EQ(0, cras_tm_cancel_timer_called);
-
-  /* Select to d2 and fake an open failure. */
-  cras_iodev_close_called = 0;
-  cras_iodev_open_called = 0;
-  cras_iodev_open_ret[0] = 0;
-  cras_iodev_open_ret[1] = -5;
-  cras_iodev_open_ret[2] = 0;
-  cras_iodev_list_select_node(CRAS_STREAM_OUTPUT,
-                              cras_make_node_id(d2_.info.idx, 1));
-  EXPECT_EQ(1, cras_iodev_close_called);
-  EXPECT_EQ(&d1_, cras_iodev_close_dev);
-  EXPECT_EQ(2, cras_tm_create_timer_called);
-  EXPECT_NE((void*)NULL, cras_tm_timer_cb);
-
-  /* Select to another iodev should cancel the timer. */
-  memset(cras_iodev_open_ret, 0, sizeof(cras_iodev_open_ret));
-  cras_iodev_list_select_node(CRAS_STREAM_OUTPUT,
-                              cras_make_node_id(d2_.info.idx, 1));
-  EXPECT_EQ(1, cras_tm_cancel_timer_called);
-  cras_iodev_list_deinit();
-}
-
-TEST_F(IoDevTestSuite, InitDevFailShouldScheduleRetry) {
-  int rc;
-  struct cras_rstream rstream;
-  struct cras_rstream* stream_list = NULL;
-
-  memset(&rstream, 0, sizeof(rstream));
-  rstream.format = fmt_;
-  cras_iodev_list_init();
-
-  d1_.direction = CRAS_STREAM_OUTPUT;
-  rc = cras_iodev_list_add_output(&d1_);
-  ASSERT_EQ(0, rc);
-
-  d1_.format = &fmt_;
-
-  cras_iodev_list_select_node(CRAS_STREAM_OUTPUT,
-                              cras_make_node_id(d1_.info.idx, 0));
-
-  update_active_node_called = 0;
-  cras_iodev_open_ret[0] = -5;
-  cras_iodev_open_ret[1] = 0;
-  cras_tm_timer_cb = NULL;
-  DL_APPEND(stream_list, &rstream);
-  stream_list_get_ret = stream_list;
-  stream_add_cb(&rstream);
-  /* open dev called twice, one for fallback device. */
-  EXPECT_EQ(2, cras_iodev_open_called);
-  EXPECT_EQ(1, audio_thread_add_stream_called);
-  EXPECT_EQ(0, update_active_node_called);
-  EXPECT_EQ(&mock_empty_iodev[CRAS_STREAM_OUTPUT], audio_thread_add_stream_dev);
-
-  EXPECT_NE((void*)NULL, cras_tm_timer_cb);
-  EXPECT_EQ(1, cras_tm_create_timer_called);
-
-  /* If retry still fail, won't schedule more retry. */
-  cras_iodev_open_ret[2] = -5;
-  cras_tm_timer_cb(NULL, cras_tm_timer_cb_data);
-  EXPECT_EQ(1, cras_tm_create_timer_called);
-  EXPECT_EQ(1, audio_thread_add_stream_called);
-
-  mock_empty_iodev[CRAS_STREAM_OUTPUT].format = &fmt_;
-  cras_tm_timer_cb = NULL;
-  cras_iodev_open_ret[3] = -5;
-  stream_add_cb(&rstream);
-  EXPECT_NE((void*)NULL, cras_tm_timer_cb);
-  EXPECT_EQ(2, cras_tm_create_timer_called);
-
-  cras_iodev_list_rm_output(&d1_);
-  EXPECT_EQ(1, cras_tm_cancel_timer_called);
-  cras_iodev_list_deinit();
-}
-
-TEST_F(IoDevTestSuite, PinnedStreamInitFailShouldScheduleRetry) {
-  int rc;
-  struct cras_rstream rstream;
-  struct cras_rstream* stream_list = NULL;
-
-  memset(&rstream, 0, sizeof(rstream));
-  cras_iodev_list_init();
-
-  d1_.direction = CRAS_STREAM_OUTPUT;
-  rc = cras_iodev_list_add_output(&d1_);
-  ASSERT_EQ(0, rc);
-
-  d1_.format = &fmt_;
-
-  rstream.is_pinned = 1;
-  rstream.pinned_dev_idx = d1_.info.idx;
-
-  cras_iodev_open_ret[0] = -5;
-  cras_iodev_open_ret[1] = 0;
-  cras_tm_timer_cb = NULL;
-  DL_APPEND(stream_list, &rstream);
-  stream_list_get_ret = stream_list;
-  stream_add_cb(&rstream);
-  /* Init pinned dev fail, not proceed to add stream. */
-  EXPECT_EQ(1, cras_iodev_open_called);
-  EXPECT_EQ(0, audio_thread_add_stream_called);
-
-  EXPECT_NE((void*)NULL, cras_tm_timer_cb);
-  EXPECT_EQ(1, cras_tm_create_timer_called);
-
-  cras_tm_timer_cb(NULL, cras_tm_timer_cb_data);
-  EXPECT_EQ(2, cras_iodev_open_called);
-  EXPECT_EQ(1, audio_thread_add_stream_called);
-
-  cras_iodev_list_rm_output(&d1_);
-  cras_iodev_list_deinit();
-}
-
-static void device_enabled_cb(struct cras_iodev* dev, void* cb_data) {
-  device_enabled_dev = dev;
-  device_enabled_count++;
-  device_enabled_cb_data = cb_data;
-}
-
-static void device_disabled_cb(struct cras_iodev* dev, void* cb_data) {
-  device_disabled_dev = dev;
-  device_disabled_count++;
-  device_disabled_cb_data = cb_data;
-}
-
-TEST_F(IoDevTestSuite, SelectNode) {
-  struct cras_rstream rstream, rstream2;
-  int rc;
-
-  memset(&rstream, 0, sizeof(rstream));
-  memset(&rstream2, 0, sizeof(rstream2));
-
-  cras_iodev_list_init();
-
-  d1_.direction = CRAS_STREAM_OUTPUT;
-  node1.idx = 1;
-  rc = cras_iodev_list_add_output(&d1_);
-  ASSERT_EQ(0, rc);
-
-  d2_.direction = CRAS_STREAM_OUTPUT;
-  node2.idx = 2;
-  rc = cras_iodev_list_add_output(&d2_);
-  ASSERT_EQ(0, rc);
-
-  d1_.format = &fmt_;
-  d2_.format = &fmt_;
-
-  audio_thread_add_open_dev_called = 0;
-  audio_thread_rm_open_dev_called = 0;
-
-  device_enabled_count = 0;
-  device_disabled_count = 0;
-
-  EXPECT_EQ(0, cras_iodev_list_set_device_enabled_callback(
-                   device_enabled_cb, device_disabled_cb, (void*)0xABCD));
-
-  cras_iodev_list_add_active_node(CRAS_STREAM_OUTPUT,
-                                  cras_make_node_id(d1_.info.idx, 1));
-
-  EXPECT_EQ(1, device_enabled_count);
-  EXPECT_EQ(1, cras_observer_notify_active_node_called);
-  EXPECT_EQ(&d1_, cras_iodev_list_get_first_enabled_iodev(CRAS_STREAM_OUTPUT));
-
-  // There should be a disable device call for the fallback device.
-  // But no close call actually happened, because no stream exists.
-  EXPECT_EQ(0, audio_thread_rm_open_dev_called);
-  EXPECT_EQ(1, device_disabled_count);
-  EXPECT_NE(&d1_, device_disabled_dev);
-
-  DL_APPEND(stream_list_get_ret, &rstream);
-  stream_add_cb(&rstream);
-
-  EXPECT_EQ(1, audio_thread_add_stream_called);
-  EXPECT_EQ(1, audio_thread_add_open_dev_called);
-
-  DL_APPEND(stream_list_get_ret, &rstream2);
-  stream_add_cb(&rstream2);
-
-  EXPECT_EQ(2, audio_thread_add_stream_called);
-  EXPECT_EQ(1, audio_thread_add_open_dev_called);
-
-  cras_iodev_list_select_node(CRAS_STREAM_OUTPUT,
-                              cras_make_node_id(d2_.info.idx, 2));
-
-  // Additional enabled devices: fallback device, d2_.
-  EXPECT_EQ(3, device_enabled_count);
-  // Additional disabled devices: d1_, fallback device.
-  EXPECT_EQ(3, device_disabled_count);
-  EXPECT_EQ(2, audio_thread_rm_open_dev_called);
-  EXPECT_EQ(2, cras_observer_notify_active_node_called);
-  EXPECT_EQ(&d2_, cras_iodev_list_get_first_enabled_iodev(CRAS_STREAM_OUTPUT));
-
-  // For each stream, the stream is added for fallback device and d2_.
-  EXPECT_EQ(6, audio_thread_add_stream_called);
-
-  EXPECT_EQ(0, cras_iodev_list_set_device_enabled_callback(NULL, NULL, NULL));
-  cras_iodev_list_deinit();
-}
-
-TEST_F(IoDevTestSuite, SelectPreviouslyEnabledNode) {
-  struct cras_rstream rstream;
-  int rc;
-
-  memset(&rstream, 0, sizeof(rstream));
-
-  cras_iodev_list_init();
-
-  d1_.direction = CRAS_STREAM_OUTPUT;
-  node1.idx = 1;
-  rc = cras_iodev_list_add_output(&d1_);
-  ASSERT_EQ(0, rc);
-
-  d2_.direction = CRAS_STREAM_OUTPUT;
-  node2.idx = 2;
-  rc = cras_iodev_list_add_output(&d2_);
-  ASSERT_EQ(0, rc);
-
-  d1_.format = &fmt_;
-  d2_.format = &fmt_;
-
-  audio_thread_add_open_dev_called = 0;
-  audio_thread_rm_open_dev_called = 0;
-  device_enabled_count = 0;
-  device_disabled_count = 0;
-
-  EXPECT_EQ(0, cras_iodev_list_set_device_enabled_callback(
-                   device_enabled_cb, device_disabled_cb, (void*)0xABCD));
-
-  // Add an active node.
-  cras_iodev_list_add_active_node(CRAS_STREAM_OUTPUT,
-                                  cras_make_node_id(d1_.info.idx, 1));
-
-  EXPECT_EQ(1, device_enabled_count);
-  EXPECT_EQ(1, cras_observer_notify_active_node_called);
-  EXPECT_EQ(&d1_, cras_iodev_list_get_first_enabled_iodev(CRAS_STREAM_OUTPUT));
-
-  // There should be a disable device call for the fallback device.
-  EXPECT_EQ(1, device_disabled_count);
-  EXPECT_NE(&d1_, device_disabled_dev);
-  EXPECT_NE(&d2_, device_disabled_dev);
-
-  DL_APPEND(stream_list_get_ret, &rstream);
-  stream_add_cb(&rstream);
-
-  EXPECT_EQ(1, audio_thread_add_open_dev_called);
-  EXPECT_EQ(1, audio_thread_add_stream_called);
-
-  // Add a second active node.
-  cras_iodev_list_add_active_node(CRAS_STREAM_OUTPUT,
-                                  cras_make_node_id(d2_.info.idx, 2));
-
-  EXPECT_EQ(2, device_enabled_count);
-  EXPECT_EQ(1, device_disabled_count);
-  EXPECT_EQ(2, cras_observer_notify_active_node_called);
-  EXPECT_EQ(&d1_, cras_iodev_list_get_first_enabled_iodev(CRAS_STREAM_OUTPUT));
-
-  EXPECT_EQ(2, audio_thread_add_open_dev_called);
-  EXPECT_EQ(2, audio_thread_add_stream_called);
-  EXPECT_EQ(0, audio_thread_rm_open_dev_called);
-
-  // Select the second added active node - the initially added node should get
-  // disabled.
-  cras_iodev_list_select_node(CRAS_STREAM_OUTPUT,
-                              cras_make_node_id(d2_.info.idx, 2));
-
-  EXPECT_EQ(2, device_enabled_count);
-  EXPECT_EQ(2, device_disabled_count);
-  EXPECT_EQ(3, cras_observer_notify_active_node_called);
-
-  EXPECT_EQ(&d2_, cras_iodev_list_get_first_enabled_iodev(CRAS_STREAM_OUTPUT));
-  EXPECT_EQ(&d1_, device_disabled_dev);
-
-  EXPECT_EQ(2, audio_thread_add_stream_called);
-  EXPECT_EQ(2, audio_thread_add_open_dev_called);
-  EXPECT_EQ(1, audio_thread_rm_open_dev_called);
-
-  EXPECT_EQ(0, cras_iodev_list_set_device_enabled_callback(NULL, NULL, NULL));
-  cras_iodev_list_deinit();
-}
-
-TEST_F(IoDevTestSuite, UpdateActiveNode) {
-  int rc;
-
-  cras_iodev_list_init();
-
-  d1_.direction = CRAS_STREAM_OUTPUT;
-  rc = cras_iodev_list_add_output(&d1_);
-  ASSERT_EQ(0, rc);
-
-  d2_.direction = CRAS_STREAM_OUTPUT;
-  rc = cras_iodev_list_add_output(&d2_);
-  ASSERT_EQ(0, rc);
-
-  cras_iodev_list_select_node(CRAS_STREAM_OUTPUT,
-                              cras_make_node_id(d2_.info.idx, 1));
-
-  EXPECT_EQ(2, update_active_node_called);
-  EXPECT_EQ(&d2_, update_active_node_iodev_val[0]);
-  EXPECT_EQ(1, update_active_node_node_idx_val[0]);
-  EXPECT_EQ(1, update_active_node_dev_enabled_val[0]);
-
-  /* Fake the active node idx on d2_, and later assert this node is
-   * called for update_active_node when d2_ disabled. */
-  d2_.active_node->idx = 2;
-  cras_iodev_list_select_node(CRAS_STREAM_OUTPUT,
-                              cras_make_node_id(d1_.info.idx, 0));
-
-  EXPECT_EQ(5, update_active_node_called);
-  EXPECT_EQ(&d2_, update_active_node_iodev_val[2]);
-  EXPECT_EQ(&d1_, update_active_node_iodev_val[3]);
-  EXPECT_EQ(2, update_active_node_node_idx_val[2]);
-  EXPECT_EQ(0, update_active_node_node_idx_val[3]);
-  EXPECT_EQ(0, update_active_node_dev_enabled_val[2]);
-  EXPECT_EQ(1, update_active_node_dev_enabled_val[3]);
-  EXPECT_EQ(2, cras_observer_notify_active_node_called);
-  cras_iodev_list_deinit();
-}
-
-TEST_F(IoDevTestSuite, SelectNonExistingNode) {
-  int rc;
-  cras_iodev_list_init();
-
-  d1_.direction = CRAS_STREAM_OUTPUT;
-  rc = cras_iodev_list_add_output(&d1_);
-  ASSERT_EQ(0, rc);
-
-  cras_iodev_list_select_node(CRAS_STREAM_OUTPUT,
-                              cras_make_node_id(d1_.info.idx, 0));
-  EXPECT_EQ(1, d1_.is_enabled);
-
-  /* Select non-existing node should disable all devices. */
-  cras_iodev_list_select_node(CRAS_STREAM_OUTPUT, cras_make_node_id(2, 1));
-  EXPECT_EQ(0, d1_.is_enabled);
-  EXPECT_EQ(2, cras_observer_notify_active_node_called);
-  cras_iodev_list_deinit();
-}
-
-// Devices with the wrong direction should be rejected.
-TEST_F(IoDevTestSuite, AddWrongDirection) {
-  int rc;
-
-  rc = cras_iodev_list_add_input(&d1_);
-  EXPECT_EQ(-EINVAL, rc);
-  d1_.direction = CRAS_STREAM_INPUT;
-  rc = cras_iodev_list_add_output(&d1_);
-  EXPECT_EQ(-EINVAL, rc);
-}
-
-// Test adding/removing an iodev to the list.
-TEST_F(IoDevTestSuite, AddRemoveOutput) {
-  struct cras_iodev_info* dev_info;
-  int rc;
-  cras_iodev_list_init();
-
-  rc = cras_iodev_list_add_output(&d1_);
-  EXPECT_EQ(0, rc);
-  // Test can't insert same iodev twice.
-  rc = cras_iodev_list_add_output(&d1_);
-  EXPECT_NE(0, rc);
-  // Test insert a second output.
-  rc = cras_iodev_list_add_output(&d2_);
-  EXPECT_EQ(0, rc);
-
-  // Test that it is removed.
-  rc = cras_iodev_list_rm_output(&d1_);
-  EXPECT_EQ(0, rc);
-  // Test that we can't remove a dev twice.
-  rc = cras_iodev_list_rm_output(&d1_);
-  EXPECT_NE(0, rc);
-  // Should be 1 dev now.
-  rc = cras_iodev_list_get_outputs(&dev_info);
-  EXPECT_EQ(1, rc);
-  free(dev_info);
-  // Passing null should return the number of outputs.
-  rc = cras_iodev_list_get_outputs(NULL);
-  EXPECT_EQ(1, rc);
-  // Remove other dev.
-  rc = cras_iodev_list_rm_output(&d2_);
-  EXPECT_EQ(0, rc);
-  // Should be 0 devs now.
-  rc = cras_iodev_list_get_outputs(&dev_info);
-  EXPECT_EQ(0, rc);
-  free(dev_info);
-  EXPECT_EQ(0, cras_observer_notify_active_node_called);
-  cras_iodev_list_deinit();
-}
-
-// Test output_mute_changed callback.
-TEST_F(IoDevTestSuite, OutputMuteChangedToMute) {
-  cras_iodev_list_init();
-
-  cras_iodev_list_add_output(&d1_);
-  cras_iodev_list_add_output(&d2_);
-  cras_iodev_list_add_output(&d3_);
-
-  // d1_ and d2_ are enabled.
-  cras_iodev_list_enable_dev(&d1_);
-  cras_iodev_list_enable_dev(&d2_);
-
-  // Assume d1 and d2 devices are open.
-  d1_.state = CRAS_IODEV_STATE_OPEN;
-  d2_.state = CRAS_IODEV_STATE_OPEN;
-  d3_.state = CRAS_IODEV_STATE_CLOSE;
-
-  // Execute the callback.
-  observer_ops->output_mute_changed(NULL, 0, 1, 0);
-
-  // d1_ and d2_ should set mute state through audio_thread_dev_start_ramp
-  // because they are both open.
-  EXPECT_EQ(2, audio_thread_dev_start_ramp_called);
-  ASSERT_TRUE(
-      dev_idx_in_vector(audio_thread_dev_start_ramp_dev_vector, d2_.info.idx));
-  ASSERT_TRUE(
-      dev_idx_in_vector(audio_thread_dev_start_ramp_dev_vector, d1_.info.idx));
-  EXPECT_EQ(CRAS_IODEV_RAMP_REQUEST_DOWN_MUTE, audio_thread_dev_start_ramp_req);
-
-  // d3_ should set mute state right away without calling ramp
-  // because it is not open.
-  EXPECT_EQ(1, set_mute_called);
-  EXPECT_EQ(1, set_mute_dev_vector.size());
-  ASSERT_TRUE(device_in_vector(set_mute_dev_vector, &d3_));
-
-  cras_iodev_list_deinit();
-}
-
-// Test output_mute_changed callback.
-TEST_F(IoDevTestSuite, OutputMuteChangedToUnmute) {
-  cras_iodev_list_init();
-
-  cras_iodev_list_add_output(&d1_);
-  cras_iodev_list_add_output(&d2_);
-  cras_iodev_list_add_output(&d3_);
-
-  // d1_ and d2_ are enabled.
-  cras_iodev_list_enable_dev(&d1_);
-  cras_iodev_list_enable_dev(&d2_);
-
-  // Assume d1 and d2 devices are open.
-  d1_.state = CRAS_IODEV_STATE_OPEN;
-  d2_.state = CRAS_IODEV_STATE_CLOSE;
-  d3_.state = CRAS_IODEV_STATE_CLOSE;
-
-  // Execute the callback.
-  observer_ops->output_mute_changed(NULL, 0, 0, 0);
-
-  // d1_ should set mute state through audio_thread_dev_start_ramp.
-  EXPECT_EQ(1, audio_thread_dev_start_ramp_called);
-  ASSERT_TRUE(
-      dev_idx_in_vector(audio_thread_dev_start_ramp_dev_vector, d1_.info.idx));
-  EXPECT_EQ(CRAS_IODEV_RAMP_REQUEST_UP_UNMUTE, audio_thread_dev_start_ramp_req);
-
-  // d2_ and d3_ should set mute state right away because they both
-  // are closed.
-  EXPECT_EQ(2, set_mute_called);
-  EXPECT_EQ(2, set_mute_dev_vector.size());
-  ASSERT_TRUE(device_in_vector(set_mute_dev_vector, &d2_));
-  ASSERT_TRUE(device_in_vector(set_mute_dev_vector, &d3_));
-
-  cras_iodev_list_deinit();
-}
-
-// Test enable/disable an iodev.
-TEST_F(IoDevTestSuite, EnableDisableDevice) {
-  struct cras_rstream rstream;
-  cras_iodev_list_init();
-  device_enabled_count = 0;
-  device_disabled_count = 0;
-  memset(&rstream, 0, sizeof(rstream));
-
-  EXPECT_EQ(0, cras_iodev_list_add_output(&d1_));
-
-  EXPECT_EQ(0, cras_iodev_list_set_device_enabled_callback(
-                   device_enabled_cb, device_disabled_cb, (void*)0xABCD));
-
-  // Enable a device, fallback should be diabled accordingly.
-  cras_iodev_list_enable_dev(&d1_);
-  EXPECT_EQ(&d1_, device_enabled_dev);
-  EXPECT_EQ((void*)0xABCD, device_enabled_cb_data);
-  EXPECT_EQ(1, device_enabled_count);
-  EXPECT_EQ(1, device_disabled_count);
-  EXPECT_EQ(&d1_, cras_iodev_list_get_first_enabled_iodev(CRAS_STREAM_OUTPUT));
-
-  // Connect a normal stream.
-  cras_iodev_open_called = 0;
-  stream_add_cb(&rstream);
-  EXPECT_EQ(1, cras_iodev_open_called);
-
-  stream_list_has_pinned_stream_ret[d1_.info.idx] = 0;
-  // Disable a device. Expect dev is closed because there's no pinned stream.
-  update_active_node_called = 0;
-  cras_iodev_list_disable_dev(&d1_, false);
-  EXPECT_EQ(&d1_, device_disabled_dev);
-  EXPECT_EQ(2, device_disabled_count);
-  EXPECT_EQ((void*)0xABCD, device_disabled_cb_data);
-
-  EXPECT_EQ(1, audio_thread_rm_open_dev_called);
-  EXPECT_EQ(1, cras_iodev_close_called);
-  EXPECT_EQ(&d1_, cras_iodev_close_dev);
-  EXPECT_EQ(1, update_active_node_called);
-
-  EXPECT_EQ(0, cras_iodev_list_set_device_enabled_callback(
-                   device_enabled_cb, device_disabled_cb, (void*)0xCDEF));
-  EXPECT_EQ(2, cras_observer_notify_active_node_called);
-
-  EXPECT_EQ(0, cras_iodev_list_set_device_enabled_callback(NULL, NULL, NULL));
-  cras_iodev_list_deinit();
-}
-
-// Test adding/removing an input dev to the list.
-TEST_F(IoDevTestSuite, AddRemoveInput) {
-  struct cras_iodev_info* dev_info;
-  int rc, i;
-  uint64_t found_mask;
-
-  d1_.direction = CRAS_STREAM_INPUT;
-  d2_.direction = CRAS_STREAM_INPUT;
-
-  cras_iodev_list_init();
-
-  // Check no devices exist initially.
-  rc = cras_iodev_list_get_inputs(NULL);
-  EXPECT_EQ(0, rc);
-
-  rc = cras_iodev_list_add_input(&d1_);
-  EXPECT_EQ(0, rc);
-  EXPECT_GE(d1_.info.idx, 0);
-  // Test can't insert same iodev twice.
-  rc = cras_iodev_list_add_input(&d1_);
-  EXPECT_NE(0, rc);
-  // Test insert a second input.
-  rc = cras_iodev_list_add_input(&d2_);
-  EXPECT_EQ(0, rc);
-  EXPECT_GE(d2_.info.idx, 1);
-  // make sure shared state was updated.
-  EXPECT_EQ(2, server_state_stub.num_input_devs);
-  EXPECT_EQ(d2_.info.idx, server_state_stub.input_devs[0].idx);
-  EXPECT_EQ(d1_.info.idx, server_state_stub.input_devs[1].idx);
-
-  // List the outputs.
-  rc = cras_iodev_list_get_inputs(&dev_info);
-  EXPECT_EQ(2, rc);
-  if (rc == 2) {
-    found_mask = 0;
-    for (i = 0; i < rc; i++) {
-      uint32_t idx = dev_info[i].idx;
-      EXPECT_EQ(0, (found_mask & (static_cast<uint64_t>(1) << idx)));
-      found_mask |= (static_cast<uint64_t>(1) << idx);
-    }
-  }
-  if (rc > 0)
-    free(dev_info);
-
-  // Test that it is removed.
-  rc = cras_iodev_list_rm_input(&d1_);
-  EXPECT_EQ(0, rc);
-  // Test that we can't remove a dev twice.
-  rc = cras_iodev_list_rm_input(&d1_);
-  EXPECT_NE(0, rc);
-  // Should be 1 dev now.
-  rc = cras_iodev_list_get_inputs(&dev_info);
-  EXPECT_EQ(1, rc);
-  free(dev_info);
-  // Remove other dev.
-  rc = cras_iodev_list_rm_input(&d2_);
-  EXPECT_EQ(0, rc);
-  // Shouldn't be any devices left.
-  rc = cras_iodev_list_get_inputs(&dev_info);
-  EXPECT_EQ(0, rc);
-  free(dev_info);
-
-  cras_iodev_list_deinit();
-}
-
-// Test adding/removing an input dev to the list without updating the server
-// state.
-TEST_F(IoDevTestSuite, AddRemoveInputNoSem) {
-  int rc;
-
-  d1_.direction = CRAS_STREAM_INPUT;
-  d2_.direction = CRAS_STREAM_INPUT;
-
-  server_state_update_begin_return = NULL;
-  cras_iodev_list_init();
-
-  rc = cras_iodev_list_add_input(&d1_);
-  EXPECT_EQ(0, rc);
-  EXPECT_GE(d1_.info.idx, 0);
-  rc = cras_iodev_list_add_input(&d2_);
-  EXPECT_EQ(0, rc);
-  EXPECT_GE(d2_.info.idx, 1);
-
-  EXPECT_EQ(0, cras_iodev_list_rm_input(&d1_));
-  EXPECT_EQ(0, cras_iodev_list_rm_input(&d2_));
-  cras_iodev_list_deinit();
-}
-
-// Test removing the last input.
-TEST_F(IoDevTestSuite, RemoveLastInput) {
-  struct cras_iodev_info* dev_info;
-  int rc;
-
-  d1_.direction = CRAS_STREAM_INPUT;
-  d2_.direction = CRAS_STREAM_INPUT;
-
-  cras_iodev_list_init();
-
-  rc = cras_iodev_list_add_input(&d1_);
-  EXPECT_EQ(0, rc);
-  rc = cras_iodev_list_add_input(&d2_);
-  EXPECT_EQ(0, rc);
-
-  // Test that it is removed.
-  rc = cras_iodev_list_rm_input(&d1_);
-  EXPECT_EQ(0, rc);
-  // Add it back.
-  rc = cras_iodev_list_add_input(&d1_);
-  EXPECT_EQ(0, rc);
-  // And again.
-  rc = cras_iodev_list_rm_input(&d1_);
-  EXPECT_EQ(0, rc);
-  // Add it back.
-  rc = cras_iodev_list_add_input(&d1_);
-  EXPECT_EQ(0, rc);
-  // Remove other dev.
-  rc = cras_iodev_list_rm_input(&d2_);
-  EXPECT_EQ(0, rc);
-  // Add it back.
-  rc = cras_iodev_list_add_input(&d2_);
-  EXPECT_EQ(0, rc);
-  // Remove both.
-  rc = cras_iodev_list_rm_input(&d2_);
-  EXPECT_EQ(0, rc);
-  rc = cras_iodev_list_rm_input(&d1_);
-  EXPECT_EQ(0, rc);
-  // Shouldn't be any devices left.
-  rc = cras_iodev_list_get_inputs(&dev_info);
-  EXPECT_EQ(0, rc);
-
-  cras_iodev_list_deinit();
-}
-
-// Test nodes changed notification is sent.
-TEST_F(IoDevTestSuite, NodesChangedNotification) {
-  cras_iodev_list_init();
-  EXPECT_EQ(1, cras_observer_add_called);
-
-  cras_iodev_list_notify_nodes_changed();
-  EXPECT_EQ(1, cras_observer_notify_nodes_called);
-
-  cras_iodev_list_deinit();
-  EXPECT_EQ(1, cras_observer_remove_called);
-}
-
-// Test callback function for left right swap mode is set and called.
-TEST_F(IoDevTestSuite, NodesLeftRightSwappedCallback) {
-  struct cras_iodev iodev;
-  struct cras_ionode ionode;
-  memset(&iodev, 0, sizeof(iodev));
-  memset(&ionode, 0, sizeof(ionode));
-  ionode.dev = &iodev;
-  cras_iodev_list_notify_node_left_right_swapped(&ionode);
-  EXPECT_EQ(1, cras_observer_notify_node_left_right_swapped_called);
-}
-
-// Test callback function for volume and gain are set and called.
-TEST_F(IoDevTestSuite, VolumeGainCallback) {
-  struct cras_iodev iodev;
-  struct cras_ionode ionode;
-  memset(&iodev, 0, sizeof(iodev));
-  memset(&ionode, 0, sizeof(ionode));
-  ionode.dev = &iodev;
-  cras_iodev_list_notify_node_volume(&ionode);
-  cras_iodev_list_notify_node_capture_gain(&ionode);
-  EXPECT_EQ(1, cras_observer_notify_output_node_volume_called);
-  EXPECT_EQ(1, cras_observer_notify_input_node_gain_called);
-}
-
-TEST_F(IoDevTestSuite, IodevListSetNodeAttr) {
-  int rc;
-
-  cras_iodev_list_init();
-
-  // The list is empty now.
-  rc = cras_iodev_list_set_node_attr(cras_make_node_id(0, 0),
-                                     IONODE_ATTR_PLUGGED, 1);
-  EXPECT_LE(rc, 0);
-  EXPECT_EQ(0, set_node_plugged_called);
-
-  // Add two device, each with one node.
-  d1_.direction = CRAS_STREAM_INPUT;
-  EXPECT_EQ(0, cras_iodev_list_add_input(&d1_));
-  node1.idx = 1;
-  EXPECT_EQ(0, cras_iodev_list_add_output(&d2_));
-  node2.idx = 2;
-
-  // Mismatch id
-  rc = cras_iodev_list_set_node_attr(cras_make_node_id(d2_.info.idx, 1),
-                                     IONODE_ATTR_PLUGGED, 1);
-  EXPECT_LT(rc, 0);
-  EXPECT_EQ(0, set_node_plugged_called);
-
-  // Mismatch id
-  rc = cras_iodev_list_set_node_attr(cras_make_node_id(d1_.info.idx, 2),
-                                     IONODE_ATTR_PLUGGED, 1);
-  EXPECT_LT(rc, 0);
-  EXPECT_EQ(0, set_node_plugged_called);
-
-  // Correct device id and node id
-  rc = cras_iodev_list_set_node_attr(cras_make_node_id(d1_.info.idx, 1),
-                                     IONODE_ATTR_PLUGGED, 1);
-  EXPECT_EQ(rc, 0);
-  EXPECT_EQ(1, set_node_plugged_called);
-  cras_iodev_list_deinit();
-}
-
-TEST_F(IoDevTestSuite, SetNodeVolumeCaptureGain) {
-  int rc;
-
-  cras_iodev_list_init();
-
-  d1_.direction = CRAS_STREAM_OUTPUT;
-  rc = cras_iodev_list_add_output(&d1_);
-  ASSERT_EQ(0, rc);
-  node1.idx = 1;
-  node1.dev = &d1_;
-
-  // Do not ramp without software volume.
-  d1_.software_volume_needed = 0;
-  cras_iodev_list_set_node_attr(cras_make_node_id(d1_.info.idx, 1),
-                                IONODE_ATTR_VOLUME, 10);
-  EXPECT_EQ(1, cras_observer_notify_output_node_volume_called);
-  EXPECT_EQ(0, cras_iodev_start_volume_ramp_called);
-
-  // Even with software volume, device with NULL ramp won't trigger ramp start.
-  d1_.software_volume_needed = 1;
-  cras_iodev_list_set_node_attr(cras_make_node_id(d1_.info.idx, 1),
-                                IONODE_ATTR_VOLUME, 20);
-  EXPECT_EQ(2, cras_observer_notify_output_node_volume_called);
-  EXPECT_EQ(0, cras_iodev_start_volume_ramp_called);
-
-  // System mute prevents volume ramp from starting
-  system_get_mute_return = true;
-  cras_iodev_list_set_node_attr(cras_make_node_id(d1_.info.idx, 1),
-                                IONODE_ATTR_VOLUME, 20);
-  EXPECT_EQ(3, cras_observer_notify_output_node_volume_called);
-  EXPECT_EQ(0, cras_iodev_start_volume_ramp_called);
-
-  // Ramp starts only when it's non-NULL, software volume is used, and
-  // system is not muted
-  system_get_mute_return = false;
-  d1_.ramp = reinterpret_cast<struct cras_ramp*>(0x1);
-  cras_iodev_list_set_node_attr(cras_make_node_id(d1_.info.idx, 1),
-                                IONODE_ATTR_VOLUME, 20);
-  EXPECT_EQ(4, cras_observer_notify_output_node_volume_called);
-  EXPECT_EQ(1, cras_iodev_start_volume_ramp_called);
-
-  d1_.direction = CRAS_STREAM_INPUT;
-  cras_iodev_list_set_node_attr(cras_make_node_id(d1_.info.idx, 1),
-                                IONODE_ATTR_CAPTURE_GAIN, 15);
-  EXPECT_EQ(1, cras_observer_notify_input_node_gain_called);
-  cras_iodev_list_deinit();
-}
-
-TEST_F(IoDevTestSuite, SetNodeSwapLeftRight) {
-  int rc;
-
-  cras_iodev_list_init();
-
-  rc = cras_iodev_list_add_output(&d1_);
-  ASSERT_EQ(0, rc);
-  node1.idx = 1;
-  node1.dev = &d1_;
-
-  cras_iodev_list_set_node_attr(cras_make_node_id(d1_.info.idx, 1),
-                                IONODE_ATTR_SWAP_LEFT_RIGHT, 1);
-  EXPECT_EQ(1, set_swap_mode_for_node_called);
-  EXPECT_EQ(1, set_swap_mode_for_node_enable);
-  EXPECT_EQ(1, node1.left_right_swapped);
-  EXPECT_EQ(1, cras_observer_notify_node_left_right_swapped_called);
-
-  cras_iodev_list_set_node_attr(cras_make_node_id(d1_.info.idx, 1),
-                                IONODE_ATTR_SWAP_LEFT_RIGHT, 0);
-  EXPECT_EQ(2, set_swap_mode_for_node_called);
-  EXPECT_EQ(0, set_swap_mode_for_node_enable);
-  EXPECT_EQ(0, node1.left_right_swapped);
-  EXPECT_EQ(2, cras_observer_notify_node_left_right_swapped_called);
-  cras_iodev_list_deinit();
-}
-
-TEST_F(IoDevTestSuite, AddActiveNode) {
-  int rc;
-  struct cras_rstream rstream;
-
-  memset(&rstream, 0, sizeof(rstream));
-
-  cras_iodev_list_init();
-
-  d1_.direction = CRAS_STREAM_OUTPUT;
-  d2_.direction = CRAS_STREAM_OUTPUT;
-  d3_.direction = CRAS_STREAM_OUTPUT;
-  rc = cras_iodev_list_add_output(&d1_);
-  ASSERT_EQ(0, rc);
-  rc = cras_iodev_list_add_output(&d2_);
-  ASSERT_EQ(0, rc);
-  rc = cras_iodev_list_add_output(&d3_);
-  ASSERT_EQ(0, rc);
-
-  d1_.format = &fmt_;
-  d2_.format = &fmt_;
-  d3_.format = &fmt_;
-
-  audio_thread_add_open_dev_called = 0;
-  cras_iodev_list_add_active_node(CRAS_STREAM_OUTPUT,
-                                  cras_make_node_id(d3_.info.idx, 1));
-  ASSERT_EQ(audio_thread_add_open_dev_called, 0);
-  ASSERT_EQ(audio_thread_rm_open_dev_called, 0);
-
-  // If a stream is added, the device should be opened.
-  stream_add_cb(&rstream);
-  ASSERT_EQ(audio_thread_add_open_dev_called, 1);
-  audio_thread_rm_open_dev_called = 0;
-  audio_thread_drain_stream_return = 10;
-  stream_rm_cb(&rstream);
-  ASSERT_EQ(audio_thread_drain_stream_called, 1);
-  ASSERT_EQ(audio_thread_rm_open_dev_called, 0);
-  audio_thread_drain_stream_return = 0;
-  clock_gettime_retspec.tv_sec = 15;
-  clock_gettime_retspec.tv_nsec = 45;
-  stream_rm_cb(&rstream);
-  ASSERT_EQ(audio_thread_drain_stream_called, 2);
-  ASSERT_EQ(0, audio_thread_rm_open_dev_called);
-  // Stream should remain open for a while before being closed.
-  // Test it is closed after 30 seconds.
-  clock_gettime_retspec.tv_sec += 30;
-  cras_tm_timer_cb(NULL, NULL);
-  ASSERT_EQ(1, audio_thread_rm_open_dev_called);
-
-  audio_thread_rm_open_dev_called = 0;
-  cras_iodev_list_rm_output(&d3_);
-  ASSERT_EQ(audio_thread_rm_open_dev_called, 0);
-
-  /* Assert active devices was set to default one, when selected device
-   * removed. */
-  cras_iodev_list_rm_output(&d1_);
-  cras_iodev_list_deinit();
-}
-
-TEST_F(IoDevTestSuite, OutputDevIdleClose) {
-  int rc;
-  struct cras_rstream rstream;
-
-  memset(&rstream, 0, sizeof(rstream));
-  cras_iodev_list_init();
-
-  d1_.direction = CRAS_STREAM_OUTPUT;
-  rc = cras_iodev_list_add_output(&d1_);
-  EXPECT_EQ(0, rc);
-
-  d1_.format = &fmt_;
-
-  audio_thread_add_open_dev_called = 0;
-  cras_iodev_list_add_active_node(CRAS_STREAM_OUTPUT,
-                                  cras_make_node_id(d1_.info.idx, 1));
-  EXPECT_EQ(0, audio_thread_add_open_dev_called);
-  EXPECT_EQ(0, audio_thread_rm_open_dev_called);
-
-  // If a stream is added, the device should be opened.
-  stream_add_cb(&rstream);
-  EXPECT_EQ(1, audio_thread_add_open_dev_called);
-
-  audio_thread_rm_open_dev_called = 0;
-  audio_thread_drain_stream_return = 0;
-  clock_gettime_retspec.tv_sec = 15;
-  stream_rm_cb(&rstream);
-  EXPECT_EQ(1, audio_thread_drain_stream_called);
-  EXPECT_EQ(0, audio_thread_rm_open_dev_called);
-  EXPECT_EQ(1, cras_tm_create_timer_called);
-
-  // Expect no rm dev happen because idle time not yet expire, and
-  // new timer should be scheduled for the rest of the idle time.
-  clock_gettime_retspec.tv_sec += 7;
-  cras_tm_timer_cb(NULL, NULL);
-  EXPECT_EQ(0, audio_thread_rm_open_dev_called);
-  EXPECT_EQ(2, cras_tm_create_timer_called);
-
-  // Expect d1_ be closed upon unplug, and the timer stay armed.
-  cras_iodev_list_rm_output(&d1_);
-  EXPECT_EQ(1, audio_thread_rm_open_dev_called);
-  EXPECT_EQ(0, cras_tm_cancel_timer_called);
-
-  // When timer eventually fired expect there's no more new
-  // timer scheduled because d1_ has closed already.
-  clock_gettime_retspec.tv_sec += 4;
-  cras_tm_timer_cb(NULL, NULL);
-  EXPECT_EQ(2, cras_tm_create_timer_called);
-  cras_iodev_list_deinit();
-}
-
-TEST_F(IoDevTestSuite, DrainTimerCancel) {
-  int rc;
-  struct cras_rstream rstream;
-
-  memset(&rstream, 0, sizeof(rstream));
-
-  cras_iodev_list_init();
-
-  d1_.direction = CRAS_STREAM_OUTPUT;
-  rc = cras_iodev_list_add_output(&d1_);
-  EXPECT_EQ(0, rc);
-
-  d1_.format = &fmt_;
-
-  audio_thread_add_open_dev_called = 0;
-  cras_iodev_list_add_active_node(CRAS_STREAM_OUTPUT,
-                                  cras_make_node_id(d1_.info.idx, 1));
-  EXPECT_EQ(0, audio_thread_add_open_dev_called);
-  EXPECT_EQ(0, audio_thread_rm_open_dev_called);
-
-  // If a stream is added, the device should be opened.
-  stream_add_cb(&rstream);
-  EXPECT_EQ(1, audio_thread_add_open_dev_called);
-
-  audio_thread_rm_open_dev_called = 0;
-  audio_thread_drain_stream_return = 0;
-  clock_gettime_retspec.tv_sec = 15;
-  clock_gettime_retspec.tv_nsec = 45;
-  stream_rm_cb(&rstream);
-  EXPECT_EQ(1, audio_thread_drain_stream_called);
-  EXPECT_EQ(0, audio_thread_rm_open_dev_called);
-
-  // Add stream again, make sure device isn't closed after timeout.
-  audio_thread_add_open_dev_called = 0;
-  stream_add_cb(&rstream);
-  EXPECT_EQ(0, audio_thread_add_open_dev_called);
-
-  clock_gettime_retspec.tv_sec += 30;
-  cras_tm_timer_cb(NULL, NULL);
-  EXPECT_EQ(0, audio_thread_rm_open_dev_called);
-
-  // Remove stream, and check the device is eventually closed.
-  audio_thread_rm_open_dev_called = 0;
-  audio_thread_drain_stream_called = 0;
-  stream_rm_cb(&rstream);
-  EXPECT_EQ(1, audio_thread_drain_stream_called);
-  EXPECT_EQ(0, audio_thread_rm_open_dev_called);
-
-  clock_gettime_retspec.tv_sec += 30;
-  cras_tm_timer_cb(NULL, NULL);
-  EXPECT_EQ(1, audio_thread_rm_open_dev_called);
-  cras_iodev_list_deinit();
-}
-
-TEST_F(IoDevTestSuite, RemoveThenSelectActiveNode) {
-  int rc;
-  cras_node_id_t id;
-  cras_iodev_list_init();
-
-  d1_.direction = CRAS_STREAM_OUTPUT;
-  d2_.direction = CRAS_STREAM_OUTPUT;
-
-  /* d1_ will be the default_output */
-  rc = cras_iodev_list_add_output(&d1_);
-  ASSERT_EQ(0, rc);
-  rc = cras_iodev_list_add_output(&d2_);
-  ASSERT_EQ(0, rc);
-
-  /* Test the scenario that the selected active output removed
-   * from active dev list, should be able to select back again. */
-  id = cras_make_node_id(d2_.info.idx, 1);
-
-  cras_iodev_list_rm_active_node(CRAS_STREAM_OUTPUT, id);
-  ASSERT_EQ(audio_thread_rm_open_dev_called, 0);
-
-  cras_iodev_list_deinit();
-}
-
-TEST_F(IoDevTestSuite, CloseDevWithPinnedStream) {
-  int rc;
-  struct cras_rstream rstream1, rstream2;
-  cras_iodev_list_init();
-
-  d1_.direction = CRAS_STREAM_OUTPUT;
-  d1_.info.idx = 1;
-  rc = cras_iodev_list_add_output(&d1_);
-  EXPECT_EQ(0, rc);
-
-  memset(&rstream1, 0, sizeof(rstream1));
-  memset(&rstream2, 0, sizeof(rstream2));
-  rstream2.is_pinned = 1;
-  rstream2.pinned_dev_idx = d1_.info.idx;
-
-  d1_.format = &fmt_;
-  audio_thread_add_open_dev_called = 0;
-  EXPECT_EQ(0, audio_thread_add_open_dev_called);
-  EXPECT_EQ(0, audio_thread_rm_open_dev_called);
-
-  // Add a normal stream
-  stream_add_cb(&rstream1);
-  EXPECT_EQ(1, audio_thread_add_open_dev_called);
-
-  // Add a pinned stream, expect another dev open call triggered.
-  cras_iodev_open_called = 0;
-  stream_add_cb(&rstream2);
-  EXPECT_EQ(1, cras_iodev_open_called);
-
-  // Force disable d1_ and make sure d1_ gets closed.
-  audio_thread_rm_open_dev_called = 0;
-  update_active_node_called = 0;
-  cras_iodev_close_called = 0;
-  cras_iodev_list_disable_dev(&d1_, 1);
-  EXPECT_EQ(1, audio_thread_rm_open_dev_called);
-  EXPECT_EQ(1, cras_iodev_close_called);
-  EXPECT_EQ(&d1_, cras_iodev_close_dev);
-  EXPECT_EQ(1, update_active_node_called);
-
-  // Add back the two streams, one normal one pinned.
-  audio_thread_add_open_dev_called = 0;
-  audio_thread_rm_open_dev_called = 0;
-  cras_iodev_open_called = 0;
-  stream_add_cb(&rstream2);
-  EXPECT_EQ(1, audio_thread_add_open_dev_called);
-  EXPECT_EQ(1, cras_iodev_open_called);
-  stream_add_cb(&rstream1);
-
-  // Suspend d1_ and make sure d1_ gets closed.
-  update_active_node_called = 0;
-  cras_iodev_close_called = 0;
-  cras_iodev_list_suspend_dev(d1_.info.idx);
-  EXPECT_EQ(1, audio_thread_rm_open_dev_called);
-  EXPECT_EQ(1, cras_iodev_close_called);
-  EXPECT_EQ(&d1_, cras_iodev_close_dev);
-  EXPECT_EQ(1, update_active_node_called);
-
-  cras_iodev_list_resume_dev(d1_.info.idx);
-
-  cras_iodev_list_deinit();
-}
-
-TEST_F(IoDevTestSuite, DisableDevWithPinnedStream) {
-  int rc;
-  struct cras_rstream rstream1;
-  cras_iodev_list_init();
-
-  d1_.direction = CRAS_STREAM_OUTPUT;
-  rc = cras_iodev_list_add_output(&d1_);
-  EXPECT_EQ(0, rc);
-
-  memset(&rstream1, 0, sizeof(rstream1));
-  rstream1.is_pinned = 1;
-  rstream1.pinned_dev_idx = d1_.info.idx;
-
-  d1_.format = &fmt_;
-  audio_thread_add_open_dev_called = 0;
-  cras_iodev_list_add_active_node(CRAS_STREAM_OUTPUT,
-                                  cras_make_node_id(d1_.info.idx, 1));
-  EXPECT_EQ(0, audio_thread_add_open_dev_called);
-  EXPECT_EQ(0, audio_thread_rm_open_dev_called);
-
-  // Add a pinned stream.
-  cras_iodev_open_called = 0;
-  stream_add_cb(&rstream1);
-  EXPECT_EQ(1, audio_thread_add_open_dev_called);
-  EXPECT_EQ(1, cras_iodev_open_called);
-
-  // Disable d1_ expect no close dev triggered because pinned stream.
-  stream_list_has_pinned_stream_ret[d1_.info.idx] = 1;
-  audio_thread_rm_open_dev_called = 0;
-  update_active_node_called = 0;
-  cras_iodev_close_called = 0;
-  cras_iodev_list_disable_dev(&d1_, 0);
-  EXPECT_EQ(0, audio_thread_rm_open_dev_called);
-  EXPECT_EQ(0, cras_iodev_close_called);
-  EXPECT_EQ(0, update_active_node_called);
-
-  cras_iodev_list_deinit();
-}
-
-TEST_F(IoDevTestSuite, AddRemovePinnedStream) {
-  struct cras_rstream rstream;
-
-  cras_iodev_list_init();
-
-  // Add 2 output devices.
-  d1_.direction = CRAS_STREAM_OUTPUT;
-  d1_.info.idx = 1;
-  EXPECT_EQ(0, cras_iodev_list_add_output(&d1_));
-  cras_iodev_list_select_node(CRAS_STREAM_OUTPUT,
-                              cras_make_node_id(d1_.info.idx, 0));
-  EXPECT_EQ(2, update_active_node_called);
-  EXPECT_EQ(&d1_, update_active_node_iodev_val[0]);
-
-  d2_.direction = CRAS_STREAM_OUTPUT;
-  d2_.info.idx = 2;
-  EXPECT_EQ(0, cras_iodev_list_add_output(&d2_));
-
-  d1_.format = &fmt_;
-  d2_.format = &fmt_;
-
-  // Setup pinned stream.
-  memset(&rstream, 0, sizeof(rstream));
-  rstream.is_pinned = 1;
-  rstream.pinned_dev_idx = d1_.info.idx;
-
-  // Add pinned stream to d1.
-  update_active_node_called = 0;
-  EXPECT_EQ(0, stream_add_cb(&rstream));
-  EXPECT_EQ(1, audio_thread_add_stream_called);
-  EXPECT_EQ(&d1_, audio_thread_add_stream_dev);
-  EXPECT_EQ(&rstream, audio_thread_add_stream_stream);
-  EXPECT_EQ(1, update_active_node_called);
-  // Init d1_ because of pinned stream
-  EXPECT_EQ(&d1_, update_active_node_iodev_val[0]);
-
-  // Select d2, check pinned stream is not added to d2.
-  update_active_node_called = 0;
-  stream_list_has_pinned_stream_ret[d1_.info.idx] = 1;
-  cras_iodev_list_select_node(CRAS_STREAM_OUTPUT,
-                              cras_make_node_id(d2_.info.idx, 0));
-  EXPECT_EQ(1, audio_thread_add_stream_called);
-  EXPECT_EQ(2, update_active_node_called);
-  // Unselect d1_ and select to d2_
-  EXPECT_EQ(&d2_, update_active_node_iodev_val[0]);
-  EXPECT_EQ(&mock_empty_iodev[CRAS_STREAM_OUTPUT],
-            update_active_node_iodev_val[1]);
-
-  // Remove pinned stream from d1, check d1 is closed after stream removed.
-  update_active_node_called = 0;
-  stream_list_has_pinned_stream_ret[d1_.info.idx] = 0;
-  EXPECT_EQ(0, stream_rm_cb(&rstream));
-  EXPECT_EQ(1, cras_iodev_close_called);
-  EXPECT_EQ(&d1_, cras_iodev_close_dev);
-  EXPECT_EQ(1, update_active_node_called);
-  // close pinned device
-  EXPECT_EQ(&d1_, update_active_node_iodev_val[0]);
-
-  // Assume dev is already opened, add pin stream should not trigger another
-  // update_active_node call, but will trigger audio_thread_add_stream.
-  audio_thread_is_dev_open_ret = 1;
-  update_active_node_called = 0;
-  EXPECT_EQ(0, stream_add_cb(&rstream));
-  EXPECT_EQ(0, update_active_node_called);
-  EXPECT_EQ(2, audio_thread_add_stream_called);
-
-  cras_iodev_list_deinit();
-}
-
-TEST_F(IoDevTestSuite, SuspendResumePinnedStream) {
-  struct cras_rstream rstream;
-
-  cras_iodev_list_init();
-
-  // Add 2 output devices.
-  d1_.direction = CRAS_STREAM_OUTPUT;
-  EXPECT_EQ(0, cras_iodev_list_add_output(&d1_));
-  d2_.direction = CRAS_STREAM_OUTPUT;
-  EXPECT_EQ(0, cras_iodev_list_add_output(&d2_));
-
-  d1_.format = &fmt_;
-  d2_.format = &fmt_;
-
-  // Setup pinned stream.
-  memset(&rstream, 0, sizeof(rstream));
-  rstream.is_pinned = 1;
-  rstream.pinned_dev_idx = d1_.info.idx;
-
-  // Add pinned stream to d1.
-  EXPECT_EQ(0, stream_add_cb(&rstream));
-  EXPECT_EQ(1, audio_thread_add_stream_called);
-  EXPECT_EQ(&d1_, audio_thread_add_stream_dev);
-  EXPECT_EQ(&rstream, audio_thread_add_stream_stream);
-
-  DL_APPEND(stream_list_get_ret, &rstream);
-
-  // Test for suspend
-
-  // Device state enters no_stream after stream is disconnected.
-  d1_.state = CRAS_IODEV_STATE_NO_STREAM_RUN;
-  // Device has no pinned stream now. But this pinned stream remains in
-  // stream_list.
-  stream_list_has_pinned_stream_ret[d1_.info.idx] = 0;
-
-  // Suspend
-  observer_ops->suspend_changed(NULL, 1);
-
-  // Verify that stream is disconnected and d1 is closed.
-  EXPECT_EQ(1, audio_thread_disconnect_stream_called);
-  EXPECT_EQ(&rstream, audio_thread_disconnect_stream_stream);
-  EXPECT_EQ(1, cras_iodev_close_called);
-  EXPECT_EQ(&d1_, cras_iodev_close_dev);
-
-  // Test for resume
-  cras_iodev_open_called = 0;
-  audio_thread_add_stream_called = 0;
-  audio_thread_add_stream_stream = NULL;
-  d1_.state = CRAS_IODEV_STATE_CLOSE;
-
-  // Resume
-  observer_ops->suspend_changed(NULL, 0);
-
-  // Verify that device is opened and stream is attached to the device.
-  EXPECT_EQ(1, cras_iodev_open_called);
-  EXPECT_EQ(1, audio_thread_add_stream_called);
-  EXPECT_EQ(&rstream, audio_thread_add_stream_stream);
-  cras_iodev_list_deinit();
-}
-
-TEST_F(IoDevTestSuite, HotwordStreamsAddedThenSuspendResume) {
-  struct cras_rstream rstream;
-  struct cras_rstream* stream_list = NULL;
-  cras_iodev_list_init();
-
-  node1.type = CRAS_NODE_TYPE_HOTWORD;
-  d1_.direction = CRAS_STREAM_INPUT;
-  EXPECT_EQ(0, cras_iodev_list_add_input(&d1_));
-
-  d1_.format = &fmt_;
-
-  memset(&rstream, 0, sizeof(rstream));
-  rstream.is_pinned = 1;
-  rstream.pinned_dev_idx = d1_.info.idx;
-  rstream.flags = HOTWORD_STREAM;
-
-  /* Add a hotword stream. */
-  EXPECT_EQ(0, stream_add_cb(&rstream));
-  EXPECT_EQ(1, audio_thread_add_stream_called);
-  EXPECT_EQ(&d1_, audio_thread_add_stream_dev);
-  EXPECT_EQ(&rstream, audio_thread_add_stream_stream);
-
-  DL_APPEND(stream_list, &rstream);
-  stream_list_get_ret = stream_list;
-
-  /* Suspend hotword streams, verify the existing stream disconnects
-   * from the hotword device and connects to the empty iodev. */
-  EXPECT_EQ(0, cras_iodev_list_suspend_hotword_streams());
-  EXPECT_EQ(1, audio_thread_disconnect_stream_called);
-  EXPECT_EQ(&rstream, audio_thread_disconnect_stream_stream);
-  EXPECT_EQ(&d1_, audio_thread_disconnect_stream_dev);
-  EXPECT_EQ(2, audio_thread_add_stream_called);
-  EXPECT_EQ(&rstream, audio_thread_add_stream_stream);
-  EXPECT_EQ(&mock_hotword_iodev, audio_thread_add_stream_dev);
-
-  /* Resume hotword streams, verify the stream disconnects from
-   * the empty iodev and connects back to the real hotword iodev. */
-  EXPECT_EQ(0, cras_iodev_list_resume_hotword_stream());
-  EXPECT_EQ(2, audio_thread_disconnect_stream_called);
-  EXPECT_EQ(&rstream, audio_thread_disconnect_stream_stream);
-  EXPECT_EQ(&mock_hotword_iodev, audio_thread_disconnect_stream_dev);
-  EXPECT_EQ(3, audio_thread_add_stream_called);
-  EXPECT_EQ(&rstream, audio_thread_add_stream_stream);
-  EXPECT_EQ(&d1_, audio_thread_add_stream_dev);
-  cras_iodev_list_deinit();
-}
-
-TEST_F(IoDevTestSuite, HotwordStreamsAddedAfterSuspend) {
-  struct cras_rstream rstream;
-  struct cras_rstream* stream_list = NULL;
-  cras_iodev_list_init();
-
-  node1.type = CRAS_NODE_TYPE_HOTWORD;
-  d1_.direction = CRAS_STREAM_INPUT;
-  EXPECT_EQ(0, cras_iodev_list_add_input(&d1_));
-
-  d1_.format = &fmt_;
-
-  memset(&rstream, 0, sizeof(rstream));
-  rstream.is_pinned = 1;
-  rstream.pinned_dev_idx = d1_.info.idx;
-  rstream.flags = HOTWORD_STREAM;
-
-  /* Suspends hotword streams before a stream connected. */
-  EXPECT_EQ(0, cras_iodev_list_suspend_hotword_streams());
-  EXPECT_EQ(0, audio_thread_disconnect_stream_called);
-  EXPECT_EQ(0, audio_thread_add_stream_called);
-
-  DL_APPEND(stream_list, &rstream);
-  stream_list_get_ret = stream_list;
-
-  /* Hotword stream connected, verify it is added to the empty iodev. */
-  EXPECT_EQ(0, stream_add_cb(&rstream));
-  EXPECT_EQ(1, audio_thread_add_stream_called);
-  EXPECT_EQ(&mock_hotword_iodev, audio_thread_add_stream_dev);
-  EXPECT_EQ(&rstream, audio_thread_add_stream_stream);
-
-  /* Resume hotword streams, now the existing hotword stream should disconnect
-   * from the empty iodev and connect to the real hotword iodev. */
-  EXPECT_EQ(0, cras_iodev_list_resume_hotword_stream());
-  EXPECT_EQ(1, audio_thread_disconnect_stream_called);
-  EXPECT_EQ(&rstream, audio_thread_disconnect_stream_stream);
-  EXPECT_EQ(&mock_hotword_iodev, audio_thread_disconnect_stream_dev);
-  EXPECT_EQ(2, audio_thread_add_stream_called);
-  EXPECT_EQ(&rstream, audio_thread_add_stream_stream);
-  EXPECT_EQ(&d1_, audio_thread_add_stream_dev);
-  cras_iodev_list_deinit();
-}
-
-TEST_F(IoDevTestSuite, GetSCOPCMIodevs) {
-  cras_iodev_list_init();
-
-  fake_sco_in_dev.direction = CRAS_STREAM_INPUT;
-  fake_sco_in_node.is_sco_pcm = 1;
-  cras_iodev_list_add_input(&fake_sco_in_dev);
-  fake_sco_out_dev.direction = CRAS_STREAM_OUTPUT;
-  fake_sco_out_node.is_sco_pcm = 1;
-  cras_iodev_list_add_output(&fake_sco_out_dev);
-
-  EXPECT_EQ(&fake_sco_in_dev,
-            cras_iodev_list_get_sco_pcm_iodev(CRAS_STREAM_INPUT));
-  EXPECT_EQ(&fake_sco_out_dev,
-            cras_iodev_list_get_sco_pcm_iodev(CRAS_STREAM_OUTPUT));
-
-  cras_iodev_list_deinit();
-}
-
-TEST_F(IoDevTestSuite, HotwordStreamsPausedAtSystemSuspend) {
-  struct cras_rstream rstream;
-  struct cras_rstream* stream_list = NULL;
-  cras_iodev_list_init();
-
-  node1.type = CRAS_NODE_TYPE_HOTWORD;
-  d1_.direction = CRAS_STREAM_INPUT;
-  EXPECT_EQ(0, cras_iodev_list_add_input(&d1_));
-
-  d1_.format = &fmt_;
-
-  memset(&rstream, 0, sizeof(rstream));
-  rstream.is_pinned = 1;
-  rstream.pinned_dev_idx = d1_.info.idx;
-  rstream.flags = HOTWORD_STREAM;
-
-  /* Add a hotword stream. */
-  EXPECT_EQ(0, stream_add_cb(&rstream));
-  EXPECT_EQ(1, audio_thread_add_stream_called);
-  EXPECT_EQ(&d1_, audio_thread_add_stream_dev);
-  EXPECT_EQ(&rstream, audio_thread_add_stream_stream);
-
-  DL_APPEND(stream_list, &rstream);
-  stream_list_get_ret = stream_list;
-
-  server_state_hotword_pause_at_suspend = 1;
-
-  /* Trigger system suspend. Verify hotword stream is moved to empty dev. */
-  observer_ops->suspend_changed(NULL, 1);
-  EXPECT_EQ(1, audio_thread_disconnect_stream_called);
-  EXPECT_EQ(&rstream, audio_thread_disconnect_stream_stream);
-  EXPECT_EQ(&d1_, audio_thread_disconnect_stream_dev);
-  EXPECT_EQ(2, audio_thread_add_stream_called);
-  EXPECT_EQ(&rstream, audio_thread_add_stream_stream);
-  EXPECT_EQ(&mock_hotword_iodev, audio_thread_add_stream_dev);
-
-  /* Trigger system resume. Verify hotword stream is moved to real dev.*/
-  observer_ops->suspend_changed(NULL, 0);
-  EXPECT_EQ(2, audio_thread_disconnect_stream_called);
-  EXPECT_EQ(&rstream, audio_thread_disconnect_stream_stream);
-  EXPECT_EQ(&mock_hotword_iodev, audio_thread_disconnect_stream_dev);
-  EXPECT_EQ(3, audio_thread_add_stream_called);
-  EXPECT_EQ(&rstream, audio_thread_add_stream_stream);
-  EXPECT_EQ(&d1_, audio_thread_add_stream_dev);
-
-  server_state_hotword_pause_at_suspend = 0;
-  audio_thread_disconnect_stream_called = 0;
-  audio_thread_add_stream_called = 0;
-
-  /* Trigger system suspend. Verify hotword stream is not touched. */
-  observer_ops->suspend_changed(NULL, 1);
-  EXPECT_EQ(0, audio_thread_disconnect_stream_called);
-  EXPECT_EQ(0, audio_thread_add_stream_called);
-
-  /* Trigger system resume. Verify hotword stream is not touched.*/
-  observer_ops->suspend_changed(NULL, 0);
-  EXPECT_EQ(0, audio_thread_disconnect_stream_called);
-  EXPECT_EQ(0, audio_thread_add_stream_called);
-
-  cras_iodev_list_deinit();
-}
-
-TEST_F(IoDevTestSuite, SetNoiseCancellation) {
-  struct cras_rstream rstream;
-  struct cras_rstream* stream_list = NULL;
-  int rc;
-
-  memset(&rstream, 0, sizeof(rstream));
-
-  cras_iodev_list_init();
-
-  d1_.direction = CRAS_STREAM_INPUT;
-  rc = cras_iodev_list_add_input(&d1_);
-  ASSERT_EQ(0, rc);
-
-  d1_.format = &fmt_;
-
-  rstream.direction = CRAS_STREAM_INPUT;
-
-  audio_thread_add_open_dev_called = 0;
-  audio_thread_rm_open_dev_called = 0;
-  cras_iodev_list_add_active_node(CRAS_STREAM_INPUT,
-                                  cras_make_node_id(d1_.info.idx, 1));
-  DL_APPEND(stream_list, &rstream);
-  stream_add_cb(&rstream);
-  stream_list_get_ret = stream_list;
-  EXPECT_EQ(1, audio_thread_add_stream_called);
-  EXPECT_EQ(1, audio_thread_add_open_dev_called);
-
-  // reset_for_noise_cancellation causes device suspend & resume
-  // While suspending d1_: rm d1_, open fallback
-  // While resuming d1_: rm fallback, open d1_
-  cras_iodev_list_reset_for_noise_cancellation();
-  EXPECT_EQ(3, audio_thread_add_open_dev_called);
-  EXPECT_EQ(2, audio_thread_rm_open_dev_called);
-
-  cras_iodev_list_deinit();
-}
-
-}  //  namespace
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
-
-extern "C" {
-
-// Stubs
-struct main_thread_event_log* main_log;
-
-struct cras_server_state* cras_system_state_update_begin() {
-  return server_state_update_begin_return;
-}
-
-void cras_system_state_update_complete() {}
-
-int cras_system_get_mute() {
-  return system_get_mute_return;
-}
-
-bool cras_system_get_noise_cancellation_enabled() {
-  return false;
-}
-
-struct audio_thread* audio_thread_create() {
-  return &thread;
-}
-
-int audio_thread_start(struct audio_thread* thread) {
-  return 0;
-}
-
-void audio_thread_destroy(struct audio_thread* thread) {}
-
-int audio_thread_set_active_dev(struct audio_thread* thread,
-                                struct cras_iodev* dev) {
-  audio_thread_set_active_dev_called++;
-  audio_thread_set_active_dev_val = dev;
-  return 0;
-}
-
-void audio_thread_remove_streams(struct audio_thread* thread,
-                                 enum CRAS_STREAM_DIRECTION dir) {
-  audio_thread_remove_streams_active_dev = audio_thread_set_active_dev_val;
-}
-
-int audio_thread_add_open_dev(struct audio_thread* thread,
-                              struct cras_iodev* dev) {
-  audio_thread_add_open_dev_dev = dev;
-  audio_thread_add_open_dev_called++;
-  return 0;
-}
-
-int audio_thread_rm_open_dev(struct audio_thread* thread,
-                             enum CRAS_STREAM_DIRECTION dir,
-                             unsigned int dev_idx) {
-  audio_thread_rm_open_dev_called++;
-  return 0;
-}
-
-int audio_thread_is_dev_open(struct audio_thread* thread,
-                             struct cras_iodev* dev) {
-  return audio_thread_is_dev_open_ret;
-}
-
-int audio_thread_add_stream(struct audio_thread* thread,
-                            struct cras_rstream* stream,
-                            struct cras_iodev** devs,
-                            unsigned int num_devs) {
-  audio_thread_add_stream_called++;
-  audio_thread_add_stream_stream = stream;
-  audio_thread_add_stream_dev = (num_devs ? devs[0] : NULL);
-  return 0;
-}
-
-int audio_thread_disconnect_stream(struct audio_thread* thread,
-                                   struct cras_rstream* stream,
-                                   struct cras_iodev* iodev) {
-  audio_thread_disconnect_stream_called++;
-  audio_thread_disconnect_stream_stream = stream;
-  audio_thread_disconnect_stream_dev = iodev;
-  return 0;
-}
-
-int audio_thread_drain_stream(struct audio_thread* thread,
-                              struct cras_rstream* stream) {
-  audio_thread_drain_stream_called++;
-  return audio_thread_drain_stream_return;
-}
-
-struct cras_iodev* empty_iodev_create(enum CRAS_STREAM_DIRECTION direction,
-                                      enum CRAS_NODE_TYPE node_type) {
-  struct cras_iodev* dev;
-  if (node_type == CRAS_NODE_TYPE_HOTWORD) {
-    dev = &mock_hotword_iodev;
-  } else {
-    dev = &mock_empty_iodev[direction];
-  }
-  dev->direction = direction;
-  if (dev->active_node == NULL) {
-    struct cras_ionode* node = (struct cras_ionode*)calloc(1, sizeof(*node));
-    node->type = node_type;
-    dev->active_node = node;
-  }
-  return dev;
-}
-
-void empty_iodev_destroy(struct cras_iodev* iodev) {
-  if (iodev->active_node) {
-    free(iodev->active_node);
-    iodev->active_node = NULL;
-  }
-}
-
-struct cras_iodev* test_iodev_create(enum CRAS_STREAM_DIRECTION direction,
-                                     enum TEST_IODEV_TYPE type) {
-  return NULL;
-}
-
-void test_iodev_command(struct cras_iodev* iodev,
-                        enum CRAS_TEST_IODEV_CMD command,
-                        unsigned int data_len,
-                        const uint8_t* data) {}
-
-struct cras_iodev* loopback_iodev_create(enum CRAS_LOOPBACK_TYPE type) {
-  return &loopback_input;
-}
-
-void loopback_iodev_destroy(struct cras_iodev* iodev) {}
-
-int cras_iodev_open(struct cras_iodev* iodev,
-                    unsigned int cb_level,
-                    const struct cras_audio_format* fmt) {
-  if (cras_iodev_open_ret[cras_iodev_open_called] == 0)
-    iodev->state = CRAS_IODEV_STATE_OPEN;
-  cras_iodev_open_fmt = *fmt;
-  iodev->format = &cras_iodev_open_fmt;
-  return cras_iodev_open_ret[cras_iodev_open_called++];
-}
-
-int cras_iodev_close(struct cras_iodev* iodev) {
-  iodev->state = CRAS_IODEV_STATE_CLOSE;
-  cras_iodev_close_called++;
-  cras_iodev_close_dev = iodev;
-  iodev->format = NULL;
-  return 0;
-}
-
-int cras_iodev_set_format(struct cras_iodev* iodev,
-                          const struct cras_audio_format* fmt) {
-  return 0;
-}
-
-int cras_iodev_set_mute(struct cras_iodev* iodev) {
-  set_mute_called++;
-  set_mute_dev_vector.push_back(iodev);
-  return 0;
-}
-
-void cras_iodev_set_node_plugged(struct cras_ionode* node, int plugged) {
-  set_node_plugged_called++;
-}
-
-bool cras_iodev_support_noise_cancellation(const struct cras_iodev* iodev) {
-  return true;
-}
-
-int cras_iodev_start_volume_ramp(struct cras_iodev* odev,
-                                 unsigned int old_volume,
-                                 unsigned int new_volume) {
-  cras_iodev_start_volume_ramp_called++;
-  return 0;
-}
-bool cras_iodev_is_aec_use_case(const struct cras_ionode* node) {
-  return 1;
-}
-bool stream_list_has_pinned_stream(struct stream_list* list,
-                                   unsigned int dev_idx) {
-  return stream_list_has_pinned_stream_ret[dev_idx];
-}
-
-struct stream_list* stream_list_create(stream_callback* add_cb,
-                                       stream_callback* rm_cb,
-                                       stream_create_func* create_cb,
-                                       stream_destroy_func* destroy_cb,
-                                       struct cras_tm* timer_manager) {
-  stream_add_cb = add_cb;
-  stream_rm_cb = rm_cb;
-  return reinterpret_cast<stream_list*>(0xf00);
-}
-
-void stream_list_destroy(struct stream_list* list) {}
-
-struct cras_rstream* stream_list_get(struct stream_list* list) {
-  return stream_list_get_ret;
-}
-void server_stream_create(struct stream_list* stream_list,
-                          unsigned int dev_idx) {
-  server_stream_create_called++;
-}
-void server_stream_destroy(struct stream_list* stream_list,
-                           unsigned int dev_idx) {
-  server_stream_destroy_called++;
-}
-
-int cras_rstream_create(struct cras_rstream_config* config,
-                        struct cras_rstream** stream_out) {
-  return 0;
-}
-
-void cras_rstream_destroy(struct cras_rstream* rstream) {}
-
-struct cras_tm* cras_system_state_get_tm() {
-  return NULL;
-}
-
-struct cras_timer* cras_tm_create_timer(struct cras_tm* tm,
-                                        unsigned int ms,
-                                        void (*cb)(struct cras_timer* t,
-                                                   void* data),
-                                        void* cb_data) {
-  cras_tm_timer_cb = cb;
-  cras_tm_timer_cb_data = cb_data;
-  cras_tm_create_timer_called++;
-  return reinterpret_cast<struct cras_timer*>(0x404);
-}
-
-void cras_tm_cancel_timer(struct cras_tm* tm, struct cras_timer* t) {
-  cras_tm_cancel_timer_called++;
-}
-
-void cras_fmt_conv_destroy(struct cras_fmt_conv* conv) {}
-
-struct cras_fmt_conv* cras_channel_remix_conv_create(unsigned int num_channels,
-                                                     const float* coefficient) {
-  return NULL;
-}
-
-void cras_channel_remix_convert(struct cras_fmt_conv* conv,
-                                uint8_t* in_buf,
-                                size_t frames) {}
-
-struct cras_observer_client* cras_observer_add(
-    const struct cras_observer_ops* ops,
-    void* context) {
-  observer_ops = (struct cras_observer_ops*)calloc(1, sizeof(*ops));
-  memcpy(observer_ops, ops, sizeof(*ops));
-  cras_observer_add_called++;
-  return reinterpret_cast<struct cras_observer_client*>(0x55);
-}
-
-void cras_observer_remove(struct cras_observer_client* client) {
-  if (observer_ops)
-    free(observer_ops);
-  cras_observer_remove_called++;
-}
-
-void cras_observer_notify_nodes(void) {
-  cras_observer_notify_nodes_called++;
-}
-
-void cras_observer_notify_active_node(enum CRAS_STREAM_DIRECTION direction,
-                                      cras_node_id_t node_id) {
-  cras_observer_notify_active_node_called++;
-}
-
-void cras_observer_notify_output_node_volume(cras_node_id_t node_id,
-                                             int32_t volume) {
-  cras_observer_notify_output_node_volume_called++;
-}
-
-void cras_observer_notify_node_left_right_swapped(cras_node_id_t node_id,
-                                                  int swapped) {
-  cras_observer_notify_node_left_right_swapped_called++;
-}
-
-void cras_observer_notify_input_node_gain(cras_node_id_t node_id,
-                                          int32_t gain) {
-  cras_observer_notify_input_node_gain_called++;
-}
-
-int audio_thread_dev_start_ramp(struct audio_thread* thread,
-                                unsigned int dev_idx,
-                                enum CRAS_IODEV_RAMP_REQUEST request) {
-  audio_thread_dev_start_ramp_called++;
-  audio_thread_dev_start_ramp_dev_vector.push_back(dev_idx);
-  audio_thread_dev_start_ramp_req = request;
-  return 0;
-}
-
-#ifdef HAVE_WEBRTC_APM
-struct cras_apm* cras_apm_list_add_apm(struct cras_apm_list* list,
-                                       void* dev_ptr,
-                                       const struct cras_audio_format* fmt,
-                                       bool is_internal_dev) {
-  return NULL;
-}
-void cras_apm_list_remove_apm(struct cras_apm_list* list, void* dev_ptr) {}
-int cras_apm_list_init(const char* device_config_dir) {
-  return 0;
-}
-#endif
-
-//  From librt.
-int clock_gettime(clockid_t clk_id, struct timespec* tp) {
-  tp->tv_sec = clock_gettime_retspec.tv_sec;
-  tp->tv_nsec = clock_gettime_retspec.tv_nsec;
-  return 0;
-}
-
-bool cras_system_get_hotword_pause_at_suspend() {
-  return !!server_state_hotword_pause_at_suspend;
-}
-
-}  // extern "C"
diff --git a/cras/src/tests/iodev_stub.cc b/cras/src/tests/iodev_stub.cc
deleted file mode 100644
index 2e84faa..0000000
--- a/cras/src/tests/iodev_stub.cc
+++ /dev/null
@@ -1,225 +0,0 @@
-/* Copyright 2017 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <time.h>
-
-#include <unordered_map>
-
-extern "C" {
-#include "cras_iodev.h"
-#include "dev_stream.h"
-#include "utlist.h"
-}
-
-namespace {
-struct cb_data {
-  int frames_queued_ret;
-  timespec frames_queued_ts;
-};
-std::unordered_map<cras_iodev*, cb_data> frames_queued_map;
-std::unordered_map<cras_iodev*, cb_data> valid_frames_map;
-std::unordered_map<cras_iodev*, timespec> drop_time_map;
-std::unordered_map<const cras_iodev*, double> est_rate_ratio_map;
-std::unordered_map<const cras_iodev*, int> update_rate_map;
-std::unordered_map<const cras_ionode*, int> on_internal_card_map;
-}  // namespace
-
-void iodev_stub_reset() {
-  frames_queued_map.clear();
-  valid_frames_map.clear();
-  drop_time_map.clear();
-  est_rate_ratio_map.clear();
-  update_rate_map.clear();
-  on_internal_card_map.clear();
-}
-
-void iodev_stub_est_rate_ratio(cras_iodev* iodev, double ratio) {
-  est_rate_ratio_map.insert({iodev, ratio});
-}
-
-void iodev_stub_update_rate(cras_iodev* iodev, int data) {
-  update_rate_map.insert({iodev, data});
-}
-
-void iodev_stub_on_internal_card(cras_ionode* node, int data) {
-  on_internal_card_map.insert({node, data});
-}
-
-void iodev_stub_frames_queued(cras_iodev* iodev, int ret, timespec ts) {
-  cb_data data = {ret, ts};
-  frames_queued_map.insert({iodev, data});
-}
-
-void iodev_stub_valid_frames(cras_iodev* iodev, int ret, timespec ts) {
-  cb_data data = {ret, ts};
-  valid_frames_map.insert({iodev, data});
-}
-
-bool iodev_stub_get_drop_time(cras_iodev* iodev, timespec* ts) {
-  auto elem = drop_time_map.find(iodev);
-  if (elem != drop_time_map.end()) {
-    *ts = elem->second;
-    return true;
-  }
-  return false;
-}
-
-extern "C" {
-
-int cras_iodev_add_stream(struct cras_iodev* iodev, struct dev_stream* stream) {
-  DL_APPEND(iodev->streams, stream);
-  return 0;
-}
-
-int cras_iodev_get_valid_frames(struct cras_iodev* iodev,
-                                struct timespec* tstamp) {
-  auto elem = valid_frames_map.find(iodev);
-  if (elem != valid_frames_map.end()) {
-    *tstamp = elem->second.frames_queued_ts;
-    return elem->second.frames_queued_ret;
-  }
-  clock_gettime(CLOCK_MONOTONIC_RAW, tstamp);
-  return 0;
-}
-
-double cras_iodev_get_est_rate_ratio(const struct cras_iodev* iodev) {
-  auto elem = est_rate_ratio_map.find(iodev);
-  if (elem != est_rate_ratio_map.end()) {
-    return elem->second;
-  }
-  return 1.0f;
-}
-
-int cras_iodev_get_dsp_delay(const struct cras_iodev* iodev) {
-  return 0;
-}
-
-int cras_iodev_frames_queued(struct cras_iodev* iodev,
-                             struct timespec* tstamp) {
-  auto elem = frames_queued_map.find(iodev);
-  if (elem != frames_queued_map.end()) {
-    *tstamp = elem->second.frames_queued_ts;
-    return elem->second.frames_queued_ret;
-  }
-  clock_gettime(CLOCK_MONOTONIC_RAW, tstamp);
-  return 0;
-}
-
-struct dev_stream* cras_iodev_rm_stream(struct cras_iodev* iodev,
-                                        const struct cras_rstream* stream) {
-  return NULL;
-}
-
-int cras_iodev_update_rate(struct cras_iodev* iodev,
-                           unsigned int level,
-                           struct timespec* level_tstamp) {
-  auto elem = update_rate_map.find(iodev);
-  if (elem != update_rate_map.end()) {
-    return elem->second;
-  }
-  return 0;
-}
-
-enum CRAS_IODEV_STATE cras_iodev_state(const struct cras_iodev* iodev) {
-  return iodev->state;
-}
-
-unsigned int cras_iodev_all_streams_written(struct cras_iodev* iodev) {
-  return 0;
-}
-
-int cras_iodev_put_input_buffer(struct cras_iodev* iodev) {
-  return 0;
-}
-
-int cras_iodev_put_output_buffer(struct cras_iodev* iodev,
-                                 uint8_t* frames,
-                                 unsigned int nframes,
-                                 int* non_empty,
-                                 struct cras_fmt_conv* output_converter) {
-  return 0;
-}
-
-int cras_iodev_get_input_buffer(struct cras_iodev* iodev, unsigned* frames) {
-  return 0;
-}
-
-int cras_iodev_get_output_buffer(struct cras_iodev* iodev,
-                                 struct cras_audio_area** area,
-                                 unsigned* frames) {
-  return 0;
-}
-
-float cras_iodev_get_software_gain_scaler(const struct cras_iodev* iodev) {
-  return 0.0;
-}
-
-void cras_iodev_stream_written(struct cras_iodev* iodev,
-                               struct dev_stream* stream,
-                               unsigned int nwritten) {}
-
-int cras_iodev_prepare_output_before_write_samples(struct cras_iodev* odev) {
-  return 0;
-}
-
-int cras_iodev_buffer_avail(struct cras_iodev* iodev, unsigned hw_level) {
-  return 0;
-}
-
-unsigned int cras_iodev_max_stream_offset(const struct cras_iodev* iodev) {
-  return 0;
-}
-
-int cras_iodev_odev_should_wake(const struct cras_iodev* odev) {
-  return 1;
-}
-
-int cras_iodev_output_underrun(struct cras_iodev* odev,
-                               unsigned int hw_level,
-                               unsigned int frames_written) {
-  return 0;
-}
-
-int cras_iodev_reset_request(struct cras_iodev* iodev) {
-  return 0;
-}
-
-unsigned int cras_iodev_stream_offset(struct cras_iodev* iodev,
-                                      struct dev_stream* stream) {
-  return 0;
-}
-
-unsigned int cras_iodev_get_num_underruns(const struct cras_iodev* iodev) {
-  return 0;
-}
-
-unsigned int cras_iodev_frames_to_play_in_sleep(struct cras_iodev* odev,
-                                                unsigned int* hw_level,
-                                                struct timespec* hw_tstamp) {
-  clock_gettime(CLOCK_MONOTONIC_RAW, hw_tstamp);
-  *hw_level = 0;
-  return 0;
-}
-
-void cras_iodev_update_highest_hw_level(struct cras_iodev* iodev,
-                                        unsigned int hw_level) {}
-
-void cras_iodev_start_stream(struct cras_iodev* iodev,
-                             struct dev_stream* stream) {}
-
-int cras_iodev_drop_frames_by_time(struct cras_iodev* iodev,
-                                   struct timespec ts) {
-  drop_time_map.insert({iodev, ts});
-  return 0;
-}
-
-bool cras_iodev_is_on_internal_card(const struct cras_ionode* node) {
-  auto elem = on_internal_card_map.find(node);
-  if (elem != on_internal_card_map.end()) {
-    return elem->second;
-  }
-  return 1;
-}
-}  // extern "C"
diff --git a/cras/src/tests/iodev_stub.h b/cras/src/tests/iodev_stub.h
deleted file mode 100644
index e8016dd..0000000
--- a/cras/src/tests/iodev_stub.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/* Copyright 2017 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef IODEV_STUB_H_
-#define IODEV_STUB_H_
-
-#include <time.h>
-
-void iodev_stub_reset();
-
-void iodev_stub_est_rate_ratio(cras_iodev* iodev, double ratio);
-
-void iodev_stub_update_rate(cras_iodev* iodev, int data);
-
-void iodev_stub_on_internal_card(cras_ionode* node, int data);
-
-void iodev_stub_frames_queued(cras_iodev* iodev, int ret, timespec ts);
-
-void iodev_stub_valid_frames(cras_iodev* iodev, int ret, timespec ts);
-
-bool iodev_stub_get_drop_time(cras_iodev* iodev, timespec* ts);
-
-#endif  // IODEV_STUB_H_
diff --git a/cras/src/tests/iodev_unittest.cc b/cras/src/tests/iodev_unittest.cc
deleted file mode 100644
index 24b2b38..0000000
--- a/cras/src/tests/iodev_unittest.cc
+++ /dev/null
@@ -1,2801 +0,0 @@
-// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <gtest/gtest.h>
-#include <stdio.h>
-
-extern "C" {
-#include "audio_thread_log.h"
-#include "cras_audio_area.h"
-#include "cras_iodev.h"
-#include "cras_main_thread_log.h"
-#include "cras_ramp.h"
-#include "cras_rstream.h"
-#include "dev_stream.h"
-#include "input_data.h"
-#include "utlist.h"
-
-// Mock software volume scalers.
-float softvol_scalers[101];
-
-// For audio_thread_log.h use.
-int atlog_rw_shm_fd;
-int atlog_ro_shm_fd;
-}
-
-#define BUFFER_SIZE 8192
-
-static const float RAMP_UNMUTE_DURATION_SECS = 0.5;
-static const float RAMP_NEW_STREAM_DURATION_SECS = 0.01;
-static const float RAMP_MUTE_DURATION_SECS = 0.1;
-static const float RAMP_VOLUME_CHANGE_DURATION_SECS = 0.1;
-
-static int cras_iodev_list_disable_dev_called;
-static int select_node_called;
-static enum CRAS_STREAM_DIRECTION select_node_direction;
-static cras_node_id_t select_node_id;
-static struct cras_ionode* node_selected;
-static size_t notify_nodes_changed_called;
-static size_t notify_active_node_changed_called;
-static int dsp_context_new_sample_rate;
-static const char* dsp_context_new_purpose;
-static int dsp_context_free_called;
-static int update_channel_layout_called;
-static int update_channel_layout_return_val;
-static int cras_audio_format_set_channel_layout_called;
-static unsigned int cras_system_get_volume_return;
-static int cras_dsp_get_pipeline_called;
-static int cras_dsp_get_pipeline_ret;
-static int cras_dsp_put_pipeline_called;
-static int cras_dsp_pipeline_get_source_buffer_called;
-static int cras_dsp_pipeline_get_sink_buffer_called;
-static float cras_dsp_pipeline_source_buffer[2][DSP_BUFFER_SIZE];
-static float cras_dsp_pipeline_sink_buffer[2][DSP_BUFFER_SIZE];
-static int cras_dsp_pipeline_get_delay_called;
-static int cras_dsp_pipeline_apply_called;
-static int cras_dsp_pipeline_set_sink_ext_module_called;
-static int cras_dsp_pipeline_apply_sample_count;
-static unsigned int cras_mix_mute_count;
-static unsigned int cras_dsp_num_input_channels_return;
-static unsigned int cras_dsp_num_output_channels_return;
-struct cras_dsp_context* cras_dsp_context_new_return;
-static unsigned int cras_dsp_load_mock_pipeline_called;
-static unsigned int rate_estimator_add_frames_num_frames;
-static unsigned int rate_estimator_add_frames_called;
-static int cras_system_get_mute_return;
-static snd_pcm_format_t cras_scale_buffer_fmt;
-static float cras_scale_buffer_scaler;
-static int cras_scale_buffer_called;
-static unsigned int pre_dsp_hook_called;
-static const uint8_t* pre_dsp_hook_frames;
-static void* pre_dsp_hook_cb_data;
-static unsigned int post_dsp_hook_called;
-static const uint8_t* post_dsp_hook_frames;
-static void* post_dsp_hook_cb_data;
-static int iodev_buffer_size;
-static uint8_t audio_buffer[BUFFER_SIZE];
-static struct cras_audio_area* audio_area;
-static unsigned int put_buffer_nframes;
-static int is_free_running_ret;
-static int no_stream_called;
-static int no_stream_enable;
-// This will be used extensively in cras_iodev.
-struct audio_thread_event_log* atlog;
-static unsigned int simple_no_stream_called;
-static int simple_no_stream_enable;
-static int dev_stream_playback_frames_ret;
-static int device_monitor_reset_device_called;
-static int output_underrun_called;
-static int set_mute_called;
-static int cras_ramp_start_mute_ramp;
-static float cras_ramp_start_from;
-static float cras_ramp_start_to;
-static int cras_ramp_start_duration_frames;
-static int cras_ramp_start_is_called;
-static int cras_ramp_reset_is_called;
-static struct cras_ramp_action cras_ramp_get_current_action_ret;
-static int cras_ramp_update_ramped_frames_num_frames;
-static cras_ramp_cb cras_ramp_start_cb;
-static void* cras_ramp_start_cb_data;
-static int cras_device_monitor_set_device_mute_state_called;
-unsigned int cras_device_monitor_set_device_mute_state_dev_idx;
-static snd_pcm_format_t cras_scale_buffer_increment_fmt;
-static uint8_t* cras_scale_buffer_increment_buff;
-static unsigned int cras_scale_buffer_increment_frame;
-static float cras_scale_buffer_increment_scaler;
-static float cras_scale_buffer_increment_increment;
-static float cras_scale_buffer_increment_target;
-static int cras_scale_buffer_increment_channel;
-static struct cras_audio_format audio_fmt;
-static int buffer_share_add_id_called;
-static int buffer_share_get_new_write_point_ret;
-static int ext_mod_configure_called;
-static struct input_data* input_data_create_ret;
-static double rate_estimator_get_rate_ret;
-static int cras_audio_thread_event_dev_overrun_called;
-
-static char* atlog_name;
-
-// Iodev callback
-int update_channel_layout(struct cras_iodev* iodev) {
-  update_channel_layout_called = 1;
-  return update_channel_layout_return_val;
-}
-
-void ResetStubData() {
-  cras_iodev_list_disable_dev_called = 0;
-  select_node_called = 0;
-  notify_nodes_changed_called = 0;
-  notify_active_node_changed_called = 0;
-  dsp_context_new_sample_rate = 0;
-  dsp_context_new_purpose = NULL;
-  dsp_context_free_called = 0;
-  cras_audio_format_set_channel_layout_called = 0;
-  cras_dsp_get_pipeline_called = 0;
-  cras_dsp_get_pipeline_ret = 0;
-  cras_dsp_put_pipeline_called = 0;
-  cras_dsp_pipeline_get_source_buffer_called = 0;
-  cras_dsp_pipeline_get_sink_buffer_called = 0;
-  memset(&cras_dsp_pipeline_source_buffer, 0,
-         sizeof(cras_dsp_pipeline_source_buffer));
-  memset(&cras_dsp_pipeline_sink_buffer, 0,
-         sizeof(cras_dsp_pipeline_sink_buffer));
-  cras_dsp_pipeline_get_delay_called = 0;
-  cras_dsp_pipeline_apply_called = 0;
-  cras_dsp_pipeline_set_sink_ext_module_called = 0;
-  cras_dsp_pipeline_apply_sample_count = 0;
-  cras_dsp_num_input_channels_return = 2;
-  cras_dsp_num_output_channels_return = 2;
-  cras_dsp_context_new_return = NULL;
-  cras_dsp_load_mock_pipeline_called = 0;
-  rate_estimator_add_frames_num_frames = 0;
-  rate_estimator_add_frames_called = 0;
-  cras_system_get_mute_return = 0;
-  cras_system_get_volume_return = 100;
-  cras_mix_mute_count = 0;
-  pre_dsp_hook_called = 0;
-  pre_dsp_hook_frames = NULL;
-  post_dsp_hook_called = 0;
-  post_dsp_hook_frames = NULL;
-  iodev_buffer_size = 0;
-  // Assume there is some data in audio buffer.
-  memset(audio_buffer, 0xff, sizeof(audio_buffer));
-  if (audio_area) {
-    free(audio_area);
-    audio_area = NULL;
-  }
-  put_buffer_nframes = 0;
-  is_free_running_ret = 0;
-  no_stream_called = 0;
-  no_stream_enable = 0;
-  simple_no_stream_called = 0;
-  simple_no_stream_enable = 0;
-  dev_stream_playback_frames_ret = 0;
-  if (!atlog) {
-    if (asprintf(&atlog_name, "/ATlog-%d", getpid()) < 0) {
-      exit(-1);
-    }
-    /* To avoid un-used variable warning. */
-    atlog_rw_shm_fd = atlog_ro_shm_fd = -1;
-    atlog = audio_thread_event_log_init(atlog_name);
-  }
-  device_monitor_reset_device_called = 0;
-  output_underrun_called = 0;
-  set_mute_called = 0;
-  cras_ramp_start_mute_ramp = 0;
-  cras_ramp_start_from = 0.0;
-  cras_ramp_start_to = 0.0;
-  cras_ramp_start_duration_frames = 0;
-  cras_ramp_start_cb = NULL;
-  cras_ramp_start_cb_data = NULL;
-  cras_ramp_start_is_called = 0;
-  cras_ramp_reset_is_called = 0;
-  cras_ramp_get_current_action_ret.type = CRAS_RAMP_ACTION_NONE;
-  cras_ramp_update_ramped_frames_num_frames = 0;
-  cras_device_monitor_set_device_mute_state_called = 0;
-  cras_device_monitor_set_device_mute_state_dev_idx = 0;
-  cras_scale_buffer_called = 0;
-  cras_scale_buffer_increment_fmt = SND_PCM_FORMAT_UNKNOWN;
-  cras_scale_buffer_increment_buff = NULL;
-  cras_scale_buffer_increment_frame = 0;
-  cras_scale_buffer_increment_scaler = 0;
-  cras_scale_buffer_increment_increment = 0;
-  cras_scale_buffer_increment_target = 0.0;
-  cras_scale_buffer_increment_channel = 0;
-  audio_fmt.format = SND_PCM_FORMAT_S16_LE;
-  audio_fmt.frame_rate = 48000;
-  audio_fmt.num_channels = 2;
-  buffer_share_add_id_called = 0;
-  ext_mod_configure_called = 0;
-  rate_estimator_get_rate_ret = 0;
-  cras_audio_thread_event_dev_overrun_called = 0;
-}
-
-namespace {
-
-//  Test fill_time_from_frames
-TEST(IoDevTestSuite, FillTimeFromFramesNormal) {
-  struct timespec ts;
-
-  cras_iodev_fill_time_from_frames(12000, 48000, &ts);
-  EXPECT_EQ(0, ts.tv_sec);
-  EXPECT_GE(ts.tv_nsec, 249900000);
-  EXPECT_LE(ts.tv_nsec, 250100000);
-}
-
-TEST(IoDevTestSuite, FillTimeFromFramesLong) {
-  struct timespec ts;
-
-  cras_iodev_fill_time_from_frames(120000 - 12000, 48000, &ts);
-  EXPECT_EQ(2, ts.tv_sec);
-  EXPECT_GE(ts.tv_nsec, 249900000);
-  EXPECT_LE(ts.tv_nsec, 250100000);
-}
-
-TEST(IoDevTestSuite, FillTimeFromFramesShort) {
-  struct timespec ts;
-
-  cras_iodev_fill_time_from_frames(12000 - 12000, 48000, &ts);
-  EXPECT_EQ(0, ts.tv_sec);
-  EXPECT_EQ(0, ts.tv_nsec);
-}
-
-class IoDevSetFormatTestSuite : public testing::Test {
- protected:
-  virtual void SetUp() {
-    ResetStubData();
-    sample_rates_[0] = 44100;
-    sample_rates_[1] = 48000;
-    sample_rates_[2] = 0;
-
-    channel_counts_[0] = 2;
-    channel_counts_[1] = 0;
-    channel_counts_[2] = 0;
-
-    pcm_formats_[0] = SND_PCM_FORMAT_S16_LE;
-    pcm_formats_[1] = SND_PCM_FORMAT_S32_LE;
-    pcm_formats_[2] = static_cast<snd_pcm_format_t>(0);
-
-    update_channel_layout_called = 0;
-    update_channel_layout_return_val = 0;
-
-    memset(&iodev_, 0, sizeof(iodev_));
-    iodev_.update_channel_layout = update_channel_layout;
-    iodev_.supported_rates = sample_rates_;
-    iodev_.supported_channel_counts = channel_counts_;
-    iodev_.supported_formats = pcm_formats_;
-    iodev_.dsp_context = NULL;
-
-    cras_audio_format_set_channel_layout_called = 0;
-
-    main_log = main_thread_event_log_init();
-  }
-
-  virtual void TearDown() {
-    cras_iodev_free_format(&iodev_);
-    main_thread_event_log_deinit(main_log);
-  }
-
-  struct cras_iodev iodev_;
-  size_t sample_rates_[3];
-  size_t channel_counts_[3];
-  snd_pcm_format_t pcm_formats_[3];
-};
-
-TEST_F(IoDevSetFormatTestSuite, SupportedFormatSecondary) {
-  struct cras_audio_format fmt;
-  int rc;
-
-  fmt.format = SND_PCM_FORMAT_S16_LE;
-  fmt.frame_rate = 48000;
-  fmt.num_channels = 2;
-  iodev_.direction = CRAS_STREAM_OUTPUT;
-  ResetStubData();
-  rc = cras_iodev_set_format(&iodev_, &fmt);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(SND_PCM_FORMAT_S16_LE, iodev_.format->format);
-  EXPECT_EQ(48000, iodev_.format->frame_rate);
-  EXPECT_EQ(2, iodev_.format->num_channels);
-  EXPECT_EQ(dsp_context_new_sample_rate, 48000);
-  EXPECT_STREQ(dsp_context_new_purpose, "playback");
-}
-
-TEST_F(IoDevSetFormatTestSuite, SupportedFormat32bit) {
-  struct cras_audio_format fmt;
-  int rc;
-
-  fmt.format = SND_PCM_FORMAT_S32_LE;
-  fmt.frame_rate = 48000;
-  fmt.num_channels = 2;
-  iodev_.direction = CRAS_STREAM_OUTPUT;
-  ResetStubData();
-  rc = cras_iodev_set_format(&iodev_, &fmt);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(SND_PCM_FORMAT_S32_LE, iodev_.format->format);
-  EXPECT_EQ(48000, iodev_.format->frame_rate);
-  EXPECT_EQ(2, iodev_.format->num_channels);
-  EXPECT_EQ(dsp_context_new_sample_rate, 48000);
-  EXPECT_STREQ(dsp_context_new_purpose, "playback");
-}
-
-TEST_F(IoDevSetFormatTestSuite, SupportedFormatPrimary) {
-  struct cras_audio_format fmt;
-  int rc;
-
-  fmt.format = SND_PCM_FORMAT_S16_LE;
-  fmt.frame_rate = 44100;
-  fmt.num_channels = 2;
-  iodev_.direction = CRAS_STREAM_INPUT;
-  ResetStubData();
-  rc = cras_iodev_set_format(&iodev_, &fmt);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(SND_PCM_FORMAT_S16_LE, iodev_.format->format);
-  EXPECT_EQ(44100, iodev_.format->frame_rate);
-  EXPECT_EQ(2, iodev_.format->num_channels);
-  EXPECT_EQ(dsp_context_new_sample_rate, 44100);
-  EXPECT_STREQ(dsp_context_new_purpose, "capture");
-}
-
-TEST_F(IoDevSetFormatTestSuite, SupportedFormatDivisor) {
-  struct cras_audio_format fmt;
-  int rc;
-
-  fmt.format = SND_PCM_FORMAT_S16_LE;
-  fmt.frame_rate = 96000;
-  fmt.num_channels = 2;
-  rc = cras_iodev_set_format(&iodev_, &fmt);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(SND_PCM_FORMAT_S16_LE, iodev_.format->format);
-  EXPECT_EQ(48000, iodev_.format->frame_rate);
-  EXPECT_EQ(2, iodev_.format->num_channels);
-}
-
-TEST_F(IoDevSetFormatTestSuite, Supported96k) {
-  struct cras_audio_format fmt;
-  int rc;
-
-  sample_rates_[0] = 48000;
-  sample_rates_[1] = 96000;
-  sample_rates_[2] = 0;
-
-  fmt.format = SND_PCM_FORMAT_S16_LE;
-  fmt.frame_rate = 96000;
-  fmt.num_channels = 2;
-  rc = cras_iodev_set_format(&iodev_, &fmt);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(SND_PCM_FORMAT_S16_LE, iodev_.format->format);
-  EXPECT_EQ(96000, iodev_.format->frame_rate);
-  EXPECT_EQ(2, iodev_.format->num_channels);
-}
-
-TEST_F(IoDevSetFormatTestSuite, LimitLowRate) {
-  struct cras_audio_format fmt;
-  int rc;
-
-  sample_rates_[0] = 48000;
-  sample_rates_[1] = 8000;
-  sample_rates_[2] = 0;
-
-  fmt.format = SND_PCM_FORMAT_S16_LE;
-  fmt.frame_rate = 8000;
-  fmt.num_channels = 2;
-  rc = cras_iodev_set_format(&iodev_, &fmt);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(SND_PCM_FORMAT_S16_LE, iodev_.format->format);
-  EXPECT_EQ(48000, iodev_.format->frame_rate);
-  EXPECT_EQ(2, iodev_.format->num_channels);
-}
-
-TEST_F(IoDevSetFormatTestSuite, UnsupportedChannelCount) {
-  struct cras_audio_format fmt;
-  int rc;
-
-  fmt.format = SND_PCM_FORMAT_S16_LE;
-  fmt.frame_rate = 96000;
-  fmt.num_channels = 1;
-  rc = cras_iodev_set_format(&iodev_, &fmt);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(SND_PCM_FORMAT_S16_LE, iodev_.format->format);
-  EXPECT_EQ(48000, iodev_.format->frame_rate);
-  EXPECT_EQ(2, iodev_.format->num_channels);
-}
-
-TEST_F(IoDevSetFormatTestSuite, SupportedFormatFallbackDefault) {
-  struct cras_audio_format fmt;
-  int rc;
-
-  fmt.format = SND_PCM_FORMAT_S16_LE;
-  fmt.frame_rate = 96008;
-  fmt.num_channels = 2;
-  rc = cras_iodev_set_format(&iodev_, &fmt);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(SND_PCM_FORMAT_S16_LE, iodev_.format->format);
-  EXPECT_EQ(44100, iodev_.format->frame_rate);
-  EXPECT_EQ(2, iodev_.format->num_channels);
-}
-
-TEST_F(IoDevSetFormatTestSuite, UpdateChannelLayoutSuccess) {
-  struct cras_audio_format fmt;
-  int rc;
-
-  fmt.format = SND_PCM_FORMAT_S16_LE;
-  fmt.frame_rate = 48000;
-  fmt.num_channels = 6;
-
-  iodev_.supported_channel_counts[0] = 6;
-  iodev_.supported_channel_counts[1] = 2;
-
-  rc = cras_iodev_set_format(&iodev_, &fmt);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(SND_PCM_FORMAT_S16_LE, iodev_.format->format);
-  EXPECT_EQ(48000, iodev_.format->frame_rate);
-  EXPECT_EQ(6, iodev_.format->num_channels);
-}
-
-TEST_F(IoDevSetFormatTestSuite, UpdateChannelLayoutFail) {
-  static const int8_t stereo_layout[] = {0,  1,  -1, -1, -1, -1,
-                                         -1, -1, -1, -1, -1};
-  struct cras_audio_format fmt;
-  int rc, i;
-
-  fmt.format = SND_PCM_FORMAT_S16_LE;
-  fmt.frame_rate = 48000;
-  fmt.num_channels = 2;
-
-  cras_dsp_context_new_return = reinterpret_cast<cras_dsp_context*>(0xf0f);
-
-  update_channel_layout_return_val = -1;
-  iodev_.supported_channel_counts[0] = 6;
-  iodev_.supported_channel_counts[1] = 2;
-
-  rc = cras_iodev_set_format(&iodev_, &fmt);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(SND_PCM_FORMAT_S16_LE, iodev_.format->format);
-  EXPECT_EQ(48000, iodev_.format->frame_rate);
-  EXPECT_EQ(2, iodev_.format->num_channels);
-  EXPECT_EQ(0, dsp_context_free_called);
-  for (i = 0; i < CRAS_CH_MAX; i++)
-    EXPECT_EQ(iodev_.format->channel_layout[i], stereo_layout[i]);
-}
-
-TEST_F(IoDevSetFormatTestSuite, UpdateChannelLayoutFail6ch) {
-  static const int8_t default_6ch_layout[] = {0,  1,  2,  3,  4, 5,
-                                              -1, -1, -1, -1, -1};
-  struct cras_audio_format fmt;
-  int rc, i;
-
-  fmt.format = SND_PCM_FORMAT_S16_LE;
-  fmt.frame_rate = 48000;
-  fmt.num_channels = 6;
-
-  cras_dsp_context_new_return = reinterpret_cast<cras_dsp_context*>(0xf0f);
-
-  update_channel_layout_return_val = -1;
-  iodev_.supported_channel_counts[0] = 6;
-  iodev_.supported_channel_counts[1] = 2;
-
-  rc = cras_iodev_set_format(&iodev_, &fmt);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(SND_PCM_FORMAT_S16_LE, iodev_.format->format);
-  EXPECT_EQ(48000, iodev_.format->frame_rate);
-  EXPECT_EQ(6, iodev_.format->num_channels);
-  EXPECT_EQ(0, dsp_context_free_called);
-  for (i = 0; i < CRAS_CH_MAX; i++)
-    EXPECT_EQ(iodev_.format->channel_layout[i], default_6ch_layout[i]);
-}
-
-// Put buffer tests
-
-static int get_buffer(cras_iodev* iodev,
-                      struct cras_audio_area** area,
-                      unsigned int* num) {
-  size_t sz = sizeof(*audio_area) + sizeof(struct cras_channel_area) * 2;
-
-  audio_area = (cras_audio_area*)calloc(1, sz);
-  audio_area->frames = *num;
-  audio_area->num_channels = 2;
-  audio_area->channels[0].buf = audio_buffer;
-  channel_area_set_channel(&audio_area->channels[0], CRAS_CH_FL);
-  audio_area->channels[0].step_bytes = 4;
-  audio_area->channels[1].buf = audio_buffer + 2;
-  channel_area_set_channel(&audio_area->channels[1], CRAS_CH_FR);
-  audio_area->channels[1].step_bytes = 4;
-
-  *area = audio_area;
-  return 0;
-}
-
-static int put_buffer(struct cras_iodev* iodev, unsigned int nframes) {
-  put_buffer_nframes = nframes;
-  if (audio_area) {
-    free(audio_area);
-    audio_area = NULL;
-  }
-  return 0;
-}
-
-static int no_stream(struct cras_iodev* odev, int enable) {
-  no_stream_called++;
-  no_stream_enable = enable;
-  // Use default no stream playback to test default behavior.
-  return cras_iodev_default_no_stream_playback(odev, enable);
-}
-
-static int is_free_running(const struct cras_iodev* odev) {
-  return is_free_running_ret;
-}
-
-static int pre_dsp_hook(const uint8_t* frames,
-                        unsigned int nframes,
-                        const struct cras_audio_format* fmt,
-                        void* cb_data) {
-  pre_dsp_hook_called++;
-  pre_dsp_hook_frames = frames;
-  pre_dsp_hook_cb_data = cb_data;
-  return 0;
-}
-
-static int post_dsp_hook(const uint8_t* frames,
-                         unsigned int nframes,
-                         const struct cras_audio_format* fmt,
-                         void* cb_data) {
-  post_dsp_hook_called++;
-  post_dsp_hook_frames = frames;
-  post_dsp_hook_cb_data = cb_data;
-  return 0;
-}
-
-static int loopback_hook_control(bool start, void* cb_data) {
-  return 0;
-}
-
-TEST(IoDevPutOutputBuffer, SystemMuted) {
-  struct cras_audio_format fmt;
-  struct cras_iodev iodev;
-  uint8_t* frames = reinterpret_cast<uint8_t*>(0x44);
-  int rc;
-
-  ResetStubData();
-  memset(&iodev, 0, sizeof(iodev));
-  cras_system_get_mute_return = 1;
-
-  fmt.format = SND_PCM_FORMAT_S16_LE;
-  fmt.frame_rate = 48000;
-  fmt.num_channels = 2;
-  iodev.format = &fmt;
-  iodev.put_buffer = put_buffer;
-  iodev.rate_est = reinterpret_cast<struct rate_estimator*>(0xdeadbeef);
-
-  rc = cras_iodev_put_output_buffer(&iodev, frames, 20, NULL, nullptr);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(20, cras_mix_mute_count);
-  EXPECT_EQ(20, put_buffer_nframes);
-  EXPECT_EQ(20, rate_estimator_add_frames_num_frames);
-}
-
-TEST(IoDevPutOutputBuffer, MuteForVolume) {
-  struct cras_iodev iodev;
-  struct cras_ionode ionode;
-
-  ResetStubData();
-  memset(&iodev, 0, sizeof(iodev));
-  memset(&ionode, 0, sizeof(ionode));
-
-  iodev.nodes = &ionode;
-  iodev.active_node = &ionode;
-  iodev.active_node->dev = &iodev;
-
-  // Case: System volume 100; Node volume 0. => Mute
-  cras_system_get_volume_return = 100;
-  iodev.active_node->volume = 0;
-  EXPECT_EQ(1, cras_iodev_is_zero_volume(&iodev));
-
-  // Case: System volume 100; Node volume 50. => Not mute
-  cras_system_get_volume_return = 100;
-  iodev.active_node->volume = 50;
-  EXPECT_EQ(0, cras_iodev_is_zero_volume(&iodev));
-
-  // Case: System volume 0; Node volume 50. => Mute
-  cras_system_get_volume_return = 0;
-  iodev.active_node->volume = 50;
-  EXPECT_EQ(1, cras_iodev_is_zero_volume(&iodev));
-
-  // Case: System volume 50; Node volume 50. => Mute
-  cras_system_get_volume_return = 50;
-  iodev.active_node->volume = 50;
-  EXPECT_EQ(1, cras_iodev_is_zero_volume(&iodev));
-}
-
-TEST(IoDevPutOutputBuffer, NodeVolumeZeroShouldMute) {
-  struct cras_audio_format fmt;
-  struct cras_iodev iodev;
-  struct cras_ionode ionode;
-  uint8_t* frames = reinterpret_cast<uint8_t*>(0x44);
-  int rc;
-
-  ResetStubData();
-  memset(&iodev, 0, sizeof(iodev));
-  memset(&ionode, 0, sizeof(ionode));
-
-  iodev.nodes = &ionode;
-  iodev.active_node = &ionode;
-  iodev.active_node->dev = &iodev;
-  iodev.active_node->volume = 0;
-
-  fmt.format = SND_PCM_FORMAT_S16_LE;
-  fmt.frame_rate = 48000;
-  fmt.num_channels = 2;
-  iodev.format = &fmt;
-  iodev.put_buffer = put_buffer;
-  iodev.rate_est = reinterpret_cast<struct rate_estimator*>(0xdeadbeef);
-
-  rc = cras_iodev_put_output_buffer(&iodev, frames, 20, NULL, nullptr);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(20, cras_mix_mute_count);
-  EXPECT_EQ(20, put_buffer_nframes);
-  EXPECT_EQ(20, rate_estimator_add_frames_num_frames);
-}
-
-TEST(IoDevPutOutputBuffer, SystemMutedWithRamp) {
-  struct cras_audio_format fmt;
-  struct cras_iodev iodev;
-  uint8_t* frames = reinterpret_cast<uint8_t*>(0x44);
-  int rc;
-
-  ResetStubData();
-  memset(&iodev, 0, sizeof(iodev));
-  cras_system_get_mute_return = 1;
-
-  fmt.format = SND_PCM_FORMAT_S16_LE;
-  fmt.frame_rate = 48000;
-  fmt.num_channels = 2;
-  iodev.format = &fmt;
-  iodev.put_buffer = put_buffer;
-
-  // Assume device has ramp member.
-  iodev.ramp = reinterpret_cast<struct cras_ramp*>(0x1);
-  iodev.rate_est = reinterpret_cast<struct rate_estimator*>(0xdeadbeef);
-
-  // Assume ramping is done.
-  cras_ramp_get_current_action_ret.type = CRAS_RAMP_ACTION_NONE;
-
-  rc = cras_iodev_put_output_buffer(&iodev, frames, 20, NULL, nullptr);
-  // Output should be muted.
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(20, cras_mix_mute_count);
-  EXPECT_EQ(20, put_buffer_nframes);
-  EXPECT_EQ(20, rate_estimator_add_frames_num_frames);
-
-  // Test for the case where ramping is not done yet.
-  ResetStubData();
-  cras_ramp_get_current_action_ret.type = CRAS_RAMP_ACTION_PARTIAL;
-  rc = cras_iodev_put_output_buffer(&iodev, frames, 20, NULL, nullptr);
-
-  // Output should not be muted.
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(0, cras_mix_mute_count);
-  // Ramped frames should be increased by 20.
-  EXPECT_EQ(20, cras_ramp_update_ramped_frames_num_frames);
-  EXPECT_EQ(20, put_buffer_nframes);
-  EXPECT_EQ(20, rate_estimator_add_frames_num_frames);
-}
-
-TEST(IoDevPutOutputBuffer, NodeVolumeZeroShouldMuteWithRamp) {
-  struct cras_audio_format fmt;
-  struct cras_iodev iodev;
-  struct cras_ionode ionode;
-  uint8_t* frames = reinterpret_cast<uint8_t*>(0x44);
-  int rc;
-
-  ResetStubData();
-  memset(&iodev, 0, sizeof(iodev));
-  memset(&ionode, 0, sizeof(ionode));
-
-  iodev.nodes = &ionode;
-  iodev.active_node = &ionode;
-  iodev.active_node->dev = &iodev;
-  iodev.active_node->volume = 0;
-
-  fmt.format = SND_PCM_FORMAT_S16_LE;
-  fmt.frame_rate = 48000;
-  fmt.num_channels = 2;
-  iodev.format = &fmt;
-  iodev.put_buffer = put_buffer;
-  iodev.rate_est = reinterpret_cast<struct rate_estimator*>(0xdeadbeef);
-
-  // Assume device has ramp member.
-  iodev.ramp = reinterpret_cast<struct cras_ramp*>(0x1);
-
-  // Assume ramping is done.
-  cras_ramp_get_current_action_ret.type = CRAS_RAMP_ACTION_NONE;
-
-  rc = cras_iodev_put_output_buffer(&iodev, frames, 20, NULL, nullptr);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(20, cras_mix_mute_count);
-  EXPECT_EQ(20, put_buffer_nframes);
-  EXPECT_EQ(20, rate_estimator_add_frames_num_frames);
-
-  // Test for the case where ramping is not done yet.
-  ResetStubData();
-  cras_ramp_get_current_action_ret.type = CRAS_RAMP_ACTION_PARTIAL;
-  rc = cras_iodev_put_output_buffer(&iodev, frames, 20, NULL, nullptr);
-
-  // Output should not be muted.
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(0, cras_mix_mute_count);
-  // Ramped frames should be increased by 20.
-  EXPECT_EQ(20, cras_ramp_update_ramped_frames_num_frames);
-  EXPECT_EQ(20, put_buffer_nframes);
-  EXPECT_EQ(20, rate_estimator_add_frames_num_frames);
-}
-TEST(IoDevPutOutputBuffer, NoDSP) {
-  struct cras_audio_format fmt;
-  struct cras_iodev iodev;
-  struct cras_ionode ionode;
-  uint8_t* frames = reinterpret_cast<uint8_t*>(0x44);
-  int rc;
-
-  ResetStubData();
-  memset(&iodev, 0, sizeof(iodev));
-  memset(&ionode, 0, sizeof(ionode));
-
-  iodev.nodes = &ionode;
-  iodev.active_node = &ionode;
-  iodev.active_node->dev = &iodev;
-  iodev.active_node->volume = 100;
-
-  fmt.format = SND_PCM_FORMAT_S16_LE;
-  fmt.frame_rate = 48000;
-  fmt.num_channels = 2;
-  iodev.format = &fmt;
-  iodev.put_buffer = put_buffer;
-  iodev.rate_est = reinterpret_cast<struct rate_estimator*>(0xdeadbeef);
-
-  rc = cras_iodev_put_output_buffer(&iodev, frames, 22, NULL, nullptr);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(0, cras_mix_mute_count);
-  EXPECT_EQ(22, put_buffer_nframes);
-  EXPECT_EQ(22, rate_estimator_add_frames_num_frames);
-}
-
-TEST(IoDevPutOutputBuffer, DSP) {
-  struct cras_audio_format fmt;
-  struct cras_iodev iodev;
-  uint8_t* frames = reinterpret_cast<uint8_t*>(0x44);
-  int rc;
-  struct cras_loopback pre_dsp;
-  struct cras_loopback post_dsp;
-
-  ResetStubData();
-  memset(&iodev, 0, sizeof(iodev));
-  iodev.dsp_context = reinterpret_cast<cras_dsp_context*>(0x15);
-  cras_dsp_get_pipeline_ret = 0x25;
-
-  fmt.format = SND_PCM_FORMAT_S16_LE;
-  fmt.frame_rate = 48000;
-  fmt.num_channels = 2;
-  iodev.format = &fmt;
-  iodev.put_buffer = put_buffer;
-  iodev.rate_est = reinterpret_cast<struct rate_estimator*>(0xdeadbeef);
-  pre_dsp.type = LOOPBACK_POST_MIX_PRE_DSP;
-  pre_dsp.hook_data = pre_dsp_hook;
-  pre_dsp.hook_control = loopback_hook_control;
-  pre_dsp.cb_data = (void*)0x1234;
-  DL_APPEND(iodev.loopbacks, &pre_dsp);
-  post_dsp.type = LOOPBACK_POST_DSP;
-  post_dsp.hook_data = post_dsp_hook;
-  post_dsp.hook_control = loopback_hook_control;
-  post_dsp.cb_data = (void*)0x5678;
-  DL_APPEND(iodev.loopbacks, &post_dsp);
-
-  rc = cras_iodev_put_output_buffer(&iodev, frames, 32, NULL, nullptr);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(0, cras_mix_mute_count);
-  EXPECT_EQ(1, pre_dsp_hook_called);
-  EXPECT_EQ(frames, pre_dsp_hook_frames);
-  EXPECT_EQ((void*)0x1234, pre_dsp_hook_cb_data);
-  EXPECT_EQ(1, post_dsp_hook_called);
-  EXPECT_EQ((void*)0x5678, post_dsp_hook_cb_data);
-  EXPECT_EQ(32, put_buffer_nframes);
-  EXPECT_EQ(32, rate_estimator_add_frames_num_frames);
-  EXPECT_EQ(32, cras_dsp_pipeline_apply_sample_count);
-  EXPECT_EQ(cras_dsp_get_pipeline_called, cras_dsp_put_pipeline_called);
-}
-
-TEST(IoDevPutOutputBuffer, SoftVol) {
-  struct cras_audio_format fmt;
-  struct cras_iodev iodev;
-  uint8_t* frames = reinterpret_cast<uint8_t*>(0x44);
-  int rc;
-
-  ResetStubData();
-  memset(&iodev, 0, sizeof(iodev));
-  iodev.software_volume_needed = 1;
-
-  fmt.format = SND_PCM_FORMAT_S16_LE;
-  fmt.frame_rate = 48000;
-  fmt.num_channels = 2;
-  iodev.format = &fmt;
-  iodev.put_buffer = put_buffer;
-  iodev.rate_est = reinterpret_cast<struct rate_estimator*>(0xdeadbeef);
-
-  cras_system_get_volume_return = 13;
-  softvol_scalers[13] = 0.435;
-
-  rc = cras_iodev_put_output_buffer(&iodev, frames, 53, NULL, nullptr);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(0, cras_mix_mute_count);
-  EXPECT_EQ(53, put_buffer_nframes);
-  EXPECT_EQ(53, rate_estimator_add_frames_num_frames);
-  EXPECT_EQ(softvol_scalers[13], cras_scale_buffer_scaler);
-  EXPECT_EQ(SND_PCM_FORMAT_S16_LE, cras_scale_buffer_fmt);
-}
-
-TEST(IoDevPutOutputBuffer, SoftVolWithRamp) {
-  struct cras_audio_format fmt;
-  struct cras_iodev iodev;
-  uint8_t* frames = reinterpret_cast<uint8_t*>(0x44);
-  int rc;
-  int n_frames = 53;
-  float ramp_scaler = 0.2;
-  float increment = 0.001;
-  float target = 1.0;
-  int volume = 13;
-  float volume_scaler = 0.435;
-
-  ResetStubData();
-  memset(&iodev, 0, sizeof(iodev));
-  iodev.software_volume_needed = 1;
-
-  fmt.format = SND_PCM_FORMAT_S16_LE;
-  fmt.frame_rate = 48000;
-  fmt.num_channels = 2;
-  iodev.format = &fmt;
-  iodev.put_buffer = put_buffer;
-  // Assume device has ramp member.
-  iodev.ramp = reinterpret_cast<struct cras_ramp*>(0x1);
-  iodev.rate_est = reinterpret_cast<struct rate_estimator*>(0xdeadbeef);
-
-  // Assume ramping is done.
-  cras_ramp_get_current_action_ret.type = CRAS_RAMP_ACTION_NONE;
-
-  cras_system_get_volume_return = volume;
-  softvol_scalers[volume] = volume_scaler;
-
-  rc = cras_iodev_put_output_buffer(&iodev, frames, n_frames, NULL, nullptr);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(0, cras_mix_mute_count);
-  EXPECT_EQ(n_frames, put_buffer_nframes);
-  EXPECT_EQ(n_frames, rate_estimator_add_frames_num_frames);
-  EXPECT_EQ(softvol_scalers[volume], cras_scale_buffer_scaler);
-  EXPECT_EQ(SND_PCM_FORMAT_S16_LE, cras_scale_buffer_fmt);
-
-  ResetStubData();
-  // Assume ramping is not done.
-  cras_ramp_get_current_action_ret.type = CRAS_RAMP_ACTION_PARTIAL;
-  cras_ramp_get_current_action_ret.scaler = ramp_scaler;
-  cras_ramp_get_current_action_ret.increment = increment;
-  cras_ramp_get_current_action_ret.target = target;
-
-  cras_system_get_volume_return = volume;
-  softvol_scalers[volume] = volume_scaler;
-
-  rc = cras_iodev_put_output_buffer(&iodev, frames, n_frames, NULL, nullptr);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(0, cras_mix_mute_count);
-  // cras_scale_buffer is not called.
-  EXPECT_EQ(0, cras_scale_buffer_called);
-
-  // Verify the arguments passed to cras_scale_buffer_increment.
-  EXPECT_EQ(fmt.format, cras_scale_buffer_increment_fmt);
-  EXPECT_EQ(frames, cras_scale_buffer_increment_buff);
-  EXPECT_EQ(n_frames, cras_scale_buffer_increment_frame);
-  // Initial scaler will be product of software volume scaler and
-  // ramp scaler.
-  EXPECT_FLOAT_EQ(softvol_scalers[volume] * ramp_scaler,
-                  cras_scale_buffer_increment_scaler);
-  // Increment scaler will be product of software volume scaler and
-  // ramp increment.
-  EXPECT_FLOAT_EQ(softvol_scalers[volume] * increment,
-                  cras_scale_buffer_increment_increment);
-  EXPECT_FLOAT_EQ(softvol_scalers[volume] * target,
-                  cras_scale_buffer_increment_target);
-  EXPECT_EQ(fmt.num_channels, cras_scale_buffer_increment_channel);
-
-  EXPECT_EQ(n_frames, put_buffer_nframes);
-  EXPECT_EQ(n_frames, rate_estimator_add_frames_num_frames);
-}
-
-TEST(IoDevPutOutputBuffer, NoSoftVolWithRamp) {
-  struct cras_audio_format fmt;
-  struct cras_iodev iodev;
-  uint8_t* frames = reinterpret_cast<uint8_t*>(0x44);
-  int rc;
-  int n_frames = 53;
-  float ramp_scaler = 0.2;
-  float increment = 0.001;
-  float target = 1.0;
-
-  ResetStubData();
-  memset(&iodev, 0, sizeof(iodev));
-  iodev.software_volume_needed = 0;
-
-  fmt.format = SND_PCM_FORMAT_S16_LE;
-  fmt.frame_rate = 48000;
-  fmt.num_channels = 2;
-  iodev.format = &fmt;
-  iodev.put_buffer = put_buffer;
-  // Assume device has ramp member.
-  iodev.ramp = reinterpret_cast<struct cras_ramp*>(0x1);
-  iodev.rate_est = reinterpret_cast<struct rate_estimator*>(0xdeadbeef);
-
-  // Assume ramping is done.
-  cras_ramp_get_current_action_ret.type = CRAS_RAMP_ACTION_NONE;
-
-  rc = cras_iodev_put_output_buffer(&iodev, frames, n_frames, NULL, nullptr);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(0, cras_mix_mute_count);
-  // cras_scale_buffer is not called.
-  EXPECT_EQ(0, cras_scale_buffer_called);
-  EXPECT_EQ(n_frames, put_buffer_nframes);
-  EXPECT_EQ(n_frames, rate_estimator_add_frames_num_frames);
-
-  ResetStubData();
-  // Assume ramping is not done.
-  cras_ramp_get_current_action_ret.type = CRAS_RAMP_ACTION_PARTIAL;
-  cras_ramp_get_current_action_ret.scaler = ramp_scaler;
-  cras_ramp_get_current_action_ret.increment = increment;
-  cras_ramp_get_current_action_ret.target = target;
-
-  rc = cras_iodev_put_output_buffer(&iodev, frames, n_frames, NULL, nullptr);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(0, cras_mix_mute_count);
-  // cras_scale_buffer is not called.
-  EXPECT_EQ(0, cras_scale_buffer_called);
-
-  // Verify the arguments passed to cras_scale_buffer_increment.
-  EXPECT_EQ(fmt.format, cras_scale_buffer_increment_fmt);
-  EXPECT_EQ(frames, cras_scale_buffer_increment_buff);
-  EXPECT_EQ(n_frames, cras_scale_buffer_increment_frame);
-  EXPECT_FLOAT_EQ(ramp_scaler, cras_scale_buffer_increment_scaler);
-  EXPECT_FLOAT_EQ(increment, cras_scale_buffer_increment_increment);
-  EXPECT_FLOAT_EQ(1.0, cras_scale_buffer_increment_target);
-  EXPECT_EQ(fmt.num_channels, cras_scale_buffer_increment_channel);
-
-  EXPECT_EQ(n_frames, put_buffer_nframes);
-  EXPECT_EQ(n_frames, rate_estimator_add_frames_num_frames);
-}
-
-TEST(IoDevPutOutputBuffer, Scale32Bit) {
-  struct cras_audio_format fmt;
-  struct cras_iodev iodev;
-  uint8_t* frames = reinterpret_cast<uint8_t*>(0x44);
-  int rc;
-
-  ResetStubData();
-  memset(&iodev, 0, sizeof(iodev));
-  iodev.software_volume_needed = 1;
-
-  cras_system_get_volume_return = 13;
-  softvol_scalers[13] = 0.435;
-
-  fmt.format = SND_PCM_FORMAT_S32_LE;
-  fmt.frame_rate = 48000;
-  fmt.num_channels = 2;
-  iodev.format = &fmt;
-  iodev.put_buffer = put_buffer;
-  iodev.rate_est = reinterpret_cast<struct rate_estimator*>(0xdeadbeef);
-
-  rc = cras_iodev_put_output_buffer(&iodev, frames, 53, NULL, nullptr);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(0, cras_mix_mute_count);
-  EXPECT_EQ(53, put_buffer_nframes);
-  EXPECT_EQ(53, rate_estimator_add_frames_num_frames);
-  EXPECT_EQ(SND_PCM_FORMAT_S32_LE, cras_scale_buffer_fmt);
-}
-
-// frames queued/avail tests
-
-static unsigned fr_queued = 0;
-
-static int frames_queued(const struct cras_iodev* iodev,
-                         struct timespec* tstamp) {
-  clock_gettime(CLOCK_MONOTONIC_RAW, tstamp);
-  return fr_queued;
-}
-
-TEST(IoDevQueuedBuffer, ZeroMinBufferLevel) {
-  struct cras_iodev iodev;
-  struct timespec tstamp;
-  int rc;
-
-  ResetStubData();
-  memset(&iodev, 0, sizeof(iodev));
-  iodev.direction = CRAS_STREAM_OUTPUT;
-  iodev.frames_queued = frames_queued;
-  iodev.min_buffer_level = 0;
-  iodev.buffer_size = 200;
-  fr_queued = 50;
-
-  rc = cras_iodev_frames_queued(&iodev, &tstamp);
-  EXPECT_EQ(50, rc);
-  rc = cras_iodev_buffer_avail(&iodev, rc);
-  EXPECT_EQ(150, rc);
-}
-
-TEST(IoDevQueuedBuffer, NonZeroMinBufferLevel) {
-  struct cras_iodev iodev;
-  struct timespec hw_tstamp;
-  int rc;
-
-  ResetStubData();
-  memset(&iodev, 0, sizeof(iodev));
-  iodev.direction = CRAS_STREAM_OUTPUT;
-  iodev.frames_queued = frames_queued;
-  iodev.min_buffer_level = 100;
-  iodev.buffer_size = 200;
-  fr_queued = 180;
-
-  rc = cras_iodev_frames_queued(&iodev, &hw_tstamp);
-  EXPECT_EQ(80, rc);
-  rc = cras_iodev_buffer_avail(&iodev, rc);
-  EXPECT_EQ(20, rc);
-
-  /* When fr_queued < min_buffer_level*/
-  fr_queued = 80;
-  rc = cras_iodev_frames_queued(&iodev, &hw_tstamp);
-  EXPECT_EQ(0, rc);
-  rc = cras_iodev_buffer_avail(&iodev, rc);
-  EXPECT_EQ(100, rc);
-}
-
-static void update_active_node(struct cras_iodev* iodev,
-                               unsigned node_idx,
-                               unsigned dev_enabled) {}
-
-static void dev_set_mute(struct cras_iodev* iodev) {
-  set_mute_called++;
-}
-
-TEST(IoNodePlug, PlugUnplugNode) {
-  struct cras_iodev iodev;
-  struct cras_ionode ionode, ionode2;
-
-  main_log = main_thread_event_log_init();
-
-  memset(&iodev, 0, sizeof(iodev));
-  memset(&ionode, 0, sizeof(ionode));
-  memset(&ionode2, 0, sizeof(ionode2));
-  iodev.direction = CRAS_STREAM_INPUT;
-  iodev.update_active_node = update_active_node;
-  ionode.dev = &iodev;
-  cras_iodev_add_node(&iodev, &ionode);
-  ionode2.dev = &iodev;
-  cras_iodev_add_node(&iodev, &ionode2);
-  cras_iodev_set_active_node(&iodev, &ionode);
-  ResetStubData();
-  cras_iodev_set_node_plugged(&ionode, 1);
-  EXPECT_EQ(0, cras_iodev_list_disable_dev_called);
-  cras_iodev_set_node_plugged(&ionode, 0);
-  EXPECT_EQ(1, cras_iodev_list_disable_dev_called);
-
-  /* Unplug non-active node shouldn't disable iodev. */
-  cras_iodev_set_node_plugged(&ionode2, 1);
-  EXPECT_EQ(1, cras_iodev_list_disable_dev_called);
-  cras_iodev_set_node_plugged(&ionode2, 0);
-  EXPECT_EQ(1, cras_iodev_list_disable_dev_called);
-  main_thread_event_log_deinit(main_log);
-}
-
-TEST(IoDev, AddRemoveNode) {
-  struct cras_iodev iodev;
-  struct cras_ionode ionode;
-
-  memset(&iodev, 0, sizeof(iodev));
-  memset(&ionode, 0, sizeof(ionode));
-  ResetStubData();
-  EXPECT_EQ(0, notify_nodes_changed_called);
-  cras_iodev_add_node(&iodev, &ionode);
-  EXPECT_EQ(1, notify_nodes_changed_called);
-  cras_iodev_rm_node(&iodev, &ionode);
-  EXPECT_EQ(2, notify_nodes_changed_called);
-}
-
-TEST(IoDev, SetActiveNode) {
-  struct cras_iodev iodev;
-  struct cras_ionode ionode;
-
-  memset(&iodev, 0, sizeof(iodev));
-  memset(&ionode, 0, sizeof(ionode));
-  ResetStubData();
-  EXPECT_EQ(0, notify_active_node_changed_called);
-  cras_iodev_set_active_node(&iodev, &ionode);
-  EXPECT_EQ(1, notify_active_node_changed_called);
-}
-
-TEST(IoDev, SetMute) {
-  struct cras_iodev iodev;
-  int rc;
-
-  memset(&iodev, 0, sizeof(iodev));
-  iodev.set_mute = dev_set_mute;
-  iodev.state = CRAS_IODEV_STATE_CLOSE;
-
-  ResetStubData();
-  rc = cras_iodev_set_mute(&iodev);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(0, set_mute_called);
-
-  iodev.state = CRAS_IODEV_STATE_OPEN;
-  rc = cras_iodev_set_mute(&iodev);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(1, set_mute_called);
-}
-
-// Test software volume changes for default output.
-TEST(IoDev, SoftwareVolume) {
-  struct cras_iodev iodev;
-  struct cras_ionode ionode;
-
-  memset(&iodev, 0, sizeof(iodev));
-  memset(&ionode, 0, sizeof(ionode));
-  ResetStubData();
-
-  iodev.nodes = &ionode;
-  iodev.active_node = &ionode;
-  iodev.active_node->dev = &iodev;
-
-  iodev.active_node->volume = 100;
-  iodev.software_volume_needed = 0;
-
-  softvol_scalers[80] = 0.5;
-  softvol_scalers[70] = 0.3;
-
-  // Check that system volume changes software volume if needed.
-  cras_system_get_volume_return = 80;
-  // system_volume - 100 + node_volume = 80 - 100 + 100 = 80
-  EXPECT_FLOAT_EQ(0.5, cras_iodev_get_software_volume_scaler(&iodev));
-
-  // Check that node volume changes software volume if needed.
-  iodev.active_node->volume = 90;
-  // system_volume - 100 + node_volume = 80 - 100 + 90 = 70
-  EXPECT_FLOAT_EQ(0.3, cras_iodev_get_software_volume_scaler(&iodev));
-}
-
-// Test software gain scaler.
-TEST(IoDev, SoftwareGain) {
-  struct cras_iodev iodev;
-  struct cras_ionode ionode;
-
-  memset(&iodev, 0, sizeof(iodev));
-  memset(&ionode, 0, sizeof(ionode));
-  ResetStubData();
-
-  iodev.nodes = &ionode;
-  iodev.active_node = &ionode;
-  iodev.active_node->dev = &iodev;
-
-  ionode.capture_gain = 2400;
-  ionode.software_volume_needed = 1;
-
-  // 2400 * 0.01 dB is 15.848931
-  EXPECT_FLOAT_EQ(15.848931, cras_iodev_get_software_gain_scaler(&iodev));
-
-  // Software gain scaler should be 1.0 if software gain is not needed.
-  ionode.software_volume_needed = 0;
-  EXPECT_FLOAT_EQ(1.0, cras_iodev_get_software_gain_scaler(&iodev));
-}
-
-// This get_buffer implementation set returned frames larger than requested
-// frames.
-static int bad_get_buffer(struct cras_iodev* iodev,
-                          struct cras_audio_area** area,
-                          unsigned* frames) {
-  *frames = *frames + 1;
-  return 0;
-}
-
-// Check that if get_buffer implementation returns invalid frames,
-// cras_iodev_get_output_buffer and cras_iodev_get_input_buffer can return
-// error.
-TEST(IoDev, GetBufferInvalidFrames) {
-  struct cras_iodev iodev;
-  struct cras_audio_area** area = NULL;
-  unsigned int frames = 512;
-  struct cras_audio_format fmt;
-
-  // Format is used in cras_iodev_get_input_buffer;
-  fmt.format = SND_PCM_FORMAT_S16_LE;
-  fmt.frame_rate = 48000;
-  fmt.num_channels = 2;
-
-  memset(&iodev, 0, sizeof(iodev));
-
-  ResetStubData();
-
-  iodev.format = &fmt;
-  iodev.get_buffer = bad_get_buffer;
-
-  EXPECT_EQ(-EINVAL, cras_iodev_get_output_buffer(&iodev, area, &frames));
-  EXPECT_EQ(-EINVAL, cras_iodev_get_input_buffer(&iodev, &frames));
-}
-
-static int configure_dev(struct cras_iodev* iodev) {
-  iodev->buffer_size = iodev_buffer_size;
-  return 0;
-}
-
-TEST(IoDev, OpenOutputDeviceNoStart) {
-  struct cras_iodev iodev;
-
-  memset(&iodev, 0, sizeof(iodev));
-  iodev.configure_dev = configure_dev;
-  iodev.direction = CRAS_STREAM_OUTPUT;
-  iodev.format = &audio_fmt;
-  iodev.get_buffer = get_buffer;
-  iodev.put_buffer = put_buffer;
-  ResetStubData();
-
-  iodev.state = CRAS_IODEV_STATE_CLOSE;
-
-  iodev_buffer_size = 1024;
-  cras_iodev_open(&iodev, 240, &audio_fmt);
-  EXPECT_EQ(0, iodev.max_cb_level);
-  EXPECT_EQ(240, iodev.min_cb_level);
-
-  // Test that state is no stream run when there is no start ops.
-  EXPECT_EQ(CRAS_IODEV_STATE_NO_STREAM_RUN, iodev.state);
-}
-
-TEST(IoDev, OpenOutputDeviceWithLowRateFmt) {
-  struct cras_iodev iodev;
-
-  memset(&iodev, 0, sizeof(iodev));
-  iodev.configure_dev = configure_dev;
-  iodev.direction = CRAS_STREAM_OUTPUT;
-  iodev.format = &audio_fmt;
-  iodev.get_buffer = get_buffer;
-  iodev.put_buffer = put_buffer;
-  ResetStubData();
-
-  cras_audio_format low_rate_fmt = audio_fmt;
-  low_rate_fmt.frame_rate = 8000;
-  iodev.state = CRAS_IODEV_STATE_CLOSE;
-
-  iodev_buffer_size = 1024;
-  cras_iodev_open(&iodev, 40, &low_rate_fmt);
-  EXPECT_EQ(0, iodev.max_cb_level);
-
-  // Test that iodev min_cb_level should be set to
-  // 40 * 48000 / 8000 = 240
-  EXPECT_EQ(240, iodev.min_cb_level);
-}
-
-int fake_start(const struct cras_iodev* iodev) {
-  return 0;
-}
-
-TEST(IoDev, OpenOutputDeviceWithStart) {
-  struct cras_iodev iodev;
-
-  memset(&iodev, 0, sizeof(iodev));
-  iodev.configure_dev = configure_dev;
-  iodev.direction = CRAS_STREAM_OUTPUT;
-  iodev.format = &audio_fmt;
-  ResetStubData();
-
-  iodev.state = CRAS_IODEV_STATE_CLOSE;
-  iodev.start = fake_start;
-
-  iodev_buffer_size = 1024;
-  cras_iodev_open(&iodev, 240, &audio_fmt);
-  EXPECT_EQ(0, iodev.max_cb_level);
-  EXPECT_EQ(240, iodev.min_cb_level);
-
-  // Test that state is no stream run when there is start ops.
-  EXPECT_EQ(CRAS_IODEV_STATE_OPEN, iodev.state);
-}
-
-TEST(IoDev, OpenInputDeviceNoStart) {
-  struct cras_iodev iodev;
-
-  memset(&iodev, 0, sizeof(iodev));
-  iodev.configure_dev = configure_dev;
-  iodev.direction = CRAS_STREAM_INPUT;
-  iodev.format = &audio_fmt;
-  ResetStubData();
-
-  iodev.state = CRAS_IODEV_STATE_CLOSE;
-
-  iodev_buffer_size = 1024;
-  cras_iodev_open(&iodev, 240, &audio_fmt);
-  EXPECT_EQ(0, iodev.max_cb_level);
-  EXPECT_EQ(240, iodev.min_cb_level);
-
-  // Test that state is normal run when there is start ops.
-  EXPECT_EQ(CRAS_IODEV_STATE_NORMAL_RUN, iodev.state);
-}
-
-TEST(IoDev, OpenInputDeviceWithStart) {
-  struct cras_iodev iodev;
-
-  memset(&iodev, 0, sizeof(iodev));
-  iodev.configure_dev = configure_dev;
-  iodev.direction = CRAS_STREAM_INPUT;
-  iodev.format = &audio_fmt;
-  ResetStubData();
-
-  iodev.state = CRAS_IODEV_STATE_CLOSE;
-  iodev.start = fake_start;
-
-  iodev_buffer_size = 1024;
-  cras_iodev_open(&iodev, 240, &audio_fmt);
-  EXPECT_EQ(0, iodev.max_cb_level);
-  EXPECT_EQ(240, iodev.min_cb_level);
-
-  // Test that state is normal run even if there is start ops.
-  EXPECT_EQ(CRAS_IODEV_STATE_NORMAL_RUN, iodev.state);
-}
-
-TEST(IoDev, OpenInputDeviceWithLowRateFmt) {
-  struct cras_iodev iodev;
-
-  memset(&iodev, 0, sizeof(iodev));
-  iodev.configure_dev = configure_dev;
-  iodev.direction = CRAS_STREAM_INPUT;
-  iodev.format = &audio_fmt;
-  ResetStubData();
-
-  cras_audio_format low_rate_fmt = audio_fmt;
-  low_rate_fmt.frame_rate = 8000;
-  iodev.state = CRAS_IODEV_STATE_CLOSE;
-
-  iodev_buffer_size = 1024;
-  cras_iodev_open(&iodev, 40, &low_rate_fmt);
-  EXPECT_EQ(0, iodev.max_cb_level);
-
-  // Test that iodev min_cb_level should be set to
-  // 40 * 48000 / 8000 = 240
-  EXPECT_EQ(240, iodev.min_cb_level);
-}
-
-static int simple_no_stream(struct cras_iodev* dev, int enable) {
-  simple_no_stream_enable = enable;
-  simple_no_stream_called++;
-  return 0;
-}
-
-TEST(IoDev, AddRmStream) {
-  struct cras_iodev iodev;
-  struct cras_rstream rstream1, rstream2;
-  struct dev_stream stream1, stream2;
-
-  memset(&iodev, 0, sizeof(iodev));
-  memset(&rstream1, 0, sizeof(rstream1));
-  memset(&rstream2, 0, sizeof(rstream2));
-  iodev.configure_dev = configure_dev;
-  iodev.no_stream = simple_no_stream;
-  iodev.format = &audio_fmt;
-  iodev.state = CRAS_IODEV_STATE_NORMAL_RUN;
-  iodev.get_buffer = get_buffer;
-  iodev.put_buffer = put_buffer;
-  rstream1.cb_threshold = 800;
-  stream1.stream = &rstream1;
-  stream1.is_running = 0;
-  rstream2.cb_threshold = 400;
-  stream2.stream = &rstream2;
-  stream2.is_running = 0;
-  ResetStubData();
-
-  iodev_buffer_size = 1024;
-  cras_iodev_open(&iodev, rstream1.cb_threshold, &audio_fmt);
-  EXPECT_EQ(0, iodev.max_cb_level);
-  EXPECT_EQ(512, iodev.min_cb_level);
-
-  /* min_cb_level should not exceed half the buffer size. */
-  cras_iodev_add_stream(&iodev, &stream1);
-  cras_iodev_start_stream(&iodev, &stream1);
-  EXPECT_EQ(800, iodev.max_cb_level);
-  EXPECT_EQ(512, iodev.min_cb_level);
-  EXPECT_EQ(1, buffer_share_add_id_called);
-
-  cras_iodev_add_stream(&iodev, &stream2);
-  cras_iodev_start_stream(&iodev, &stream2);
-  EXPECT_EQ(800, iodev.max_cb_level);
-  EXPECT_EQ(400, iodev.min_cb_level);
-  EXPECT_EQ(2, buffer_share_add_id_called);
-
-  cras_iodev_rm_stream(&iodev, &rstream1);
-  EXPECT_EQ(400, iodev.max_cb_level);
-  EXPECT_EQ(400, iodev.min_cb_level);
-  EXPECT_EQ(0, simple_no_stream_called);
-
-  /* When all streams are removed, keep the last min_cb_level for draining. */
-  cras_iodev_rm_stream(&iodev, &rstream2);
-  EXPECT_EQ(0, iodev.max_cb_level);
-  EXPECT_EQ(512, iodev.min_cb_level);
-}
-
-TEST(IoDev, RmStreamUpdateFetchTime) {
-  struct cras_iodev iodev;
-  struct cras_rstream rstream1, rstream2, rstream3;
-  struct dev_stream stream1, stream2, stream3;
-
-  memset(&iodev, 0, sizeof(iodev));
-  memset(&rstream1, 0, sizeof(rstream1));
-  memset(&rstream2, 0, sizeof(rstream2));
-  memset(&rstream3, 0, sizeof(rstream2));
-  memset(&stream1, 0, sizeof(stream2));
-  memset(&stream2, 0, sizeof(stream2));
-  memset(&stream3, 0, sizeof(stream2));
-  iodev.configure_dev = configure_dev;
-  iodev.no_stream = simple_no_stream;
-  iodev.format = &audio_fmt;
-  iodev.state = CRAS_IODEV_STATE_NORMAL_RUN;
-  iodev.get_buffer = get_buffer;
-  iodev.put_buffer = put_buffer;
-  rstream1.direction = CRAS_STREAM_OUTPUT;
-  rstream2.direction = CRAS_STREAM_OUTPUT;
-  rstream3.direction = CRAS_STREAM_OUTPUT;
-  stream1.stream = &rstream1;
-  stream2.stream = &rstream2;
-  stream3.stream = &rstream3;
-  ResetStubData();
-
-  cras_iodev_open(&iodev, 1024, &audio_fmt);
-
-  cras_iodev_add_stream(&iodev, &stream1);
-  cras_iodev_start_stream(&iodev, &stream1);
-  cras_iodev_add_stream(&iodev, &stream2);
-  cras_iodev_start_stream(&iodev, &stream2);
-  cras_iodev_add_stream(&iodev, &stream3);
-
-  rstream1.next_cb_ts.tv_sec = 2;
-  rstream1.next_cb_ts.tv_nsec = 0;
-  rstream2.next_cb_ts.tv_sec = 1;
-  rstream2.next_cb_ts.tv_nsec = 0;
-  rstream3.next_cb_ts.tv_sec = 1;
-  rstream3.next_cb_ts.tv_nsec = 0;
-
-  /*
-   * Because rstream3 has not started yet, the next_cb_ts will be change to the
-   * earliest fetch time of remaining streams, which is rstream1.
-   */
-  cras_iodev_rm_stream(&iodev, &rstream2);
-
-  EXPECT_EQ(rstream3.next_cb_ts.tv_sec, rstream1.next_cb_ts.tv_sec);
-  EXPECT_EQ(rstream3.next_cb_ts.tv_nsec, rstream1.next_cb_ts.tv_nsec);
-}
-
-TEST(IoDev, StartStreams) {
-  struct cras_iodev iodev1, iodev2;
-  struct cras_rstream rstream1, rstream2;
-  struct dev_stream stream1, stream2;
-
-  memset(&iodev1, 0, sizeof(iodev1));
-  memset(&iodev2, 0, sizeof(iodev2));
-  memset(&rstream1, 0, sizeof(rstream1));
-  memset(&rstream2, 0, sizeof(rstream2));
-  memset(&stream1, 0, sizeof(stream1));
-  memset(&stream2, 0, sizeof(stream2));
-  iodev1.configure_dev = configure_dev;
-  iodev1.format = &audio_fmt;
-  iodev1.state = CRAS_IODEV_STATE_NORMAL_RUN;
-  iodev1.get_buffer = get_buffer;
-  iodev1.put_buffer = put_buffer;
-  iodev2.configure_dev = configure_dev;
-  iodev2.format = &audio_fmt;
-  iodev2.state = CRAS_IODEV_STATE_NORMAL_RUN;
-  rstream1.direction = CRAS_STREAM_INPUT;
-  rstream2.direction = CRAS_STREAM_OUTPUT;
-  stream1.stream = &rstream1;
-  stream2.stream = &rstream2;
-
-  /* An input stream starts running immediately. */
-  ResetStubData();
-  iodev1.direction = CRAS_STREAM_INPUT;
-  cras_iodev_open(&iodev1, 1024, &audio_fmt);
-  cras_iodev_add_stream(&iodev1, &stream1);
-  EXPECT_EQ(1, dev_stream_is_running(&stream1));
-  EXPECT_EQ(1, buffer_share_add_id_called);
-
-  /* An output stream starts running after its first fetch. */
-  ResetStubData();
-  iodev2.direction = CRAS_STREAM_OUTPUT;
-  cras_iodev_open(&iodev2, 1024, &audio_fmt);
-  cras_iodev_add_stream(&iodev2, &stream2);
-  EXPECT_EQ(0, dev_stream_is_running(&stream2));
-  EXPECT_EQ(0, buffer_share_add_id_called);
-}
-
-TEST(IoDev, TriggerOnlyStreamNoBufferShare) {
-  struct cras_iodev iodev;
-  struct cras_rstream rstream;
-  struct dev_stream stream;
-
-  memset(&iodev, 0, sizeof(iodev));
-  memset(&rstream, 0, sizeof(rstream));
-  iodev.configure_dev = configure_dev;
-  iodev.format = &audio_fmt;
-  iodev.state = CRAS_IODEV_STATE_NORMAL_RUN;
-  rstream.cb_threshold = 800;
-  rstream.flags = TRIGGER_ONLY;
-  stream.stream = &rstream;
-  ResetStubData();
-
-  cras_iodev_open(&iodev, rstream.cb_threshold, &audio_fmt);
-  /* TRIGGER_ONLY streams shall not be added to buffer_share. */
-  cras_iodev_add_stream(&iodev, &stream);
-  EXPECT_EQ(0, buffer_share_add_id_called);
-}
-
-TEST(IoDev, FillZeros) {
-  struct cras_iodev iodev;
-  struct cras_audio_format fmt;
-  unsigned int frames = 50;
-  int16_t* zeros;
-  int rc;
-
-  ResetStubData();
-
-  memset(&iodev, 0, sizeof(iodev));
-  fmt.format = SND_PCM_FORMAT_S16_LE;
-  fmt.frame_rate = 48000;
-  fmt.num_channels = 2;
-  iodev.format = &fmt;
-  iodev.get_buffer = get_buffer;
-  iodev.put_buffer = put_buffer;
-
-  iodev.direction = CRAS_STREAM_INPUT;
-  rc = cras_iodev_fill_odev_zeros(&iodev, frames);
-  EXPECT_EQ(-EINVAL, rc);
-
-  iodev.direction = CRAS_STREAM_OUTPUT;
-  rc = cras_iodev_fill_odev_zeros(&iodev, frames);
-
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(frames, put_buffer_nframes);
-  zeros = (int16_t*)calloc(frames * 2, sizeof(*zeros));
-  rc = memcmp(audio_buffer, zeros, frames * 2 * 2);
-  free(zeros);
-  EXPECT_EQ(0, rc);
-}
-
-TEST(IoDev, DefaultNoStreamPlaybackRunning) {
-  struct cras_iodev iodev;
-  struct cras_audio_format fmt;
-  unsigned int hw_level = 50;
-  unsigned int min_cb_level = 240;
-  unsigned int zeros_to_fill;
-  int16_t* zeros;
-  int rc;
-
-  memset(&iodev, 0, sizeof(iodev));
-
-  fmt.format = SND_PCM_FORMAT_S16_LE;
-  fmt.frame_rate = 48000;
-  fmt.num_channels = 2;
-  iodev.format = &fmt;
-  iodev.min_cb_level = min_cb_level;
-  iodev.get_buffer = get_buffer;
-  iodev.put_buffer = put_buffer;
-  iodev.frames_queued = frames_queued;
-  iodev.min_buffer_level = 0;
-  iodev.direction = CRAS_STREAM_OUTPUT;
-  iodev.buffer_size = BUFFER_SIZE;
-  iodev.no_stream = no_stream;
-
-  ResetStubData();
-
-  // Device is running. hw_level is less than target.
-  // Need to fill to callback level * 2;
-  iodev.state = CRAS_IODEV_STATE_NO_STREAM_RUN;
-  fr_queued = hw_level;
-  zeros_to_fill = min_cb_level * 2 - hw_level;
-
-  rc = cras_iodev_default_no_stream_playback(&iodev, 1);
-
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(CRAS_IODEV_STATE_NO_STREAM_RUN, iodev.state);
-  EXPECT_EQ(zeros_to_fill, put_buffer_nframes);
-  zeros = (int16_t*)calloc(zeros_to_fill * 2, sizeof(*zeros));
-  EXPECT_EQ(0, memcmp(audio_buffer, zeros, zeros_to_fill * 2 * 2));
-  free(zeros);
-
-  ResetStubData();
-
-  // Device is running. hw_level is not less than target.
-  // No need to fill zeros.
-  iodev.state = CRAS_IODEV_STATE_NO_STREAM_RUN;
-  hw_level = min_cb_level * 2;
-  fr_queued = hw_level;
-  zeros_to_fill = 0;
-
-  rc = cras_iodev_default_no_stream_playback(&iodev, 1);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(CRAS_IODEV_STATE_NO_STREAM_RUN, iodev.state);
-  EXPECT_EQ(zeros_to_fill, put_buffer_nframes);
-}
-
-TEST(IoDev, PrepareOutputBeforeWriteSamples) {
-  struct cras_iodev iodev;
-  struct cras_audio_format fmt;
-  unsigned int min_cb_level = 240;
-  int rc;
-  struct cras_rstream rstream1;
-  struct dev_stream stream1;
-  struct cras_iodev_info info;
-
-  memset(&info, 0, sizeof(info));
-
-  ResetStubData();
-
-  rstream1.cb_threshold = min_cb_level;
-  stream1.stream = &rstream1;
-  stream1.is_running = 1;
-
-  memset(&iodev, 0, sizeof(iodev));
-
-  fmt.format = SND_PCM_FORMAT_S16_LE;
-  fmt.frame_rate = 48000;
-  fmt.num_channels = 2;
-  iodev.format = &fmt;
-  iodev.format = &fmt;
-  iodev.min_cb_level = min_cb_level;
-  iodev.get_buffer = get_buffer;
-  iodev.put_buffer = put_buffer;
-  iodev.frames_queued = frames_queued;
-  iodev.min_buffer_level = 0;
-  iodev.direction = CRAS_STREAM_OUTPUT;
-  iodev.buffer_size = BUFFER_SIZE;
-  iodev.no_stream = no_stream;
-  iodev.configure_dev = configure_dev;
-  iodev.start = fake_start;
-  iodev.info = info;
-  iodev_buffer_size = BUFFER_SIZE;
-
-  // Open device.
-  cras_iodev_open(&iodev, rstream1.cb_threshold, &fmt);
-
-  // Add one stream to device.
-  cras_iodev_add_stream(&iodev, &stream1);
-
-  // Case 1: Assume device is not started yet.
-  iodev.state = CRAS_IODEV_STATE_OPEN;
-  // Assume sample is not ready yet.
-  dev_stream_playback_frames_ret = 0;
-
-  rc = cras_iodev_prepare_output_before_write_samples(&iodev);
-
-  EXPECT_EQ(0, rc);
-  // Device should remain in open state.
-  EXPECT_EQ(CRAS_IODEV_STATE_OPEN, iodev.state);
-  EXPECT_EQ(0, no_stream_called);
-
-  // Assume now sample is ready.
-  dev_stream_playback_frames_ret = 100;
-
-  rc = cras_iodev_prepare_output_before_write_samples(&iodev);
-
-  EXPECT_EQ(0, rc);
-  // Device should enter normal run state.
-  EXPECT_EQ(CRAS_IODEV_STATE_NORMAL_RUN, iodev.state);
-  EXPECT_EQ(0, no_stream_called);
-  // Need to fill 1 callback level of zeros;
-  EXPECT_EQ(min_cb_level, put_buffer_nframes);
-
-  ResetStubData();
-
-  // Case 2: Assume device is started and is in no stream state.
-  iodev.state = CRAS_IODEV_STATE_NO_STREAM_RUN;
-  // Sample is not ready yet.
-  dev_stream_playback_frames_ret = 0;
-
-  rc = cras_iodev_prepare_output_before_write_samples(&iodev);
-
-  EXPECT_EQ(0, rc);
-  // Device should remain in no_stream state.
-  EXPECT_EQ(CRAS_IODEV_STATE_NO_STREAM_RUN, iodev.state);
-  // Device in no_stream state should call no_stream ops once.
-  EXPECT_EQ(1, no_stream_called);
-  EXPECT_EQ(1, no_stream_enable);
-
-  // Assume now sample is ready.
-  dev_stream_playback_frames_ret = 100;
-
-  rc = cras_iodev_prepare_output_before_write_samples(&iodev);
-
-  EXPECT_EQ(0, rc);
-  // Device should enter normal run state.
-  EXPECT_EQ(CRAS_IODEV_STATE_NORMAL_RUN, iodev.state);
-  // Device should call no_stream ops with enable=0 to leave no stream state.
-  EXPECT_EQ(2, no_stream_called);
-  EXPECT_EQ(0, no_stream_enable);
-
-  ResetStubData();
-
-  // Case 3: Assume device is started and is in normal run state.
-  iodev.state = CRAS_IODEV_STATE_NORMAL_RUN;
-
-  rc = cras_iodev_prepare_output_before_write_samples(&iodev);
-
-  EXPECT_EQ(0, rc);
-  // Device should remain in normal run state.
-  EXPECT_EQ(CRAS_IODEV_STATE_NORMAL_RUN, iodev.state);
-  // Device in no_stream state should call no_stream ops once.
-  EXPECT_EQ(0, no_stream_called);
-
-  ResetStubData();
-
-  // Test for device with ramp. Device should start ramping
-  // when sample is ready.
-
-  // Assume device has ramp member.
-  iodev.ramp = reinterpret_cast<struct cras_ramp*>(0x1);
-  iodev.initial_ramp_request = CRAS_IODEV_RAMP_REQUEST_UP_START_PLAYBACK;
-  // Case 4.1: Assume device with ramp is started and is in no stream state.
-  iodev.state = CRAS_IODEV_STATE_NO_STREAM_RUN;
-  // Assume sample is ready.
-  dev_stream_playback_frames_ret = 100;
-
-  rc = cras_iodev_prepare_output_before_write_samples(&iodev);
-
-  // Device should start ramping up without setting mute callback.
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(1, cras_ramp_start_is_called);
-  EXPECT_EQ(1, cras_ramp_start_mute_ramp);
-  EXPECT_FLOAT_EQ(0.0, cras_ramp_start_from);
-  EXPECT_FLOAT_EQ(1.0, cras_ramp_start_to);
-  EXPECT_EQ(fmt.frame_rate * RAMP_NEW_STREAM_DURATION_SECS,
-            cras_ramp_start_duration_frames);
-  EXPECT_EQ(NULL, cras_ramp_start_cb);
-  EXPECT_EQ(NULL, cras_ramp_start_cb_data);
-
-  ResetStubData();
-
-  // Case 4.2: Assume device with ramp is started and is in no stream state.
-  //           But system is muted.
-  iodev.state = CRAS_IODEV_STATE_NO_STREAM_RUN;
-  // Assume system is muted.
-  cras_system_get_mute_return = 1;
-  // Assume sample is ready.
-  dev_stream_playback_frames_ret = 100;
-
-  rc = cras_iodev_prepare_output_before_write_samples(&iodev);
-
-  // Device should not start ramping up because system is muted.
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(0, cras_ramp_start_is_called);
-
-  ResetStubData();
-
-  // Case 5.1: Assume device with ramp is in open state.
-  iodev.state = CRAS_IODEV_STATE_OPEN;
-  // Assume sample is ready.
-  dev_stream_playback_frames_ret = 100;
-
-  rc = cras_iodev_prepare_output_before_write_samples(&iodev);
-
-  // Device should start ramping up without setting mute callback.
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(1, cras_ramp_start_is_called);
-  EXPECT_EQ(1, cras_ramp_start_mute_ramp);
-  EXPECT_FLOAT_EQ(0.0, cras_ramp_start_from);
-  EXPECT_FLOAT_EQ(1.0, cras_ramp_start_to);
-  EXPECT_EQ(fmt.frame_rate * RAMP_NEW_STREAM_DURATION_SECS,
-            cras_ramp_start_duration_frames);
-  EXPECT_EQ(NULL, cras_ramp_start_cb);
-  EXPECT_EQ(NULL, cras_ramp_start_cb_data);
-
-  ResetStubData();
-
-  // Case 5.2: Assume device with ramp is in open state. But system is muted.
-  iodev.state = CRAS_IODEV_STATE_OPEN;
-  // Assume system is muted.
-  cras_system_get_mute_return = 1;
-  // Assume sample is ready.
-  dev_stream_playback_frames_ret = 100;
-
-  rc = cras_iodev_prepare_output_before_write_samples(&iodev);
-
-  // Device should not start ramping up because system is muted.
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(0, cras_ramp_start_is_called);
-}
-
-TEST(IoDev, StartRampUp) {
-  struct cras_iodev iodev;
-  int rc;
-  struct cras_audio_format fmt;
-  enum CRAS_IODEV_RAMP_REQUEST req;
-  memset(&iodev, 0, sizeof(iodev));
-
-  // Format will be used in cras_iodev_start_ramp to determine ramp duration.
-  fmt.format = SND_PCM_FORMAT_S16_LE;
-  fmt.frame_rate = 48000;
-  fmt.num_channels = 2;
-  iodev.format = &fmt;
-
-  // Assume device has ramp member.
-  iodev.ramp = reinterpret_cast<struct cras_ramp*>(0x1);
-
-  // Case 1: Device is not opened yet.
-  ResetStubData();
-  iodev.state = CRAS_IODEV_STATE_CLOSE;
-  req = CRAS_IODEV_RAMP_REQUEST_UP_UNMUTE;
-
-  rc = cras_iodev_start_ramp(&iodev, req);
-
-  // Ramp request is ignored.
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(0, cras_ramp_start_is_called);
-
-  // Case 2: Ramp up without mute.
-  ResetStubData();
-  iodev.state = CRAS_IODEV_STATE_OPEN;
-  req = CRAS_IODEV_RAMP_REQUEST_UP_START_PLAYBACK;
-
-  rc = cras_iodev_start_ramp(&iodev, req);
-
-  // Device should start ramping up without setting mute callback.
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(1, cras_ramp_start_is_called);
-  EXPECT_EQ(1, cras_ramp_start_mute_ramp);
-  EXPECT_FLOAT_EQ(0.0, cras_ramp_start_from);
-  EXPECT_FLOAT_EQ(1.0, cras_ramp_start_to);
-  EXPECT_EQ(fmt.frame_rate * RAMP_NEW_STREAM_DURATION_SECS,
-            cras_ramp_start_duration_frames);
-  EXPECT_EQ(NULL, cras_ramp_start_cb);
-  EXPECT_EQ(NULL, cras_ramp_start_cb_data);
-
-  // Case 3: Ramp up for unmute.
-  ResetStubData();
-  iodev.state = CRAS_IODEV_STATE_OPEN;
-  req = CRAS_IODEV_RAMP_REQUEST_UP_UNMUTE;
-
-  rc = cras_iodev_start_ramp(&iodev, req);
-
-  // Device should start ramping up.
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(1, cras_ramp_start_is_called);
-  EXPECT_EQ(1, cras_ramp_start_mute_ramp);
-  EXPECT_FLOAT_EQ(0.0, cras_ramp_start_from);
-  EXPECT_FLOAT_EQ(1.0, cras_ramp_start_to);
-  EXPECT_EQ(fmt.frame_rate * RAMP_UNMUTE_DURATION_SECS,
-            cras_ramp_start_duration_frames);
-  // Callback for unmute is not used.
-  EXPECT_EQ(NULL, cras_ramp_start_cb);
-  // Device mute state is set after ramping starts.
-  EXPECT_EQ(1, cras_device_monitor_set_device_mute_state_called);
-  EXPECT_EQ(iodev.info.idx, cras_device_monitor_set_device_mute_state_dev_idx);
-}
-
-TEST(IoDev, StartRampDown) {
-  struct cras_iodev iodev;
-  int rc;
-  struct cras_audio_format fmt;
-  enum CRAS_IODEV_RAMP_REQUEST req;
-  memset(&iodev, 0, sizeof(iodev));
-
-  // Format will be used in cras_iodev_start_ramp to determine ramp duration.
-  fmt.format = SND_PCM_FORMAT_S16_LE;
-  fmt.frame_rate = 48000;
-  fmt.num_channels = 2;
-  iodev.format = &fmt;
-
-  // Assume device has ramp member.
-  iodev.ramp = reinterpret_cast<struct cras_ramp*>(0x1);
-
-  // Case 1: Device is not opened yet.
-  ResetStubData();
-  iodev.state = CRAS_IODEV_STATE_CLOSE;
-  req = CRAS_IODEV_RAMP_REQUEST_DOWN_MUTE;
-
-  rc = cras_iodev_start_ramp(&iodev, req);
-
-  // Ramp request is ignored.
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(0, cras_ramp_start_is_called);
-
-  // Case 2: Ramp down for mute.
-  ResetStubData();
-  iodev.state = CRAS_IODEV_STATE_OPEN;
-  req = CRAS_IODEV_RAMP_REQUEST_DOWN_MUTE;
-
-  rc = cras_iodev_start_ramp(&iodev, req);
-
-  // Device should start ramping down with mute callback.
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(1, cras_ramp_start_is_called);
-  EXPECT_EQ(1, cras_ramp_start_mute_ramp);
-  EXPECT_FLOAT_EQ(1.0, cras_ramp_start_from);
-  EXPECT_FLOAT_EQ(0.0, cras_ramp_start_to);
-  EXPECT_EQ(fmt.frame_rate * RAMP_MUTE_DURATION_SECS,
-            cras_ramp_start_duration_frames);
-
-  // Device mute state is not set yet. It should wait for ramp to finish.
-  EXPECT_EQ(0, cras_device_monitor_set_device_mute_state_called);
-
-  // Assume the callback is set, and it is later called after ramp is done.
-  // It should trigger cras_device_monitor_set_device_mute_state.
-  cras_ramp_start_cb(cras_ramp_start_cb_data);
-  EXPECT_EQ(1, cras_device_monitor_set_device_mute_state_called);
-  EXPECT_EQ(iodev.info.idx, cras_device_monitor_set_device_mute_state_dev_idx);
-}
-
-TEST(IoDev, StartVolumeRamp) {
-  struct cras_ionode ionode;
-  struct cras_iodev iodev;
-  int rc;
-  struct cras_audio_format fmt;
-  int expected_frames;
-  float ionode_softvol_scalers[101];
-  memset(&iodev, 0, sizeof(iodev));
-
-  // Format will be used in cras_iodev_start_ramp to determine ramp duration.
-  fmt.format = SND_PCM_FORMAT_S16_LE;
-  fmt.frame_rate = 48000;
-  fmt.num_channels = 2;
-  iodev.format = &fmt;
-  expected_frames = fmt.frame_rate * RAMP_VOLUME_CHANGE_DURATION_SECS;
-
-  // Assume device has ramp member.
-  iodev.ramp = reinterpret_cast<struct cras_ramp*>(0x1);
-
-  // Case 1: Device is not opened yet.
-  ResetStubData();
-  iodev.state = CRAS_IODEV_STATE_CLOSE;
-  rc = cras_iodev_start_volume_ramp(&iodev, 30, 94);
-
-  // Ramp request is ignored.
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(0, cras_ramp_start_is_called);
-
-  // Case 2: Volumes are equal.
-  ResetStubData();
-  iodev.state = CRAS_IODEV_STATE_OPEN;
-  rc = cras_iodev_start_volume_ramp(&iodev, 70, 70);
-
-  // Ramp request is ignored.
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(0, cras_ramp_start_is_called);
-
-  // Case 3: Ramp up, global scalers
-  ResetStubData();
-  iodev.state = CRAS_IODEV_STATE_OPEN;
-  softvol_scalers[40] = 0.2;
-  softvol_scalers[60] = 0.8;
-
-  rc = cras_iodev_start_volume_ramp(&iodev, 40, 60);
-
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(1, cras_ramp_start_is_called);
-  EXPECT_EQ(0, cras_ramp_start_mute_ramp);
-  EXPECT_FLOAT_EQ(0.25, cras_ramp_start_from);
-  EXPECT_FLOAT_EQ(1.0, cras_ramp_start_to);
-  EXPECT_EQ(expected_frames, cras_ramp_start_duration_frames);
-  EXPECT_EQ(NULL, cras_ramp_start_cb);
-  EXPECT_EQ(NULL, cras_ramp_start_cb_data);
-
-  // Case 4: Ramp down, device saclers
-  ResetStubData();
-  iodev.state = CRAS_IODEV_STATE_OPEN;
-
-  ionode_softvol_scalers[40] = 0.4;
-  ionode_softvol_scalers[60] = 0.5;
-  ionode.softvol_scalers = ionode_softvol_scalers;
-  iodev.active_node = &ionode;
-
-  rc = cras_iodev_start_volume_ramp(&iodev, 60, 40);
-
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(1, cras_ramp_start_is_called);
-  EXPECT_EQ(0, cras_ramp_start_mute_ramp);
-  EXPECT_FLOAT_EQ(1.25, cras_ramp_start_from);
-  EXPECT_FLOAT_EQ(1.0, cras_ramp_start_to);
-  EXPECT_EQ(expected_frames, cras_ramp_start_duration_frames);
-  EXPECT_EQ(NULL, cras_ramp_start_cb);
-  EXPECT_EQ(NULL, cras_ramp_start_cb_data);
-}
-
-TEST(IoDev, OutputDeviceShouldWake) {
-  struct cras_iodev iodev;
-  int rc;
-
-  memset(&iodev, 0, sizeof(iodev));
-
-  ResetStubData();
-
-  // Device is not running. No need to wake for this device.
-  iodev.state = CRAS_IODEV_STATE_OPEN;
-  rc = cras_iodev_odev_should_wake(&iodev);
-  EXPECT_EQ(0, rc);
-
-  // Device is running. Need to wake for this device.
-  iodev.state = CRAS_IODEV_STATE_NORMAL_RUN;
-  rc = cras_iodev_odev_should_wake(&iodev);
-  EXPECT_EQ(1, rc);
-
-  // Device is running. Device has is_free_running ops.
-  iodev.is_free_running = is_free_running;
-  is_free_running_ret = 1;
-  rc = cras_iodev_odev_should_wake(&iodev);
-  EXPECT_EQ(0, rc);
-
-  // Device is running. Device has is_free_running ops.
-  is_free_running_ret = 0;
-  rc = cras_iodev_odev_should_wake(&iodev);
-  EXPECT_EQ(1, rc);
-
-  // Ignore input device.
-  iodev.direction = CRAS_STREAM_INPUT;
-  rc = cras_iodev_odev_should_wake(&iodev);
-  EXPECT_EQ(0, rc);
-}
-
-TEST(IoDev, FramesToPlayInSleep) {
-  struct cras_iodev iodev;
-  struct cras_audio_format fmt;
-  unsigned int min_cb_level = 512, hw_level;
-  unsigned int got_hw_level, got_frames;
-  struct timespec hw_tstamp;
-  struct cras_rstream rstream;
-  struct dev_stream stream;
-
-  memset(&iodev, 0, sizeof(iodev));
-  memset(&fmt, 0, sizeof(fmt));
-  iodev.frames_queued = frames_queued;
-  iodev.min_buffer_level = 0;
-  iodev.direction = CRAS_STREAM_OUTPUT;
-  iodev.buffer_size = BUFFER_SIZE;
-  iodev.min_cb_level = min_cb_level;
-  iodev.state = CRAS_IODEV_STATE_NORMAL_RUN;
-  iodev.format = &fmt;
-  fmt.frame_rate = 48000;
-  rstream.cb_threshold = min_cb_level;
-  stream.stream = &rstream;
-
-  ResetStubData();
-
-  cras_iodev_add_stream(&iodev, &stream);
-  cras_iodev_start_stream(&iodev, &stream);
-
-  // Device is running. There is at least one stream for this device
-  // and there are frames waiting to be played. hw_level is greater
-  // than min_cb_level.
-  dev_stream_playback_frames_ret = 100;
-  hw_level = min_cb_level + 50;
-  fr_queued = hw_level;
-  got_frames =
-      cras_iodev_frames_to_play_in_sleep(&iodev, &got_hw_level, &hw_tstamp);
-  EXPECT_EQ(got_hw_level, hw_level);
-  EXPECT_EQ(got_frames, 50);
-  dev_stream_playback_frames_ret = 0;
-
-  // Device is running. There is at least one stream for this device.
-  // hw_level is greater than min_cb_level.
-  hw_level = min_cb_level + 50;
-  fr_queued = hw_level;
-  got_frames =
-      cras_iodev_frames_to_play_in_sleep(&iodev, &got_hw_level, &hw_tstamp);
-  EXPECT_EQ(got_hw_level, hw_level);
-  EXPECT_EQ(got_frames, 514);
-
-  // Device is running. There is at least one stream for this device.
-  // hw_level is 2x greater than min_cb_level.
-  hw_level = 2 * min_cb_level + 50;
-  fr_queued = hw_level;
-  got_frames =
-      cras_iodev_frames_to_play_in_sleep(&iodev, &got_hw_level, &hw_tstamp);
-  EXPECT_EQ(got_hw_level, hw_level);
-  EXPECT_EQ(got_frames, 1026);
-
-  // Device is running. There is at least one stream for this device.
-  // hw_level is less than min_cb_level.
-  hw_level = min_cb_level / 2;
-  fr_queued = hw_level;
-  got_frames =
-      cras_iodev_frames_to_play_in_sleep(&iodev, &got_hw_level, &hw_tstamp);
-  EXPECT_EQ(got_hw_level, hw_level);
-  EXPECT_EQ(got_frames, 208);
-
-  // Device is running. There is no stream for this device. The audio thread
-  // will wake up until hw_level drops to DEV_NO_STREAM_WAKE_UP_LATEST_TIME,
-  // which is defined as 5 milliseconds in cras_iodev.c.
-  iodev.streams = NULL;
-  hw_level = min_cb_level;
-  fr_queued = hw_level;
-  got_frames =
-      cras_iodev_frames_to_play_in_sleep(&iodev, &got_hw_level, &hw_tstamp);
-  EXPECT_EQ(got_hw_level, hw_level);
-  EXPECT_EQ(got_frames, hw_level - fmt.frame_rate / 1000 * 5);
-}
-
-TEST(IoDev, GetNumUnderruns) {
-  struct cras_iodev iodev;
-  memset(&iodev, 0, sizeof(iodev));
-
-  EXPECT_EQ(0, cras_iodev_get_num_underruns(&iodev));
-
-  iodev.num_underruns = 10;
-  EXPECT_EQ(10, cras_iodev_get_num_underruns(&iodev));
-}
-
-TEST(IoDev, RequestReset) {
-  struct cras_iodev iodev;
-  memset(&iodev, 0, sizeof(iodev));
-
-  ResetStubData();
-
-  iodev.configure_dev = configure_dev;
-  iodev.direction = CRAS_STREAM_OUTPUT;
-  iodev.format = &audio_fmt;
-  iodev.get_buffer = get_buffer;
-  iodev.put_buffer = put_buffer;
-
-  iodev.state = CRAS_IODEV_STATE_CLOSE;
-  iodev_buffer_size = 1024;
-
-  // Open device.
-  cras_iodev_open(&iodev, 240, &audio_fmt);
-
-  // The first reset request works.
-  EXPECT_EQ(0, cras_iodev_reset_request(&iodev));
-  EXPECT_EQ(1, device_monitor_reset_device_called);
-
-  // The second reset request will do nothing.
-  EXPECT_EQ(0, cras_iodev_reset_request(&iodev));
-  EXPECT_EQ(1, device_monitor_reset_device_called);
-
-  // Assume device is opened again.
-  cras_iodev_open(&iodev, 240, &audio_fmt);
-
-  // The reset request works.
-  EXPECT_EQ(0, cras_iodev_reset_request(&iodev));
-  EXPECT_EQ(2, device_monitor_reset_device_called);
-}
-
-static int output_underrun(struct cras_iodev* iodev) {
-  output_underrun_called++;
-  return 0;
-}
-
-TEST(IoDev, HandleOutputUnderrun) {
-  struct cras_iodev iodev;
-  struct cras_audio_format fmt;
-  unsigned int frames = 240;
-  int16_t* zeros;
-  int rc;
-
-  ResetStubData();
-
-  memset(&iodev, 0, sizeof(iodev));
-  fmt.format = SND_PCM_FORMAT_S16_LE;
-  fmt.frame_rate = 48000;
-  fmt.num_channels = 2;
-  iodev.format = &fmt;
-  iodev.get_buffer = get_buffer;
-  iodev.put_buffer = put_buffer;
-  iodev.direction = CRAS_STREAM_OUTPUT;
-  iodev.min_cb_level = frames;
-
-  // Default case, fill one block of zeros.
-  EXPECT_EQ(0, cras_iodev_output_underrun(&iodev, 0, 0));
-
-  EXPECT_EQ(frames, put_buffer_nframes);
-  zeros = (int16_t*)calloc(frames * 2, sizeof(*zeros));
-  rc = memcmp(audio_buffer, zeros, frames * 2 * 2);
-  free(zeros);
-  EXPECT_EQ(0, rc);
-
-  // Test iodev has output_underrun ops.
-  iodev.output_underrun = output_underrun;
-  EXPECT_EQ(0, cras_iodev_output_underrun(&iodev, 0, 0));
-  EXPECT_EQ(1, output_underrun_called);
-}
-
-static void ext_mod_configure(struct ext_dsp_module* ext,
-                              unsigned int buffer_size,
-                              unsigned int num_channels,
-                              unsigned int rate) {
-  ext_mod_configure_called++;
-}
-
-TEST(IoDev, SetExtDspMod) {
-  struct cras_iodev iodev;
-  struct cras_audio_format fmt;
-  struct ext_dsp_module ext;
-
-  ResetStubData();
-
-  memset(&iodev, 0, sizeof(iodev));
-  fmt.format = SND_PCM_FORMAT_S16_LE;
-  fmt.frame_rate = 48000;
-  fmt.num_channels = 2;
-  iodev.configure_dev = configure_dev;
-  iodev.format = &fmt;
-  iodev.format = &fmt;
-  iodev.state = CRAS_IODEV_STATE_CLOSE;
-  ext.configure = ext_mod_configure;
-
-  iodev.dsp_context = reinterpret_cast<cras_dsp_context*>(0xf0f);
-  cras_dsp_get_pipeline_ret = 0x25;
-
-  cras_iodev_set_ext_dsp_module(&iodev, &ext);
-  EXPECT_EQ(0, ext_mod_configure_called);
-
-  cras_iodev_open(&iodev, 240, &fmt);
-  EXPECT_EQ(1, ext_mod_configure_called);
-  EXPECT_EQ(1, cras_dsp_get_pipeline_called);
-  EXPECT_EQ(1, cras_dsp_pipeline_set_sink_ext_module_called);
-
-  cras_iodev_set_ext_dsp_module(&iodev, NULL);
-  EXPECT_EQ(1, ext_mod_configure_called);
-  EXPECT_EQ(2, cras_dsp_get_pipeline_called);
-  EXPECT_EQ(2, cras_dsp_pipeline_set_sink_ext_module_called);
-
-  cras_iodev_set_ext_dsp_module(&iodev, &ext);
-  EXPECT_EQ(2, ext_mod_configure_called);
-  EXPECT_EQ(3, cras_dsp_get_pipeline_called);
-  EXPECT_EQ(3, cras_dsp_pipeline_set_sink_ext_module_called);
-
-  /* If pipeline doesn't exist, mock pipeline should be loaded. */
-  cras_dsp_get_pipeline_ret = 0x0;
-  cras_iodev_set_ext_dsp_module(&iodev, &ext);
-  EXPECT_EQ(3, ext_mod_configure_called);
-  EXPECT_EQ(5, cras_dsp_get_pipeline_called);
-  EXPECT_EQ(1, cras_dsp_load_mock_pipeline_called);
-  EXPECT_EQ(4, cras_dsp_pipeline_set_sink_ext_module_called);
-}
-
-TEST(IoDev, InputDspOffset) {
-  struct cras_iodev iodev;
-  struct cras_audio_format fmt;
-  struct cras_rstream rstream1;
-  struct dev_stream stream1;
-  struct input_data data;
-  unsigned int frames = 240;
-  int rc;
-
-  ResetStubData();
-
-  rstream1.cb_threshold = 240;
-  rstream1.stream_id = 123;
-  stream1.stream = &rstream1;
-
-  memset(&iodev, 0, sizeof(iodev));
-  fmt.format = SND_PCM_FORMAT_S16_LE;
-  fmt.frame_rate = 48000;
-  fmt.num_channels = 2;
-  iodev.configure_dev = configure_dev;
-  iodev.format = &fmt;
-  iodev.format = &fmt;
-  iodev.state = CRAS_IODEV_STATE_CLOSE;
-  iodev.get_buffer = get_buffer;
-  iodev.put_buffer = put_buffer;
-  iodev.direction = CRAS_STREAM_INPUT;
-  iodev.buffer_size = 480;
-
-  iodev.dsp_context = reinterpret_cast<cras_dsp_context*>(0xf0f);
-  cras_dsp_get_pipeline_ret = 0x25;
-  input_data_create_ret = &data;
-
-  cras_iodev_open(&iodev, 240, &fmt);
-
-  cras_iodev_add_stream(&iodev, &stream1);
-  cras_iodev_get_input_buffer(&iodev, &frames);
-
-  buffer_share_get_new_write_point_ret = 100;
-  rc = cras_iodev_put_input_buffer(&iodev);
-  EXPECT_EQ(140, iodev.input_dsp_offset);
-  EXPECT_EQ(100, rc);
-
-  frames = 130;
-  cras_iodev_get_input_buffer(&iodev, &frames);
-  EXPECT_EQ(130, iodev.input_frames_read);
-
-  buffer_share_get_new_write_point_ret = 80;
-  rc = cras_iodev_put_input_buffer(&iodev);
-  EXPECT_EQ(60, iodev.input_dsp_offset);
-  EXPECT_EQ(80, rc);
-}
-
-TEST(IoDev, DropDeviceFramesByTime) {
-  struct cras_iodev iodev;
-  struct cras_audio_format fmt;
-  struct input_data data;
-  struct timespec ts;
-  int rc;
-
-  ResetStubData();
-
-  memset(&iodev, 0, sizeof(iodev));
-  fmt.format = SND_PCM_FORMAT_S16_LE;
-  fmt.frame_rate = 48000;
-  fmt.num_channels = 2;
-  iodev.configure_dev = configure_dev;
-  iodev.format = &fmt;
-  iodev.state = CRAS_IODEV_STATE_CLOSE;
-  iodev.get_buffer = get_buffer;
-  iodev.put_buffer = put_buffer;
-  iodev.frames_queued = frames_queued;
-  iodev.direction = CRAS_STREAM_INPUT;
-  iodev.buffer_size = 480;
-  input_data_create_ret = &data;
-  cras_iodev_open(&iodev, 240, &fmt);
-  rate_estimator_get_rate_ret = 48000.0;
-
-  /* hw_level: 240, drop: 48(1ms). */
-  fr_queued = 240;
-  ts.tv_sec = 0;
-  ts.tv_nsec = 1000000;
-  rc = cras_iodev_drop_frames_by_time(&iodev, ts);
-  EXPECT_EQ(48, rc);
-  EXPECT_EQ(48, put_buffer_nframes);
-  EXPECT_EQ(1, rate_estimator_add_frames_called);
-  EXPECT_EQ(-48, rate_estimator_add_frames_num_frames);
-
-  /* hw_level: 360, drop: 240(5ms). */
-  fr_queued = 360;
-  ts.tv_sec = 0;
-  ts.tv_nsec = 5000000;
-  rc = cras_iodev_drop_frames_by_time(&iodev, ts);
-  EXPECT_EQ(240, rc);
-  EXPECT_EQ(240, put_buffer_nframes);
-  EXPECT_EQ(2, rate_estimator_add_frames_called);
-  EXPECT_EQ(-240, rate_estimator_add_frames_num_frames);
-
-  /* hw_level: 360, drop: 480(10ms). Only drop 360 because of lower hw_level. */
-  fr_queued = 360;
-  ts.tv_sec = 0;
-  ts.tv_nsec = 10000000;
-  rc = cras_iodev_drop_frames_by_time(&iodev, ts);
-  EXPECT_EQ(360, rc);
-  EXPECT_EQ(360, put_buffer_nframes);
-  EXPECT_EQ(3, rate_estimator_add_frames_called);
-  EXPECT_EQ(-360, rate_estimator_add_frames_num_frames);
-}
-
-TEST(IoDev, AecUseCaseCheck) {
-  struct cras_ionode node;
-
-  /* test output types */
-  node.type = CRAS_NODE_TYPE_INTERNAL_SPEAKER;
-  EXPECT_EQ(1, cras_iodev_is_aec_use_case(&node));
-  node.type = CRAS_NODE_TYPE_HEADPHONE;
-  EXPECT_EQ(0, cras_iodev_is_aec_use_case(&node));
-  node.type = CRAS_NODE_TYPE_HDMI;
-  EXPECT_EQ(0, cras_iodev_is_aec_use_case(&node));
-  node.type = CRAS_NODE_TYPE_USB;
-  EXPECT_EQ(0, cras_iodev_is_aec_use_case(&node));
-  node.type = CRAS_NODE_TYPE_BLUETOOTH;
-  EXPECT_EQ(0, cras_iodev_is_aec_use_case(&node));
-
-  /* test mic positions */
-  node.type = CRAS_NODE_TYPE_MIC;
-  node.position = NODE_POSITION_INTERNAL;
-  EXPECT_EQ(1, cras_iodev_is_aec_use_case(&node));
-  node.position = NODE_POSITION_FRONT;
-  EXPECT_EQ(1, cras_iodev_is_aec_use_case(&node));
-  node.position = NODE_POSITION_EXTERNAL;
-  EXPECT_EQ(0, cras_iodev_is_aec_use_case(&node));
-  node.position = NODE_POSITION_REAR;
-  EXPECT_EQ(0, cras_iodev_is_aec_use_case(&node));
-}
-
-TEST(IoDev, DeviceOverrun) {
-  struct cras_iodev iodev;
-
-  iodev.buffer_size = 4096;
-  iodev.largest_cb_level = 2048;
-  cras_iodev_update_highest_hw_level(&iodev, 4096);
-  EXPECT_EQ(0, cras_audio_thread_event_dev_overrun_called);
-
-  iodev.largest_cb_level = 1024;
-  iodev.highest_hw_level = 1024;
-  cras_iodev_update_highest_hw_level(&iodev, 2048);
-  EXPECT_EQ(0, cras_audio_thread_event_dev_overrun_called);
-
-  cras_iodev_update_highest_hw_level(&iodev, 4096);
-  EXPECT_EQ(1, cras_audio_thread_event_dev_overrun_called);
-
-  cras_iodev_update_highest_hw_level(&iodev, 4096);
-  EXPECT_EQ(1, cras_audio_thread_event_dev_overrun_called);
-}
-
-TEST(IoDev, OnInternalCard) {
-  static struct cras_ionode node;
-  node.type = CRAS_NODE_TYPE_INTERNAL_SPEAKER;
-  EXPECT_EQ(1, cras_iodev_is_on_internal_card(&node));
-  node.type = CRAS_NODE_TYPE_HEADPHONE;
-  EXPECT_EQ(1, cras_iodev_is_on_internal_card(&node));
-  node.type = CRAS_NODE_TYPE_MIC;
-  EXPECT_EQ(1, cras_iodev_is_on_internal_card(&node));
-  node.type = CRAS_NODE_TYPE_USB;
-  EXPECT_EQ(0, cras_iodev_is_on_internal_card(&node));
-  node.type = CRAS_NODE_TYPE_BLUETOOTH;
-  EXPECT_EQ(0, cras_iodev_is_on_internal_card(&node));
-}
-
-extern "C" {
-
-struct main_thread_event_log* main_log;
-
-//  From libpthread.
-int pthread_create(pthread_t* thread,
-                   const pthread_attr_t* attr,
-                   void* (*start_routine)(void*),
-                   void* arg) {
-  return 0;
-}
-
-int pthread_join(pthread_t thread, void** value_ptr) {
-  return 0;
-}
-
-// Fromt fmt_conv
-void cras_channel_remix_convert(struct cras_fmt_conv* conv,
-                                uint8_t* in_buf,
-                                size_t frames) {}
-
-size_t cras_fmt_conv_in_frames_to_out(struct cras_fmt_conv* conv,
-                                      size_t in_frames) {
-  return in_frames;
-}
-
-// From buffer_share
-struct buffer_share* buffer_share_create(unsigned int buf_sz) {
-  return NULL;
-}
-
-void buffer_share_destroy(struct buffer_share* mix) {}
-
-int buffer_share_offset_update(struct buffer_share* mix,
-                               unsigned int id,
-                               unsigned int frames) {
-  return 0;
-}
-
-unsigned int buffer_share_get_new_write_point(struct buffer_share* mix) {
-  return buffer_share_get_new_write_point_ret;
-}
-
-int buffer_share_add_id(struct buffer_share* mix, unsigned int id, void* data) {
-  buffer_share_add_id_called++;
-  return 0;
-}
-
-int buffer_share_rm_id(struct buffer_share* mix, unsigned int id) {
-  return 0;
-}
-
-unsigned int buffer_share_id_offset(const struct buffer_share* mix,
-                                    unsigned int id) {
-  return 0;
-}
-
-// From cras_system_state.
-void cras_system_state_stream_added(enum CRAS_STREAM_DIRECTION direction,
-                                    enum CRAS_CLIENT_TYPE client_type) {}
-
-void cras_system_state_stream_removed(enum CRAS_STREAM_DIRECTION direction,
-                                      enum CRAS_CLIENT_TYPE client_type) {}
-
-// From cras_dsp
-struct cras_dsp_context* cras_dsp_context_new(int sample_rate,
-                                              const char* purpose) {
-  dsp_context_new_sample_rate = sample_rate;
-  dsp_context_new_purpose = purpose;
-  return cras_dsp_context_new_return;
-}
-
-void cras_dsp_context_free(struct cras_dsp_context* ctx) {
-  dsp_context_free_called++;
-}
-
-void cras_dsp_load_pipeline(struct cras_dsp_context* ctx) {}
-void cras_dsp_load_mock_pipeline(struct cras_dsp_context* ctx,
-                                 unsigned int num_channels) {
-  cras_dsp_load_mock_pipeline_called++;
-}
-
-void cras_dsp_set_variable_string(struct cras_dsp_context* ctx,
-                                  const char* key,
-                                  const char* value) {}
-
-void cras_dsp_set_variable_boolean(struct cras_dsp_context* ctx,
-                                   const char* key,
-                                   char value) {}
-
-struct pipeline* cras_dsp_get_pipeline(struct cras_dsp_context* ctx) {
-  cras_dsp_get_pipeline_called++;
-  return reinterpret_cast<struct pipeline*>(cras_dsp_get_pipeline_ret);
-}
-
-void cras_dsp_put_pipeline(struct cras_dsp_context* ctx) {
-  cras_dsp_put_pipeline_called++;
-}
-
-float* cras_dsp_pipeline_get_source_buffer(struct pipeline* pipeline,
-                                           int index) {
-  cras_dsp_pipeline_get_source_buffer_called++;
-  return cras_dsp_pipeline_source_buffer[index];
-}
-
-float* cras_dsp_pipeline_get_sink_buffer(struct pipeline* pipeline, int index) {
-  cras_dsp_pipeline_get_sink_buffer_called++;
-  return cras_dsp_pipeline_sink_buffer[index];
-}
-
-int cras_dsp_pipeline_get_delay(struct pipeline* pipeline) {
-  cras_dsp_pipeline_get_delay_called++;
-  return 0;
-}
-
-int cras_dsp_pipeline_apply(struct pipeline* pipeline,
-                            uint8_t* buf,
-                            snd_pcm_format_t format,
-                            unsigned int frames) {
-  cras_dsp_pipeline_apply_called++;
-  cras_dsp_pipeline_apply_sample_count = frames;
-  return 0;
-}
-
-void cras_dsp_pipeline_add_statistic(struct pipeline* pipeline,
-                                     const struct timespec* time_delta,
-                                     int samples) {}
-void cras_dsp_pipeline_set_sink_ext_module(struct pipeline* pipeline,
-                                           struct ext_dsp_module* ext_module) {
-  cras_dsp_pipeline_set_sink_ext_module_called++;
-}
-
-unsigned int cras_dsp_num_output_channels(const struct cras_dsp_context* ctx) {
-  return cras_dsp_num_output_channels_return;
-}
-
-unsigned int cras_dsp_num_input_channels(const struct cras_dsp_context* ctx) {
-  return cras_dsp_num_input_channels_return;
-}
-
-// From audio thread
-int audio_thread_post_message(struct audio_thread* thread,
-                              struct audio_thread_msg* msg) {
-  return 0;
-}
-
-void cras_iodev_list_select_node(enum CRAS_STREAM_DIRECTION direction,
-                                 cras_node_id_t node_id) {
-  select_node_called++;
-  select_node_direction = direction;
-  select_node_id = node_id;
-}
-
-int cras_iodev_list_node_selected(struct cras_ionode* node) {
-  return node == node_selected;
-}
-
-void cras_iodev_list_disable_dev(struct cras_iodev* dev) {
-  cras_iodev_list_disable_dev_called++;
-}
-
-void cras_iodev_list_notify_nodes_changed() {
-  notify_nodes_changed_called++;
-}
-
-void cras_iodev_list_notify_active_node_changed(
-    enum CRAS_STREAM_DIRECTION direction) {
-  notify_active_node_changed_called++;
-}
-
-struct cras_audio_area* cras_audio_area_create(int num_channels) {
-  return NULL;
-}
-
-void cras_audio_area_destroy(struct cras_audio_area* area) {}
-
-void cras_audio_area_config_channels(struct cras_audio_area* area,
-                                     const struct cras_audio_format* fmt) {}
-
-int cras_audio_format_set_channel_layout(struct cras_audio_format* format,
-                                         const int8_t layout[CRAS_CH_MAX]) {
-  int i;
-  cras_audio_format_set_channel_layout_called++;
-  for (i = 0; i < CRAS_CH_MAX; i++)
-    format->channel_layout[i] = layout[i];
-  return 0;
-}
-
-float softvol_get_scaler(unsigned int volume_index) {
-  return softvol_scalers[volume_index];
-}
-
-size_t cras_system_get_volume() {
-  return cras_system_get_volume_return;
-}
-
-int cras_system_get_mute() {
-  return cras_system_get_mute_return;
-}
-
-int cras_system_get_capture_mute() {
-  return 0;
-}
-
-void cras_scale_buffer(snd_pcm_format_t fmt,
-                       uint8_t* buffer,
-                       unsigned int count,
-                       float scaler) {
-  cras_scale_buffer_called++;
-  cras_scale_buffer_fmt = fmt;
-  cras_scale_buffer_scaler = scaler;
-}
-
-void cras_scale_buffer_increment(snd_pcm_format_t fmt,
-                                 uint8_t* buff,
-                                 unsigned int frame,
-                                 float scaler,
-                                 float increment,
-                                 float target,
-                                 int channel) {
-  cras_scale_buffer_increment_fmt = fmt;
-  cras_scale_buffer_increment_buff = buff;
-  cras_scale_buffer_increment_frame = frame;
-  cras_scale_buffer_increment_scaler = scaler;
-  cras_scale_buffer_increment_increment = increment;
-  cras_scale_buffer_increment_target = target;
-  cras_scale_buffer_increment_channel = channel;
-}
-
-size_t cras_mix_mute_buffer(uint8_t* dst, size_t frame_bytes, size_t count) {
-  cras_mix_mute_count = count;
-  return count;
-}
-
-struct rate_estimator* rate_estimator_create(unsigned int rate,
-                                             const struct timespec* window_size,
-                                             double smooth_factor) {
-  return NULL;
-}
-
-void rate_estimator_destroy(struct rate_estimator* re) {}
-
-void rate_estimator_add_frames(struct rate_estimator* re, int fr) {
-  rate_estimator_add_frames_called++;
-  rate_estimator_add_frames_num_frames = fr;
-}
-
-int rate_estimator_check(struct rate_estimator* re,
-                         int level,
-                         struct timespec* now) {
-  return 0;
-}
-
-void rate_estimator_reset_rate(struct rate_estimator* re, unsigned int rate) {}
-
-double rate_estimator_get_rate(struct rate_estimator* re) {
-  return rate_estimator_get_rate_ret;
-}
-
-unsigned int dev_stream_cb_threshold(const struct dev_stream* dev_stream) {
-  if (dev_stream->stream)
-    return dev_stream->stream->cb_threshold;
-  return 0;
-}
-
-int dev_stream_attached_devs(const struct dev_stream* dev_stream) {
-  return 1;
-}
-
-void dev_stream_update_frames(const struct dev_stream* dev_stream) {}
-
-int dev_stream_playback_frames(const struct dev_stream* dev_stream) {
-  return dev_stream_playback_frames_ret;
-}
-
-int cras_device_monitor_reset_device(struct cras_iodev* iodev) {
-  device_monitor_reset_device_called++;
-  return 0;
-}
-
-void cras_ramp_destroy(struct cras_ramp* ramp) {
-  return;
-}
-
-int cras_ramp_start(struct cras_ramp* ramp,
-                    int mute_ramp,
-                    float from,
-                    float to,
-                    int duration_frames,
-                    cras_ramp_cb cb,
-                    void* cb_data) {
-  cras_ramp_start_is_called++;
-  cras_ramp_start_mute_ramp = mute_ramp;
-  cras_ramp_start_from = from;
-  cras_ramp_start_to = to;
-  cras_ramp_start_duration_frames = duration_frames;
-  cras_ramp_start_cb = cb;
-  cras_ramp_start_cb_data = cb_data;
-  return 0;
-}
-
-int cras_ramp_reset(struct cras_ramp* ramp) {
-  cras_ramp_reset_is_called++;
-  return 0;
-}
-
-struct cras_ramp_action cras_ramp_get_current_action(
-    const struct cras_ramp* ramp) {
-  return cras_ramp_get_current_action_ret;
-}
-
-int cras_ramp_update_ramped_frames(struct cras_ramp* ramp, int num_frames) {
-  cras_ramp_update_ramped_frames_num_frames = num_frames;
-  return 0;
-}
-
-int cras_device_monitor_set_device_mute_state(unsigned int dev_idx) {
-  cras_device_monitor_set_device_mute_state_called++;
-  cras_device_monitor_set_device_mute_state_dev_idx = dev_idx;
-  return 0;
-}
-
-static void mod_run(struct ext_dsp_module* ext, unsigned int nframes) {}
-
-static void mod_configure(struct ext_dsp_module* ext,
-                          unsigned int buffer_size,
-                          unsigned int num_channels,
-                          unsigned int rate) {}
-
-struct input_data* input_data_create(void* dev_ptr) {
-  if (input_data_create_ret) {
-    input_data_create_ret->ext.run = mod_run;
-    input_data_create_ret->ext.configure = mod_configure;
-  }
-  return input_data_create_ret;
-}
-
-void input_data_destroy(struct input_data** data) {}
-void input_data_set_all_streams_read(struct input_data* data,
-                                     unsigned int nframes) {}
-
-int cras_audio_thread_event_underrun() {
-  return 0;
-}
-
-int cras_audio_thread_event_dev_overrun() {
-  cras_audio_thread_event_dev_overrun_called++;
-  return 0;
-}
-
-int cras_server_metrics_device_runtime(struct cras_iodev* iodev) {
-  return 0;
-}
-
-int cras_server_metrics_device_volume(struct cras_iodev* iodev) {
-  return 0;
-}
-
-void ewma_power_init(struct ewma_power* ewma, unsigned int rate){};
-
-void ewma_power_calculate(struct ewma_power* ewma,
-                          const int16_t* buf,
-                          unsigned int channels,
-                          unsigned int size){};
-
-void ewma_power_calculate_area(struct ewma_power* ewma,
-                               const int16_t* buf,
-                               struct cras_audio_area* area,
-                               unsigned int size){};
-
-}  // extern "C"
-}  //  namespace
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  int rc = RUN_ALL_TESTS();
-
-  audio_thread_event_log_deinit(atlog, atlog_name);
-  free(atlog_name);
-  return rc;
-}
diff --git a/cras/src/tests/linear_resampler_unittest.cc b/cras/src/tests/linear_resampler_unittest.cc
deleted file mode 100644
index 6095d5b..0000000
--- a/cras/src/tests/linear_resampler_unittest.cc
+++ /dev/null
@@ -1,220 +0,0 @@
-// Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <gtest/gtest.h>
-#include <limits.h>
-#include <stdint.h>
-#include <stdio.h>
-
-extern "C" {
-#include "linear_resampler.h"
-}
-
-#define BUF_SIZE 2048
-
-static uint8_t in_buf[BUF_SIZE];
-static uint8_t out_buf[BUF_SIZE];
-
-TEST(LinearResampler, ReampleToSlightlyLargerRate) {
-  int i, rc;
-  unsigned int count;
-  unsigned int in_offset = 0;
-  unsigned int out_offset = 0;
-  struct linear_resampler* lr;
-
-  memset(in_buf, 0, BUF_SIZE);
-  memset(out_buf, 0, BUF_SIZE);
-  for (i = 0; i < 100; i++) {
-    *((int16_t*)(in_buf + i * 4)) = i * 10;
-    *((int16_t*)(in_buf + i * 4 + 2)) = i * 20;
-  }
-
-  lr = linear_resampler_create(2, 4, 48000, 48001);
-
-  count = 20;
-  rc = linear_resampler_resample(lr, in_buf + 4 * in_offset, &count,
-                                 out_buf + 4 * out_offset, 50);
-  EXPECT_EQ(20, rc);
-  EXPECT_EQ(20, count);
-
-  in_offset += count;
-  out_offset += rc;
-  count = 20;
-  rc = linear_resampler_resample(lr, in_buf + 4 * in_offset, &count,
-                                 out_buf + 4 * out_offset, 15);
-  EXPECT_EQ(15, rc);
-  EXPECT_EQ(15, count);
-
-  /* Assert linear interpotation result. */
-  for (i = 0; i < 34; i++) {
-    EXPECT_GE(*(int16_t*)(in_buf + 4 * i), *(int16_t*)(out_buf + 4 * i));
-    EXPECT_LE(*(int16_t*)(in_buf + 4 * i), *(int16_t*)(out_buf + 4 * (i + 1)));
-  }
-  linear_resampler_destroy(lr);
-}
-
-TEST(LinearResampler, ResampleIntegerFractionToLarger) {
-  int i, rc;
-  unsigned int count;
-  unsigned int in_offset = 0;
-  unsigned int out_offset = 0;
-  struct linear_resampler* lr;
-
-  memset(in_buf, 0, BUF_SIZE);
-  memset(out_buf, 0, BUF_SIZE);
-  for (i = 0; i < 100; i++) {
-    *((int16_t*)(in_buf + i * 4)) = SHRT_MAX - i;
-    *((int16_t*)(in_buf + i * 4 + 2)) = SHRT_MAX - i * 10;
-  }
-
-  /* Rate 10 -> 11 */
-  lr = linear_resampler_create(2, 4, 10, 11);
-
-  count = 5;
-  rc = linear_resampler_resample(lr, in_buf + 4 * in_offset, &count,
-                                 out_buf + 4 * out_offset, 10);
-  EXPECT_EQ(5, rc);
-  EXPECT_EQ(5, count);
-
-  in_offset += count;
-  out_offset += rc;
-  count = 6;
-  /* Assert source rate + 1 frames resample to destination rate + 1
-   * frames. */
-  rc = linear_resampler_resample(lr, in_buf + 4 * in_offset, &count,
-                                 out_buf + 4 * out_offset, 10);
-  EXPECT_EQ(7, rc);
-  EXPECT_EQ(6, count);
-
-  in_offset += count;
-  out_offset += rc;
-  count = 89;
-  rc = linear_resampler_resample(lr, in_buf + 4 * in_offset, &count,
-                                 out_buf + 4 * out_offset, 100);
-  EXPECT_EQ(97, rc);
-  EXPECT_EQ(89, count);
-
-  /* Assert linear interpotation result. */
-  for (i = 0; i < 90; i++) {
-    EXPECT_LE(*(int16_t*)(in_buf + 4 * i), *(int16_t*)(out_buf + 4 * i));
-    EXPECT_LE(*(int16_t*)(in_buf + 4 * i + 2),
-              *(int16_t*)(out_buf + 4 * i + 2));
-  }
-  linear_resampler_destroy(lr);
-}
-
-TEST(LinearResampler, ResampleIntegerFractionToLess) {
-  int i, rc;
-  unsigned int count;
-  unsigned int in_offset = 0;
-  unsigned int out_offset = 0;
-  struct linear_resampler* lr;
-
-  memset(in_buf, 0, BUF_SIZE);
-  memset(out_buf, 0, BUF_SIZE);
-  for (i = 0; i < 100; i++) {
-    *((int16_t*)(in_buf + i * 4)) = SHRT_MIN + i * 10;
-    *((int16_t*)(in_buf + i * 4 + 2)) = SHRT_MIN + i * 20;
-  }
-
-  /* Rate 10 -> 9 */
-  lr = linear_resampler_create(2, 4, 10, 9);
-
-  count = 6;
-  rc = linear_resampler_resample(lr, in_buf + 4 * in_offset, &count,
-                                 out_buf + 4 * out_offset, 6);
-  EXPECT_EQ(5, rc);
-  EXPECT_EQ(6, count);
-
-  in_offset += count;
-  out_offset += rc;
-  count = 4;
-
-  /* Assert source rate frames resample to destination rate frames. */
-  rc = linear_resampler_resample(lr, in_buf + 4 * in_offset, &count,
-                                 out_buf + 4 * out_offset, 4);
-  EXPECT_EQ(4, rc);
-  EXPECT_EQ(4, count);
-
-  in_offset += count;
-  out_offset += rc;
-  count = 90;
-  rc = linear_resampler_resample(lr, in_buf + 4 * in_offset, &count,
-                                 out_buf + 4 * out_offset, 90);
-
-  /* Assert linear interpotation result. */
-  for (i = 0; i < 90; i++) {
-    EXPECT_LE(*(int16_t*)(in_buf + 4 * i), *(int16_t*)(out_buf + 4 * i));
-    EXPECT_LE(*(int16_t*)(in_buf + 4 * i + 2),
-              *(int16_t*)(out_buf + 4 * i + 2));
-  }
-  linear_resampler_destroy(lr);
-}
-
-TEST(LinearResampler, ResampleIntegerNoSrcBuffer) {
-  int rc;
-  unsigned int count;
-  struct linear_resampler* lr;
-
-  memset(in_buf, 0, BUF_SIZE);
-  memset(out_buf, 0, BUF_SIZE);
-
-  /* Rate 10 -> 9 */
-  lr = linear_resampler_create(2, 4, 10, 9);
-
-  count = 0;
-  rc = linear_resampler_resample(lr, in_buf, &count, out_buf, BUF_SIZE);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(0, count);
-  linear_resampler_destroy(lr);
-}
-
-TEST(LinearResampler, ResampleIntegerNoDstBuffer) {
-  int rc;
-  unsigned int count;
-  struct linear_resampler* lr;
-
-  memset(in_buf, 0, BUF_SIZE);
-  memset(out_buf, 0, BUF_SIZE);
-
-  /* Rate 10 -> 9 */
-  lr = linear_resampler_create(2, 4, 10, 9);
-
-  count = BUF_SIZE;
-  rc = linear_resampler_resample(lr, in_buf, &count, out_buf, 0);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(0, count);
-  linear_resampler_destroy(lr);
-}
-
-extern "C" {
-
-void cras_mix_add_scale_stride(int fmt,
-                               uint8_t* dst,
-                               uint8_t* src,
-                               unsigned int count,
-                               unsigned int dst_stride,
-                               unsigned int src_stride,
-                               float scaler) {
-  unsigned int i;
-
-  for (i = 0; i < count; i++) {
-    int32_t sum;
-    sum = *(int16_t*)dst + *(int16_t*)src * scaler;
-    if (sum > INT16_MAX)
-      sum = INT16_MAX;
-    else if (sum < INT16_MIN)
-      sum = INT16_MIN;
-    *(int16_t*)dst = sum;
-    dst += dst_stride;
-    src += src_stride;
-  }
-}
-
-}  //  extern "C"
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tests/loopback_iodev_unittest.cc b/cras/src/tests/loopback_iodev_unittest.cc
deleted file mode 100644
index fde5037..0000000
--- a/cras/src/tests/loopback_iodev_unittest.cc
+++ /dev/null
@@ -1,297 +0,0 @@
-// Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <gtest/gtest.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-extern "C" {
-// For audio_thread_log.h use.
-struct audio_thread_event_log* atlog;
-int atlog_rw_shm_fd;
-int atlog_ro_shm_fd;
-#include "audio_thread_log.h"
-#include "cras_audio_area.h"
-#include "cras_iodev.h"
-#include "cras_iodev_list.h"
-#include "cras_loopback_iodev.h"
-#include "cras_shm.h"
-#include "cras_types.h"
-#include "dev_stream.h"
-#include "utlist.h"
-}
-
-namespace {
-
-static const unsigned int kBufferFrames = 16384;
-static const unsigned int kFrameBytes = 4;
-static const unsigned int kBufferSize = kBufferFrames * kFrameBytes;
-
-static struct timespec time_now;
-static cras_audio_area* mock_audio_area;
-static loopback_hook_data_t loop_hook;
-static struct cras_iodev* enabled_dev;
-static unsigned int cras_iodev_list_add_input_called;
-static unsigned int cras_iodev_list_rm_input_called;
-static unsigned int cras_iodev_list_set_device_enabled_callback_called;
-static device_enabled_callback_t device_enabled_callback_cb;
-static device_disabled_callback_t device_disabled_callback_cb;
-static void* device_enabled_callback_cb_data;
-static int cras_iodev_list_register_loopback_called;
-static int cras_iodev_list_unregister_loopback_called;
-
-static char* atlog_name;
-
-class LoopBackTestSuite : public testing::Test {
- protected:
-  virtual void SetUp() {
-    mock_audio_area = (cras_audio_area*)calloc(
-        1, sizeof(*mock_audio_area) + sizeof(cras_channel_area) * 2);
-    for (unsigned int i = 0; i < kBufferSize; i++) {
-      buf_[i] = rand();
-    }
-    fmt_.frame_rate = 48000;
-    fmt_.num_channels = 2;
-    fmt_.format = SND_PCM_FORMAT_S16_LE;
-
-    loop_in_ = loopback_iodev_create(LOOPBACK_POST_MIX_PRE_DSP);
-    EXPECT_EQ(1, cras_iodev_list_add_input_called);
-    loop_in_->format = &fmt_;
-
-    loop_hook = NULL;
-    cras_iodev_list_add_input_called = 0;
-    cras_iodev_list_rm_input_called = 0;
-    cras_iodev_list_set_device_enabled_callback_called = 0;
-    cras_iodev_list_register_loopback_called = 0;
-    cras_iodev_list_unregister_loopback_called = 0;
-
-    ASSERT_FALSE(asprintf(&atlog_name, "/ATlog-%d", getpid()) < 0);
-    /* To avoid un-used variable warning. */
-    atlog_rw_shm_fd = atlog_ro_shm_fd = -1;
-    atlog = audio_thread_event_log_init(atlog_name);
-  }
-
-  virtual void TearDown() {
-    loopback_iodev_destroy(loop_in_);
-    EXPECT_EQ(1, cras_iodev_list_rm_input_called);
-    EXPECT_EQ(NULL, device_enabled_callback_cb);
-    EXPECT_EQ(NULL, device_disabled_callback_cb);
-    free(mock_audio_area);
-    audio_thread_event_log_deinit(atlog, atlog_name);
-    free(atlog_name);
-  }
-
-  uint8_t buf_[kBufferSize];
-  struct cras_audio_format fmt_;
-  struct cras_iodev* loop_in_;
-};
-
-TEST_F(LoopBackTestSuite, InstallLoopHook) {
-  struct cras_iodev iodev;
-  struct timespec tstamp;
-
-  iodev.direction = CRAS_STREAM_OUTPUT;
-  iodev.format = &fmt_;
-  iodev.streams = NULL;
-  iodev.info.idx = 123;
-  enabled_dev = &iodev;
-
-  // Open loopback devices.
-  EXPECT_EQ(0, loop_in_->configure_dev(loop_in_));
-  EXPECT_EQ(1, cras_iodev_list_set_device_enabled_callback_called);
-  EXPECT_EQ(1, cras_iodev_list_register_loopback_called);
-
-  // Signal an output device is enabled.
-  device_enabled_callback_cb(&iodev, device_enabled_callback_cb_data);
-
-  // Expect that a hook was added to the iodev
-  EXPECT_EQ(2, cras_iodev_list_register_loopback_called);
-  ASSERT_NE(reinterpret_cast<loopback_hook_data_t>(NULL), loop_hook);
-
-  // Check zero frames queued.
-  EXPECT_EQ(0, loop_in_->frames_queued(loop_in_, &tstamp));
-
-  device_disabled_callback_cb(&iodev, device_enabled_callback_cb_data);
-  EXPECT_EQ(1, cras_iodev_list_unregister_loopback_called);
-  EXPECT_EQ(3, cras_iodev_list_register_loopback_called);
-
-  enabled_dev->info.idx = 456;
-  device_enabled_callback_cb(&iodev, device_enabled_callback_cb_data);
-  EXPECT_EQ(4, cras_iodev_list_register_loopback_called);
-
-  // Close loopback devices.
-  EXPECT_EQ(0, loop_in_->close_dev(loop_in_));
-  EXPECT_EQ(2, cras_iodev_list_unregister_loopback_called);
-  EXPECT_EQ(2, cras_iodev_list_set_device_enabled_callback_called);
-}
-
-TEST_F(LoopBackTestSuite, SelectDevFromAToB) {
-  struct cras_iodev iodev1, iodev2;
-
-  iodev1.direction = CRAS_STREAM_OUTPUT;
-  iodev2.direction = CRAS_STREAM_OUTPUT;
-  enabled_dev = &iodev1;
-
-  enabled_dev->info.idx = 111;
-  EXPECT_EQ(0, loop_in_->configure_dev(loop_in_));
-  EXPECT_EQ(1, cras_iodev_list_set_device_enabled_callback_called);
-  EXPECT_EQ(1, cras_iodev_list_register_loopback_called);
-
-  /* Not the current sender being disabled, assert unregister not called. */
-  iodev2.info.idx = 222;
-  device_disabled_callback_cb(&iodev2, device_enabled_callback_cb_data);
-  EXPECT_EQ(0, cras_iodev_list_unregister_loopback_called);
-  EXPECT_EQ(1, cras_iodev_list_register_loopback_called);
-
-  enabled_dev = &iodev2;
-  device_disabled_callback_cb(&iodev1, device_enabled_callback_cb_data);
-  EXPECT_EQ(1, cras_iodev_list_unregister_loopback_called);
-  EXPECT_EQ(2, cras_iodev_list_register_loopback_called);
-
-  EXPECT_EQ(0, loop_in_->close_dev(loop_in_));
-}
-
-// Test how loopback works if there isn't any output devices open.
-TEST_F(LoopBackTestSuite, OpenIdleSystem) {
-  cras_audio_area* area;
-  unsigned int nread = 1024;
-  struct timespec tstamp;
-  int rc;
-
-  // No active output device.
-  enabled_dev = NULL;
-  time_now.tv_sec = 100;
-  time_now.tv_nsec = 0;
-
-  EXPECT_EQ(0, loop_in_->configure_dev(loop_in_));
-  EXPECT_EQ(1, cras_iodev_list_set_device_enabled_callback_called);
-
-  // Should be 480 samples after 480/frame rate seconds
-  time_now.tv_nsec += 480 * 1e9 / 48000;
-  EXPECT_EQ(480, loop_in_->frames_queued(loop_in_, &tstamp));
-
-  // Verify frames from loopback record.
-  loop_in_->get_buffer(loop_in_, &area, &nread);
-  EXPECT_EQ(480, nread);
-  memset(buf_, 0, nread * kFrameBytes);
-  rc = memcmp(area->channels[0].buf, buf_, nread * kFrameBytes);
-  EXPECT_EQ(0, rc);
-  loop_in_->put_buffer(loop_in_, nread);
-
-  // Check zero frames queued.
-  EXPECT_EQ(0, loop_in_->frames_queued(loop_in_, &tstamp));
-
-  EXPECT_EQ(0, loop_in_->close_dev(loop_in_));
-}
-
-TEST_F(LoopBackTestSuite, SimpleLoopback) {
-  cras_audio_area* area;
-  unsigned int nframes = 1024;
-  unsigned int nread = 1024;
-  int rc;
-  struct cras_iodev iodev;
-  struct dev_stream stream;
-  struct timespec tstamp;
-
-  iodev.streams = &stream;
-  enabled_dev = &iodev;
-
-  loop_in_->configure_dev(loop_in_);
-  ASSERT_NE(reinterpret_cast<void*>(NULL), loop_hook);
-
-  // Loopback callback for the hook.
-  loop_hook(buf_, nframes, &fmt_, loop_in_);
-
-  // Verify frames from loopback record.
-  loop_in_->get_buffer(loop_in_, &area, &nread);
-  EXPECT_EQ(nframes, nread);
-  rc = memcmp(area->channels[0].buf, buf_, nframes * kFrameBytes);
-  EXPECT_EQ(0, rc);
-  loop_in_->put_buffer(loop_in_, nread);
-
-  // Check zero frames queued.
-  EXPECT_EQ(0, loop_in_->frames_queued(loop_in_, &tstamp));
-
-  EXPECT_EQ(0, loop_in_->close_dev(loop_in_));
-}
-
-// TODO(chinyue): Test closing last iodev while streaming loopback data.
-
-/* Stubs */
-extern "C" {
-
-void cras_audio_area_config_buf_pointers(struct cras_audio_area* area,
-                                         const struct cras_audio_format* fmt,
-                                         uint8_t* base_buffer) {
-  mock_audio_area->channels[0].buf = base_buffer;
-}
-
-void cras_iodev_free_audio_area(struct cras_iodev* iodev) {}
-
-void cras_iodev_free_format(struct cras_iodev* iodev) {}
-
-void cras_iodev_init_audio_area(struct cras_iodev* iodev, int num_channels) {
-  iodev->area = mock_audio_area;
-}
-
-void cras_iodev_add_node(struct cras_iodev* iodev, struct cras_ionode* node) {
-  DL_APPEND(iodev->nodes, node);
-}
-
-void cras_iodev_set_active_node(struct cras_iodev* iodev,
-                                struct cras_ionode* node) {}
-void cras_iodev_list_register_loopback(enum CRAS_LOOPBACK_TYPE loopback_type,
-                                       unsigned int output_dev_idx,
-                                       loopback_hook_data_t hook_data,
-                                       loopback_hook_control_t hook_start,
-                                       unsigned int loopback_dev_idx) {
-  cras_iodev_list_register_loopback_called++;
-  loop_hook = hook_data;
-}
-
-void cras_iodev_list_unregister_loopback(enum CRAS_LOOPBACK_TYPE loopback_type,
-                                         unsigned int output_dev_idx,
-                                         unsigned int loopback_dev_idx) {
-  cras_iodev_list_unregister_loopback_called++;
-}
-
-int cras_iodev_list_add_input(struct cras_iodev* input) {
-  cras_iodev_list_add_input_called++;
-  return 0;
-}
-
-int cras_iodev_list_rm_input(struct cras_iodev* input) {
-  cras_iodev_list_rm_input_called++;
-  return 0;
-}
-
-int cras_iodev_list_set_device_enabled_callback(
-    device_enabled_callback_t enabled_cb,
-    device_disabled_callback_t disabled_cb,
-    void* cb_data) {
-  cras_iodev_list_set_device_enabled_callback_called++;
-  device_enabled_callback_cb = enabled_cb;
-  device_disabled_callback_cb = disabled_cb;
-  device_enabled_callback_cb_data = cb_data;
-  return 0;
-}
-
-int clock_gettime(clockid_t clk_id, struct timespec* tp) {
-  *tp = time_now;
-  return 0;
-}
-
-struct cras_iodev* cras_iodev_list_get_first_enabled_iodev(
-    enum CRAS_STREAM_DIRECTION direction) {
-  return enabled_dev;
-}
-
-}  // extern "C"
-
-}  //  namespace
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tests/metrics_stub.cc b/cras/src/tests/metrics_stub.cc
deleted file mode 100644
index 96e8918..0000000
--- a/cras/src/tests/metrics_stub.cc
+++ /dev/null
@@ -1,66 +0,0 @@
-/* Copyright 2017 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-extern "C" {
-#include "cras_server_metrics.h"
-
-int cras_server_metrics_device_runtime(struct cras_iodev* iodev) {
-  return 0;
-}
-
-int cras_server_metrics_highest_device_delay(
-    unsigned int hw_level,
-    unsigned int largest_cb_level,
-    enum CRAS_STREAM_DIRECTION direction) {
-  return 0;
-}
-
-int cras_server_metrics_highest_hw_level(unsigned hw_level,
-                                         enum CRAS_STREAM_DIRECTION direction) {
-  return 0;
-}
-
-int cras_server_metrics_longest_fetch_delay(unsigned delay_msec) {
-  return 0;
-}
-
-int cras_server_metrics_missed_cb_event(struct cras_rstream* stream) {
-  return 0;
-}
-
-int cras_server_metrics_num_underruns(unsigned num_underruns) {
-  return 0;
-}
-
-int cras_server_metrics_hfp_battery_indicator(int battery_indicator_support) {
-  return 0;
-}
-
-int cras_server_metrics_hfp_battery_report(int battery_report) {
-  return 0;
-}
-
-int cras_server_metrics_hfp_wideband_support(bool supported) {
-  return 0;
-}
-
-int cras_server_metrics_hfp_packet_loss(float packet_loss_ratio) {
-  return 0;
-}
-
-int cras_server_metrics_hfp_sco_connection_error(
-    enum CRAS_METRICS_BT_SCO_ERROR_TYPE type) {
-  return 0;
-}
-
-int cras_server_metrics_busyloop(struct timespec* ts, unsigned count) {
-  return 0;
-}
-
-int cras_server_metrics_busyloop_length(unsigned count) {
-  return 0;
-}
-
-}  // extern "C"
diff --git a/cras/src/tests/metrics_stub.h b/cras/src/tests/metrics_stub.h
deleted file mode 100644
index 1d07e3e..0000000
--- a/cras/src/tests/metrics_stub.h
+++ /dev/null
@@ -1,9 +0,0 @@
-/* Copyright 2019 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef METRICS_STUB_H_
-#define METRICS_STUB_H_
-
-#endif  // METRICS_STUB_H_
diff --git a/cras/src/tests/mix_unittest.cc b/cras/src/tests/mix_unittest.cc
deleted file mode 100644
index dbbbdb0..0000000
--- a/cras/src/tests/mix_unittest.cc
+++ /dev/null
@@ -1,1271 +0,0 @@
-// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <gtest/gtest.h>
-#include <stdio.h>
-
-extern "C" {
-#include "cras_mix.h"
-#include "cras_shm.h"
-#include "cras_types.h"
-}
-
-namespace {
-
-static const size_t kBufferFrames = 8192;
-static const size_t kNumChannels = 2;
-static const size_t kNumSamples = kBufferFrames * kNumChannels;
-static const float kMaxVolumeToScale = 0.9999999;
-static const float kMinVolumeToScale = 0.0000001;
-
-static inline int need_to_scale(float scaler) {
-  return (scaler < 0.99 || scaler > 1.01);
-}
-
-class MixTestSuiteS16_LE : public testing::Test {
- protected:
-  virtual void SetUp() {
-    fmt_ = SND_PCM_FORMAT_S16_LE;
-    mix_buffer_ = (int16_t*)malloc(kBufferFrames * 4);
-    src_buffer_ = static_cast<int16_t*>(
-        calloc(1, kBufferFrames * 4 + sizeof(cras_audio_shm_header)));
-
-    for (size_t i = 0; i < kBufferFrames * 2; i++) {
-      src_buffer_[i] = i;
-      mix_buffer_[i] = -i;
-    }
-
-    compare_buffer_ = (int16_t*)malloc(kBufferFrames * 4);
-  }
-
-  virtual void TearDown() {
-    free(mix_buffer_);
-    free(compare_buffer_);
-    free(src_buffer_);
-  }
-
-  void _SetupBuffer() {
-    for (size_t i = 0; i < kBufferFrames; i++) {
-      src_buffer_[i] = i + (INT16_MAX >> 2);
-      mix_buffer_[i] = i + (INT16_MAX >> 2);
-      compare_buffer_[i] = mix_buffer_[i];
-    }
-    for (size_t i = kBufferFrames; i < kBufferFrames * 2; i++) {
-      src_buffer_[i] = i - (INT16_MAX >> 2);
-      mix_buffer_[i] = i - (INT16_MAX >> 2);
-      compare_buffer_[i] = mix_buffer_[i];
-    }
-  }
-
-  void TestScaleStride(float scaler) {
-    _SetupBuffer();
-    for (size_t i = 0; i < kBufferFrames * 2; i += 2) {
-      int32_t tmp;
-      if (need_to_scale(scaler))
-        tmp = mix_buffer_[i] + src_buffer_[i / 2] * scaler;
-      else
-        tmp = mix_buffer_[i] + src_buffer_[i / 2];
-      if (tmp > INT16_MAX)
-        tmp = INT16_MAX;
-      else if (tmp < INT16_MIN)
-        tmp = INT16_MIN;
-      compare_buffer_[i] = tmp;
-    }
-
-    cras_mix_add_scale_stride(fmt_, (uint8_t*)mix_buffer_,
-                              (uint8_t*)src_buffer_, kBufferFrames, 4, 2,
-                              scaler);
-
-    EXPECT_EQ(0, memcmp(compare_buffer_, mix_buffer_, kBufferFrames * 4));
-  }
-
-  void ScaleIncrement(float start_scaler, float increment, float target) {
-    float scaler = start_scaler;
-    for (size_t i = 0; i < kBufferFrames * 2; i++) {
-      float applied_scaler = scaler;
-
-      if ((applied_scaler > target && increment > 0) ||
-          (applied_scaler < target && increment < 0))
-        applied_scaler = target;
-
-      if (applied_scaler > kMaxVolumeToScale) {
-      } else if (applied_scaler < kMinVolumeToScale) {
-        compare_buffer_[i] = 0;
-      } else {
-        compare_buffer_[i] = mix_buffer_[i] * applied_scaler;
-      }
-
-      if (i % 2 == 1)
-        scaler += increment;
-    }
-  }
-
-  int16_t* mix_buffer_;
-  int16_t* src_buffer_;
-  int16_t* compare_buffer_;
-  snd_pcm_format_t fmt_;
-};
-
-TEST_F(MixTestSuiteS16_LE, MixFirst) {
-  cras_mix_add(fmt_, (uint8_t*)mix_buffer_, (uint8_t*)src_buffer_, kNumSamples,
-               0, 0, 1.0);
-  EXPECT_EQ(0, memcmp(mix_buffer_, src_buffer_, kBufferFrames * 4));
-}
-
-TEST_F(MixTestSuiteS16_LE, MixTwo) {
-  cras_mix_add(fmt_, (uint8_t*)mix_buffer_, (uint8_t*)src_buffer_, kNumSamples,
-               0, 0, 1.0);
-  cras_mix_add(fmt_, (uint8_t*)mix_buffer_, (uint8_t*)src_buffer_, kNumSamples,
-               1, 0, 1.0);
-
-  for (size_t i = 0; i < kBufferFrames * 2; i++)
-    compare_buffer_[i] = src_buffer_[i] * 2;
-  EXPECT_EQ(0, memcmp(mix_buffer_, compare_buffer_, kBufferFrames * 4));
-}
-
-TEST_F(MixTestSuiteS16_LE, MixTwoClip) {
-  cras_mix_add(fmt_, (uint8_t*)mix_buffer_, (uint8_t*)src_buffer_, kNumSamples,
-               0, 0, 1.0);
-  for (size_t i = 0; i < kBufferFrames * 2; i++)
-    src_buffer_[i] = INT16_MAX;
-  cras_mix_add(fmt_, (uint8_t*)mix_buffer_, (uint8_t*)src_buffer_, kNumSamples,
-               1, 0, 1.0);
-
-  for (size_t i = 0; i < kBufferFrames * 2; i++)
-    compare_buffer_[i] = INT16_MAX;
-  EXPECT_EQ(0, memcmp(mix_buffer_, compare_buffer_, kBufferFrames * 4));
-}
-
-TEST_F(MixTestSuiteS16_LE, MixFirstMuted) {
-  cras_mix_add(fmt_, (uint8_t*)mix_buffer_, (uint8_t*)src_buffer_, kNumSamples,
-               0, 1, 1.0);
-
-  for (size_t i = 0; i < kBufferFrames * 2; i++)
-    compare_buffer_[i] = 0;
-  EXPECT_EQ(0, memcmp(mix_buffer_, compare_buffer_, kBufferFrames * 4));
-}
-
-TEST_F(MixTestSuiteS16_LE, MixFirstZeroVolume) {
-  cras_mix_add(fmt_, (uint8_t*)mix_buffer_, (uint8_t*)src_buffer_, kNumSamples,
-               0, 0, 0.0);
-
-  for (size_t i = 0; i < kBufferFrames * 2; i++)
-    compare_buffer_[i] = 0;
-  EXPECT_EQ(0, memcmp(mix_buffer_, compare_buffer_, kBufferFrames * 4));
-}
-
-TEST_F(MixTestSuiteS16_LE, MixFirstHalfVolume) {
-  cras_mix_add(fmt_, (uint8_t*)mix_buffer_, (uint8_t*)src_buffer_, kNumSamples,
-               0, 0, 0.5);
-
-  for (size_t i = 0; i < kBufferFrames * 2; i++)
-    compare_buffer_[i] = src_buffer_[i] * 0.5;
-  EXPECT_EQ(0, memcmp(mix_buffer_, compare_buffer_, kBufferFrames * 4));
-}
-
-TEST_F(MixTestSuiteS16_LE, MixTwoSecondHalfVolume) {
-  cras_mix_add(fmt_, (uint8_t*)mix_buffer_, (uint8_t*)src_buffer_, kNumSamples,
-               0, 0, 1.0);
-  cras_mix_add(fmt_, (uint8_t*)mix_buffer_, (uint8_t*)src_buffer_, kNumSamples,
-               1, 0, 0.5);
-
-  for (size_t i = 0; i < kBufferFrames * 2; i++)
-    compare_buffer_[i] = src_buffer_[i] + (int16_t)(src_buffer_[i] * 0.5);
-  EXPECT_EQ(0, memcmp(mix_buffer_, compare_buffer_, kBufferFrames * 4));
-}
-
-TEST_F(MixTestSuiteS16_LE, ScaleFullVolumeIncrement) {
-  float increment = 0.01;
-  int step = 2;
-  float start_scaler = 0.999999999;
-  float target = 1.0;
-
-  _SetupBuffer();
-  // Scale full volume with positive increment will not change buffer.
-  memcpy(compare_buffer_, src_buffer_, kBufferFrames * 4);
-  cras_scale_buffer_increment(fmt_, (uint8_t*)mix_buffer_, kBufferFrames,
-                              start_scaler, increment, target, step);
-
-  EXPECT_EQ(0, memcmp(compare_buffer_, mix_buffer_, kBufferFrames * 4));
-}
-
-TEST_F(MixTestSuiteS16_LE, ScaleMinVolumeIncrement) {
-  float increment = -0.01;
-  int step = 2;
-  float start_scaler = 0.000000001;
-  float target = 0.0;
-
-  _SetupBuffer();
-  // Scale min volume with negative increment will change buffer to zeros.
-  memset(compare_buffer_, 0, kBufferFrames * 4);
-  cras_scale_buffer_increment(fmt_, (uint8_t*)mix_buffer_, kBufferFrames,
-                              start_scaler, increment, target, step);
-
-  EXPECT_EQ(0, memcmp(compare_buffer_, mix_buffer_, kBufferFrames * 4));
-}
-
-TEST_F(MixTestSuiteS16_LE, ScaleVolumePositiveIncrement) {
-  float increment = 0.0001;
-  int step = 2;
-  float start_scaler = 0.1;
-  float target = 1.0;
-
-  _SetupBuffer();
-  ScaleIncrement(start_scaler, increment, target);
-
-  cras_scale_buffer_increment(fmt_, (uint8_t*)mix_buffer_, kBufferFrames,
-                              start_scaler, increment, target, step);
-  EXPECT_EQ(0, memcmp(compare_buffer_, mix_buffer_, kBufferFrames * 4));
-}
-
-TEST_F(MixTestSuiteS16_LE, ScaleVolumeNegativeIncrement) {
-  float increment = -0.0001;
-  int step = 2;
-  float start_scaler = 0.8;
-  float target = 0.0;
-
-  _SetupBuffer();
-  ScaleIncrement(start_scaler, increment, target);
-
-  cras_scale_buffer_increment(fmt_, (uint8_t*)mix_buffer_, kBufferFrames,
-                              start_scaler, increment, target, step);
-
-  EXPECT_EQ(0, memcmp(compare_buffer_, mix_buffer_, kBufferFrames * 4));
-}
-
-TEST_F(MixTestSuiteS16_LE, ScaleVolumeStartFullNegativeIncrement) {
-  float increment = -0.0001;
-  int step = 2;
-  float start_scaler = 1.0;
-  float target = 0.0;
-
-  _SetupBuffer();
-  ScaleIncrement(start_scaler, increment, target);
-
-  cras_scale_buffer_increment(fmt_, (uint8_t*)mix_buffer_, kBufferFrames,
-                              start_scaler, increment, target, step);
-
-  EXPECT_EQ(0, memcmp(compare_buffer_, mix_buffer_, kBufferFrames * 4));
-}
-
-TEST_F(MixTestSuiteS16_LE, ScaleVolumeStartZeroPositiveIncrement) {
-  float increment = 0.0001;
-  int step = 2;
-  float start_scaler = 0.0;
-  float target = 1.0;
-
-  _SetupBuffer();
-  ScaleIncrement(start_scaler, increment, target);
-
-  cras_scale_buffer_increment(fmt_, (uint8_t*)mix_buffer_, kBufferFrames,
-                              start_scaler, increment, target, step);
-
-  EXPECT_EQ(0, memcmp(compare_buffer_, mix_buffer_, kBufferFrames * 4));
-}
-
-TEST_F(MixTestSuiteS16_LE, ScaleVolumePositiveIncrementCappedByTarget) {
-  float increment = 0.0001;
-  int step = 2;
-  float start_scaler = 0.1;
-  float target = 0.5;
-
-  _SetupBuffer();
-  ScaleIncrement(start_scaler, increment, target);
-
-  cras_scale_buffer_increment(fmt_, (uint8_t*)mix_buffer_, kBufferFrames,
-                              start_scaler, increment, target, step);
-  EXPECT_EQ(0, memcmp(compare_buffer_, mix_buffer_, kBufferFrames * 4));
-}
-
-TEST_F(MixTestSuiteS16_LE, ScaleVolumeNegativeIncrementCappedByTarget) {
-  float increment = -0.01;
-  int step = 2;
-  float start_scaler = 0.8;
-  float target = 0.5;
-
-  _SetupBuffer();
-  ScaleIncrement(start_scaler, increment, target);
-
-  cras_scale_buffer_increment(fmt_, (uint8_t*)mix_buffer_, kBufferFrames,
-                              start_scaler, increment, target, step);
-  EXPECT_EQ(0, memcmp(compare_buffer_, mix_buffer_, kBufferFrames * 4));
-}
-
-TEST_F(MixTestSuiteS16_LE, ScaleFullVolume) {
-  memcpy(compare_buffer_, src_buffer_, kBufferFrames * 4);
-  cras_scale_buffer(fmt_, (uint8_t*)mix_buffer_, kNumSamples, 0.999999999);
-
-  EXPECT_EQ(0, memcmp(compare_buffer_, src_buffer_, kBufferFrames * 4));
-}
-
-TEST_F(MixTestSuiteS16_LE, ScaleMinVolume) {
-  memset(compare_buffer_, 0, kBufferFrames * 4);
-  cras_scale_buffer(fmt_, (uint8_t*)src_buffer_, kNumSamples, 0.0000000001);
-
-  EXPECT_EQ(0, memcmp(compare_buffer_, src_buffer_, kBufferFrames * 4));
-}
-
-TEST_F(MixTestSuiteS16_LE, ScaleHalfVolume) {
-  for (size_t i = 0; i < kBufferFrames * 2; i++)
-    compare_buffer_[i] = src_buffer_[i] * 0.5;
-  cras_scale_buffer(fmt_, (uint8_t*)src_buffer_, kNumSamples, 0.5);
-
-  EXPECT_EQ(0, memcmp(compare_buffer_, src_buffer_, kBufferFrames * 4));
-}
-
-TEST_F(MixTestSuiteS16_LE, StrideCopy) {
-  TestScaleStride(1.0);
-  TestScaleStride(100);
-  TestScaleStride(0.5);
-}
-
-class MixTestSuiteS24_LE : public testing::Test {
- protected:
-  virtual void SetUp() {
-    fmt_ = SND_PCM_FORMAT_S24_LE;
-    fr_bytes_ = 4 * kNumChannels;
-    mix_buffer_ = (int32_t*)malloc(kBufferFrames * fr_bytes_);
-    src_buffer_ = static_cast<int32_t*>(
-        calloc(1, kBufferFrames * fr_bytes_ + sizeof(cras_audio_shm_header)));
-
-    for (size_t i = 0; i < kBufferFrames * 2; i++) {
-      src_buffer_[i] = i;
-      mix_buffer_[i] = -i;
-    }
-
-    compare_buffer_ = (int32_t*)malloc(kBufferFrames * fr_bytes_);
-  }
-
-  virtual void TearDown() {
-    free(mix_buffer_);
-    free(compare_buffer_);
-    free(src_buffer_);
-  }
-
-  void _SetupBuffer() {
-    for (size_t i = 0; i < kBufferFrames; i++) {
-      src_buffer_[i] = i + (0x007fffff >> 2);
-      mix_buffer_[i] = i + (0x007fffff >> 2);
-      compare_buffer_[i] = mix_buffer_[i];
-    }
-    for (size_t i = kBufferFrames; i < kBufferFrames * 2; i++) {
-      src_buffer_[i] = -i - (0x007fffff >> 2);
-      mix_buffer_[i] = -i - (0x007fffff >> 2);
-      compare_buffer_[i] = mix_buffer_[i];
-    }
-  }
-
-  void TestScaleStride(float scaler) {
-    _SetupBuffer();
-    for (size_t i = 0; i < kBufferFrames * 2; i += 2) {
-      int32_t tmp;
-      if (need_to_scale(scaler))
-        tmp = mix_buffer_[i] + Scale(src_buffer_[i / 2], scaler);
-      else
-        tmp = mix_buffer_[i] + src_buffer_[i / 2];
-      if (tmp > 0x007fffff)
-        tmp = 0x007fffff;
-      else if (tmp < (int32_t)0xff800000)
-        tmp = (int32_t)0xff800000;
-      compare_buffer_[i] = tmp;
-    }
-
-    cras_mix_add_scale_stride(fmt_, (uint8_t*)mix_buffer_,
-                              (uint8_t*)src_buffer_, kBufferFrames, 8, 4,
-                              scaler);
-
-    EXPECT_EQ(0, memcmp(compare_buffer_, mix_buffer_, kBufferFrames * 8));
-  }
-
-  void ScaleIncrement(float start_scaler, float increment, float target) {
-    float scaler = start_scaler;
-
-    for (size_t i = 0; i < kBufferFrames * 2; i++) {
-      float applied_scaler = scaler;
-
-      if ((applied_scaler > target && increment > 0) ||
-          (applied_scaler < target && increment < 0))
-        applied_scaler = target;
-
-      if (applied_scaler > kMaxVolumeToScale) {
-      } else if (applied_scaler < kMinVolumeToScale) {
-        compare_buffer_[i] = 0;
-      } else {
-        compare_buffer_[i] = Scale(mix_buffer_[i], applied_scaler);
-      }
-
-      if (i % 2 == 1)
-        scaler += increment;
-    }
-  }
-
-  int32_t Scale(int32_t value, float scaler) {
-    value = ((uint32_t)(value & 0x00ffffff)) << 8;
-    value *= scaler;
-    return (value >> 8) & 0x00ffffff;
-  }
-
-  int32_t* mix_buffer_;
-  int32_t* src_buffer_;
-  int32_t* compare_buffer_;
-  snd_pcm_format_t fmt_;
-  unsigned int fr_bytes_;
-};
-
-TEST_F(MixTestSuiteS24_LE, MixFirst) {
-  cras_mix_add(fmt_, (uint8_t*)mix_buffer_, (uint8_t*)src_buffer_, kNumSamples,
-               0, 0, 1.0);
-  EXPECT_EQ(0, memcmp(mix_buffer_, src_buffer_, kBufferFrames * fr_bytes_));
-}
-
-TEST_F(MixTestSuiteS24_LE, MixTwo) {
-  cras_mix_add(fmt_, (uint8_t*)mix_buffer_, (uint8_t*)src_buffer_, kNumSamples,
-               0, 0, 1.0);
-  cras_mix_add(fmt_, (uint8_t*)mix_buffer_, (uint8_t*)src_buffer_, kNumSamples,
-               1, 0, 1.0);
-
-  for (size_t i = 0; i < kBufferFrames * 2; i++)
-    compare_buffer_[i] = Scale(src_buffer_[i], 2);
-  EXPECT_EQ(0, memcmp(mix_buffer_, compare_buffer_, kBufferFrames * fr_bytes_));
-}
-
-TEST_F(MixTestSuiteS24_LE, MixTwoClip) {
-  cras_mix_add(fmt_, (uint8_t*)mix_buffer_, (uint8_t*)src_buffer_, kNumSamples,
-               0, 0, 1.0);
-  for (size_t i = 0; i < kBufferFrames * 2; i++)
-    src_buffer_[i] = 0x007fffff;
-  cras_mix_add(fmt_, (uint8_t*)mix_buffer_, (uint8_t*)src_buffer_, kNumSamples,
-               1, 0, 1.0);
-
-  for (size_t i = 0; i < kBufferFrames * 2; i++)
-    compare_buffer_[i] = 0x007fffff;
-  EXPECT_EQ(0, memcmp(mix_buffer_, compare_buffer_, kBufferFrames * fr_bytes_));
-}
-
-TEST_F(MixTestSuiteS24_LE, MixFirstMuted) {
-  cras_mix_add(fmt_, (uint8_t*)mix_buffer_, (uint8_t*)src_buffer_, kNumSamples,
-               0, 1, 1.0);
-
-  for (size_t i = 0; i < kBufferFrames * 2; i++)
-    compare_buffer_[i] = 0;
-  EXPECT_EQ(0, memcmp(mix_buffer_, compare_buffer_, kBufferFrames * fr_bytes_));
-}
-
-TEST_F(MixTestSuiteS24_LE, MixFirstZeroVolume) {
-  cras_mix_add(fmt_, (uint8_t*)mix_buffer_, (uint8_t*)src_buffer_, kNumSamples,
-               0, 0, 0.0);
-
-  for (size_t i = 0; i < kBufferFrames * 2; i++)
-    compare_buffer_[i] = 0;
-  EXPECT_EQ(0, memcmp(mix_buffer_, compare_buffer_, kBufferFrames * fr_bytes_));
-}
-
-TEST_F(MixTestSuiteS24_LE, MixFirstHalfVolume) {
-  cras_mix_add(fmt_, (uint8_t*)mix_buffer_, (uint8_t*)src_buffer_, kNumSamples,
-               0, 0, 0.5);
-
-  for (size_t i = 0; i < kBufferFrames * 2; i++)
-    compare_buffer_[i] = Scale(src_buffer_[i], 0.5);
-  EXPECT_EQ(0, memcmp(mix_buffer_, compare_buffer_, kBufferFrames * fr_bytes_));
-}
-
-TEST_F(MixTestSuiteS24_LE, MixTwoSecondHalfVolume) {
-  cras_mix_add(fmt_, (uint8_t*)mix_buffer_, (uint8_t*)src_buffer_, kNumSamples,
-               0, 0, 1.0);
-  cras_mix_add(fmt_, (uint8_t*)mix_buffer_, (uint8_t*)src_buffer_, kNumSamples,
-               1, 0, 0.5);
-
-  for (size_t i = 0; i < kBufferFrames * 2; i++)
-    compare_buffer_[i] = src_buffer_[i] + Scale(src_buffer_[i], 0.5);
-  EXPECT_EQ(0, memcmp(mix_buffer_, compare_buffer_, kBufferFrames * fr_bytes_));
-}
-
-TEST_F(MixTestSuiteS24_LE, ScaleFullVolumeIncrement) {
-  float increment = 0.01;
-  int step = 2;
-  float start_scaler = 0.999999999;
-  float target = 1.0;
-
-  _SetupBuffer();
-  // Scale full volume with positive increment will not change buffer.
-  memcpy(compare_buffer_, src_buffer_, kBufferFrames * fr_bytes_);
-  cras_scale_buffer_increment(fmt_, (uint8_t*)mix_buffer_, kBufferFrames,
-                              start_scaler, increment, target, step);
-
-  EXPECT_EQ(0, memcmp(compare_buffer_, mix_buffer_, kBufferFrames * fr_bytes_));
-}
-
-TEST_F(MixTestSuiteS24_LE, ScaleMinVolumeIncrement) {
-  float increment = -0.01;
-  int step = 2;
-  float start_scaler = 0.000000001;
-  float target = 0.0;
-
-  _SetupBuffer();
-  // Scale min volume with negative increment will change buffer to zeros.
-  memset(compare_buffer_, 0, kBufferFrames * fr_bytes_);
-  cras_scale_buffer_increment(fmt_, (uint8_t*)mix_buffer_, kBufferFrames,
-                              start_scaler, increment, target, step);
-
-  EXPECT_EQ(0, memcmp(compare_buffer_, mix_buffer_, kBufferFrames * fr_bytes_));
-}
-
-TEST_F(MixTestSuiteS24_LE, ScaleVolumePositiveIncrement) {
-  float increment = 0.0001;
-  int step = 2;
-  float start_scaler = 0.1;
-  float target = 1.0;
-
-  _SetupBuffer();
-  ScaleIncrement(start_scaler, increment, target);
-
-  cras_scale_buffer_increment(fmt_, (uint8_t*)mix_buffer_, kBufferFrames,
-                              start_scaler, increment, target, step);
-  EXPECT_EQ(0, memcmp(compare_buffer_, mix_buffer_, kBufferFrames * fr_bytes_));
-}
-
-TEST_F(MixTestSuiteS24_LE, ScaleVolumeNegativeIncrement) {
-  float increment = -0.0001;
-  int step = 2;
-  float start_scaler = 0.8;
-  float target = 0.0;
-
-  _SetupBuffer();
-  ScaleIncrement(start_scaler, increment, target);
-
-  cras_scale_buffer_increment(fmt_, (uint8_t*)mix_buffer_, kBufferFrames,
-                              start_scaler, increment, target, step);
-
-  EXPECT_EQ(0, memcmp(compare_buffer_, mix_buffer_, kBufferFrames * fr_bytes_));
-}
-
-TEST_F(MixTestSuiteS24_LE, ScaleVolumeStartFullNegativeIncrement) {
-  float increment = -0.0001;
-  int step = 2;
-  float start_scaler = 1.0;
-  float target = 0.0;
-
-  _SetupBuffer();
-  ScaleIncrement(start_scaler, increment, target);
-
-  cras_scale_buffer_increment(fmt_, (uint8_t*)mix_buffer_, kBufferFrames,
-                              start_scaler, increment, target, step);
-
-  EXPECT_EQ(0, memcmp(compare_buffer_, mix_buffer_, kBufferFrames * 4));
-}
-
-TEST_F(MixTestSuiteS24_LE, ScaleVolumeStartZeroPositiveIncrement) {
-  float increment = 0.0001;
-  int step = 2;
-  float start_scaler = 0.0;
-  float target = 1.0;
-
-  _SetupBuffer();
-  ScaleIncrement(start_scaler, increment, target);
-
-  cras_scale_buffer_increment(fmt_, (uint8_t*)mix_buffer_, kBufferFrames,
-                              start_scaler, increment, target, step);
-
-  EXPECT_EQ(0, memcmp(compare_buffer_, mix_buffer_, kBufferFrames * 4));
-}
-
-TEST_F(MixTestSuiteS24_LE, ScaleVolumePositiveIncrementCappedByTarget) {
-  float increment = 0.0001;
-  int step = 2;
-  float start_scaler = 0.1;
-  float target = 0.5;
-
-  _SetupBuffer();
-  ScaleIncrement(start_scaler, increment, target);
-
-  cras_scale_buffer_increment(fmt_, (uint8_t*)mix_buffer_, kBufferFrames,
-                              start_scaler, increment, target, step);
-  EXPECT_EQ(0, memcmp(compare_buffer_, mix_buffer_, kBufferFrames * fr_bytes_));
-}
-
-TEST_F(MixTestSuiteS24_LE, ScaleVolumeNegativeIncrementCappedByTarget) {
-  float increment = -0.01;
-  int step = 2;
-  float start_scaler = 0.8;
-  float target = 0.5;
-
-  _SetupBuffer();
-  ScaleIncrement(start_scaler, increment, target);
-
-  cras_scale_buffer_increment(fmt_, (uint8_t*)mix_buffer_, kBufferFrames,
-                              start_scaler, increment, target, step);
-  EXPECT_EQ(0, memcmp(compare_buffer_, mix_buffer_, kBufferFrames * fr_bytes_));
-}
-
-TEST_F(MixTestSuiteS24_LE, ScaleFullVolume) {
-  memcpy(compare_buffer_, src_buffer_, kBufferFrames * fr_bytes_);
-  cras_scale_buffer(fmt_, (uint8_t*)mix_buffer_, kNumSamples, 0.999999999);
-
-  EXPECT_EQ(0, memcmp(compare_buffer_, src_buffer_, kBufferFrames * fr_bytes_));
-}
-
-TEST_F(MixTestSuiteS24_LE, ScaleMinVolume) {
-  memset(compare_buffer_, 0, kBufferFrames * fr_bytes_);
-  cras_scale_buffer(fmt_, (uint8_t*)src_buffer_, kNumSamples, 0.0000000001);
-
-  EXPECT_EQ(0, memcmp(compare_buffer_, src_buffer_, kBufferFrames * fr_bytes_));
-}
-
-TEST_F(MixTestSuiteS24_LE, ScaleHalfVolume) {
-  for (size_t i = 0; i < kBufferFrames * 2; i++)
-    compare_buffer_[i] = Scale(src_buffer_[i], 0.5);
-  cras_scale_buffer(fmt_, (uint8_t*)src_buffer_, kNumSamples, 0.5);
-
-  EXPECT_EQ(0, memcmp(compare_buffer_, src_buffer_, kBufferFrames * fr_bytes_));
-}
-
-TEST_F(MixTestSuiteS24_LE, StrideCopy) {
-  TestScaleStride(1.0);
-  TestScaleStride(100);
-  TestScaleStride(0.1);
-}
-
-class MixTestSuiteS32_LE : public testing::Test {
- protected:
-  virtual void SetUp() {
-    fmt_ = SND_PCM_FORMAT_S32_LE;
-    fr_bytes_ = 4 * kNumChannels;
-    mix_buffer_ = (int32_t*)malloc(kBufferFrames * fr_bytes_);
-    src_buffer_ = static_cast<int32_t*>(
-        calloc(1, kBufferFrames * fr_bytes_ + sizeof(cras_audio_shm_header)));
-
-    for (size_t i = 0; i < kBufferFrames * 2; i++) {
-      src_buffer_[i] = i;
-      mix_buffer_[i] = -i;
-    }
-
-    compare_buffer_ = (int32_t*)malloc(kBufferFrames * fr_bytes_);
-  }
-
-  virtual void TearDown() {
-    free(mix_buffer_);
-    free(compare_buffer_);
-    free(src_buffer_);
-  }
-
-  void _SetupBuffer() {
-    for (size_t i = 0; i < kBufferFrames; i++) {
-      src_buffer_[i] = i + (INT32_MAX >> 2);
-      mix_buffer_[i] = i + (INT32_MAX >> 2);
-      compare_buffer_[i] = mix_buffer_[i];
-    }
-    for (size_t i = kBufferFrames; i < kBufferFrames * 2; i++) {
-      src_buffer_[i] = i - (INT32_MAX >> 2);
-      mix_buffer_[i] = i - (INT32_MAX >> 2);
-      compare_buffer_[i] = mix_buffer_[i];
-    }
-  }
-
-  void TestScaleStride(float scaler) {
-    _SetupBuffer();
-    for (size_t i = 0; i < kBufferFrames * 2; i += 2) {
-      int64_t tmp;
-      if (need_to_scale(scaler))
-        tmp = mix_buffer_[i] + src_buffer_[i / 2] * scaler;
-      else
-        tmp = mix_buffer_[i] + src_buffer_[i / 2];
-      if (tmp > INT32_MAX)
-        tmp = INT32_MAX;
-      else if (tmp < INT32_MIN)
-        tmp = INT32_MIN;
-      compare_buffer_[i] = tmp;
-    }
-
-    cras_mix_add_scale_stride(fmt_, (uint8_t*)mix_buffer_,
-                              (uint8_t*)src_buffer_, kBufferFrames, 8, 4,
-                              scaler);
-
-    EXPECT_EQ(0, memcmp(compare_buffer_, mix_buffer_, kBufferFrames * 8));
-  }
-
-  void ScaleIncrement(float start_scaler, float increment, float target) {
-    float scaler = start_scaler;
-
-    for (size_t i = 0; i < kBufferFrames * 2; i++) {
-      float applied_scaler = scaler;
-
-      if ((applied_scaler > target && increment > 0) ||
-          (applied_scaler < target && increment < 0))
-        applied_scaler = target;
-
-      if (applied_scaler > kMaxVolumeToScale) {
-      } else if (applied_scaler < kMinVolumeToScale) {
-        compare_buffer_[i] = 0;
-      } else {
-        compare_buffer_[i] = mix_buffer_[i] * applied_scaler;
-      }
-
-      if (i % 2 == 1)
-        scaler += increment;
-    }
-  }
-
-  int32_t* mix_buffer_;
-  int32_t* src_buffer_;
-  int32_t* compare_buffer_;
-  snd_pcm_format_t fmt_;
-  unsigned int fr_bytes_;
-};
-
-TEST_F(MixTestSuiteS32_LE, MixFirst) {
-  cras_mix_add(fmt_, (uint8_t*)mix_buffer_, (uint8_t*)src_buffer_, kNumSamples,
-               0, 0, 1.0);
-  EXPECT_EQ(0, memcmp(mix_buffer_, src_buffer_, kBufferFrames * fr_bytes_));
-}
-
-TEST_F(MixTestSuiteS32_LE, MixTwo) {
-  cras_mix_add(fmt_, (uint8_t*)mix_buffer_, (uint8_t*)src_buffer_, kNumSamples,
-               0, 0, 1.0);
-  cras_mix_add(fmt_, (uint8_t*)mix_buffer_, (uint8_t*)src_buffer_, kNumSamples,
-               1, 0, 1.0);
-
-  for (size_t i = 0; i < kBufferFrames * 2; i++)
-    compare_buffer_[i] = src_buffer_[i] * 2;
-  EXPECT_EQ(0, memcmp(mix_buffer_, compare_buffer_, kBufferFrames * fr_bytes_));
-}
-
-TEST_F(MixTestSuiteS32_LE, MixTwoClip) {
-  cras_mix_add(fmt_, (uint8_t*)mix_buffer_, (uint8_t*)src_buffer_, kNumSamples,
-               0, 0, 1.0);
-  for (size_t i = 0; i < kBufferFrames * 2; i++)
-    src_buffer_[i] = INT32_MAX;
-  cras_mix_add(fmt_, (uint8_t*)mix_buffer_, (uint8_t*)src_buffer_, kNumSamples,
-               1, 0, 1.0);
-
-  for (size_t i = 0; i < kBufferFrames * 2; i++)
-    compare_buffer_[i] = INT32_MAX;
-  EXPECT_EQ(0, memcmp(mix_buffer_, compare_buffer_, kBufferFrames * fr_bytes_));
-}
-
-TEST_F(MixTestSuiteS32_LE, MixFirstMuted) {
-  cras_mix_add(fmt_, (uint8_t*)mix_buffer_, (uint8_t*)src_buffer_, kNumSamples,
-               0, 1, 1.0);
-
-  for (size_t i = 0; i < kBufferFrames * 2; i++)
-    compare_buffer_[i] = 0;
-  EXPECT_EQ(0, memcmp(mix_buffer_, compare_buffer_, kBufferFrames * fr_bytes_));
-}
-
-TEST_F(MixTestSuiteS32_LE, MixFirstZeroVolume) {
-  cras_mix_add(fmt_, (uint8_t*)mix_buffer_, (uint8_t*)src_buffer_, kNumSamples,
-               0, 0, 0.0);
-
-  for (size_t i = 0; i < kBufferFrames * 2; i++)
-    compare_buffer_[i] = 0;
-  EXPECT_EQ(0, memcmp(mix_buffer_, compare_buffer_, kBufferFrames * fr_bytes_));
-}
-
-TEST_F(MixTestSuiteS32_LE, MixFirstHalfVolume) {
-  cras_mix_add(fmt_, (uint8_t*)mix_buffer_, (uint8_t*)src_buffer_, kNumSamples,
-               0, 0, 0.5);
-
-  for (size_t i = 0; i < kBufferFrames * 2; i++)
-    compare_buffer_[i] = src_buffer_[i] * 0.5;
-  EXPECT_EQ(0, memcmp(mix_buffer_, compare_buffer_, kBufferFrames * fr_bytes_));
-}
-
-TEST_F(MixTestSuiteS32_LE, MixTwoSecondHalfVolume) {
-  cras_mix_add(fmt_, (uint8_t*)mix_buffer_, (uint8_t*)src_buffer_, kNumSamples,
-               0, 0, 1.0);
-  cras_mix_add(fmt_, (uint8_t*)mix_buffer_, (uint8_t*)src_buffer_, kNumSamples,
-               1, 0, 0.5);
-
-  for (size_t i = 0; i < kBufferFrames * 2; i++)
-    compare_buffer_[i] = src_buffer_[i] + (int32_t)(src_buffer_[i] * 0.5);
-  EXPECT_EQ(0, memcmp(mix_buffer_, compare_buffer_, kBufferFrames * fr_bytes_));
-}
-
-TEST_F(MixTestSuiteS32_LE, ScaleFullVolumeIncrement) {
-  float increment = 0.01;
-  int step = 2;
-  float start_scaler = 0.999999999;
-  float target = 1.0;
-
-  _SetupBuffer();
-  // Scale full volume with positive increment will not change buffer.
-  memcpy(compare_buffer_, src_buffer_, kBufferFrames * fr_bytes_);
-  cras_scale_buffer_increment(fmt_, (uint8_t*)mix_buffer_, kBufferFrames,
-                              start_scaler, increment, target, step);
-
-  EXPECT_EQ(0, memcmp(compare_buffer_, mix_buffer_, kBufferFrames * fr_bytes_));
-}
-
-TEST_F(MixTestSuiteS32_LE, ScaleMinVolumeIncrement) {
-  float increment = -0.01;
-  int step = 2;
-  float start_scaler = 0.000000001;
-  float target = 0.0;
-
-  _SetupBuffer();
-  // Scale min volume with negative increment will change buffer to zeros.
-  memset(compare_buffer_, 0, kBufferFrames * fr_bytes_);
-  cras_scale_buffer_increment(fmt_, (uint8_t*)mix_buffer_, kBufferFrames,
-                              start_scaler, increment, target, step);
-
-  EXPECT_EQ(0, memcmp(compare_buffer_, mix_buffer_, kBufferFrames * fr_bytes_));
-}
-
-TEST_F(MixTestSuiteS32_LE, ScaleVolumePositiveIncrement) {
-  float increment = 0.0001;
-  int step = 2;
-  float start_scaler = 0.1;
-  float target = 1.0;
-
-  _SetupBuffer();
-  ScaleIncrement(start_scaler, increment, target);
-
-  cras_scale_buffer_increment(fmt_, (uint8_t*)mix_buffer_, kBufferFrames,
-                              start_scaler, increment, target, step);
-  EXPECT_EQ(0, memcmp(compare_buffer_, mix_buffer_, kBufferFrames * fr_bytes_));
-}
-
-TEST_F(MixTestSuiteS32_LE, ScaleVolumeNegativeIncrement) {
-  float increment = -0.0001;
-  int step = 2;
-  float start_scaler = 0.8;
-  float target = 0.0;
-
-  _SetupBuffer();
-  ScaleIncrement(start_scaler, increment, target);
-
-  cras_scale_buffer_increment(fmt_, (uint8_t*)mix_buffer_, kBufferFrames,
-                              start_scaler, increment, target, step);
-
-  EXPECT_EQ(0, memcmp(compare_buffer_, mix_buffer_, kBufferFrames * fr_bytes_));
-}
-
-TEST_F(MixTestSuiteS32_LE, ScaleVolumeStartFullNegativeIncrement) {
-  float increment = -0.0001;
-  int step = 2;
-  float start_scaler = 1.0;
-  float target = 0.0;
-
-  _SetupBuffer();
-  ScaleIncrement(start_scaler, increment, target);
-
-  cras_scale_buffer_increment(fmt_, (uint8_t*)mix_buffer_, kBufferFrames,
-                              start_scaler, increment, target, step);
-
-  EXPECT_EQ(0, memcmp(compare_buffer_, mix_buffer_, kBufferFrames * 4));
-}
-
-TEST_F(MixTestSuiteS32_LE, ScaleVolumeStartZeroPositiveIncrement) {
-  float increment = 0.0001;
-  int step = 2;
-  float start_scaler = 0.0;
-  float target = 1.0;
-
-  _SetupBuffer();
-  ScaleIncrement(start_scaler, increment, target);
-
-  cras_scale_buffer_increment(fmt_, (uint8_t*)mix_buffer_, kBufferFrames,
-                              start_scaler, increment, target, step);
-
-  EXPECT_EQ(0, memcmp(compare_buffer_, mix_buffer_, kBufferFrames * 4));
-}
-
-TEST_F(MixTestSuiteS32_LE, ScaleVolumePositiveIncrementCappedByTarget) {
-  float increment = 0.0001;
-  int step = 2;
-  float start_scaler = 0.1;
-  float target = 0.5;
-
-  _SetupBuffer();
-  ScaleIncrement(start_scaler, increment, target);
-
-  cras_scale_buffer_increment(fmt_, (uint8_t*)mix_buffer_, kBufferFrames,
-                              start_scaler, increment, target, step);
-  EXPECT_EQ(0, memcmp(compare_buffer_, mix_buffer_, kBufferFrames * fr_bytes_));
-}
-
-TEST_F(MixTestSuiteS32_LE, ScaleVolumeNegativeIncrementCappedByTarget) {
-  float increment = -0.01;
-  int step = 2;
-  float start_scaler = 0.8;
-  float target = 0.5;
-
-  _SetupBuffer();
-  ScaleIncrement(start_scaler, increment, target);
-
-  cras_scale_buffer_increment(fmt_, (uint8_t*)mix_buffer_, kBufferFrames,
-                              start_scaler, increment, target, step);
-  EXPECT_EQ(0, memcmp(compare_buffer_, mix_buffer_, kBufferFrames * fr_bytes_));
-}
-
-TEST_F(MixTestSuiteS32_LE, ScaleFullVolume) {
-  memcpy(compare_buffer_, src_buffer_, kBufferFrames * fr_bytes_);
-  cras_scale_buffer(fmt_, (uint8_t*)mix_buffer_, kNumSamples, 0.999999999);
-
-  EXPECT_EQ(0, memcmp(compare_buffer_, src_buffer_, kBufferFrames * fr_bytes_));
-}
-
-TEST_F(MixTestSuiteS32_LE, ScaleMinVolume) {
-  memset(compare_buffer_, 0, kBufferFrames * fr_bytes_);
-  cras_scale_buffer(fmt_, (uint8_t*)src_buffer_, kNumSamples, 0.0000000001);
-
-  EXPECT_EQ(0, memcmp(compare_buffer_, src_buffer_, kBufferFrames * fr_bytes_));
-}
-
-TEST_F(MixTestSuiteS32_LE, ScaleHalfVolume) {
-  for (size_t i = 0; i < kBufferFrames * 2; i++)
-    compare_buffer_[i] = src_buffer_[i] * 0.5;
-  cras_scale_buffer(fmt_, (uint8_t*)src_buffer_, kNumSamples, 0.5);
-
-  EXPECT_EQ(0, memcmp(compare_buffer_, src_buffer_, kBufferFrames * fr_bytes_));
-}
-
-TEST_F(MixTestSuiteS32_LE, StrideCopy) {
-  TestScaleStride(1.0);
-  TestScaleStride(100);
-  TestScaleStride(0.1);
-}
-
-class MixTestSuiteS24_3LE : public testing::Test {
- protected:
-  virtual void SetUp() {
-    fmt_ = SND_PCM_FORMAT_S24_3LE;
-    fr_bytes_ = 3 * kNumChannels;
-    mix_buffer_ = (uint8_t*)malloc(kBufferFrames * fr_bytes_);
-    src_buffer_ = static_cast<uint8_t*>(
-        calloc(1, kBufferFrames * fr_bytes_ + sizeof(cras_audio_shm_header)));
-
-    for (size_t i = 0; i < kBufferFrames * kNumChannels; i++) {
-      memcpy(src_buffer_ + 3 * i, &i, 3);
-      int32_t tmp = -i * 256;
-      memcpy(mix_buffer_ + 3 * i, (uint8_t*)&tmp + 1, 3);
-    }
-
-    compare_buffer_ = (uint8_t*)malloc(kBufferFrames * fr_bytes_);
-  }
-
-  virtual void TearDown() {
-    free(mix_buffer_);
-    free(compare_buffer_);
-    free(src_buffer_);
-  }
-
-  void _SetupBuffer() {
-    memset(compare_buffer_, 0, kBufferFrames * fr_bytes_);
-    for (size_t i = 0; i < kBufferFrames; i++) {
-      int32_t tmp = (i << 8) + (INT32_MAX >> 2);
-      memcpy(src_buffer_ + 3 * i, (uint8_t*)&tmp + 1, 3);
-      memcpy(mix_buffer_ + 3 * i, (uint8_t*)&tmp + 1, 3);
-      memcpy(compare_buffer_ + 3 * i, (uint8_t*)&tmp + 1, 3);
-    }
-    for (size_t i = kBufferFrames; i < kBufferFrames * 2; i++) {
-      int32_t tmp = (i << 8) - (INT32_MAX >> 2);
-      memcpy(src_buffer_ + 3 * i, (uint8_t*)&tmp + 1, 3);
-      memcpy(mix_buffer_ + 3 * i, (uint8_t*)&tmp + 1, 3);
-      memcpy(compare_buffer_ + 3 * i, (uint8_t*)&tmp + 1, 3);
-    }
-  }
-
-  void TestScaleStride(float scaler) {
-    _SetupBuffer();
-    for (size_t i = 0; i < kBufferFrames * kNumChannels; i += 2) {
-      int64_t tmp;
-      int32_t src_frame = 0;
-      int32_t dst_frame = 0;
-      memcpy((uint8_t*)&src_frame + 1, src_buffer_ + 3 * i / 2, 3);
-      memcpy((uint8_t*)&dst_frame + 1, mix_buffer_ + 3 * i, 3);
-      if (need_to_scale(scaler))
-        tmp = (int64_t)dst_frame + (int64_t)src_frame * scaler;
-      else
-        tmp = (int64_t)dst_frame + (int64_t)src_frame;
-      if (tmp > INT32_MAX)
-        tmp = INT32_MAX;
-      else if (tmp < INT32_MIN)
-        tmp = INT32_MIN;
-      dst_frame = (int32_t)tmp;
-      memcpy(compare_buffer_ + 3 * i, (uint8_t*)&dst_frame + 1, 3);
-    }
-
-    cras_mix_add_scale_stride(fmt_, (uint8_t*)mix_buffer_,
-                              (uint8_t*)src_buffer_, kBufferFrames, 6, 3,
-                              scaler);
-
-    EXPECT_EQ(0, memcmp(compare_buffer_, mix_buffer_, kBufferFrames * 6));
-  }
-
-  void ScaleIncrement(float start_scaler, float increment, float target) {
-    float scaler = start_scaler;
-
-    for (size_t i = 0; i < kBufferFrames * kNumChannels; i++) {
-      float applied_scaler = scaler;
-      int32_t tmp = 0;
-      memcpy((uint8_t*)&tmp + 1, src_buffer_ + 3 * i, 3);
-
-      if ((applied_scaler > target && increment > 0) ||
-          (applied_scaler < target && increment < 0))
-        applied_scaler = target;
-
-      if (applied_scaler > kMaxVolumeToScale) {
-      } else if (applied_scaler < kMinVolumeToScale) {
-        tmp = 0;
-      } else {
-        tmp *= applied_scaler;
-      }
-
-      memcpy(compare_buffer_ + 3 * i, (uint8_t*)&tmp + 1, 3);
-
-      if (i % 2 == 1)
-        scaler += increment;
-    }
-  }
-
-  uint8_t* mix_buffer_;
-  uint8_t* src_buffer_;
-  uint8_t* compare_buffer_;
-  snd_pcm_format_t fmt_;
-  unsigned int fr_bytes_;
-};
-
-TEST_F(MixTestSuiteS24_3LE, MixFirst) {
-  cras_mix_add(fmt_, (uint8_t*)mix_buffer_, (uint8_t*)src_buffer_, kNumSamples,
-               0, 0, 1.0);
-  EXPECT_EQ(0, memcmp(mix_buffer_, src_buffer_, kBufferFrames * fr_bytes_));
-}
-
-TEST_F(MixTestSuiteS24_3LE, MixTwo) {
-  cras_mix_add(fmt_, (uint8_t*)mix_buffer_, (uint8_t*)src_buffer_, kNumSamples,
-               0, 0, 1.0);
-  cras_mix_add(fmt_, (uint8_t*)mix_buffer_, (uint8_t*)src_buffer_, kNumSamples,
-               1, 0, 1.0);
-
-  for (size_t i = 0; i < kBufferFrames * kNumChannels; i++) {
-    int32_t tmp = 0;
-    memcpy((uint8_t*)&tmp + 1, src_buffer_ + 3 * i, 3);
-    tmp *= 2;
-    memcpy(compare_buffer_ + 3 * i, (uint8_t*)&tmp + 1, 3);
-  }
-  EXPECT_EQ(0, memcmp(mix_buffer_, compare_buffer_, kBufferFrames * fr_bytes_));
-}
-
-TEST_F(MixTestSuiteS24_3LE, MixTwoClip) {
-  cras_mix_add(fmt_, (uint8_t*)mix_buffer_, (uint8_t*)src_buffer_, kNumSamples,
-               0, 0, 1.0);
-  for (size_t i = 0; i < kBufferFrames * kNumChannels; i++) {
-    int32_t tmp = INT32_MAX;
-    memcpy(src_buffer_ + 3 * i, (uint8_t*)&tmp + 1, 3);
-  }
-  cras_mix_add(fmt_, (uint8_t*)mix_buffer_, (uint8_t*)src_buffer_, kNumSamples,
-               1, 0, 1.0);
-
-  for (size_t i = 0; i < kBufferFrames * kNumChannels; i++) {
-    int32_t tmp = INT32_MAX;
-    memcpy(compare_buffer_ + 3 * i, (uint8_t*)&tmp + 1, 3);
-  }
-  EXPECT_EQ(0, memcmp(mix_buffer_, compare_buffer_, kBufferFrames * fr_bytes_));
-}
-
-TEST_F(MixTestSuiteS24_3LE, MixFirstMuted) {
-  cras_mix_add(fmt_, (uint8_t*)mix_buffer_, (uint8_t*)src_buffer_, kNumSamples,
-               0, 1, 1.0);
-
-  for (size_t i = 0; i < kBufferFrames * kNumChannels; i++)
-    memset(compare_buffer_ + 3 * i, 0, 3);
-  EXPECT_EQ(0, memcmp(mix_buffer_, compare_buffer_, kBufferFrames * fr_bytes_));
-}
-
-TEST_F(MixTestSuiteS24_3LE, MixFirstZeroVolume) {
-  cras_mix_add(fmt_, (uint8_t*)mix_buffer_, (uint8_t*)src_buffer_, kNumSamples,
-               0, 0, 0.0);
-
-  for (size_t i = 0; i < kBufferFrames * kNumChannels; i++)
-    memset(compare_buffer_ + 3 * i, 0, 3);
-  EXPECT_EQ(0, memcmp(mix_buffer_, compare_buffer_, kBufferFrames * fr_bytes_));
-}
-
-TEST_F(MixTestSuiteS24_3LE, MixFirstHalfVolume) {
-  cras_mix_add(fmt_, (uint8_t*)mix_buffer_, (uint8_t*)src_buffer_, kNumSamples,
-               0, 0, 0.5);
-
-  for (size_t i = 0; i < kBufferFrames * kNumChannels; i++) {
-    int32_t tmp = 0;
-    memcpy((uint8_t*)&tmp + 1, src_buffer_ + 3 * i, 3);
-    tmp *= 0.5;
-    memcpy(compare_buffer_ + 3 * i, (uint8_t*)&tmp + 1, 3);
-  }
-  EXPECT_EQ(0, memcmp(mix_buffer_, compare_buffer_, kBufferFrames * fr_bytes_));
-}
-
-TEST_F(MixTestSuiteS24_3LE, MixTwoSecondHalfVolume) {
-  cras_mix_add(fmt_, (uint8_t*)mix_buffer_, (uint8_t*)src_buffer_, kNumSamples,
-               0, 0, 1.0);
-  cras_mix_add(fmt_, (uint8_t*)mix_buffer_, (uint8_t*)src_buffer_, kNumSamples,
-               1, 0, 0.5);
-
-  for (size_t i = 0; i < kBufferFrames * kNumChannels; i++) {
-    int32_t tmp1 = 0, tmp2 = 0;
-    memcpy((uint8_t*)&tmp1 + 1, src_buffer_ + 3 * i, 3);
-    memcpy((uint8_t*)&tmp2 + 1, src_buffer_ + 3 * i, 3);
-    tmp1 = tmp1 + (int32_t)(tmp2 * 0.5);
-    memcpy(compare_buffer_ + 3 * i, (uint8_t*)&tmp1 + 1, 3);
-  }
-  EXPECT_EQ(0, memcmp(mix_buffer_, compare_buffer_, kBufferFrames * fr_bytes_));
-}
-
-TEST_F(MixTestSuiteS24_3LE, ScaleFullVolumeIncrement) {
-  float increment = 0.01;
-  int step = 2;
-  float start_scaler = 0.999999999;
-  float target = 1.0;
-
-  _SetupBuffer();
-  // Scale full volume with positive increment will not change buffer.
-  memcpy(compare_buffer_, src_buffer_, kBufferFrames * fr_bytes_);
-  cras_scale_buffer_increment(fmt_, (uint8_t*)mix_buffer_, kBufferFrames,
-                              start_scaler, increment, target, step);
-
-  EXPECT_EQ(0, memcmp(compare_buffer_, mix_buffer_, kBufferFrames * fr_bytes_));
-}
-
-TEST_F(MixTestSuiteS24_3LE, ScaleMinVolumeIncrement) {
-  float increment = -0.01;
-  int step = 2;
-  float start_scaler = 0.000000001;
-  float target = 0.0;
-
-  _SetupBuffer();
-  // Scale min volume with negative increment will change buffer to zeros.
-  memset(compare_buffer_, 0, kBufferFrames * fr_bytes_);
-  cras_scale_buffer_increment(fmt_, (uint8_t*)mix_buffer_, kBufferFrames,
-                              start_scaler, increment, target, step);
-
-  EXPECT_EQ(0, memcmp(compare_buffer_, mix_buffer_, kBufferFrames * fr_bytes_));
-}
-
-TEST_F(MixTestSuiteS24_3LE, ScaleVolumePositiveIncrement) {
-  float increment = 0.0001;
-  int step = 2;
-  float start_scaler = 0.1;
-  float target = 1.0;
-
-  _SetupBuffer();
-  ScaleIncrement(start_scaler, increment, target);
-
-  cras_scale_buffer_increment(fmt_, (uint8_t*)mix_buffer_, kBufferFrames,
-                              start_scaler, increment, target, step);
-  EXPECT_EQ(0, memcmp(compare_buffer_, mix_buffer_, kBufferFrames * fr_bytes_));
-}
-
-TEST_F(MixTestSuiteS24_3LE, ScaleVolumeNegativeIncrement) {
-  float increment = -0.0001;
-  int step = 2;
-  float start_scaler = 0.8;
-  float target = 0.0;
-
-  _SetupBuffer();
-  ScaleIncrement(start_scaler, increment, target);
-
-  cras_scale_buffer_increment(fmt_, (uint8_t*)mix_buffer_, kBufferFrames,
-                              start_scaler, increment, target, step);
-
-  EXPECT_EQ(0, memcmp(compare_buffer_, mix_buffer_, kBufferFrames * fr_bytes_));
-}
-
-TEST_F(MixTestSuiteS24_3LE, ScaleVolumeStartFullNegativeIncrement) {
-  float increment = -0.0001;
-  int step = 2;
-  float start_scaler = 1.0;
-  float target = 0.0;
-
-  _SetupBuffer();
-  ScaleIncrement(start_scaler, increment, target);
-
-  cras_scale_buffer_increment(fmt_, (uint8_t*)mix_buffer_, kBufferFrames,
-                              start_scaler, increment, target, step);
-
-  EXPECT_EQ(0, memcmp(compare_buffer_, mix_buffer_, kBufferFrames * 4));
-}
-
-TEST_F(MixTestSuiteS24_3LE, ScaleVolumeStartZeroPositiveIncrement) {
-  float increment = 0.0001;
-  int step = 2;
-  float start_scaler = 0.0;
-  float target = 1.0;
-
-  _SetupBuffer();
-  ScaleIncrement(start_scaler, increment, target);
-
-  cras_scale_buffer_increment(fmt_, (uint8_t*)mix_buffer_, kBufferFrames,
-                              start_scaler, increment, target, step);
-
-  EXPECT_EQ(0, memcmp(compare_buffer_, mix_buffer_, kBufferFrames * 4));
-}
-
-TEST_F(MixTestSuiteS24_3LE, ScaleVolumePositiveIncrementCappedByTarget) {
-  float increment = 0.0001;
-  int step = 2;
-  float start_scaler = 0.1;
-  float target = 0.5;
-
-  _SetupBuffer();
-  ScaleIncrement(start_scaler, increment, target);
-
-  cras_scale_buffer_increment(fmt_, (uint8_t*)mix_buffer_, kBufferFrames,
-                              start_scaler, increment, target, step);
-  EXPECT_EQ(0, memcmp(compare_buffer_, mix_buffer_, kBufferFrames * fr_bytes_));
-}
-
-TEST_F(MixTestSuiteS24_3LE, ScaleVolumeNegativeIncrementCappedByTarget) {
-  float increment = -0.01;
-  int step = 2;
-  float start_scaler = 0.8;
-  float target = 0.5;
-
-  _SetupBuffer();
-  ScaleIncrement(start_scaler, increment, target);
-
-  cras_scale_buffer_increment(fmt_, (uint8_t*)mix_buffer_, kBufferFrames,
-                              start_scaler, increment, target, step);
-  EXPECT_EQ(0, memcmp(compare_buffer_, mix_buffer_, kBufferFrames * fr_bytes_));
-}
-
-TEST_F(MixTestSuiteS24_3LE, ScaleFullVolume) {
-  memcpy(compare_buffer_, src_buffer_, kBufferFrames * fr_bytes_);
-  cras_scale_buffer(fmt_, (uint8_t*)mix_buffer_, kNumSamples, 0.999999999);
-
-  EXPECT_EQ(0, memcmp(compare_buffer_, src_buffer_, kBufferFrames * fr_bytes_));
-}
-
-TEST_F(MixTestSuiteS24_3LE, ScaleMinVolume) {
-  memset(compare_buffer_, 0, kBufferFrames * fr_bytes_);
-  cras_scale_buffer(fmt_, (uint8_t*)src_buffer_, kNumSamples, 0.0000000001);
-
-  EXPECT_EQ(0, memcmp(compare_buffer_, src_buffer_, kBufferFrames * fr_bytes_));
-}
-
-TEST_F(MixTestSuiteS24_3LE, ScaleHalfVolume) {
-  for (size_t i = 0; i < kBufferFrames * kNumChannels; i++) {
-    int32_t tmp = 0;
-    memcpy((uint8_t*)&tmp + 1, src_buffer_ + 3 * i, 3);
-    tmp *= 0.5;
-    memcpy(compare_buffer_ + 3 * i, (uint8_t*)&tmp + 1, 3);
-  }
-  cras_scale_buffer(fmt_, (uint8_t*)src_buffer_, kNumSamples, 0.5);
-
-  EXPECT_EQ(0, memcmp(compare_buffer_, src_buffer_, kBufferFrames * fr_bytes_));
-}
-
-TEST_F(MixTestSuiteS24_3LE, StrideCopy) {
-  TestScaleStride(1.0);
-  TestScaleStride(100);
-  TestScaleStride(0.1);
-}
-
-/* Stubs */
-extern "C" {}  // extern "C"
-
-}  //  namespace
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tests/observer_unittest.cc b/cras/src/tests/observer_unittest.cc
deleted file mode 100644
index 2a8fae2..0000000
--- a/cras/src/tests/observer_unittest.cc
+++ /dev/null
@@ -1,726 +0,0 @@
-// Copyright 2016 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <gtest/gtest.h>
-#include <stdio.h>
-#include <syslog.h>
-
-#include <map>
-#include <vector>
-
-extern "C" {
-#include "cras_observer.c"
-#include "cras_observer.h"
-#include "cras_types.h"
-}
-
-namespace {
-
-static size_t cras_alert_destroy_called;
-static size_t cras_alert_create_called;
-static std::vector<struct cras_alert*> cras_alert_create_return_values;
-typedef std::map<struct cras_alert*, void*> alert_callback_map;
-static alert_callback_map cras_alert_create_prepare_map;
-static alert_callback_map cras_alert_add_callback_map;
-typedef std::map<struct cras_alert*, unsigned int> alert_flags_map;
-static alert_flags_map cras_alert_create_flags_map;
-static struct cras_alert* cras_alert_pending_alert_value;
-static void* cras_alert_pending_data_value = NULL;
-static size_t cras_alert_pending_data_size_value;
-static size_t cras_iodev_list_update_device_list_called;
-static std::vector<void*> cb_context;
-static size_t cb_output_volume_changed_called;
-static std::vector<int32_t> cb_output_volume_changed_volume;
-static size_t cb_output_mute_changed_called;
-static std::vector<int> cb_output_mute_changed_muted;
-static std::vector<int> cb_output_mute_changed_user_muted;
-static std::vector<int> cb_output_mute_changed_mute_locked;
-static size_t cb_capture_gain_changed_called;
-static std::vector<int32_t> cb_capture_gain_changed_gain;
-static size_t cb_capture_mute_changed_called;
-static std::vector<int> cb_capture_mute_changed_muted;
-static std::vector<int> cb_capture_mute_changed_mute_locked;
-static size_t cb_nodes_changed_called;
-static size_t cb_active_node_changed_called;
-static std::vector<enum CRAS_STREAM_DIRECTION> cb_active_node_changed_dir;
-static std::vector<cras_node_id_t> cb_active_node_changed_node_id;
-static size_t cb_output_node_volume_changed_called;
-static std::vector<cras_node_id_t> cb_output_node_volume_changed_node_id;
-static std::vector<int32_t> cb_output_node_volume_changed_volume;
-static size_t cb_node_left_right_swapped_changed_called;
-static std::vector<cras_node_id_t> cb_node_left_right_swapped_changed_node_id;
-static std::vector<int> cb_node_left_right_swapped_changed_swapped;
-static size_t cb_input_node_gain_changed_called;
-static std::vector<cras_node_id_t> cb_input_node_gain_changed_node_id;
-static std::vector<int32_t> cb_input_node_gain_changed_gain;
-static size_t cb_num_active_streams_changed_called;
-static std::vector<enum CRAS_STREAM_DIRECTION>
-    cb_num_active_streams_changed_dir;
-static std::vector<uint32_t> cb_num_active_streams_changed_num;
-static size_t cb_num_input_streams_with_permission_called;
-static std::vector<std::vector<uint32_t>>
-    cb_num_input_streams_with_permission_array;
-
-static void ResetStubData() {
-  cras_alert_destroy_called = 0;
-  cras_alert_create_called = 0;
-  cras_alert_create_return_values.clear();
-  cras_alert_create_prepare_map.clear();
-  cras_alert_create_flags_map.clear();
-  cras_alert_add_callback_map.clear();
-  cras_alert_pending_alert_value = NULL;
-  cras_alert_pending_data_size_value = 0;
-  if (cras_alert_pending_data_value) {
-    free(cras_alert_pending_data_value);
-    cras_alert_pending_data_value = NULL;
-  }
-  cras_iodev_list_update_device_list_called = 0;
-  cb_context.clear();
-  cb_output_volume_changed_called = 0;
-  cb_output_volume_changed_volume.clear();
-  cb_output_mute_changed_called = 0;
-  cb_output_mute_changed_muted.clear();
-  cb_output_mute_changed_user_muted.clear();
-  cb_output_mute_changed_mute_locked.clear();
-  cb_capture_gain_changed_called = 0;
-  cb_capture_gain_changed_gain.clear();
-  cb_capture_mute_changed_called = 0;
-  cb_capture_mute_changed_muted.clear();
-  cb_capture_mute_changed_mute_locked.clear();
-  cb_nodes_changed_called = 0;
-  cb_active_node_changed_called = 0;
-  cb_active_node_changed_dir.clear();
-  cb_active_node_changed_node_id.clear();
-  cb_output_node_volume_changed_called = 0;
-  cb_output_node_volume_changed_node_id.clear();
-  cb_output_node_volume_changed_volume.clear();
-  cb_node_left_right_swapped_changed_called = 0;
-  cb_node_left_right_swapped_changed_node_id.clear();
-  cb_node_left_right_swapped_changed_swapped.clear();
-  cb_input_node_gain_changed_called = 0;
-  cb_input_node_gain_changed_node_id.clear();
-  cb_input_node_gain_changed_gain.clear();
-  cb_num_active_streams_changed_called = 0;
-  cb_num_active_streams_changed_dir.clear();
-  cb_num_active_streams_changed_num.clear();
-  cb_num_input_streams_with_permission_called = 0;
-  cb_num_input_streams_with_permission_array.clear();
-}
-
-/* System output volume changed. */
-void cb_output_volume_changed(void* context, int32_t volume) {
-  cb_output_volume_changed_called++;
-  cb_context.push_back(context);
-  cb_output_volume_changed_volume.push_back(volume);
-}
-/* System output mute changed. */
-void cb_output_mute_changed(void* context,
-                            int muted,
-                            int user_muted,
-                            int mute_locked) {
-  cb_output_mute_changed_called++;
-  cb_context.push_back(context);
-  cb_output_mute_changed_muted.push_back(muted);
-  cb_output_mute_changed_user_muted.push_back(user_muted);
-  cb_output_mute_changed_mute_locked.push_back(mute_locked);
-}
-/* System input/capture gain changed. */
-void cb_capture_gain_changed(void* context, int32_t gain) {
-  cb_capture_gain_changed_called++;
-  cb_context.push_back(context);
-  cb_capture_gain_changed_gain.push_back(gain);
-}
-
-/* System input/capture mute changed. */
-void cb_capture_mute_changed(void* context, int muted, int mute_locked) {
-  cb_capture_mute_changed_called++;
-  cb_context.push_back(context);
-  cb_capture_mute_changed_muted.push_back(muted);
-  cb_capture_mute_changed_mute_locked.push_back(mute_locked);
-}
-
-/* Device or node topology changed. */
-void cb_nodes_changed(void* context) {
-  cb_nodes_changed_called++;
-  cb_context.push_back(context);
-}
-
-/* Active node changed. A notification is sent for every change.
- * When there is no active node, node_id is 0. */
-void cb_active_node_changed(void* context,
-                            enum CRAS_STREAM_DIRECTION dir,
-                            cras_node_id_t node_id) {
-  cb_active_node_changed_called++;
-  cb_context.push_back(context);
-  cb_active_node_changed_dir.push_back(dir);
-  cb_active_node_changed_node_id.push_back(node_id);
-}
-
-/* Output node volume changed. */
-void cb_output_node_volume_changed(void* context,
-                                   cras_node_id_t node_id,
-                                   int32_t volume) {
-  cb_output_node_volume_changed_called++;
-  cb_context.push_back(context);
-  cb_output_node_volume_changed_node_id.push_back(node_id);
-  cb_output_node_volume_changed_volume.push_back(volume);
-}
-
-/* Node left/right swapped state change. */
-void cb_node_left_right_swapped_changed(void* context,
-                                        cras_node_id_t node_id,
-                                        int swapped) {
-  cb_node_left_right_swapped_changed_called++;
-  cb_context.push_back(context);
-  cb_node_left_right_swapped_changed_node_id.push_back(node_id);
-  cb_node_left_right_swapped_changed_swapped.push_back(swapped);
-}
-
-/* Input gain changed. */
-void cb_input_node_gain_changed(void* context,
-                                cras_node_id_t node_id,
-                                int32_t gain) {
-  cb_input_node_gain_changed_called++;
-  cb_context.push_back(context);
-  cb_input_node_gain_changed_node_id.push_back(node_id);
-  cb_input_node_gain_changed_gain.push_back(gain);
-}
-
-/* Number of active streams changed. */
-void cb_num_active_streams_changed(void* context,
-                                   enum CRAS_STREAM_DIRECTION dir,
-                                   uint32_t num_active_streams) {
-  cb_num_active_streams_changed_called++;
-  cb_context.push_back(context);
-  cb_num_active_streams_changed_dir.push_back(dir);
-  cb_num_active_streams_changed_num.push_back(num_active_streams);
-}
-
-void cb_num_input_streams_with_permission_changed(
-    void* context,
-    uint32_t num_input_streams[CRAS_NUM_CLIENT_TYPE]) {
-  cb_num_input_streams_with_permission_called++;
-  cb_context.push_back(context);
-  cb_num_input_streams_with_permission_array.push_back(std::vector<uint32_t>(
-      num_input_streams, num_input_streams + CRAS_NUM_CLIENT_TYPE));
-}
-
-class ObserverTest : public testing::Test {
- protected:
-  virtual void SetUp() {
-    int rc;
-
-    ResetStubData();
-    rc = cras_observer_server_init();
-    ASSERT_EQ(0, rc);
-    EXPECT_EQ(17, cras_alert_create_called);
-    EXPECT_EQ(reinterpret_cast<void*>(output_volume_alert),
-              cras_alert_add_callback_map[g_observer->alerts.output_volume]);
-    EXPECT_EQ(reinterpret_cast<void*>(output_mute_alert),
-              cras_alert_add_callback_map[g_observer->alerts.output_mute]);
-    EXPECT_EQ(reinterpret_cast<void*>(capture_gain_alert),
-              cras_alert_add_callback_map[g_observer->alerts.capture_gain]);
-    EXPECT_EQ(reinterpret_cast<void*>(capture_mute_alert),
-              cras_alert_add_callback_map[g_observer->alerts.capture_mute]);
-    EXPECT_EQ(reinterpret_cast<void*>(nodes_alert),
-              cras_alert_add_callback_map[g_observer->alerts.nodes]);
-    EXPECT_EQ(reinterpret_cast<void*>(nodes_prepare),
-              cras_alert_create_prepare_map[g_observer->alerts.nodes]);
-    EXPECT_EQ(reinterpret_cast<void*>(active_node_alert),
-              cras_alert_add_callback_map[g_observer->alerts.active_node]);
-    EXPECT_EQ(CRAS_ALERT_FLAG_KEEP_ALL_DATA,
-              cras_alert_create_flags_map[g_observer->alerts.active_node]);
-    EXPECT_EQ(
-        reinterpret_cast<void*>(output_node_volume_alert),
-        cras_alert_add_callback_map[g_observer->alerts.output_node_volume]);
-    EXPECT_EQ(reinterpret_cast<void*>(node_left_right_swapped_alert),
-              cras_alert_add_callback_map[g_observer->alerts
-                                              .node_left_right_swapped]);
-    EXPECT_EQ(reinterpret_cast<void*>(input_node_gain_alert),
-              cras_alert_add_callback_map[g_observer->alerts.input_node_gain]);
-    EXPECT_EQ(reinterpret_cast<void*>(num_active_streams_alert),
-              cras_alert_add_callback_map
-                  [g_observer->alerts.num_active_streams[CRAS_STREAM_OUTPUT]]);
-    EXPECT_EQ(reinterpret_cast<void*>(num_active_streams_alert),
-              cras_alert_add_callback_map
-                  [g_observer->alerts.num_active_streams[CRAS_STREAM_INPUT]]);
-    EXPECT_EQ(reinterpret_cast<void*>(num_active_streams_alert),
-              cras_alert_add_callback_map[g_observer->alerts.num_active_streams
-                                              [CRAS_STREAM_POST_MIX_PRE_DSP]]);
-    EXPECT_EQ(reinterpret_cast<void*>(suspend_changed_alert),
-              cras_alert_add_callback_map[g_observer->alerts.suspend_changed]);
-    EXPECT_EQ(
-        reinterpret_cast<void*>(hotword_triggered_alert),
-        cras_alert_add_callback_map[g_observer->alerts.hotword_triggered]);
-    EXPECT_EQ(reinterpret_cast<void*>(non_empty_audio_state_changed_alert),
-              cras_alert_add_callback_map[g_observer->alerts
-                                              .non_empty_audio_state_changed]);
-    EXPECT_EQ(
-        reinterpret_cast<void*>(bt_battery_changed_alert),
-        cras_alert_add_callback_map[g_observer->alerts.bt_battery_changed]);
-
-    cras_observer_get_ops(NULL, &ops1_);
-    EXPECT_NE(0, cras_observer_ops_are_empty(&ops1_));
-
-    cras_observer_get_ops(NULL, &ops2_);
-    EXPECT_NE(0, cras_observer_ops_are_empty(&ops2_));
-
-    context1_ = reinterpret_cast<void*>(1);
-    context2_ = reinterpret_cast<void*>(2);
-  }
-
-  virtual void TearDown() {
-    cras_observer_server_free();
-    EXPECT_EQ(17, cras_alert_destroy_called);
-    ResetStubData();
-  }
-
-  void DoObserverAlert(cras_alert_cb alert, void* data) {
-    client1_ = cras_observer_add(&ops1_, context1_);
-    client2_ = cras_observer_add(&ops2_, context2_);
-    ASSERT_NE(client1_, reinterpret_cast<struct cras_observer_client*>(NULL));
-    ASSERT_NE(client2_, reinterpret_cast<struct cras_observer_client*>(NULL));
-
-    ASSERT_NE(alert, reinterpret_cast<cras_alert_cb>(NULL));
-    alert(NULL, data);
-
-    EXPECT_EQ(cb_context[0], context1_);
-    EXPECT_EQ(cb_context[1], context2_);
-  }
-
-  void DoObserverRemoveClear(cras_alert_cb alert, void* data) {
-    ASSERT_NE(alert, reinterpret_cast<cras_alert_cb>(NULL));
-    ASSERT_NE(client1_, reinterpret_cast<struct cras_observer_client*>(NULL));
-    ASSERT_NE(client2_, reinterpret_cast<struct cras_observer_client*>(NULL));
-
-    // Test observer removal.
-    cras_observer_remove(client1_);
-    cb_context.clear();
-    alert(NULL, data);
-    EXPECT_EQ(cb_context[0], context2_);
-    EXPECT_EQ(cb_context.size(), 1);
-
-    // Clear out ops1_.
-    cras_observer_get_ops(NULL, &ops1_);
-    EXPECT_NE(0, cras_observer_ops_are_empty(&ops1_));
-
-    // Get the current value of ops2_ into ops1_.
-    cras_observer_get_ops(client2_, &ops1_);
-    EXPECT_EQ(0, memcmp((void*)&ops1_, (void*)&ops2_, sizeof(ops1_)));
-
-    // Clear out opts for client2.
-    cras_observer_get_ops(NULL, &ops2_);
-    EXPECT_NE(0, cras_observer_ops_are_empty(&ops2_));
-    cras_observer_set_ops(client2_, &ops2_);
-
-    cras_observer_remove(client2_);
-    cb_context.clear();
-    alert(NULL, data);
-    // No callbacks executed.
-    EXPECT_EQ(cb_context.size(), 0);
-  }
-
-  struct cras_observer_client* client1_;
-  struct cras_observer_client* client2_;
-  struct cras_observer_ops ops1_;
-  struct cras_observer_ops ops2_;
-  void* context1_;
-  void* context2_;
-};
-
-TEST_F(ObserverTest, NotifyOutputVolume) {
-  struct cras_observer_alert_data_volume* data;
-  const int32_t volume = 100;
-
-  cras_observer_notify_output_volume(volume);
-  EXPECT_EQ(cras_alert_pending_alert_value, g_observer->alerts.output_volume);
-  ASSERT_EQ(cras_alert_pending_data_size_value, sizeof(*data));
-  ASSERT_NE(cras_alert_pending_data_value, reinterpret_cast<void*>(NULL));
-  data = reinterpret_cast<struct cras_observer_alert_data_volume*>(
-      cras_alert_pending_data_value);
-  EXPECT_EQ(data->volume, volume);
-
-  ops1_.output_volume_changed = cb_output_volume_changed;
-  ops2_.output_volume_changed = cb_output_volume_changed;
-  DoObserverAlert(output_volume_alert, data);
-  ASSERT_EQ(2, cb_output_volume_changed_called);
-  EXPECT_EQ(cb_output_volume_changed_volume[0], volume);
-  EXPECT_EQ(cb_output_volume_changed_volume[1], volume);
-
-  DoObserverRemoveClear(output_volume_alert, data);
-};
-
-TEST_F(ObserverTest, NotifyOutputMute) {
-  struct cras_observer_alert_data_mute* data;
-  const int muted = 1;
-  const int user_muted = 0;
-  const int mute_locked = 0;
-
-  cras_observer_notify_output_mute(muted, user_muted, mute_locked);
-  EXPECT_EQ(cras_alert_pending_alert_value, g_observer->alerts.output_mute);
-  ASSERT_EQ(cras_alert_pending_data_size_value, sizeof(*data));
-  ASSERT_NE(cras_alert_pending_data_value, reinterpret_cast<void*>(NULL));
-  data = reinterpret_cast<struct cras_observer_alert_data_mute*>(
-      cras_alert_pending_data_value);
-  EXPECT_EQ(data->muted, muted);
-  EXPECT_EQ(data->user_muted, user_muted);
-  EXPECT_EQ(data->mute_locked, mute_locked);
-
-  ops1_.output_mute_changed = cb_output_mute_changed;
-  ops2_.output_mute_changed = cb_output_mute_changed;
-  DoObserverAlert(output_mute_alert, data);
-  ASSERT_EQ(2, cb_output_mute_changed_called);
-  EXPECT_EQ(cb_output_mute_changed_muted[0], muted);
-  EXPECT_EQ(cb_output_mute_changed_muted[1], muted);
-  EXPECT_EQ(cb_output_mute_changed_user_muted[0], user_muted);
-  EXPECT_EQ(cb_output_mute_changed_user_muted[1], user_muted);
-  EXPECT_EQ(cb_output_mute_changed_mute_locked[0], mute_locked);
-  EXPECT_EQ(cb_output_mute_changed_mute_locked[1], mute_locked);
-
-  DoObserverRemoveClear(output_mute_alert, data);
-};
-
-TEST_F(ObserverTest, NotifyCaptureGain) {
-  struct cras_observer_alert_data_volume* data;
-  const int32_t gain = -20;
-
-  cras_observer_notify_capture_gain(gain);
-  EXPECT_EQ(cras_alert_pending_alert_value, g_observer->alerts.capture_gain);
-  ASSERT_EQ(cras_alert_pending_data_size_value, sizeof(*data));
-  ASSERT_NE(cras_alert_pending_data_value, reinterpret_cast<void*>(NULL));
-  data = reinterpret_cast<struct cras_observer_alert_data_volume*>(
-      cras_alert_pending_data_value);
-  EXPECT_EQ(data->volume, gain);
-
-  ops1_.capture_gain_changed = cb_capture_gain_changed;
-  ops2_.capture_gain_changed = cb_capture_gain_changed;
-  DoObserverAlert(capture_gain_alert, data);
-  ASSERT_EQ(2, cb_capture_gain_changed_called);
-  EXPECT_EQ(cb_capture_gain_changed_gain[0], gain);
-  EXPECT_EQ(cb_capture_gain_changed_gain[1], gain);
-
-  DoObserverRemoveClear(capture_gain_alert, data);
-};
-
-TEST_F(ObserverTest, NotifyCaptureMute) {
-  struct cras_observer_alert_data_mute* data;
-  const int muted = 1;
-  const int mute_locked = 0;
-
-  cras_observer_notify_capture_mute(muted, mute_locked);
-  EXPECT_EQ(cras_alert_pending_alert_value, g_observer->alerts.capture_mute);
-  ASSERT_EQ(cras_alert_pending_data_size_value, sizeof(*data));
-  ASSERT_NE(cras_alert_pending_data_value, reinterpret_cast<void*>(NULL));
-  data = reinterpret_cast<struct cras_observer_alert_data_mute*>(
-      cras_alert_pending_data_value);
-  EXPECT_EQ(data->muted, muted);
-  EXPECT_EQ(data->mute_locked, mute_locked);
-
-  ops1_.capture_mute_changed = cb_capture_mute_changed;
-  ops2_.capture_mute_changed = cb_capture_mute_changed;
-  DoObserverAlert(capture_mute_alert, data);
-  ASSERT_EQ(2, cb_capture_mute_changed_called);
-  EXPECT_EQ(cb_capture_mute_changed_muted[0], muted);
-  EXPECT_EQ(cb_capture_mute_changed_muted[1], muted);
-  EXPECT_EQ(cb_capture_mute_changed_mute_locked[0], mute_locked);
-  EXPECT_EQ(cb_capture_mute_changed_mute_locked[1], mute_locked);
-
-  DoObserverRemoveClear(capture_mute_alert, data);
-};
-
-TEST_F(ObserverTest, NotifyNodes) {
-  cras_observer_notify_nodes();
-  EXPECT_EQ(cras_alert_pending_alert_value, g_observer->alerts.nodes);
-
-  ops1_.nodes_changed = cb_nodes_changed;
-  ops2_.nodes_changed = cb_nodes_changed;
-  DoObserverAlert(nodes_alert, NULL);
-  ASSERT_EQ(2, cb_nodes_changed_called);
-
-  DoObserverRemoveClear(nodes_alert, NULL);
-};
-
-TEST_F(ObserverTest, NotifyActiveNode) {
-  struct cras_observer_alert_data_active_node* data;
-  const enum CRAS_STREAM_DIRECTION dir = CRAS_STREAM_INPUT;
-  const cras_node_id_t node_id = 0x0001000100020002;
-
-  cras_observer_notify_active_node(dir, node_id);
-  EXPECT_EQ(cras_alert_pending_alert_value, g_observer->alerts.active_node);
-  ASSERT_EQ(cras_alert_pending_data_size_value, sizeof(*data));
-  ASSERT_NE(cras_alert_pending_data_value, reinterpret_cast<void*>(NULL));
-  data = reinterpret_cast<struct cras_observer_alert_data_active_node*>(
-      cras_alert_pending_data_value);
-  EXPECT_EQ(data->node_id, node_id);
-  EXPECT_EQ(data->direction, dir);
-
-  ops1_.active_node_changed = cb_active_node_changed;
-  ops2_.active_node_changed = cb_active_node_changed;
-  DoObserverAlert(active_node_alert, data);
-  ASSERT_EQ(2, cb_active_node_changed_called);
-  EXPECT_EQ(cb_active_node_changed_dir[0], dir);
-  EXPECT_EQ(cb_active_node_changed_dir[1], dir);
-  EXPECT_EQ(cb_active_node_changed_node_id[0], node_id);
-  EXPECT_EQ(cb_active_node_changed_node_id[1], node_id);
-
-  DoObserverRemoveClear(active_node_alert, data);
-};
-
-TEST_F(ObserverTest, NotifyOutputNodeVolume) {
-  struct cras_observer_alert_data_node_volume* data;
-  const cras_node_id_t node_id = 0x0001000100020002;
-  const int32_t volume = 100;
-
-  cras_observer_notify_output_node_volume(node_id, volume);
-  EXPECT_EQ(cras_alert_pending_alert_value,
-            g_observer->alerts.output_node_volume);
-  ASSERT_EQ(cras_alert_pending_data_size_value, sizeof(*data));
-  ASSERT_NE(cras_alert_pending_data_value, reinterpret_cast<void*>(NULL));
-  data = reinterpret_cast<struct cras_observer_alert_data_node_volume*>(
-      cras_alert_pending_data_value);
-  EXPECT_EQ(data->node_id, node_id);
-  EXPECT_EQ(data->volume, volume);
-
-  ops1_.output_node_volume_changed = cb_output_node_volume_changed;
-  ops2_.output_node_volume_changed = cb_output_node_volume_changed;
-  DoObserverAlert(output_node_volume_alert, data);
-  ASSERT_EQ(2, cb_output_node_volume_changed_called);
-  EXPECT_EQ(cb_output_node_volume_changed_volume[0], volume);
-  EXPECT_EQ(cb_output_node_volume_changed_volume[1], volume);
-  EXPECT_EQ(cb_output_node_volume_changed_node_id[0], node_id);
-  EXPECT_EQ(cb_output_node_volume_changed_node_id[1], node_id);
-
-  DoObserverRemoveClear(output_node_volume_alert, data);
-};
-
-TEST_F(ObserverTest, NotifyNodeLeftRightSwapped) {
-  struct cras_observer_alert_data_node_lr_swapped* data;
-  const cras_node_id_t node_id = 0x0001000100020002;
-  const int swapped = 1;
-
-  cras_observer_notify_node_left_right_swapped(node_id, swapped);
-  EXPECT_EQ(cras_alert_pending_alert_value,
-            g_observer->alerts.node_left_right_swapped);
-  ASSERT_EQ(cras_alert_pending_data_size_value, sizeof(*data));
-  ASSERT_NE(cras_alert_pending_data_value, reinterpret_cast<void*>(NULL));
-  data = reinterpret_cast<struct cras_observer_alert_data_node_lr_swapped*>(
-      cras_alert_pending_data_value);
-  EXPECT_EQ(data->node_id, node_id);
-  EXPECT_EQ(data->swapped, swapped);
-
-  ops1_.node_left_right_swapped_changed = cb_node_left_right_swapped_changed;
-  ops2_.node_left_right_swapped_changed = cb_node_left_right_swapped_changed;
-  DoObserverAlert(node_left_right_swapped_alert, data);
-  ASSERT_EQ(2, cb_node_left_right_swapped_changed_called);
-  EXPECT_EQ(cb_node_left_right_swapped_changed_swapped[0], swapped);
-  EXPECT_EQ(cb_node_left_right_swapped_changed_swapped[1], swapped);
-  EXPECT_EQ(cb_node_left_right_swapped_changed_node_id[0], node_id);
-  EXPECT_EQ(cb_node_left_right_swapped_changed_node_id[1], node_id);
-
-  DoObserverRemoveClear(node_left_right_swapped_alert, data);
-};
-
-TEST_F(ObserverTest, NotifyInputNodeGain) {
-  struct cras_observer_alert_data_node_volume* data;
-  const cras_node_id_t node_id = 0x0001000100020002;
-  const int32_t gain = -20;
-
-  cras_observer_notify_input_node_gain(node_id, gain);
-  EXPECT_EQ(cras_alert_pending_alert_value, g_observer->alerts.input_node_gain);
-  ASSERT_EQ(cras_alert_pending_data_size_value, sizeof(*data));
-  ASSERT_NE(cras_alert_pending_data_value, reinterpret_cast<void*>(NULL));
-  data = reinterpret_cast<struct cras_observer_alert_data_node_volume*>(
-      cras_alert_pending_data_value);
-  EXPECT_EQ(data->node_id, node_id);
-  EXPECT_EQ(data->volume, gain);
-
-  ops1_.input_node_gain_changed = cb_input_node_gain_changed;
-  ops2_.input_node_gain_changed = cb_input_node_gain_changed;
-  DoObserverAlert(input_node_gain_alert, data);
-  ASSERT_EQ(2, cb_input_node_gain_changed_called);
-  EXPECT_EQ(cb_input_node_gain_changed_gain[0], gain);
-  EXPECT_EQ(cb_input_node_gain_changed_gain[1], gain);
-  EXPECT_EQ(cb_input_node_gain_changed_node_id[0], node_id);
-  EXPECT_EQ(cb_input_node_gain_changed_node_id[1], node_id);
-
-  DoObserverRemoveClear(input_node_gain_alert, data);
-};
-
-TEST_F(ObserverTest, NotifySuspendChanged) {
-  struct cras_observer_alert_data_suspend* data;
-
-  cras_observer_notify_suspend_changed(1);
-  EXPECT_EQ(cras_alert_pending_alert_value, g_observer->alerts.suspend_changed);
-  ASSERT_EQ(cras_alert_pending_data_size_value, sizeof(*data));
-  ASSERT_NE(cras_alert_pending_data_value, reinterpret_cast<void*>(NULL));
-  data = reinterpret_cast<struct cras_observer_alert_data_suspend*>(
-      cras_alert_pending_data_value);
-  EXPECT_EQ(data->suspended, 1);
-
-  cras_observer_notify_suspend_changed(0);
-  EXPECT_EQ(cras_alert_pending_alert_value, g_observer->alerts.suspend_changed);
-  ASSERT_EQ(cras_alert_pending_data_size_value, sizeof(*data));
-  ASSERT_NE(cras_alert_pending_data_value, reinterpret_cast<void*>(NULL));
-  data = reinterpret_cast<struct cras_observer_alert_data_suspend*>(
-      cras_alert_pending_data_value);
-  EXPECT_EQ(data->suspended, 0);
-}
-
-TEST_F(ObserverTest, NotifyNumActiveStreams) {
-  struct cras_observer_alert_data_streams* data;
-  const enum CRAS_STREAM_DIRECTION dir = CRAS_STREAM_INPUT;
-  const uint32_t active_streams = 10;
-
-  cras_observer_notify_num_active_streams(dir, active_streams);
-  EXPECT_EQ(cras_alert_pending_alert_value,
-            g_observer->alerts.num_active_streams[CRAS_STREAM_INPUT]);
-  ASSERT_EQ(cras_alert_pending_data_size_value, sizeof(*data));
-  ASSERT_NE(cras_alert_pending_data_value, reinterpret_cast<void*>(NULL));
-  data = reinterpret_cast<struct cras_observer_alert_data_streams*>(
-      cras_alert_pending_data_value);
-  EXPECT_EQ(data->num_active_streams, active_streams);
-  EXPECT_EQ(data->direction, dir);
-
-  ops1_.num_active_streams_changed = cb_num_active_streams_changed;
-  ops2_.num_active_streams_changed = cb_num_active_streams_changed;
-  DoObserverAlert(num_active_streams_alert, data);
-  ASSERT_EQ(2, cb_num_active_streams_changed_called);
-  EXPECT_EQ(cb_num_active_streams_changed_dir[0], dir);
-  EXPECT_EQ(cb_num_active_streams_changed_dir[1], dir);
-  EXPECT_EQ(cb_num_active_streams_changed_num[0], active_streams);
-  EXPECT_EQ(cb_num_active_streams_changed_num[1], active_streams);
-
-  DoObserverRemoveClear(num_active_streams_alert, data);
-};
-
-TEST_F(ObserverTest, NotifyNumInputStreamsWithPermission) {
-  struct cras_observer_alert_data_input_streams* data;
-  uint32_t num_input_streams[CRAS_NUM_CLIENT_TYPE] = {};
-  for (unsigned type = 0; type < CRAS_NUM_CLIENT_TYPE; ++type) {
-    num_input_streams[type] = (uint32_t)type;
-  }
-
-  cras_observer_notify_input_streams_with_permission(num_input_streams);
-  ASSERT_EQ(cras_alert_pending_data_size_value, sizeof(*data));
-  ASSERT_NE(cras_alert_pending_data_value, reinterpret_cast<void*>(NULL));
-  data = reinterpret_cast<struct cras_observer_alert_data_input_streams*>(
-      cras_alert_pending_data_value);
-  for (unsigned type = 0; type < CRAS_NUM_CLIENT_TYPE; ++type) {
-    EXPECT_EQ(data->num_input_streams[type], num_input_streams[type]);
-  }
-
-  ops1_.num_input_streams_with_permission_changed =
-      cb_num_input_streams_with_permission_changed;
-  ops2_.num_input_streams_with_permission_changed =
-      cb_num_input_streams_with_permission_changed;
-  DoObserverAlert(num_input_streams_with_permission_alert, data);
-  ASSERT_EQ(2, cb_num_input_streams_with_permission_called);
-  for (auto cb_num_input_streams : cb_num_input_streams_with_permission_array) {
-    ASSERT_EQ(cb_num_input_streams.size(), (size_t)CRAS_NUM_CLIENT_TYPE);
-    for (unsigned type = 0; type < CRAS_NUM_CLIENT_TYPE; ++type) {
-      EXPECT_EQ(cb_num_input_streams[type], num_input_streams[type]);
-    }
-  }
-  DoObserverRemoveClear(num_input_streams_with_permission_alert, data);
-}
-
-TEST_F(ObserverTest, NotifyHotwordTriggered) {
-  struct cras_observer_alert_data_hotword_triggered* data;
-
-  cras_observer_notify_hotword_triggered(100, 200);
-  EXPECT_EQ(cras_alert_pending_alert_value,
-            g_observer->alerts.hotword_triggered);
-  ASSERT_EQ(cras_alert_pending_data_size_value, sizeof(*data));
-  ASSERT_NE(cras_alert_pending_data_value, reinterpret_cast<void*>(NULL));
-  data = reinterpret_cast<struct cras_observer_alert_data_hotword_triggered*>(
-      cras_alert_pending_data_value);
-  EXPECT_EQ(data->tv_sec, 100);
-  EXPECT_EQ(data->tv_nsec, 200);
-}
-
-TEST_F(ObserverTest, NonEmpyAudioStateChanged) {
-  struct cras_observer_non_empty_audio_state* data;
-
-  cras_observer_notify_non_empty_audio_state_changed(1);
-  EXPECT_EQ(cras_alert_pending_alert_value,
-            g_observer->alerts.non_empty_audio_state_changed);
-  ASSERT_EQ(cras_alert_pending_data_size_value, sizeof(*data));
-  ASSERT_NE(cras_alert_pending_data_value, reinterpret_cast<void*>(NULL));
-  data = reinterpret_cast<struct cras_observer_non_empty_audio_state*>(
-      cras_alert_pending_data_value);
-  EXPECT_EQ(data->non_empty, 1);
-}
-
-TEST_F(ObserverTest, BluetoothBatteryChanged) {
-  struct cras_observer_alert_data_bt_battery_changed* data;
-  const char* address = "test";
-
-  cras_observer_notify_bt_battery_changed(address, 30);
-  EXPECT_EQ(cras_alert_pending_alert_value,
-            g_observer->alerts.bt_battery_changed);
-  ASSERT_EQ(cras_alert_pending_data_size_value, sizeof(*data));
-  ASSERT_NE(cras_alert_pending_data_value, reinterpret_cast<void*>(NULL));
-  data = reinterpret_cast<struct cras_observer_alert_data_bt_battery_changed*>(
-      cras_alert_pending_data_value);
-  EXPECT_EQ(data->address, address);
-  EXPECT_EQ(data->level, 30);
-}
-
-// Stubs
-extern "C" {
-
-void cras_alert_destroy(struct cras_alert* alert) {
-  cras_alert_destroy_called++;
-}
-
-struct cras_alert* cras_alert_create(cras_alert_prepare prepare,
-                                     unsigned int flags) {
-  struct cras_alert* alert = NULL;
-
-  cras_alert_create_called++;
-  alert = reinterpret_cast<struct cras_alert*>(cras_alert_create_called);
-  cras_alert_create_return_values.push_back(alert);
-  cras_alert_create_flags_map[alert] = flags;
-  cras_alert_create_prepare_map[alert] = reinterpret_cast<void*>(prepare);
-  return alert;
-}
-
-int cras_alert_add_callback(struct cras_alert* alert,
-                            cras_alert_cb cb,
-                            void* arg) {
-  cras_alert_add_callback_map[alert] = reinterpret_cast<void*>(cb);
-  return 0;
-}
-
-void cras_alert_pending(struct cras_alert* alert) {
-  cras_alert_pending_alert_value = alert;
-}
-
-void cras_alert_pending_data(struct cras_alert* alert,
-                             void* data,
-                             size_t data_size) {
-  cras_alert_pending_alert_value = alert;
-  cras_alert_pending_data_size_value = data_size;
-  if (cras_alert_pending_data_value)
-    free(cras_alert_pending_data_value);
-  if (data) {
-    cras_alert_pending_data_value = malloc(data_size);
-    memcpy(cras_alert_pending_data_value, data, data_size);
-  } else
-    cras_alert_pending_data_value = NULL;
-}
-
-void cras_iodev_list_update_device_list() {
-  cras_iodev_list_update_device_list_called++;
-}
-
-}  // extern "C"
-
-}  // namespace
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  openlog(NULL, LOG_PERROR, LOG_USER);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tests/playback_rclient_unittest.cc b/cras/src/tests/playback_rclient_unittest.cc
deleted file mode 100644
index 31ceda7..0000000
--- a/cras/src/tests/playback_rclient_unittest.cc
+++ /dev/null
@@ -1,308 +0,0 @@
-// Copyright 2019 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <gtest/gtest.h>
-#include <stdio.h>
-#include <unistd.h>
-
-extern "C" {
-#include "audio_thread.h"
-#include "cras_bt_log.h"
-#include "cras_messages.h"
-#include "cras_rclient.h"
-#include "cras_rstream.h"
-#include "cras_system_state.h"
-
-// Access to data structures and static functions.
-#include "cras_playback_rclient.c"
-#include "cras_rclient_util.c"
-}
-static bool audio_format_valid;
-static unsigned int cras_make_fd_nonblocking_called;
-static unsigned int cras_observer_remove_called;
-static int stream_list_add_called;
-static int stream_list_add_return;
-static unsigned int stream_list_rm_called;
-static struct cras_audio_shm mock_shm;
-static struct cras_rstream mock_rstream;
-
-void ResetStubData() {
-  audio_format_valid = true;
-  cras_make_fd_nonblocking_called = 0;
-  cras_observer_remove_called = 0;
-  stream_list_add_called = 0;
-  stream_list_add_return = 0;
-  stream_list_rm_called = 0;
-}
-
-namespace {
-
-TEST(RClientSuite, CreateSendMessage) {
-  struct cras_rclient* rclient;
-  int rc;
-  struct cras_client_connected msg;
-  int pipe_fds[2];
-
-  ResetStubData();
-
-  rc = pipe(pipe_fds);
-  ASSERT_EQ(0, rc);
-
-  rclient = cras_playback_rclient_create(pipe_fds[1], 800);
-  ASSERT_NE((void*)NULL, rclient);
-  EXPECT_EQ(800, rclient->id);
-
-  rc = read(pipe_fds[0], &msg, sizeof(msg));
-  EXPECT_EQ(sizeof(msg), rc);
-  EXPECT_EQ(CRAS_CLIENT_CONNECTED, msg.header.id);
-
-  rclient->ops->destroy(rclient);
-  EXPECT_EQ(1, cras_observer_remove_called);
-  close(pipe_fds[0]);
-  close(pipe_fds[1]);
-}
-
-class CPRMessageSuite : public testing::Test {
- protected:
-  virtual void SetUp() {
-    int rc;
-    struct cras_client_connected msg;
-
-    rc = pipe(pipe_fds_);
-    if (rc < 0)
-      return;
-
-    rclient_ = cras_playback_rclient_create(pipe_fds_[1], 1);
-    rc = read(pipe_fds_[0], &msg, sizeof(msg));
-    if (rc < 0)
-      return;
-
-    fmt = {
-        .format = SND_PCM_FORMAT_S16_LE,
-        .frame_rate = 48000,
-        .num_channels = 2,
-    };
-    cras_audio_format_set_default_channel_layout(&fmt);
-    ResetStubData();
-  }
-
-  virtual void TearDown() {
-    rclient_->ops->destroy(rclient_);
-    close(pipe_fds_[0]);
-    close(pipe_fds_[1]);
-  }
-
-  struct cras_rclient* rclient_;
-  struct cras_audio_format fmt;
-  int pipe_fds_[2];
-  int fd_;
-};
-
-TEST_F(CPRMessageSuite, StreamConnectMessage) {
-  struct cras_client_stream_connected out_msg;
-  int rc;
-
-  struct cras_connect_message msg;
-  cras_stream_id_t stream_id = 0x10002;
-  cras_fill_connect_message(&msg, CRAS_STREAM_OUTPUT, stream_id,
-                            CRAS_STREAM_TYPE_DEFAULT, CRAS_CLIENT_TYPE_UNKNOWN,
-                            480, 240, /*flags=*/0, /*effects=*/0, fmt,
-                            NO_DEVICE);
-  ASSERT_EQ(stream_id, msg.stream_id);
-
-  fd_ = 100;
-  rclient_->ops->handle_message_from_client(rclient_, &msg.header, &fd_, 1);
-  EXPECT_EQ(1, cras_make_fd_nonblocking_called);
-  EXPECT_EQ(1, stream_list_add_called);
-  EXPECT_EQ(0, stream_list_rm_called);
-
-  rc = read(pipe_fds_[0], &out_msg, sizeof(out_msg));
-  EXPECT_EQ(sizeof(out_msg), rc);
-  EXPECT_EQ(stream_id, out_msg.stream_id);
-}
-
-TEST_F(CPRMessageSuite, StreamConnectMessageInvalidDirection) {
-  struct cras_client_stream_connected out_msg;
-  int rc;
-
-  struct cras_connect_message msg;
-  cras_stream_id_t stream_id = 0x10002;
-
-  for (int i = 0; i < CRAS_NUM_DIRECTIONS; i++) {
-    const auto dir = static_cast<CRAS_STREAM_DIRECTION>(i);
-    if (dir == CRAS_STREAM_OUTPUT)
-      continue;
-    cras_fill_connect_message(&msg, dir, stream_id, CRAS_STREAM_TYPE_DEFAULT,
-                              CRAS_CLIENT_TYPE_UNKNOWN, 480, 240, /*flags=*/0,
-                              /*effects=*/0, fmt, NO_DEVICE);
-    ASSERT_EQ(stream_id, msg.stream_id);
-
-    fd_ = 100;
-    rc = rclient_->ops->handle_message_from_client(rclient_, &msg.header, &fd_,
-                                                   1);
-    EXPECT_EQ(0, rc);
-    EXPECT_EQ(0, cras_make_fd_nonblocking_called);
-    EXPECT_EQ(0, stream_list_add_called);
-    EXPECT_EQ(0, stream_list_rm_called);
-
-    rc = read(pipe_fds_[0], &out_msg, sizeof(out_msg));
-    EXPECT_EQ(sizeof(out_msg), rc);
-    EXPECT_EQ(-EINVAL, out_msg.err);
-    EXPECT_EQ(stream_id, out_msg.stream_id);
-  }
-}
-
-TEST_F(CPRMessageSuite, StreamConnectMessageInvalidClientId) {
-  struct cras_client_stream_connected out_msg;
-  int rc;
-
-  struct cras_connect_message msg;
-  cras_stream_id_t stream_id = 0x20002;  // stream_id with invalid client_id
-  cras_fill_connect_message(&msg, CRAS_STREAM_OUTPUT, stream_id,
-                            CRAS_STREAM_TYPE_DEFAULT, CRAS_CLIENT_TYPE_UNKNOWN,
-                            480, 240, /*flags=*/0, /*effects=*/0, fmt,
-                            NO_DEVICE);
-  ASSERT_EQ(stream_id, msg.stream_id);
-
-  fd_ = 100;
-  rc =
-      rclient_->ops->handle_message_from_client(rclient_, &msg.header, &fd_, 1);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(0, cras_make_fd_nonblocking_called);
-  EXPECT_EQ(0, stream_list_add_called);
-  EXPECT_EQ(0, stream_list_rm_called);
-
-  rc = read(pipe_fds_[0], &out_msg, sizeof(out_msg));
-  EXPECT_EQ(sizeof(out_msg), rc);
-  EXPECT_EQ(-EINVAL, out_msg.err);
-  EXPECT_EQ(stream_id, out_msg.stream_id);
-}
-
-TEST_F(CPRMessageSuite, StreamConnectMessageInvalidAudioFormat) {
-  struct cras_client_stream_connected out_msg;
-  int rc;
-
-  struct cras_connect_message msg;
-  cras_stream_id_t stream_id = 0x10002;
-  cras_fill_connect_message(&msg, CRAS_STREAM_OUTPUT, stream_id,
-                            CRAS_STREAM_TYPE_DEFAULT, CRAS_CLIENT_TYPE_UNKNOWN,
-                            480, 240, /*flags=*/0, /*effects=*/0, fmt,
-                            NO_DEVICE);
-  ASSERT_EQ(stream_id, msg.stream_id);
-
-  audio_format_valid = false;  // stubs out verification failure.
-
-  fd_ = 100;
-  rc =
-      rclient_->ops->handle_message_from_client(rclient_, &msg.header, &fd_, 1);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(0, cras_make_fd_nonblocking_called);
-  EXPECT_EQ(0, stream_list_add_called);
-  EXPECT_EQ(0, stream_list_rm_called);
-
-  rc = read(pipe_fds_[0], &out_msg, sizeof(out_msg));
-  EXPECT_EQ(sizeof(out_msg), rc);
-  EXPECT_EQ(-EINVAL, out_msg.err);
-  EXPECT_EQ(stream_id, out_msg.stream_id);
-}
-
-TEST_F(CPRMessageSuite, StreamDisconnectMessage) {
-  struct cras_disconnect_stream_message msg;
-  cras_stream_id_t stream_id = 0x10002;
-  cras_fill_disconnect_stream_message(&msg, stream_id);
-
-  rclient_->ops->handle_message_from_client(rclient_, &msg.header, NULL, 0);
-  EXPECT_EQ(0, stream_list_add_called);
-  EXPECT_EQ(1, stream_list_rm_called);
-}
-
-TEST_F(CPRMessageSuite, StreamDisconnectMessageInvalidClientId) {
-  struct cras_disconnect_stream_message msg;
-  cras_stream_id_t stream_id = 0x20002;  // stream_id with invalid client_id
-  cras_fill_disconnect_stream_message(&msg, stream_id);
-
-  rclient_->ops->handle_message_from_client(rclient_, &msg.header, NULL, 0);
-  EXPECT_EQ(0, stream_list_add_called);
-  EXPECT_EQ(0, stream_list_rm_called);
-}
-}  // namespace
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
-
-/* stubs */
-extern "C" {
-
-struct stream_list* cras_iodev_list_get_stream_list() {
-  return NULL;
-}
-
-int cras_make_fd_nonblocking(int fd) {
-  cras_make_fd_nonblocking_called++;
-  return 0;
-}
-
-void cras_observer_remove(struct cras_observer_client* client) {
-  cras_observer_remove_called++;
-}
-
-unsigned int cras_rstream_get_effects(const struct cras_rstream* stream) {
-  return 0;
-}
-
-int cras_send_with_fds(int sockfd,
-                       const void* buf,
-                       size_t len,
-                       int* fd,
-                       unsigned int num_fds) {
-  return write(sockfd, buf, len);
-}
-
-key_t cras_sys_state_shm_fd() {
-  return 1;
-}
-
-void cras_system_set_suspended(int suspended) {}
-
-int stream_list_rm_all_client_streams(struct stream_list* list,
-                                      struct cras_rclient* rclient) {
-  return 0;
-}
-
-int stream_list_rm(struct stream_list* list, cras_stream_id_t id) {
-  stream_list_rm_called++;
-  return 0;
-}
-
-int stream_list_add(struct stream_list* list,
-                    struct cras_rstream_config* config,
-                    struct cras_rstream** stream) {
-  int ret;
-
-  *stream = &mock_rstream;
-
-  stream_list_add_called++;
-  ret = stream_list_add_return;
-  if (ret)
-    stream_list_add_return = -EINVAL;
-
-  mock_rstream.shm = &mock_shm;
-  mock_rstream.direction = config->direction;
-  mock_rstream.stream_id = config->stream_id;
-
-  return ret;
-}
-
-bool cras_audio_format_valid(const struct cras_audio_format* fmt) {
-  return audio_format_valid;
-}
-
-void detect_rtc_stream_pair(struct stream_list* list,
-                            struct cras_rstream* stream) {
-  return;
-}
-
-}  // extern "C"
diff --git a/cras/src/tests/polled_interval_checker_unittest.cc b/cras/src/tests/polled_interval_checker_unittest.cc
deleted file mode 100644
index a4aff09..0000000
--- a/cras/src/tests/polled_interval_checker_unittest.cc
+++ /dev/null
@@ -1,155 +0,0 @@
-// Copyright 2018 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <gtest/gtest.h>
-#include <stdio.h>
-
-extern "C" {
-#include "polled_interval_checker.h"
-}
-
-static const int INTERVAL_DURATION = 5;
-
-static struct timespec time_now;
-
-static struct polled_interval* create_interval() {
-  struct polled_interval* interval =
-      pic_polled_interval_create(INTERVAL_DURATION);
-  EXPECT_NE(interval, static_cast<struct polled_interval*>(NULL));
-  return interval;
-}
-
-TEST(PolledIntervalCheckerTest, CreateDestroy) {
-  // Create an interval, checks it is non-null.
-  struct polled_interval* interval = create_interval();
-
-  pic_polled_interval_destroy(&interval);
-
-  // Check it's been set to null.
-  EXPECT_EQ(interval, static_cast<struct polled_interval*>(NULL));
-}
-
-TEST(PolledIntervalCheckerTest, BasicFlow) {
-  // Set initial time.
-  time_now.tv_sec = 1000;
-  time_now.tv_nsec = 0;
-  pic_update_current_time();
-
-  // Create interval starting at initial time.
-  struct polled_interval* interval = create_interval();
-
-  // Check it hasn't elapsed.
-  EXPECT_FALSE(pic_interval_elapsed(interval));
-
-  // Increment time by less than the interval duration.
-  time_now.tv_sec += INTERVAL_DURATION / 2;
-  pic_update_current_time();
-
-  // Check the interval hasn't elapsed yet.
-  EXPECT_FALSE(pic_interval_elapsed(interval));
-
-  // Increment time past the duration of the interval.
-  time_now.tv_sec += INTERVAL_DURATION;
-
-  // We haven't updated the current time, check the interval hasn't
-  // elapsed (that it isn't calling clock_gettime without us asking it to).
-  EXPECT_FALSE(pic_interval_elapsed(interval));
-
-  // Update time, check the interval has elapsed.
-  pic_update_current_time();
-  EXPECT_TRUE(pic_interval_elapsed(interval));
-  pic_polled_interval_destroy(&interval);
-}
-
-TEST(PolledIntervalCheckerTest, DoesNotResetAutomatically) {
-  // Set initial time.
-  time_now.tv_sec = 1000;
-  time_now.tv_nsec = 0;
-  pic_update_current_time();
-
-  struct polled_interval* interval = create_interval();
-
-  // Initial check.
-  EXPECT_FALSE(pic_interval_elapsed(interval));
-
-  // Increment time so the interval elapses.
-  time_now.tv_sec += INTERVAL_DURATION;
-  pic_update_current_time();
-
-  // Check the interval has elapsed.
-  EXPECT_TRUE(pic_interval_elapsed(interval));
-
-  // Increment time further.
-  time_now.tv_sec += INTERVAL_DURATION * 2;
-  pic_update_current_time();
-
-  // Check the interval has still elapsed.
-  EXPECT_TRUE(pic_interval_elapsed(interval));
-
-  // Check repeated calls return true.
-  EXPECT_TRUE(pic_interval_elapsed(interval));
-  pic_polled_interval_destroy(&interval);
-}
-
-TEST(PolledIntervalCheckerTest, Reset) {
-  // Set initial time.
-  time_now.tv_sec = 1000;
-  time_now.tv_nsec = 0;
-  pic_update_current_time();
-
-  struct polled_interval* interval = create_interval();
-
-  // Initial check.
-  EXPECT_FALSE(pic_interval_elapsed(interval));
-
-  // Increment time so the interval elapses.
-  time_now.tv_sec += INTERVAL_DURATION;
-  pic_update_current_time();
-
-  // Check the interval has elapsed.
-  EXPECT_TRUE(pic_interval_elapsed(interval));
-
-  // Increment time further.
-  time_now.tv_sec += INTERVAL_DURATION * 2;
-  pic_update_current_time();
-
-  // Check the interval has still elapsed.
-  EXPECT_TRUE(pic_interval_elapsed(interval));
-
-  // Reset the interval.
-  pic_interval_reset(interval);
-
-  // Check it's been reset.
-  EXPECT_FALSE(pic_interval_elapsed(interval));
-
-  // Increment time to just before it should elapse again.
-  time_now.tv_sec += INTERVAL_DURATION - 1;
-  pic_update_current_time();
-
-  // Check it still has not elapsed.
-  EXPECT_FALSE(pic_interval_elapsed(interval));
-
-  // Increment time to one duration after we reset it.
-  time_now.tv_sec += 1;
-  pic_update_current_time();
-
-  // Check the interval has elapsed now.
-  EXPECT_TRUE(pic_interval_elapsed(interval));
-  pic_polled_interval_destroy(&interval);
-}
-
-/* Stubs */
-extern "C" {
-
-int clock_gettime(clockid_t clk_id, struct timespec* tp) {
-  *tp = time_now;
-  return 0;
-}
-
-}  // extern "C"
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tests/ramp_unittest.cc b/cras/src/tests/ramp_unittest.cc
deleted file mode 100644
index a661dff..0000000
--- a/cras/src/tests/ramp_unittest.cc
+++ /dev/null
@@ -1,513 +0,0 @@
-// Copyright 2016 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <gtest/gtest.h>
-#include <stdio.h>
-
-extern "C" {
-#include "cras_ramp.c"
-}
-
-static int callback_called;
-static void* callback_arg;
-
-void ResetStubData() {
-  callback_called = 0;
-  callback_arg = NULL;
-}
-
-namespace {
-
-TEST(RampTestSuite, Init) {
-  struct cras_ramp* ramp;
-  struct cras_ramp_action action;
-
-  ResetStubData();
-
-  ramp = cras_ramp_create();
-  action = cras_ramp_get_current_action(ramp);
-
-  EXPECT_EQ(action.type, CRAS_RAMP_ACTION_NONE);
-  EXPECT_FLOAT_EQ(1.0, action.scaler);
-  EXPECT_FLOAT_EQ(0.0, action.increment);
-  EXPECT_FLOAT_EQ(1.0, action.target);
-
-  cras_ramp_destroy(ramp);
-}
-
-TEST(RampTestSuite, RampUpInitialIncrement) {
-  float from = 0.0;
-  float to = 1.0;
-  int duration_frames = 48000;
-  float increment = 1.0 / 48000;
-  cras_ramp* ramp;
-  cras_ramp_action action;
-
-  ResetStubData();
-
-  ramp = cras_ramp_create();
-  cras_mute_ramp_start(ramp, from, to, duration_frames, NULL, NULL);
-
-  action = cras_ramp_get_current_action(ramp);
-
-  EXPECT_EQ(CRAS_RAMP_ACTION_PARTIAL, action.type);
-  EXPECT_FLOAT_EQ(0.0, action.scaler);
-  EXPECT_FLOAT_EQ(increment, action.increment);
-  EXPECT_FLOAT_EQ(to, action.target);
-
-  cras_ramp_destroy(ramp);
-}
-
-TEST(RampTestSuite, RampUpUpdateRampedFrames) {
-  float from = 0.0;
-  float to = 1.0;
-  int duration_frames = 48000;
-  float increment = 1.0 / 48000;
-  int rc;
-  int ramped_frames = 512;
-  struct cras_ramp* ramp;
-  struct cras_ramp_action action;
-  float scaler = increment * ramped_frames;
-
-  ResetStubData();
-
-  ramp = cras_ramp_create();
-  cras_mute_ramp_start(ramp, from, to, duration_frames, NULL, NULL);
-
-  rc = cras_ramp_update_ramped_frames(ramp, ramped_frames);
-
-  action = cras_ramp_get_current_action(ramp);
-
-  EXPECT_EQ(rc, 0);
-  EXPECT_EQ(CRAS_RAMP_ACTION_PARTIAL, action.type);
-  EXPECT_FLOAT_EQ(scaler, action.scaler);
-  EXPECT_FLOAT_EQ(increment, action.increment);
-  EXPECT_FLOAT_EQ(to, action.target);
-
-  cras_ramp_destroy(ramp);
-}
-
-TEST(RampTestSuite, RampUpPassedRamp) {
-  float from = 0.0;
-  float to = 1.0;
-  int duration_frames = 48000;
-  int rc;
-  int ramped_frames = 48000;
-  struct cras_ramp* ramp;
-  struct cras_ramp_action action;
-
-  ResetStubData();
-
-  ramp = cras_ramp_create();
-  cras_mute_ramp_start(ramp, from, to, duration_frames, NULL, NULL);
-
-  rc = cras_ramp_update_ramped_frames(ramp, ramped_frames);
-
-  action = cras_ramp_get_current_action(ramp);
-
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(CRAS_RAMP_ACTION_NONE, action.type);
-  EXPECT_FLOAT_EQ(1.0, action.scaler);
-  EXPECT_FLOAT_EQ(0.0, action.increment);
-  EXPECT_FLOAT_EQ(1.0, action.target);
-
-  cras_ramp_destroy(ramp);
-}
-
-TEST(RampTestSuite, RampUpWhileHalfWayRampDown) {
-  float from;
-  float to;
-  int duration_frames = 48000;
-  int rc;
-  int ramped_frames = 24000;
-  struct cras_ramp* ramp;
-  struct cras_ramp_action action;
-  float down_increment = -1.0 / 48000;
-  float up_increment;
-  float scaler;
-
-  ResetStubData();
-
-  ramp = cras_ramp_create();
-  from = 1.0;
-  to = 0.0;
-  cras_mute_ramp_start(ramp, from, to, duration_frames, NULL, NULL);
-
-  rc = cras_ramp_update_ramped_frames(ramp, ramped_frames);
-
-  // Get expected current scaler.
-  scaler = 1 + down_increment * ramped_frames;
-  // The increment will be calculated by ramping to 1 starting from scaler.
-  up_increment = (1 - scaler) / 48000;
-
-  from = 0.0;
-  to = 1.0;
-  cras_mute_ramp_start(ramp, from, to, duration_frames, NULL, NULL);
-
-  action = cras_ramp_get_current_action(ramp);
-
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(CRAS_RAMP_ACTION_PARTIAL, action.type);
-  EXPECT_FLOAT_EQ(scaler, action.scaler);
-  EXPECT_FLOAT_EQ(up_increment, action.increment);
-  EXPECT_FLOAT_EQ(to, action.target);
-
-  cras_ramp_destroy(ramp);
-}
-
-TEST(RampTestSuite, RampUpWhileHalfWayRampUp) {
-  float from = 0.0;
-  float to = 1.0;
-  int duration_frames = 48000;
-  int rc;
-  int ramped_frames = 24000;
-  struct cras_ramp* ramp;
-  struct cras_ramp_action action;
-  float first_increment = 1.0 / 48000;
-  float second_increment;
-  float scaler;
-
-  ResetStubData();
-
-  ramp = cras_ramp_create();
-  cras_mute_ramp_start(ramp, from, to, duration_frames, NULL, NULL);
-
-  rc = cras_ramp_update_ramped_frames(ramp, ramped_frames);
-
-  // Get expected current scaler.
-  scaler = first_increment * ramped_frames;
-  // The increment will be calculated by ramping to 1 starting from scaler.
-  second_increment = (1 - scaler) / 48000;
-
-  cras_mute_ramp_start(ramp, from, to, duration_frames, NULL, NULL);
-
-  action = cras_ramp_get_current_action(ramp);
-
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(CRAS_RAMP_ACTION_PARTIAL, action.type);
-  EXPECT_FLOAT_EQ(scaler, action.scaler);
-  EXPECT_FLOAT_EQ(second_increment, action.increment);
-  EXPECT_FLOAT_EQ(to, action.target);
-
-  cras_ramp_destroy(ramp);
-}
-
-TEST(RampTestSuite, RampDownInitialIncrement) {
-  float from = 1.0;
-  float to = 0.0;
-  int duration_frames = 48000;
-  float increment = -1.0 / 48000;
-  cras_ramp* ramp;
-  cras_ramp_action action;
-
-  ResetStubData();
-
-  ramp = cras_ramp_create();
-  cras_mute_ramp_start(ramp, from, to, duration_frames, NULL, NULL);
-
-  action = cras_ramp_get_current_action(ramp);
-
-  EXPECT_EQ(CRAS_RAMP_ACTION_PARTIAL, action.type);
-  EXPECT_FLOAT_EQ(1.0, action.scaler);
-  EXPECT_FLOAT_EQ(increment, action.increment);
-  EXPECT_FLOAT_EQ(to, action.target);
-
-  cras_ramp_destroy(ramp);
-}
-
-TEST(RampTestSuite, RampDownUpdateRampedFrames) {
-  float from = 1.0;
-  float to = 0.0;
-  int duration_frames = 48000;
-  float increment = -1.0 / 48000;
-  int rc;
-  int ramped_frames = 512;
-  struct cras_ramp* ramp;
-  struct cras_ramp_action action;
-  float scaler = 1 + increment * ramped_frames;
-
-  ResetStubData();
-
-  ramp = cras_ramp_create();
-  cras_mute_ramp_start(ramp, from, to, duration_frames, NULL, NULL);
-
-  rc = cras_ramp_update_ramped_frames(ramp, ramped_frames);
-
-  action = cras_ramp_get_current_action(ramp);
-
-  EXPECT_EQ(rc, 0);
-  EXPECT_EQ(CRAS_RAMP_ACTION_PARTIAL, action.type);
-  EXPECT_FLOAT_EQ(scaler, action.scaler);
-  EXPECT_FLOAT_EQ(increment, action.increment);
-  EXPECT_FLOAT_EQ(to, action.target);
-
-  cras_ramp_destroy(ramp);
-}
-
-TEST(RampTestSuite, RampDownPassedRamp) {
-  float from = 1.0;
-  float to = 0.0;
-  int duration_frames = 48000;
-  int rc;
-  int ramped_frames = 48000;
-  struct cras_ramp* ramp;
-  struct cras_ramp_action action;
-
-  ResetStubData();
-
-  ramp = cras_ramp_create();
-  cras_mute_ramp_start(ramp, from, to, duration_frames, NULL, NULL);
-
-  rc = cras_ramp_update_ramped_frames(ramp, ramped_frames);
-
-  action = cras_ramp_get_current_action(ramp);
-
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(CRAS_RAMP_ACTION_NONE, action.type);
-  EXPECT_FLOAT_EQ(1.0, action.scaler);
-  EXPECT_FLOAT_EQ(0.0, action.increment);
-  EXPECT_FLOAT_EQ(1.0, action.target);
-
-  cras_ramp_destroy(ramp);
-}
-
-TEST(RampTestSuite, RampDownWhileHalfWayRampUp) {
-  float from;
-  float to;
-  int duration_frames = 48000;
-  int rc;
-  int ramped_frames = 24000;
-  struct cras_ramp* ramp;
-  struct cras_ramp_action action;
-  float up_increment = 1.0 / 48000;
-  float down_increment;
-  float scaler;
-
-  ResetStubData();
-
-  ramp = cras_ramp_create();
-  // Ramp up first.
-  from = 0.0;
-  to = 1.0;
-  cras_mute_ramp_start(ramp, from, to, duration_frames, NULL, NULL);
-
-  rc = cras_ramp_update_ramped_frames(ramp, ramped_frames);
-
-  // Get expected current scaler.
-  scaler = up_increment * ramped_frames;
-  // The increment will be calculated by ramping to 0 starting from scaler.
-  down_increment = -scaler / duration_frames;
-
-  // Ramp down will start from current scaler.
-  from = 1.0;
-  to = 0.0;
-  cras_mute_ramp_start(ramp, from, to, duration_frames, NULL, NULL);
-
-  action = cras_ramp_get_current_action(ramp);
-
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(CRAS_RAMP_ACTION_PARTIAL, action.type);
-  EXPECT_FLOAT_EQ(scaler, action.scaler);
-  EXPECT_FLOAT_EQ(down_increment, action.increment);
-  EXPECT_FLOAT_EQ(to, action.target);
-
-  cras_ramp_destroy(ramp);
-}
-
-TEST(RampTestSuite, NullWontCrash) {
-  float from;
-  float to;
-  int duration_frames = 48000;
-  int rc = 0;
-  struct cras_ramp* ramp = NULL;
-
-  ResetStubData();
-
-  from = 0.0;
-  to = 1.0;
-  rc = cras_mute_ramp_start(ramp, from, to, duration_frames, NULL, NULL);
-
-  EXPECT_EQ(-EINVAL, rc);
-}
-
-TEST(RampTestSuite, RampDownWhileHalfWayRampDown) {
-  float from = 1.0;
-  float to = 0.0;
-  int duration_frames = 48000;
-  int rc;
-  int ramped_frames = 24000;
-  struct cras_ramp* ramp;
-  struct cras_ramp_action action;
-  float down_increment = -1.0 / 48000;
-  float second_down_increment;
-  float scaler;
-
-  ResetStubData();
-
-  ramp = cras_ramp_create();
-  // Ramp down.
-  cras_mute_ramp_start(ramp, from, to, duration_frames, NULL, NULL);
-
-  rc = cras_ramp_update_ramped_frames(ramp, ramped_frames);
-
-  // Get expected current scaler.
-  scaler = 1 + down_increment * ramped_frames;
-  // The increment will be calculated by ramping to 0 starting from scaler.
-  second_down_increment = -scaler / duration_frames;
-
-  // Ramp down starting from current scaler.
-  cras_mute_ramp_start(ramp, from, to, duration_frames, NULL, NULL);
-
-  action = cras_ramp_get_current_action(ramp);
-
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(CRAS_RAMP_ACTION_PARTIAL, action.type);
-  EXPECT_FLOAT_EQ(scaler, action.scaler);
-  EXPECT_FLOAT_EQ(second_down_increment, action.increment);
-  EXPECT_FLOAT_EQ(to, action.target);
-
-  cras_ramp_destroy(ramp);
-}
-
-TEST(RampTestSuite, MuteRamp) {
-  float from = 0.0;
-  float to = 0.0;
-  int duration_frames = 48000;
-  struct cras_ramp* ramp;
-  struct cras_ramp_action action;
-
-  ResetStubData();
-
-  ramp = cras_ramp_create();
-  cras_mute_ramp_start(ramp, from, to, duration_frames, NULL, NULL);
-
-  action = cras_ramp_get_current_action(ramp);
-
-  EXPECT_EQ(CRAS_RAMP_ACTION_PARTIAL, action.type);
-  EXPECT_FLOAT_EQ(0.0, action.scaler);
-  EXPECT_FLOAT_EQ(0.0, action.increment);
-  EXPECT_FLOAT_EQ(0.0, action.target);
-
-  cras_ramp_destroy(ramp);
-}
-
-TEST(RampTestSuite, PartialRamp) {
-  float from_one = 0.75;
-  float to_one = 0.4;
-  float from_two = 0.6;
-  float to_two = 0.9;
-  int duration_frames = 1200;
-  int rc;
-  int ramped_frames = 600;
-  struct cras_ramp* ramp;
-  struct cras_ramp_action action;
-  float down_increment = (to_one - from_one) / duration_frames;
-  float up_increment;
-  float scaler;
-
-  ResetStubData();
-
-  ramp = cras_ramp_create();
-  // Ramp down.
-  cras_volume_ramp_start(ramp, from_one, to_one, duration_frames, NULL, NULL);
-
-  rc = cras_ramp_update_ramped_frames(ramp, ramped_frames);
-
-  scaler = from_one + ramped_frames * down_increment;
-  action = cras_ramp_get_current_action(ramp);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(CRAS_RAMP_ACTION_PARTIAL, action.type);
-  EXPECT_FLOAT_EQ(scaler, action.scaler);
-  EXPECT_FLOAT_EQ(down_increment, action.increment);
-  EXPECT_FLOAT_EQ(to_one, action.target);
-
-  // Ramp up starting from current scaler.
-  cras_volume_ramp_start(ramp, from_two, to_two, duration_frames, NULL, NULL);
-
-  // we start by multiplying by previous scaler
-  scaler = scaler * from_two;
-  action = cras_ramp_get_current_action(ramp);
-  up_increment = (to_two - scaler) / duration_frames;
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(CRAS_RAMP_ACTION_PARTIAL, action.type);
-  EXPECT_FLOAT_EQ(scaler, action.scaler);
-  EXPECT_FLOAT_EQ(up_increment, action.increment);
-  EXPECT_FLOAT_EQ(to_two, action.target);
-
-  cras_ramp_destroy(ramp);
-}
-
-void ramp_callback(void* arg) {
-  callback_called++;
-  callback_arg = arg;
-}
-
-TEST(RampTestSuite, RampUpPassedRampCallback) {
-  float from = 0.0;
-  float to = 1.0;
-  int duration_frames = 48000;
-  int rc;
-  int ramped_frames = 48000;
-  struct cras_ramp* ramp;
-  struct cras_ramp_action action;
-  void* cb_data = reinterpret_cast<void*>(0x123);
-
-  ResetStubData();
-
-  ramp = cras_ramp_create();
-  cras_mute_ramp_start(ramp, from, to, duration_frames, ramp_callback, cb_data);
-
-  rc = cras_ramp_update_ramped_frames(ramp, ramped_frames);
-
-  action = cras_ramp_get_current_action(ramp);
-
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(CRAS_RAMP_ACTION_NONE, action.type);
-  EXPECT_FLOAT_EQ(1.0, action.scaler);
-  EXPECT_FLOAT_EQ(0.0, action.increment);
-  EXPECT_FLOAT_EQ(1.0, action.target);
-  EXPECT_EQ(1, callback_called);
-  EXPECT_EQ(cb_data, callback_arg);
-
-  cras_ramp_destroy(ramp);
-}
-
-TEST(RampTestSuite, RampDownPassedRampCallback) {
-  float from = 1.0;
-  float to = 0.0;
-  int duration_frames = 48000;
-  int rc;
-  int ramped_frames = 48000;
-  struct cras_ramp* ramp;
-  struct cras_ramp_action action;
-  void* cb_data = reinterpret_cast<void*>(0x123);
-
-  ResetStubData();
-
-  ramp = cras_ramp_create();
-  cras_mute_ramp_start(ramp, from, to, duration_frames, ramp_callback, cb_data);
-
-  rc = cras_ramp_update_ramped_frames(ramp, ramped_frames);
-
-  action = cras_ramp_get_current_action(ramp);
-
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(CRAS_RAMP_ACTION_NONE, action.type);
-  EXPECT_FLOAT_EQ(1.0, action.scaler);
-  EXPECT_FLOAT_EQ(0.0, action.increment);
-  EXPECT_FLOAT_EQ(1.0, action.target);
-  EXPECT_EQ(1, callback_called);
-  EXPECT_EQ(cb_data, callback_arg);
-
-  cras_ramp_destroy(ramp);
-}
-
-}  // namespace
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  int rc = RUN_ALL_TESTS();
-
-  return rc;
-}
diff --git a/cras/src/tests/rate_estimator_unittest.cc b/cras/src/tests/rate_estimator_unittest.cc
deleted file mode 100644
index 778a3cd..0000000
--- a/cras/src/tests/rate_estimator_unittest.cc
+++ /dev/null
@@ -1,182 +0,0 @@
-// Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <gtest/gtest.h>
-
-extern "C" {
-#include "rate_estimator.h"
-}
-
-static struct timespec window = {.tv_sec = 0, .tv_nsec = 10000000};
-
-TEST(RateEstimatorTest, EstimateOutputLinear) {
-  struct rate_estimator* re;
-  struct timespec t = {.tv_sec = 1, .tv_nsec = 0};
-  int i, rc, level, tmp;
-
-  re = rate_estimator_create(10000, &window, 0.0f);
-  level = 240;
-  for (i = 0; i < 20; i++) {
-    rc = rate_estimator_check(re, level, &t);
-    EXPECT_EQ(0, rc);
-
-    /* Test that output device consumes 5 frames. */
-    tmp = rand() % 10;
-    rate_estimator_add_frames(re, 5 + tmp);
-    level += tmp;
-    t.tv_nsec += 500000;
-  }
-  t.tv_nsec += 1;
-  rc = rate_estimator_check(re, level, &t);
-  EXPECT_EQ(1, rc);
-  EXPECT_GT(10000, rate_estimator_get_rate(re));
-  EXPECT_LT(9999, rate_estimator_get_rate(re));
-
-  rate_estimator_destroy(re);
-}
-
-TEST(RateEstimatorTest, EstimateOutputLinear2) {
-  struct rate_estimator* re;
-  struct timespec t = {.tv_sec = 1, .tv_nsec = 0};
-  int level = 240;
-  int i, rc, tmp;
-
-  int interval_nsec[5] = {1000000, 1500000, 2000000, 2500000, 3000000};
-  int frames_written[5] = {30, 25, 20, 15, 10};
-
-  re = rate_estimator_create(7470, &window, 0.0f);
-  for (i = 0; i < 5; i++) {
-    rc = rate_estimator_check(re, level, &t);
-    EXPECT_EQ(0, rc);
-
-    tmp = rand() % 10;
-    rate_estimator_add_frames(re, frames_written[i] + tmp);
-    level += tmp;
-    t.tv_nsec += interval_nsec[i];
-  }
-  t.tv_nsec += 1;
-  rc = rate_estimator_check(re, level, &t);
-  EXPECT_EQ(1, rc);
-  /* Calculated rate is 7475.72 */
-  EXPECT_GT(7476, rate_estimator_get_rate(re));
-  EXPECT_LT(7475, rate_estimator_get_rate(re));
-
-  rate_estimator_destroy(re);
-}
-
-TEST(RateEstimatorTest, EstimateRateSkewTooLarge) {
-  struct rate_estimator* re;
-  struct timespec t = {.tv_sec = 1, .tv_nsec = 0};
-  int level = 240;
-  int i, rc, tmp;
-
-  int interval_nsec[5] = {1000000, 1500000, 2000000, 2500000, 3000000};
-  int frames_written[5] = {30, 25, 20, 15, 10};
-
-  re = rate_estimator_create(10000, &window, 0.0f);
-  for (i = 0; i < 5; i++) {
-    rc = rate_estimator_check(re, level, &t);
-    EXPECT_EQ(0, rc);
-
-    tmp = rand() % 10;
-    rate_estimator_add_frames(re, frames_written[i] + tmp);
-    level += tmp;
-    t.tv_nsec += interval_nsec[i];
-  }
-  t.tv_nsec += 1;
-  rc = rate_estimator_check(re, level, &t);
-  EXPECT_EQ(1, rc);
-  /* Estimated rate too far from allowed max rate skew */
-  EXPECT_EQ(10000, rate_estimator_get_rate(re));
-
-  rate_estimator_destroy(re);
-}
-
-TEST(RateEstimatorTest, EstimateOutputSmooth) {
-  struct rate_estimator* re;
-  struct timespec t = {.tv_sec = 1, .tv_nsec = 0};
-  int rc;
-
-  re = rate_estimator_create(10010, &window, 0.9f);
-  rc = rate_estimator_check(re, 240, &t);
-  EXPECT_EQ(0, rc);
-
-  /* Test that output device consumes 100 frames in
-   * 10ms. */
-  rate_estimator_add_frames(re, 55);
-  t.tv_nsec += 5000000;
-  rc = rate_estimator_check(re, 245, &t);
-  EXPECT_EQ(0, rc);
-
-  rate_estimator_add_frames(re, 55);
-  t.tv_nsec += 5000001;
-  rc = rate_estimator_check(re, 250, &t);
-  EXPECT_EQ(1, rc);
-
-  /* Assert the rate is smoothed 10010 * 0.9 + 10000 * 0.1 */
-  EXPECT_LT(10008, rate_estimator_get_rate(re));
-  EXPECT_GT(10009, rate_estimator_get_rate(re));
-
-  rate_estimator_destroy(re);
-}
-
-TEST(RateEstimatorTest, EstimateInputLinear) {
-  struct rate_estimator* re;
-  struct timespec t = {.tv_sec = 1, .tv_nsec = 0};
-  int i, rc, level, tmp;
-
-  re = rate_estimator_create(10000, &window, 0.0f);
-  level = 1200;
-  for (i = 0; i < 20; i++) {
-    rc = rate_estimator_check(re, level, &t);
-    EXPECT_EQ(0, rc);
-
-    /* Test that stream consumes 5 frames. */
-    tmp = rand() % 10;
-    rate_estimator_add_frames(re, -(5 + tmp));
-    level -= tmp;
-    t.tv_nsec += 500000;
-  }
-  t.tv_nsec += 1;
-  rc = rate_estimator_check(re, level, &t);
-  EXPECT_EQ(1, rc);
-  EXPECT_GT(10000, rate_estimator_get_rate(re));
-  EXPECT_LT(9999, rate_estimator_get_rate(re));
-
-  rate_estimator_destroy(re);
-}
-
-TEST(RateEstimatorTest, EstimateInputLinear2) {
-  struct rate_estimator* re;
-  struct timespec t;
-  int rc;
-  static struct timespec this_window = {.tv_sec = 0, .tv_nsec = 100000000};
-
-  re = rate_estimator_create(10000, &this_window, 0.0f);
-  t.tv_sec = 1;
-  t.tv_nsec = 0;
-  rc = rate_estimator_check(re, 200, &t);
-  EXPECT_EQ(0, rc);
-
-  t.tv_nsec += 50000000;
-  rc = rate_estimator_check(re, 700, &t);
-  EXPECT_EQ(0, rc);
-
-  rate_estimator_add_frames(re, -100);
-
-  t.tv_nsec += 50000000;
-  rc = rate_estimator_check(re, 1100, &t);
-  t.tv_nsec += 1;
-  rc = rate_estimator_check(re, 1100, &t);
-  EXPECT_EQ(1, rc);
-  EXPECT_GT(10000, rate_estimator_get_rate(re));
-  EXPECT_LT(9999, rate_estimator_get_rate(re));
-
-  rate_estimator_destroy(re);
-}
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tests/rstream_stub.cc b/cras/src/tests/rstream_stub.cc
deleted file mode 100644
index 18f6f95..0000000
--- a/cras/src/tests/rstream_stub.cc
+++ /dev/null
@@ -1,120 +0,0 @@
-/* Copyright 2017 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <unordered_map>
-
-extern "C" {
-#include "cras_rstream.h"
-}
-
-namespace {
-
-struct cb_data {
-  std::unordered_map<unsigned int, unsigned int> dev_offset;
-  int pending_reply;
-};
-std::unordered_map<const cras_rstream*, cb_data> data_map;
-
-};  // namespace
-
-void rstream_stub_reset() {
-  data_map.clear();
-}
-
-void rstream_stub_dev_offset(const cras_rstream* rstream,
-                             unsigned int dev_id,
-                             unsigned int offset) {
-  auto data = data_map.find(rstream);
-  if (data == data_map.end()) {
-    cb_data new_data;
-    new_data.dev_offset[dev_id] = offset;
-    data_map.insert({rstream, new_data});
-  } else {
-    data->second.dev_offset[dev_id] = offset;
-  }
-}
-
-void rstream_stub_pending_reply(const cras_rstream* rstream, int ret_value) {
-  auto data = data_map.find(rstream);
-  if (data == data_map.end()) {
-    cb_data new_data;
-    new_data.pending_reply = ret_value;
-    data_map.insert({rstream, new_data});
-  } else {
-    data->second.pending_reply = ret_value;
-  }
-}
-
-extern "C" {
-
-void cras_rstream_record_fetch_interval(struct cras_rstream* rstream,
-                                        const struct timespec* now) {}
-
-void cras_rstream_dev_attach(struct cras_rstream* rstream,
-                             unsigned int dev_id,
-                             void* dev_ptr) {}
-
-void cras_rstream_dev_detach(struct cras_rstream* rstream,
-                             unsigned int dev_id) {}
-
-unsigned int cras_rstream_dev_offset(const struct cras_rstream* rstream,
-                                     unsigned int dev_id) {
-  auto elem = data_map.find(rstream);
-  if (elem != data_map.end())
-    return elem->second.dev_offset[dev_id];
-  return 0;
-}
-
-void cras_rstream_dev_offset_update(struct cras_rstream* rstream,
-                                    unsigned int frames,
-                                    unsigned int dev_id) {}
-
-unsigned int cras_rstream_playable_frames(struct cras_rstream* rstream,
-                                          unsigned int dev_id) {
-  return 0;
-}
-
-float cras_rstream_get_volume_scaler(struct cras_rstream* rstream) {
-  return 1.0;
-}
-
-int cras_rstream_get_mute(const struct cras_rstream* rstream) {
-  return 0;
-}
-
-uint8_t* cras_rstream_get_readable_frames(struct cras_rstream* rstream,
-                                          unsigned int offset,
-                                          size_t* frames) {
-  return NULL;
-}
-
-void cras_rstream_update_input_write_pointer(struct cras_rstream* rstream) {}
-
-void cras_rstream_update_output_read_pointer(struct cras_rstream* rstream) {}
-
-int cras_rstream_audio_ready(struct cras_rstream* stream, size_t count) {
-  cras_shm_buffer_write_complete(stream->shm);
-  return 0;
-}
-
-int cras_rstream_request_audio(struct cras_rstream* stream,
-                               const struct timespec* now) {
-  return 0;
-}
-
-void cras_rstream_update_queued_frames(struct cras_rstream* rstream) {}
-
-int cras_rstream_is_pending_reply(const struct cras_rstream* rstream) {
-  auto elem = data_map.find(rstream);
-  if (elem != data_map.end())
-    return elem->second.pending_reply;
-  return 0;
-}
-
-int cras_rstream_flush_old_audio_messages(struct cras_rstream* rstream) {
-  return 0;
-}
-
-}  // extern "C"
diff --git a/cras/src/tests/rstream_stub.h b/cras/src/tests/rstream_stub.h
deleted file mode 100644
index 249bcb7..0000000
--- a/cras/src/tests/rstream_stub.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/* Copyright 2017 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef RSTREAM_STUB_H_
-#define RSTREAM_STUB_H_
-
-#include <time.h>
-
-void rstream_stub_reset();
-
-void rstream_stub_dev_offset(const cras_rstream* rstream,
-                             unsigned int dev_id,
-                             unsigned int offset);
-
-// Stub that rstream is pending the reply from client or not.
-void rstream_stub_pending_reply(const cras_rstream* rstream, int ret_value);
-
-#endif  // RSTREAM_STUB_H_
diff --git a/cras/src/tests/rstream_unittest.cc b/cras/src/tests/rstream_unittest.cc
deleted file mode 100644
index d8dae24..0000000
--- a/cras/src/tests/rstream_unittest.cc
+++ /dev/null
@@ -1,437 +0,0 @@
-// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <fcntl.h>
-#include <gtest/gtest.h>
-#include <stdio.h>
-#include <sys/mman.h>
-#include <sys/socket.h>
-#include <sys/types.h>
-
-extern "C" {
-#include "cras_audio_area.h"
-#include "cras_messages.h"
-#include "cras_rstream.h"
-#include "cras_shm.h"
-}
-
-#include "metrics_stub.h"
-
-namespace {
-
-class RstreamTestSuite : public testing::Test {
- protected:
-  virtual void SetUp() {
-    int rc;
-    int sock[2] = {-1, -1};
-
-    fmt_.format = SND_PCM_FORMAT_S16_LE;
-    fmt_.frame_rate = 48000;
-    fmt_.num_channels = 2;
-
-    config_.stream_id = 555;
-    config_.stream_type = CRAS_STREAM_TYPE_DEFAULT;
-    config_.client_type = CRAS_CLIENT_TYPE_UNKNOWN;
-    config_.direction = CRAS_STREAM_OUTPUT;
-    config_.dev_idx = NO_DEVICE;
-    config_.flags = 0;
-    config_.format = &fmt_;
-    config_.buffer_frames = 4096;
-    config_.cb_threshold = 2048;
-    config_.client_shm_size = 0;
-    config_.client_shm_fd = -1;
-
-    // Create a socket pair because it will be used in rstream.
-    rc = socketpair(AF_UNIX, SOCK_STREAM, 0, sock);
-    ASSERT_EQ(0, rc);
-    config_.audio_fd = sock[1];
-    client_fd_ = sock[0];
-
-    config_.client = NULL;
-  }
-
-  virtual void TearDown() {
-    close(config_.audio_fd);
-    close(client_fd_);
-  }
-
-  static bool format_equal(cras_audio_format* fmt1, cras_audio_format* fmt2) {
-    return fmt1->format == fmt2->format &&
-           fmt1->frame_rate == fmt2->frame_rate &&
-           fmt1->num_channels == fmt2->num_channels;
-  }
-
-  void stub_client_reply(enum CRAS_AUDIO_MESSAGE_ID id, int frames, int err) {
-    int rc;
-    struct audio_message aud_msg;
-    // Create a message.
-    aud_msg.id = id;
-    aud_msg.frames = frames;
-    aud_msg.error = err;
-
-    // Use socket fd to stub message from client.
-    rc = write(client_fd_, &aud_msg, sizeof(aud_msg));
-    EXPECT_EQ(sizeof(aud_msg), rc);
-    return;
-  }
-
-  struct cras_audio_format fmt_;
-  struct cras_rstream_config config_;
-  int client_fd_;
-};
-
-TEST_F(RstreamTestSuite, InvalidDirection) {
-  struct cras_rstream* s;
-  int rc;
-
-  config_.direction = (enum CRAS_STREAM_DIRECTION)66;
-  rc = cras_rstream_create(&config_, &s);
-  EXPECT_NE(0, rc);
-}
-
-TEST_F(RstreamTestSuite, InvalidStreamType) {
-  struct cras_rstream* s;
-  int rc;
-
-  config_.stream_type = (enum CRAS_STREAM_TYPE)7;
-  rc = cras_rstream_create(&config_, &s);
-  EXPECT_NE(0, rc);
-}
-
-TEST_F(RstreamTestSuite, InvalidBufferSize) {
-  struct cras_rstream* s;
-  int rc;
-
-  config_.buffer_frames = 3;
-  rc = cras_rstream_create(&config_, &s);
-  EXPECT_NE(0, rc);
-}
-
-TEST_F(RstreamTestSuite, InvalidCallbackThreshold) {
-  struct cras_rstream* s;
-  int rc;
-
-  config_.cb_threshold = 3;
-  rc = cras_rstream_create(&config_, &s);
-  EXPECT_NE(0, rc);
-}
-
-TEST_F(RstreamTestSuite, InvalidStreamPointer) {
-  int rc;
-
-  rc = cras_rstream_create(&config_, NULL);
-  EXPECT_NE(0, rc);
-}
-
-TEST_F(RstreamTestSuite, CreateOutput) {
-  struct cras_rstream* s;
-  struct cras_audio_format fmt_ret;
-  struct cras_audio_shm* shm_ret;
-  struct cras_audio_shm shm_mapped;
-  int rc, header_fd = -1, samples_fd = -1;
-  size_t shm_size;
-
-  rc = cras_rstream_create(&config_, &s);
-  EXPECT_EQ(0, rc);
-  EXPECT_NE((void*)NULL, s);
-  EXPECT_EQ(4096, cras_rstream_get_buffer_frames(s));
-  EXPECT_EQ(2048, cras_rstream_get_cb_threshold(s));
-  EXPECT_EQ(CRAS_STREAM_TYPE_DEFAULT, cras_rstream_get_type(s));
-  EXPECT_EQ(CRAS_STREAM_OUTPUT, cras_rstream_get_direction(s));
-  EXPECT_NE((void*)NULL, cras_rstream_shm(s));
-  rc = cras_rstream_get_format(s, &fmt_ret);
-  EXPECT_EQ(0, rc);
-  EXPECT_TRUE(format_equal(&fmt_ret, &fmt_));
-
-  // Check if shm is really set up.
-  shm_ret = cras_rstream_shm(s);
-  ASSERT_NE((void*)NULL, shm_ret);
-  cras_rstream_get_shm_fds(s, &header_fd, &samples_fd);
-  shm_size = cras_shm_samples_size(shm_ret);
-  EXPECT_EQ(shm_size, 32768);
-  shm_mapped.header = (struct cras_audio_shm_header*)mmap(
-      NULL, cras_shm_header_size(), PROT_READ | PROT_WRITE, MAP_SHARED,
-      header_fd, 0);
-  EXPECT_NE((void*)NULL, shm_mapped.header);
-  cras_shm_copy_shared_config(&shm_mapped);
-  EXPECT_EQ(cras_shm_used_size(&shm_mapped), cras_shm_used_size(shm_ret));
-  munmap(shm_mapped.header, cras_shm_header_size());
-
-  cras_rstream_destroy(s);
-}
-
-TEST_F(RstreamTestSuite, CreateInput) {
-  struct cras_rstream* s;
-  struct cras_audio_format fmt_ret;
-  struct cras_audio_shm* shm_ret;
-  struct cras_audio_shm shm_mapped;
-  int rc, header_fd = -1, samples_fd = -1;
-  size_t shm_size;
-
-  config_.direction = CRAS_STREAM_INPUT;
-  rc = cras_rstream_create(&config_, &s);
-  EXPECT_EQ(0, rc);
-  EXPECT_NE((void*)NULL, s);
-  EXPECT_EQ(4096, cras_rstream_get_buffer_frames(s));
-  EXPECT_EQ(2048, cras_rstream_get_cb_threshold(s));
-  EXPECT_EQ(CRAS_STREAM_TYPE_DEFAULT, cras_rstream_get_type(s));
-  EXPECT_EQ(CRAS_STREAM_INPUT, cras_rstream_get_direction(s));
-  EXPECT_NE((void*)NULL, cras_rstream_shm(s));
-  rc = cras_rstream_get_format(s, &fmt_ret);
-  EXPECT_EQ(0, rc);
-  EXPECT_TRUE(format_equal(&fmt_ret, &fmt_));
-
-  // Check if shm is really set up.
-  shm_ret = cras_rstream_shm(s);
-  ASSERT_NE((void*)NULL, shm_ret);
-  cras_rstream_get_shm_fds(s, &header_fd, &samples_fd);
-  shm_size = cras_shm_samples_size(shm_ret);
-  EXPECT_EQ(shm_size, 32768);
-  shm_mapped.header = (struct cras_audio_shm_header*)mmap(
-      NULL, cras_shm_header_size(), PROT_READ | PROT_WRITE, MAP_SHARED,
-      header_fd, 0);
-  EXPECT_NE((void*)NULL, shm_mapped.header);
-  cras_shm_copy_shared_config(&shm_mapped);
-  EXPECT_EQ(cras_shm_used_size(&shm_mapped), cras_shm_used_size(shm_ret));
-  munmap(shm_mapped.header, cras_shm_header_size());
-
-  cras_rstream_destroy(s);
-}
-
-TEST_F(RstreamTestSuite, VerifyStreamTypes) {
-  struct cras_rstream* s;
-  int rc;
-
-  config_.stream_type = CRAS_STREAM_TYPE_DEFAULT;
-  rc = cras_rstream_create(&config_, &s);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(CRAS_STREAM_TYPE_DEFAULT, cras_rstream_get_type(s));
-  EXPECT_NE(CRAS_STREAM_TYPE_MULTIMEDIA, cras_rstream_get_type(s));
-  cras_rstream_destroy(s);
-
-  config_.stream_type = CRAS_STREAM_TYPE_VOICE_COMMUNICATION;
-  rc = cras_rstream_create(&config_, &s);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(CRAS_STREAM_TYPE_VOICE_COMMUNICATION, cras_rstream_get_type(s));
-  cras_rstream_destroy(s);
-
-  config_.direction = CRAS_STREAM_INPUT;
-  config_.stream_type = CRAS_STREAM_TYPE_SPEECH_RECOGNITION;
-  rc = cras_rstream_create(&config_, &s);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(CRAS_STREAM_TYPE_SPEECH_RECOGNITION, cras_rstream_get_type(s));
-  cras_rstream_destroy(s);
-
-  config_.stream_type = CRAS_STREAM_TYPE_PRO_AUDIO;
-  rc = cras_rstream_create(&config_, &s);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(CRAS_STREAM_TYPE_PRO_AUDIO, cras_rstream_get_type(s));
-  cras_rstream_destroy(s);
-}
-
-TEST_F(RstreamTestSuite, OutputStreamIsPendingReply) {
-  struct cras_rstream* s;
-  int rc;
-  struct timespec ts;
-
-  rc = cras_rstream_create(&config_, &s);
-  EXPECT_EQ(0, rc);
-
-  // Not pending reply.
-  rc = cras_rstream_is_pending_reply(s);
-  EXPECT_EQ(0, rc);
-
-  // Request some data from client.
-  rc = cras_rstream_request_audio(s, &ts);
-  EXPECT_GT(rc, 0);
-
-  // Pending reply.
-  rc = cras_rstream_is_pending_reply(s);
-  EXPECT_EQ(1, rc);
-
-  cras_rstream_destroy(s);
-}
-
-TEST_F(RstreamTestSuite, OutputStreamFlushMessages) {
-  struct cras_rstream* s;
-  int rc;
-  struct timespec ts;
-
-  rc = cras_rstream_create(&config_, &s);
-  EXPECT_EQ(0, rc);
-
-  // Not pending reply.
-  rc = cras_rstream_is_pending_reply(s);
-  EXPECT_EQ(0, rc);
-
-  // Request some data from client.
-  rc = cras_rstream_request_audio(s, &ts);
-  EXPECT_GT(rc, 0);
-
-  // Pending reply.
-  rc = cras_rstream_is_pending_reply(s);
-  EXPECT_EQ(1, rc);
-
-  // Client replies that data is ready.
-  stub_client_reply(AUDIO_MESSAGE_DATA_READY, 10, 0);
-
-  // Read messages.
-  cras_rstream_flush_old_audio_messages(s);
-
-  // NOT Pending reply.
-  rc = cras_rstream_is_pending_reply(s);
-  EXPECT_EQ(0, rc);
-
-  cras_rstream_destroy(s);
-}
-
-TEST_F(RstreamTestSuite, InputStreamIsPendingReply) {
-  struct cras_rstream* s;
-  int rc;
-
-  config_.direction = CRAS_STREAM_INPUT;
-
-  rc = cras_rstream_create(&config_, &s);
-  EXPECT_EQ(0, rc);
-
-  // Not pending reply.
-  rc = cras_rstream_is_pending_reply(s);
-  EXPECT_EQ(0, rc);
-
-  // Some data is ready. Sends it to client.
-  rc = cras_rstream_audio_ready(s, 10);
-  EXPECT_GT(rc, 0);
-
-  // Pending reply.
-  rc = cras_rstream_is_pending_reply(s);
-  EXPECT_EQ(1, rc);
-
-  cras_rstream_destroy(s);
-}
-
-TEST_F(RstreamTestSuite, InputStreamFlushMessages) {
-  struct cras_rstream* s;
-  int rc;
-
-  config_.direction = CRAS_STREAM_INPUT;
-
-  rc = cras_rstream_create(&config_, &s);
-  EXPECT_EQ(0, rc);
-
-  // Not pending reply.
-  rc = cras_rstream_is_pending_reply(s);
-  EXPECT_EQ(0, rc);
-
-  // Some data is ready. Sends it to client.
-  rc = cras_rstream_audio_ready(s, 10);
-  EXPECT_GT(rc, 0);
-
-  // Pending reply.
-  rc = cras_rstream_is_pending_reply(s);
-  EXPECT_EQ(1, rc);
-
-  // Client replies that data is captured.
-  stub_client_reply(AUDIO_MESSAGE_DATA_CAPTURED, 10, 0);
-
-  // Read messages.
-  cras_rstream_flush_old_audio_messages(s);
-
-  // NOT Pending reply.
-  rc = cras_rstream_is_pending_reply(s);
-  EXPECT_EQ(0, rc);
-
-  cras_rstream_destroy(s);
-}
-
-}  //  namespace
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
-
-/* stubs */
-extern "C" {
-
-struct cras_audio_area* cras_audio_area_create(int num_channels) {
-  return NULL;
-}
-
-void cras_audio_area_destroy(struct cras_audio_area* area) {}
-
-void cras_audio_area_config_channels(struct cras_audio_area* area,
-                                     const struct cras_audio_format* fmt) {}
-
-struct buffer_share* buffer_share_create(unsigned int buf_sz) {
-  return NULL;
-}
-
-void buffer_share_destroy(struct buffer_share* mix) {}
-
-int buffer_share_offset_update(struct buffer_share* mix,
-                               unsigned int id,
-                               unsigned int frames) {
-  return 0;
-}
-
-unsigned int buffer_share_get_new_write_point(struct buffer_share* mix) {
-  return 0;
-}
-
-int buffer_share_add_id(struct buffer_share* mix, unsigned int id, void* data) {
-  return 0;
-}
-
-int buffer_share_rm_id(struct buffer_share* mix, unsigned int id) {
-  return 0;
-}
-
-unsigned int buffer_share_id_offset(const struct buffer_share* mix,
-                                    unsigned int id) {
-  return 0;
-}
-void ewma_power_init(struct ewma_power* ewma, unsigned int rate) {}
-
-void ewma_power_calculate(struct ewma_power* ewma,
-                          const int16_t* buf,
-                          unsigned int channels,
-                          unsigned int size) {}
-
-void cras_system_state_stream_added(enum CRAS_STREAM_DIRECTION direction,
-                                    enum CRAS_CLIENT_TYPE client_type) {}
-
-void cras_system_state_stream_removed(enum CRAS_STREAM_DIRECTION direction,
-                                      enum CRAS_CLIENT_TYPE client_type) {}
-
-int cras_server_metrics_stream_create(
-    const struct cras_rstream_config* config) {
-  return 0;
-}
-
-int cras_server_metrics_stream_destroy(const struct cras_rstream* stream) {
-  return 0;
-}
-
-#ifdef HAVE_WEBRTC_APM
-#define FAKE_CRAS_APM_PTR reinterpret_cast<struct cras_apm*>(0x99)
-struct cras_apm_list* cras_apm_list_create(void* stream_ptr, uint64_t effects) {
-  return NULL;
-}
-struct cras_apm* cras_apm_list_get_active_apm(void* stream_ptr, void* dev_ptr) {
-  return FAKE_CRAS_APM_PTR;
-}
-int cras_apm_list_destroy(struct cras_apm_list* list) {
-  return 0;
-}
-uint64_t cras_apm_list_get_effects(struct cras_apm_list* list) {
-  return APM_ECHO_CANCELLATION;
-}
-struct cras_apm* cras_apm_list_get(struct cras_apm_list* list, void* dev_ptr) {
-  return NULL;
-}
-struct cras_audio_format* cras_apm_list_get_format(struct cras_apm* apm) {
-  return NULL;
-}
-#endif
-}
diff --git a/cras/src/tests/sbc_codec_stub.cc b/cras/src/tests/sbc_codec_stub.cc
deleted file mode 100644
index 95bd091..0000000
--- a/cras/src/tests/sbc_codec_stub.cc
+++ /dev/null
@@ -1,174 +0,0 @@
-/* Copyright 2019 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-#include <stdlib.h>
-
-extern "C" {
-#include "cras_audio_codec.h"
-#include "sbc_codec_stub.h"
-}
-
-namespace {
-
-static int create_fail;
-static int create_called;
-static int msbc_create_called;
-static int destroy_called;
-static uint8_t freq_val;
-static uint8_t mode_val;
-static uint8_t subbands_val;
-static uint8_t alloc_val;
-static uint8_t blocks_val;
-static uint8_t bitpool_val;
-static struct cras_audio_codec* sbc_codec;
-static size_t decode_out_decoded_return_val;
-static int decode_fail;
-static size_t encode_out_encoded_return_val;
-static int encode_fail;
-static int cras_sbc_get_frame_length_val;
-static int cras_sbc_get_codesize_val;
-
-};  // namespace
-
-void sbc_codec_stub_reset() {
-  create_fail = 0;
-  create_called = 0;
-  msbc_create_called = 0;
-  destroy_called = 0;
-  freq_val = 0;
-  mode_val = 0;
-  subbands_val = 0;
-  alloc_val = 0;
-  blocks_val = 0;
-  bitpool_val = 0;
-
-  sbc_codec = NULL;
-  decode_out_decoded_return_val = 0;
-  encode_out_encoded_return_val = 0;
-  decode_fail = 0;
-  encode_fail = 0;
-
-  cras_sbc_get_frame_length_val = 5;
-  cras_sbc_get_codesize_val = 5;
-}
-
-void set_sbc_codec_create_fail(int fail) {
-  create_fail = fail;
-}
-
-int get_sbc_codec_create_called() {
-  return create_called;
-}
-
-int get_msbc_codec_create_called() {
-  return msbc_create_called;
-}
-
-uint8_t get_sbc_codec_create_freq_val() {
-  return freq_val;
-}
-
-uint8_t get_sbc_codec_create_mode_val() {
-  return mode_val;
-}
-
-uint8_t get_sbc_codec_create_subbands_val() {
-  return subbands_val;
-}
-
-uint8_t get_sbc_codec_create_alloc_val() {
-  return alloc_val;
-}
-
-uint8_t get_sbc_codec_create_blocks_val() {
-  return blocks_val;
-}
-
-uint8_t get_sbc_codec_create_bitpool_val() {
-  return bitpool_val;
-}
-
-int get_sbc_codec_destroy_called() {
-  return destroy_called;
-}
-
-void set_sbc_codec_decoded_out(size_t ret) {
-  decode_out_decoded_return_val = ret;
-}
-
-void set_sbc_codec_decoded_fail(int fail) {
-  decode_fail = fail;
-}
-
-void set_sbc_codec_encoded_out(size_t ret) {
-  encode_out_encoded_return_val = ret;
-}
-
-void set_sbc_codec_encoded_fail(int fail) {
-  encode_fail = fail;
-}
-
-int decode(struct cras_audio_codec* codec,
-           const void* input,
-           size_t input_len,
-           void* output,
-           size_t output_len,
-           size_t* count) {
-  *count = decode_out_decoded_return_val;
-  return decode_fail ? -1 : input_len;
-}
-
-int encode(struct cras_audio_codec* codec,
-           const void* input,
-           size_t input_len,
-           void* output,
-           size_t output_len,
-           size_t* count) {
-  // Written half the output buffer.
-  *count = encode_out_encoded_return_val;
-  return encode_fail ? -1 : input_len;
-}
-
-struct cras_audio_codec* cras_sbc_codec_create(uint8_t freq,
-                                               uint8_t mode,
-                                               uint8_t subbands,
-                                               uint8_t alloc,
-                                               uint8_t blocks,
-                                               uint8_t bitpool) {
-  if (!create_fail) {
-    sbc_codec = (struct cras_audio_codec*)calloc(1, sizeof(*sbc_codec));
-    sbc_codec->decode = decode;
-    sbc_codec->encode = encode;
-  }
-
-  create_called++;
-  freq_val = freq;
-  mode_val = mode;
-  subbands_val = subbands;
-  alloc_val = alloc;
-  blocks_val = blocks;
-  bitpool_val = bitpool;
-  return sbc_codec;
-}
-
-struct cras_audio_codec* cras_msbc_codec_create() {
-  msbc_create_called++;
-  sbc_codec = (struct cras_audio_codec*)calloc(1, sizeof(*sbc_codec));
-  sbc_codec->decode = decode;
-  sbc_codec->encode = encode;
-  return sbc_codec;
-}
-
-void cras_sbc_codec_destroy(struct cras_audio_codec* codec) {
-  destroy_called++;
-  free(codec);
-}
-
-int cras_sbc_get_codesize(struct cras_audio_codec* codec) {
-  return cras_sbc_get_codesize_val;
-}
-
-int cras_sbc_get_frame_length(struct cras_audio_codec* codec) {
-  return cras_sbc_get_frame_length_val;
-}
diff --git a/cras/src/tests/sbc_codec_stub.h b/cras/src/tests/sbc_codec_stub.h
deleted file mode 100644
index b166b39..0000000
--- a/cras/src/tests/sbc_codec_stub.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/* Copyright 2019 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef SBC_CODEC_STUB_H_
-#define SBC_CODEC_STUB_H_
-
-#include <stdint.h>
-#include <stdlib.h>
-
-void sbc_codec_stub_reset();
-void set_sbc_codec_create_fail(int fail);
-int get_sbc_codec_create_called();
-int get_msbc_codec_create_called();
-uint8_t get_sbc_codec_create_freq_val();
-uint8_t get_sbc_codec_create_mode_val();
-uint8_t get_sbc_codec_create_subbands_val();
-uint8_t get_sbc_codec_create_alloc_val();
-uint8_t get_sbc_codec_create_blocks_val();
-uint8_t get_sbc_codec_create_bitpool_val();
-int get_sbc_codec_destroy_called();
-void set_sbc_codec_decoded_out(size_t ret);
-void set_sbc_codec_decoded_fail(int fail);
-void set_sbc_codec_encoded_out(size_t ret);
-void set_sbc_codec_encoded_fail(int fail);
-
-struct cras_audio_codec* cras_sbc_codec_create(uint8_t freq,
-                                               uint8_t mode,
-                                               uint8_t subbands,
-                                               uint8_t alloc,
-                                               uint8_t blocks,
-                                               uint8_t bitpool);
-struct cras_audio_codec* cras_msbc_codec_create();
-void cras_sbc_codec_destroy(struct cras_audio_codec* codec);
-int cras_sbc_get_codesize(struct cras_audio_codec* codec);
-int cras_sbc_get_frame_length(struct cras_audio_codec* codec);
-
-#endif  // SBC_CODEC_STUB_H_
diff --git a/cras/src/tests/server_metrics_unittest.cc b/cras/src/tests/server_metrics_unittest.cc
deleted file mode 100644
index e23906e..0000000
--- a/cras/src/tests/server_metrics_unittest.cc
+++ /dev/null
@@ -1,403 +0,0 @@
-// Copyright 2016 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <gtest/gtest.h>
-#include <stdio.h>
-
-#include <vector>
-
-extern "C" {
-#include "cras_main_message.h"
-#include "cras_rstream.h"
-#include "cras_server_metrics.c"
-}
-
-static enum CRAS_MAIN_MESSAGE_TYPE type_set;
-static struct timespec clock_gettime_retspec;
-std::vector<struct cras_server_metrics_message> sent_msgs;
-
-void ResetStubData() {
-  type_set = (enum CRAS_MAIN_MESSAGE_TYPE)0;
-  sent_msgs.clear();
-}
-
-namespace {
-
-TEST(ServerMetricsTestSuite, Init) {
-  ResetStubData();
-
-  cras_server_metrics_init();
-
-  EXPECT_EQ(type_set, CRAS_MAIN_METRICS);
-}
-
-TEST(ServerMetricsTestSuite, SetMetricsDeviceRuntime) {
-  ResetStubData();
-  struct cras_iodev iodev;
-  struct cras_ionode active_node;
-
-  clock_gettime_retspec.tv_sec = 200;
-  clock_gettime_retspec.tv_nsec = 0;
-  iodev.info.idx = MAX_SPECIAL_DEVICE_IDX;
-  iodev.open_ts.tv_sec = 100;
-  iodev.open_ts.tv_nsec = 0;
-  iodev.direction = CRAS_STREAM_INPUT;
-  iodev.active_node = &active_node;
-  active_node.type = CRAS_NODE_TYPE_USB;
-
-  cras_server_metrics_device_runtime(&iodev);
-
-  EXPECT_EQ(sent_msgs.size(), 1);
-  EXPECT_EQ(sent_msgs[0].header.type, CRAS_MAIN_METRICS);
-  EXPECT_EQ(sent_msgs[0].header.length,
-            sizeof(struct cras_server_metrics_message));
-  EXPECT_EQ(sent_msgs[0].metrics_type, DEVICE_RUNTIME);
-  EXPECT_EQ(sent_msgs[0].data.device_data.type, CRAS_METRICS_DEVICE_USB);
-  EXPECT_EQ(sent_msgs[0].data.device_data.direction, CRAS_STREAM_INPUT);
-  EXPECT_EQ(sent_msgs[0].data.device_data.runtime.tv_sec, 100);
-
-  sent_msgs.clear();
-
-  clock_gettime_retspec.tv_sec = 300;
-  clock_gettime_retspec.tv_nsec = 0;
-  iodev.open_ts.tv_sec = 100;
-  iodev.open_ts.tv_nsec = 0;
-  iodev.direction = CRAS_STREAM_OUTPUT;
-  iodev.active_node = &active_node;
-  active_node.type = CRAS_NODE_TYPE_HEADPHONE;
-
-  cras_server_metrics_device_runtime(&iodev);
-
-  EXPECT_EQ(sent_msgs.size(), 1);
-  EXPECT_EQ(sent_msgs[0].header.type, CRAS_MAIN_METRICS);
-  EXPECT_EQ(sent_msgs[0].header.length,
-            sizeof(struct cras_server_metrics_message));
-  EXPECT_EQ(sent_msgs[0].metrics_type, DEVICE_RUNTIME);
-  EXPECT_EQ(sent_msgs[0].data.device_data.type, CRAS_METRICS_DEVICE_HEADPHONE);
-  EXPECT_EQ(sent_msgs[0].data.device_data.direction, CRAS_STREAM_OUTPUT);
-  EXPECT_EQ(sent_msgs[0].data.device_data.runtime.tv_sec, 200);
-}
-
-TEST(ServerMetricsTestSuite, SetMetricsHighestDeviceDelay) {
-  ResetStubData();
-  unsigned int hw_level = 1000;
-  unsigned int largest_cb_level = 500;
-
-  cras_server_metrics_highest_device_delay(hw_level, largest_cb_level,
-                                           CRAS_STREAM_INPUT);
-
-  EXPECT_EQ(sent_msgs.size(), 1);
-  EXPECT_EQ(sent_msgs[0].header.type, CRAS_MAIN_METRICS);
-  EXPECT_EQ(sent_msgs[0].header.length,
-            sizeof(struct cras_server_metrics_message));
-  EXPECT_EQ(sent_msgs[0].metrics_type, HIGHEST_DEVICE_DELAY_INPUT);
-  EXPECT_EQ(sent_msgs[0].data.value, 2000);
-
-  sent_msgs.clear();
-
-  cras_server_metrics_highest_device_delay(hw_level, largest_cb_level,
-                                           CRAS_STREAM_OUTPUT);
-
-  EXPECT_EQ(sent_msgs.size(), 1);
-  EXPECT_EQ(sent_msgs[0].header.type, CRAS_MAIN_METRICS);
-  EXPECT_EQ(sent_msgs[0].header.length,
-            sizeof(struct cras_server_metrics_message));
-  EXPECT_EQ(sent_msgs[0].metrics_type, HIGHEST_DEVICE_DELAY_OUTPUT);
-  EXPECT_EQ(sent_msgs[0].data.value, 2000);
-}
-
-TEST(ServerMetricsTestSuite, SetMetricHighestHardwareLevel) {
-  ResetStubData();
-  unsigned int hw_level = 1000;
-
-  cras_server_metrics_highest_hw_level(hw_level, CRAS_STREAM_INPUT);
-
-  EXPECT_EQ(sent_msgs.size(), 1);
-  EXPECT_EQ(sent_msgs[0].header.type, CRAS_MAIN_METRICS);
-  EXPECT_EQ(sent_msgs[0].header.length,
-            sizeof(struct cras_server_metrics_message));
-  EXPECT_EQ(sent_msgs[0].metrics_type, HIGHEST_INPUT_HW_LEVEL);
-  EXPECT_EQ(sent_msgs[0].data.value, hw_level);
-
-  sent_msgs.clear();
-
-  cras_server_metrics_highest_hw_level(hw_level, CRAS_STREAM_OUTPUT);
-
-  EXPECT_EQ(sent_msgs.size(), 1);
-  EXPECT_EQ(sent_msgs[0].header.type, CRAS_MAIN_METRICS);
-  EXPECT_EQ(sent_msgs[0].header.length,
-            sizeof(struct cras_server_metrics_message));
-  EXPECT_EQ(sent_msgs[0].metrics_type, HIGHEST_OUTPUT_HW_LEVEL);
-  EXPECT_EQ(sent_msgs[0].data.value, hw_level);
-}
-
-TEST(ServerMetricsTestSuite, SetMetricsNumUnderruns) {
-  ResetStubData();
-  unsigned int underrun = 10;
-
-  cras_server_metrics_num_underruns(underrun);
-
-  EXPECT_EQ(sent_msgs.size(), 1);
-  EXPECT_EQ(sent_msgs[0].header.type, CRAS_MAIN_METRICS);
-  EXPECT_EQ(sent_msgs[0].header.length,
-            sizeof(struct cras_server_metrics_message));
-  EXPECT_EQ(sent_msgs[0].metrics_type, NUM_UNDERRUNS);
-  EXPECT_EQ(sent_msgs[0].data.value, underrun);
-}
-
-TEST(ServerMetricsTestSuite, SetMetricsMissedCallbackEventInputStream) {
-  ResetStubData();
-  struct cras_rstream stream;
-  struct timespec diff_ts;
-
-  stream.flags = 0;
-  stream.start_ts.tv_sec = 0;
-  stream.start_ts.tv_nsec = 0;
-  stream.num_missed_cb = 0;
-  stream.direction = CRAS_STREAM_INPUT;
-
-  clock_gettime_retspec.tv_sec = 100;
-  clock_gettime_retspec.tv_nsec = 0;
-  cras_server_metrics_missed_cb_event(&stream);
-
-  subtract_timespecs(&clock_gettime_retspec, &stream.start_ts, &diff_ts);
-  EXPECT_EQ(sent_msgs.size(), 1);
-  EXPECT_EQ(sent_msgs[0].header.type, CRAS_MAIN_METRICS);
-  EXPECT_EQ(sent_msgs[0].header.length,
-            sizeof(struct cras_server_metrics_message));
-  EXPECT_EQ(sent_msgs[0].metrics_type, MISSED_CB_FIRST_TIME_INPUT);
-  EXPECT_EQ(sent_msgs[0].data.value, diff_ts.tv_sec);
-  EXPECT_EQ(stream.num_missed_cb, 1);
-  EXPECT_EQ(stream.first_missed_cb_ts.tv_sec, clock_gettime_retspec.tv_sec);
-  EXPECT_EQ(stream.first_missed_cb_ts.tv_nsec, clock_gettime_retspec.tv_nsec);
-
-  clock_gettime_retspec.tv_sec = 200;
-  clock_gettime_retspec.tv_nsec = 0;
-  cras_server_metrics_missed_cb_event(&stream);
-
-  subtract_timespecs(&clock_gettime_retspec, &stream.first_missed_cb_ts,
-                     &diff_ts);
-  EXPECT_EQ(sent_msgs.size(), 2);
-  EXPECT_EQ(sent_msgs[1].header.type, CRAS_MAIN_METRICS);
-  EXPECT_EQ(sent_msgs[1].header.length,
-            sizeof(struct cras_server_metrics_message));
-  EXPECT_EQ(sent_msgs[1].metrics_type, MISSED_CB_SECOND_TIME_INPUT);
-  EXPECT_EQ(sent_msgs[1].data.value, diff_ts.tv_sec);
-  EXPECT_EQ(stream.num_missed_cb, 2);
-}
-
-TEST(ServerMetricsTestSuite, SetMetricsMissedCallbackEventOutputStream) {
-  ResetStubData();
-  struct cras_rstream stream;
-  struct timespec diff_ts;
-
-  stream.flags = 0;
-  stream.start_ts.tv_sec = 0;
-  stream.start_ts.tv_nsec = 0;
-  stream.num_missed_cb = 0;
-  stream.direction = CRAS_STREAM_OUTPUT;
-
-  clock_gettime_retspec.tv_sec = 100;
-  clock_gettime_retspec.tv_nsec = 0;
-  cras_server_metrics_missed_cb_event(&stream);
-
-  subtract_timespecs(&clock_gettime_retspec, &stream.start_ts, &diff_ts);
-  EXPECT_EQ(sent_msgs.size(), 1);
-  EXPECT_EQ(sent_msgs[0].header.type, CRAS_MAIN_METRICS);
-  EXPECT_EQ(sent_msgs[0].header.length,
-            sizeof(struct cras_server_metrics_message));
-  EXPECT_EQ(sent_msgs[0].metrics_type, MISSED_CB_FIRST_TIME_OUTPUT);
-  EXPECT_EQ(sent_msgs[0].data.value, diff_ts.tv_sec);
-  EXPECT_EQ(stream.num_missed_cb, 1);
-  EXPECT_EQ(stream.first_missed_cb_ts.tv_sec, clock_gettime_retspec.tv_sec);
-  EXPECT_EQ(stream.first_missed_cb_ts.tv_nsec, clock_gettime_retspec.tv_nsec);
-
-  clock_gettime_retspec.tv_sec = 200;
-  clock_gettime_retspec.tv_nsec = 0;
-  cras_server_metrics_missed_cb_event(&stream);
-
-  subtract_timespecs(&clock_gettime_retspec, &stream.first_missed_cb_ts,
-                     &diff_ts);
-  EXPECT_EQ(sent_msgs.size(), 2);
-  EXPECT_EQ(sent_msgs[1].header.type, CRAS_MAIN_METRICS);
-  EXPECT_EQ(sent_msgs[1].header.length,
-            sizeof(struct cras_server_metrics_message));
-  EXPECT_EQ(sent_msgs[1].metrics_type, MISSED_CB_SECOND_TIME_OUTPUT);
-  EXPECT_EQ(sent_msgs[1].data.value, diff_ts.tv_sec);
-  EXPECT_EQ(stream.num_missed_cb, 2);
-}
-
-TEST(ServerMetricsTestSuite, SetMetricsStreamCreate) {
-  ResetStubData();
-  struct cras_rstream_config config;
-  struct cras_audio_format format;
-
-  config.direction = CRAS_STREAM_INPUT;
-  config.cb_threshold = 1024;
-  config.flags = BULK_AUDIO_OK;
-  format.format = SND_PCM_FORMAT_S16_LE;
-  format.frame_rate = 48000;
-  config.client_type = CRAS_CLIENT_TYPE_TEST;
-  config.format = &format;
-  cras_server_metrics_stream_create(&config);
-
-  // Log stream config.
-  EXPECT_EQ(sent_msgs.size(), 1);
-  EXPECT_EQ(sent_msgs[0].header.type, CRAS_MAIN_METRICS);
-  EXPECT_EQ(sent_msgs[0].header.length,
-            sizeof(struct cras_server_metrics_message));
-  EXPECT_EQ(sent_msgs[0].metrics_type, STREAM_CONFIG);
-  EXPECT_EQ(sent_msgs[0].data.stream_config.direction, CRAS_STREAM_INPUT);
-  EXPECT_EQ(sent_msgs[0].data.stream_config.cb_threshold, 1024);
-  EXPECT_EQ(sent_msgs[0].data.stream_config.flags, BULK_AUDIO_OK);
-  EXPECT_EQ(sent_msgs[0].data.stream_config.format, SND_PCM_FORMAT_S16_LE);
-  EXPECT_EQ(sent_msgs[0].data.stream_config.rate, 48000);
-  EXPECT_EQ(sent_msgs[0].data.stream_config.client_type, CRAS_CLIENT_TYPE_TEST);
-}
-
-TEST(ServerMetricsTestSuite, SetMetricsStreamDestroy) {
-  ResetStubData();
-  struct cras_rstream stream;
-  struct timespec diff_ts;
-
-  stream.flags = 0;
-  stream.start_ts.tv_sec = 0;
-  stream.start_ts.tv_nsec = 0;
-  clock_gettime_retspec.tv_sec = 1000;
-  clock_gettime_retspec.tv_nsec = 0;
-  stream.num_missed_cb = 5;
-  stream.first_missed_cb_ts.tv_sec = 100;
-  stream.first_missed_cb_ts.tv_nsec = 0;
-  stream.longest_fetch_interval.tv_sec = 1;
-  stream.longest_fetch_interval.tv_nsec = 0;
-  stream.sleep_interval_ts.tv_sec = 0;
-  stream.sleep_interval_ts.tv_nsec = 5000000;
-
-  stream.direction = CRAS_STREAM_INPUT;
-  stream.client_type = CRAS_CLIENT_TYPE_TEST;
-  stream.stream_type = CRAS_STREAM_TYPE_DEFAULT;
-  cras_server_metrics_stream_destroy(&stream);
-
-  subtract_timespecs(&clock_gettime_retspec, &stream.start_ts, &diff_ts);
-  EXPECT_EQ(sent_msgs.size(), 4);
-
-  // Log missed cb frequency.
-  EXPECT_EQ(sent_msgs[0].header.type, CRAS_MAIN_METRICS);
-  EXPECT_EQ(sent_msgs[0].header.length,
-            sizeof(struct cras_server_metrics_message));
-  EXPECT_EQ(sent_msgs[0].metrics_type, MISSED_CB_FREQUENCY_INPUT);
-  EXPECT_EQ(sent_msgs[0].data.value,
-            stream.num_missed_cb * 86400 / diff_ts.tv_sec);
-
-  // Log missed cb frequency after rescheduling.
-  subtract_timespecs(&clock_gettime_retspec, &stream.first_missed_cb_ts,
-                     &diff_ts);
-  EXPECT_EQ(sent_msgs[1].header.type, CRAS_MAIN_METRICS);
-  EXPECT_EQ(sent_msgs[1].header.length,
-            sizeof(struct cras_server_metrics_message));
-  EXPECT_EQ(sent_msgs[1].metrics_type,
-            MISSED_CB_FREQUENCY_AFTER_RESCHEDULING_INPUT);
-  EXPECT_EQ(sent_msgs[1].data.value,
-            (stream.num_missed_cb - 1) * 86400 / diff_ts.tv_sec);
-
-  // Log stream runtime.
-  EXPECT_EQ(sent_msgs[2].header.type, CRAS_MAIN_METRICS);
-  EXPECT_EQ(sent_msgs[2].header.length,
-            sizeof(struct cras_server_metrics_message));
-  EXPECT_EQ(sent_msgs[2].metrics_type, STREAM_RUNTIME);
-  EXPECT_EQ(sent_msgs[2].data.stream_data.client_type, CRAS_CLIENT_TYPE_TEST);
-  EXPECT_EQ(sent_msgs[2].data.stream_data.stream_type,
-            CRAS_STREAM_TYPE_DEFAULT);
-  EXPECT_EQ(sent_msgs[2].data.stream_data.direction, CRAS_STREAM_INPUT);
-  EXPECT_EQ(sent_msgs[2].data.stream_data.runtime.tv_sec, 1000);
-
-  // Log longest fetch delay.
-  EXPECT_EQ(sent_msgs[3].header.type, CRAS_MAIN_METRICS);
-  EXPECT_EQ(sent_msgs[3].header.length,
-            sizeof(struct cras_server_metrics_message));
-  EXPECT_EQ(sent_msgs[3].metrics_type, LONGEST_FETCH_DELAY);
-  EXPECT_EQ(sent_msgs[3].data.stream_data.client_type, CRAS_CLIENT_TYPE_TEST);
-  EXPECT_EQ(sent_msgs[3].data.stream_data.stream_type,
-            CRAS_STREAM_TYPE_DEFAULT);
-  EXPECT_EQ(sent_msgs[3].data.stream_data.direction, CRAS_STREAM_INPUT);
-  EXPECT_EQ(sent_msgs[3].data.stream_data.runtime.tv_sec, 0);
-  EXPECT_EQ(sent_msgs[3].data.stream_data.runtime.tv_nsec, 995000000);
-}
-
-TEST(ServerMetricsTestSuite, SetMetricsBusyloop) {
-  ResetStubData();
-  struct timespec time = {40, 0};
-  unsigned count = 3;
-
-  cras_server_metrics_busyloop(&time, count);
-
-  EXPECT_EQ(sent_msgs.size(), 1);
-  EXPECT_EQ(sent_msgs[0].header.type, CRAS_MAIN_METRICS);
-  EXPECT_EQ(sent_msgs[0].header.length,
-            sizeof(struct cras_server_metrics_message));
-  EXPECT_EQ(sent_msgs[0].metrics_type, BUSYLOOP);
-  EXPECT_EQ(sent_msgs[0].data.timespec_data.runtime.tv_sec, 40);
-  EXPECT_EQ(sent_msgs[0].data.timespec_data.runtime.tv_nsec, 0);
-  EXPECT_EQ(sent_msgs[0].data.timespec_data.count, 3);
-}
-
-TEST(ServerMetricsTestSuite, SetMetricsBusyloopLength) {
-  ResetStubData();
-  unsigned length = 5;
-
-  cras_server_metrics_busyloop_length(length);
-
-  EXPECT_EQ(sent_msgs.size(), 1);
-  EXPECT_EQ(sent_msgs[0].header.type, CRAS_MAIN_METRICS);
-  EXPECT_EQ(sent_msgs[0].header.length,
-            sizeof(struct cras_server_metrics_message));
-  EXPECT_EQ(sent_msgs[0].metrics_type, BUSYLOOP_LENGTH);
-  EXPECT_EQ(sent_msgs[0].data.value, 5);
-}
-
-extern "C" {
-
-int cras_main_message_add_handler(enum CRAS_MAIN_MESSAGE_TYPE type,
-                                  cras_message_callback callback,
-                                  void* callback_data) {
-  type_set = type;
-  return 0;
-}
-
-void cras_metrics_log_histogram(const char* name,
-                                int sample,
-                                int min,
-                                int max,
-                                int nbuckets) {}
-
-void cras_metrics_log_sparse_histogram(const char* name, int sample) {}
-
-int cras_main_message_send(struct cras_main_message* msg) {
-  // Copy the sent message so we can examine it in the test later.
-  struct cras_server_metrics_message sent_msg;
-  memcpy(&sent_msg, msg, sizeof(sent_msg));
-  sent_msgs.push_back(sent_msg);
-  return 0;
-}
-
-int cras_system_state_in_main_thread() {
-  return 0;
-}
-
-//  From librt.
-int clock_gettime(clockid_t clk_id, struct timespec* tp) {
-  tp->tv_sec = clock_gettime_retspec.tv_sec;
-  tp->tv_nsec = clock_gettime_retspec.tv_nsec;
-  return 0;
-}
-
-}  // extern "C"
-}  // namespace
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  int rc = RUN_ALL_TESTS();
-
-  return rc;
-}
diff --git a/cras/src/tests/shm_unittest.cc b/cras/src/tests/shm_unittest.cc
deleted file mode 100644
index b5df1f6..0000000
--- a/cras/src/tests/shm_unittest.cc
+++ /dev/null
@@ -1,572 +0,0 @@
-// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <gtest/gtest.h>
-#include <stdio.h>
-
-extern "C" {
-#include "cras_shm.h"
-#include "cras_types.h"
-}
-
-namespace {
-
-class ShmTestSuite : public testing::Test {
- protected:
-  virtual void SetUp() {
-    memset(&shm_, 0, sizeof(shm_));
-    shm_.header =
-        static_cast<cras_audio_shm_header*>(calloc(1, sizeof(*shm_.header)));
-    shm_.samples = static_cast<uint8_t*>(calloc(1, 2048));
-    shm_.samples_info.length = 2048;
-    cras_shm_set_frame_bytes(&shm_, 4);
-
-    cras_shm_set_used_size(&shm_, 1024);
-    memcpy(&shm_.header->config, &shm_.config, sizeof(shm_.config));
-
-    frames_ = 0;
-  }
-
-  virtual void TearDown() {
-    free(shm_.header);
-    free(shm_.samples);
-  }
-
-  struct cras_audio_shm shm_;
-  uint8_t* buf_;
-  size_t frames_;
-};
-
-// Test that and empty buffer returns 0 readable bytes.
-TEST_F(ShmTestSuite, NoneReadableWhenEmpty) {
-  buf_ = cras_shm_get_readable_frames(&shm_, 0, &frames_);
-  EXPECT_EQ(0, frames_);
-  cras_shm_buffer_read(&shm_, frames_);
-  EXPECT_EQ(0, shm_.header->read_offset[0]);
-}
-
-// Buffer with 100 frames filled.
-TEST_F(ShmTestSuite, OneHundredFilled) {
-  shm_.header->write_offset[0] = 100 * shm_.header->config.frame_bytes;
-  buf_ = cras_shm_get_readable_frames(&shm_, 0, &frames_);
-  EXPECT_EQ(100, frames_);
-  EXPECT_EQ(shm_.samples, buf_);
-  cras_shm_buffer_read(&shm_, frames_ - 9);
-  EXPECT_EQ((frames_ - 9) * shm_.config.frame_bytes,
-            shm_.header->read_offset[0]);
-  cras_shm_buffer_read(&shm_, 9);
-  EXPECT_EQ(0, shm_.header->read_offset[0]);
-  EXPECT_EQ(1, shm_.header->read_buf_idx);
-}
-
-// Buffer with 100 frames filled, 50 read.
-TEST_F(ShmTestSuite, OneHundredFilled50Read) {
-  shm_.header->write_offset[0] = 100 * shm_.config.frame_bytes;
-  shm_.header->read_offset[0] = 50 * shm_.config.frame_bytes;
-  buf_ = cras_shm_get_readable_frames(&shm_, 0, &frames_);
-  EXPECT_EQ(50, frames_);
-  EXPECT_EQ((shm_.samples + shm_.header->read_offset[0]), buf_);
-  cras_shm_buffer_read(&shm_, frames_ - 10);
-  EXPECT_EQ(shm_.header->write_offset[0] - 10 * shm_.config.frame_bytes,
-            shm_.header->read_offset[0]);
-  cras_shm_buffer_read(&shm_, 10);
-  EXPECT_EQ(0, shm_.header->read_offset[0]);
-}
-
-// Buffer with 100 frames filled, 50 read, offset by 25.
-TEST_F(ShmTestSuite, OneHundredFilled50Read25offset) {
-  shm_.header->write_offset[0] = 100 * shm_.config.frame_bytes;
-  shm_.header->read_offset[0] = 50 * shm_.config.frame_bytes;
-  buf_ = cras_shm_get_readable_frames(&shm_, 25, &frames_);
-  EXPECT_EQ(25, frames_);
-  EXPECT_EQ(shm_.samples + shm_.header->read_offset[0] +
-                25 * shm_.header->config.frame_bytes,
-            (uint8_t*)buf_);
-}
-
-// Test wrapping across buffers.
-TEST_F(ShmTestSuite, WrapToNextBuffer) {
-  uint32_t used_size = cras_shm_used_size(&shm_);
-  uint32_t used_frames = used_size / cras_shm_frame_bytes(&shm_);
-  shm_.header->write_offset[0] = (used_size / 2);
-  shm_.header->read_offset[0] = (used_size / 4);
-  shm_.header->write_offset[1] = (used_size / 2);
-  buf_ = cras_shm_get_readable_frames(&shm_, 0, &frames_);
-  EXPECT_EQ(used_frames / 4, frames_);
-  EXPECT_EQ(cras_shm_buff_for_idx(&shm_, 0) + (used_size / 4), (uint8_t*)buf_);
-  buf_ = cras_shm_get_readable_frames(&shm_, frames_, &frames_);
-  EXPECT_EQ(used_frames / 2, frames_);
-  EXPECT_EQ(cras_shm_buff_for_idx(&shm_, 1), (uint8_t*)buf_);
-  /* Mark all but 10 frames as read */
-  cras_shm_buffer_read(&shm_, (used_frames / 2) + (used_frames / 4) - 10);
-  EXPECT_EQ(0, shm_.header->read_offset[0]);
-  EXPECT_EQ(((used_frames / 2) - 10) * shm_.config.frame_bytes,
-            shm_.header->read_offset[1]);
-  EXPECT_EQ(1, shm_.header->read_buf_idx);
-}
-
-// Test wrapping across buffers reading all samples.
-TEST_F(ShmTestSuite, WrapToNextBufferReadAll) {
-  uint32_t used_size = cras_shm_used_size(&shm_);
-  uint32_t used_frames = used_size / cras_shm_frame_bytes(&shm_);
-  shm_.header->write_offset[0] = (used_size / 2);
-  shm_.header->read_offset[0] = (used_size / 4);
-  shm_.header->write_offset[1] = (used_size / 2);
-  buf_ = cras_shm_get_readable_frames(&shm_, 0, &frames_);
-  EXPECT_EQ(used_frames / 4, frames_);
-  EXPECT_EQ(cras_shm_buff_for_idx(&shm_, 0) + (used_size / 4), (uint8_t*)buf_);
-  buf_ = cras_shm_get_readable_frames(&shm_, frames_, &frames_);
-  EXPECT_EQ(used_frames / 2, frames_);
-  EXPECT_EQ(cras_shm_buff_for_idx(&shm_, 1), (uint8_t*)buf_);
-  /* Mark all frames as read */
-  cras_shm_buffer_read(&shm_, (used_frames / 2) + (used_frames / 4));
-  EXPECT_EQ(0, shm_.header->read_offset[0]);
-  EXPECT_EQ(0, shm_.header->read_offset[1]);
-  EXPECT_EQ(0, shm_.header->read_buf_idx);
-}
-
-// Test wrapping last buffer.
-TEST_F(ShmTestSuite, WrapFromFinalBuffer) {
-  uint32_t used_size = cras_shm_used_size(&shm_);
-  uint32_t used_frames = used_size / cras_shm_frame_bytes(&shm_);
-  uint32_t buf_idx = CRAS_NUM_SHM_BUFFERS - 1;
-
-  shm_.header->read_buf_idx = buf_idx;
-  shm_.header->write_offset[buf_idx] = (used_size / 2);
-  shm_.header->read_offset[buf_idx] = (used_size / 4);
-  shm_.header->write_offset[0] = (used_size / 2);
-  buf_ = cras_shm_get_readable_frames(&shm_, 0, &frames_);
-  EXPECT_EQ(used_frames / 4, frames_);
-  EXPECT_EQ(cras_shm_buff_for_idx(&shm_, buf_idx) + (used_size / 4),
-            (uint8_t*)buf_);
-
-  buf_ = cras_shm_get_readable_frames(&shm_, frames_, &frames_);
-  EXPECT_EQ(used_frames / 2, frames_);
-  EXPECT_EQ(cras_shm_buff_for_idx(&shm_, 0), (uint8_t*)buf_);
-  /* Mark all but 10 frames as read */
-  cras_shm_buffer_read(&shm_, (used_frames / 2) + (used_frames / 4) - 10);
-  EXPECT_EQ(0, shm_.header->read_offset[buf_idx]);
-  EXPECT_EQ(((used_frames / 2) - 10) * shm_.config.frame_bytes,
-            shm_.header->read_offset[0]);
-  EXPECT_EQ(0, shm_.header->read_buf_idx);
-}
-
-// Test Check available to write returns 0 if not free buffer.
-TEST_F(ShmTestSuite, WriteAvailNotFree) {
-  size_t ret;
-  shm_.header->write_buf_idx = 0;
-  shm_.header->write_offset[0] = 100 * shm_.config.frame_bytes;
-  shm_.header->read_offset[0] = 50 * shm_.config.frame_bytes;
-  ret = cras_shm_get_num_writeable(&shm_);
-  EXPECT_EQ(0, ret);
-}
-
-// Test Check available to write returns num_frames if free buffer.
-TEST_F(ShmTestSuite, WriteAvailValid) {
-  size_t ret;
-  shm_.header->write_buf_idx = 0;
-  shm_.config.used_size = 480 * shm_.config.frame_bytes;
-  shm_.header->write_offset[0] = 0;
-  shm_.header->read_offset[0] = 0;
-  ret = cras_shm_get_num_writeable(&shm_);
-  EXPECT_EQ(480, ret);
-}
-
-// Test get frames_written returns the number of frames written.
-TEST_F(ShmTestSuite, GetNumWritten) {
-  size_t ret;
-  shm_.header->write_buf_idx = 0;
-  shm_.config.used_size = 480 * shm_.config.frame_bytes;
-  shm_.header->write_offset[0] = 200 * shm_.config.frame_bytes;
-  shm_.header->read_offset[0] = 0;
-  ret = cras_shm_frames_written(&shm_);
-  EXPECT_EQ(200, ret);
-}
-
-// Test that getting the base of the write buffer returns the correct pointer.
-TEST_F(ShmTestSuite, GetWriteBufferBase) {
-  uint8_t* ret;
-
-  shm_.header->write_buf_idx = 0;
-  shm_.header->write_offset[0] = 128 * shm_.config.frame_bytes;
-  shm_.header->write_offset[1] = 128 * shm_.config.frame_bytes;
-  shm_.header->read_offset[0] = 0;
-  shm_.header->read_offset[1] = 0;
-  ret = cras_shm_get_write_buffer_base(&shm_);
-  EXPECT_EQ(shm_.samples, ret);
-
-  shm_.header->write_buf_idx = 1;
-  ret = cras_shm_get_write_buffer_base(&shm_);
-  EXPECT_EQ(shm_.samples + shm_.config.used_size, ret);
-}
-
-TEST_F(ShmTestSuite, SetVolume) {
-  cras_shm_set_volume_scaler(&shm_, 1.0);
-  EXPECT_EQ(shm_.header->volume_scaler, 1.0);
-  cras_shm_set_volume_scaler(&shm_, 1.4);
-  EXPECT_EQ(shm_.header->volume_scaler, 1.0);
-  cras_shm_set_volume_scaler(&shm_, -0.5);
-  EXPECT_EQ(shm_.header->volume_scaler, 0.0);
-  cras_shm_set_volume_scaler(&shm_, 0.5);
-  EXPECT_EQ(shm_.header->volume_scaler, 0.5);
-}
-
-// Test that invalid read/write offsets are detected.
-
-TEST_F(ShmTestSuite, InvalidWriteOffset) {
-  shm_.header->write_offset[0] = shm_.config.used_size + 50;
-  shm_.header->read_offset[0] = 0;
-  buf_ = cras_shm_get_readable_frames(&shm_, 0, &frames_);
-  EXPECT_EQ(shm_.config.used_size / 4, frames_);
-}
-
-TEST_F(ShmTestSuite, InvalidReadOffset) {
-  // Should ignore read+_offset and assume 0.
-  shm_.header->write_offset[0] = 44;
-  shm_.header->read_offset[0] = shm_.config.used_size + 25;
-  buf_ = cras_shm_get_readable_frames(&shm_, 0, &frames_);
-  EXPECT_EQ(shm_.header->write_offset[0] / shm_.config.frame_bytes, frames_);
-  EXPECT_EQ(shm_.samples, (uint8_t*)buf_);
-}
-
-TEST_F(ShmTestSuite, InvalidReadAndWriteOffset) {
-  shm_.header->write_offset[0] = shm_.config.used_size + 50;
-  shm_.header->read_offset[0] = shm_.config.used_size + 25;
-  buf_ = cras_shm_get_readable_frames(&shm_, 0, &frames_);
-  EXPECT_EQ(shm_.config.used_size / 4, frames_);
-}
-
-TEST_F(ShmTestSuite, InputBufferOverrun) {
-  int rc;
-  shm_.header->write_offset[0] = 0;
-  shm_.header->read_offset[0] = 0;
-  shm_.header->write_offset[1] = 0;
-  shm_.header->read_offset[1] = 0;
-
-  shm_.header->write_buf_idx = 0;
-  shm_.header->read_buf_idx = 0;
-
-  EXPECT_EQ(0, cras_shm_num_overruns(&shm_));
-  rc = cras_shm_check_write_overrun(&shm_);
-  EXPECT_EQ(0, rc);
-  cras_shm_buffer_written(&shm_, 100);
-  cras_shm_buffer_write_complete(&shm_);
-
-  rc = cras_shm_check_write_overrun(&shm_);
-  EXPECT_EQ(0, rc);
-  cras_shm_buffer_written(&shm_, 100);
-  cras_shm_buffer_write_complete(&shm_);
-
-  // Assert two consecutive writes causes overrun.
-  rc = cras_shm_check_write_overrun(&shm_);
-  EXPECT_EQ(1, rc);
-  EXPECT_EQ(1, cras_shm_num_overruns(&shm_));
-}
-
-TEST_F(ShmTestSuite, GetWritableFramesNeedToWrite) {
-  unsigned buffer_size = 480;
-  unsigned limit = 480;
-  unsigned written = 200;
-  unsigned frames;
-  shm_.header->write_buf_idx = 0;
-  shm_.config.used_size = buffer_size * shm_.config.frame_bytes;
-  shm_.header->write_offset[0] = written * shm_.config.frame_bytes;
-  buf_ = cras_shm_get_writeable_frames(&shm_, limit, &frames);
-  EXPECT_EQ(limit - written, frames);
-  EXPECT_EQ(shm_.samples + shm_.header->write_offset[0], buf_);
-}
-
-TEST_F(ShmTestSuite, GetWritableFramesNoNeedToWrite) {
-  unsigned buffer_size = 480;
-  unsigned limit = 240;
-  unsigned written = 300;
-  unsigned frames;
-  shm_.header->write_buf_idx = 0;
-  shm_.config.used_size = buffer_size * shm_.config.frame_bytes;
-  shm_.header->write_offset[0] = written * shm_.config.frame_bytes;
-  buf_ = cras_shm_get_writeable_frames(&shm_, limit, &frames);
-  EXPECT_EQ(0, frames);
-  EXPECT_EQ(shm_.samples + shm_.header->write_offset[0], buf_);
-}
-
-// Test wrapping of buffers that don't start at normal offsets.
-TEST_F(ShmTestSuite, WrapWithNonstandardBufferLocations) {
-  uint32_t frame_bytes = cras_shm_frame_bytes(&shm_);
-  uint32_t used_frames = 24;
-  uint32_t used_size = used_frames * frame_bytes;
-  cras_shm_set_used_size(&shm_, used_size);
-  cras_shm_set_buffer_offset(&shm_, 0, 15);
-  cras_shm_set_buffer_offset(&shm_, 1, 479);
-
-  shm_.header->read_offset[0] = (used_frames / 4) * shm_.config.frame_bytes;
-  shm_.header->write_offset[0] = (used_frames / 2) * shm_.config.frame_bytes;
-  shm_.header->read_offset[1] = 0;
-  shm_.header->write_offset[1] = (used_frames / 3) * shm_.config.frame_bytes;
-  buf_ = cras_shm_get_readable_frames(&shm_, 0, &frames_);
-  EXPECT_EQ(used_frames / 4, frames_);
-  EXPECT_EQ(cras_shm_buff_for_idx(&shm_, 0) + shm_.header->read_offset[0],
-            (uint8_t*)buf_);
-  buf_ = cras_shm_get_readable_frames(&shm_, frames_, &frames_);
-  EXPECT_EQ(used_frames / 3, frames_);
-  EXPECT_EQ(cras_shm_buff_for_idx(&shm_, 1), (uint8_t*)buf_);
-  /* Mark all but 5 frames as read */
-  cras_shm_buffer_read(&shm_, (used_frames / 4) + (used_frames / 3) - 5);
-  EXPECT_EQ(0, shm_.header->read_offset[0]);
-  EXPECT_EQ(((used_frames / 3) - 5) * shm_.config.frame_bytes,
-            shm_.header->read_offset[1]);
-}
-
-TEST_F(ShmTestSuite, PlaybackWithDifferentSequentialBufferLocations) {
-  uint32_t frame_bytes = cras_shm_frame_bytes(&shm_);
-  uint32_t used_frames = 24;
-  uint32_t used_size = used_frames * frame_bytes;
-  cras_shm_set_used_size(&shm_, used_size);
-
-  uint32_t first_offset = 2.7 * used_size;
-  /* Make samples area long enough to hold all of the buffers starting from
-   * first_offset, with an extra 'used_size' bytes of free space at the end. */
-  uint32_t samples_length =
-      first_offset + used_size * (CRAS_NUM_SHM_BUFFERS + 1);
-  free(shm_.samples);
-  shm_.samples = static_cast<uint8_t*>(calloc(1, samples_length));
-  shm_.samples_info.length = samples_length;
-  uint32_t total_frames_written = 0;
-
-  // Fill all of the buffers.
-  for (unsigned int i = 0; i < CRAS_NUM_SHM_BUFFERS; i++) {
-    cras_shm_set_buffer_offset(&shm_, i, first_offset + i * used_size);
-    shm_.header->write_in_progress[i] = 1;
-    shm_.header->write_offset[i] = 0;
-    frames_ = MIN(10 + i, used_frames);
-    cras_shm_buffer_written(&shm_, frames_);
-    total_frames_written += frames_;
-    cras_shm_buffer_write_complete(&shm_);
-  }
-
-  uint32_t total_frames_available = 0;
-
-  // Consume all available frames.
-  while ((buf_ = cras_shm_get_readable_frames(&shm_, 0, &frames_))) {
-    total_frames_available += frames_;
-
-    EXPECT_GE(buf_, shm_.samples);
-    EXPECT_LE(buf_ + frames_, shm_.samples + samples_length);
-    cras_shm_buffer_read(&shm_, frames_);
-  }
-
-  EXPECT_EQ(total_frames_written, total_frames_available);
-
-  uint32_t second_offset = 1.2 * used_size;
-
-  // Fill half of the buffers.
-  for (unsigned int i = 0; i < CRAS_NUM_SHM_BUFFERS / 2; i++) {
-    cras_shm_set_buffer_offset(&shm_, i, second_offset + i * used_size);
-    shm_.header->write_in_progress[i] = 1;
-    shm_.header->write_offset[i] = 0;
-    frames_ = MIN(3 + 2 * i, used_frames);
-    cras_shm_buffer_written(&shm_, frames_);
-    total_frames_written += frames_;
-    cras_shm_buffer_write_complete(&shm_);
-  }
-
-  // Consume all available frames.
-  while ((buf_ = cras_shm_get_readable_frames(&shm_, 0, &frames_))) {
-    total_frames_available += frames_;
-
-    EXPECT_GE(buf_, shm_.samples);
-    EXPECT_LE(buf_ + frames_, shm_.samples + samples_length);
-    cras_shm_buffer_read(&shm_, frames_);
-  }
-
-  EXPECT_EQ(total_frames_written, total_frames_available);
-
-  // Fill rest of the buffers.
-  for (unsigned int i = CRAS_NUM_SHM_BUFFERS / 2; i < CRAS_NUM_SHM_BUFFERS;
-       i++) {
-    cras_shm_set_buffer_offset(&shm_, i, second_offset + i * used_size);
-    shm_.header->write_in_progress[i] = 1;
-    shm_.header->write_offset[i] = 0;
-    frames_ = MIN(3 + 2 * i, used_frames);
-    cras_shm_buffer_written(&shm_, frames_);
-    total_frames_written += frames_;
-    cras_shm_buffer_write_complete(&shm_);
-  }
-
-  // Consume all available frames.
-  while ((buf_ = cras_shm_get_readable_frames(&shm_, 0, &frames_))) {
-    total_frames_available += frames_;
-
-    EXPECT_GE(buf_, shm_.samples);
-    EXPECT_LE(buf_ + frames_, shm_.samples + samples_length);
-    cras_shm_buffer_read(&shm_, frames_);
-  }
-
-  EXPECT_EQ(total_frames_written, total_frames_available);
-}
-
-TEST_F(ShmTestSuite, GetCheckedBufferOffset) {
-  uint32_t used_size = cras_shm_used_size(&shm_);
-  uint32_t samples_length = used_size * 8;
-  shm_.samples_info.length = samples_length;
-
-  uint32_t offset;
-
-  for (unsigned int i = 0; i < CRAS_NUM_SHM_BUFFERS; i++) {
-    shm_.header->buffer_offset[i] = 0;
-    offset = cras_shm_get_checked_buffer_offset(&shm_, i);
-    EXPECT_EQ(0, offset) << "Expected valid buffer offset for buffer " << i;
-
-    shm_.header->buffer_offset[i] = used_size;
-    offset = cras_shm_get_checked_buffer_offset(&shm_, i);
-    EXPECT_EQ(used_size, offset)
-        << "Expected valid buffer offset for buffer " << i;
-
-    shm_.header->buffer_offset[i] = samples_length - 1;
-    offset = cras_shm_get_checked_buffer_offset(&shm_, i);
-    EXPECT_EQ(samples_length - 1, offset)
-        << "Expected valid buffer offset for buffer " << i;
-
-    shm_.header->buffer_offset[i] = samples_length;
-    offset = cras_shm_get_checked_buffer_offset(&shm_, i);
-    EXPECT_EQ(samples_length, offset)
-        << "Expected valid buffer offset for buffer " << i;
-
-    shm_.header->buffer_offset[i] = samples_length + 1;
-    offset = cras_shm_get_checked_buffer_offset(&shm_, i);
-    EXPECT_EQ(samples_length, offset)
-        << "Expected invalid buffer offset for buffer " << i;
-
-    shm_.header->buffer_offset[i] = samples_length + used_size;
-    offset = cras_shm_get_checked_buffer_offset(&shm_, i);
-    EXPECT_EQ(samples_length, offset)
-        << "Expected invalid buffer offset for buffer " << i;
-  }
-}
-
-TEST_F(ShmTestSuite, GetCheckedReadOffset) {
-  uint32_t used_size = cras_shm_used_size(&shm_);
-  uint32_t samples_length = used_size * 8;
-  shm_.samples_info.length = samples_length;
-
-  uint32_t offset;
-
-  for (unsigned int i = 0; i < CRAS_NUM_SHM_BUFFERS; i++) {
-    shm_.header->read_offset[i] = 0;
-    offset = cras_shm_get_checked_read_offset(&shm_, i);
-    EXPECT_EQ(0, offset) << "Expected valid read offset for buffer " << i;
-
-    shm_.header->read_offset[i] = used_size / 2;
-    offset = cras_shm_get_checked_read_offset(&shm_, i);
-    EXPECT_EQ(used_size / 2, offset)
-        << "Expected valid read offset for buffer " << i;
-
-    shm_.header->read_offset[i] = used_size;
-    offset = cras_shm_get_checked_read_offset(&shm_, i);
-    EXPECT_EQ(used_size, offset)
-        << "Expected valid read offset for buffer " << i;
-
-    // Read offsets should not be greater than used_size.
-    shm_.header->read_offset[i] = used_size + 1;
-    offset = cras_shm_get_checked_read_offset(&shm_, i);
-    EXPECT_EQ(0, offset) << "Expected invalid read offset for buffer " << i;
-
-    shm_.header->buffer_offset[i] = samples_length - used_size / 2;
-
-    shm_.header->read_offset[i] = 0;
-    offset = cras_shm_get_checked_read_offset(&shm_, i);
-    EXPECT_EQ(0, offset) << "Expected valid read offset for buffer " << i;
-
-    shm_.header->read_offset[i] = used_size / 4;
-    offset = cras_shm_get_checked_read_offset(&shm_, i);
-    EXPECT_EQ(used_size / 4, offset)
-        << "Expected valid read offset for buffer " << i;
-
-    shm_.header->read_offset[i] = used_size / 2;
-    offset = cras_shm_get_checked_read_offset(&shm_, i);
-    EXPECT_EQ(used_size / 2, offset)
-        << "Expected valid read offset for buffer " << i;
-
-    shm_.header->read_offset[i] = used_size / 2 + 1;
-    offset = cras_shm_get_checked_read_offset(&shm_, i);
-    EXPECT_EQ(0, offset) << "Expected invalid read offset for buffer " << i;
-
-    shm_.header->read_offset[i] = used_size;
-    offset = cras_shm_get_checked_read_offset(&shm_, i);
-    EXPECT_EQ(0, offset) << "Expected invalid read offset for buffer " << i;
-
-    shm_.header->read_offset[i] = used_size + 1;
-    offset = cras_shm_get_checked_read_offset(&shm_, i);
-    EXPECT_EQ(0, offset) << "Expected invalid read offset for buffer " << i;
-  }
-}
-
-TEST_F(ShmTestSuite, GetCheckedWriteOffset) {
-  uint32_t used_size = cras_shm_used_size(&shm_);
-  uint32_t samples_length = used_size * 8;
-  shm_.samples_info.length = samples_length;
-
-  uint32_t offset;
-
-  for (unsigned int i = 0; i < CRAS_NUM_SHM_BUFFERS; i++) {
-    shm_.header->write_offset[i] = 0;
-    offset = cras_shm_get_checked_write_offset(&shm_, i);
-    EXPECT_EQ(0, offset) << "Expected valid write offset for buffer " << i;
-
-    shm_.header->write_offset[i] = used_size / 2;
-    offset = cras_shm_get_checked_write_offset(&shm_, i);
-    EXPECT_EQ(used_size / 2, offset)
-        << "Expected valid write offset for buffer " << i;
-
-    shm_.header->write_offset[i] = used_size;
-    offset = cras_shm_get_checked_write_offset(&shm_, i);
-    EXPECT_EQ(used_size, offset)
-        << "Expected valid write offset for buffer " << i;
-
-    // Write offsets should not be greater than used_size.
-    shm_.header->write_offset[i] = used_size + 1;
-    offset = cras_shm_get_checked_write_offset(&shm_, i);
-    EXPECT_EQ(used_size, offset)
-        << "Expected invalid write offset for buffer " << i;
-
-    uint32_t buffer_offset = samples_length - used_size / 2;
-    shm_.header->buffer_offset[i] = buffer_offset;
-
-    shm_.header->write_offset[i] = 0;
-    offset = cras_shm_get_checked_write_offset(&shm_, i);
-    EXPECT_EQ(0, offset) << "Expected valid write offset for buffer " << i;
-
-    shm_.header->write_offset[i] = used_size / 4;
-    offset = cras_shm_get_checked_write_offset(&shm_, i);
-    EXPECT_EQ(used_size / 4, offset)
-        << "Expected valid write offset for buffer " << i;
-
-    shm_.header->write_offset[i] = used_size / 2;
-    offset = cras_shm_get_checked_write_offset(&shm_, i);
-    EXPECT_EQ(used_size / 2, offset)
-        << "Expected valid write offset for buffer " << i;
-
-    // Write offsets should not be longer than the samples area.
-    shm_.header->write_offset[i] = used_size / 2 + 1;
-    offset = cras_shm_get_checked_write_offset(&shm_, i);
-    EXPECT_EQ(samples_length - buffer_offset, offset)
-        << "Expected invalid write offset for buffer " << i;
-
-    shm_.header->write_offset[i] = used_size;
-    offset = cras_shm_get_checked_write_offset(&shm_, i);
-    EXPECT_EQ(samples_length - buffer_offset, offset)
-        << "Expected invalid write offset for buffer " << i;
-
-    shm_.header->write_offset[i] = used_size + 1;
-    offset = cras_shm_get_checked_write_offset(&shm_, i);
-    EXPECT_EQ(samples_length - buffer_offset, offset)
-        << "Expected invalid write offset for buffer " << i;
-  }
-}
-
-}  //  namespace
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tests/softvol_curve_unittest.cc b/cras/src/tests/softvol_curve_unittest.cc
deleted file mode 100644
index d144458..0000000
--- a/cras/src/tests/softvol_curve_unittest.cc
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <gtest/gtest.h>
-#include <stdio.h>
-
-extern "C" {
-#include "softvol_curve.h"
-}
-
-namespace {
-
-static float ABS_ERROR = 0.0000001;
-
-TEST(SoftvolCurveTest, ScalerDecibelConvert) {
-  float scaler;
-  scaler = convert_softvol_scaler_from_dB(-2000);
-  EXPECT_NEAR(scaler, 0.1f, ABS_ERROR);
-  scaler = convert_softvol_scaler_from_dB(-1000);
-  EXPECT_NEAR(scaler, 0.3162277f, ABS_ERROR);
-  scaler = convert_softvol_scaler_from_dB(-4000);
-  EXPECT_NEAR(scaler, 0.01f, ABS_ERROR);
-  scaler = convert_softvol_scaler_from_dB(-3500);
-  EXPECT_NEAR(scaler, 0.0177828f, ABS_ERROR);
-}
-
-}  //  namespace
-
-/* Stubs */
-extern "C" {}  // extern "C"
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tests/stream_list_unittest.cc b/cras/src/tests/stream_list_unittest.cc
deleted file mode 100644
index 500774f..0000000
--- a/cras/src/tests/stream_list_unittest.cc
+++ /dev/null
@@ -1,216 +0,0 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <gtest/gtest.h>
-#include <stdio.h>
-
-extern "C" {
-#include "cras_rstream.h"
-#include "stream_list.h"
-}
-
-namespace {
-
-static unsigned int add_called;
-static int added_cb(struct cras_rstream* rstream) {
-  add_called++;
-  return 0;
-}
-
-static unsigned int rm_called;
-static struct cras_rstream* rmed_stream;
-static int removed_cb(struct cras_rstream* rstream) {
-  rm_called++;
-  rmed_stream = rstream;
-  return 0;
-}
-
-static unsigned int create_called;
-static struct cras_rstream_config* create_config;
-static int create_rstream_cb(struct cras_rstream_config* stream_config,
-                             struct cras_rstream** stream) {
-  create_called++;
-  create_config = stream_config;
-  *stream = (struct cras_rstream*)malloc(sizeof(struct cras_rstream));
-  (*stream)->stream_id = stream_config->stream_id;
-  (*stream)->direction = stream_config->direction;
-  if (stream_config->format)
-    (*stream)->format = *(stream_config->format);
-  (*stream)->cb_threshold = stream_config->cb_threshold;
-  (*stream)->client_type = stream_config->client_type;
-  (*stream)->stream_type = stream_config->stream_type;
-  clock_gettime(CLOCK_MONOTONIC_RAW, &(*stream)->start_ts);
-
-  return 0;
-}
-
-static unsigned int destroy_called;
-static struct cras_rstream* destroyed_stream;
-static void destroy_rstream_cb(struct cras_rstream* rstream) {
-  destroy_called++;
-  destroyed_stream = rstream;
-  free(rstream);
-}
-
-static void reset_test_data() {
-  add_called = 0;
-  rm_called = 0;
-  create_called = 0;
-  destroy_called = 0;
-}
-
-TEST(StreamList, AddRemove) {
-  struct stream_list* l;
-  struct cras_rstream* s1;
-  struct cras_rstream_config s1_config;
-
-  s1_config.stream_id = 0x3003;
-  s1_config.direction = CRAS_STREAM_OUTPUT;
-  s1_config.format = NULL;
-
-  reset_test_data();
-  l = stream_list_create(added_cb, removed_cb, create_rstream_cb,
-                         destroy_rstream_cb, NULL);
-  stream_list_add(l, &s1_config, &s1);
-  EXPECT_EQ(1, add_called);
-  EXPECT_EQ(1, create_called);
-  EXPECT_EQ(&s1_config, create_config);
-  EXPECT_EQ(0, stream_list_rm(l, 0x3003));
-  EXPECT_EQ(1, rm_called);
-  EXPECT_EQ(s1, rmed_stream);
-  EXPECT_EQ(1, destroy_called);
-  EXPECT_EQ(s1, destroyed_stream);
-  stream_list_destroy(l);
-}
-
-TEST(StreamList, AddInDescendingOrderByChannels) {
-  struct stream_list* l;
-  struct cras_rstream* s1;
-  struct cras_rstream* s2;
-  struct cras_rstream* s3;
-  struct cras_audio_format s1_format, s2_format, s3_format;
-  struct cras_rstream_config s1_config, s2_config, s3_config;
-
-  s1_config.stream_id = 0x4001;
-  s1_config.direction = CRAS_STREAM_INPUT;
-  s1_format.num_channels = 6;
-  s1_config.format = &s1_format;
-
-  s2_config.stream_id = 0x4002;
-  s2_config.direction = CRAS_STREAM_OUTPUT;
-  s2_format.num_channels = 8;
-  s2_config.format = &s2_format;
-
-  s3_config.stream_id = 0x4003;
-  s3_config.direction = CRAS_STREAM_OUTPUT;
-  s3_format.num_channels = 2;
-  s3_config.format = &s3_format;
-
-  reset_test_data();
-  l = stream_list_create(added_cb, removed_cb, create_rstream_cb,
-                         destroy_rstream_cb, NULL);
-  stream_list_add(l, &s1_config, &s1);
-  EXPECT_EQ(1, add_called);
-  EXPECT_EQ(1, create_called);
-  EXPECT_EQ(6, stream_list_get(l)->format.num_channels);
-
-  stream_list_add(l, &s2_config, &s2);
-  EXPECT_EQ(2, add_called);
-  EXPECT_EQ(2, create_called);
-  EXPECT_EQ(8, stream_list_get(l)->format.num_channels);
-  EXPECT_EQ(6, stream_list_get(l)->next->format.num_channels);
-
-  stream_list_add(l, &s3_config, &s3);
-  EXPECT_EQ(3, add_called);
-  EXPECT_EQ(3, create_called);
-  EXPECT_EQ(8, stream_list_get(l)->format.num_channels);
-  EXPECT_EQ(6, stream_list_get(l)->next->format.num_channels);
-  EXPECT_EQ(2, stream_list_get(l)->next->next->format.num_channels);
-  EXPECT_EQ(0, stream_list_rm(l, 0x4001));
-  EXPECT_EQ(0, stream_list_rm(l, 0x4002));
-  EXPECT_EQ(0, stream_list_rm(l, 0x4003));
-  stream_list_destroy(l);
-}
-
-TEST(StreamList, DetectRtcStreamPair) {
-  struct stream_list* l;
-  struct cras_rstream *s1, *s2, *s3, *s4;
-  struct cras_rstream_config s1_config, s2_config, s3_config, s4_config;
-
-  s1_config.stream_id = 0x5001;
-  s1_config.direction = CRAS_STREAM_OUTPUT;
-  s1_config.cb_threshold = 480;
-  s1_config.client_type = CRAS_CLIENT_TYPE_CHROME;
-  s1_config.stream_type = CRAS_STREAM_TYPE_DEFAULT;
-  s1_config.format = NULL;
-
-  s2_config.stream_id = 0x5002;
-  s2_config.direction = CRAS_STREAM_INPUT;
-  s2_config.cb_threshold = 480;
-  s2_config.client_type = CRAS_CLIENT_TYPE_CHROME;
-  s2_config.stream_type = CRAS_STREAM_TYPE_DEFAULT;
-  s2_config.format = NULL;
-
-  // s3 is not a RTC stream because the cb threshold is not 480.
-  s3_config.stream_id = 0x5003;
-  s3_config.direction = CRAS_STREAM_INPUT;
-  s3_config.cb_threshold = 500;
-  s3_config.client_type = CRAS_CLIENT_TYPE_CHROME;
-  s3_config.stream_type = CRAS_STREAM_TYPE_DEFAULT;
-  s3_config.format = NULL;
-
-  // s4 is not a RTC stream because it is not from the same client with s1.
-  s4_config.stream_id = 0x5004;
-  s4_config.direction = CRAS_STREAM_INPUT;
-  s4_config.cb_threshold = 480;
-  s4_config.client_type = CRAS_CLIENT_TYPE_LACROS;
-  s4_config.stream_type = CRAS_STREAM_TYPE_DEFAULT;
-  s4_config.format = NULL;
-
-  reset_test_data();
-  l = stream_list_create(added_cb, removed_cb, create_rstream_cb,
-                         destroy_rstream_cb, NULL);
-  stream_list_add(l, &s1_config, &s1);
-  EXPECT_EQ(1, add_called);
-  EXPECT_EQ(1, create_called);
-  EXPECT_EQ(&s1_config, create_config);
-
-  stream_list_add(l, &s2_config, &s2);
-  detect_rtc_stream_pair(l, s2);
-  stream_list_add(l, &s3_config, &s3);
-  detect_rtc_stream_pair(l, s3);
-  stream_list_add(l, &s4_config, &s4);
-  detect_rtc_stream_pair(l, s4);
-
-  EXPECT_EQ(CRAS_STREAM_TYPE_VOICE_COMMUNICATION, s1->stream_type);
-  EXPECT_EQ(CRAS_STREAM_TYPE_VOICE_COMMUNICATION, s2->stream_type);
-  EXPECT_EQ(CRAS_STREAM_TYPE_DEFAULT, s3->stream_type);
-  EXPECT_EQ(CRAS_STREAM_TYPE_DEFAULT, s4->stream_type);
-
-  EXPECT_EQ(0, stream_list_rm(l, 0x5001));
-  EXPECT_EQ(0, stream_list_rm(l, 0x5002));
-  EXPECT_EQ(0, stream_list_rm(l, 0x5003));
-  EXPECT_EQ(0, stream_list_rm(l, 0x5004));
-  stream_list_destroy(l);
-}
-
-extern "C" {
-
-struct cras_timer* cras_tm_create_timer(struct cras_tm* tm,
-                                        unsigned int ms,
-                                        void (*cb)(struct cras_timer* t,
-                                                   void* data),
-                                        void* cb_data) {
-  return reinterpret_cast<struct cras_timer*>(0x404);
-}
-
-void cras_tm_cancel_timer(struct cras_tm* tm, struct cras_timer* t) {}
-}
-
-}  // namespace
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tests/system_state_unittest.cc b/cras/src/tests/system_state_unittest.cc
deleted file mode 100644
index 45224bc..0000000
--- a/cras/src/tests/system_state_unittest.cc
+++ /dev/null
@@ -1,576 +0,0 @@
-// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <gtest/gtest.h>
-#include <stdio.h>
-#include <string.h>
-
-extern "C" {
-#include "cras_alert.h"
-#include "cras_board_config.h"
-#include "cras_shm.h"
-#include "cras_system_state.h"
-#include "cras_types.h"
-}
-
-namespace {
-static struct cras_alsa_card* kFakeAlsaCard;
-size_t cras_alsa_card_create_called;
-size_t cras_alsa_card_destroy_called;
-static size_t add_stub_called;
-static size_t rm_stub_called;
-static size_t add_task_stub_called;
-static size_t callback_stub_called;
-static void* select_data_value;
-static void* task_data_value;
-static size_t add_callback_called;
-static cras_alert_cb add_callback_cb;
-static void* add_callback_arg;
-static size_t rm_callback_called;
-static cras_alert_cb rm_callback_cb;
-static void* rm_callback_arg;
-static size_t alert_pending_called;
-static char* device_config_dir;
-static const char* cras_alsa_card_config_dir;
-static size_t cras_observer_notify_output_volume_called;
-static size_t cras_observer_notify_output_mute_called;
-static size_t cras_observer_notify_capture_mute_called;
-static size_t cras_observer_notify_suspend_changed_called;
-static size_t cras_observer_notify_num_active_streams_called;
-static size_t cras_observer_notify_input_streams_with_permission_called;
-static size_t cras_iodev_list_reset_for_noise_cancellation_called;
-static struct cras_board_config fake_board_config;
-static size_t cras_alert_process_all_pending_alerts_called;
-
-static void ResetStubData() {
-  cras_alsa_card_create_called = 0;
-  cras_alsa_card_destroy_called = 0;
-  kFakeAlsaCard = reinterpret_cast<struct cras_alsa_card*>(0x33);
-  add_stub_called = 0;
-  rm_stub_called = 0;
-  add_task_stub_called = 0;
-  callback_stub_called = 0;
-  add_callback_called = 0;
-  rm_callback_called = 0;
-  alert_pending_called = 0;
-  device_config_dir = NULL;
-  cras_alsa_card_config_dir = NULL;
-  cras_observer_notify_output_volume_called = 0;
-  cras_observer_notify_output_mute_called = 0;
-  cras_observer_notify_capture_mute_called = 0;
-  cras_observer_notify_suspend_changed_called = 0;
-  cras_observer_notify_num_active_streams_called = 0;
-  cras_observer_notify_input_streams_with_permission_called = 0;
-  cras_alert_process_all_pending_alerts_called = 0;
-  cras_iodev_list_reset_for_noise_cancellation_called = 0;
-  memset(&fake_board_config, 0, sizeof(fake_board_config));
-}
-
-static int add_stub(int fd,
-                    void (*cb)(void* data, int revents),
-                    void* callback_data,
-                    int events,
-                    void* select_data) {
-  add_stub_called++;
-  select_data_value = select_data;
-  return 0;
-}
-
-static void rm_stub(int fd, void* select_data) {
-  rm_stub_called++;
-  select_data_value = select_data;
-}
-
-static int add_task_stub(void (*cb)(void* data),
-                         void* callback_data,
-                         void* task_data) {
-  add_task_stub_called++;
-  task_data_value = task_data;
-  return 0;
-}
-
-static void callback_stub(void* data, int revents) {
-  callback_stub_called++;
-}
-
-static void task_stub(void* data) {
-  callback_stub_called++;
-}
-
-static void do_sys_init() {
-  char* shm_name;
-  ASSERT_GT(asprintf(&shm_name, "/cras-%d", getpid()), 0);
-  int rw_shm_fd;
-  int ro_shm_fd;
-  struct cras_server_state* exp_state =
-      (struct cras_server_state*)cras_shm_setup(shm_name, sizeof(*exp_state),
-                                                &rw_shm_fd, &ro_shm_fd);
-  if (!exp_state)
-    exit(-1);
-  cras_system_state_init(device_config_dir, shm_name, rw_shm_fd, ro_shm_fd,
-                         exp_state, sizeof(*exp_state));
-  free(shm_name);
-}
-
-TEST(SystemStateSuite, DefaultVolume) {
-  do_sys_init();
-  EXPECT_EQ(100, cras_system_get_volume());
-  EXPECT_EQ(0, cras_system_get_mute());
-  EXPECT_EQ(0, cras_system_get_capture_mute());
-  cras_system_state_deinit();
-}
-
-TEST(SystemStateSuite, SetVolume) {
-  do_sys_init();
-  cras_system_set_volume(0);
-  EXPECT_EQ(0, cras_system_get_volume());
-  cras_system_set_volume(50);
-  EXPECT_EQ(50, cras_system_get_volume());
-  cras_system_set_volume(CRAS_MAX_SYSTEM_VOLUME);
-  EXPECT_EQ(CRAS_MAX_SYSTEM_VOLUME, cras_system_get_volume());
-  cras_system_set_volume(CRAS_MAX_SYSTEM_VOLUME + 1);
-  EXPECT_EQ(CRAS_MAX_SYSTEM_VOLUME, cras_system_get_volume());
-  cras_system_state_deinit();
-  EXPECT_EQ(4, cras_observer_notify_output_volume_called);
-}
-
-TEST(SystemStateSuite, SetMinMaxVolume) {
-  do_sys_init();
-  cras_system_set_volume_limits(-10000, -600);
-  EXPECT_EQ(-10000, cras_system_get_min_volume());
-  EXPECT_EQ(-600, cras_system_get_max_volume());
-  cras_system_state_deinit();
-}
-
-TEST(SystemStateSuite, SetUserMute) {
-  ResetStubData();
-  do_sys_init();
-
-  EXPECT_EQ(0, cras_system_get_mute());
-
-  cras_system_set_user_mute(0);
-  EXPECT_EQ(0, cras_system_get_mute());
-  EXPECT_EQ(0, cras_observer_notify_output_mute_called);
-
-  cras_system_set_user_mute(1);
-  EXPECT_EQ(1, cras_system_get_mute());
-  EXPECT_EQ(1, cras_observer_notify_output_mute_called);
-
-  cras_system_set_user_mute(22);
-  EXPECT_EQ(1, cras_system_get_mute());
-  EXPECT_EQ(1, cras_observer_notify_output_mute_called);
-
-  cras_system_state_deinit();
-}
-
-TEST(SystemStateSuite, SetMute) {
-  ResetStubData();
-  do_sys_init();
-
-  EXPECT_EQ(0, cras_system_get_mute());
-
-  cras_system_set_mute(0);
-  EXPECT_EQ(0, cras_system_get_mute());
-  EXPECT_EQ(0, cras_observer_notify_output_mute_called);
-
-  cras_system_set_mute(1);
-  EXPECT_EQ(1, cras_system_get_mute());
-  EXPECT_EQ(1, cras_observer_notify_output_mute_called);
-
-  cras_system_set_mute(22);
-  EXPECT_EQ(1, cras_system_get_mute());
-  EXPECT_EQ(1, cras_observer_notify_output_mute_called);
-
-  cras_system_state_deinit();
-}
-
-TEST(SystemStateSuite, SetSystemMuteThenSwitchUserMute) {
-  ResetStubData();
-  do_sys_init();
-
-  EXPECT_EQ(0, cras_system_get_mute());
-
-  // Set system mute.
-  cras_system_set_mute(1);
-
-  // Switching user mute will not notify observer.
-  EXPECT_EQ(1, cras_observer_notify_output_mute_called);
-  cras_system_set_user_mute(1);
-  EXPECT_EQ(1, cras_observer_notify_output_mute_called);
-  cras_system_set_user_mute(0);
-  EXPECT_EQ(1, cras_observer_notify_output_mute_called);
-
-  // Unset system mute.
-  cras_system_set_mute(0);
-  EXPECT_EQ(2, cras_observer_notify_output_mute_called);
-
-  cras_system_state_deinit();
-}
-
-TEST(SystemStateSuite, SetUserMuteThenSwitchSystemMute) {
-  ResetStubData();
-  do_sys_init();
-
-  EXPECT_EQ(0, cras_system_get_mute());
-
-  // Set user mute.
-  cras_system_set_user_mute(1);
-
-  // Switching system mute will not notify observer.
-  EXPECT_EQ(1, cras_observer_notify_output_mute_called);
-  cras_system_set_mute(1);
-  EXPECT_EQ(1, cras_observer_notify_output_mute_called);
-  cras_system_set_mute(0);
-  EXPECT_EQ(1, cras_observer_notify_output_mute_called);
-
-  // Unset user mute.
-  cras_system_set_user_mute(0);
-  EXPECT_EQ(2, cras_observer_notify_output_mute_called);
-
-  cras_system_state_deinit();
-}
-
-TEST(SystemStateSuite, CaptureMuteChangedCallbackMultiple) {
-  do_sys_init();
-  ResetStubData();
-
-  cras_system_set_capture_mute(1);
-  EXPECT_EQ(1, cras_system_get_capture_mute());
-  EXPECT_EQ(1, cras_observer_notify_capture_mute_called);
-  cras_system_set_capture_mute(0);
-  EXPECT_EQ(0, cras_system_get_capture_mute());
-  EXPECT_EQ(2, cras_observer_notify_capture_mute_called);
-
-  cras_system_state_deinit();
-}
-
-TEST(SystemStateSuite, MuteLocked) {
-  do_sys_init();
-  ResetStubData();
-
-  cras_system_set_mute(1);
-  EXPECT_EQ(1, cras_system_get_mute());
-  EXPECT_EQ(0, cras_system_get_mute_locked());
-  EXPECT_EQ(1, cras_observer_notify_output_mute_called);
-
-  cras_system_set_mute_locked(1);
-  cras_system_set_mute(0);
-  EXPECT_EQ(1, cras_system_get_mute());
-  EXPECT_EQ(1, cras_system_get_mute_locked());
-  EXPECT_EQ(1, cras_observer_notify_output_mute_called);
-
-  cras_system_set_capture_mute(1);
-  EXPECT_EQ(1, cras_system_get_capture_mute());
-  EXPECT_EQ(0, cras_system_get_capture_mute_locked());
-  EXPECT_EQ(1, cras_observer_notify_capture_mute_called);
-
-  cras_system_set_capture_mute_locked(1);
-  cras_system_set_capture_mute(0);
-  EXPECT_EQ(1, cras_system_get_capture_mute());
-  EXPECT_EQ(1, cras_system_get_capture_mute_locked());
-  cras_system_state_deinit();
-  EXPECT_EQ(2, cras_observer_notify_capture_mute_called);
-}
-
-TEST(SystemStateSuite, Suspend) {
-  do_sys_init();
-  ResetStubData();
-
-  cras_system_set_suspended(1);
-  EXPECT_EQ(1, cras_observer_notify_suspend_changed_called);
-  EXPECT_EQ(1, cras_alert_process_all_pending_alerts_called);
-  EXPECT_EQ(1, cras_system_get_suspended());
-
-  cras_system_set_suspended(0);
-  EXPECT_EQ(2, cras_observer_notify_suspend_changed_called);
-  EXPECT_EQ(0, cras_system_get_suspended());
-
-  cras_system_state_deinit();
-}
-
-TEST(SystemStateSuite, AddCardFailCreate) {
-  ResetStubData();
-  kFakeAlsaCard = NULL;
-  cras_alsa_card_info info;
-
-  info.card_type = ALSA_CARD_TYPE_INTERNAL;
-  info.card_index = 0;
-  do_sys_init();
-  EXPECT_EQ(-ENOMEM, cras_system_add_alsa_card(&info));
-  EXPECT_EQ(1, cras_alsa_card_create_called);
-  EXPECT_EQ(cras_alsa_card_config_dir, device_config_dir);
-  cras_system_state_deinit();
-}
-
-TEST(SystemStateSuite, AddCard) {
-  ResetStubData();
-  cras_alsa_card_info info;
-
-  info.card_type = ALSA_CARD_TYPE_INTERNAL;
-  info.card_index = 0;
-  do_sys_init();
-  EXPECT_EQ(0, cras_system_add_alsa_card(&info));
-  EXPECT_EQ(1, cras_alsa_card_create_called);
-  EXPECT_EQ(cras_alsa_card_config_dir, device_config_dir);
-  // Adding the same card again should fail.
-  ResetStubData();
-  EXPECT_NE(0, cras_system_add_alsa_card(&info));
-  EXPECT_EQ(0, cras_alsa_card_create_called);
-  // Removing card should destroy it.
-  cras_system_remove_alsa_card(0);
-  EXPECT_EQ(1, cras_alsa_card_destroy_called);
-  cras_system_state_deinit();
-}
-
-TEST(SystemSettingsRegisterSelectDescriptor, AddSelectFd) {
-  void* stub_data = reinterpret_cast<void*>(44);
-  void* select_data = reinterpret_cast<void*>(33);
-  int rc;
-
-  ResetStubData();
-  do_sys_init();
-  rc = cras_system_add_select_fd(7, callback_stub, stub_data, POLLIN);
-  EXPECT_NE(0, rc);
-  EXPECT_EQ(0, add_stub_called);
-  EXPECT_EQ(0, rm_stub_called);
-  rc = cras_system_set_select_handler(add_stub, rm_stub, select_data);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(0, add_stub_called);
-  EXPECT_EQ(0, rm_stub_called);
-  rc = cras_system_set_select_handler(add_stub, rm_stub, select_data);
-  EXPECT_EQ(-EEXIST, rc);
-  EXPECT_EQ(0, add_stub_called);
-  EXPECT_EQ(0, rm_stub_called);
-  rc = cras_system_add_select_fd(7, callback_stub, stub_data, POLLIN);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(1, add_stub_called);
-  EXPECT_EQ(select_data, select_data_value);
-  cras_system_rm_select_fd(7);
-  EXPECT_EQ(1, rm_stub_called);
-  EXPECT_EQ(0, callback_stub_called);
-  EXPECT_EQ(select_data, select_data_value);
-  cras_system_state_deinit();
-}
-
-TEST(SystemSettingsAddTask, AddTask) {
-  void* stub_data = reinterpret_cast<void*>(44);
-  void* task_data = reinterpret_cast<void*>(33);
-  int rc;
-
-  do_sys_init();
-  rc = cras_system_add_task(task_stub, stub_data);
-  EXPECT_NE(0, rc);
-  EXPECT_EQ(0, add_task_stub_called);
-  rc = cras_system_set_add_task_handler(add_task_stub, task_data);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(0, add_task_stub_called);
-  rc = cras_system_add_task(task_stub, stub_data);
-  EXPECT_EQ(0, rc);
-  EXPECT_EQ(1, add_task_stub_called);
-  EXPECT_EQ(task_data, task_data_value);
-
-  cras_system_state_deinit();
-}
-
-TEST(SystemSettingsStreamCount, StreamCount) {
-  ResetStubData();
-  do_sys_init();
-
-  EXPECT_EQ(0, cras_system_state_get_active_streams());
-  cras_system_state_stream_added(CRAS_STREAM_OUTPUT, CRAS_CLIENT_TYPE_CHROME);
-  EXPECT_EQ(1, cras_system_state_get_active_streams());
-  struct cras_timespec ts1;
-  cras_system_state_get_last_stream_active_time(&ts1);
-  cras_system_state_stream_removed(CRAS_STREAM_OUTPUT, CRAS_CLIENT_TYPE_CHROME);
-  EXPECT_EQ(0, cras_system_state_get_active_streams());
-  struct cras_timespec ts2;
-  cras_system_state_get_last_stream_active_time(&ts2);
-  EXPECT_NE(0, memcmp(&ts1, &ts2, sizeof(ts1)));
-  cras_system_state_deinit();
-}
-
-TEST(SystemSettingsStreamCount, StreamCountByDirection) {
-  ResetStubData();
-  do_sys_init();
-
-  EXPECT_EQ(0, cras_system_state_get_active_streams());
-  cras_system_state_stream_added(CRAS_STREAM_OUTPUT, CRAS_CLIENT_TYPE_CHROME);
-  cras_system_state_stream_added(CRAS_STREAM_INPUT, CRAS_CLIENT_TYPE_CHROME);
-  cras_system_state_stream_added(CRAS_STREAM_POST_MIX_PRE_DSP,
-                                 CRAS_CLIENT_TYPE_CHROME);
-  EXPECT_EQ(1, cras_observer_notify_input_streams_with_permission_called);
-  EXPECT_EQ(
-      1, cras_system_state_get_active_streams_by_direction(CRAS_STREAM_OUTPUT));
-  EXPECT_EQ(
-      1, cras_system_state_get_active_streams_by_direction(CRAS_STREAM_INPUT));
-  EXPECT_EQ(1, cras_system_state_get_active_streams_by_direction(
-                   CRAS_STREAM_POST_MIX_PRE_DSP));
-  EXPECT_EQ(3, cras_system_state_get_active_streams());
-  EXPECT_EQ(3, cras_observer_notify_num_active_streams_called);
-  cras_system_state_stream_removed(CRAS_STREAM_OUTPUT, CRAS_CLIENT_TYPE_CHROME);
-  cras_system_state_stream_removed(CRAS_STREAM_INPUT, CRAS_CLIENT_TYPE_CHROME);
-  cras_system_state_stream_removed(CRAS_STREAM_POST_MIX_PRE_DSP,
-                                   CRAS_CLIENT_TYPE_CHROME);
-  EXPECT_EQ(2, cras_observer_notify_input_streams_with_permission_called);
-  EXPECT_EQ(
-      0, cras_system_state_get_active_streams_by_direction(CRAS_STREAM_OUTPUT));
-  EXPECT_EQ(
-      0, cras_system_state_get_active_streams_by_direction(CRAS_STREAM_INPUT));
-  EXPECT_EQ(0, cras_system_state_get_active_streams_by_direction(
-                   CRAS_STREAM_POST_MIX_PRE_DSP));
-  EXPECT_EQ(0, cras_system_state_get_active_streams());
-  EXPECT_EQ(6, cras_observer_notify_num_active_streams_called);
-
-  cras_system_state_deinit();
-}
-
-TEST(SystemStateSuite, IgnoreUCMSuffix) {
-  fake_board_config.ucm_ignore_suffix = strdup("TEST1,TEST2,TEST3");
-  do_sys_init();
-
-  EXPECT_EQ(1, cras_system_check_ignore_ucm_suffix("TEST1"));
-  EXPECT_EQ(1, cras_system_check_ignore_ucm_suffix("TEST2"));
-  EXPECT_EQ(1, cras_system_check_ignore_ucm_suffix("TEST3"));
-  EXPECT_EQ(0, cras_system_check_ignore_ucm_suffix("TEST4"));
-  cras_system_state_deinit();
-}
-
-TEST(SystemStateSuite, SetNoiseCancellationEnabled) {
-  ResetStubData();
-  do_sys_init();
-
-  EXPECT_EQ(0, cras_system_get_noise_cancellation_enabled());
-
-  cras_system_set_noise_cancellation_enabled(0);
-  EXPECT_EQ(0, cras_system_get_noise_cancellation_enabled());
-  EXPECT_EQ(0, cras_iodev_list_reset_for_noise_cancellation_called);
-
-  cras_system_set_noise_cancellation_enabled(1);
-  EXPECT_EQ(1, cras_system_get_noise_cancellation_enabled());
-  EXPECT_EQ(1, cras_iodev_list_reset_for_noise_cancellation_called);
-
-  cras_system_set_noise_cancellation_enabled(1);
-  EXPECT_EQ(1, cras_system_get_noise_cancellation_enabled());
-  // cras_iodev_list_reset_for_noise_cancellation shouldn't be called if state
-  // is already enabled/disabled.
-  EXPECT_EQ(1, cras_iodev_list_reset_for_noise_cancellation_called);
-
-  cras_system_set_noise_cancellation_enabled(0);
-  EXPECT_EQ(0, cras_system_get_noise_cancellation_enabled());
-  EXPECT_EQ(2, cras_iodev_list_reset_for_noise_cancellation_called);
-
-  cras_system_state_deinit();
-}
-
-extern "C" {
-
-struct cras_alsa_card* cras_alsa_card_create(
-    struct cras_alsa_card_info* info,
-    const char* device_config_dir,
-    struct cras_device_blocklist* blocklist) {
-  cras_alsa_card_create_called++;
-  cras_alsa_card_config_dir = device_config_dir;
-  return kFakeAlsaCard;
-}
-
-void cras_alsa_card_destroy(struct cras_alsa_card* alsa_card) {
-  cras_alsa_card_destroy_called++;
-}
-
-size_t cras_alsa_card_get_index(const struct cras_alsa_card* alsa_card) {
-  return 0;
-}
-
-struct cras_device_blocklist* cras_device_blocklist_create(
-    const char* config_path) {
-  return NULL;
-}
-
-void cras_device_blocklist_destroy(struct cras_device_blocklist* blocklist) {}
-
-struct cras_alert* cras_alert_create(cras_alert_prepare prepare,
-                                     unsigned int flags) {
-  return NULL;
-}
-
-void cras_alert_destroy(struct cras_alert* alert) {}
-
-int cras_alert_add_callback(struct cras_alert* alert,
-                            cras_alert_cb cb,
-                            void* arg) {
-  add_callback_called++;
-  add_callback_cb = cb;
-  add_callback_arg = arg;
-  return 0;
-}
-
-int cras_alert_rm_callback(struct cras_alert* alert,
-                           cras_alert_cb cb,
-                           void* arg) {
-  rm_callback_called++;
-  rm_callback_cb = cb;
-  rm_callback_arg = arg;
-  return 0;
-}
-
-void cras_alert_pending(struct cras_alert* alert) {
-  alert_pending_called++;
-}
-
-cras_tm* cras_tm_init() {
-  return static_cast<cras_tm*>(malloc(sizeof(unsigned int)));
-}
-
-void cras_tm_deinit(cras_tm* tm) {
-  free(tm);
-}
-
-void cras_observer_notify_output_volume(int32_t volume) {
-  cras_observer_notify_output_volume_called++;
-}
-
-void cras_observer_notify_output_mute(int muted,
-                                      int user_muted,
-                                      int mute_locked) {
-  cras_observer_notify_output_mute_called++;
-}
-
-void cras_observer_notify_capture_mute(int muted, int mute_locked) {
-  cras_observer_notify_capture_mute_called++;
-}
-
-void cras_observer_notify_suspend_changed(int suspended) {
-  cras_observer_notify_suspend_changed_called++;
-}
-
-void cras_observer_notify_num_active_streams(enum CRAS_STREAM_DIRECTION dir,
-                                             uint32_t num_active_streams) {
-  cras_observer_notify_num_active_streams_called++;
-}
-
-void cras_observer_notify_input_streams_with_permission(
-    uint32_t num_input_streams[CRAS_NUM_CLIENT_TYPE]) {
-  cras_observer_notify_input_streams_with_permission_called++;
-}
-
-void cras_board_config_get(const char* config_path,
-                           struct cras_board_config* board_config) {
-  *board_config = fake_board_config;
-}
-
-void cras_alert_process_all_pending_alerts() {
-  cras_alert_process_all_pending_alerts_called++;
-}
-
-void cras_iodev_list_reset_for_noise_cancellation() {
-  cras_iodev_list_reset_for_noise_cancellation_called++;
-}
-
-}  // extern "C"
-}  // namespace
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tests/timing_unittest.cc b/cras/src/tests/timing_unittest.cc
deleted file mode 100644
index 964f30c..0000000
--- a/cras/src/tests/timing_unittest.cc
+++ /dev/null
@@ -1,1246 +0,0 @@
-// Copyright 2017 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <gtest/gtest.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <syslog.h>
-#include <time.h>
-
-#include <memory>
-
-extern "C" {
-#include "cras_iodev.h"    // stubbed
-#include "cras_rstream.h"  // stubbed
-#include "cras_shm.h"
-#include "cras_types.h"
-#include "dev_io.h"      // tested
-#include "dev_stream.h"  // tested
-#include "utlist.h"
-
-struct audio_thread_event_log* atlog;
-}
-
-#include "dev_io_stubs.h"
-#include "iodev_stub.h"
-#include "metrics_stub.h"
-#include "rstream_stub.h"
-
-#define FAKE_POLL_FD 33
-
-namespace {
-
-class TimingSuite : public testing::Test {
- protected:
-  virtual void SetUp() {
-    atlog = static_cast<audio_thread_event_log*>(calloc(1, sizeof(*atlog)));
-    iodev_stub_reset();
-    rstream_stub_reset();
-  }
-
-  virtual void TearDown() { free(atlog); }
-
-  timespec SingleInputDevNextWake(
-      size_t dev_cb_threshold,
-      size_t dev_level,
-      const timespec* level_timestamp,
-      cras_audio_format* dev_format,
-      const std::vector<StreamPtr>& streams,
-      CRAS_NODE_TYPE active_node_type = CRAS_NODE_TYPE_MIC) {
-    struct open_dev* dev_list_ = NULL;
-
-    DevicePtr dev = create_device(CRAS_STREAM_INPUT, dev_cb_threshold,
-                                  dev_format, active_node_type);
-    dev->dev->input_streaming = true;
-    DL_APPEND(dev_list_, dev->odev.get());
-
-    for (auto const& stream : streams) {
-      add_stream_to_dev(dev->dev, stream);
-    }
-
-    // Set response for frames_queued.
-    iodev_stub_frames_queued(dev->dev.get(), dev_level, *level_timestamp);
-
-    dev_io_send_captured_samples(dev_list_);
-
-    struct timespec dev_time;
-    dev_time.tv_sec = level_timestamp->tv_sec + 500;  // Far in the future.
-    dev_io_next_input_wake(&dev_list_, &dev_time);
-    return dev_time;
-  }
-
-  timespec SingleOutputDevNextWake(
-      size_t dev_cb_threshold,
-      size_t dev_level,
-      const timespec* level_timestamp,
-      cras_audio_format* dev_format,
-      const std::vector<StreamPtr>& streams,
-      const timespec* dev_wake_ts,
-      CRAS_NODE_TYPE active_node_type = CRAS_NODE_TYPE_HEADPHONE) {
-    struct open_dev* dev_list_ = NULL;
-
-    DevicePtr dev = create_device(CRAS_STREAM_OUTPUT, dev_cb_threshold,
-                                  dev_format, active_node_type);
-    DL_APPEND(dev_list_, dev->odev.get());
-
-    for (auto const& stream : streams) {
-      add_stream_to_dev(dev->dev, stream);
-    }
-
-    dev->odev->wake_ts = *dev_wake_ts;
-
-    // Set response for frames_queued.
-    iodev_stub_frames_queued(dev->dev.get(), dev_level, *level_timestamp);
-
-    struct timespec dev_time;
-    dev_time.tv_sec = level_timestamp->tv_sec + 500;  // Far in the future.
-    dev_io_next_output_wake(&dev_list_, &dev_time);
-    return dev_time;
-  }
-};
-
-extern "C" {
-//  From librt. Fix now at this time.
-int clock_gettime(clockid_t clk_id, struct timespec* tp) {
-  tp->tv_sec = 12345;
-  tp->tv_nsec = 987654321;
-  return 0;
-}
-};
-
-// Add a new input stream, make sure the initial next_cb_ts is 0.
-TEST_F(TimingSuite, NewInputStreamInit) {
-  struct open_dev* odev_list_ = NULL;
-  struct open_dev* idev_list_ = NULL;
-
-  cras_audio_format format;
-  fill_audio_format(&format, 48000);
-  DevicePtr dev =
-      create_device(CRAS_STREAM_INPUT, 1024, &format, CRAS_NODE_TYPE_MIC);
-  DL_APPEND(idev_list_, dev->odev.get());
-  struct cras_iodev* iodev = dev->odev->dev;
-
-  ShmPtr shm = create_shm(480);
-  RstreamPtr rstream =
-      create_rstream(1, CRAS_STREAM_INPUT, 480, &format, shm.get());
-
-  dev_io_append_stream(&odev_list_, &idev_list_, rstream.get(), &iodev, 1);
-
-  EXPECT_EQ(0, rstream->next_cb_ts.tv_sec);
-  EXPECT_EQ(0, rstream->next_cb_ts.tv_nsec);
-
-  dev_stream_destroy(iodev->streams);
-}
-
-// There is the pseudo code about wake up time for an input device.
-//
-// function set_input_dev_wake_ts(dev):
-//   wake_ts = now + 20s #rule_1
-//
-//   cap_limit = MIN(dev_stream_capture_avail(stream)) for stream on dev
-//
-//   for stream in dev:
-//   wake_ts = MIN(get_input_wake_time(stream, cap_limit), wake_ts)
-//             for stream on dev #rule_2
-//   if cap_limit:
-//     wake_ts = MIN(get_input_dev_max_wake_ts(dev), wake_ts) #rule_3
-//
-//   device.wake_ts = wake_ts
-//
-// function get_input_wake_time(stream, cap_limit):
-//   needed_frames_from_device = dev_stream_capture_avail(stream)
-//
-//   if needed_frames_from_device > cap_limit: #rule_4
-//     return None
-//
-//   if stream is USE_DEV_TIMING and stream is pending reply: #rule_5
-//     return None
-//
-//   time_for_sample = The time when device gets enough samples #rule_6
-//
-//   wake_time_out = MAX(stream.next_cb_ts, time_for_sample) #rule_7
-//
-//   if stream is USE_DEV_TIMING:
-//     wake_time_out =  time_for_sample #rule_8
-//
-//   return wake_time_out
-//
-// function get_input_dev_max_wake_ts(dev):
-//   return MAX(5ms, The time when hw_level = buffer_size / 2) #rule_9
-//
-//
-// dev_stream_capture_avail: The number of frames free to be written to in a
-//                           capture stream.
-//
-// The following unittests will check these logics.
-
-// Test rule_1.
-// The device wake up time should be 20s from now.
-TEST_F(TimingSuite, InputWakeTimeNoStreamWithBigBufferDevice) {
-  cras_audio_format format;
-  fill_audio_format(&format, 48000);
-
-  struct timespec start;
-  clock_gettime(CLOCK_MONOTONIC_RAW, &start);
-
-  std::vector<StreamPtr> streams;
-  timespec dev_time =
-      SingleInputDevNextWake(4800000, 0, &start, &format, streams);
-
-  const timespec add_millis = {20, 0};
-  add_timespecs(&start, &add_millis);
-  EXPECT_EQ(start.tv_sec, dev_time.tv_sec);
-  EXPECT_EQ(start.tv_nsec, dev_time.tv_nsec);
-}
-
-// Test rule_2, rule_4(Stream 1), rule_7(Stream 2)
-// Stream 1: next_cb_ts = now, cb_threshold = 480, dev_offset = 0
-// Stream 2: next_cb_ts = now + 5s, cb_threshold = 480, dev_offset = 200
-// Stream 1 need 480 frames and Stream 2 need 240 frames. So 240 will be the
-// cap_limit and Stream 1 will be ignored. The next wake up time should be
-// the next_cb_ts of stream2.
-TEST_F(TimingSuite, InputWakeTimeTwoStreamsWithFramesInside) {
-  cras_audio_format format;
-  fill_audio_format(&format, 48000);
-  struct timespec start;
-  clock_gettime(CLOCK_MONOTONIC_RAW, &start);
-
-  StreamPtr stream1 = create_stream(1, 1, CRAS_STREAM_INPUT, 480, &format);
-  stream1->rstream->next_cb_ts = start;
-
-  StreamPtr stream2 = create_stream(1, 2, CRAS_STREAM_INPUT, 480, &format);
-  stream2->rstream->next_cb_ts = start;
-  stream2->rstream->next_cb_ts.tv_sec += 5;
-  rstream_stub_dev_offset(stream2->rstream.get(), 1, 200);
-
-  std::vector<StreamPtr> streams;
-  streams.emplace_back(std::move(stream1));
-  streams.emplace_back(std::move(stream2));
-  timespec dev_time =
-      SingleInputDevNextWake(480000, 0, &start, &format, streams);
-
-  EXPECT_EQ(start.tv_sec + 5, dev_time.tv_sec);
-  EXPECT_EQ(start.tv_nsec, dev_time.tv_nsec);
-}
-
-// Test rule_2, rule_7
-// Stream 1: next_cb_ts = now + 2s, cb_threshold = 480, dev_offset = 0
-// Stream 2: next_cb_ts = now + 5s, cb_threshold = 480, dev_offset = 0
-// The audio thread will choose the earliest next_cb_ts because the they have
-// the same value of needed_frames_from_device. The next wake up time should
-// be the next_cb_ts of stream1.
-TEST_F(TimingSuite, InputWakeTimeTwoEmptyStreams) {
-  cras_audio_format format;
-  fill_audio_format(&format, 48000);
-  struct timespec start;
-  clock_gettime(CLOCK_MONOTONIC_RAW, &start);
-
-  StreamPtr stream1 = create_stream(1, 1, CRAS_STREAM_INPUT, 480, &format);
-  stream1->rstream->next_cb_ts = start;
-  stream1->rstream->next_cb_ts.tv_sec += 2;
-
-  StreamPtr stream2 = create_stream(1, 2, CRAS_STREAM_INPUT, 480, &format);
-  stream2->rstream->next_cb_ts = start;
-  stream2->rstream->next_cb_ts.tv_sec += 5;
-
-  std::vector<StreamPtr> streams;
-  streams.emplace_back(std::move(stream1));
-  streams.emplace_back(std::move(stream2));
-  timespec dev_time =
-      SingleInputDevNextWake(480000, 0, &start, &format, streams);
-
-  EXPECT_EQ(start.tv_sec + 2, dev_time.tv_sec);
-  EXPECT_EQ(start.tv_nsec, dev_time.tv_nsec);
-}
-
-// Test rule_3.
-// If cap_limit is zero from stream, input_dev_max_wake_ts should not
-// be taken into account.
-TEST_F(TimingSuite, InputWakeTimeOneFullStreamWithDeviceWakeUp) {
-  cras_audio_format format;
-  fill_audio_format(&format, 48000);
-
-  StreamPtr stream = create_stream(1, 1, CRAS_STREAM_INPUT, 480, &format);
-
-  struct timespec start, stream_wake;
-  clock_gettime(CLOCK_MONOTONIC_RAW, &start);
-
-  // Set the next stream wake to be 10ms from now.
-  const timespec ten_millis = {0, 10 * 1000 * 1000};
-  stream_wake = start;
-  add_timespecs(&stream_wake, &ten_millis);
-  stream->rstream->next_cb_ts = stream_wake;
-
-  // Add fake data so the stream has no room for more data.
-  AddFakeDataToStream(stream.get(), 480);
-
-  std::vector<StreamPtr> streams;
-  streams.emplace_back(std::move(stream));
-  timespec wake_time = SingleInputDevNextWake(240, 0, &start, &format, streams);
-
-  // Input device would wake at 5ms from now, but since stream cap_limit == 0
-  // the final wake_time is determined by stream.
-  EXPECT_EQ(stream_wake.tv_sec, wake_time.tv_sec);
-  EXPECT_EQ(stream_wake.tv_nsec, wake_time.tv_nsec);
-}
-
-// Test rule_3 and rule_9.
-// One empty stream with small device buffer. It should wake up when there are
-// buffer_size / 2 frames in device buffer.
-TEST_F(TimingSuite, InputWakeTimeOneStreamWithDeviceWakeUp) {
-  cras_audio_format format;
-  fill_audio_format(&format, 48000);
-
-  StreamPtr stream = create_stream(1, 1, CRAS_STREAM_INPUT, 480, &format);
-
-  struct timespec start;
-  clock_gettime(CLOCK_MONOTONIC_RAW, &start);
-
-  // The next callback of the new stream is 0.
-  stream->rstream->next_cb_ts.tv_sec = 0;
-  stream->rstream->next_cb_ts.tv_nsec = 0;
-
-  std::vector<StreamPtr> streams;
-  streams.emplace_back(std::move(stream));
-  timespec dev_time = SingleInputDevNextWake(240, 0, &start, &format, streams);
-  // The device wake up time should be 5ms from now. At that time there are
-  // 240 frames in the device.
-  const timespec add_millis = {0, 5 * 1000 * 1000};
-  add_timespecs(&start, &add_millis);
-  EXPECT_EQ(start.tv_sec, dev_time.tv_sec);
-  EXPECT_EQ(start.tv_nsec, dev_time.tv_nsec);
-}
-
-// Test rule_5.
-// The stream with USE_DEV_TIMING flag will be ignore if it is pending reply.
-TEST_F(TimingSuite, InputWakeTimeOneStreamUsingDevTimingWithPendingReply) {
-  cras_audio_format format;
-  fill_audio_format(&format, 48000);
-
-  StreamPtr stream = create_stream(1, 1, CRAS_STREAM_INPUT, 480, &format);
-
-  struct timespec start;
-  clock_gettime(CLOCK_MONOTONIC_RAW, &start);
-
-  // The next callback should be ignored.
-  stream->rstream->next_cb_ts = start;
-  stream->rstream->next_cb_ts.tv_sec += 10;
-  stream->rstream->flags = USE_DEV_TIMING;
-  rstream_stub_pending_reply(stream->rstream.get(), 1);
-
-  std::vector<StreamPtr> streams;
-  streams.emplace_back(std::move(stream));
-  timespec dev_time = SingleInputDevNextWake(4800, 0, &start, &format, streams);
-
-  // The device wake up time should be 100ms from now. At that time the hw_level
-  // is buffer_size / 2.
-  const timespec add_millis = {0, 100 * 1000 * 1000};
-  add_timespecs(&start, &add_millis);
-  EXPECT_EQ(start.tv_sec, dev_time.tv_sec);
-  EXPECT_EQ(start.tv_nsec, dev_time.tv_nsec);
-}
-
-// Test rule_6.
-// Add a new stream, the wake up time is the time when it has enough data to
-// post.
-TEST_F(TimingSuite, InputWakeTimeOneStreamWithEmptyDevice) {
-  cras_audio_format format;
-  fill_audio_format(&format, 48000);
-
-  StreamPtr stream = create_stream(1, 1, CRAS_STREAM_INPUT, 480, &format);
-
-  struct timespec start;
-  clock_gettime(CLOCK_MONOTONIC_RAW, &start);
-
-  // The next callback of the new stream is 0.
-  stream->rstream->next_cb_ts.tv_sec = 0;
-  stream->rstream->next_cb_ts.tv_nsec = 0;
-
-  std::vector<StreamPtr> streams;
-  streams.emplace_back(std::move(stream));
-  timespec dev_time = SingleInputDevNextWake(600, 0, &start, &format, streams);
-
-  // The device wake up time should be 10ms from now. At that time the
-  // stream will have 480 samples to post.
-  const timespec ten_millis = {0, 10 * 1000 * 1000};
-  add_timespecs(&start, &ten_millis);
-  EXPECT_EQ(0, streams[0]->rstream->next_cb_ts.tv_sec);
-  EXPECT_EQ(0, streams[0]->rstream->next_cb_ts.tv_nsec);
-  EXPECT_EQ(start.tv_sec, dev_time.tv_sec);
-  EXPECT_EQ(start.tv_nsec, dev_time.tv_nsec);
-}
-
-// Test rule_6.
-// Add a new stream with enough frames in device, check the wake up time is
-// right now.
-TEST_F(TimingSuite, InputWakeTimeOneStreamWithFullDevice) {
-  cras_audio_format format;
-  fill_audio_format(&format, 48000);
-
-  StreamPtr stream = create_stream(1, 1, CRAS_STREAM_INPUT, 480, &format);
-
-  struct timespec start;
-  clock_gettime(CLOCK_MONOTONIC_RAW, &start);
-
-  // The next callback of the new stream is 0.
-  stream->rstream->next_cb_ts.tv_sec = 0;
-  stream->rstream->next_cb_ts.tv_nsec = 0;
-
-  // If there are enough frames in the device, we should wake up immediately.
-  std::vector<StreamPtr> streams;
-  streams.emplace_back(std::move(stream));
-  timespec dev_time =
-      SingleInputDevNextWake(480, 480, &start, &format, streams);
-  EXPECT_EQ(0, streams[0]->rstream->next_cb_ts.tv_sec);
-  EXPECT_EQ(0, streams[0]->rstream->next_cb_ts.tv_nsec);
-  EXPECT_EQ(start.tv_sec, dev_time.tv_sec);
-  EXPECT_EQ(start.tv_nsec, dev_time.tv_nsec);
-}
-
-// Test rule_8.
-// The stream with USE_DEV_TIMING flag should wake up when it has enough frames
-// to post.
-TEST_F(TimingSuite, InputWakeTimeOneStreamUsingDevTiming) {
-  cras_audio_format format;
-  fill_audio_format(&format, 48000);
-
-  StreamPtr stream = create_stream(1, 1, CRAS_STREAM_INPUT, 480, &format);
-
-  struct timespec start;
-  clock_gettime(CLOCK_MONOTONIC_RAW, &start);
-
-  // The next callback should be ignored.
-  stream->rstream->next_cb_ts = start;
-  stream->rstream->next_cb_ts.tv_sec += 10;
-  stream->rstream->flags = USE_DEV_TIMING;
-
-  std::vector<StreamPtr> streams;
-  streams.emplace_back(std::move(stream));
-  timespec dev_time = SingleInputDevNextWake(600, 0, &start, &format, streams);
-
-  // The device wake up time should be 10ms from now. At that time the
-  // stream will have 480 samples to post.
-  const timespec add_millis = {0, 10 * 1000 * 1000};
-  add_timespecs(&start, &add_millis);
-  EXPECT_EQ(start.tv_sec, dev_time.tv_sec);
-  EXPECT_EQ(start.tv_nsec, dev_time.tv_nsec);
-}
-
-// Test rule_9.
-// The device wake up time should be 10ms from now. At that time the hw_level
-// is buffer_size / 2.
-TEST_F(TimingSuite, InputWakeTimeNoStreamSmallBufferDevice) {
-  cras_audio_format format;
-  fill_audio_format(&format, 48000);
-
-  struct timespec start;
-  clock_gettime(CLOCK_MONOTONIC_RAW, &start);
-
-  std::vector<StreamPtr> streams;
-  timespec dev_time = SingleInputDevNextWake(480, 0, &start, &format, streams);
-
-  const timespec add_millis = {0, 10 * 1000 * 1000};
-  add_timespecs(&start, &add_millis);
-  EXPECT_EQ(start.tv_sec, dev_time.tv_sec);
-  EXPECT_EQ(start.tv_nsec, dev_time.tv_nsec);
-}
-
-// Test rule_9.
-// There are more than buffer_size / 2 frames in the device. The device needs
-// to sleep at least 5ms.
-TEST_F(TimingSuite, InputWakeTimeOneStreamWithEnoughFramesInDevice) {
-  cras_audio_format format;
-  fill_audio_format(&format, 48000);
-
-  StreamPtr stream = create_stream(1, 1, CRAS_STREAM_INPUT, 480, &format);
-
-  struct timespec start;
-  clock_gettime(CLOCK_MONOTONIC_RAW, &start);
-
-  // Make next_cb_ts far from now.
-  stream->rstream->next_cb_ts = start;
-  stream->rstream->next_cb_ts.tv_sec += 10;
-
-  std::vector<StreamPtr> streams;
-  streams.emplace_back(std::move(stream));
-  timespec dev_time =
-      SingleInputDevNextWake(480, 480, &start, &format, streams);
-
-  const timespec add_millis = {0, 5 * 1000 * 1000};
-  add_timespecs(&start, &add_millis);
-  EXPECT_EQ(start.tv_sec, dev_time.tv_sec);
-  EXPECT_EQ(start.tv_nsec, dev_time.tv_nsec);
-}
-
-// One device, one stream, write a callback of data and check the sleep time is
-// one more wakeup interval.
-TEST_F(TimingSuite, WaitAfterFill) {
-  const size_t cb_threshold = 480;
-
-  cras_audio_format format;
-  fill_audio_format(&format, 48000);
-
-  StreamPtr stream =
-      create_stream(1, 1, CRAS_STREAM_INPUT, cb_threshold, &format);
-  // rstream's next callback is now and there is enough data to fill.
-  struct timespec start;
-  clock_gettime(CLOCK_MONOTONIC_RAW, &start);
-  stream->rstream->next_cb_ts = start;
-  AddFakeDataToStream(stream.get(), 480);
-
-  std::vector<StreamPtr> streams;
-  streams.emplace_back(std::move(stream));
-  timespec dev_time =
-      SingleInputDevNextWake(cb_threshold, 0, &start, &format, streams);
-
-  // The next callback should be scheduled 10ms in the future.
-  // And the next wake up should reflect the only attached stream.
-  const timespec ten_millis = {0, 10 * 1000 * 1000};
-  add_timespecs(&start, &ten_millis);
-  EXPECT_EQ(start.tv_sec, streams[0]->rstream->next_cb_ts.tv_sec);
-  EXPECT_EQ(start.tv_nsec, streams[0]->rstream->next_cb_ts.tv_nsec);
-  EXPECT_EQ(dev_time.tv_sec, streams[0]->rstream->next_cb_ts.tv_sec);
-  EXPECT_EQ(dev_time.tv_nsec, streams[0]->rstream->next_cb_ts.tv_nsec);
-}
-
-// One device with one stream which has block_size larger than the device buffer
-// level. If the device buffer level = 0, the input device wake time should be
-// set to (buffer_size / 2) / device_rate secs.
-TEST_F(TimingSuite, LargeCallbackStreamWithEmptyBuffer) {
-  const size_t cb_threshold = 3000;
-  const size_t dev_cb_threshold = 1200;
-  const size_t dev_level = 0;
-
-  cras_audio_format format;
-  fill_audio_format(&format, 48000);
-
-  StreamPtr stream =
-      create_stream(1, 1, CRAS_STREAM_INPUT, cb_threshold, &format);
-  struct timespec start;
-  clock_gettime(CLOCK_MONOTONIC_RAW, &start);
-  stream->rstream->next_cb_ts = start;
-
-  std::vector<StreamPtr> streams;
-  streams.emplace_back(std::move(stream));
-  timespec dev_time = SingleInputDevNextWake(dev_cb_threshold, dev_level,
-                                             &start, &format, streams);
-
-  struct timespec delta;
-  subtract_timespecs(&dev_time, &start, &delta);
-  // The next dev wake ts should be 25ms since the buffer level is empty and
-  // 1200 / 48000 = 0.025.
-  EXPECT_EQ(delta.tv_sec, 0);
-  EXPECT_LT(delta.tv_nsec, 25000000 + 5000 * 1000);
-  EXPECT_GT(delta.tv_nsec, 25000000 - 5000 * 1000);
-}
-
-// One device with one stream which has block_size larger than the device buffer
-// level. If the device buffer level = buffer_size / 2, the input device wake
-// time should be set to max(0, 5ms) = 5ms to prevent busy loop occurs.
-TEST_F(TimingSuite, LargeCallbackStreamWithHalfFullBuffer) {
-  const size_t cb_threshold = 3000;
-  const size_t dev_cb_threshold = 1200;
-  const size_t dev_level = 1200;
-
-  cras_audio_format format;
-  fill_audio_format(&format, 48000);
-
-  StreamPtr stream =
-      create_stream(1, 1, CRAS_STREAM_INPUT, cb_threshold, &format);
-  struct timespec start;
-  clock_gettime(CLOCK_MONOTONIC_RAW, &start);
-  stream->rstream->next_cb_ts = start;
-
-  std::vector<StreamPtr> streams;
-  streams.emplace_back(std::move(stream));
-  timespec dev_time = SingleInputDevNextWake(dev_cb_threshold, dev_level,
-                                             &start, &format, streams);
-
-  struct timespec delta;
-  subtract_timespecs(&dev_time, &start, &delta);
-  // The next dev wake ts should be 5ms since the buffer level is half full.
-  EXPECT_EQ(delta.tv_sec, 0);
-  EXPECT_LT(delta.tv_nsec, 5000000 + 5000 * 1000);
-  EXPECT_GT(delta.tv_nsec, 5000000 - 5000 * 1000);
-}
-
-// One device(48k), one stream(44.1k), write a callback of data and check that
-// the sleep time is correct when doing SRC.
-TEST_F(TimingSuite, WaitAfterFillSRC) {
-  cras_audio_format dev_format;
-  fill_audio_format(&dev_format, 48000);
-  cras_audio_format stream_format;
-  fill_audio_format(&stream_format, 44100);
-
-  StreamPtr stream =
-      create_stream(1, 1, CRAS_STREAM_INPUT, 441, &stream_format);
-  // rstream's next callback is now and there is enough data to fill.
-  struct timespec start;
-  clock_gettime(CLOCK_MONOTONIC_RAW, &start);
-  stream->rstream->next_cb_ts = start;
-  AddFakeDataToStream(stream.get(), 441);
-
-  std::vector<StreamPtr> streams;
-  streams.emplace_back(std::move(stream));
-  timespec dev_time =
-      SingleInputDevNextWake(480, 0, &start, &dev_format, streams);
-
-  // The next callback should be scheduled 10ms in the future.
-  struct timespec delta;
-  subtract_timespecs(&dev_time, &start, &delta);
-  EXPECT_LT(9900 * 1000, delta.tv_nsec);
-  EXPECT_GT(10100 * 1000, delta.tv_nsec);
-}
-
-// One device, two streams. One stream is ready the other still needs data.
-// Checks that the sleep interval is based on the time the device will take to
-// supply the needed samples for stream2.
-TEST_F(TimingSuite, WaitTwoStreamsSameFormat) {
-  const size_t cb_threshold = 480;
-
-  cras_audio_format format;
-  fill_audio_format(&format, 48000);
-
-  // stream1's next callback is now and there is enough data to fill.
-  StreamPtr stream1 =
-      create_stream(1, 1, CRAS_STREAM_INPUT, cb_threshold, &format);
-  struct timespec start;
-  clock_gettime(CLOCK_MONOTONIC_RAW, &start);
-  stream1->rstream->next_cb_ts = start;
-  AddFakeDataToStream(stream1.get(), cb_threshold);
-
-  // stream2 is only half full.
-  StreamPtr stream2 =
-      create_stream(1, 1, CRAS_STREAM_INPUT, cb_threshold, &format);
-  stream2->rstream->next_cb_ts = start;
-  AddFakeDataToStream(stream2.get(), 240);
-
-  std::vector<StreamPtr> streams;
-  streams.emplace_back(std::move(stream1));
-  streams.emplace_back(std::move(stream2));
-  timespec dev_time =
-      SingleInputDevNextWake(cb_threshold, 0, &start, &format, streams);
-
-  // Should wait for approximately 5 milliseconds for 240 samples at 48k.
-  struct timespec delta2;
-  subtract_timespecs(&dev_time, &start, &delta2);
-  EXPECT_LT(4900 * 1000, delta2.tv_nsec);
-  EXPECT_GT(5100 * 1000, delta2.tv_nsec);
-}
-
-// One device(44.1), two streams(44.1, 48). One stream is ready the other still
-// needs data. Checks that the sleep interval is based on the time the device
-// will take to supply the needed samples for stream2, stream2 is sample rate
-// converted from the 44.1k device to the 48k stream.
-TEST_F(TimingSuite, WaitTwoStreamsDifferentRates) {
-  cras_audio_format s1_format, s2_format;
-  fill_audio_format(&s1_format, 44100);
-  fill_audio_format(&s2_format, 48000);
-
-  // stream1's next callback is now and there is enough data to fill.
-  StreamPtr stream1 = create_stream(1, 1, CRAS_STREAM_INPUT, 441, &s1_format);
-  struct timespec start;
-  clock_gettime(CLOCK_MONOTONIC_RAW, &start);
-  stream1->rstream->next_cb_ts = start;
-  AddFakeDataToStream(stream1.get(), 441);
-  // stream2's next callback is now but there is only half a callback of data.
-  StreamPtr stream2 = create_stream(1, 1, CRAS_STREAM_INPUT, 480, &s2_format);
-  stream2->rstream->next_cb_ts = start;
-  AddFakeDataToStream(stream2.get(), 240);
-
-  std::vector<StreamPtr> streams;
-  streams.emplace_back(std::move(stream1));
-  streams.emplace_back(std::move(stream2));
-  timespec dev_time =
-      SingleInputDevNextWake(441, 0, &start, &s1_format, streams);
-
-  // Should wait for approximately 5 milliseconds for 240 48k samples from the
-  // 44.1k device.
-  struct timespec delta2;
-  subtract_timespecs(&dev_time, &start, &delta2);
-  EXPECT_LT(4900 * 1000, delta2.tv_nsec);
-  EXPECT_GT(5100 * 1000, delta2.tv_nsec);
-}
-
-// One device, two streams. Both streams get a full callback of data and the
-// device has enough samples for the next callback already. Checks that the
-// shorter of the two streams times is used for the next sleep interval.
-TEST_F(TimingSuite, WaitTwoStreamsDifferentWakeupTimes) {
-  cras_audio_format s1_format, s2_format;
-  fill_audio_format(&s1_format, 44100);
-  fill_audio_format(&s2_format, 48000);
-
-  struct timespec start;
-  clock_gettime(CLOCK_MONOTONIC_RAW, &start);
-
-  // stream1's next callback is in 3ms.
-  StreamPtr stream1 = create_stream(1, 1, CRAS_STREAM_INPUT, 441, &s1_format);
-  stream1->rstream->next_cb_ts = start;
-  const timespec three_millis = {0, 3 * 1000 * 1000};
-  add_timespecs(&stream1->rstream->next_cb_ts, &three_millis);
-  AddFakeDataToStream(stream1.get(), 441);
-  // stream2 is also ready next cb in 5ms..
-  StreamPtr stream2 = create_stream(1, 1, CRAS_STREAM_INPUT, 480, &s2_format);
-  stream2->rstream->next_cb_ts = start;
-  const timespec five_millis = {0, 5 * 1000 * 1000};
-  add_timespecs(&stream2->rstream->next_cb_ts, &five_millis);
-  AddFakeDataToStream(stream1.get(), 480);
-
-  std::vector<StreamPtr> streams;
-  streams.emplace_back(std::move(stream1));
-  streams.emplace_back(std::move(stream2));
-  timespec dev_time =
-      SingleInputDevNextWake(441, 441, &start, &s1_format, streams);
-
-  // Should wait for approximately 3 milliseconds for stream 1 first.
-  struct timespec delta2;
-  subtract_timespecs(&dev_time, &start, &delta2);
-  EXPECT_LT(2900 * 1000, delta2.tv_nsec);
-  EXPECT_GT(3100 * 1000, delta2.tv_nsec);
-}
-
-// One hotword stream attaches to hotword device. Input data has copied from
-// device to stream but total number is less than cb_threshold. Hotword stream
-// should be scheduled wake base on the samples needed to fill full shm.
-TEST_F(TimingSuite, HotwordStreamUseDevTiming) {
-  cras_audio_format fmt;
-  fill_audio_format(&fmt, 48000);
-
-  struct timespec start, delay;
-  clock_gettime(CLOCK_MONOTONIC_RAW, &start);
-
-  StreamPtr stream = create_stream(1, 1, CRAS_STREAM_INPUT, 240, &fmt);
-  stream->rstream->flags = HOTWORD_STREAM;
-  stream->rstream->next_cb_ts = start;
-  delay.tv_sec = 0;
-  delay.tv_nsec = 3 * 1000 * 1000;
-  add_timespecs(&stream->rstream->next_cb_ts, &delay);
-
-  // Add fake data to stream and device so its slightly less than cb_threshold.
-  // Expect to wait for samples to fill the full buffer (480 - 192) frames
-  // instead of using the next_cb_ts.
-  AddFakeDataToStream(stream.get(), 192);
-  std::vector<StreamPtr> streams;
-  streams.emplace_back(std::move(stream));
-  timespec dev_time = SingleInputDevNextWake(4096, 0, &start, &fmt, streams);
-  struct timespec delta;
-  subtract_timespecs(&dev_time, &start, &delta);
-  // 288 frames worth of time = 6 ms.
-  EXPECT_EQ(6 * 1000 * 1000, delta.tv_nsec);
-}
-
-// One hotword stream attaches to hotword device. Input data burst to a number
-// larger than cb_threshold. Also, stream is pending client reply.
-// In this case stream fd is used to poll for next wake.
-// And the dev wake time is unchanged from the default 20 seconds limit.
-TEST_F(TimingSuite, HotwordStreamBulkDataIsPending) {
-  int poll_fd = 0;
-  cras_audio_format fmt;
-  fill_audio_format(&fmt, 48000);
-
-  struct timespec start;
-  clock_gettime(CLOCK_MONOTONIC_RAW, &start);
-
-  StreamPtr stream = create_stream(1, 1, CRAS_STREAM_INPUT, 240, &fmt);
-  stream->rstream->flags = HOTWORD_STREAM;
-  stream->rstream->next_cb_ts = start;
-
-  AddFakeDataToStream(stream.get(), 480);
-  std::vector<StreamPtr> streams;
-  streams.emplace_back(std::move(stream));
-  // Stream is pending the reply from client.
-  rstream_stub_pending_reply(streams[0]->rstream.get(), 1);
-
-  // There is more than 1 cb_threshold of data in device.
-  timespec dev_time = SingleInputDevNextWake(4096, 7000, &start, &fmt, streams,
-                                             CRAS_NODE_TYPE_HOTWORD);
-
-  // Need to wait for stream fd in the next ppoll.
-  poll_fd = dev_stream_poll_stream_fd(streams[0]->dstream.get());
-  EXPECT_EQ(FAKE_POLL_FD, poll_fd);
-
-  struct timespec delta;
-  subtract_timespecs(&dev_time, &start, &delta);
-  // Wake up time should be default 20 seconds because audio thread
-  // depends on reply from client to wake it up.
-  EXPECT_LT(19, delta.tv_sec);
-  EXPECT_GT(21, delta.tv_sec);
-}
-
-// One hotword stream attaches to hotword device. Input data burst to a number
-// larger than cb_threshold. However, stream is not pending client reply.
-// This happens if there was no data during capture_to_stream.
-// In this case stream fd is NOT used to poll for next wake.
-// And the dev wake time is changed to a 0 instead of default 20 seconds.
-TEST_F(TimingSuite, HotwordStreamBulkDataIsNotPending) {
-  int poll_fd = 0;
-  cras_audio_format fmt;
-  fill_audio_format(&fmt, 48000);
-
-  struct timespec start;
-  clock_gettime(CLOCK_MONOTONIC_RAW, &start);
-
-  StreamPtr stream = create_stream(1, 1, CRAS_STREAM_INPUT, 240, &fmt);
-  stream->rstream->flags = HOTWORD_STREAM;
-  stream->rstream->next_cb_ts = start;
-
-  AddFakeDataToStream(stream.get(), 480);
-  std::vector<StreamPtr> streams;
-  streams.emplace_back(std::move(stream));
-  // Stream is not pending the reply from client.
-  rstream_stub_pending_reply(streams[0]->rstream.get(), 0);
-
-  // There is more than 1 cb_threshold of data in device.
-  timespec dev_time = SingleInputDevNextWake(4096, 7000, &start, &fmt, streams);
-
-  // Does not need to wait for stream fd in the next ppoll.
-  poll_fd = dev_stream_poll_stream_fd(streams[0]->dstream.get());
-  EXPECT_EQ(-1, poll_fd);
-
-  struct timespec delta;
-  subtract_timespecs(&dev_time, &start, &delta);
-  // Wake up time should be very small because there is enough
-  // data to be send to client.
-  EXPECT_LT(delta.tv_sec, 0.1);
-}
-
-// When a new output stream is added, there are two rules to determine the
-// initial next_cb_ts.
-// 1. If there is a matched input stream, use the next_cb_ts and
-//    sleep_interval_ts from that input stream as the initial values.
-// 2. If the device already has streams, the next_cb_ts will be the earliest
-// next callback time from these streams.
-// 3. If there are no other streams, the next_cb_ts will be set to the time
-// when the valid frames in device is lower than cb_threshold. (If it is
-// already lower than cb_threshold, set next_cb_ts to now.)
-
-// Test rule 1.
-// There is a matched input stream. The next_cb_ts of the newly added output
-// stream will use the next_cb_ts from the input stream.
-TEST_F(TimingSuite, NewOutputStreamInitExistMatchedStream) {
-  struct open_dev* odev_list_ = NULL;
-  struct open_dev* idev_list_ = NULL;
-
-  cras_audio_format format;
-  fill_audio_format(&format, 48000);
-  DevicePtr out_dev = create_device(CRAS_STREAM_OUTPUT, 1024, &format,
-                                    CRAS_NODE_TYPE_HEADPHONE);
-  DL_APPEND(odev_list_, out_dev->odev.get());
-  struct cras_iodev* out_iodev = out_dev->odev->dev;
-
-  DevicePtr in_dev =
-      create_device(CRAS_STREAM_INPUT, 1024, &format, CRAS_NODE_TYPE_MIC);
-  DL_APPEND(idev_list_, in_dev->odev.get());
-
-  StreamPtr in_stream = create_stream(1, 1, CRAS_STREAM_INPUT, 480, &format);
-  add_stream_to_dev(in_dev->dev, in_stream);
-  in_stream->rstream->next_cb_ts.tv_sec = 54321;
-  in_stream->rstream->next_cb_ts.tv_nsec = 12345;
-  in_stream->rstream->sleep_interval_ts.tv_sec = 321;
-  in_stream->rstream->sleep_interval_ts.tv_nsec = 123;
-
-  ShmPtr shm = create_shm(480);
-  RstreamPtr rstream =
-      create_rstream(1, CRAS_STREAM_OUTPUT, 480, &format, shm.get());
-
-  dev_io_append_stream(&odev_list_, &idev_list_, rstream.get(), &out_iodev, 1);
-
-  EXPECT_EQ(in_stream->rstream->next_cb_ts.tv_sec, rstream->next_cb_ts.tv_sec);
-  EXPECT_EQ(in_stream->rstream->next_cb_ts.tv_nsec,
-            rstream->next_cb_ts.tv_nsec);
-  EXPECT_EQ(in_stream->rstream->sleep_interval_ts.tv_sec,
-            rstream->sleep_interval_ts.tv_sec);
-  EXPECT_EQ(in_stream->rstream->sleep_interval_ts.tv_nsec,
-            rstream->sleep_interval_ts.tv_nsec);
-
-  dev_stream_destroy(out_iodev->streams);
-}
-
-// Test rule 2.
-// The device already has streams, the next_cb_ts will be the earliest
-// next_cb_ts from these streams.
-TEST_F(TimingSuite, NewOutputStreamInitStreamInDevice) {
-  struct open_dev* odev_list_ = NULL;
-  struct open_dev* idev_list_ = NULL;
-
-  cras_audio_format format;
-  fill_audio_format(&format, 48000);
-  DevicePtr dev = create_device(CRAS_STREAM_OUTPUT, 1024, &format,
-                                CRAS_NODE_TYPE_HEADPHONE);
-  DL_APPEND(odev_list_, dev->odev.get());
-  struct cras_iodev* iodev = dev->odev->dev;
-
-  StreamPtr stream = create_stream(1, 1, CRAS_STREAM_OUTPUT, 480, &format);
-  add_stream_to_dev(dev->dev, stream);
-  stream->rstream->next_cb_ts.tv_sec = 54321;
-  stream->rstream->next_cb_ts.tv_nsec = 12345;
-
-  ShmPtr shm = create_shm(480);
-  RstreamPtr rstream =
-      create_rstream(1, CRAS_STREAM_OUTPUT, 480, &format, shm.get());
-
-  dev_io_append_stream(&odev_list_, &idev_list_, rstream.get(), &iodev, 1);
-
-  EXPECT_EQ(stream->rstream->next_cb_ts.tv_sec, rstream->next_cb_ts.tv_sec);
-  EXPECT_EQ(stream->rstream->next_cb_ts.tv_nsec, rstream->next_cb_ts.tv_nsec);
-
-  dev_stream_destroy(iodev->streams->next);
-}
-
-// Test rule 3.
-// The there are no streams and no frames in device buffer. The next_cb_ts
-// will be set to now.
-TEST_F(TimingSuite, NewOutputStreamInitNoStreamNoFramesInDevice) {
-  struct open_dev* odev_list_ = NULL;
-  struct open_dev* idev_list_ = NULL;
-
-  cras_audio_format format;
-  fill_audio_format(&format, 48000);
-  DevicePtr dev = create_device(CRAS_STREAM_OUTPUT, 1024, &format,
-                                CRAS_NODE_TYPE_HEADPHONE);
-  DL_APPEND(odev_list_, dev->odev.get());
-  struct cras_iodev* iodev = dev->odev->dev;
-
-  struct timespec start;
-  clock_gettime(CLOCK_MONOTONIC_RAW, &start);
-
-  ShmPtr shm = create_shm(480);
-  RstreamPtr rstream =
-      create_rstream(1, CRAS_STREAM_OUTPUT, 480, &format, shm.get());
-
-  dev_io_append_stream(&odev_list_, &idev_list_, rstream.get(), &iodev, 1);
-
-  EXPECT_EQ(start.tv_sec, rstream->next_cb_ts.tv_sec);
-  EXPECT_EQ(start.tv_nsec, rstream->next_cb_ts.tv_nsec);
-
-  dev_stream_destroy(iodev->streams);
-}
-
-// Test rule 2.
-// The there are no streams and some valid frames in device buffer. The
-// next_cb_ts will be set to the time that valid frames in device is lower
-// than cb_threshold.
-TEST_F(TimingSuite, NewOutputStreamInitNoStreamSomeFramesInDevice) {
-  struct open_dev* odev_list_ = NULL;
-  struct open_dev* idev_list_ = NULL;
-
-  cras_audio_format format;
-  fill_audio_format(&format, 48000);
-  DevicePtr dev = create_device(CRAS_STREAM_OUTPUT, 1024, &format,
-                                CRAS_NODE_TYPE_HEADPHONE);
-  DL_APPEND(odev_list_, dev->odev.get());
-  struct cras_iodev* iodev = dev->odev->dev;
-
-  struct timespec start;
-  clock_gettime(CLOCK_MONOTONIC_RAW, &start);
-
-  iodev_stub_valid_frames(iodev, 960, start);
-
-  ShmPtr shm = create_shm(480);
-  RstreamPtr rstream =
-      create_rstream(1, CRAS_STREAM_OUTPUT, 480, &format, shm.get());
-
-  dev_io_append_stream(&odev_list_, &idev_list_, rstream.get(), &iodev, 1);
-
-  // The next_cb_ts should be 10ms from now. At that time there are
-  // only 480 valid frames in the device.
-  const timespec add_millis = {0, 10 * 1000 * 1000};
-  add_timespecs(&start, &add_millis);
-  EXPECT_EQ(start.tv_sec, rstream->next_cb_ts.tv_sec);
-  EXPECT_EQ(start.tv_nsec, rstream->next_cb_ts.tv_nsec);
-
-  dev_stream_destroy(iodev->streams);
-}
-
-// There is the pseudo code about wake up time for a output device.
-//
-// function dev_io_next_output_wake(dev):
-//   wake_ts = get_next_stream_wake_from_list(dev.streams)
-//   if cras_iodev_odev_should_wake(dev):
-//     wake_ts = MIN(wake_ts, dev.wake_ts) # rule_1
-//
-// function get_next_stream_wake_from_list(streams):
-//   for stream in streams:
-//     if stream is draining: # rule_2
-//     	 continue
-//     if stream is pending reply: # rule_3
-//       continue
-//     if stream is USE_DEV_TIMING: # rule_4
-//       continue
-//     min_ts = MIN(min_ts, stream.next_cb_ts) # rule_5
-//   return min_ts
-//
-// # This function is in iodev so we don't test its logic here.
-// function cras_iodev_odev_should_wake(dev):
-//   if dev.is_free_running:
-//     return False
-//   if dev.state == NORMAL_RUN or dev.state == NO_STREAM_RUN:
-//     return True
-//   return False
-
-// Test rule_1.
-// The wake up time should be the earlier time amoung streams and devices.
-TEST_F(TimingSuite, OutputWakeTimeOneStreamWithEarlierStreamWakeTime) {
-  cras_audio_format format;
-  fill_audio_format(&format, 48000);
-  struct timespec start;
-  clock_gettime(CLOCK_MONOTONIC_RAW, &start);
-
-  StreamPtr stream = create_stream(1, 1, CRAS_STREAM_OUTPUT, 480, &format);
-  stream->rstream->next_cb_ts = start;
-  stream->rstream->next_cb_ts.tv_sec += 1;
-
-  std::vector<StreamPtr> streams;
-  streams.emplace_back(std::move(stream));
-
-  struct timespec dev_wake_ts = start;
-  dev_wake_ts.tv_sec += 2;
-
-  timespec dev_time =
-      SingleOutputDevNextWake(48000, 0, &start, &format, streams, &dev_wake_ts);
-
-  EXPECT_EQ(start.tv_sec + 1, dev_time.tv_sec);
-  EXPECT_EQ(start.tv_nsec, dev_time.tv_nsec);
-}
-
-// Test rule_1.
-// The wake up time should be the earlier time amoung streams and devices.
-TEST_F(TimingSuite, OutputWakeTimeOneStreamWithEarlierDeviceWakeTime) {
-  cras_audio_format format;
-  fill_audio_format(&format, 48000);
-  struct timespec start;
-  clock_gettime(CLOCK_MONOTONIC_RAW, &start);
-
-  StreamPtr stream = create_stream(1, 1, CRAS_STREAM_OUTPUT, 480, &format);
-  stream->rstream->next_cb_ts = start;
-  stream->rstream->next_cb_ts.tv_sec += 2;
-
-  std::vector<StreamPtr> streams;
-  streams.emplace_back(std::move(stream));
-
-  struct timespec dev_wake_ts = start;
-  dev_wake_ts.tv_sec += 1;
-
-  timespec dev_time =
-      SingleOutputDevNextWake(48000, 0, &start, &format, streams, &dev_wake_ts);
-
-  EXPECT_EQ(start.tv_sec + 1, dev_time.tv_sec);
-  EXPECT_EQ(start.tv_nsec, dev_time.tv_nsec);
-}
-
-// Test rule_2.
-// The stream 1 is draining so it will be ignored. The wake up time should be
-// the next_cb_ts of stream 2.
-TEST_F(TimingSuite, OutputWakeTimeTwoStreamsWithOneIsDraining) {
-  cras_audio_format format;
-  fill_audio_format(&format, 48000);
-  struct timespec start;
-  clock_gettime(CLOCK_MONOTONIC_RAW, &start);
-
-  StreamPtr stream1 = create_stream(1, 1, CRAS_STREAM_OUTPUT, 480, &format);
-  stream1->rstream->next_cb_ts = start;
-  stream1->rstream->next_cb_ts.tv_sec += 2;
-  stream1->rstream->is_draining = 1;
-  stream1->rstream->queued_frames = 480;
-
-  StreamPtr stream2 = create_stream(1, 2, CRAS_STREAM_OUTPUT, 480, &format);
-  stream2->rstream->next_cb_ts = start;
-  stream2->rstream->next_cb_ts.tv_sec += 5;
-
-  std::vector<StreamPtr> streams;
-  streams.emplace_back(std::move(stream1));
-  streams.emplace_back(std::move(stream2));
-
-  struct timespec dev_wake_ts = start;
-  dev_wake_ts.tv_sec += 10;
-
-  timespec dev_time =
-      SingleOutputDevNextWake(48000, 0, &start, &format, streams, &dev_wake_ts);
-
-  EXPECT_EQ(start.tv_sec + 5, dev_time.tv_sec);
-  EXPECT_EQ(start.tv_nsec, dev_time.tv_nsec);
-}
-
-// Test rule_3.
-// The stream 1 is pending reply so it will be ignored. The wake up time should
-// be the next_cb_ts of stream 2.
-TEST_F(TimingSuite, OutputWakeTimeTwoStreamsWithOneIsPendingReply) {
-  cras_audio_format format;
-  fill_audio_format(&format, 48000);
-  struct timespec start;
-  clock_gettime(CLOCK_MONOTONIC_RAW, &start);
-
-  StreamPtr stream1 = create_stream(1, 1, CRAS_STREAM_OUTPUT, 480, &format);
-  stream1->rstream->next_cb_ts = start;
-  stream1->rstream->next_cb_ts.tv_sec += 2;
-  rstream_stub_pending_reply(stream1->rstream.get(), 1);
-
-  StreamPtr stream2 = create_stream(1, 2, CRAS_STREAM_OUTPUT, 480, &format);
-  stream2->rstream->next_cb_ts = start;
-  stream2->rstream->next_cb_ts.tv_sec += 5;
-
-  std::vector<StreamPtr> streams;
-  streams.emplace_back(std::move(stream1));
-  streams.emplace_back(std::move(stream2));
-
-  struct timespec dev_wake_ts = start;
-  dev_wake_ts.tv_sec += 10;
-
-  timespec dev_time =
-      SingleOutputDevNextWake(48000, 0, &start, &format, streams, &dev_wake_ts);
-
-  EXPECT_EQ(start.tv_sec + 5, dev_time.tv_sec);
-  EXPECT_EQ(start.tv_nsec, dev_time.tv_nsec);
-}
-
-// Test rule_4.
-// The stream 1 is uning device timing so it will be ignored. The wake up time
-// should be the next_cb_ts of stream 2.
-TEST_F(TimingSuite, OutputWakeTimeTwoStreamsWithOneIsUsingDevTiming) {
-  cras_audio_format format;
-  fill_audio_format(&format, 48000);
-  struct timespec start;
-  clock_gettime(CLOCK_MONOTONIC_RAW, &start);
-
-  StreamPtr stream1 = create_stream(1, 1, CRAS_STREAM_OUTPUT, 480, &format);
-  stream1->rstream->next_cb_ts = start;
-  stream1->rstream->next_cb_ts.tv_sec += 2;
-  stream1->rstream->flags = USE_DEV_TIMING;
-
-  StreamPtr stream2 = create_stream(1, 2, CRAS_STREAM_OUTPUT, 480, &format);
-  stream2->rstream->next_cb_ts = start;
-  stream2->rstream->next_cb_ts.tv_sec += 5;
-
-  std::vector<StreamPtr> streams;
-  streams.emplace_back(std::move(stream1));
-  streams.emplace_back(std::move(stream2));
-
-  struct timespec dev_wake_ts = start;
-  dev_wake_ts.tv_sec += 10;
-
-  timespec dev_time =
-      SingleOutputDevNextWake(48000, 0, &start, &format, streams, &dev_wake_ts);
-
-  EXPECT_EQ(start.tv_sec + 5, dev_time.tv_sec);
-  EXPECT_EQ(start.tv_nsec, dev_time.tv_nsec);
-}
-
-// Test rule_5.
-// The wake up time should be the next_cb_ts of streams.
-TEST_F(TimingSuite, OutputWakeTimeTwoStreams) {
-  cras_audio_format format;
-  fill_audio_format(&format, 48000);
-  struct timespec start;
-  clock_gettime(CLOCK_MONOTONIC_RAW, &start);
-
-  StreamPtr stream1 = create_stream(1, 1, CRAS_STREAM_OUTPUT, 480, &format);
-  stream1->rstream->next_cb_ts = start;
-  stream1->rstream->next_cb_ts.tv_sec += 2;
-
-  StreamPtr stream2 = create_stream(1, 2, CRAS_STREAM_OUTPUT, 480, &format);
-  stream2->rstream->next_cb_ts = start;
-  stream2->rstream->next_cb_ts.tv_sec += 5;
-
-  std::vector<StreamPtr> streams;
-  streams.emplace_back(std::move(stream1));
-  streams.emplace_back(std::move(stream2));
-
-  struct timespec dev_wake_ts = start;
-  dev_wake_ts.tv_sec += 10;
-
-  timespec dev_time =
-      SingleOutputDevNextWake(48000, 0, &start, &format, streams, &dev_wake_ts);
-
-  EXPECT_EQ(start.tv_sec + 2, dev_time.tv_sec);
-  EXPECT_EQ(start.tv_nsec, dev_time.tv_nsec);
-}
-
-// One device, one stream, fetch stream and check the sleep time is one more
-// wakeup interval.
-TEST_F(TimingSuite, OutputStreamsUpdateAfterFetching) {
-  cras_audio_format format;
-  fill_audio_format(&format, 48000);
-
-  StreamPtr stream = create_stream(1, 1, CRAS_STREAM_OUTPUT, 480, &format);
-
-  // rstream's next callback is now.
-  struct timespec start;
-  clock_gettime(CLOCK_MONOTONIC_RAW, &start);
-  stream->rstream->next_cb_ts = start;
-
-  struct open_dev* dev_list_ = NULL;
-
-  DevicePtr dev = create_device(CRAS_STREAM_OUTPUT, 1024, &format,
-                                CRAS_NODE_TYPE_HEADPHONE);
-  DL_APPEND(dev_list_, dev->odev.get());
-
-  add_stream_to_dev(dev->dev, stream);
-
-  dev_io_playback_fetch(dev_list_);
-
-  // The next callback should be scheduled 10ms in the future.
-  const timespec ten_millis = {0, 10 * 1000 * 1000};
-  add_timespecs(&start, &ten_millis);
-  EXPECT_EQ(start.tv_sec, stream->rstream->next_cb_ts.tv_sec);
-  EXPECT_EQ(start.tv_nsec, stream->rstream->next_cb_ts.tv_nsec);
-}
-
-// TODO(yuhsuan): There are some time scheduling rules in cras_iodev. Maybe we
-// can move them into dev_io so that all timing related codes are in the same
-// file or leave them in iodev_unittest like now.
-// 1. Device's wake_ts update: cras_iodev_frames_to_play_in_sleep.
-// 2. wake_ts update when removing stream: cras_iodev_rm_stream.
-
-/* Stubs */
-extern "C" {
-
-int input_data_get_for_stream(struct input_data* data,
-                              struct cras_rstream* stream,
-                              struct buffer_share* offsets,
-                              struct cras_audio_area** area,
-                              unsigned int* offset) {
-  return 0;
-}
-
-int input_data_put_for_stream(struct input_data* data,
-                              struct cras_rstream* stream,
-                              struct buffer_share* offsets,
-                              unsigned int frames) {
-  return 0;
-}
-
-float input_data_get_software_gain_scaler(struct input_data* data,
-                                          float idev_sw_gain_scaler,
-                                          struct cras_rstream* stream) {
-  return 1.0;
-}
-
-struct cras_audio_format* cras_rstream_post_processing_format(
-    const struct cras_rstream* stream,
-    void* dev_ptr) {
-  return NULL;
-}
-
-int cras_audio_thread_event_drop_samples() {
-  return 0;
-}
-
-int cras_audio_thread_event_severe_underrun() {
-  return 0;
-}
-
-void* buffer_share_get_data(const struct buffer_share* mix, unsigned int id) {
-  return NULL;
-};
-void cras_apm_list_start_apm(struct cras_apm_list* list, void* dev_ptr){};
-void cras_apm_list_stop_apm(struct cras_apm_list* list, void* dev_ptr){};
-}  // extern "C"
-
-}  //  namespace
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  openlog(NULL, LOG_PERROR, LOG_USER);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tests/utf8_unittest.cc b/cras/src/tests/utf8_unittest.cc
deleted file mode 100644
index 4a13fcf..0000000
--- a/cras/src/tests/utf8_unittest.cc
+++ /dev/null
@@ -1,159 +0,0 @@
-// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Some UTF character seqeuences in this file were taken from
-// https://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt
-
-#include <gtest/gtest.h>
-#include <stdio.h>
-
-extern "C" {
-#include "cras_utf8.h"
-}
-
-namespace {
-
-TEST(UTF8, ValidStress) {
-  size_t pos;
-
-  EXPECT_EQ(1, valid_utf8_string("The greek word 'kosme': "
-                                 "\xce\xba\xe1\xbd\xb9\xcf\x83\xce"
-                                 "\xbc\xce\xb5",
-                                 &pos));
-  EXPECT_EQ(35, pos);
-
-  EXPECT_EQ(1, valid_utf8_string("Playback", &pos));
-  EXPECT_EQ(8, pos);
-
-  EXPECT_EQ(1, valid_utf8_string("The Euro sign: \xe2\x82\xac", &pos));
-  EXPECT_EQ(18, pos);
-
-  /* First possible sequence of a certain length. */
-  EXPECT_EQ(1, valid_utf8_string("\x01", &pos));
-  EXPECT_EQ(1, pos);
-  EXPECT_EQ(1, valid_utf8_string("\xc2\x80", &pos));
-  EXPECT_EQ(2, pos);
-  EXPECT_EQ(1, valid_utf8_string("\xe0\xa0\x80", &pos));
-  EXPECT_EQ(3, pos);
-  EXPECT_EQ(1, valid_utf8_string("\xe1\x80\x80", &pos));
-  EXPECT_EQ(3, pos);
-  EXPECT_EQ(1, valid_utf8_string("\xf0\x90\x80\x80", &pos));
-  EXPECT_EQ(4, pos);
-  EXPECT_EQ(1, valid_utf8_string("\xf1\x80\x80\x80", &pos));
-  EXPECT_EQ(4, pos);
-
-  /* Last possible sequence of a certain length. */
-  EXPECT_EQ(1, valid_utf8_string("\x7f", &pos));
-  EXPECT_EQ(1, pos);
-  EXPECT_EQ(1, valid_utf8_string("\xdf\xbf", &pos));
-  EXPECT_EQ(2, pos);
-  EXPECT_EQ(1, valid_utf8_string("\xef\xbf\xbf", &pos));
-  EXPECT_EQ(3, pos);
-  EXPECT_EQ(1, valid_utf8_string("\xf4\x8f\xbf\xbf", &pos));
-  EXPECT_EQ(4, pos);
-
-  /* Other boundary conditions. */
-  EXPECT_EQ(1, valid_utf8_string("\xed\x9f\xbf", &pos));
-  EXPECT_EQ(3, pos);
-  EXPECT_EQ(1, valid_utf8_string("\xee\x80\x80", &pos));
-  EXPECT_EQ(3, pos);
-  EXPECT_EQ(1, valid_utf8_string("\xef\xbf\xbd", &pos));
-  EXPECT_EQ(3, pos);
-  EXPECT_EQ(1, valid_utf8_string("\xf0\xbf\xbf\xbf", &pos));
-  EXPECT_EQ(4, pos);
-
-  /* BOM sequence. */
-  EXPECT_EQ(1, valid_utf8_string("\xef\xbb\xbf", &pos));
-  EXPECT_EQ(3, pos);
-
-  /* Valid UTF-8 that shouldn't appear in text; chose to allow
-   * these characters anyway. */
-  EXPECT_EQ(1, valid_utf8_string("U+FFFE: \xef\xbf\xbe", &pos));
-  EXPECT_EQ(11, pos);
-  EXPECT_EQ(1, valid_utf8_string("U+FDD0: \xef\xb7\x90", &pos));
-  EXPECT_EQ(11, pos);
-  EXPECT_EQ(1, valid_utf8_string("\xf0\x9f\xbf\xbe", &pos));
-  EXPECT_EQ(4, pos);
-}
-
-TEST(UTF8, InvalidStress) {
-  size_t pos;
-
-  /* Malformed continuation bytes. */
-  EXPECT_EQ(0, valid_utf8_string("\x80", &pos));
-  EXPECT_EQ(0, pos);
-  EXPECT_EQ(0, valid_utf8_string("\xbf", &pos));
-  EXPECT_EQ(0, pos);
-  EXPECT_EQ(0, valid_utf8_string("\x80\xbf", &pos));
-  EXPECT_EQ(0, pos);
-  EXPECT_EQ(0, valid_utf8_string("\xc2\x80\xbf", &pos));
-  EXPECT_EQ(2, pos);
-
-  /* Lonely start characters. */
-  EXPECT_EQ(0, valid_utf8_string("\xc2 \xc3 \xc4 ", &pos));
-  EXPECT_EQ(1, pos);
-
-  /* Out of range cases. */
-  EXPECT_EQ(0, valid_utf8_string("\xf4\x90\xbf\xbf", &pos));
-  EXPECT_EQ(1, pos);
-  EXPECT_EQ(0, valid_utf8_string(" \xf5\x80", &pos));
-  EXPECT_EQ(1, pos);
-  EXPECT_EQ(0, valid_utf8_string(" \xe0\x80\x80", &pos));
-  EXPECT_EQ(2, pos);
-  EXPECT_EQ(0, valid_utf8_string("\xf4\x80\x80\xcf", &pos));
-  EXPECT_EQ(3, pos);
-
-  /* Stop in mid-sequence. */
-  EXPECT_EQ(0, valid_utf8_string("\xf4\x80", &pos));
-  EXPECT_EQ(2, pos);
-
-  /* Bad characters. */
-  EXPECT_EQ(0, valid_utf8_string("\xff", &pos));
-  EXPECT_EQ(0, pos);
-  EXPECT_EQ(0, valid_utf8_string("\xfe", &pos));
-  EXPECT_EQ(0, pos);
-
-  /* Overlong representations of ASCII characters. */
-  EXPECT_EQ(0, valid_utf8_string("This represents the / character with too"
-                                 "many bytes: \xe0\x80\xaf",
-                                 &pos));
-  EXPECT_EQ(53, pos);
-  EXPECT_EQ(0, valid_utf8_string("This represents the / character with too"
-                                 "many bytes: \xf0\x80\x80\xaf",
-                                 &pos));
-  EXPECT_EQ(53, pos);
-
-  /* Should not be interpreted as the ASCII NUL character. */
-  EXPECT_EQ(0, valid_utf8_string("This represents the NUL character with too"
-                                 "many bytes: \xe0\x80\x80",
-                                 &pos));
-  EXPECT_EQ(55, pos);
-  EXPECT_EQ(0, valid_utf8_string("This represents the NUL character with too"
-                                 "many bytes: \xf0\x80\x80\x80",
-                                 &pos));
-  EXPECT_EQ(55, pos);
-
-  /* Single UTF-16 surrogates. */
-  EXPECT_EQ(0, valid_utf8_string("\xed\xa0\x80", &pos));
-  EXPECT_EQ(1, pos);
-  EXPECT_EQ(0, valid_utf8_string("\xed\xad\xbf", &pos));
-  EXPECT_EQ(1, pos);
-  EXPECT_EQ(0, valid_utf8_string("\xed\xae\x80", &pos));
-  EXPECT_EQ(1, pos);
-  EXPECT_EQ(0, valid_utf8_string("\xed\xaf\xbf", &pos));
-  EXPECT_EQ(1, pos);
-  EXPECT_EQ(0, valid_utf8_string("\xed\xb0\x80", &pos));
-  EXPECT_EQ(1, pos);
-  EXPECT_EQ(0, valid_utf8_string("\xed\xbe\x80", &pos));
-  EXPECT_EQ(1, pos);
-  EXPECT_EQ(0, valid_utf8_string("\xed\xbf\xbf", &pos));
-  EXPECT_EQ(1, pos);
-}
-
-}  //  namespace
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tests/util_unittest.cc b/cras/src/tests/util_unittest.cc
deleted file mode 100644
index e61336a..0000000
--- a/cras/src/tests/util_unittest.cc
+++ /dev/null
@@ -1,330 +0,0 @@
-// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <gtest/gtest.h>
-#include <sys/socket.h>
-#include <sys/types.h>
-#include <unistd.h>
-
-#include <string>
-#include <vector>
-
-#include "cras_util.h"
-
-namespace {
-
-static std::vector<struct timespec> time_now;
-
-TEST(Util, SendRecvTwoFileDescriptors) {
-  int fd[2];
-  int fd2[2];
-  int send_fds[2];
-  int sock[2];
-  char buf[256] = {0};
-  int new_fds[2];
-  char msg[] = "multi-fd";
-  unsigned int num_fds = 2;
-
-  /* Create a pipe and a pair of sockets. Then send the write end of
-   * the pipe (fd[1]) through the socket, and receive it as
-   * new_fd */
-  ASSERT_EQ(0, pipe(fd));
-  ASSERT_EQ(0, pipe(fd2));
-  ASSERT_EQ(0, socketpair(AF_UNIX, SOCK_STREAM, 0, sock));
-
-  send_fds[0] = fd[1];
-  send_fds[1] = fd2[1];
-  ASSERT_GE(cras_send_with_fds(sock[0], msg, strlen(msg), send_fds, num_fds),
-            0);
-  ASSERT_GE(cras_recv_with_fds(sock[1], buf, strlen(msg), new_fds, &num_fds),
-            0);
-  ASSERT_STREQ(msg, buf);
-  ASSERT_EQ(2, num_fds);
-  ASSERT_NE(-1, new_fds[0]);
-  ASSERT_NE(-1, new_fds[1]);
-
-  close(sock[0]);
-  close(sock[1]);
-  close(fd[1]);
-  close(fd2[1]);
-
-  /* Send a character to the new_fd, and receive it from the read end
-   * of the pipe (fd[0]) */
-  ASSERT_EQ(1, write(new_fds[0], "a", 1));
-  ASSERT_EQ(1, read(fd[0], buf, 1));
-  ASSERT_EQ('a', buf[0]);
-  ASSERT_EQ(1, write(new_fds[1], "b", 1));
-  ASSERT_EQ(1, read(fd2[0], buf, 1));
-  ASSERT_EQ('b', buf[0]);
-
-  close(fd[0]);
-  close(fd2[0]);
-  close(new_fds[0]);
-  close(new_fds[1]);
-}
-
-TEST(Util, SendOneRecvTwoFileDescriptors) {
-  int fd[2];
-  int sock[2];
-  char buf[256] = {0};
-  int new_fds[2];
-  char msg[] = "multi-fd";
-  unsigned int num_fds = 2;
-
-  /* Create a pipe and a pair of sockets. Then send the write end of
-   * the pipe (fd[1]) through the socket, and receive it as
-   * new_fd */
-  ASSERT_EQ(0, pipe(fd));
-  ASSERT_EQ(0, socketpair(AF_UNIX, SOCK_STREAM, 0, sock));
-
-  ASSERT_GE(cras_send_with_fds(sock[0], msg, strlen(msg), &fd[1], 1), 0);
-  ASSERT_GE(cras_recv_with_fds(sock[1], buf, strlen(msg), new_fds, &num_fds),
-            0);
-  ASSERT_STREQ(msg, buf);
-  ASSERT_EQ(1, num_fds);
-  ASSERT_NE(-1, new_fds[0]);
-  ASSERT_EQ(-1, new_fds[1]);
-
-  close(sock[0]);
-  close(sock[1]);
-  close(fd[1]);
-
-  /* Send a character to the new_fd, and receive it from the read end
-   * of the pipe (fd[0]) */
-  ASSERT_EQ(1, write(new_fds[0], "a", 1));
-  ASSERT_EQ(1, read(fd[0], buf, 1));
-  ASSERT_EQ('a', buf[0]);
-
-  close(fd[0]);
-  close(new_fds[0]);
-  close(new_fds[1]);
-}
-
-TEST(Util, SendRecvFileDescriptor) {
-  int fd[2];
-  int sock[2];
-  char buf[256] = {0};
-  int new_fd;
-  char msg[] = "hello";
-  unsigned int num_fds = 1;
-
-  /* Create a pipe and a pair of sockets. Then send the write end of
-   * the pipe (fd[1]) through the socket, and receive it as
-   * new_fd */
-  ASSERT_EQ(0, pipe(fd));
-  ASSERT_EQ(0, socketpair(AF_UNIX, SOCK_STREAM, 0, sock));
-
-  ASSERT_EQ(5, cras_send_with_fds(sock[0], msg, strlen(msg), &fd[1], num_fds));
-  ASSERT_EQ(5,
-            cras_recv_with_fds(sock[1], buf, strlen(msg), &new_fd, &num_fds));
-  ASSERT_STREQ(msg, buf);
-  ASSERT_EQ(1, num_fds);
-
-  close(sock[0]);
-  close(sock[1]);
-  close(fd[1]);
-
-  /* Send a character to the new_fd, and receive it from the read end
-   * of the pipe (fd[0]) */
-  ASSERT_EQ(1, write(new_fd, "a", 1));
-  ASSERT_EQ(1, read(fd[0], buf, 1));
-  ASSERT_EQ('a', buf[0]);
-
-  close(fd[0]);
-  close(new_fd);
-}
-
-TEST(Util, SendRecvNoDescriptors) {
-  char buf[256] = {0};
-  char msg[] = "no descriptors";
-  unsigned int num_fds = 0;
-  int sock[2];
-
-  ASSERT_EQ(0, socketpair(AF_UNIX, SOCK_STREAM, 0, sock));
-
-  ASSERT_GE(cras_send_with_fds(sock[0], msg, strlen(msg), NULL, num_fds), 0);
-  ASSERT_GE(cras_recv_with_fds(sock[1], buf, strlen(msg), NULL, &num_fds), 0);
-  ASSERT_STREQ(msg, buf);
-  ASSERT_EQ(0, num_fds);
-
-  close(sock[0]);
-  close(sock[1]);
-}
-
-TEST(Util, TimevalAfter) {
-  struct timeval t0, t1;
-  t0.tv_sec = 0;
-  t0.tv_usec = 0;
-  t1.tv_sec = 0;
-  t1.tv_usec = 0;
-  ASSERT_FALSE(timeval_after(&t0, &t1));
-  ASSERT_FALSE(timeval_after(&t1, &t0));
-  t0.tv_usec = 1;
-  ASSERT_TRUE(timeval_after(&t0, &t1));
-  ASSERT_FALSE(timeval_after(&t1, &t0));
-  t1.tv_sec = 1;
-  ASSERT_FALSE(timeval_after(&t0, &t1));
-  ASSERT_TRUE(timeval_after(&t1, &t0));
-}
-
-TEST(Util, FramesToTime) {
-  struct timespec t;
-
-  cras_frames_to_time(24000, 48000, &t);
-  EXPECT_EQ(0, t.tv_sec);
-  EXPECT_EQ(500000000, t.tv_nsec);
-
-  cras_frames_to_time(48000, 48000, &t);
-  EXPECT_EQ(1, t.tv_sec);
-  EXPECT_EQ(0, t.tv_nsec);
-
-  cras_frames_to_time(60000, 48000, &t);
-  EXPECT_EQ(1, t.tv_sec);
-  EXPECT_EQ(250000000, t.tv_nsec);
-
-  cras_frames_to_time(191999, 192000, &t);
-  EXPECT_EQ(0, t.tv_sec);
-  EXPECT_EQ(999994791, t.tv_nsec);
-}
-
-TEST(Util, TimeToFrames) {
-  struct timespec t;
-  unsigned int frames;
-
-  t.tv_sec = 0;
-  t.tv_nsec = 500000000;
-  frames = cras_time_to_frames(&t, 48000);
-  EXPECT_EQ(24000, frames);
-
-  t.tv_sec = 1;
-  t.tv_nsec = 500000000;
-  frames = cras_time_to_frames(&t, 48000);
-  EXPECT_EQ(72000, frames);
-
-  t.tv_sec = 0;
-  t.tv_nsec = 0;
-  frames = cras_time_to_frames(&t, 48000);
-  EXPECT_EQ(0, frames);
-}
-
-TEST(Util, FramesToMs) {
-  EXPECT_EQ(500, cras_frames_to_ms(24000, 48000));
-  EXPECT_EQ(0, cras_frames_to_ms(1, 48000));
-  EXPECT_EQ(10, cras_frames_to_ms(480, 48000));
-  EXPECT_EQ(10, cras_frames_to_ms(488, 48000));
-  EXPECT_EQ(50, cras_frames_to_ms(800, 16000));
-}
-
-TEST(Util, TimespecToMs) {
-  struct timespec ts;
-
-  ts.tv_sec = 0;
-  ts.tv_nsec = 500000000;
-  EXPECT_EQ(500, timespec_to_ms(&ts));
-
-  ts.tv_sec = 0;
-  ts.tv_nsec = 0;
-  EXPECT_EQ(0, timespec_to_ms(&ts));
-
-  ts.tv_sec = 0;
-  ts.tv_nsec = 2;
-  EXPECT_EQ(1, timespec_to_ms(&ts));
-
-  ts.tv_sec = 0;
-  ts.tv_nsec = 10000000;
-  EXPECT_EQ(10, timespec_to_ms(&ts));
-
-  ts.tv_sec = 1;
-  ts.tv_nsec = 0;
-  EXPECT_EQ(1000, timespec_to_ms(&ts));
-
-  ts.tv_sec = 1;
-  ts.tv_nsec = 1;
-  EXPECT_EQ(1001, timespec_to_ms(&ts));
-}
-
-TEST(Util, FramesSinceTime) {
-  struct timespec t, tn;
-  uint64_t frames;
-
-  t.tv_sec = 0;
-  t.tv_nsec = 500000000;
-
-  tn.tv_sec = 2;
-  tn.tv_nsec = 0;
-  time_now.push_back(tn);
-  frames = cras_frames_since_time(&t, 48000);
-  EXPECT_EQ(72000, frames);
-
-  tn.tv_sec = 0;
-  time_now.push_back(tn);
-  frames = cras_frames_since_time(&t, 48000);
-  EXPECT_EQ(0, frames);
-}
-
-// Test cras_poll().
-TEST(Util, CrasPoll) {
-  int pipe_fds[2];
-  struct pollfd poll_fd;
-  std::string output;
-  struct timespec timeout;
-  char buf[256];
-
-  ASSERT_EQ(0, pipe(pipe_fds));
-  poll_fd.fd = pipe_fds[0];
-  poll_fd.events = POLLIN;
-  ASSERT_NE(0, poll_fd.fd >= 0);
-
-  // Simple poll.
-  output = "Hello";
-  EXPECT_EQ(output.size() + 1,
-            write(pipe_fds[1], output.c_str(), output.size() + 1));
-  EXPECT_EQ(1, cras_poll(&poll_fd, 1, NULL, NULL));
-  ASSERT_EQ(static_cast<ssize_t>(output.size() + 1),
-            read(pipe_fds[0], buf, sizeof(buf)));
-  EXPECT_EQ(0, strcmp(output.c_str(), buf));
-
-  // Negative time.
-  timeout.tv_sec = 0;
-  timeout.tv_nsec = -10000000;
-  EXPECT_EQ(-ETIMEDOUT, cras_poll(&poll_fd, 1, &timeout, NULL));
-  timeout.tv_sec = -1;
-  timeout.tv_nsec = 10000000;
-  EXPECT_EQ(-ETIMEDOUT, cras_poll(&poll_fd, 1, &timeout, NULL));
-
-  // Timeout.
-  timeout.tv_sec = 0;
-  timeout.tv_nsec = 0;
-  time_now.push_back(timeout);
-  timeout.tv_nsec = 1100000;
-  time_now.push_back(timeout);
-  timeout.tv_nsec = 1000000;
-  EXPECT_EQ(-ETIMEDOUT, cras_poll(&poll_fd, 1, &timeout, NULL));
-  EXPECT_EQ(timeout.tv_nsec, -100000);
-
-  EXPECT_EQ(0, close(pipe_fds[0]));
-  EXPECT_EQ(0, close(pipe_fds[1]));
-}
-
-/* Stubs */
-extern "C" {
-
-int clock_gettime(clockid_t clk_id, struct timespec* tp) {
-  std::vector<struct timespec>::iterator i = time_now.begin();
-  if (i != time_now.end()) {
-    *tp = *i;
-    time_now.erase(i);
-  } else
-    memset(tp, 0, sizeof(*tp));
-  return 0;
-}
-
-}  // extern "C"
-
-}  //  namespace
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tests/volume_curve_unittest.cc b/cras/src/tests/volume_curve_unittest.cc
deleted file mode 100644
index 267452a..0000000
--- a/cras/src/tests/volume_curve_unittest.cc
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <gtest/gtest.h>
-#include <stdio.h>
-
-extern "C" {
-#include "cras_volume_curve.h"
-}
-
-namespace {
-
-TEST(VolumeCurve, DefaultCurve) {
-  struct cras_volume_curve* curve;
-  curve = cras_volume_curve_create_default();
-  ASSERT_NE(static_cast<struct cras_volume_curve*>(NULL), curve);
-  EXPECT_EQ(0 - 50 * 50, curve->get_dBFS(curve, 50));
-  EXPECT_EQ(0, curve->get_dBFS(curve, 100));
-  EXPECT_EQ(0 - 100 * 50, curve->get_dBFS(curve, 0));
-  EXPECT_EQ(0 - 25 * 50, curve->get_dBFS(curve, 75));
-  cras_volume_curve_destroy(curve);
-}
-
-TEST(VolumeCurve, SteppedCurve) {
-  struct cras_volume_curve* curve;
-  curve = cras_volume_curve_create_simple_step(-600, 75);
-  ASSERT_NE(static_cast<struct cras_volume_curve*>(NULL), curve);
-  EXPECT_EQ(-600 - 50 * 75, curve->get_dBFS(curve, 50));
-  EXPECT_EQ(-600, curve->get_dBFS(curve, 100));
-  EXPECT_EQ(-600 - 100 * 75, curve->get_dBFS(curve, 0));
-  EXPECT_EQ(-600 - 25 * 75, curve->get_dBFS(curve, 75));
-  cras_volume_curve_destroy(curve);
-}
-
-TEST(VolumeCurve, ExplicitCurve) {
-  struct cras_volume_curve* curve;
-  long dB_vals[101];
-
-  for (unsigned int i = 0; i < 101; i++)
-    dB_vals[i] = i * 2 + -400;
-  curve = cras_volume_curve_create_explicit(dB_vals);
-  ASSERT_NE(static_cast<struct cras_volume_curve*>(NULL), curve);
-  for (unsigned int i = 0; i < 101; i++)
-    EXPECT_EQ(i * 2 - 400, curve->get_dBFS(curve, i));
-  cras_volume_curve_destroy(curve);
-}
-
-}  //  namespace
-
-int main(int argc, char** argv) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/cras/src/tools/cras_monitor/cras_monitor.c b/cras/src/tools/cras_monitor/cras_monitor.c
deleted file mode 100644
index 1925277..0000000
--- a/cras/src/tools/cras_monitor/cras_monitor.c
+++ /dev/null
@@ -1,309 +0,0 @@
-/* Copyright 2016 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <errno.h>
-#include <getopt.h>
-#include <inttypes.h>
-#include <stdbool.h>
-#include <stdio.h>
-#include <stdint.h>
-#include <string.h>
-#include <syslog.h>
-#include <sys/select.h>
-#include <unistd.h>
-
-#include "cras_client.h"
-#include "cras_types.h"
-#include "cras_util.h"
-#include "cras_version.h"
-
-static void output_volume_changed(void *context, int32_t volume)
-{
-	printf("output volume: %d/100\n", volume);
-}
-
-static void output_mute_changed(void *context, int muted, int user_muted,
-				int mute_locked)
-{
-	printf("output mute: muted: %d, user_muted: %d, mute_locked: %d\n",
-	       muted, user_muted, mute_locked);
-}
-
-static void capture_mute_changed(void *context, int muted, int mute_locked)
-{
-	printf("capture mute: muted: %d, mute_locked: %d\n", muted,
-	       mute_locked);
-}
-
-static void nodes_changed(void *context)
-{
-	printf("nodes changed\n");
-}
-
-static const char *string_for_direction(enum CRAS_STREAM_DIRECTION dir)
-{
-	switch (dir) {
-	case CRAS_STREAM_OUTPUT:
-		return "output";
-	case CRAS_STREAM_INPUT:
-		return "input";
-	case CRAS_STREAM_POST_MIX_PRE_DSP:
-		return "post_mix_pre_dsp";
-	default:
-		break;
-	}
-
-	return "undefined";
-}
-
-size_t node_array_index_of_node_id(struct cras_ionode_info *nodes,
-				   size_t num_nodes, cras_node_id_t node_id)
-{
-	uint32_t dev_index = dev_index_of(node_id);
-	uint32_t node_index = node_index_of(node_id);
-	size_t i;
-
-	for (i = 0; i < num_nodes; i++) {
-		if (nodes[i].iodev_idx == dev_index &&
-		    nodes[i].ionode_idx == node_index)
-			return i;
-	}
-	return CRAS_MAX_IONODES;
-}
-
-const char *node_name_for_node_id(struct cras_client *client,
-				  enum CRAS_STREAM_DIRECTION dir,
-				  cras_node_id_t node_id)
-{
-	struct cras_ionode_info nodes[CRAS_MAX_IONODES];
-	struct cras_iodev_info devs[CRAS_MAX_IODEVS];
-	size_t num_devs = CRAS_MAX_IODEVS;
-	size_t num_nodes = CRAS_MAX_IONODES;
-	uint32_t iodev_idx = dev_index_of(node_id);
-	size_t node_index;
-	char buf[1024];
-	int rc;
-
-	if (node_id == 0) {
-		return strdup("none");
-	} else if (iodev_idx <= 2) {
-		return strdup("fallback");
-	} else if (dir == CRAS_STREAM_POST_MIX_PRE_DSP) {
-		snprintf(buf, sizeof(buf), "%s node: %" PRIu64 "\n",
-			 string_for_direction(dir), node_id);
-		return strdup(buf);
-	} else if (dir == CRAS_STREAM_OUTPUT) {
-		rc = cras_client_get_output_devices(client, devs, nodes,
-						    &num_devs, &num_nodes);
-	} else if (dir == CRAS_STREAM_INPUT) {
-		rc = cras_client_get_input_devices(client, devs, nodes,
-						   &num_devs, &num_nodes);
-	} else {
-		return strdup("unknown");
-	}
-
-	if (rc != 0) {
-		syslog(LOG_ERR, "Couldn't get output devices: %s\n",
-		       strerror(-rc));
-		snprintf(buf, sizeof(buf), "%u:%u", iodev_idx,
-			 node_index_of(node_id));
-		return strdup(buf);
-	}
-	node_index = node_array_index_of_node_id(nodes, num_nodes, node_id);
-	if (node_index >= num_nodes)
-		snprintf(buf, sizeof(buf), "unknown: %zu >= %zu", node_index,
-			 num_nodes);
-	else
-		snprintf(buf, sizeof(buf), "%u:%u: %s",
-			 nodes[node_index].iodev_idx,
-			 nodes[node_index].ionode_idx, nodes[node_index].name);
-	return strdup(buf);
-}
-
-static void active_node_changed(void *context, enum CRAS_STREAM_DIRECTION dir,
-				cras_node_id_t node_id)
-{
-	struct cras_client *client = (struct cras_client *)context;
-	const char *node_name = node_name_for_node_id(client, dir, node_id);
-	printf("active node (%s): %s\n", string_for_direction(dir), node_name);
-	free((void *)node_name);
-}
-
-static void output_node_volume_changed(void *context, cras_node_id_t node_id,
-				       int32_t volume)
-{
-	struct cras_client *client = (struct cras_client *)context;
-	const char *node_name =
-		node_name_for_node_id(client, CRAS_STREAM_OUTPUT, node_id);
-	printf("output node '%s' volume: %d\n", node_name, volume);
-	free((void *)node_name);
-}
-
-static void node_left_right_swapped_changed(void *context,
-					    cras_node_id_t node_id, int swapped)
-{
-	struct cras_client *client = (struct cras_client *)context;
-	const char *node_name =
-		node_name_for_node_id(client, CRAS_STREAM_OUTPUT, node_id);
-	printf("output node '%s' left-right swapped: %d\n", node_name, swapped);
-	free((void *)node_name);
-}
-
-static void input_node_gain_changed(void *context, cras_node_id_t node_id,
-				    int32_t gain)
-{
-	struct cras_client *client = (struct cras_client *)context;
-	const char *node_name =
-		node_name_for_node_id(client, CRAS_STREAM_INPUT, node_id);
-	printf("input node '%s' gain: %d\n", node_name, gain);
-	free((void *)node_name);
-}
-
-static void num_active_streams_changed(void *context,
-				       enum CRAS_STREAM_DIRECTION dir,
-				       uint32_t num_active_streams)
-{
-	printf("num active %s streams: %u\n", string_for_direction(dir),
-	       num_active_streams);
-}
-
-static void server_connection_callback(struct cras_client *client,
-				       cras_connection_status_t status,
-				       void *user_arg)
-{
-	const char *status_str = "undefined";
-	switch (status) {
-	case CRAS_CONN_STATUS_FAILED:
-		status_str = "error";
-		break;
-	case CRAS_CONN_STATUS_DISCONNECTED:
-		status_str = "disconnected";
-		break;
-	case CRAS_CONN_STATUS_CONNECTED:
-		status_str = "connected";
-		break;
-	}
-	printf("server %s\n", status_str);
-}
-
-static void print_usage(const char *command)
-{
-	fprintf(stderr,
-		"%s [options]\n"
-		"  Where [options] are:\n"
-		"    --sync|-s  - Use the synchronous connection functions.\n"
-		"    --log-level|-l <n>  - Set the syslog level (7 == "
-		"LOG_DEBUG).\n",
-		command);
-}
-
-int main(int argc, char **argv)
-{
-	struct cras_client *client;
-	int rc;
-	int option_character;
-	bool synchronous = false;
-	int log_level = LOG_WARNING;
-	static struct option long_options[] = {
-		{ "sync", no_argument, NULL, 's' },
-		{ "log-level", required_argument, NULL, 'l' },
-		{ NULL, 0, NULL, 0 },
-	};
-
-	while (true) {
-		int option_index = 0;
-
-		option_character = getopt_long(argc, argv, "sl:", long_options,
-					       &option_index);
-		if (option_character == -1)
-			break;
-		switch (option_character) {
-		case 's':
-			synchronous = !synchronous;
-			break;
-		case 'l':
-			log_level = atoi(optarg);
-			if (log_level < 0)
-				log_level = LOG_WARNING;
-			else if (log_level > LOG_DEBUG)
-				log_level = LOG_DEBUG;
-			break;
-		default:
-			print_usage(argv[0]);
-			return 1;
-		}
-	}
-
-	if (optind < argc) {
-		fprintf(stderr, "%s: Extra arguments.\n", argv[0]);
-		print_usage(argv[0]);
-		return 1;
-	}
-
-	openlog("cras_monitor", LOG_PERROR, LOG_USER);
-	setlogmask(LOG_UPTO(log_level));
-
-	rc = cras_client_create(&client);
-	if (rc < 0) {
-		syslog(LOG_ERR, "Couldn't create client.");
-		return rc;
-	}
-
-	cras_client_set_connection_status_cb(client, server_connection_callback,
-					     NULL);
-
-	if (synchronous) {
-		rc = cras_client_connect(client);
-		if (rc != 0) {
-			syslog(LOG_ERR, "Could not connect to server.");
-			return -rc;
-		}
-	}
-
-	cras_client_set_output_volume_changed_callback(client,
-						       output_volume_changed);
-	cras_client_set_output_mute_changed_callback(client,
-						     output_mute_changed);
-	cras_client_set_capture_mute_changed_callback(client,
-						      capture_mute_changed);
-	cras_client_set_nodes_changed_callback(client, nodes_changed);
-	cras_client_set_active_node_changed_callback(client,
-						     active_node_changed);
-	cras_client_set_output_node_volume_changed_callback(
-		client, output_node_volume_changed);
-	cras_client_set_node_left_right_swapped_changed_callback(
-		client, node_left_right_swapped_changed);
-	cras_client_set_input_node_gain_changed_callback(
-		client, input_node_gain_changed);
-	cras_client_set_num_active_streams_changed_callback(
-		client, num_active_streams_changed);
-	cras_client_set_state_change_callback_context(client, client);
-
-	rc = cras_client_run_thread(client);
-	if (rc != 0) {
-		syslog(LOG_ERR, "Could not start thread.");
-		return -rc;
-	}
-
-	if (!synchronous) {
-		rc = cras_client_connect_async(client);
-		if (rc) {
-			syslog(LOG_ERR, "Couldn't connect to server.\n");
-			goto destroy_exit;
-		}
-	}
-
-	while (1) {
-		int rc;
-		char c;
-		rc = read(STDIN_FILENO, &c, 1);
-		if (rc < 0 || c == 'q')
-			return 0;
-	}
-
-destroy_exit:
-	cras_client_destroy(client);
-	return 0;
-}
diff --git a/cras/src/tools/cras_router/cras_router.c b/cras/src/tools/cras_router/cras_router.c
deleted file mode 100644
index b65b052..0000000
--- a/cras/src/tools/cras_router/cras_router.c
+++ /dev/null
@@ -1,241 +0,0 @@
-/* Copyright 2016 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-#include <fcntl.h>
-#include <errno.h>
-#include <getopt.h>
-#include <pthread.h>
-#include <stdio.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/param.h>
-#include <unistd.h>
-
-#include "cras_client.h"
-#include "cras_types.h"
-#include "cras_util.h"
-#include "cras_version.h"
-
-#define PLAYBACK_BUFFERED_TIME_IN_NS (5000000)
-
-#define BUF_SIZE 32768
-
-static int keep_looping = 1;
-static int pipefd[2];
-struct cras_audio_format *aud_format;
-
-static int terminate_stream_loop(void)
-{
-	keep_looping = 0;
-	return write(pipefd[1], "1", 1);
-}
-
-static size_t get_block_size(uint64_t buffer_time_in_ns, size_t rate)
-{
-	static struct timespec t;
-
-	t.tv_nsec = buffer_time_in_ns;
-	t.tv_sec = 0;
-	return (size_t)cras_time_to_frames(&t, rate);
-}
-
-/* Run from callback thread. */
-static int got_samples(struct cras_client *client, cras_stream_id_t stream_id,
-		       uint8_t *captured_samples, uint8_t *playback_samples,
-		       unsigned int frames,
-		       const struct timespec *captured_time,
-		       const struct timespec *playback_time, void *user_arg)
-{
-	int *fd = (int *)user_arg;
-	int ret;
-	int write_size;
-	int frame_bytes;
-
-	frame_bytes = cras_client_format_bytes_per_frame(aud_format);
-	write_size = frames * frame_bytes;
-	ret = write(*fd, captured_samples, write_size);
-	if (ret != write_size)
-		printf("Error writing file\n");
-	return frames;
-}
-
-/* Run from callback thread. */
-static int put_samples(struct cras_client *client, cras_stream_id_t stream_id,
-		       uint8_t *captured_samples, uint8_t *playback_samples,
-		       unsigned int frames,
-		       const struct timespec *captured_time,
-		       const struct timespec *playback_time, void *user_arg)
-{
-	uint32_t frame_bytes = cras_client_format_bytes_per_frame(aud_format);
-	int fd = *(int *)user_arg;
-	uint8_t buff[BUF_SIZE];
-	int nread;
-
-	nread = read(fd, buff, MIN(frames * frame_bytes, BUF_SIZE));
-	if (nread <= 0) {
-		terminate_stream_loop();
-		return nread;
-	}
-
-	memcpy(playback_samples, buff, nread);
-	return nread / frame_bytes;
-}
-
-static int stream_error(struct cras_client *client, cras_stream_id_t stream_id,
-			int err, void *arg)
-{
-	printf("Stream error %d\n", err);
-	terminate_stream_loop();
-	return 0;
-}
-
-static int start_stream(struct cras_client *client, cras_stream_id_t *stream_id,
-			struct cras_stream_params *params, float stream_volume)
-{
-	int rc;
-
-	rc = cras_client_add_stream(client, stream_id, params);
-	if (rc < 0) {
-		fprintf(stderr, "adding a stream %d\n", rc);
-		return rc;
-	}
-	return cras_client_set_stream_volume(client, *stream_id, stream_volume);
-}
-
-static int run_file_io_stream(struct cras_client *client, int fd, int loop_fd,
-			      enum CRAS_STREAM_DIRECTION direction,
-			      size_t block_size, size_t rate,
-			      size_t num_channels)
-{
-	struct cras_stream_params *params;
-	cras_stream_id_t stream_id = 0;
-	int stream_playing = 0;
-	int *pfd = malloc(sizeof(*pfd));
-	*pfd = fd;
-	float volume_scaler = 1.0;
-
-	if (pipe(pipefd) == -1) {
-		perror("failed to open pipe");
-		return -errno;
-	}
-	aud_format = cras_audio_format_create(SND_PCM_FORMAT_S16_LE, rate,
-					      num_channels);
-	if (aud_format == NULL)
-		return -ENOMEM;
-
-	params = cras_client_unified_params_create(direction, block_size, 0, 0,
-						   pfd, got_samples,
-						   stream_error, aud_format);
-	if (params == NULL)
-		return -ENOMEM;
-
-	cras_client_run_thread(client);
-	stream_playing =
-		start_stream(client, &stream_id, params, volume_scaler) == 0;
-	if (!stream_playing)
-		return -EINVAL;
-
-	int *pfd1 = malloc(sizeof(*pfd1));
-	*pfd1 = loop_fd;
-	struct cras_stream_params *loop_params;
-	cras_stream_id_t loop_stream_id = 0;
-
-	direction = CRAS_STREAM_OUTPUT;
-
-	loop_params =
-		cras_client_unified_params_create(direction, block_size, 0, 0,
-						  pfd1, put_samples,
-						  stream_error, aud_format);
-	stream_playing = start_stream(client, &loop_stream_id, loop_params,
-				      volume_scaler) == 0;
-	if (!stream_playing)
-		return -EINVAL;
-
-	fd_set poll_set;
-
-	FD_ZERO(&poll_set);
-	FD_SET(pipefd[0], &poll_set);
-	pselect(pipefd[0] + 1, &poll_set, NULL, NULL, NULL, NULL);
-	cras_client_stop(client);
-	cras_audio_format_destroy(aud_format);
-	cras_client_stream_params_destroy(params);
-	free(pfd);
-
-	close(pipefd[0]);
-	close(pipefd[1]);
-
-	return 0;
-}
-
-static struct option long_options[] = { { "help", no_argument, 0, 'h' },
-					{ "rate", required_argument, 0, 'r' },
-					{ 0, 0, 0, 0 } };
-
-static void show_usage(void)
-{
-	printf("--help - shows this message and exits\n");
-	printf("--rate <N> - desired sample rate\n\n");
-	printf("Running cras_router will run a loop through ");
-	printf("from the currently set input to the currently set output.\n");
-	printf("Use cras_test_client --dump_s to see all avaiable nodes and");
-	printf(" cras_test_client --set_input/output to set a node.\n");
-}
-
-int main(int argc, char **argv)
-{
-	struct cras_client *client;
-	size_t rate = 44100;
-	size_t num_channels = 2;
-	size_t block_size;
-	int rc = 0;
-	int c, option_index;
-
-	option_index = 0;
-
-	rc = cras_client_create(&client);
-	if (rc < 0) {
-		fprintf(stderr, "Couldn't create client.\n");
-		return rc;
-	}
-
-	rc = cras_client_connect(client);
-	if (rc) {
-		fprintf(stderr, "Couldn't connect to server.\n");
-		goto destroy_exit;
-	}
-
-	while (1) {
-		c = getopt_long(argc, argv, "hr:", long_options, &option_index);
-		if (c == -1)
-			break;
-		switch (c) {
-		case 'h':
-			show_usage();
-			goto destroy_exit;
-		case 'r':
-			rate = atoi(optarg);
-			break;
-		default:
-			break;
-		}
-	}
-
-	block_size = get_block_size(PLAYBACK_BUFFERED_TIME_IN_NS, rate);
-
-	/* Run loopthrough */
-	int pfd[2];
-
-	rc = pipe(pfd);
-	if (rc < 0) {
-		fprintf(stderr, "Couldn't create loopthrough pipe.\n");
-		return rc;
-	}
-	run_file_io_stream(client, pfd[1], pfd[0], CRAS_STREAM_INPUT,
-			   block_size, rate, num_channels);
-
-destroy_exit:
-	cras_client_destroy(client);
-	return rc;
-}
diff --git a/cras/src/tools/cras_test_client/cras_test_client.c b/cras/src/tools/cras_test_client/cras_test_client.c
deleted file mode 100644
index 7a85185..0000000
--- a/cras/src/tools/cras_test_client/cras_test_client.c
+++ /dev/null
@@ -1,2426 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <errno.h>
-#include <fcntl.h>
-#include <getopt.h>
-#include <inttypes.h>
-#include <limits.h>
-#include <math.h>
-#include <pthread.h>
-#include <stdio.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <string.h>
-#include <syslog.h>
-#include <sys/mman.h>
-#include <sys/param.h>
-#include <sys/select.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <unistd.h>
-
-#include "cras_client.h"
-#include "cras_types.h"
-#include "cras_util.h"
-#include "cras_version.h"
-
-#define NOT_ASSIGNED (0)
-#define PLAYBACK_BUFFERED_TIME_IN_US (5000)
-
-#define BUF_SIZE 32768
-
-static const size_t MAX_IODEVS = 10; /* Max devices to print out. */
-static const size_t MAX_IONODES = 20; /* Max ionodes to print out. */
-static const size_t MAX_ATTACHED_CLIENTS = 10; /* Max clients to print out. */
-
-static int pipefd[2];
-static struct timespec last_latency;
-static int show_latency;
-static float last_rms_sqr_sum;
-static int last_rms_size;
-static float total_rms_sqr_sum;
-static int total_rms_size;
-static int show_rms;
-static int show_total_rms;
-static int keep_looping = 1;
-static int exit_after_done_playing = 1;
-static size_t duration_frames;
-static int pause_client = 0;
-static int pause_a_reply = 0;
-static int pause_in_playback_reply = 1000;
-
-static char *channel_layout = NULL;
-static int pin_device_id;
-
-static int play_short_sound = 0;
-static int play_short_sound_periods = 0;
-static int play_short_sound_periods_left = 0;
-
-static int effect_aec = 0;
-static int effect_ns = 0;
-static int effect_agc = 0;
-static int effect_vad = 0;
-static char *aecdump_file = NULL;
-static char time_str[128];
-
-/* Sleep interval between cras_client_read_atlog calls. */
-static const struct timespec follow_atlog_sleep_ts = {
-	0, 50 * 1000 * 1000 /* 50 ms. */
-};
-
-/* Conditional so the client thread can signal that main should exit. */
-static pthread_mutex_t done_mutex = PTHREAD_MUTEX_INITIALIZER;
-static pthread_cond_t done_cond = PTHREAD_COND_INITIALIZER;
-
-struct cras_audio_format *aud_format;
-struct {
-	char *name;
-	snd_pcm_format_t format;
-} supported_formats[] = {
-	{ "S16_LE", SND_PCM_FORMAT_S16_LE },
-	{ "S24_LE", SND_PCM_FORMAT_S24_LE },
-	{ "S32_LE", SND_PCM_FORMAT_S32_LE },
-	{ NULL, 0 },
-};
-
-static int terminate_stream_loop()
-{
-	keep_looping = 0;
-	return write(pipefd[1], "1", 1);
-}
-
-static size_t get_block_size(uint64_t buffer_time_in_us, size_t rate)
-{
-	return (size_t)(buffer_time_in_us * rate / 1000000);
-}
-
-static void check_stream_terminate(size_t frames)
-{
-	if (duration_frames) {
-		if (duration_frames <= frames)
-			terminate_stream_loop();
-		else
-			duration_frames -= frames;
-	}
-}
-
-static void fill_time_offset(time_t *sec_offset, int32_t *nsec_offset)
-{
-	struct timespec mono_time, real_time;
-
-	clock_gettime(CLOCK_MONOTONIC_RAW, &mono_time);
-	clock_gettime(CLOCK_REALTIME, &real_time);
-	*sec_offset = real_time.tv_sec - mono_time.tv_sec;
-	*nsec_offset = real_time.tv_nsec - mono_time.tv_nsec;
-}
-
-/* Compute square sum of samples (for calculation of RMS value). */
-float compute_sqr_sum_16(const int16_t *samples, int size)
-{
-	unsigned i;
-	float sqr_sum = 0;
-
-	for (i = 0; i < size; i++)
-		sqr_sum += samples[i] * samples[i];
-
-	return sqr_sum;
-}
-
-/* Update the RMS values with the given samples. */
-int update_rms(const uint8_t *samples, int size)
-{
-	switch (aud_format->format) {
-	case SND_PCM_FORMAT_S16_LE: {
-		last_rms_sqr_sum =
-			compute_sqr_sum_16((int16_t *)samples, size / 2);
-		last_rms_size = size / 2;
-		break;
-	}
-	default:
-		return -EINVAL;
-	}
-
-	total_rms_sqr_sum += last_rms_sqr_sum;
-	total_rms_size += last_rms_size;
-
-	return 0;
-}
-
-/* Parses a string with format <N>:<M> into a node id*/
-static int parse_node_id(char *input, cras_node_id_t *id_out)
-{
-	const char *s;
-	char *endptr;
-	int dev_index;
-	int node_index;
-
-	if (!id_out)
-		return -EINVAL;
-
-	s = strtok(input, ":");
-	if (!s)
-		return -EINVAL;
-	dev_index = strtol(s, &endptr, 10);
-	if (*endptr)
-		return -EINVAL;
-
-	s = strtok(NULL, ":");
-	if (!s)
-		return -EINVAL;
-	node_index = strtol(s, &endptr, 10);
-	if (*endptr)
-		return -EINVAL;
-
-	*id_out = cras_make_node_id(dev_index, node_index);
-	return 0;
-}
-
-/* Parses a string with format <N>:<M>:<0-100> into a node id and a value */
-static int parse_node_id_with_value(char *input, cras_node_id_t *id_out,
-				    int *value_out)
-{
-	const char *s;
-	char *endptr;
-	int dev_index;
-	int node_index;
-	long int value;
-
-	if (!id_out || !value_out)
-		return -EINVAL;
-
-	s = strtok(input, ":");
-	if (!s)
-		return -EINVAL;
-	dev_index = strtol(s, &endptr, 10);
-	if (*endptr)
-		return -EINVAL;
-
-	s = strtok(NULL, ":");
-	if (!s)
-		return -EINVAL;
-	node_index = strtol(s, &endptr, 10);
-	if (*endptr)
-		return -EINVAL;
-
-	s = strtok(NULL, ":");
-	if (!s)
-		return -EINVAL;
-	value = strtol(s, &endptr, 10);
-	if (*endptr)
-		return -EINVAL;
-	if (value > INT_MAX || value < INT_MIN)
-		return -EOVERFLOW;
-
-	*id_out = cras_make_node_id(dev_index, node_index);
-	*value_out = value;
-	return 0;
-}
-
-/* Run from callback thread. */
-static int got_samples(struct cras_client *client, cras_stream_id_t stream_id,
-		       uint8_t *captured_samples, uint8_t *playback_samples,
-		       unsigned int frames,
-		       const struct timespec *captured_time,
-		       const struct timespec *playback_time, void *user_arg)
-{
-	int *fd = (int *)user_arg;
-	int ret;
-	int write_size;
-	int frame_bytes;
-
-	while (pause_client)
-		usleep(10000);
-
-	cras_client_calc_capture_latency(captured_time, &last_latency);
-
-	frame_bytes = cras_client_format_bytes_per_frame(aud_format);
-	write_size = frames * frame_bytes;
-
-	/* Update RMS values with all available frames. */
-	if (keep_looping) {
-		update_rms(captured_samples,
-			   MIN(write_size, duration_frames * frame_bytes));
-	}
-
-	check_stream_terminate(frames);
-
-	ret = write(*fd, captured_samples, write_size);
-	if (ret != write_size)
-		printf("Error writing file\n");
-	return frames;
-}
-
-/* Run from callback thread. */
-static int put_samples(struct cras_client *client, cras_stream_id_t stream_id,
-		       uint8_t *captured_samples, uint8_t *playback_samples,
-		       unsigned int frames,
-		       const struct timespec *captured_time,
-		       const struct timespec *playback_time, void *user_arg)
-{
-	uint32_t frame_bytes = cras_client_format_bytes_per_frame(aud_format);
-	int fd = *(int *)user_arg;
-	uint8_t buff[BUF_SIZE];
-	int nread;
-
-	while (pause_client)
-		usleep(10000);
-
-	if (pause_a_reply) {
-		usleep(pause_in_playback_reply);
-		pause_a_reply = 0;
-	}
-
-	check_stream_terminate(frames);
-
-	cras_client_calc_playback_latency(playback_time, &last_latency);
-
-	if (play_short_sound) {
-		if (play_short_sound_periods_left)
-			/* Play a period from file. */
-			play_short_sound_periods_left--;
-		else {
-			/* Fill zeros to play silence. */
-			memset(playback_samples, 0,
-			       MIN(frames * frame_bytes, BUF_SIZE));
-			return frames;
-		}
-	}
-
-	nread = read(fd, buff, MIN(frames * frame_bytes, BUF_SIZE));
-	if (nread <= 0) {
-		if (exit_after_done_playing)
-			terminate_stream_loop();
-		return nread;
-	}
-
-	memcpy(playback_samples, buff, nread);
-	return nread / frame_bytes;
-}
-
-/* Run from callback thread. */
-static int
-put_stdin_samples(struct cras_client *client, cras_stream_id_t stream_id,
-		  uint8_t *captured_samples, uint8_t *playback_samples,
-		  unsigned int frames, const struct timespec *captured_time,
-		  const struct timespec *playback_time, void *user_arg)
-{
-	int rc = 0;
-	uint32_t frame_bytes = cras_client_format_bytes_per_frame(aud_format);
-
-	rc = read(0, playback_samples, (size_t)frames * (size_t)frame_bytes);
-	if (rc <= 0) {
-		terminate_stream_loop();
-		return -1;
-	}
-
-	return rc / frame_bytes;
-}
-
-static int stream_error(struct cras_client *client, cras_stream_id_t stream_id,
-			int err, void *arg)
-{
-	printf("Stream error %d\n", err);
-	terminate_stream_loop();
-	return 0;
-}
-
-static void print_last_latency()
-{
-	if (last_latency.tv_sec > 0 || last_latency.tv_nsec > 0)
-		printf("%u.%09u\n", (unsigned)last_latency.tv_sec,
-		       (unsigned)last_latency.tv_nsec);
-	else {
-		printf("-%lld.%09lld\n", (long long)-last_latency.tv_sec,
-		       (long long)-last_latency.tv_nsec);
-	}
-}
-
-static void print_last_rms()
-{
-	if (last_rms_size != 0)
-		printf("%.9f\n", sqrt(last_rms_sqr_sum / last_rms_size));
-}
-
-static void print_total_rms()
-{
-	if (total_rms_size != 0)
-		printf("%.9f\n", sqrt(total_rms_sqr_sum / total_rms_size));
-}
-
-static void print_dev_info(const struct cras_iodev_info *devs, int num_devs)
-{
-	unsigned i;
-
-	printf("\tID\tMaxCha\tName\n");
-	for (i = 0; i < num_devs; i++)
-		printf("\t%u\t%u\t%s\n", devs[i].idx,
-		       devs[i].max_supported_channels, devs[i].name);
-}
-
-static void print_node_info(struct cras_client *client,
-			    const struct cras_ionode_info *nodes, int num_nodes,
-			    int is_input)
-{
-	unsigned i;
-
-	printf("\tStable Id\t ID\t%4s  UI       Plugged\tL/R swapped\t      "
-	       "Time Hotword\tType\t\tMaxCha Name\n",
-	       is_input ? "Gain" : " Vol");
-	for (i = 0; i < num_nodes; i++) {
-		char max_channels_str[7];
-		if (is_input) {
-			// Print "X" as don't-care for input nodes because
-			// cras_client_get_max_supported_channels() is only valid for outputs.
-			strcpy(max_channels_str, "     X");
-		} else {
-			uint32_t max_channels;
-			int rc = cras_client_get_max_supported_channels(
-				client,
-				cras_make_node_id(nodes[i].iodev_idx,
-						  nodes[i].ionode_idx),
-				&max_channels);
-			if (rc)
-				max_channels = 0;
-			sprintf(max_channels_str, "%6u", max_channels);
-		}
-		printf("\t(%08x)\t%u:%u\t%5g %f %7s\t%14s\t%10ld %-7s\t%-16s%-6s%c%s\n",
-		       nodes[i].stable_id, nodes[i].iodev_idx,
-		       nodes[i].ionode_idx,
-		       is_input ? nodes[i].capture_gain / 100.0 :
-				  (double)nodes[i].volume,
-		       nodes[i].ui_gain_scaler, nodes[i].plugged ? "yes" : "no",
-		       nodes[i].left_right_swapped ? "yes" : "no",
-		       (long)nodes[i].plugged_time.tv_sec,
-		       nodes[i].active_hotword_model, nodes[i].type,
-		       max_channels_str, nodes[i].active ? '*' : ' ',
-		       nodes[i].name);
-	}
-}
-
-static void print_device_lists(struct cras_client *client)
-{
-	struct cras_iodev_info devs[MAX_IODEVS];
-	struct cras_ionode_info nodes[MAX_IONODES];
-	size_t num_devs, num_nodes;
-	int rc;
-
-	num_devs = MAX_IODEVS;
-	num_nodes = MAX_IONODES;
-	rc = cras_client_get_output_devices(client, devs, nodes, &num_devs,
-					    &num_nodes);
-	if (rc < 0)
-		return;
-	printf("Output Devices:\n");
-	print_dev_info(devs, num_devs);
-	printf("Output Nodes:\n");
-	print_node_info(client, nodes, num_nodes, 0);
-
-	num_devs = MAX_IODEVS;
-	num_nodes = MAX_IONODES;
-	rc = cras_client_get_input_devices(client, devs, nodes, &num_devs,
-					   &num_nodes);
-	printf("Input Devices:\n");
-	print_dev_info(devs, num_devs);
-	printf("Input Nodes:\n");
-	print_node_info(client, nodes, num_nodes, 1);
-}
-
-static void print_attached_client_list(struct cras_client *client)
-{
-	struct cras_attached_client_info clients[MAX_ATTACHED_CLIENTS];
-	size_t i;
-	int num_clients;
-
-	num_clients = cras_client_get_attached_clients(client, clients,
-						       MAX_ATTACHED_CLIENTS);
-	if (num_clients < 0)
-		return;
-	num_clients = MIN(num_clients, MAX_ATTACHED_CLIENTS);
-	printf("Attached clients:\n");
-	printf("\tID\tpid\tuid\n");
-	for (i = 0; i < num_clients; i++)
-		printf("\t%u\t%d\t%d\n", clients[i].id, clients[i].pid,
-		       clients[i].gid);
-}
-
-static void print_active_stream_info(struct cras_client *client)
-{
-	struct timespec ts;
-	unsigned num_streams;
-
-	num_streams = cras_client_get_num_active_streams(client, &ts);
-	printf("Num active streams: %u\n", num_streams);
-	printf("Last audio active time: %llu, %llu\n", (long long)ts.tv_sec,
-	       (long long)ts.tv_nsec);
-}
-
-static void print_system_volumes(struct cras_client *client)
-{
-	printf("System Volume (0-100): %zu %s\n"
-	       "Capture Muted : %s\n",
-	       cras_client_get_system_volume(client),
-	       cras_client_get_system_muted(client) ? "(Muted)" : "",
-	       cras_client_get_system_capture_muted(client) ? "Muted" :
-							      "Not muted");
-}
-
-static void print_user_muted(struct cras_client *client)
-{
-	printf("User muted: %s\n",
-	       cras_client_get_user_muted(client) ? "Muted" : "Not muted");
-}
-
-/*
- * Convert time value from one clock to the other using given offset
- * in sec and nsec.
- */
-static void convert_time(unsigned int *sec, unsigned int *nsec,
-			 time_t sec_offset, int32_t nsec_offset)
-{
-	sec_offset += *sec;
-	nsec_offset += *nsec;
-	if (nsec_offset >= 1000000000L) {
-		sec_offset++;
-		nsec_offset -= 1000000000L;
-	} else if (nsec_offset < 0) {
-		sec_offset--;
-		nsec_offset += 1000000000L;
-	}
-	*sec = sec_offset;
-	*nsec = nsec_offset;
-}
-
-static float get_ewma_power_as_float(uint32_t data)
-{
-	float f = 0.0f;
-
-	/* Convert from the uint32_t log type back to float.
-	 * If data cannot be assigned to float, default value will
-	 * be printed as -inf to hint the problem.
-	 */
-	if (sizeof(uint32_t) == sizeof(float))
-		memcpy(&f, &data, sizeof(float));
-	else
-		printf("%-30s float to uint32_t\n", "MEMORY_NOT_ALIGNED");
-
-	/* Convert to dBFS and set to zero if it's
-	 * insignificantly low.  Picking the same threshold
-	 * 1.0e-10f as in Chrome.
-	 */
-	return (f < 1.0e-10f) ? -INFINITY : 10.0f * log10f(f);
-}
-
-static void show_alog_tag(const struct audio_thread_event_log *log,
-			  unsigned int tag_idx, int32_t sec_offset,
-			  int32_t nsec_offset)
-{
-	unsigned int tag = (log->log[tag_idx].tag_sec >> 24) & 0xff;
-	unsigned int sec = log->log[tag_idx].tag_sec & 0x00ffffff;
-	unsigned int nsec = log->log[tag_idx].nsec;
-	unsigned int data1 = log->log[tag_idx].data1;
-	unsigned int data2 = log->log[tag_idx].data2;
-	unsigned int data3 = log->log[tag_idx].data3;
-	time_t lt;
-	struct tm t;
-
-	/* Skip unused log entries. */
-	if (log->log[tag_idx].tag_sec == 0 && log->log[tag_idx].nsec == 0)
-		return;
-
-	/* Convert from monotonic raw clock to realtime clock. */
-	convert_time(&sec, &nsec, sec_offset, nsec_offset);
-	lt = sec;
-	localtime_r(&lt, &t);
-	strftime(time_str, 128, "%Y-%m-%dT%H:%M:%S", &t);
-
-	printf("%s.%09u cras atlog  ", time_str, nsec);
-
-	/* Prepare realtime string for arguments. */
-	switch (tag) {
-	case AUDIO_THREAD_A2DP_FLUSH:
-	case AUDIO_THREAD_READ_AUDIO_TSTAMP:
-	case AUDIO_THREAD_FILL_AUDIO_TSTAMP:
-	case AUDIO_THREAD_STREAM_RESCHEDULE:
-	case AUDIO_THREAD_STREAM_SLEEP_TIME:
-	case AUDIO_THREAD_STREAM_SLEEP_ADJUST:
-	case AUDIO_THREAD_DEV_SLEEP_TIME:
-		sec = data2;
-		nsec = data3;
-		break;
-	}
-	convert_time(&sec, &nsec, sec_offset, nsec_offset);
-	lt = sec;
-	localtime_r(&lt, &t);
-	strftime(time_str, 128, " %H:%M:%S", &t);
-
-	switch (tag) {
-	case AUDIO_THREAD_WAKE:
-		printf("%-30s num_fds:%d\n", "WAKE", (int)data1);
-		break;
-	case AUDIO_THREAD_SLEEP:
-		printf("%-30s sleep:%09d.%09d non_empty %u\n", "SLEEP",
-		       (int)data1, (int)data2, (int)data3);
-		break;
-	case AUDIO_THREAD_READ_AUDIO:
-		printf("%-30s dev:%u hw_level:%u read:%u\n", "READ_AUDIO",
-		       data1, data2, data3);
-		break;
-	case AUDIO_THREAD_READ_AUDIO_TSTAMP:
-		printf("%-30s dev:%u tstamp:%s.%09u\n", "READ_AUDIO_TSTAMP",
-		       data1, time_str, nsec);
-		break;
-	case AUDIO_THREAD_READ_AUDIO_DONE: {
-		float f = get_ewma_power_as_float(data2);
-		printf("%-30s read_remainder:%u power:%f dBFS\n",
-		       "READ_AUDIO_DONE", data1, f);
-		break;
-	}
-	case AUDIO_THREAD_READ_OVERRUN:
-		printf("%-30s dev:%u stream:%x num_overruns:%u\n",
-		       "READ_AUDIO_OVERRUN", data1, data2, data3);
-		break;
-	case AUDIO_THREAD_FILL_AUDIO:
-		printf("%-30s dev:%u hw_level:%u min_cb_level:%u\n",
-		       "FILL_AUDIO", data1, data2, data3);
-		break;
-	case AUDIO_THREAD_FILL_AUDIO_TSTAMP:
-		printf("%-30s dev:%u tstamp:%s.%09u\n", "FILL_AUDIO_TSTAMP",
-		       data1, time_str, nsec);
-		break;
-	case AUDIO_THREAD_FILL_AUDIO_DONE: {
-		float f = get_ewma_power_as_float(data3);
-		printf("%-30s hw_level:%u total_written:%u power:%f dBFS\n",
-		       "FILL_AUDIO_DONE", data1, data2, f);
-		break;
-	}
-	case AUDIO_THREAD_WRITE_STREAMS_WAIT:
-		printf("%-30s stream:%x\n", "WRITE_STREAMS_WAIT", data1);
-		break;
-	case AUDIO_THREAD_WRITE_STREAMS_WAIT_TO:
-		printf("%-30s\n", "WRITE_STREAMS_WAIT_TO");
-		break;
-	case AUDIO_THREAD_WRITE_STREAMS_MIX:
-		printf("%-30s write_limit:%u max_offset:%u\n",
-		       "WRITE_STREAMS_MIX", data1, data2);
-		break;
-	case AUDIO_THREAD_WRITE_STREAMS_MIXED:
-		printf("%-30s write_limit:%u\n", "WRITE_STREAMS_MIXED", data1);
-		break;
-	case AUDIO_THREAD_WRITE_STREAMS_STREAM:
-		printf("%-30s id:%x shm_frames:%u cb_pending:%u\n",
-		       "WRITE_STREAMS_STREAM", data1, data2, data3);
-		break;
-	case AUDIO_THREAD_FETCH_STREAM: {
-		float f = get_ewma_power_as_float(data3);
-		printf("%-30s id:%x cbth:%u power:%f dBFS\n",
-		       "WRITE_STREAMS_FETCH_STREAM", data1, data2, f);
-		break;
-	}
-	case AUDIO_THREAD_STREAM_ADDED:
-		printf("%-30s id:%x dev:%u\n", "STREAM_ADDED", data1, data2);
-		break;
-	case AUDIO_THREAD_STREAM_REMOVED:
-		printf("%-30s id:%x\n", "STREAM_REMOVED", data1);
-		break;
-		break;
-	case AUDIO_THREAD_A2DP_FLUSH:
-		printf("%-30s state %u next flush time:%s.%09u\n", "A2DP_FLUSH",
-		       data1, time_str, nsec);
-		break;
-	case AUDIO_THREAD_A2DP_THROTTLE_TIME:
-		printf("%-30s %u ms, queued:%u\n", "A2DP_THROTTLE_TIME",
-		       data1 * 1000 + data2 / 1000000, data3);
-		break;
-	case AUDIO_THREAD_A2DP_WRITE:
-		printf("%-30s written:%d queued:%u\n", "A2DP_WRITE", data1,
-		       data2);
-		break;
-	case AUDIO_THREAD_DEV_STREAM_MIX:
-		printf("%-30s written:%u read:%u\n", "DEV_STREAM_MIX", data1,
-		       data2);
-		break;
-	case AUDIO_THREAD_CAPTURE_POST:
-		printf("%-30s stream:%x thresh:%u rd_buf:%u\n", "CAPTURE_POST",
-		       data1, data2, data3);
-		break;
-	case AUDIO_THREAD_CAPTURE_WRITE:
-		printf("%-30s stream:%x write:%u shm_fr:%u\n", "CAPTURE_WRITE",
-		       data1, data2, data3);
-		break;
-	case AUDIO_THREAD_CONV_COPY:
-		printf("%-30s wr_buf:%u shm_writable:%u offset:%u\n",
-		       "CONV_COPY", data1, data2, data3);
-		break;
-	case AUDIO_THREAD_STREAM_FETCH_PENDING:
-		printf("%-30s id:%x\n", "STREAM_FETCH_PENGING", data1);
-		break;
-	case AUDIO_THREAD_STREAM_RESCHEDULE:
-		printf("%-30s id:%x next_cb_ts:%s.%09u\n", "STREAM_RESCHEDULE",
-		       data1, time_str, nsec);
-		break;
-	case AUDIO_THREAD_STREAM_SLEEP_TIME:
-		printf("%-30s id:%x wake:%s.%09u\n", "STREAM_SLEEP_TIME", data1,
-		       time_str, nsec);
-		break;
-	case AUDIO_THREAD_STREAM_SLEEP_ADJUST:
-		printf("%-30s id:%x from:%s.%09u\n", "STREAM_SLEEP_ADJUST",
-		       data1, time_str, nsec);
-		break;
-	case AUDIO_THREAD_STREAM_SKIP_CB:
-		printf("%-30s id:%x write_offset_0:%u write_offset_1:%u\n",
-		       "STREAM_SKIP_CB", data1, data2, data3);
-		break;
-	case AUDIO_THREAD_DEV_SLEEP_TIME:
-		printf("%-30s dev:%u wake:%s.%09u\n", "DEV_SLEEP_TIME", data1,
-		       time_str, nsec);
-		break;
-	case AUDIO_THREAD_SET_DEV_WAKE:
-		printf("%-30s dev:%u hw_level:%u sleep:%u\n", "SET_DEV_WAKE",
-		       data1, data2, data3);
-		break;
-	case AUDIO_THREAD_DEV_ADDED:
-		printf("%-30s dev:%u\n", "DEV_ADDED", data1);
-		break;
-	case AUDIO_THREAD_DEV_REMOVED:
-		printf("%-30s dev:%u\n", "DEV_REMOVED", data1);
-		break;
-	case AUDIO_THREAD_IODEV_CB:
-		printf("%-30s revents:%u events:%u\n", "IODEV_CB", data1,
-		       data2);
-		break;
-	case AUDIO_THREAD_PB_MSG:
-		printf("%-30s msg_id:%u\n", "PB_MSG", data1);
-		break;
-	case AUDIO_THREAD_ODEV_NO_STREAMS:
-		printf("%-30s dev:%u\n", "ODEV_NO_STREAMS", data1);
-		break;
-	case AUDIO_THREAD_ODEV_LEAVE_NO_STREAMS:
-		printf("%-30s dev:%u\n", "ODEV_LEAVE_NO_STREAMS", data1);
-		break;
-	case AUDIO_THREAD_ODEV_START:
-		printf("%-30s dev:%u min_cb_level:%u\n", "ODEV_START", data1,
-		       data2);
-		break;
-	case AUDIO_THREAD_FILL_ODEV_ZEROS:
-		printf("%-30s dev:%u write:%u\n", "FILL_ODEV_ZEROS", data1,
-		       data2);
-		break;
-	case AUDIO_THREAD_ODEV_DEFAULT_NO_STREAMS:
-		printf("%-30s dev:%u hw_level:%u target:%u\n",
-		       "DEFAULT_NO_STREAMS", data1, data2, data3);
-		break;
-	case AUDIO_THREAD_UNDERRUN:
-		printf("%-30s dev:%u hw_level:%u total_written:%u\n",
-		       "UNDERRUN", data1, data2, data3);
-		break;
-	case AUDIO_THREAD_SEVERE_UNDERRUN:
-		printf("%-30s dev:%u\n", "SEVERE_UNDERRUN", data1);
-		break;
-	case AUDIO_THREAD_CAPTURE_DROP_TIME:
-		printf("%-30s time:%09u.%09d\n", "CAPTURE_DROP_TIME", data1,
-		       data2);
-		break;
-	case AUDIO_THREAD_DEV_DROP_FRAMES:
-		printf("%-30s dev:%u frames:%u\n", "DEV_DROP_FRAMES", data1,
-		       data2);
-		break;
-	case AUDIO_THREAD_LOOPBACK_PUT:
-		printf("%-30s nframes_committed:%u\n", "LOOPBACK_PUT", data1);
-		break;
-	case AUDIO_THREAD_LOOPBACK_GET:
-		printf("%-30s nframes_requested:%u avail:%u\n", "LOOPBACK_GET",
-		       data1, data2);
-		break;
-	case AUDIO_THREAD_LOOPBACK_SAMPLE_HOOK:
-		printf("%-30s frames_to_copy:%u frames_copied:%u\n",
-		       "LOOPBACK_SAMPLE", data1, data2);
-		break;
-	case AUDIO_THREAD_DEV_OVERRUN:
-		printf("%-30s dev:%u hw_level:%u\n", "DEV_OVERRUN", data1,
-		       data2);
-		break;
-	default:
-		printf("%-30s tag:%u\n", "UNKNOWN", tag);
-		break;
-	}
-}
-
-static void print_audio_debug_info(const struct audio_debug_info *info)
-{
-	time_t sec_offset;
-	int32_t nsec_offset;
-	int i, j;
-
-	printf("Audio Debug Stats:\n");
-	printf("-------------devices------------\n");
-	if (info->num_devs > MAX_DEBUG_DEVS)
-		return;
-
-	for (i = 0; i < info->num_devs; i++) {
-		printf("%s dev: %s\n",
-		       (info->devs[i].direction == CRAS_STREAM_INPUT) ?
-			       "Input" :
-			       "Output",
-		       info->devs[i].dev_name);
-		printf("buffer_size: %u\n"
-		       "min_buffer_level: %u\n"
-		       "min_cb_level: %u\n"
-		       "max_cb_level: %u\n"
-		       "frame_rate: %u\n"
-		       "num_channels: %u\n"
-		       "est_rate_ratio: %lf\n"
-		       "num_underruns: %u\n"
-		       "num_severe_underruns: %u\n"
-		       "highest_hw_level: %u\n"
-		       "runtime: %u.%09u\n"
-		       "longest_wake: %u.%09u\n"
-		       "software_gain_scaler: %lf\n",
-		       (unsigned int)info->devs[i].buffer_size,
-		       (unsigned int)info->devs[i].min_buffer_level,
-		       (unsigned int)info->devs[i].min_cb_level,
-		       (unsigned int)info->devs[i].max_cb_level,
-		       (unsigned int)info->devs[i].frame_rate,
-		       (unsigned int)info->devs[i].num_channels,
-		       info->devs[i].est_rate_ratio,
-		       (unsigned int)info->devs[i].num_underruns,
-		       (unsigned int)info->devs[i].num_severe_underruns,
-		       (unsigned int)info->devs[i].highest_hw_level,
-		       (unsigned int)info->devs[i].runtime_sec,
-		       (unsigned int)info->devs[i].runtime_nsec,
-		       (unsigned int)info->devs[i].longest_wake_sec,
-		       (unsigned int)info->devs[i].longest_wake_nsec,
-		       info->devs[i].software_gain_scaler);
-		printf("\n");
-	}
-
-	printf("-------------stream_dump------------\n");
-	if (info->num_streams > MAX_DEBUG_STREAMS)
-		return;
-
-	for (i = 0; i < info->num_streams; i++) {
-		int channel;
-		printf("stream: 0x%" PRIx64 " dev: %u\n",
-		       info->streams[i].stream_id,
-		       (unsigned int)info->streams[i].dev_idx);
-		printf("direction: %s\n",
-		       (info->streams[i].direction == CRAS_STREAM_INPUT) ?
-			       "Input" :
-			       "Output");
-		printf("stream_type: %s\n",
-		       cras_stream_type_str(info->streams[i].stream_type));
-		printf("client_type: %s\n",
-		       cras_client_type_str(info->streams[i].client_type));
-		printf("buffer_frames: %u\n"
-		       "cb_threshold: %u\n"
-		       "effects: 0x%.4x\n"
-		       "frame_rate: %u\n"
-		       "num_channels: %u\n"
-		       "longest_fetch_sec: %u.%09u\n"
-		       "num_overruns: %u\n"
-		       "is_pinned: %x\n"
-		       "pinned_dev_idx: %x\n"
-		       "num_missed_cb: %u\n"
-		       "%s: %lf\n"
-		       "runtime: %u.%09u\n",
-		       (unsigned int)info->streams[i].buffer_frames,
-		       (unsigned int)info->streams[i].cb_threshold,
-		       (unsigned int)info->streams[i].effects,
-		       (unsigned int)info->streams[i].frame_rate,
-		       (unsigned int)info->streams[i].num_channels,
-		       (unsigned int)info->streams[i].longest_fetch_sec,
-		       (unsigned int)info->streams[i].longest_fetch_nsec,
-		       (unsigned int)info->streams[i].num_overruns,
-		       (unsigned int)info->streams[i].is_pinned,
-		       (unsigned int)info->streams[i].pinned_dev_idx,
-		       (unsigned int)info->streams[i].num_missed_cb,
-		       (info->streams[i].direction == CRAS_STREAM_INPUT) ?
-			       "gain" :
-			       "volume",
-		       info->streams[i].stream_volume,
-		       (unsigned int)info->streams[i].runtime_sec,
-		       (unsigned int)info->streams[i].runtime_nsec);
-		printf("channel map:");
-		for (channel = 0; channel < CRAS_CH_MAX; channel++)
-			printf("%d ", info->streams[i].channel_layout[channel]);
-		printf("\n\n");
-	}
-
-	printf("Audio Thread Event Log:\n");
-
-	fill_time_offset(&sec_offset, &nsec_offset);
-	j = info->log.write_pos % info->log.len;
-	i = 0;
-	printf("start at %d\n", j);
-	for (; i < info->log.len; i++) {
-		show_alog_tag(&info->log, j, sec_offset, nsec_offset);
-		j++;
-		j %= info->log.len;
-	}
-}
-
-static void audio_debug_info(struct cras_client *client)
-{
-	const struct audio_debug_info *info;
-	info = cras_client_get_audio_debug_info(client);
-	if (!info)
-		return;
-	print_audio_debug_info(info);
-
-	/* Signal main thread we are done after the last chunk. */
-	pthread_mutex_lock(&done_mutex);
-	pthread_cond_signal(&done_cond);
-	pthread_mutex_unlock(&done_mutex);
-}
-
-static void show_mainlog_tag(const struct main_thread_event_log *log,
-			     unsigned int tag_idx, int32_t sec_offset,
-			     int32_t nsec_offset)
-{
-	unsigned int tag = (log->log[tag_idx].tag_sec >> 24) & 0xff;
-	unsigned int sec = log->log[tag_idx].tag_sec & 0x00ffffff;
-	unsigned int nsec = log->log[tag_idx].nsec;
-	unsigned int data1 = log->log[tag_idx].data1;
-	unsigned int data2 = log->log[tag_idx].data2;
-	unsigned int data3 = log->log[tag_idx].data3;
-	time_t lt;
-	struct tm t;
-
-	/* Skip unused log entries. */
-	if (log->log[tag_idx].tag_sec == 0 && log->log[tag_idx].nsec == 0)
-		return;
-
-	/* Convert from monotomic raw clock to realtime clock. */
-	convert_time(&sec, &nsec, sec_offset, nsec_offset);
-	lt = sec;
-	localtime_r(&lt, &t);
-	strftime(time_str, 128, "%Y-%m-%dT%H:%M:%S", &t);
-
-	printf("%s.%09u cras mainlog  ", time_str, nsec);
-
-	switch (tag) {
-	case MAIN_THREAD_DEV_CLOSE:
-		printf("%-30s dev %u\n", "DEV_CLOSE", data1);
-		break;
-	case MAIN_THREAD_DEV_DISABLE:
-		printf("%-30s dev %u force %u\n", "DEV_DISABLE", data1, data2);
-		break;
-	case MAIN_THREAD_DEV_INIT:
-		printf("%-30s dev %u ch %u rate %u\n", "DEV_INIT", data1, data2,
-		       data3);
-		break;
-	case MAIN_THREAD_DEV_REOPEN:
-		printf("%-30s new ch %u old ch %u rate %u\n", "DEV_REOPEN",
-		       data1, data2, data3);
-		break;
-	case MAIN_THREAD_ADD_ACTIVE_NODE:
-		printf("%-30s dev %u\n", "ADD_ACTIVE_NODE", data1);
-		break;
-	case MAIN_THREAD_SELECT_NODE:
-		printf("%-30s dev %u\n", "SELECT_NODE", data1);
-		break;
-	case MAIN_THREAD_ADD_TO_DEV_LIST:
-		printf("%-30s dev %u %s\n", "ADD_TO_DEV_LIST", data1,
-		       (data2 == CRAS_STREAM_OUTPUT) ? "output" : "input");
-		break;
-	case MAIN_THREAD_NODE_PLUGGED:
-		printf("%-30s dev %u %s\n", "NODE_PLUGGED", data1,
-		       data2 ? "plugged" : "unplugged");
-		break;
-	case MAIN_THREAD_INPUT_NODE_GAIN:
-		printf("%-30s dev %u gain %u\n", "INPUT_NODE_GAIN", data1,
-		       data2);
-		break;
-	case MAIN_THREAD_OUTPUT_NODE_VOLUME:
-		printf("%-30s dev %u volume %u\n", "OUTPUT_NODE_VOLUME", data1,
-		       data2);
-		break;
-	case MAIN_THREAD_SET_OUTPUT_USER_MUTE:
-		printf("%-30s mute %u\n", "SET_OUTPUT_USER_MUTE", data1);
-		break;
-	case MAIN_THREAD_RESUME_DEVS:
-		printf("RESUME_DEVS\n");
-		break;
-	case MAIN_THREAD_SUSPEND_DEVS:
-		printf("SUSPEND_DEVS\n");
-		break;
-	case MAIN_THREAD_STREAM_ADDED:
-		printf("%-30s %s stream 0x%x buffer frames %u\n",
-		       "STREAM_ADDED",
-		       (data2 == CRAS_STREAM_OUTPUT ? "output" : "input"),
-		       data1, data3);
-		break;
-	case MAIN_THREAD_STREAM_REMOVED:
-		printf("%-30s stream 0x%x\n", "STREAM_REMOVED", data1);
-		break;
-	default:
-		printf("%-30s\n", "UNKNOWN");
-		break;
-	}
-}
-
-static void show_btlog_tag(const struct cras_bt_event_log *log,
-			   unsigned int tag_idx, int32_t sec_offset,
-			   int32_t nsec_offset)
-{
-	unsigned int tag = (log->log[tag_idx].tag_sec >> 24) & 0xff;
-	unsigned int sec = log->log[tag_idx].tag_sec & 0x00ffffff;
-	unsigned int nsec = log->log[tag_idx].nsec;
-	unsigned int data1 = log->log[tag_idx].data1;
-	unsigned int data2 = log->log[tag_idx].data2;
-	time_t lt;
-	struct tm t;
-
-	/* Skip unused log entries. */
-	if (log->log[tag_idx].tag_sec == 0 && log->log[tag_idx].nsec == 0)
-		return;
-
-	/* Convert from monotonic raw clock to realtime clock. */
-	convert_time(&sec, &nsec, sec_offset, nsec_offset);
-	lt = sec;
-	localtime_r(&lt, &t);
-	strftime(time_str, 128, "%Y-%m-%dT%H:%M:%S", &t);
-
-	printf("%s.%09u cras btlog  ", time_str, nsec);
-
-	switch (tag) {
-	case BT_ADAPTER_ADDED:
-		printf("%-30s\n", "ADAPTER_ADDED");
-		break;
-	case BT_ADAPTER_REMOVED:
-		printf("%-30s\n", "ADAPTER_REMOVED");
-		break;
-	case BT_A2DP_CONFIGURED:
-		printf("%-30s connected profiles 0x%.2x\n", "A2DP_CONFIGURED",
-		       data1);
-		break;
-	case BT_A2DP_START:
-		printf("%-30s\n", "A2DP_START");
-		break;
-	case BT_A2DP_SUSPENDED:
-		printf("%-30s\n", "A2DP_SUSPENDED");
-		break;
-	case BT_AUDIO_GATEWAY_INIT:
-		printf("%-30s supported profiles 0x%.2x\n",
-		       "AUDIO_GATEWAY_INIT", data1);
-		break;
-	case BT_AUDIO_GATEWAY_START:
-		printf("%-30s \n", "AUDIO_GATEWAY_START");
-		break;
-	case BT_AVAILABLE_CODECS:
-		printf("%-30s codec #%u id %u\n", "AVAILABLE_CODECS", data1,
-		       data2);
-		break;
-	case BT_CODEC_SELECTION:
-		printf("%-30s dir %u codec id %u\n", "CODEC_SELECTION", data1,
-		       data2);
-		break;
-	case BT_DEV_CONNECTED:
-		printf("%-30s supported profiles 0x%.2x stable_id 0x%08x\n",
-		       "DEV_CONNECTED", data1, data2);
-		break;
-	case BT_DEV_DISCONNECTED:
-		printf("%-30s supported profiles 0x%.2x stable_id 0x%08x\n",
-		       "DEV_DISCONNECTED", data1, data2);
-		break;
-	case BT_DEV_CONN_WATCH_CB:
-		printf("%-30s %u retries left, supported profiles 0x%.2x\n",
-		       "DEV_CONN_WATCH_CB", data1, data2);
-		break;
-	case BT_DEV_SUSPEND_CB:
-		printf("%-30s profiles supported %u, reason %u\n",
-		       "DEV_SUSPEND_CB", data1, data2);
-		break;
-	case BT_HFP_HF_INDICATOR:
-		printf("%-30s HF read AG %s indicator\n", "HFP_HF_INDICATOR",
-		       data1 ? "enabled" : "supported");
-		break;
-	case BT_HFP_SET_SPEAKER_GAIN:
-		printf("%-30s HF set speaker gain %u\n", "HFP_SET_SPEAKER_GAIN",
-		       data1);
-		break;
-	case BT_HFP_UPDATE_SPEAKER_GAIN:
-		printf("%-30s HF update speaker gain %u\n",
-		       "HFP_UPDATE_SPEAKER_GAIN", data1);
-		break;
-	case BT_HFP_NEW_CONNECTION:
-		printf("%-30s\n", "HFP_NEW_CONNECTION");
-		break;
-	case BT_HFP_REQUEST_DISCONNECT:
-		printf("%-30s\n", "HFP_REQUEST_DISCONNECT");
-		break;
-	case BT_HFP_SUPPORTED_FEATURES:
-		printf("%-30s role %s features 0x%.4x\n",
-		       "HFP_SUPPORTED_FEATURES", data1 ? "AG" : "HF", data2);
-		break;
-	case BT_HSP_NEW_CONNECTION:
-		printf("%-30s\n", "HSP_NEW_CONNECTION");
-		break;
-	case BT_HSP_REQUEST_DISCONNECT:
-		printf("%-30s\n", "HSP_REQUEST_DISCONNECT");
-		break;
-	case BT_NEW_AUDIO_PROFILE_AFTER_CONNECT:
-		printf("%-30s old 0x%.2x, new 0x%.2x\n",
-		       "NEW_AUDIO_PROFILE_AFTER_CONNECT", data1, data2);
-		break;
-	case BT_RESET:
-		printf("%-30s\n", "RESET");
-		break;
-	case BT_SCO_CONNECT:
-		printf("%-30s %s sk %d\n", "SCO_CONNECT",
-		       data1 ? "success" : "failed", (int)data2);
-		break;
-	case BT_TRANSPORT_ACQUIRE:
-		printf("%-30s %s fd %d\n", "TRANSPORT_ACQUIRE",
-		       data1 ? "success" : "failed", (int)data2);
-		break;
-	case BT_TRANSPORT_RELEASE:
-		printf("%-30s\n", "TRANSPORT_RELEASE");
-		break;
-	case BT_TRANSPORT_SET_VOLUME:
-		printf("%-30s %d\n", "TRANSPORT_SET_VOLUME", data1);
-		break;
-	case BT_TRANSPORT_UPDATE_VOLUME:
-		printf("%-30s %d\n", "TRANSPORT_UPDATE_VOLUME", data1);
-		break;
-	default:
-		printf("%-30s\n", "UNKNOWN");
-		break;
-	}
-}
-
-static void convert_to_time_str(const struct timespec *ts, time_t sec_offset,
-				int32_t nsec_offset)
-{
-	time_t lt = ts->tv_sec;
-	struct tm t;
-	unsigned int time_nsec;
-
-	/* Assuming tv_nsec doesn't exceed 10^9 */
-	time_nsec = ts->tv_nsec;
-	convert_time((unsigned int *)&lt, &time_nsec, sec_offset, nsec_offset);
-	localtime_r(&lt, &t);
-	strftime(time_str, 128, "%Y-%m-%dT%H:%M:%S", &t);
-	snprintf(time_str + strlen(time_str), 128 - strlen(time_str), ".%09u",
-		 time_nsec);
-}
-
-static void cras_bt_debug_info(struct cras_client *client)
-{
-	const struct cras_bt_debug_info *info;
-	time_t sec_offset;
-	int32_t nsec_offset;
-	int i, j;
-	struct timespec ts;
-	struct packet_status_logger wbs_logger;
-
-	info = cras_client_get_bt_debug_info(client);
-	fill_time_offset(&sec_offset, &nsec_offset);
-	j = info->bt_log.write_pos;
-	i = 0;
-	printf("BT debug log:\n");
-	for (; i < info->bt_log.len; i++) {
-		show_btlog_tag(&info->bt_log, j, sec_offset, nsec_offset);
-		j++;
-		j %= info->bt_log.len;
-	}
-
-	printf("-------------WBS packet loss------------\n");
-	wbs_logger = info->wbs_logger;
-
-	packet_status_logger_begin_ts(&wbs_logger, &ts);
-	convert_to_time_str(&ts, sec_offset, nsec_offset);
-	printf("%s [begin]\n", time_str);
-
-	packet_status_logger_end_ts(&wbs_logger, &ts);
-	convert_to_time_str(&ts, sec_offset, nsec_offset);
-	printf("%s [end]\n", time_str);
-
-	printf("In hex format:\n");
-	packet_status_logger_dump_hex(&wbs_logger);
-
-	printf("In binary format:\n");
-	packet_status_logger_dump_binary(&wbs_logger);
-
-	/* Signal main thread we are done after the last chunk. */
-	pthread_mutex_lock(&done_mutex);
-	pthread_cond_signal(&done_cond);
-	pthread_mutex_unlock(&done_mutex);
-}
-
-static void main_thread_debug_info(struct cras_client *client)
-{
-	const struct main_thread_debug_info *info;
-	time_t sec_offset;
-	int32_t nsec_offset;
-	int i, j;
-
-	info = cras_client_get_main_thread_debug_info(client);
-	fill_time_offset(&sec_offset, &nsec_offset);
-	j = info->main_log.write_pos;
-	i = 0;
-	printf("Main debug log:\n");
-	for (; i < info->main_log.len; i++) {
-		show_mainlog_tag(&info->main_log, j, sec_offset, nsec_offset);
-		j++;
-		j %= info->main_log.len;
-	}
-
-	/* Signal main thread we are done after the last chunk. */
-	pthread_mutex_lock(&done_mutex);
-	pthread_cond_signal(&done_cond);
-	pthread_mutex_unlock(&done_mutex);
-}
-
-static void print_cras_audio_thread_snapshot(
-	const struct cras_audio_thread_snapshot *snapshot)
-{
-	printf("-------------snapshot------------\n");
-	printf("Event time: %" PRId64 ".%ld\n",
-	       (int64_t)snapshot->timestamp.tv_sec,
-	       snapshot->timestamp.tv_nsec);
-
-	printf("Event type: ");
-	switch (snapshot->event_type) {
-	case AUDIO_THREAD_EVENT_A2DP_THROTTLE:
-		printf("a2dp throttle\n");
-		break;
-	case AUDIO_THREAD_EVENT_BUSYLOOP:
-		printf("busyloop\n");
-		break;
-	case AUDIO_THREAD_EVENT_UNDERRUN:
-		printf("underrun\n");
-		break;
-	case AUDIO_THREAD_EVENT_SEVERE_UNDERRUN:
-		printf("severe underrun\n");
-		break;
-	case AUDIO_THREAD_EVENT_DROP_SAMPLES:
-		printf("drop samples\n");
-		break;
-	case AUDIO_THREAD_EVENT_DEV_OVERRUN:
-		printf("device overrun\n");
-		break;
-	case AUDIO_THREAD_EVENT_DEBUG:
-		printf("debug\n");
-		break;
-	default:
-		printf("no such type\n");
-	}
-	print_audio_debug_info(&snapshot->audio_debug_info);
-}
-
-static void audio_thread_snapshots(struct cras_client *client)
-{
-	const struct cras_audio_thread_snapshot_buffer *snapshot_buffer;
-	uint32_t i;
-	int j;
-	int count = 0;
-
-	snapshot_buffer = cras_client_get_audio_thread_snapshot_buffer(client);
-	i = snapshot_buffer->pos;
-	for (j = 0; j < CRAS_MAX_AUDIO_THREAD_SNAPSHOTS; j++) {
-		if (snapshot_buffer->snapshots[i].timestamp.tv_sec ||
-		    snapshot_buffer->snapshots[i].timestamp.tv_nsec) {
-			print_cras_audio_thread_snapshot(
-				&snapshot_buffer->snapshots[i]);
-			count++;
-		}
-		i++;
-		i %= CRAS_MAX_AUDIO_THREAD_SNAPSHOTS;
-	}
-	printf("There are %d, snapshots.\n", count);
-
-	/* Signal main thread we are done after the last chunk. */
-	pthread_mutex_lock(&done_mutex);
-	pthread_cond_signal(&done_cond);
-	pthread_mutex_unlock(&done_mutex);
-}
-
-static int start_stream(struct cras_client *client, cras_stream_id_t *stream_id,
-			struct cras_stream_params *params, float stream_volume)
-{
-	int rc;
-
-	if (pin_device_id)
-		rc = cras_client_add_pinned_stream(client, pin_device_id,
-						   stream_id, params);
-	else
-		rc = cras_client_add_stream(client, stream_id, params);
-	if (rc < 0) {
-		fprintf(stderr, "adding a stream %d\n", rc);
-		return rc;
-	}
-	return cras_client_set_stream_volume(client, *stream_id, stream_volume);
-}
-
-static int parse_channel_layout(char *channel_layout_str,
-				int8_t channel_layout[CRAS_CH_MAX])
-{
-	int i = 0;
-	char *chp;
-
-	chp = strtok(channel_layout_str, ",");
-	while (chp && i < CRAS_CH_MAX) {
-		channel_layout[i++] = atoi(chp);
-		chp = strtok(NULL, ",");
-	}
-
-	return 0;
-}
-
-static void run_aecdump(struct cras_client *client, uint64_t stream_id,
-			int start)
-{
-	int aecdump_fd;
-	if (start) {
-		aecdump_fd =
-			open(aecdump_file, O_CREAT | O_RDWR | O_TRUNC, 0666);
-		if (aecdump_fd == -1) {
-			printf("Fail to open file %s", aecdump_file);
-			return;
-		}
-
-		printf("Dumping AEC info to %s, stream %" PRId64 ", fd %d\n",
-		       aecdump_file, stream_id, aecdump_fd);
-		cras_client_set_aec_dump(client, stream_id, 1, aecdump_fd);
-	} else {
-		cras_client_set_aec_dump(client, stream_id, 0, -1);
-		printf("Close AEC dump file %s\n", aecdump_file);
-	}
-}
-
-static int run_file_io_stream(struct cras_client *client, int fd,
-			      enum CRAS_STREAM_DIRECTION direction,
-			      size_t block_size,
-			      enum CRAS_STREAM_TYPE stream_type, size_t rate,
-			      snd_pcm_format_t format, size_t num_channels,
-			      uint32_t flags, int is_loopback, int is_post_dsp)
-{
-	int rc, tty;
-	struct cras_stream_params *params;
-	cras_unified_cb_t aud_cb;
-	cras_stream_id_t stream_id = 0;
-	int stream_playing = 0;
-	int *pfd = malloc(sizeof(*pfd));
-	*pfd = fd;
-	fd_set poll_set;
-	struct timespec sleep_ts;
-	float volume_scaler = 1.0;
-	size_t sys_volume = 100;
-	int mute = 0;
-	int8_t layout[CRAS_CH_MAX];
-
-	/* Set the sleep interval between latency/RMS prints. */
-	sleep_ts.tv_sec = 1;
-	sleep_ts.tv_nsec = 0;
-
-	/* Open the pipe file descriptor. */
-	rc = pipe(pipefd);
-	if (rc == -1) {
-		perror("failed to open pipe");
-		return -errno;
-	}
-
-	/* Reset the total RMS value. */
-	total_rms_sqr_sum = 0;
-	total_rms_size = 0;
-
-	if (direction == CRAS_STREAM_INPUT)
-		aud_cb = got_samples;
-	else
-		aud_cb = put_samples;
-
-	if (fd == 0) {
-		if (direction != CRAS_STREAM_OUTPUT)
-			return -EINVAL;
-		aud_cb = put_stdin_samples;
-	}
-
-	aud_format = cras_audio_format_create(format, rate, num_channels);
-	if (aud_format == NULL)
-		return -ENOMEM;
-
-	if (channel_layout) {
-		/* Set channel layout to format */
-		parse_channel_layout(channel_layout, layout);
-		cras_audio_format_set_channel_layout(aud_format, layout);
-	}
-
-	params = cras_client_unified_params_create(direction, block_size,
-						   stream_type, flags, pfd,
-						   aud_cb, stream_error,
-						   aud_format);
-	if (params == NULL)
-		return -ENOMEM;
-
-	cras_client_stream_params_set_client_type(params,
-						  CRAS_CLIENT_TYPE_TEST);
-
-	if (effect_aec)
-		cras_client_stream_params_enable_aec(params);
-	if (effect_ns)
-		cras_client_stream_params_enable_ns(params);
-	if (effect_agc)
-		cras_client_stream_params_enable_agc(params);
-	if (effect_vad)
-		cras_client_stream_params_enable_vad(params);
-
-	cras_client_run_thread(client);
-	if (is_loopback) {
-		enum CRAS_NODE_TYPE type =
-			(is_post_dsp ? CRAS_NODE_TYPE_POST_DSP :
-				       CRAS_NODE_TYPE_POST_MIX_PRE_DSP);
-
-		cras_client_connected_wait(client);
-		pin_device_id = cras_client_get_first_dev_type_idx(
-			client, type, CRAS_STREAM_INPUT);
-	}
-
-	stream_playing =
-		start_stream(client, &stream_id, params, volume_scaler) == 0;
-
-	tty = open("/dev/tty", O_RDONLY);
-
-	// There could be no terminal available when run in autotest.
-	if (tty == -1)
-		perror("warning: failed to open /dev/tty");
-
-	while (keep_looping) {
-		char input;
-		int nread;
-
-		FD_ZERO(&poll_set);
-		if (tty >= 0)
-			FD_SET(tty, &poll_set);
-		FD_SET(pipefd[0], &poll_set);
-		pselect(MAX(tty, pipefd[0]) + 1, &poll_set, NULL, NULL,
-			show_latency || show_rms ? &sleep_ts : NULL, NULL);
-
-		if (stream_playing && show_latency)
-			print_last_latency();
-
-		if (stream_playing && show_rms)
-			print_last_rms();
-
-		if (tty < 0 || !FD_ISSET(tty, &poll_set))
-			continue;
-
-		nread = read(tty, &input, 1);
-		if (nread < 1) {
-			fprintf(stderr, "Error reading stdin\n");
-			return nread;
-		}
-		switch (input) {
-		case 'p':
-			pause_client = !pause_client;
-			break;
-		case 'i':
-			pause_a_reply = 1;
-			break;
-		case 'q':
-			terminate_stream_loop();
-			break;
-		case 's':
-			if (stream_playing)
-				break;
-
-			/* If started by hand keep running after it finishes. */
-			exit_after_done_playing = 0;
-
-			stream_playing =
-				start_stream(client, &stream_id, params,
-					     volume_scaler) == 0;
-			break;
-		case 'r':
-			if (!stream_playing)
-				break;
-			cras_client_rm_stream(client, stream_id);
-			stream_playing = 0;
-			break;
-		case 'u':
-			volume_scaler = MIN(volume_scaler + 0.1, 1.0);
-			cras_client_set_stream_volume(client, stream_id,
-						      volume_scaler);
-			break;
-		case 'd':
-			volume_scaler = MAX(volume_scaler - 0.1, 0.0);
-			cras_client_set_stream_volume(client, stream_id,
-						      volume_scaler);
-			break;
-		case 'k':
-			sys_volume = MIN(sys_volume + 1, 100);
-			cras_client_set_system_volume(client, sys_volume);
-			break;
-		case 'j':
-			sys_volume = sys_volume == 0 ? 0 : sys_volume - 1;
-			cras_client_set_system_volume(client, sys_volume);
-			break;
-		case 'm':
-			mute = !mute;
-			cras_client_set_system_mute(client, mute);
-			break;
-		case '@':
-			print_device_lists(client);
-			break;
-		case '#':
-			print_attached_client_list(client);
-			break;
-		case 'v':
-			printf("Volume: %zu%s Min dB: %ld Max dB: %ld\n"
-			       "Capture: %s\n",
-			       cras_client_get_system_volume(client),
-			       cras_client_get_system_muted(client) ?
-				       "(Muted)" :
-				       "",
-			       cras_client_get_system_min_volume(client),
-			       cras_client_get_system_max_volume(client),
-			       cras_client_get_system_capture_muted(client) ?
-				       "Muted" :
-				       "Not muted");
-			break;
-		case '\'':
-			play_short_sound_periods_left =
-				play_short_sound_periods;
-			break;
-		case '\n':
-			break;
-		default:
-			printf("Invalid key\n");
-			break;
-		}
-	}
-
-	if (show_total_rms)
-		print_total_rms();
-
-	cras_client_stop(client);
-
-	cras_audio_format_destroy(aud_format);
-	cras_client_stream_params_destroy(params);
-	free(pfd);
-
-	close(pipefd[0]);
-	close(pipefd[1]);
-
-	return 0;
-}
-
-static int run_capture(struct cras_client *client, const char *file,
-		       size_t block_size, enum CRAS_STREAM_TYPE stream_type,
-		       size_t rate, snd_pcm_format_t format,
-		       size_t num_channels, uint32_t flags, int is_loopback,
-		       int is_post_dsp)
-{
-	int fd = open(file, O_CREAT | O_RDWR | O_TRUNC, 0666);
-	if (fd == -1) {
-		perror("failed to open file");
-		return -errno;
-	}
-
-	run_file_io_stream(client, fd, CRAS_STREAM_INPUT, block_size,
-			   stream_type, rate, format, num_channels, flags,
-			   is_loopback, is_post_dsp);
-
-	close(fd);
-	return 0;
-}
-
-static int run_playback(struct cras_client *client, const char *file,
-			size_t block_size, enum CRAS_STREAM_TYPE stream_type,
-			size_t rate, snd_pcm_format_t format,
-			size_t num_channels)
-{
-	int fd;
-
-	fd = open(file, O_RDONLY);
-	if (fd == -1) {
-		perror("failed to open file");
-		return -errno;
-	}
-
-	run_file_io_stream(client, fd, CRAS_STREAM_OUTPUT, block_size,
-			   stream_type, rate, format, num_channels, 0, 0, 0);
-
-	close(fd);
-	return 0;
-}
-
-static void print_server_info(struct cras_client *client)
-{
-	cras_client_run_thread(client);
-	cras_client_connected_wait(client); /* To synchronize data. */
-	print_system_volumes(client);
-	print_user_muted(client);
-	print_device_lists(client);
-	print_attached_client_list(client);
-	print_active_stream_info(client);
-}
-
-static void show_audio_thread_snapshots(struct cras_client *client)
-{
-	struct timespec wait_time;
-
-	cras_client_run_thread(client);
-	cras_client_connected_wait(client); /* To synchronize data. */
-	cras_client_update_audio_thread_snapshots(client,
-						  audio_thread_snapshots);
-
-	clock_gettime(CLOCK_REALTIME, &wait_time);
-	wait_time.tv_sec += 2;
-
-	pthread_mutex_lock(&done_mutex);
-	pthread_cond_timedwait(&done_cond, &done_mutex, &wait_time);
-	pthread_mutex_unlock(&done_mutex);
-}
-
-static void show_audio_debug_info(struct cras_client *client)
-{
-	struct timespec wait_time;
-
-	cras_client_run_thread(client);
-	cras_client_connected_wait(client); /* To synchronize data. */
-	cras_client_update_audio_debug_info(client, audio_debug_info);
-
-	clock_gettime(CLOCK_REALTIME, &wait_time);
-	wait_time.tv_sec += 2;
-
-	pthread_mutex_lock(&done_mutex);
-	pthread_cond_timedwait(&done_cond, &done_mutex, &wait_time);
-	pthread_mutex_unlock(&done_mutex);
-}
-
-static void show_cras_bt_debug_info(struct cras_client *client)
-{
-	struct timespec wait_time;
-
-	cras_client_run_thread(client);
-	cras_client_connected_wait(client); /* To synchronize data. */
-	cras_client_update_bt_debug_info(client, cras_bt_debug_info);
-
-	clock_gettime(CLOCK_REALTIME, &wait_time);
-	wait_time.tv_sec += 2;
-
-	pthread_mutex_lock(&done_mutex);
-	pthread_cond_timedwait(&done_cond, &done_mutex, &wait_time);
-	pthread_mutex_unlock(&done_mutex);
-}
-
-static void show_main_thread_debug_info(struct cras_client *client)
-{
-	struct timespec wait_time;
-	cras_client_run_thread(client);
-	cras_client_connected_wait(client); /* To synchronize data. */
-	cras_client_update_main_thread_debug_info(client,
-						  main_thread_debug_info);
-
-	clock_gettime(CLOCK_REALTIME, &wait_time);
-	wait_time.tv_sec += 2;
-
-	pthread_mutex_lock(&done_mutex);
-	pthread_cond_timedwait(&done_cond, &done_mutex, &wait_time);
-	pthread_mutex_unlock(&done_mutex);
-}
-
-static void hotword_models_cb(struct cras_client *client,
-			      const char *hotword_models)
-{
-	printf("Hotword models: %s\n", hotword_models);
-}
-
-static void print_hotword_models(struct cras_client *client, cras_node_id_t id)
-{
-	struct timespec wait_time;
-
-	cras_client_run_thread(client);
-	cras_client_connected_wait(client);
-	cras_client_get_hotword_models(client, id, hotword_models_cb);
-
-	clock_gettime(CLOCK_REALTIME, &wait_time);
-	wait_time.tv_sec += 2;
-
-	pthread_mutex_lock(&done_mutex);
-	pthread_cond_timedwait(&done_cond, &done_mutex, &wait_time);
-	pthread_mutex_unlock(&done_mutex);
-}
-
-static void check_output_plugged(struct cras_client *client, const char *name)
-{
-	cras_client_run_thread(client);
-	cras_client_connected_wait(client); /* To synchronize data. */
-	printf("%s\n",
-	       cras_client_output_dev_plugged(client, name) ? "Yes" : "No");
-}
-
-/* Repeatedly mute and un-mute the output until there is an error. */
-static void mute_loop_test(struct cras_client *client, int auto_reconnect)
-{
-	int mute = 0;
-	int rc;
-
-	if (auto_reconnect)
-		cras_client_run_thread(client);
-	while (1) {
-		rc = cras_client_set_user_mute(client, mute);
-		printf("cras_client_set_user_mute(%d): %d\n", mute, rc);
-		if (rc != 0 && !auto_reconnect)
-			return;
-		mute = !mute;
-		sleep(2);
-	}
-}
-
-static void show_atlog(time_t sec_offset, int32_t nsec_offset,
-		       struct audio_thread_event_log *log, int len,
-		       uint64_t missing)
-{
-	int i;
-	printf("Audio Thread Event Log:\n");
-
-	if (missing)
-		printf("%" PRIu64 " logs are missing.\n", missing);
-
-	for (i = 0; i < len; ++i) {
-		show_alog_tag(log, i, sec_offset, nsec_offset);
-	}
-}
-
-static void unlock_main_thread(struct cras_client *client)
-{
-	pthread_mutex_lock(&done_mutex);
-	pthread_cond_signal(&done_cond);
-	pthread_mutex_unlock(&done_mutex);
-}
-
-static void cras_show_continuous_atlog(struct cras_client *client)
-{
-	struct audio_thread_event_log log;
-	struct timespec wait_time;
-	static time_t sec_offset;
-	static int32_t nsec_offset;
-	static uint64_t atlog_read_idx = 0, missing;
-	int len, rc;
-
-	cras_client_run_thread(client);
-	cras_client_connected_wait(client); /* To synchronize data. */
-	cras_client_get_atlog_access(client, unlock_main_thread);
-
-	clock_gettime(CLOCK_REALTIME, &wait_time);
-	wait_time.tv_sec += 2;
-
-	pthread_mutex_lock(&done_mutex);
-	rc = pthread_cond_timedwait(&done_cond, &done_mutex, &wait_time);
-	pthread_mutex_unlock(&done_mutex);
-
-	if (rc)
-		goto fail;
-
-	fill_time_offset(&sec_offset, &nsec_offset);
-
-	/* Set stdout buffer to line buffered mode. */
-	setlinebuf(stdout);
-
-	while (1) {
-		len = cras_client_read_atlog(client, &atlog_read_idx, &missing,
-					     &log);
-
-		if (len < 0)
-			break;
-		if (len > 0)
-			show_atlog(sec_offset, nsec_offset, &log, len, missing);
-		nanosleep(&follow_atlog_sleep_ts, NULL);
-	}
-fail:
-	printf("Failed to get audio thread log.\n");
-}
-
-// clang-format off
-static struct option long_options[] = {
-	{"show_latency",        no_argument,            &show_latency, 1},
-	{"show_rms",            no_argument,            &show_rms, 1},
-	{"show_total_rms",      no_argument,            &show_total_rms, 1},
-	{"select_input",        required_argument,      0, 'a'},
-	{"block_size",          required_argument,      0, 'b'},
-	{"num_channels",        required_argument,      0, 'c'},
-	{"duration_seconds",    required_argument,      0, 'd'},
-	{"dump_events",         no_argument,            0, 'e'},
-	{"format",              required_argument,      0, 'f'},
-	{"capture_gain",        required_argument,      0, 'g'},
-	{"help",                no_argument,            0, 'h'},
-	{"dump_server_info",    no_argument,            0, 'i'},
-	{"check_output_plugged",required_argument,      0, 'j'},
-	{"add_active_input",    required_argument,      0, 'k'},
-	{"dump_dsp",            no_argument,            0, 'l'},
-	{"dump_audio_thread",   no_argument,            0, 'm'},
-	{"syslog_mask",         required_argument,      0, 'n'},
-	{"channel_layout",      required_argument,      0, 'o'},
-	{"get_aec_group_id",    no_argument,            0, 'p'},
-	{"user_mute",           required_argument,      0, 'q'},
-	{"rate",                required_argument,      0, 'r'},
-	{"reload_dsp",          no_argument,            0, 's'},
-	{"add_active_output",   required_argument,      0, 't'},
-	{"mute",                required_argument,      0, 'u'},
-	{"volume",              required_argument,      0, 'v'},
-	{"set_node_volume",     required_argument,      0, 'w'},
-	{"plug",                required_argument,      0, 'x'},
-	{"select_output",       required_argument,      0, 'y'},
-	{"playback_delay_us",   required_argument,      0, 'z'},
-	{"capture_mute",        required_argument,      0, '0'},
-	{"rm_active_input",     required_argument,      0, '1'},
-	{"rm_active_output",    required_argument,      0, '2'},
-	{"swap_left_right",     required_argument,      0, '3'},
-	{"version",             no_argument,            0, '4'},
-	{"add_test_dev",        required_argument,      0, '5'},
-	{"test_hotword_file",   required_argument,      0, '6'},
-	{"listen_for_hotword",  required_argument,      0, '7'},
-	{"pin_device",          required_argument,      0, '8'},
-	{"suspend",             required_argument,      0, '9'},
-	{"set_node_gain",       required_argument,      0, ':'},
-	{"play_short_sound",    required_argument,      0, '!'},
-	{"config_global_remix", required_argument,      0, ';'},
-	{"set_hotword_model",   required_argument,      0, '<'},
-	{"get_hotword_models",  required_argument,      0, '>'},
-	{"post_dsp",            required_argument,      0, 'A'},
-	{"stream_id",           required_argument,      0, 'B'},
-	{"capture_file",        required_argument,      0, 'C'},
-	{"reload_aec_config",   no_argument,            0, 'D'},
-	{"effects",             required_argument,      0, 'E'},
-	{"get_aec_supported",   no_argument,            0, 'F'},
-	{"aecdump",             required_argument,      0, 'G'},
-	{"dump_bt",             no_argument,            0, 'H'},
-	{"set_wbs_enabled",     required_argument,      0, 'I'},
-	{"follow_atlog",	no_argument,		0, 'J'},
-	{"connection_type",     required_argument,      0, 'K'},
-	{"loopback_file",       required_argument,      0, 'L'},
-	{"mute_loop_test",      required_argument,      0, 'M'},
-	{"dump_main",		no_argument,		0, 'N'},
-	{"playback_file",       required_argument,      0, 'P'},
-	{"stream_type",         required_argument,      0, 'T'},
-	{0, 0, 0, 0}
-};
-// clang-format on
-
-static void show_usage()
-{
-	int i;
-
-	printf("--add_active_input <N>:<M> - "
-	       "Add the ionode with the given id to active input device "
-	       "list\n");
-	printf("--add_active_output <N>:<M> - "
-	       "Add the ionode with the given id to active output device "
-	       "list\n");
-	printf("--add_test_dev <type> - "
-	       "Add a test iodev.\n");
-	printf("--block_size <N> - "
-	       "The number for frames per callback(dictates latency).\n");
-	printf("--capture_file <name> - "
-	       "Name of file to record to.\n");
-	printf("--capture_gain <dB> - "
-	       "Set system capture gain in dB*100 (100 = 1dB).\n");
-	printf("--capture_mute <0|1> - "
-	       "Set capture mute state.\n");
-	printf("--channel_layout <layout_str> - "
-	       "Set multiple channel layout.\n");
-	printf("--check_output_plugged <output name> - "
-	       "Check if the output is plugged in\n");
-	printf("--connection_type <connection_type> - "
-	       "Set cras_client connection_type (default to 0).\n"
-	       "                                      "
-	       "Argument: 0 - For control client.\n"
-	       "                                      "
-	       "          1 - For playback client.\n"
-	       "                                      "
-	       "          2 - For capture client.\n"
-	       "                                      "
-	       "          3 - For legacy client in vms.\n"
-	       "                                      "
-	       "          4 - For unified client in vms.\n");
-	printf("--dump_audio_thread - "
-	       "Dumps audio thread info.\n");
-	printf("--dump_bt - "
-	       "Dumps debug info for bt audio\n");
-	printf("--dump_main - "
-	       "Dumps debug info from main thread\n");
-	printf("--dump_dsp - "
-	       "Print status of dsp to syslog.\n");
-	printf("--dump_server_info - "
-	       "Print status of the server.\n");
-	printf("--duration_seconds <N> - "
-	       "Seconds to record or playback.\n");
-	printf("--follow_atlog - "
-	       "Continuously dumps audio thread event log.\n");
-	printf("--format <name> - "
-	       "The sample format. Either ");
-	for (i = 0; supported_formats[i].name; ++i)
-		printf("%s ", supported_formats[i].name);
-	printf("(default to S16_LE).\n");
-	printf("--get_hotword_models <N>:<M> - "
-	       "Get the supported hotword models of node\n");
-	printf("--help - "
-	       "Print this message.\n");
-	printf("--listen_for_hotword <name> - "
-	       "Listen and capture hotword stream if supported\n");
-	printf("--loopback_file <name> - "
-	       "Name of file to record from loopback device.\n");
-	printf("--mute <0|1> - "
-	       "Set system mute state.\n");
-	printf("--mute_loop_test <0|1> - "
-	       "Continuously loop mute/un-mute.\n"
-	       "                         "
-	       "Argument: 0 - stop on error.\n"
-	       "                         "
-	       "          1 - automatically reconnect to CRAS.\n");
-	printf("--num_channels <N> - "
-	       "Two for stereo.\n");
-	printf("--pin_device <N> - "
-	       "Playback/Capture only on the given device.\n");
-	printf("--playback_file <name> - "
-	       "Name of file to play, "
-	       "\"-\" to playback raw audio from stdin.\n");
-	printf("--play_short_sound <N> - "
-	       "Plays the content in the file for N periods when ' "
-	       "is pressed.\n");
-	printf("--plug <N>:<M>:<0|1> - "
-	       "Set the plug state (0 or 1) for the ionode with the given "
-	       "index M on the device with index N\n");
-	printf("--rate <N> - "
-	       "Specifies the sample rate in Hz.\n");
-	printf("--reload_dsp - "
-	       "Reload dsp configuration from the ini file\n");
-	printf("--rm_active_input <N>:<M> - "
-	       "Removes the ionode with the given id from active input device "
-	       "list\n");
-	printf("--rm_active_output <N>:<M> - "
-	       "Removes the ionode with the given id from active output device "
-	       "list\n");
-	printf("--select_input <N>:<M> - "
-	       "Select the ionode with the given id as preferred input\n");
-	printf("--select_output <N>:<M> - "
-	       "Select the ionode with the given id as preferred output\n");
-	printf("--set_hotword_model <N>:<M>:<model> - "
-	       "Set the model to node\n");
-	printf("--playback_delay_us <N> - "
-	       "Set the time in us to delay a reply for playback when i is "
-	       "pressed\n");
-	printf("--post_dsp <0|1> - "
-	       "Use this flag with --loopback_file. The default value is 0.\n"
-	       "                   "
-	       "Argument: 0 - Record from post-mix, pre-DSP loopback device.\n"
-	       "                   "
-	       "          1 - Record from post-DSP loopback device.\n");
-	printf("--set_node_volume <N>:<M>:<0-100> - "
-	       "Set the volume of the ionode with the given id\n");
-	printf("--show_latency - "
-	       "Display latency while playing or recording.\n");
-	printf("--show_rms - "
-	       "Display RMS value of loopback stream.\n");
-	printf("--show_total_rms - "
-	       "Display total RMS value of loopback stream at the end.\n");
-	printf("--suspend <0|1> - "
-	       "Set audio suspend state.\n");
-	printf("--swap_left_right <N>:<M>:<0|1> - "
-	       "Swap or un-swap (1 or 0) the left and right channel for the "
-	       "ionode with the given index M on the device with index N\n");
-	printf("--stream_type <N> - "
-	       "Specify the type of the stream.\n");
-	printf("--syslog_mask <n> - "
-	       "Set the syslog mask to the given log level.\n");
-	printf("--test_hotword_file <N>:<filename> - "
-	       "Use filename as a hotword buffer for device N\n");
-	printf("--user_mute <0|1> - "
-	       "Set user mute state.\n");
-	printf("--version - "
-	       "Print the git commit ID that was used to build the client.\n");
-	printf("--volume <0-100> - "
-	       "Set system output volume.\n");
-}
-
-static int cras_client_create_and_connect(struct cras_client **client,
-					  enum CRAS_CONNECTION_TYPE conn_type)
-{
-	int rc;
-
-	rc = cras_client_create_with_type(client, conn_type);
-	if (rc < 0) {
-		fprintf(stderr, "Couldn't create client.\n");
-		return rc;
-	}
-
-	rc = cras_client_connect_timeout(*client, 1000);
-	if (rc) {
-		fprintf(stderr, "Couldn't connect to server.\n");
-		cras_client_destroy(*client);
-		return rc;
-	}
-
-	return 0;
-}
-
-int main(int argc, char **argv)
-{
-	struct cras_client *client;
-	int c, option_index;
-	size_t block_size = NOT_ASSIGNED;
-	size_t rate = 48000;
-	size_t num_channels = 2;
-	float duration_seconds = 0;
-	const char *capture_file = NULL;
-	const char *playback_file = NULL;
-	const char *loopback_file = NULL;
-	int post_dsp = 0;
-	enum CRAS_STREAM_TYPE stream_type = CRAS_STREAM_TYPE_DEFAULT;
-	int rc = 0;
-	uint32_t stream_flags = 0;
-	cras_stream_id_t stream_id = 0;
-	snd_pcm_format_t format = SND_PCM_FORMAT_S16_LE;
-	enum CRAS_CONNECTION_TYPE conn_type = CRAS_CONTROL;
-	enum CRAS_CONNECTION_TYPE new_conn_type;
-
-	option_index = 0;
-	openlog("cras_test_client", LOG_PERROR, LOG_USER);
-	setlogmask(LOG_UPTO(LOG_INFO));
-
-	rc = cras_client_create_and_connect(&client, conn_type);
-	if (rc) {
-		return rc;
-	}
-
-	if (argc == 1) {
-		/* Nothing specified, default to dump_server_info. */
-		print_server_info(client);
-		goto destroy_exit;
-	}
-
-	while (1) {
-		c = getopt_long(argc, argv, "o:s:P:C:r:c:f:h", long_options,
-				&option_index);
-		if (c == -1)
-			break;
-		switch (c) {
-		case 'y':
-		case 'a': {
-			cras_node_id_t id;
-			rc = parse_node_id(optarg, &id);
-			if (rc) {
-				show_usage();
-				return rc;
-			}
-
-			enum CRAS_STREAM_DIRECTION direction =
-				(c == 'y') ? CRAS_STREAM_OUTPUT :
-					     CRAS_STREAM_INPUT;
-			cras_client_select_node(client, direction, id);
-			break;
-		}
-		case 'b':
-			block_size = atoi(optarg);
-			break;
-		case 'c':
-			num_channels = atoi(optarg);
-			break;
-		case 'd':
-			duration_seconds = atof(optarg);
-			break;
-		case 'e':
-			show_audio_thread_snapshots(client);
-			break;
-		case 'f': {
-			int i;
-
-			for (i = 0; supported_formats[i].name; ++i) {
-				if (strcasecmp(optarg,
-					       supported_formats[i].name) ==
-				    0) {
-					format = supported_formats[i].format;
-					break;
-				}
-			}
-
-			if (!supported_formats[i].name) {
-				printf("Unsupported format: %s\n", optarg);
-				return -EINVAL;
-			}
-			break;
-		}
-		case 'h':
-			show_usage();
-			break;
-		case 'i':
-			print_server_info(client);
-			break;
-		case 'j':
-			check_output_plugged(client, optarg);
-			break;
-		case 'k':
-		case 't':
-		case '1':
-		case '2': {
-			cras_node_id_t id;
-			rc = parse_node_id(optarg, &id);
-			if (rc) {
-				show_usage();
-				return rc;
-			}
-
-			enum CRAS_STREAM_DIRECTION dir;
-			if (c == 't' || c == '2')
-				dir = CRAS_STREAM_OUTPUT;
-			else
-				dir = CRAS_STREAM_INPUT;
-
-			if (c == 'k' || c == 't')
-				cras_client_add_active_node(client, dir, id);
-			else
-				cras_client_rm_active_node(client, dir, id);
-			break;
-		}
-		case 'l':
-			cras_client_dump_dsp_info(client);
-			break;
-		case 'm':
-			show_audio_debug_info(client);
-			break;
-		case 'n': {
-			int log_level = atoi(optarg);
-
-			setlogmask(LOG_UPTO(log_level));
-			break;
-		}
-		case 'o':
-			channel_layout = optarg;
-			break;
-		case 'p':
-			printf("AEC group ID %d\n",
-			       cras_client_get_aec_group_id(client));
-			break;
-		case 'q': {
-			int mute = atoi(optarg);
-			rc = cras_client_set_user_mute(client, mute);
-			if (rc < 0) {
-				fprintf(stderr, "problem setting mute\n");
-				goto destroy_exit;
-			}
-			break;
-		}
-		case 'r':
-			rate = atoi(optarg);
-			break;
-		case 's':
-			cras_client_reload_dsp(client);
-			break;
-		case 'u': {
-			int mute = atoi(optarg);
-			rc = cras_client_set_system_mute(client, mute);
-			if (rc < 0) {
-				fprintf(stderr, "problem setting mute\n");
-				goto destroy_exit;
-			}
-			break;
-		}
-		case 'v': {
-			int volume = atoi(optarg);
-			volume = MIN(100, MAX(0, volume));
-			rc = cras_client_set_system_volume(client, volume);
-			if (rc < 0) {
-				fprintf(stderr, "problem setting volume\n");
-				goto destroy_exit;
-			}
-			break;
-		}
-		case ':':
-		case 'w': {
-			cras_node_id_t id;
-			int value;
-			rc = parse_node_id_with_value(optarg, &id, &value);
-			if (rc) {
-				show_usage();
-				return rc;
-			}
-
-			if (c == 'w')
-				cras_client_set_node_volume(client, id, value);
-			else
-				cras_client_set_node_capture_gain(client, id,
-								  value);
-			break;
-		}
-		case 'x': {
-			cras_node_id_t id;
-			int value;
-			rc = parse_node_id_with_value(optarg, &id, &value);
-			if (rc) {
-				show_usage();
-				return rc;
-			}
-
-			enum ionode_attr attr = IONODE_ATTR_PLUGGED;
-			cras_client_set_node_attr(client, id, attr, value);
-			break;
-		}
-		case 'z':
-			pause_in_playback_reply = atoi(optarg);
-			break;
-
-		case '0': {
-			int mute = atoi(optarg);
-			rc = cras_client_set_system_capture_mute(client, mute);
-			if (rc < 0) {
-				fprintf(stderr, "problem setting mute\n");
-				goto destroy_exit;
-			}
-			break;
-		}
-		case '3': {
-			cras_node_id_t id;
-			int value;
-			rc = parse_node_id_with_value(optarg, &id, &value);
-			if (rc) {
-				show_usage();
-				return rc;
-			}
-
-			cras_client_swap_node_left_right(client, id, value);
-			break;
-		}
-		case '4':
-			printf("%s\n", VCSID);
-			break;
-		case '5': {
-			cras_client_add_test_iodev(client, atoi(optarg));
-			break;
-		}
-		case '6': {
-			const char *s;
-			int dev_index;
-
-			s = strtok(optarg, ":");
-			if (!s) {
-				show_usage();
-				return -EINVAL;
-			}
-			dev_index = atoi(s);
-
-			const char *file_name = strtok(NULL, ":");
-			if (!file_name) {
-				show_usage();
-				return -EINVAL;
-			}
-			cras_client_test_iodev_command(
-				client, dev_index,
-				TEST_IODEV_CMD_HOTWORD_TRIGGER,
-				strlen(file_name) + 1, (uint8_t *)file_name);
-			break;
-		}
-		case '7': {
-			stream_flags = HOTWORD_STREAM;
-			capture_file = optarg;
-			break;
-		}
-		case '8':
-			pin_device_id = atoi(optarg);
-			break;
-		case '9': {
-			int suspend = atoi(optarg);
-			cras_client_set_suspend(client, suspend);
-			break;
-		}
-
-		case '!': {
-			play_short_sound = 1;
-			play_short_sound_periods = atoi(optarg);
-			break;
-		}
-		case ';': {
-			char *s;
-			int nch;
-			int size = 0;
-			float *coeff;
-
-			s = strtok(optarg, ":");
-			nch = atoi(s);
-			coeff = (float *)calloc((size_t)nch * (size_t)nch,
-						sizeof(*coeff));
-			for (size = 0; size < nch * nch; size++) {
-				s = strtok(NULL, ",");
-				if (NULL == s)
-					break;
-				coeff[size] = atof(s);
-			}
-			cras_client_config_global_remix(client, nch, coeff);
-			free(coeff);
-			break;
-		}
-		case '<':
-		case '>': {
-			char *s;
-			int dev_index;
-			int node_index;
-
-			s = strtok(optarg, ":");
-			if (!s) {
-				show_usage();
-				return -EINVAL;
-			}
-			dev_index = atoi(s);
-
-			s = strtok(NULL, ":");
-			if (!s) {
-				show_usage();
-				return -EINVAL;
-			}
-			node_index = atoi(s);
-
-			s = strtok(NULL, ":");
-			if (!s && c == ';') {
-				//TODO: c never == ';'
-				show_usage();
-				return -EINVAL;
-			}
-
-			cras_node_id_t id =
-				cras_make_node_id(dev_index, node_index);
-			if (c == '<')
-				cras_client_set_hotword_model(client, id, s);
-			else
-				print_hotword_models(client, id);
-			break;
-		}
-
-		case 'A':
-			post_dsp = atoi(optarg);
-			break;
-		case 'B':
-			stream_id = atoi(optarg);
-			break;
-		case 'C':
-			capture_file = optarg;
-			break;
-		case 'D':
-			cras_client_reload_aec_config(client);
-			break;
-		case 'E': {
-			char *s;
-
-			s = strtok(optarg, ",");
-			while (s) {
-				if (strcmp("aec", s) == 0)
-					effect_aec = 1;
-				else if (strcmp("ns", s) == 0)
-					effect_ns = 1;
-				else if (strcmp("agc", s) == 0)
-					effect_agc = 1;
-				else if (strcmp("vad", s) == 0)
-					effect_vad = 1;
-				else
-					printf("Unknown effect %s\n", s);
-				s = strtok(NULL, ",");
-			}
-			break;
-		}
-		case 'F':
-			printf("AEC supported %d\n",
-			       !!cras_client_get_aec_supported(client));
-			break;
-		case 'G':
-			aecdump_file = optarg;
-			break;
-		case 'H':
-			show_cras_bt_debug_info(client);
-			break;
-		case 'I':
-			cras_client_set_bt_wbs_enabled(client, atoi(optarg));
-			break;
-		case 'J':
-			cras_show_continuous_atlog(client);
-			break;
-		case 'K':
-			new_conn_type = atoi(optarg);
-			if (cras_validate_connection_type(new_conn_type)) {
-				if (new_conn_type != conn_type) {
-					cras_client_destroy(client);
-					client = NULL;
-					rc = cras_client_create_and_connect(
-						&client, new_conn_type);
-					if (rc) {
-						fprintf(stderr,
-							"Couldn't connect to "
-							"server.\n");
-						return rc;
-					}
-					conn_type = new_conn_type;
-				}
-			} else {
-				printf("Input connection type is not "
-				       "supported.\n");
-			}
-			break;
-		case 'L':
-			loopback_file = optarg;
-			break;
-		case 'M':
-			mute_loop_test(client, atoi(optarg));
-			break;
-		case 'N':
-			show_main_thread_debug_info(client);
-			break;
-		case 'P':
-			playback_file = optarg;
-			break;
-		case 'T':
-			stream_type = atoi(optarg);
-			break;
-
-		default:
-			break;
-		}
-	}
-
-	if (optind < argc) {
-		printf("Warning: un-welcome arguments: ");
-		while (optind < argc)
-			printf("%s ", argv[optind++]);
-		printf("\n");
-		rc = 1;
-		goto destroy_exit;
-	}
-
-	duration_frames = duration_seconds * rate;
-	if (block_size == NOT_ASSIGNED)
-		block_size = get_block_size(PLAYBACK_BUFFERED_TIME_IN_US, rate);
-
-	if (capture_file != NULL) {
-		if (strcmp(capture_file, "-") == 0)
-			rc = run_file_io_stream(client, 1, CRAS_STREAM_INPUT,
-						block_size, stream_type, rate,
-						format, num_channels,
-						stream_flags, 0, 0);
-		else
-			rc = run_capture(client, capture_file, block_size,
-					 stream_type, rate, format,
-					 num_channels, stream_flags, 0, 0);
-	} else if (playback_file != NULL) {
-		if (strcmp(playback_file, "-") == 0)
-			rc = run_file_io_stream(client, 0, CRAS_STREAM_OUTPUT,
-						block_size, stream_type, rate,
-						format, num_channels,
-						stream_flags, 0, 0);
-		else
-			rc = run_playback(client, playback_file, block_size,
-					  stream_type, rate, format,
-					  num_channels);
-	} else if (loopback_file != NULL) {
-		rc = run_capture(client, loopback_file, block_size, stream_type,
-				 rate, format, num_channels, stream_flags, 1,
-				 post_dsp);
-	} else if (aecdump_file != NULL) {
-		run_aecdump(client, stream_id, 1);
-		sleep(duration_seconds);
-		run_aecdump(client, stream_id, 0);
-	}
-
-destroy_exit:
-	cras_client_destroy(client);
-	return rc;
-}
diff --git a/cras/tools/create_volume_curve.py b/cras/tools/create_volume_curve.py
deleted file mode 100755
index 13a0c59..0000000
--- a/cras/tools/create_volume_curve.py
+++ /dev/null
@@ -1,72 +0,0 @@
-#!/usr/bin/python
-#
-# Copyright (c) 2012 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import sys
-
-def GenerateSimpleStep(name, max_volume, step_size):
-  print '[%s]' % name
-  print '  ; Generated by create_volume_curve.py'
-  print '  ; simple_step curve, max %d, step %d' % (max_volume, step_size)
-  print '  volume_curve = simple_step'
-  print '  volume_step = %d' % step_size
-  print '  max_volume = %d' % max_volume
-
-def WriteExplicitCurveVal(step, value):
-  print '  db_at_%d = %d' % (step, value)
-
-def GenerateExplicit(name):
-  print '[%s]' % name
-  print '  ; Generated by create_volume_curve.py'
-  print '  ; explicit curve'
-  print '  volume_curve = explicit'
-  for i in range(100):
-    print 'Level at step %d:' % (100 - i)
-    level = int(raw_input(">"))
-    WriteExplicitCurveVal(100 - i, level)
-  print 'Level at step 0:'
-  level = int(raw_input(">"))
-  WriteExplicitCurveVal(0, level)
-
-def GenerateTwoSlope(name, max_volume, step_1, step_2, pivot_point):
-  print '[%s]' % name
-  print '  ; Generated by create_volume_curve.py'
-  print ('  ; two_slope, max = %d, pivot = %d, steps %d, %d' %
-         (max_volume, pivot_point, step_1, step_2))
-  print '  volume_curve = explicit'
-  for i in range(0, (100 - pivot_point)):
-    WriteExplicitCurveVal(100 - i, max_volume - step_1 * i)
-  pivot_dB_val = max_volume - step_1 * (100 - pivot_point)
-  WriteExplicitCurveVal(pivot_point, max_volume - step_1 * (100 - pivot_point))
-  for i in range(1, pivot_point):
-    WriteExplicitCurveVal(pivot_point - i,  pivot_dB_val - step_2 * i)
-  WriteExplicitCurveVal(0, pivot_dB_val - pivot_point * step_2)
-
-def main():
-  print 'What is the name of the jack or output to generate a curve for?'
-  jack_name = raw_input(">");
-  print 'Which type of curve? (simple_step, explicit, two_slope): '
-  curve_type = raw_input(">");
-  if curve_type == 'simple_step':
-    print 'max volume (dBFS * 100):'
-    max_volume = int(raw_input(">"))
-    print 'step size (in dBFS * 100)'
-    step_size = int(raw_input(">"))
-    GenerateSimpleStep(jack_name, max_volume, step_size)
-  elif curve_type == 'explicit':
-    GenerateExplicit(jack_name)
-  elif curve_type == 'two_slope':
-    print 'max volume (dBFS * 100):'
-    max_volume = int(raw_input(">"))
-    print 'Volume step where slope changes:'
-    pivot_point = int(raw_input(">"))
-    print 'step size 100 to %d(in dBFS * 100)' % pivot_point
-    step_1 = int(raw_input(">"))
-    print 'step size %d to 0(in dBFS * 100)' % pivot_point
-    step_2 = int(raw_input(">"))
-    GenerateTwoSlope(jack_name, max_volume, step_1, step_2, pivot_point)
-
-if __name__ == '__main__':
-  main()
diff --git a/cros_alsa/.gitignore b/cros_alsa/.gitignore
deleted file mode 100644
index b659239..0000000
--- a/cros_alsa/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-target/
-.*.rustfmt
-Cargo.lock
diff --git a/cros_alsa/.rustfmt.toml b/cros_alsa/.rustfmt.toml
deleted file mode 100644
index a2db301..0000000
--- a/cros_alsa/.rustfmt.toml
+++ /dev/null
@@ -1,2 +0,0 @@
-use_field_init_shorthand = true
-use_try_shorthand = true
diff --git a/cros_alsa/Cargo.toml b/cros_alsa/Cargo.toml
deleted file mode 100644
index 2e006e4..0000000
--- a/cros_alsa/Cargo.toml
+++ /dev/null
@@ -1,15 +0,0 @@
-[package]
-name = "cros_alsa"
-version = "0.1.0"
-authors = ["The Chromium OS Authors"]
-edition = "2018"
-description = "The Chromium OS alsa-lib wrapper"
-
-[dependencies]
-alsa-sys = "0.2.0"
-cros_alsa_derive = "*"
-libc = "0.2.65"
-remain = "0.2.1"
-
-[patch.crates-io]
-cros_alsa_derive = { path = "cros_alsa_derive" }
diff --git a/cros_alsa/cros_alsa_derive/Cargo.toml b/cros_alsa/cros_alsa_derive/Cargo.toml
deleted file mode 100644
index 6a4da28..0000000
--- a/cros_alsa/cros_alsa_derive/Cargo.toml
+++ /dev/null
@@ -1,14 +0,0 @@
-[package]
-name = "cros_alsa_derive"
-version = "0.1.0"
-authors = ["The Chromium OS Authors"]
-edition = "2018"
-description = "Derive macros of cors_alsa."
-
-[lib]
-proc-macro = true
-
-[dependencies]
-proc-macro2 = "^1"
-quote = "^1"
-syn = "^1"
diff --git a/cros_alsa/cros_alsa_derive/src/common.rs b/cros_alsa/cros_alsa_derive/src/common.rs
deleted file mode 100644
index 2daaa3b..0000000
--- a/cros_alsa/cros_alsa_derive/src/common.rs
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright 2020 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-//! This mod provides common constants, structs and functions used across cros_alsa_derive.
-use std::convert::TryFrom;
-
-use syn::{Lit, Meta, NestedMeta, Result};
-
-/// Attribute name of cros_alsa.
-const CROS_ALSA: &str = "cros_alsa";
-
-/// const for `#[cros_alsa(path = "...")]`
-const PATH: &str = "path";
-
-/// Possible `#[cros_alsa("...")]` derive macro helper attributes.
-pub enum CrosAlsaAttr {
-    /// Use `#[cros_alsa(path = "crate")]` to replace the crate path of cros_alsa in derive macros.
-    Path(syn::Path),
-}
-
-impl CrosAlsaAttr {
-    /// Return true if the value is a `Path` variant.
-    pub fn is_path(&self) -> bool {
-        use CrosAlsaAttr::*;
-        match self {
-            Path(_) => true,
-            // suppress unreachable_patterns warning because there is only one CrosAlsaAttr variant.
-            #[allow(unreachable_patterns)]
-            _ => false,
-        }
-    }
-}
-
-impl TryFrom<syn::NestedMeta> for CrosAlsaAttr {
-    type Error = syn::Error;
-    fn try_from(meta_item: NestedMeta) -> Result<CrosAlsaAttr> {
-        match meta_item {
-            // Parse `#[cros_alsa(path = "crate")]`
-            NestedMeta::Meta(Meta::NameValue(m)) if m.path.is_ident(PATH) => {
-                if let Lit::Str(lit_str) = &m.lit {
-                    return Ok(CrosAlsaAttr::Path(lit_str.parse()?));
-                }
-                Err(syn::Error::new_spanned(
-                    &m.lit,
-                    "expected a valid path for cros_alsa_derive::CrosAlsaAttr::Path",
-                ))
-            }
-            _ => Err(syn::Error::new_spanned(
-                meta_item,
-                "unrecognized cros_alsa_derive::CrosAlsaAttr",
-            )),
-        }
-    }
-}
-
-/// Parses `#[cros_alsa(path = "...")]` into a list of `CrosAlsaAttr`.
-/// It's used to replace the crate path of cros_alsa in derive macros.
-pub fn parse_cros_alsa_attr(attrs: &[syn::Attribute]) -> Result<Vec<CrosAlsaAttr>> {
-    attrs
-        .iter()
-        .flat_map(|attr| get_cros_alsa_meta_items(attr))
-        .flatten()
-        .map(CrosAlsaAttr::try_from)
-        .collect()
-}
-
-/// Parses and collects `NestedMeta` under `cros_alsa` attribute.
-fn get_cros_alsa_meta_items(attr: &syn::Attribute) -> Result<Vec<syn::NestedMeta>> {
-    if !attr.path.is_ident(CROS_ALSA) {
-        return Ok(Vec::new());
-    }
-    match attr.parse_meta() {
-        Ok(Meta::List(meta)) => Ok(meta.nested.into_iter().collect()),
-        _ => Err(syn::Error::new_spanned(attr, "expected #[cros_alsa(...)]")),
-    }
-}
diff --git a/cros_alsa/cros_alsa_derive/src/control.rs b/cros_alsa/cros_alsa_derive/src/control.rs
deleted file mode 100644
index 584a541..0000000
--- a/cros_alsa/cros_alsa_derive/src/control.rs
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2020 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-//! This mod provides derive macros for cros_alsa::control.
-
-use proc_macro::TokenStream;
-use proc_macro2::Span;
-use quote::quote;
-
-use crate::common::{parse_cros_alsa_attr, CrosAlsaAttr};
-
-/// The provide default implementation for `ControlOps`.
-/// Users could hold `Ctl` and `ElemID` as `handle` and `id` in their control structure and use
-/// `#[derive(ControlOps)]` macro to generate default load / save implementations.
-pub fn impl_control_ops(ast: &syn::DeriveInput) -> TokenStream {
-    let name = &ast.ident;
-    let (impl_generics, ty_generics, where_clause) = ast.generics.split_for_impl();
-    let attrs = match parse_cros_alsa_attr(&ast.attrs) {
-        Ok(attrs) => attrs,
-        Err(e) => return e.to_compile_error().into(),
-    };
-    let path = match attrs.iter().find(|x| x.is_path()) {
-        Some(CrosAlsaAttr::Path(path)) => path.clone(),
-        None => syn::LitStr::new("cros_alsa", Span::call_site())
-            .parse()
-            .expect("failed to create a default path for derive macro: ControlOps"),
-    };
-    let gen = quote! {
-        impl #impl_generics #path::ControlOps #impl_generics for #name #ty_generics #where_clause {
-            fn load(&mut self) -> ::std::result::Result<<Self as #path::Control #impl_generics>::Item, #path::ControlError> {
-                Ok(<Self as #path::Control>::Item::load(self.handle, &self.id)?)
-            }
-            fn save(&mut self, val: <Self as #path::Control #impl_generics>::Item) -> ::std::result::Result<bool, #path::ControlError> {
-                Ok(<Self as #path::Control>::Item::save(self.handle, &self.id, val)?)
-            }
-        }
-    };
-    gen.into()
-}
diff --git a/cros_alsa/cros_alsa_derive/src/lib.rs b/cros_alsa/cros_alsa_derive/src/lib.rs
deleted file mode 100644
index 9970de7..0000000
--- a/cros_alsa/cros_alsa_derive/src/lib.rs
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2020 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-//! `cros_alsa_derive` crate provides derive macros for cros_alsa.
-//!
-
-#![deny(missing_docs)]
-extern crate proc_macro;
-
-use proc_macro::TokenStream;
-
-mod common;
-mod control;
-use self::control::impl_control_ops;
-
-#[proc_macro_derive(ControlOps, attributes(cros_alsa))]
-/// Derive macro generating an impl of the trait ControlOps.
-/// To use this derive macro, users should hold `Ctl` and `ElemID` as `handle`
-/// and `id` in their control structure.
-pub fn control_ops_derive(input: TokenStream) -> TokenStream {
-    match syn::parse(input) {
-        Ok(ast) => impl_control_ops(&ast),
-        Err(e) => e.to_compile_error().into(),
-    }
-}
diff --git a/cros_alsa/src/card.rs b/cros_alsa/src/card.rs
deleted file mode 100644
index 42beef2..0000000
--- a/cros_alsa/src/card.rs
+++ /dev/null
@@ -1,117 +0,0 @@
-// Copyright 2020 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-use std::error;
-use std::fmt;
-
-use remain::sorted;
-
-use crate::control::{self, Control};
-use crate::control_primitive;
-use crate::control_primitive::{Ctl, ElemId, ElemIface};
-use crate::control_tlv::{self, ControlTLV};
-
-pub type Result<T> = std::result::Result<T, Error>;
-
-#[sorted]
-#[derive(Debug)]
-/// Possible errors that can occur in cros-alsa::card.
-pub enum Error {
-    /// Failed to call AlsaControlAPI.
-    AlsaControlAPI(control_primitive::Error),
-    /// Error occurs in Control.
-    Control(control::Error),
-    /// Error occurs in ControlTLV.
-    ControlTLV(control_tlv::Error),
-}
-
-impl error::Error for Error {}
-
-impl From<control::Error> for Error {
-    fn from(err: control::Error) -> Error {
-        Error::Control(err)
-    }
-}
-
-impl From<control_tlv::Error> for Error {
-    fn from(err: control_tlv::Error) -> Error {
-        Error::ControlTLV(err)
-    }
-}
-
-impl From<control_primitive::Error> for Error {
-    fn from(err: control_primitive::Error) -> Error {
-        Error::AlsaControlAPI(err)
-    }
-}
-
-impl fmt::Display for Error {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        use Error::*;
-        match self {
-            AlsaControlAPI(e) => write!(f, "{}", e),
-            Control(e) => write!(f, "{}", e),
-            ControlTLV(e) => write!(f, "{}", e),
-        }
-    }
-}
-
-/// `Card` represents a sound card.
-#[derive(Debug)]
-pub struct Card {
-    handle: Ctl,
-    name: String,
-}
-
-impl Card {
-    /// Creates a `Card`.
-    ///
-    /// # Arguments
-    ///
-    /// * `card_name` - The sound card name, ex: sofcmlmax98390d.
-    ///
-    /// # Errors
-    ///
-    /// * If card_name is an invalid CString.
-    /// * If snd_ctl_open() fails.
-    pub fn new(card_name: &str) -> Result<Self> {
-        let handle = Ctl::new(&format!("hw:{}", card_name))?;
-        Ok(Card {
-            name: card_name.to_owned(),
-            handle,
-        })
-    }
-
-    /// Gets sound card name.
-    pub fn name(&self) -> &str {
-        &self.name
-    }
-
-    /// Creates a `Control` from control name.
-    ///
-    /// # Errors
-    ///
-    /// * If control name is an invalid CString.
-    /// * If control does not exist.
-    /// * If `Control` elem_type() mismatches the type of underlying mixer control.
-    /// * If `Control` size() mismatches the number of value entries of underlying mixer control.
-    pub fn control_by_name<'a, T: 'a>(&'a mut self, control_name: &str) -> Result<T>
-    where
-        T: Control<'a>,
-    {
-        let id = ElemId::new(ElemIface::Mixer, control_name)?;
-        Ok(T::from(&mut self.handle, id)?)
-    }
-
-    /// Creates a `ControlTLV` from control name.
-    ///
-    /// # Errors
-    ///
-    /// * If control name is an invalid CString.
-    /// * If control does not exist.
-    pub fn control_tlv_by_name<'a>(&'a mut self, control_name: &str) -> Result<ControlTLV<'a>> {
-        let id = ElemId::new(ElemIface::Mixer, control_name)?;
-        Ok(ControlTLV::new(&mut self.handle, id)?)
-    }
-}
diff --git a/cros_alsa/src/control.rs b/cros_alsa/src/control.rs
deleted file mode 100644
index 2bc9025..0000000
--- a/cros_alsa/src/control.rs
+++ /dev/null
@@ -1,297 +0,0 @@
-// Copyright 2020 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-//! `control` module is meant to provide easier to use and more type safe abstractions
-//! for various alsa mixer controls.
-//!
-//! Each mixer control should implement the `Control` trait to allow itself to be created by `Card`.
-//! Each mixer control could hold `Ctl` as handle and `ElemID` as id and use `#[derive(ControlOps)]` macro
-//! to generate default load / save implementations of the `ControlOps` trait which allows itself to read and
-//! write the underlying hardware.
-//!
-//! # Examples
-//! This is an example of how to define a `SwitchControl`.
-//!
-//! ```
-//! use std::error::Error;
-//!
-//! use cros_alsa::{Ctl, ElemId, Control, ControlError, ControlOps};
-//! use cros_alsa::elem::Elem;
-//!
-//! type Result<T> = std::result::Result<T, ControlError>;
-//!
-//! #[derive(ControlOps)]
-//! pub struct SwitchControl<'a> {
-//!     // Must hold `Ctl` as handle and `ElemID` as id to use `#[derive(ControlOps)]`.
-//!     handle: &'a mut Ctl,
-//!     id: ElemId,
-//! }
-//!
-//! impl<'a> Control<'a> for SwitchControl <'a> {
-//!     type Item = [bool; 1];
-//!
-//!     fn new(handle: &'a mut Ctl, id: ElemId) -> Self {
-//!         Self {
-//!             handle,
-//!             id,
-//!         }
-//!     }
-//! }
-//!
-//! impl<'a> SwitchControl<'a> {
-//!     /// Reads the state of a switch type mix control.
-//!     pub fn state(&mut self) -> Result<bool> {
-//!         // Uses ControlOps::load() to read the mixer control.
-//!         let v = self.load()?;
-//!         Ok(v[0])
-//!     }
-//!
-//!     /// Updates the control state to true.
-//!     pub fn on(&mut self) -> Result<()> {
-//!         // Uses ControlOps::save() to write the mixer control.
-//!         self.save([true])?;
-//!         Ok(())
-//!     }
-//! }
-//!
-//! ```
-
-use std::error;
-use std::fmt;
-
-use cros_alsa_derive::ControlOps;
-use remain::sorted;
-
-use crate::control_primitive::{self, Ctl, ElemId, ElemInfo, ElemType};
-use crate::elem::{self, Elem};
-
-/// The Result type of cros-alsa::control.
-pub type Result<T> = std::result::Result<T, Error>;
-
-#[sorted]
-#[derive(Debug)]
-/// Possible errors that can occur in cros-alsa::control.
-pub enum Error {
-    /// Failed to call AlsaControlAPI.
-    AlsaControlAPI(control_primitive::Error),
-    /// Error occurs in Elem.
-    Elem(elem::Error),
-    /// Elem::size() does not match the element count of the mixer control.
-    MismatchElemCount(String, usize, usize),
-    /// Elem::elem_type() does not match the data type of the mixer control.
-    MismatchElemType(String, ElemType, ElemType),
-}
-
-impl error::Error for Error {}
-
-impl From<control_primitive::Error> for Error {
-    fn from(err: control_primitive::Error) -> Error {
-        Error::AlsaControlAPI(err)
-    }
-}
-
-impl From<elem::Error> for Error {
-    fn from(err: elem::Error) -> Error {
-        Error::Elem(err)
-    }
-}
-
-impl fmt::Display for Error {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        use Error::*;
-        match self {
-            AlsaControlAPI(e) => write!(f, "{}", e),
-            Elem(e) => write!(f, "{}", e),
-            MismatchElemCount(name, count, elem_count) => write!(
-                f,
-                "invalid `Control::size()` of {}: expect: {}, get: {}",
-                name, count, elem_count
-            ),
-            MismatchElemType(name, t, elem_type) => write!(
-                f,
-                "invalid `Control::elem_type()` of {}: expect: {}, get: {}",
-                name, t, elem_type
-            ),
-        }
-    }
-}
-
-/// Each mixer control should implement the `Control` trait to allow itself to be created by `Card`.
-pub trait Control<'a>: Sized + 'a {
-    /// The data type of the mixer control.
-    /// Use `ElemType::load()` and `ElemType::save()` to read or write the mixer control.
-    type Item: Elem;
-
-    /// Called by `Self::from(handle: &'a mut Ctl, id: ElemId)` to create a `Control`.
-    fn new(handle: &'a mut Ctl, id: ElemId) -> Self;
-    /// Called by `Card` to create a `Control`.
-    fn from(handle: &'a mut Ctl, id: ElemId) -> Result<Self> {
-        let info = ElemInfo::new(handle, &id)?;
-        if info.elem_type()? != Self::elem_type() {
-            return Err(Error::MismatchElemType(
-                id.name()?.to_owned(),
-                info.elem_type()?,
-                Self::elem_type(),
-            ));
-        }
-
-        if info.count() != Self::size() {
-            return Err(Error::MismatchElemCount(
-                id.name()?.to_owned(),
-                info.count(),
-                Self::size(),
-            ));
-        }
-
-        Ok(Self::new(handle, id))
-    }
-    /// Called by `Self::from(handle: &'a mut Ctl, id: ElemId)` to validate the data type of a
-    /// `Control`.
-    fn elem_type() -> ElemType {
-        Self::Item::elem_type()
-    }
-    /// Called by `Self::from(handle: &'a mut Ctl, id: ElemId)` to validate the number of value
-    /// entries of a `Control`.
-    fn size() -> usize {
-        Self::Item::size()
-    }
-}
-
-/// Each mixer control could implement the `ControlOps` trait to allow itself to read and
-/// write the underlying hardware`. Users could hold `Ctl` and `ElemID` as `handle` and `id`
-/// in their control structure and use `#[derive(ControlOps)]` macro to generate default
-/// load / save implementations.
-pub trait ControlOps<'a>: Control<'a> {
-    /// Reads the values of the mixer control.
-    fn load(&mut self) -> Result<<Self as Control<'a>>::Item>;
-    /// Saves the values to the mixer control.
-    fn save(&mut self, val: <Self as Control<'a>>::Item) -> Result<bool>;
-}
-
-/// `Control` that reads and writes a single integer value entry.
-/// Since this crate is the `cros_alsa` crate, we replace the `cros_alsa`
-/// path to `crate` in derive macros by `cros_alsa` attribute.
-#[derive(ControlOps)]
-#[cros_alsa(path = "crate")]
-pub struct IntControl<'a> {
-    handle: &'a mut Ctl,
-    id: ElemId,
-}
-
-impl<'a> IntControl<'a> {
-    /// Gets an i32 value from the mixer control.
-    ///
-    /// # Errors
-    ///
-    /// * If it fails to read from the control.
-    pub fn get(&mut self) -> Result<i32> {
-        let val = self.load()?;
-        Ok(val[0])
-    }
-
-    /// Updates an i32 value to the mixer control.
-    ///
-    /// # Errors
-    ///
-    /// * If it fails to write to the control.
-    pub fn set(&mut self, val: i32) -> Result<()> {
-        self.save([val])?;
-        Ok(())
-    }
-}
-
-impl<'a> Control<'a> for IntControl<'a> {
-    type Item = [i32; 1];
-    fn new(handle: &'a mut Ctl, id: ElemId) -> Self {
-        Self { handle, id }
-    }
-}
-
-/// Stereo Volume Mixer Control
-/// Since this crate is the `cros_alsa` crate, we replace the `cros_alsa`
-/// path to `crate` in derive macros by `cros_alsa` attribute.
-#[derive(ControlOps)]
-#[cros_alsa(path = "crate")]
-pub struct StereoVolumeControl<'a> {
-    handle: &'a mut Ctl,
-    id: ElemId,
-}
-
-impl<'a> StereoVolumeControl<'a> {
-    /// Reads the left and right volume.
-    ///
-    /// # Errors
-    ///
-    /// * If it fails to read from the control.
-    pub fn volume(&mut self) -> Result<(i32, i32)> {
-        let val = self.load()?;
-        Ok((val[0], val[1]))
-    }
-
-    /// Updates the left and right volume.
-    ///
-    /// # Errors
-    ///
-    /// * If it fails to write to the control.
-    pub fn set_volume(&mut self, left: i32, right: i32) -> Result<()> {
-        self.save([left, right])?;
-        Ok(())
-    }
-}
-
-impl<'a> Control<'a> for StereoVolumeControl<'a> {
-    type Item = [i32; 2];
-    fn new(handle: &'a mut Ctl, id: ElemId) -> Self {
-        Self { handle, id }
-    }
-}
-
-/// `Control` that reads and writes a single boolean value entry.
-/// Since this crate is the `cros_alsa` crate, we replace the `cros_alsa`
-/// path to `crate` in derive macros by `cros_alsa` attribute.
-#[derive(ControlOps)]
-#[cros_alsa(path = "crate")]
-pub struct SwitchControl<'a> {
-    handle: &'a mut Ctl,
-    id: ElemId,
-}
-
-impl<'a> SwitchControl<'a> {
-    /// Reads the state of a switch type mix control.
-    ///
-    /// # Errors
-    ///
-    /// * If it fails to read from the control.
-    pub fn state(&mut self) -> Result<bool> {
-        let v = self.load()?;
-        Ok(v[0])
-    }
-
-    /// Updates the control state to true.
-    ///
-    /// # Errors
-    ///
-    /// * If it fails to write to the control.
-    pub fn on(&mut self) -> Result<()> {
-        self.save([true])?;
-        Ok(())
-    }
-
-    /// Updates the control state to false.
-    ///
-    /// # Errors
-    ///
-    /// * If it fails to write to the control.
-    pub fn off(&mut self) -> Result<()> {
-        self.save([false])?;
-        Ok(())
-    }
-}
-
-impl<'a> Control<'a> for SwitchControl<'a> {
-    type Item = [bool; 1];
-    fn new(handle: &'a mut Ctl, id: ElemId) -> Self {
-        Self { handle, id }
-    }
-}
diff --git a/cros_alsa/src/control_primitive.rs b/cros_alsa/src/control_primitive.rs
deleted file mode 100644
index 227aef2..0000000
--- a/cros_alsa/src/control_primitive.rs
+++ /dev/null
@@ -1,406 +0,0 @@
-// Copyright 2020 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-use std::convert::TryFrom;
-use std::error;
-use std::ffi::{CStr, CString, FromBytesWithNulError, NulError};
-use std::fmt;
-use std::marker::PhantomData;
-use std::ptr;
-use std::slice;
-use std::str;
-
-use alsa_sys::*;
-use libc::strlen;
-use remain::sorted;
-
-pub type Result<T> = std::result::Result<T, Error>;
-
-#[derive(Debug, PartialEq)]
-/// Possible errors that can occur in FFI functions.
-pub enum FFIError {
-    Rc(i32),
-    NullPtr,
-}
-
-impl fmt::Display for FFIError {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        use FFIError::*;
-        match self {
-            Rc(rc) => write!(f, "{}", snd_strerror(*rc)?),
-            NullPtr => write!(f, "the return value is a null pointer"),
-        }
-    }
-}
-
-#[sorted]
-#[derive(Debug, PartialEq)]
-/// Possible errors that can occur in cros-alsa::control_primitive.
-pub enum Error {
-    /// Control with the given name does not exist.
-    ControlNotFound(String),
-    /// Failed to call snd_ctl_open().
-    CtlOpenFailed(FFIError, String),
-    /// snd_ctl_elem_id_get_name() returns null.
-    ElemIdGetNameFailed,
-    /// Failed to call snd_ctl_elem_id_malloc().
-    ElemIdMallocFailed(FFIError),
-    /// Failed to call snd_ctl_elem_info_malloc().
-    ElemInfoMallocFailed(FFIError),
-    /// Failed to call snd_ctl_elem_value_malloc().
-    ElemValueMallocFailed(FFIError),
-    /// The slice used to create a CStr does not have one and only one null
-    /// byte positioned at the end.
-    FromBytesWithNulError(FromBytesWithNulError),
-    /// Failed to convert to a valid ElemType.
-    InvalidElemType(u32),
-    /// An error indicating that an interior nul byte was found.
-    NulError(NulError),
-    /// Failed to call snd_strerror().
-    SndStrErrorFailed(i32),
-    /// UTF-8 validation failed
-    Utf8Error(str::Utf8Error),
-}
-
-impl error::Error for Error {}
-
-impl fmt::Display for Error {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        use Error::*;
-        match self {
-            ControlNotFound(name) => write!(f, "control: {} does not exist", name),
-            CtlOpenFailed(e, name) => write!(f, "{} snd_ctl_open failed: {}", name, e,),
-            ElemIdGetNameFailed => write!(f, "snd_ctl_elem_id_get_name failed"),
-            ElemIdMallocFailed(e) => write!(f, "snd_ctl_elem_id_malloc failed: {}", e),
-            ElemInfoMallocFailed(e) => write!(f, "snd_ctl_elem_info_malloc failed: {}", e),
-            ElemValueMallocFailed(e) => write!(f, "snd_ctl_elem_value_malloc failed: {}", e),
-            FromBytesWithNulError(e) => write!(f, "invalid CString: {}", e),
-            InvalidElemType(v) => write!(f, "invalid ElemType: {}", v),
-            NulError(e) => write!(f, "invalid CString: {}", e),
-            SndStrErrorFailed(e) => write!(f, "snd_strerror() failed: {}", e),
-            Utf8Error(e) => write!(f, "{}", e),
-        }
-    }
-}
-
-impl From<Error> for fmt::Error {
-    fn from(_err: Error) -> fmt::Error {
-        fmt::Error
-    }
-}
-
-impl From<str::Utf8Error> for Error {
-    fn from(err: str::Utf8Error) -> Error {
-        Error::Utf8Error(err)
-    }
-}
-
-impl From<FromBytesWithNulError> for Error {
-    fn from(err: FromBytesWithNulError) -> Error {
-        Error::FromBytesWithNulError(err)
-    }
-}
-
-impl From<NulError> for Error {
-    fn from(err: NulError) -> Error {
-        Error::NulError(err)
-    }
-}
-
-/// [snd_ctl_elem_iface_t](https://www.alsa-project.org/alsa-doc/alsa-lib/group___control.html#ga14baa0febb91cc4c5d72dcc825acf518) wrapper.
-#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
-pub enum ElemIface {
-    Card = SND_CTL_ELEM_IFACE_CARD as isize,
-    Hwdep = SND_CTL_ELEM_IFACE_HWDEP as isize,
-    Mixer = SND_CTL_ELEM_IFACE_MIXER as isize,
-    PCM = SND_CTL_ELEM_IFACE_PCM as isize,
-    Rawmidi = SND_CTL_ELEM_IFACE_RAWMIDI as isize,
-    Timer = SND_CTL_ELEM_IFACE_TIMER as isize,
-    Sequencer = SND_CTL_ELEM_IFACE_SEQUENCER as isize,
-}
-
-#[derive(Debug, Copy, Clone, PartialEq, Eq)]
-/// [snd_ctl_elem_type_t](https://www.alsa-project.org/alsa-doc/alsa-lib/group___control.html#gac42e0ed6713b62711af5e80b4b3bcfec) wrapper.
-pub enum ElemType {
-    None = SND_CTL_ELEM_TYPE_NONE as isize,
-    Boolean = SND_CTL_ELEM_TYPE_BOOLEAN as isize,
-    Integer = SND_CTL_ELEM_TYPE_INTEGER as isize,
-    Enumerated = SND_CTL_ELEM_TYPE_ENUMERATED as isize,
-    Bytes = SND_CTL_ELEM_TYPE_BYTES as isize,
-    IEC958 = SND_CTL_ELEM_TYPE_IEC958 as isize,
-    Integer64 = SND_CTL_ELEM_TYPE_INTEGER64 as isize,
-}
-
-impl fmt::Display for ElemType {
-    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
-        match self {
-            ElemType::None => write!(f, "SND_CTL_ELEM_TYPE_NONE"),
-            ElemType::Boolean => write!(f, "SND_CTL_ELEM_TYPE_BOOLEAN"),
-            ElemType::Integer => write!(f, "SND_CTL_ELEM_TYPE_INTEGER"),
-            ElemType::Enumerated => write!(f, "SND_CTL_ELEM_TYPE_ENUMERATED"),
-            ElemType::Bytes => write!(f, "SND_CTL_ELEM_TYPE_BYTES"),
-            ElemType::IEC958 => write!(f, "SND_CTL_ELEM_TYPE_IEC958"),
-            ElemType::Integer64 => write!(f, "SND_CTL_ELEM_TYPE_INTEGER64"),
-        }
-    }
-}
-
-impl TryFrom<u32> for ElemType {
-    type Error = Error;
-    fn try_from(elem_type: u32) -> Result<ElemType> {
-        match elem_type {
-            SND_CTL_ELEM_TYPE_NONE => Ok(ElemType::None),
-            SND_CTL_ELEM_TYPE_BOOLEAN => Ok(ElemType::Boolean),
-            SND_CTL_ELEM_TYPE_INTEGER => Ok(ElemType::Integer),
-            SND_CTL_ELEM_TYPE_ENUMERATED => Ok(ElemType::Enumerated),
-            SND_CTL_ELEM_TYPE_BYTES => Ok(ElemType::Bytes),
-            SND_CTL_ELEM_TYPE_IEC958 => Ok(ElemType::IEC958),
-            SND_CTL_ELEM_TYPE_INTEGER64 => Ok(ElemType::Integer64),
-            _ => Err(Error::InvalidElemType(elem_type)),
-        }
-    }
-}
-
-/// [snd_ctl_elem_id_t](https://www.alsa-project.org/alsa-doc/alsa-lib/group___control.html#gad6c3746f1925bfec6a4fd0e913430e55) wrapper.
-pub struct ElemId(
-    ptr::NonNull<snd_ctl_elem_id_t>,
-    PhantomData<snd_ctl_elem_id_t>,
-);
-
-impl Drop for ElemId {
-    fn drop(&mut self) {
-        // Safe because self.0.as_ptr() is a valid snd_ctl_elem_id_t*.
-        unsafe { snd_ctl_elem_id_free(self.0.as_ptr()) };
-    }
-}
-
-impl ElemId {
-    /// Creates an `ElemId` object by `ElemIface` and name.
-    ///
-    /// # Errors
-    ///
-    /// * If memory allocation fails.
-    /// * If ctl_name is not a valid CString.
-    pub fn new(iface: ElemIface, ctl_name: &str) -> Result<ElemId> {
-        let mut id_ptr = ptr::null_mut();
-        // Safe because we provide a valid id_ptr to be filled,
-        // and we validate the return code before using id_ptr.
-        let rc = unsafe { snd_ctl_elem_id_malloc(&mut id_ptr) };
-        if rc < 0 {
-            return Err(Error::ElemIdMallocFailed(FFIError::Rc(rc)));
-        }
-        let id = ptr::NonNull::new(id_ptr).ok_or(Error::ElemIdMallocFailed(FFIError::NullPtr))?;
-
-        // Safe because id.as_ptr() is a valid snd_ctl_elem_id_t*.
-        unsafe { snd_ctl_elem_id_set_interface(id.as_ptr(), iface as u32) };
-        let name = CString::new(ctl_name)?;
-        // Safe because id.as_ptr() is a valid snd_ctl_elem_id_t* and name is a safe CString.
-        unsafe { snd_ctl_elem_id_set_name(id.as_ptr(), name.as_ptr()) };
-        Ok(ElemId(id, PhantomData))
-    }
-
-    /// Borrows the const inner pointer.
-    pub fn as_ptr(&self) -> *const snd_ctl_elem_id_t {
-        self.0.as_ptr()
-    }
-
-    /// Safe [snd_ctl_elem_id_get_name()] (https://www.alsa-project.org/alsa-doc/alsa-lib/group___control.html#gaa6cfea3ac963bfdaeb8189e03e927a76) wrapper.
-    ///
-    /// # Errors
-    ///
-    /// * If snd_ctl_elem_id_get_name() fails.
-    /// * If control element name is not a valid CString.
-    /// * If control element name is not valid UTF-8 data.
-    pub fn name(&self) -> Result<&str> {
-        // Safe because self.as_ptr() is a valid snd_ctl_elem_id_t*.
-        let name = unsafe { snd_ctl_elem_id_get_name(self.as_ptr()) };
-        if name.is_null() {
-            return Err(Error::ElemIdGetNameFailed);
-        }
-        // Safe because name is a valid *const i8, and its life time
-        // is the same as the passed reference of self.
-        let s = CStr::from_bytes_with_nul(unsafe {
-            slice::from_raw_parts(name as *const u8, strlen(name) + 1)
-        })?;
-        Ok(s.to_str()?)
-    }
-}
-
-/// [snd_ctl_elem_value_t](https://www.alsa-project.org/alsa-doc/alsa-lib/group___control.html#ga266b478eb64f1cdd75e337df4b4b995e) wrapper.
-pub struct ElemValue(
-    ptr::NonNull<snd_ctl_elem_value_t>,
-    PhantomData<snd_ctl_elem_value_t>,
-);
-
-impl Drop for ElemValue {
-    // Safe because self.0.as_ptr() is valid.
-    fn drop(&mut self) {
-        unsafe { snd_ctl_elem_value_free(self.0.as_ptr()) };
-    }
-}
-
-impl ElemValue {
-    /// Creates an `ElemValue`.
-    ///
-    /// # Errors
-    ///
-    /// * If memory allocation fails.
-    pub fn new(id: &ElemId) -> Result<ElemValue> {
-        let mut v_ptr = ptr::null_mut();
-        // Safe because we provide a valid v_ptr to be filled,
-        // and we validate the return code before using v_ptr.
-        let rc = unsafe { snd_ctl_elem_value_malloc(&mut v_ptr) };
-        if rc < 0 {
-            return Err(Error::ElemValueMallocFailed(FFIError::Rc(rc)));
-        }
-        let value =
-            ptr::NonNull::new(v_ptr).ok_or(Error::ElemValueMallocFailed(FFIError::NullPtr))?;
-        // Safe because value.as_ptr() is a valid snd_ctl_elem_value_t* and id.as_ptr() is also valid.
-        unsafe { snd_ctl_elem_value_set_id(value.as_ptr(), id.as_ptr()) };
-        Ok(ElemValue(value, PhantomData))
-    }
-
-    /// Borrows the mutable inner pointer.
-    pub fn as_mut_ptr(&mut self) -> *mut snd_ctl_elem_value_t {
-        self.0.as_ptr()
-    }
-
-    /// Borrows the const inner pointer.
-    pub fn as_ptr(&self) -> *const snd_ctl_elem_value_t {
-        self.0.as_ptr()
-    }
-}
-
-/// [snd_ctl_elem_info_t](https://www.alsa-project.org/alsa-doc/alsa-lib/group___control.html#ga2cae0bb76df919368e4ff9a7021dd3ab) wrapper.
-pub struct ElemInfo(
-    ptr::NonNull<snd_ctl_elem_info_t>,
-    PhantomData<snd_ctl_elem_info_t>,
-);
-
-impl Drop for ElemInfo {
-    fn drop(&mut self) {
-        // Safe because self.0.as_ptr() is a valid snd_ctl_elem_info_t*.
-        unsafe { snd_ctl_elem_info_free(self.0.as_ptr()) };
-    }
-}
-
-impl ElemInfo {
-    /// Creates an `ElemInfo`.
-    ///
-    /// # Errors
-    ///
-    /// * If memory allocation fails.
-    /// * If control does not exist.
-    pub fn new(handle: &mut Ctl, id: &ElemId) -> Result<ElemInfo> {
-        let mut info_ptr = ptr::null_mut();
-
-        // Safe because we provide a valid info_ptr to be filled,
-        // and we validate the return code before using info_ptr.
-        let rc = unsafe { snd_ctl_elem_info_malloc(&mut info_ptr) };
-        if rc < 0 {
-            return Err(Error::ElemInfoMallocFailed(FFIError::Rc(rc)));
-        }
-        let info =
-            ptr::NonNull::new(info_ptr).ok_or(Error::ElemInfoMallocFailed(FFIError::NullPtr))?;
-
-        // Safe because info.as_ptr() is a valid snd_ctl_elem_info_t* and id.as_ptr() is also valid.
-        unsafe { snd_ctl_elem_info_set_id(info.as_ptr(), id.as_ptr()) };
-
-        // Safe because handle.as_mut_ptr() is a valid snd_ctl_t* and info.as_ptr() is a valid
-        // snd_ctl_elem_info_t*.
-        let rc = unsafe { snd_ctl_elem_info(handle.as_mut_ptr(), info.as_ptr()) };
-        if rc < 0 {
-            return Err(Error::ControlNotFound(id.name()?.to_owned()));
-        }
-        Ok(ElemInfo(info, PhantomData))
-    }
-
-    /// Safe [snd_ctl_elem_info_get_type](https://www.alsa-project.org/alsa-doc/alsa-lib/group___control.html#ga0fec5d22ee58d04f14b59f405adc595e) wrapper.
-    pub fn elem_type(&self) -> Result<ElemType> {
-        // Safe because self.0.as_ptr() is a valid snd_ctl_elem_info_t*.
-        unsafe { ElemType::try_from(snd_ctl_elem_info_get_type(self.0.as_ptr())) }
-    }
-
-    /// Safe [snd_ctl_elem_info_get_count](https://www.alsa-project.org/alsa-doc/alsa-lib/group___control.html#gaa75a20d4190d324bcda5fd6659a4b377) wrapper.
-    pub fn count(&self) -> usize {
-        // Safe because self.0.as_ptr() is a valid snd_ctl_elem_info_t*.
-        unsafe { snd_ctl_elem_info_get_count(self.0.as_ptr()) as usize }
-    }
-
-    /// Safe [snd_ctl_elem_info_is_tlv_readable](https://www.alsa-project.org/alsa-doc/alsa-lib/group___control.html#gaac6bb412e5a9fffb5509e98a10de45b5) wrapper.
-    pub fn tlv_readable(&self) -> bool {
-        // Safe because self.0.as_ptr() is a valid snd_ctl_elem_info_t*.
-        unsafe { snd_ctl_elem_info_is_tlv_readable(self.0.as_ptr()) as usize == 1 }
-    }
-
-    /// Safe [snd_ctl_elem_info_is_tlv_writable](https://www.alsa-project.org/alsa-doc/alsa-lib/group___control.html#gacfbaae80d710b6feac682f8ba10a0341) wrapper.
-    pub fn tlv_writable(&self) -> bool {
-        // Safe because self.0.as_ptr() is a valid snd_ctl_elem_info_t*.
-        unsafe { snd_ctl_elem_info_is_tlv_writable(self.0.as_ptr()) as usize == 1 }
-    }
-}
-
-/// [snd_ctl_t](https://www.alsa-project.org/alsa-doc/alsa-lib/group___control.html#ga06628f38def84a0fe3da74041db9d51f) wrapper.
-#[derive(Debug)]
-pub struct Ctl(ptr::NonNull<snd_ctl_t>, PhantomData<snd_ctl_t>);
-
-impl Drop for Ctl {
-    fn drop(&mut self) {
-        // Safe as we provide a valid snd_ctl_t*.
-        unsafe { snd_ctl_close(self.0.as_ptr()) };
-    }
-}
-
-impl Ctl {
-    /// Creates a `Ctl`.
-    /// Safe [snd_ctl_open](https://www.alsa-project.org/alsa-doc/alsa-lib/group___control.html#ga58537f5b74c9c1f51699f9908a0d7f56).
-    /// Does not support async mode.
-    ///
-    /// # Errors
-    ///
-    /// * If `card` is an invalid CString.
-    /// * If `snd_ctl_open()` fails.
-    pub fn new(card: &str) -> Result<Ctl> {
-        let name = CString::new(card)?;
-        let mut ctl_ptr = ptr::null_mut();
-        // Safe because we provide a valid ctl_ptr to be filled, name is a safe CString
-        // and we validate the return code before using ctl_ptr.
-        let rc = unsafe { snd_ctl_open(&mut ctl_ptr, name.as_ptr(), 0) };
-        if rc < 0 {
-            return Err(Error::CtlOpenFailed(
-                FFIError::Rc(rc),
-                name.to_str()?.to_owned(),
-            ));
-        }
-        let ctl = ptr::NonNull::new(ctl_ptr).ok_or(Error::CtlOpenFailed(
-            FFIError::NullPtr,
-            name.to_str()?.to_owned(),
-        ))?;
-        Ok(Ctl(ctl, PhantomData))
-    }
-
-    /// Borrows the mutable inner pointer
-    pub fn as_mut_ptr(&mut self) -> *mut snd_ctl_t {
-        self.0.as_ptr()
-    }
-}
-
-/// Safe [snd_strerror](https://www.alsa-project.org/alsa-doc/alsa-lib/group___error.html#ga182bbadf2349e11602bc531e8cf22f7e) wrapper.
-///
-/// # Errors
-///
-/// * If `snd_strerror` returns invalid UTF-8 data.
-pub fn snd_strerror(err_num: i32) -> Result<&'static str> {
-    // Safe because we validate the return pointer of snd_strerror()
-    // before using it.
-    let s_ptr = unsafe { alsa_sys::snd_strerror(err_num) };
-    if s_ptr.is_null() {
-        return Err(Error::SndStrErrorFailed(err_num));
-    }
-    // Safe because s_ptr is a non-null *const u8 and its lifetime is static.
-    let s = CStr::from_bytes_with_nul(unsafe {
-        slice::from_raw_parts(s_ptr as *const u8, strlen(s_ptr) + 1)
-    })?;
-    Ok(s.to_str()?)
-}
diff --git a/cros_alsa/src/control_tlv.rs b/cros_alsa/src/control_tlv.rs
deleted file mode 100644
index e1f3551..0000000
--- a/cros_alsa/src/control_tlv.rs
+++ /dev/null
@@ -1,313 +0,0 @@
-// Copyright 2020 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-//! `ControlTLV` supports read and write of the alsa TLV byte controls
-//!  Users can obtain a ControlTLV by Card::control_tlv_by_name().
-//! # Examples
-//! This is an example of how to use a `TLV`.
-//!
-//! ```
-//! use std::assert_eq;
-//! use std::convert::TryFrom;
-//! use std::error::Error;
-//!
-//! use cros_alsa::{TLV, ControlTLVError};
-//! use cros_alsa::elem::Elem;
-//!
-//! type Result<T> = std::result::Result<T, ControlTLVError>;
-//!
-//!     let mut tlv = TLV::new(0, vec![1,2,3,4]);
-//!     assert_eq!(4, tlv.len());
-//!     assert_eq!(0, tlv.tlv_type());
-//!     assert_eq!(2, tlv[1]);
-//!     tlv[1] = 8;
-//!     assert_eq!(vec![1,8,3,4], tlv.value().to_vec());
-//!     assert_eq!(vec![0,16,1,8,3,4], Into::<Vec<u32>>::into(tlv));
-//!
-//! ```
-
-use std::{
-    convert::TryFrom,
-    fmt,
-    ops::{Index, IndexMut},
-    slice::SliceIndex,
-};
-use std::{error, mem::size_of};
-
-use remain::sorted;
-
-use crate::control_primitive::{self, Ctl, ElemId, ElemInfo, ElemType};
-
-/// The Result type of cros-alsa::control.
-pub type Result<T> = std::result::Result<T, Error>;
-
-#[sorted]
-#[derive(Debug, PartialEq)]
-/// Possible errors that can occur in cros-alsa::control.
-pub enum Error {
-    /// Failed to call AlsaControlAPI.
-    AlsaControlAPI(control_primitive::Error),
-    /// Failed to convert buffer to TLV struct.
-    InvalidTLV,
-    /// ElemInfo::count() is not multiple of size_of::<u32>.
-    InvalidTLVSize(String, usize),
-    /// ElemInfo::elem_type() is not ElemType::Bytes.
-    InvalidTLVType(String, ElemType),
-    /// The control is not readable.
-    TLVNotReadable,
-    /// The control is not writeable.
-    TLVNotWritable,
-    /// Failed to call snd_ctl_elem_tlv_read.
-    TLVReadFailed(i32),
-    /// Failed to call snd_ctl_elem_tlv_write.
-    TVLWriteFailed(i32),
-}
-
-impl error::Error for Error {}
-
-impl From<control_primitive::Error> for Error {
-    fn from(err: control_primitive::Error) -> Error {
-        Error::AlsaControlAPI(err)
-    }
-}
-
-impl fmt::Display for Error {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        use Error::*;
-        match self {
-            AlsaControlAPI(e) => write!(f, "{}", e),
-            InvalidTLV => write!(f, "failed to convert to TLV"),
-            InvalidTLVSize(name, elem_size) => write!(
-                f,
-                "ElemInfo::size() of {} should be multiple of size_of::<u32>, get: {}",
-                name, elem_size
-            ),
-            InvalidTLVType(name, elem_type) => write!(
-                f,
-                "invalid ElemInfo::elem_type() of {}: expect: {}, get: {}",
-                name,
-                ElemType::Bytes,
-                elem_type
-            ),
-            TLVNotReadable => write!(f, "the control is not readable."),
-            TLVNotWritable => write!(f, "the control is not writable."),
-            TLVReadFailed(rc) => write!(f, "snd_ctl_elem_tlv_read failed: {}", rc),
-            TVLWriteFailed(rc) => write!(f, "snd_ctl_elem_tlv_write failed: {}", rc),
-        }
-    }
-}
-
-/// TLV struct represents the TLV data to be read from
-/// or write to an alsa TLV byte control.
-#[derive(Debug)]
-pub struct TLV {
-    /// data[Self::TYPE_OFFSET] contains the tlv type.
-    /// data[Self::LEN_OFFSET] contains the length of the value in bytes.
-    /// data[Self::VALUE_OFFSET..] contains the data.
-    data: Vec<u32>,
-}
-
-impl TLV {
-    const TYPE_OFFSET: usize = 0;
-    const LEN_OFFSET: usize = 1;
-    const VALUE_OFFSET: usize = 2;
-    const TLV_HEADER_SIZE_BYTES: usize = Self::VALUE_OFFSET * size_of::<u32>();
-
-    /// Initializes a `TLV` by giving the tlv type and tlv value.
-    pub fn new(tlv_type: u32, tlv_value: Vec<u32>) -> Self {
-        let mut data = vec![0; 2];
-        data[Self::TYPE_OFFSET] = tlv_type;
-        data[Self::LEN_OFFSET] = (tlv_value.len() * size_of::<u32>()) as u32;
-        data.extend(tlv_value.iter());
-        Self { data }
-    }
-
-    /// Returns the type of the tlv.
-    pub fn tlv_type(&self) -> u32 {
-        self.data[Self::TYPE_OFFSET]
-    }
-
-    /// Returns the length of the tlv value in dword.
-    pub fn len(&self) -> usize {
-        self.data[Self::LEN_OFFSET] as usize / size_of::<u32>()
-    }
-
-    /// Returns whether the tlv value is empty.
-    pub fn is_empty(&self) -> bool {
-        self.data[Self::LEN_OFFSET] == 0
-    }
-
-    /// Returns the tlv value in slice.
-    pub fn value(&self) -> &[u32] {
-        &self.data[Self::VALUE_OFFSET..]
-    }
-}
-
-impl<I: SliceIndex<[u32]>> Index<I> for TLV {
-    type Output = I::Output;
-    #[inline]
-    fn index(&self, index: I) -> &Self::Output {
-        &self.data[Self::VALUE_OFFSET..][index]
-    }
-}
-
-impl<I: SliceIndex<[u32]>> IndexMut<I> for TLV {
-    #[inline]
-    fn index_mut(&mut self, index: I) -> &mut Self::Output {
-        &mut self.data[Self::VALUE_OFFSET..][index]
-    }
-}
-
-impl TryFrom<Vec<u32>> for TLV {
-    type Error = Error;
-
-    /// Constructs a TLV from a vector with the following alsa tlv header validation:
-    ///  1 . tlv_buf[Self::LEN_OFFSET] should be multiple of size_of::<u32>
-    ///  2 . tlv_buf[Self::LEN_OFFSET] is the length of tlv value in byte and
-    ///      should be less than the buffer length * size_of::<u32>.
-    fn try_from(data: Vec<u32>) -> Result<Self> {
-        if data.len() < 2 {
-            return Err(Error::InvalidTLV);
-        }
-
-        if data[Self::LEN_OFFSET] % size_of::<u32>() as u32 != 0 {
-            return Err(Error::InvalidTLV);
-        }
-
-        if data[Self::LEN_OFFSET] / size_of::<u32>() as u32
-            > data[Self::VALUE_OFFSET..].len() as u32
-        {
-            return Err(Error::InvalidTLV);
-        }
-
-        Ok(Self { data })
-    }
-}
-
-impl Into<Vec<u32>> for TLV {
-    /// Returns the raw tlv data buffer (including the tlv header).
-    fn into(self) -> Vec<u32> {
-        self.data
-    }
-}
-
-/// `ControlTLV` supports read and write of the alsa TLV byte controls.
-pub struct ControlTLV<'a> {
-    handle: &'a mut Ctl,
-    id: ElemId,
-}
-
-impl<'a> ControlTLV<'a> {
-    /// Called by `Card` to create a `ControlTLV`.
-    pub fn new(handle: &'a mut Ctl, id: ElemId) -> Result<Self> {
-        let info = ElemInfo::new(handle, &id)?;
-        if info.count() % size_of::<u32>() != 0 {
-            return Err(Error::InvalidTLVSize(id.name()?.to_owned(), info.count()));
-        }
-        match info.elem_type()? {
-            ElemType::Bytes => Ok(Self { handle, id }),
-            _ => Err(Error::InvalidTLVType(
-                id.name()?.to_owned(),
-                info.elem_type()?,
-            )),
-        }
-    }
-
-    /// Reads data from the byte control by `snd_ctl_elem_tlv_read`
-    ///
-    /// #
-    /// # Errors
-    ///
-    /// * If it fails to read from the control.
-    pub fn load(&mut self) -> Result<TLV> {
-        if !ElemInfo::new(self.handle, &self.id)?.tlv_readable() {
-            return Err(Error::TLVNotReadable);
-        }
-
-        let tlv_size = ElemInfo::new(self.handle, &self.id)?.count() + TLV::TLV_HEADER_SIZE_BYTES;
-
-        let mut tlv_buf = vec![0; tlv_size / size_of::<u32>()];
-        // Safe because handle.as_mut_ptr() is a valid *mut snd_ctl_t, id_as_ptr is valid and
-        // tlv_buf.as_mut_ptr() is also valid.
-        let rc = unsafe {
-            alsa_sys::snd_ctl_elem_tlv_read(
-                self.handle.as_mut_ptr(),
-                self.id.as_ptr(),
-                tlv_buf.as_mut_ptr(),
-                tlv_size as u32,
-            )
-        };
-        if rc < 0 {
-            return Err(Error::TLVReadFailed(rc));
-        }
-        Ok(TLV::try_from(tlv_buf)?)
-    }
-
-    /// Writes to the byte control by `snd_ctl_elem_tlv_write`
-    ///
-    /// # Results
-    ///
-    /// * `changed` - false on success.
-    ///             - true on success when value was changed.
-    /// #
-    /// # Errors
-    ///
-    /// * If it fails to write to the control.
-    pub fn save(&mut self, tlv: TLV) -> Result<bool> {
-        if !ElemInfo::new(self.handle, &self.id)?.tlv_writable() {
-            return Err(Error::TLVNotReadable);
-        }
-        // Safe because handle.as_mut_ptr() is a valid *mut snd_ctl_t, id_as_ptr is valid and
-        // tlv.as_mut_ptr() is also valid.
-        let rc = unsafe {
-            alsa_sys::snd_ctl_elem_tlv_write(
-                self.handle.as_mut_ptr(),
-                self.id.as_ptr(),
-                Into::<Vec<u32>>::into(tlv).as_mut_ptr(),
-            )
-        };
-        if rc < 0 {
-            return Err(Error::TVLWriteFailed(rc));
-        }
-        Ok(rc > 0)
-    }
-}
-
-#[cfg(test)]
-mod tests {
-    use super::*;
-    #[test]
-    fn test_tlv_try_from_raw_vec() {
-        let tlv_buf = vec![0, 12, 2, 3, 4];
-        assert!(TLV::try_from(tlv_buf).is_ok());
-    }
-
-    #[test]
-    fn test_tlv_length_is_not_multiple_of_sizeof_int() {
-        // Invalid tlv length in data[Self::LEN_OFFSET].
-        let tlv_buf = vec![0, 1, 2, 3, 4];
-        assert_eq!(TLV::try_from(tlv_buf).unwrap_err(), Error::InvalidTLV);
-    }
-
-    #[test]
-    fn test_tlv_length_larger_than_buff_size() {
-        // Invalid tlv length in data[Self::LEN_OFFSET].
-        let tlv_buf = vec![0, 16, 2, 3, 4];
-        assert_eq!(TLV::try_from(tlv_buf).unwrap_err(), Error::InvalidTLV);
-    }
-
-    #[test]
-    fn test_tlv_length_less_than_two() {
-        // tlv buffer length < 2
-        let tlv_buf = vec![0];
-        assert_eq!(TLV::try_from(tlv_buf).unwrap_err(), Error::InvalidTLV);
-    }
-
-    #[test]
-    fn test_tlv_length_equal_two() {
-        // tlv buffer size = 2.
-        let tlv_buf = vec![0, 0];
-        assert!(TLV::try_from(tlv_buf).is_ok());
-    }
-}
diff --git a/cros_alsa/src/elem.rs b/cros_alsa/src/elem.rs
deleted file mode 100644
index 08fe8b6..0000000
--- a/cros_alsa/src/elem.rs
+++ /dev/null
@@ -1,204 +0,0 @@
-// Copyright 2020 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-//! This module provides different implementations of `Elem` that use the alsa-lib control interface
-//! API to read and write alsa control elements.
-//!
-//! The `Elem::type()` returns the type of value that a control element can interact with,
-//! and it is one of integer, integer64, boolean, enumerators, bytes or IEC958 structure.
-//! The `Elem::size()` returns the number of values it reads from or writes to the hardware
-//! at a time.
-//! The `Elem::load(..)` and `Elem::save(..)` are used by `ControlOps` trait to read and write
-//! the underlying mixer control.
-//!
-//! Users should use the provided implementations of `Elem` to define the associated type in
-//! their owner encapsulation of `Control`.
-
-use std::default::Default;
-use std::error;
-use std::fmt;
-
-use libc::{c_long, c_uint};
-use remain::sorted;
-
-use crate::control_primitive::{self, snd_strerror, Ctl, ElemId, ElemType, ElemValue};
-
-/// The Result type of cros-alsa::elem.
-pub type Result<T> = std::result::Result<T, Error>;
-
-#[sorted]
-#[derive(Debug)]
-/// Possible errors that can occur in cros-alsa::elem.
-pub enum Error {
-    /// Failed to call AlsaControlAPI.
-    AlsaControlAPI(control_primitive::Error),
-    /// Failed to call `snd_ctl_elem_read()`.
-    ElemReadFailed(i32),
-    /// Failed to call `snd_ctl_elem_write()`.
-    ElemWriteFailed(i32),
-}
-
-impl error::Error for Error {}
-
-impl From<control_primitive::Error> for Error {
-    fn from(err: control_primitive::Error) -> Error {
-        Error::AlsaControlAPI(err)
-    }
-}
-
-impl fmt::Display for Error {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        use Error::*;
-        match self {
-            AlsaControlAPI(e) => write!(f, "{}", e),
-            ElemReadFailed(e) => write!(f, "snd_ctl_elem_read failed: {}", snd_strerror(*e)?),
-            ElemWriteFailed(e) => write!(f, "snd_ctl_elem_write failed: {}", snd_strerror(*e)?),
-        }
-    }
-}
-
-// Uses a recursive macro to generate implementation for [bool; n] and [i32; n], n = 1 to 128.
-// The `$t:ident $($ts:ident)*` part matches and removes one token at a time. It's used for
-// counting recursive steps.
-macro_rules! impl_for_array {
-    {$n:expr, $type:ty, $t:ident $($ts:ident)*} => {
-        impl Elem for [$type; $n] {
-            type T = Self;
-            /// Reads [$type; $n] data from the mixer control.
-            ///
-            /// # Errors
-            ///
-            /// * If it fails to call `snd_ctl_elem_read()`.
-            fn load(handle: &mut Ctl, id: &ElemId) -> Result<Self::T>
-            {
-                let mut elem = ElemValue::new(id)?;
-                // Safe because self.handle.as_mut_ptr() is a valid *mut snd_ctl_t and
-                // elem.as_mut_ptr() is also a valid *mut snd_ctl_elem_value_t.
-                let rc = unsafe { alsa_sys::snd_ctl_elem_read(handle.as_mut_ptr(), elem.as_mut_ptr()) };
-                if rc < 0 {
-                    return Err(Error::ElemReadFailed(rc));
-                }
-                let mut ret = [Default::default(); $n];
-                for i in 0..$n {
-                    // Safe because elem.as_ptr() is a valid snd_ctl_elem_value_t* and i is guaranteed to be
-                    // within a valid range.
-                    ret[i] = unsafe { <$type>::elem_value_get(&elem, i) };
-                }
-                Ok(ret)
-            }
-
-            /// Updates [$type; $n] data to the mixer control.
-            ///
-            /// # Results
-            ///
-            /// * `changed` - false on success.
-            ///             - true on success when value was changed.
-            ///
-            /// # Errors
-            ///
-            /// * If it fails to call `snd_ctl_elem_write()`.
-            fn save(handle: &mut Ctl, id: &ElemId, val: Self::T) -> Result<bool> {
-                let mut elem = ElemValue::new(id)?;
-                for i in 0..$n {
-                    // Safe because elem.as_mut_ptr() is a valid snd_ctl_elem_value_t* and i is guaranteed to be
-                    // within a valid range.
-                    unsafe { <$type>::elem_value_set(&mut elem, i, val[i]) };
-                }
-                // Safe because self.handle.as_mut_ptr() is a valid *mut snd_ctl_t and
-                // elem.as_mut_ptr() is also a valid *mut snd_ctl_elem_value_t.
-                let rc = unsafe { alsa_sys::snd_ctl_elem_write(handle.as_mut_ptr(), elem.as_mut_ptr()) };
-                if rc < 0 {
-                    return Err(Error::ElemWriteFailed(rc));
-                }
-                Ok(rc > 0)
-            }
-
-            /// Gets the data type itself can read and write.
-            fn elem_type() -> ElemType {
-                <$type>::elem_type()
-            }
-
-            /// Gets the number of value entries itself can read and write.
-            fn size() -> usize {
-                $n
-            }
-        }
-        impl_for_array!{($n - 1), $type, $($ts)*}
-    };
-    {$n:expr, $type:ty,} => {};
-}
-
-// Implements `Elem` for [i32; n] where n = 1 to 128.
-impl_for_array! {128, i32,
-T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T
-T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T
-T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T
-T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T
-}
-
-// Implements `Elem` for [bool; n] where n = 1 to 128.
-impl_for_array! {128, bool,
-T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T
-T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T
-T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T
-T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T
-}
-
-impl CtlElemValue for bool {
-    type T = bool;
-    /// Gets a bool from the ElemValue.
-    unsafe fn elem_value_get(elem: &ElemValue, idx: usize) -> bool {
-        alsa_sys::snd_ctl_elem_value_get_boolean(elem.as_ptr(), idx as c_uint) != 0
-    }
-    /// Sets a bool to the ElemValue.
-    unsafe fn elem_value_set(elem: &mut ElemValue, idx: usize, val: bool) {
-        alsa_sys::snd_ctl_elem_value_set_boolean(elem.as_mut_ptr(), idx as c_uint, val as c_long);
-    }
-    /// Returns ElemType::Boolean.
-    fn elem_type() -> ElemType {
-        ElemType::Boolean
-    }
-}
-
-impl CtlElemValue for i32 {
-    type T = i32;
-    /// Gets an i32 from the ElemValue.
-    unsafe fn elem_value_get(elem: &ElemValue, idx: usize) -> i32 {
-        alsa_sys::snd_ctl_elem_value_get_integer(elem.as_ptr(), idx as c_uint) as i32
-    }
-    /// Sets an i32 to the ElemValue.
-    unsafe fn elem_value_set(elem: &mut ElemValue, idx: usize, val: i32) {
-        alsa_sys::snd_ctl_elem_value_set_integer(elem.as_mut_ptr(), idx as c_uint, val as c_long);
-    }
-    /// Returns ElemType::Integer.
-    fn elem_type() -> ElemType {
-        ElemType::Integer
-    }
-}
-
-/// All primitive types of a control element should implement `CtlElemValue` trait.
-trait CtlElemValue {
-    /// The primitive type of a control element.
-    type T;
-    /// Gets the value from the ElemValue.
-    unsafe fn elem_value_get(value: &ElemValue, idx: usize) -> Self::T;
-    /// Sets the value to the ElemValue.
-    unsafe fn elem_value_set(value: &mut ElemValue, id: usize, val: Self::T);
-    /// Gets the data type itself can read and write.
-    fn elem_type() -> ElemType;
-}
-
-/// Use `Elem` trait to access the underlying control element through the given `Ctl` and `ElemId`.
-pub trait Elem: Sized {
-    /// The data type of a control element.
-    type T;
-    /// Reads the value from the mixer control.
-    fn load(handle: &mut Ctl, id: &ElemId) -> Result<Self::T>;
-    /// Saves the value to the mixer control.
-    fn save(handle: &mut Ctl, id: &ElemId, val: Self::T) -> Result<bool>;
-    /// Gets the data type itself can read and write.
-    fn elem_type() -> ElemType;
-    /// Gets the number of value entries itself can read and write.
-    fn size() -> usize;
-}
diff --git a/cros_alsa/src/lib.rs b/cros_alsa/src/lib.rs
deleted file mode 100644
index 070d221..0000000
--- a/cros_alsa/src/lib.rs
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2020 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-//! `cros_alsa` crate currently supports interacting with alsa
-//! controls by using the control interface API of alsa-lib.
-//!
-//! # Examples
-//! This is an example of how to use the provided `Control` objects.
-//!
-//! ``` no_run
-//! use std::error::Error;
-//! use std::result::Result;
-//!
-//! use cros_alsa::{Card, SwitchControl, IntControl, StereoVolumeControl};
-//!
-//! fn main() -> Result<(), Box<dyn Error>> {
-//!
-//!   let mut card = Card::new("sofmax98390d")?;
-//!
-//!   // Uses a SwitchControl to turn on and off a mixer control that has a single boolean state.
-//!   let mut calib_ctrl:SwitchControl = card.control_by_name("Left DSM Calibration")?;
-//!   calib_ctrl.on()?;
-//!   assert_eq!(calib_ctrl.state()?, true);
-//!   calib_ctrl.off()?;
-//!
-//!   // Uses an IntControl to read and write a mixer control that has a single integer value.
-//!   let mut rdc_ctrl:IntControl = card.control_by_name("Left Rdc")?;
-//!   let _rdc = rdc_ctrl.get()?;
-//!   rdc_ctrl.set(13000)?;
-//!
-//!   // Uses a StereoVolumeControl to manipulate stereo volume related functionality.
-//!   let mut volume_ctrl:StereoVolumeControl = card.control_by_name("Master Playback Volume")?;
-//!   volume_ctrl.set_volume(184, 184)?;
-//!
-//!   Ok(())
-//! }
-//! ```
-
-// Allow the maximum recursive depth = 256 for macro expansion.
-#![recursion_limit = "256"]
-#![deny(missing_docs)]
-
-mod card;
-mod control;
-mod control_primitive;
-pub mod control_tlv;
-pub mod elem;
-
-pub use self::card::Card;
-pub use self::control::{Control, ControlOps, IntControl, StereoVolumeControl, SwitchControl};
-pub use self::control_primitive::{Ctl, ElemId};
-pub use self::control_tlv::{ControlTLV, TLV};
-
-pub use self::card::Error as CardError;
-pub use self::control::Error as ControlError;
-pub use self::control_tlv::Error as ControlTLVError;
-pub use self::elem::Error as ElemError;
-
-#[allow(unused_imports)]
-pub use cros_alsa_derive::*;
diff --git a/dbus-config/org.chromium.cras.conf b/dbus-config/org.chromium.cras.conf
deleted file mode 100644
index bd1ecc9..0000000
--- a/dbus-config/org.chromium.cras.conf
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE busconfig PUBLIC
- "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
- "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
-<busconfig>
-  <policy context="default">
-    <allow send_destination="org.chromium.cras" />
-  </policy>
-
-  <policy user="cras">
-    <allow own="org.chromium.cras" />
-  </policy>
-
-</busconfig>
diff --git a/defs/c.mk b/defs/c.mk
deleted file mode 100644
index 012d973..0000000
--- a/defs/c.mk
+++ /dev/null
@@ -1,117 +0,0 @@
-# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# This file contains definitions which control the C compiler.
-
-
-COPTIONS =					\
-	-g					\
-	-O2					\
-	-funit-at-a-time
-
-# Compiler is too old to support
-#
-#	-Wframe-larger-than=256
-#	-Wlarger-than=4096
-#	-Wsync-nand
-
-# Enable GC on unused functions and data
-CGC	=					\
-	-ffunction-sections			\
-	-fdata-sections
-
-PTHREAD	= 					\
-	-pthread
-
-LDGC	=					\
-	-Xlinker --gc-sections
-
-CWARN	=					\
-	-Waddress				\
-	-Waggregate-return			\
-	-Wall					\
-	-Warray-bounds				\
-	-Wbad-function-cast			\
-	-Wcast-align				\
-	-Wchar-subscripts			\
-	-Wclobbered				\
-	-Wcomment				\
-	-Wconversion				\
-	-Wdeclaration-after-statement		\
-	-Wdisabled-optimization			\
-	-Wempty-body				\
-	-Werror					\
-	-Wextra					\
-	-Wfloat-equal				\
-	-Wformat				\
-	-Wformat-nonliteral			\
-	-Wformat-security			\
-	-Wformat-y2k				\
-	-Wignored-qualifiers			\
-	-Wimplicit				\
-	-Winit-self				\
-	-Winline				\
-	-Wlogical-op				\
-	-Wmain					\
-	-Wmissing-braces			\
-	-Wmissing-declarations			\
-	-Wmissing-field-initializers		\
-	-Wmissing-format-attribute		\
-	-Wmissing-include-dirs			\
-	-Wmissing-noreturn			\
-	-Wmissing-parameter-type		\
-	-Wmissing-prototypes			\
-	-Wnested-externs			\
-	-Wold-style-declaration			\
-	-Wold-style-definition			\
-	-Woverlength-strings			\
-	-Woverride-init				\
-	-Wpacked				\
-	-Wparentheses				\
-	-Wpointer-arith				\
-	-Wpointer-sign				\
-	-Wredundant-decls			\
-	-Wreturn-type				\
-	-Wsequence-point			\
-	-Wshadow				\
-	-Wsign-compare				\
-	-Wsign-conversion			\
-	-Wstack-protector			\
-	-Wstrict-aliasing			\
-	-Wstrict-aliasing=3			\
-	-Wstrict-overflow			\
-	-Wstrict-overflow=5			\
-	-Wstrict-prototypes			\
-	-Wswitch				\
-	-Wswitch-default			\
-	-Wswitch-enum				\
-	-Wtrigraphs				\
-	-Wtype-limits				\
-	-Wundef					\
-	-Wuninitialized				\
-	-Wunknown-pragmas			\
-	-Wunsafe-loop-optimizations		\
-	-Wunused-function			\
-	-Wunused-label				\
-	-Wunused-parameter			\
-	-Wunused-value				\
-	-Wunused-variable			\
-	-Wvariadic-macros			\
-	-Wvla					\
-	-Wvolatile-register-var			\
-	-Wwrite-strings				\
-	-pedantic-errors
-
-INCLUDES	=				\
-		-I$(ADHD_DIR)/include		\
-		-I$(ADHD_SOURCE_DIR)		\
-		-I$(ADHD_DIR)/cras/src/common	\
-		-I$(ADHD_DIR)/cras/src/libcras
-
-CFLAGS		=				\
-	-std=gnu99				\
-	-MD 					\
-	$(INCLUDES)				\
-	$(PTHREADS)				\
-	$(CWARN) $(COPTIONS) $(CGC) $(LDGC)
diff --git a/defs/definitions.mk b/defs/definitions.mk
deleted file mode 100644
index d1085d4..0000000
--- a/defs/definitions.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-include $(ADHD_DIR)/defs/utilities.mk
-include $(ADHD_DIR)/defs/c.mk
-include $(ADHD_DIR)/defs/make.mk
diff --git a/defs/make.mk b/defs/make.mk
deleted file mode 100644
index c9d2d25..0000000
--- a/defs/make.mk
+++ /dev/null
@@ -1,70 +0,0 @@
-# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# This file contains definitions that are specific to the invocation
-# and usage of Gnu Make.
-
-ifndef VERBOSE
-# Be silent unless 'VERBOSE' is set on the make command line.
-SILENT	= --silent
-endif
-
-ifndef ADHD_BUILD_DIR
-export ADHD_BUILD_DIR	= $(ADHD_DIR)/build/$(BOARD)
-endif
-
-GAVD_ARCHIVE	= $(ADHD_BUILD_DIR)/lib/gavd.a
-
-LIBS		=							\
-		-L$(ADHD_DIR)/cras/src/.libs				\
-		$(GAVD_ARCHIVE)						\
-		$(foreach lib,$(MY_LIBS),-l$(lib))
-
-# mkdir: Creates a directory, and all its parents, if it does not exist.
-#
-mkdir	= [ ! -d $(1) ] &&			\
-	    $(MKDIR) --parents $(1) || true
-
-# remake: Gnu Make function which will create the build directory,
-#         then build the first argument by recursively invoking make.
-#         The recursive make is performed in the build directory.
-#
-#         $(call remake,<label>,<subdirectory>,<makefile>,<target>)
-#
-#         ex: @$(call remake,Building,gavd,Makefile,gavd)
-#                             $(1)    $(2) $(3)     $(4)
-#
-#  REL_DIR:
-#
-#    Directory relative from the root of the source tree.  REL_DIR is
-#    built up using the previous value plus the current target
-#    directory.
-#
-#  ADHD_SOURCE_DIR:
-#
-#    The directory containing the sources for the target directory
-#    being built.  This is used by Makefiles to access files in the
-#    source directory.  It has the same value as VPATH.
-#
-#  THIS_BUILD_DIR:
-#
-#    The build directory which is currently being built.  This is the
-#    same 'pwd', and the directory in which Make is building.
-#
-#  The build is performed in the build directory and VPATH is used to
-#  allow Make to find the source files in the source directory.
-#
-remake	=							\
-	+($(if $(REL_DIR),					\
-		export REL_DIR=$${REL_DIR}/$(2),		\
-		export REL_DIR=$(2)) &&				\
-	$(call mkdir,$(ADHD_BUILD_DIR)/$${REL_DIR}) &&		\
-	    $(MESSAGE) "$(1) $${REL_DIR}";			\
-	    $(MAKE) $(SILENT)					\
-		-f $(ADHD_DIR)/$${REL_DIR}/$(3)			\
-		-C $(ADHD_BUILD_DIR)/$${REL_DIR}		\
-		VPATH=$(ADHD_DIR)/$${REL_DIR}			\
-		ADHD_SOURCE_DIR=$(ADHD_DIR)/$${REL_DIR}		\
-		THIS_BUILD_DIR=$(ADHD_BUILD_DIR)/$${REL_DIR}	\
-		$(4))
diff --git a/defs/utilities.mk b/defs/utilities.mk
deleted file mode 100644
index 8bc4c04..0000000
--- a/defs/utilities.mk
+++ /dev/null
@@ -1,18 +0,0 @@
-# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# This file contains definitions of utilities which are used by the
-# build system.  No utility should be used directly by-name in the
-# makefiles; instead, each utility should have a definition here and
-# the macro value should be used.
-#
-# This makes it easy to ensure there are no host OS utility
-# dependencies when cross compiling.
-
-export MKDIR	= /bin/mkdir
-export AR	= /usr/bin/ar
-export ECHO	= /bin/echo
-export MESSAGE	= $(ECHO) "$(foreach v,$(shell seq $(MAKELEVEL))," ") [$(MAKELEVEL)] "
-export INSTALL	= /usr/bin/install
-export LINK	= /bin/ln
diff --git a/init/cras-directories.conf b/init/cras-directories.conf
deleted file mode 100644
index 4a79a18..0000000
--- a/init/cras-directories.conf
+++ /dev/null
@@ -1 +0,0 @@
-d /run/cras 1770 cras cras -
diff --git a/init/cras.conf b/init/cras.conf
deleted file mode 100644
index 2084749..0000000
--- a/init/cras.conf
+++ /dev/null
@@ -1,42 +0,0 @@
-# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# Installed by ADHD package.
-# cras upstart job.
-
-description     "Chrome OS audio server"
-author          "chromium-os-dev@chromium.org"
-
-env CRAS_SOCKET_DIR=/run/cras
-env CRAS_VMS_SOCKET_DIR=/run/cras/vms
-env CRAS_PLUGIN_DIR=/run/cras/vms/plugin
-env CRAS_ARGS=
-
-start on starting system-services
-stop on stopping system-services
-respawn
-
-# Allow the audio server real time priority.
-limit rtprio 12 12
-
-pre-start script
-  mkdir -p -m 1770 "${CRAS_SOCKET_DIR}"
-  chown -R cras:cras "${CRAS_SOCKET_DIR}"
-  mkdir -p -m 1770 "${CRAS_VMS_SOCKET_DIR}"
-  chown -R cras:cras "${CRAS_VMS_SOCKET_DIR}"
-  for socket_dir in playback unified; do
-    mkdir -p -m 1770 "${CRAS_PLUGIN_DIR}/${socket_dir}"
-    chown -R cras:cras "${CRAS_PLUGIN_DIR}/${socket_dir}"
-  done
-  mkdir -m 0755 -p /var/lib/cras
-  chown -R cras:cras /var/lib/cras
-end script
-
-exec /bin/sh /usr/share/cros/init/cras.sh
-
-# sound_card_init uses CRAS stop timestamp as a criterion to skip boot time
-# calibration for DSM.
-post-stop script
-  echo "$(date +---%\nsecs:\ %s%\nnanos:\ %N)" > /var/lib/cras/stop
-end script
diff --git a/init/cras.service b/init/cras.service
deleted file mode 100644
index bda61c1..0000000
--- a/init/cras.service
+++ /dev/null
@@ -1,14 +0,0 @@
-# Copyright 2016 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-[Unit]
-Description=ChromeOS audio server
-PartOf=system-services.target
-After=system-services.target
-
-[Service]
-Restart=on-failure
-LimitRTPRIO=12
-TimeoutStopSec=20
-ExecStart=/bin/sh /usr/share/cros/init/cras.sh
diff --git a/init/cras.sh b/init/cras.sh
deleted file mode 100644
index 91114c0..0000000
--- a/init/cras.sh
+++ /dev/null
@@ -1,64 +0,0 @@
-# Copyright 2016 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# Unified build config.
-device_config_dir="$(cros_config /audio/main cras-config-dir)"
-internal_ucm_suffix="$(cros_config /audio/main ucm-suffix)"
-
-# Deprecate HSP since it's just too old.
-# TODO(hychao): Clean up all CRAS codes that are related to HSP once we're
-# sure no headset breaks because of that.
-DISABLE_PROFILE="--disable_profile=hsp"
-
-# Handle legacy config.
-if [ -z "${device_config_dir}" ]; then
-  # Disable HSP/HFP on Google WiFi (Gale) with UART-HCI Bluetooth
-  # which is incapable of handling SCO audio.
-  platform_name="$(mosys platform name)"
-  if [ "$platform_name" = "Gale" ]; then
-      DISABLE_PROFILE="--disable_profile=hfp,hsp"
-  fi
-  # For boards that need a different device config, check which config
-  # directory to use. Use that directory for both volume curves
-  # and DSP config.
-  if [ -f /etc/cras/get_device_config_dir ]; then
-    device_config_dir="$(sh /etc/cras/get_device_config_dir)"
-  fi
-  if [ -f /etc/cras/get_internal_ucm_suffix ]; then
-    internal_ucm_suffix="$(sh /etc/cras/get_internal_ucm_suffix)"
-  fi
-else
-  device_config_dir="/etc/cras/${device_config_dir}"
-fi
-
-if [ -n "${device_config_dir}" ]; then
-  DEVICE_CONFIG_DIR="--device_config_dir=${device_config_dir}"
-  DSP_CONFIG="--dsp_config=${device_config_dir}/dsp.ini"
-fi
-if [ -n "${internal_ucm_suffix}" ]; then
-  INTERNAL_UCM_SUFFIX="--internal_ucm_suffix=${internal_ucm_suffix}"
-fi
-
-# Leave cras in the init pid namespace as it uses its PID as an IPC identifier.
-exec minijail0 -u cras -g cras -G --uts -v -l \
-        -T static \
-        -P /mnt/empty \
-        -b /,/ \
-        -k 'tmpfs,/run,tmpfs,MS_NODEV|MS_NOEXEC|MS_NOSUID,mode=755,size=10M' \
-        -b /run/cras,/run/cras,1 \
-        -b /run/dbus,/run/dbus,1 \
-        -b /run/udev,/run/udev \
-        -b /dev,/dev \
-        -b /dev/shm,/dev/shm,1 \
-        -k proc,/proc,proc \
-        -b /sys,/sys \
-        -k 'tmpfs,/var,tmpfs,MS_NODEV|MS_NOEXEC|MS_NOSUID,mode=755,size=10M' \
-        -b /var/lib/metrics/,/var/lib/metrics/,1 \
-        -- \
-        /sbin/minijail0 -n \
-        -S /usr/share/policy/cras-seccomp.policy \
-        -- \
-        /usr/bin/cras \
-        ${DSP_CONFIG} ${DEVICE_CONFIG_DIR} ${DISABLE_PROFILE} \
-        ${INTERNAL_UCM_SUFFIX} ${CRAS_ARGS}
diff --git a/scripts/asoc_dapm_graph b/scripts/asoc_dapm_graph
deleted file mode 100755
index fd43736..0000000
--- a/scripts/asoc_dapm_graph
+++ /dev/null
@@ -1,95 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2014 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Dump DAPM widgets status as a 'dot' graph file.
-
-To generate widget status for a device run
-  ssh $REMOTE asoc_dapm_graph > dot.txt && dot -Kfdp -Tpng dot.txt -o widgets.png
-"""
-
-from __future__ import print_function
-import os
-import platform
-import re
-import sys
-import time
-
-ROOTDIR = '/sys/kernel/debug/asoc/'
-# Some widget names are widely used by many codecs, adding them to the graph
-# creates a mess.
-IGNORE_WIDGETS = ('Playback', 'Capture', 'bias_level')
-
-
-def handle_widgets(path):
-  """Reads DAPM widget information from sysfs and generates dot graph entry.
-
-  Args:
-    path: path for sysfs file that exports information about DAPM widget.
-  """
-  for w in os.listdir(path):
-    if w in IGNORE_WIDGETS:
-      continue
-
-    with open(os.path.join(path, w)) as f:
-      lines = f.readlines()
-
-    active = lines[0].startswith(w + ': On ')
-    color = 'green' if active else 'red'
-    print('\t"%s" [color = %s]' % (w, color))
-
-    for l in lines[1:]:
-      l = l.rstrip()
-      # The string format is (in/out) "switch" "widget".
-      edge = list(filter(None, re.split(r' (in|out)  "(.+)" "(.+)"', l)))
-
-      if len(edge) != 3:
-        continue
-
-      direction = edge[0]
-      source = edge[2]
-
-      if source in IGNORE_WIDGETS:
-        continue
-
-      # We need to output the edge only once (e.g. inbound).
-      if direction != 'in':
-        continue
-
-      print('\t"%s" -> "%s"' % (source, w))
-
-
-def handle_card(path):
-  """Generates dot graph file for the given card.
-
-  Args:
-    path: path to sysfs directory that exports DAPM information for a sound card.
-  """
-  host = platform.uname()[1]
-  print('// Generated %s at %s.' % (time.strftime("%c"), host))
-  print('// To visualize the graph run "dot -Kfdp -Tpng $SCRIPT_OUTPUT_FILE -o widgets.png".')
-  print('digraph G {')
-  print('\tbgcolor = grey')
-  for root, dirs, files in os.walk(path):
-    if 'dapm' in dirs:
-      handle_widgets(os.path.join(root, 'dapm'))
-      dirs.remove('dapm')
-  print('}')
-
-
-def main(argv):
-  for c in os.listdir(ROOTDIR):
-    path = os.path.join(ROOTDIR, c)
-    # We assume that directories in ROOTDIR are cards.
-    if os.path.isdir(path):
-      handle_card(path)
-      sys.exit(0)
-
-  print('No cards found', file=sys.stderr)
-  sys.exit(1)
-
-
-if __name__ == '__main__':
-  main(sys.argv[1:])
-
diff --git a/scripts/audio_diagnostics b/scripts/audio_diagnostics
deleted file mode 100755
index b754c07..0000000
--- a/scripts/audio_diagnostics
+++ /dev/null
@@ -1,129 +0,0 @@
-#!/bin/sh
-#
-# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-#
-# Collect information about the audio system from top to bottom.
-
-dump_cards() {
-    # shellcheck disable=SC2068
-    for card in ${@}
-    do
-        echo "=== amixer -c ${card} scontents ==="
-        amixer -c "${card}" scontents
-        echo "=== amixer -c ${card} contents ==="
-        amixer -c "${card}" contents
-    done
-}
-
-# Helper function: in_the_list $1 $2
-# Returns 0 if str $1 is included in delimited str $2; otherwise 1
-in_the_list() {
-    for item in $2
-    do
-        if [ "$1" = "${item}" ]; then
-            return 0
-        fi
-    done
-    return 1
-}
-
-echo '=== cras_test_client --dump_server_info ==='
-cras_test_client --dump_server_info
-
-echo '=== cras_test_client --dump_audio_thread ==='
-cras_test_client --dump_audio_thread
-
-echo '=== cras_test_client --dump_main ==='
-cras_test_client --dump_main
-
-echo '=== cras_test_client --dump_bt ==='
-cras_test_client --dump_bt
-
-echo '=== cras_test_client --dump_events ==='
-cras_test_client --dump_events
-
-echo '=== aplay -l ==='
-aplay -l
-echo '=== arecord -l ==='
-arecord -l
-
-output_cards=$(
-    aplay -l | grep -E ^card | sed 's/card \([0-9]\+\).*/\1/' | sort -u)
-dump_cards "${output_cards}"
-
-input_cards=$(
-    arecord -l | grep -E ^card | sed 's/card \([0-9]\+\).*/\1/' | sort -u)
-dump_cards "${input_cards}"
-
-# HDA codec for codecs on x86.
-codecs=$(find /proc/asound -mindepth 2 -maxdepth 2 -path '*card*/codec#*')
-for codec in ${codecs}
-do
-    echo "=== codec: ${codec} ==="
-    cat "${codec}"
-done
-
-# I2C dump for codecs on arm.
-# Find lines like "max98088.7-0010" and extract "7 0x0010" from it.
-if [ -e /sys/kernel/debug/asoc/codecs ]; then
-    sed_expr='s/^\([^.-]\+\)\.\([0-9]\+\)-\([0-9]\+\)$/\2 0x\3/p'
-    sed -n "${sed_expr}" /sys/kernel/debug/asoc/codecs |
-    while read -r i2c_addr
-    do
-        echo "=== i2cdump -f -y ${i2c_addr} ==="
-        i2cdump -f -y "${i2c_addr}"
-    done
-fi
-
-# Dump registers from regmaps
-
-# List of audio components
-# For kernel>=4.14, it is in /sys/kernel/debug/asoc/components
-# For kernel<4.14, it is in /sys/kernel/debug/asoc/codecs
-if [ -f /sys/kernel/debug/asoc/components ]; then
-    audio_comps=$(cat /sys/kernel/debug/asoc/components)
-else
-    audio_comps=$(cat /sys/kernel/debug/asoc/codecs)
-fi
-
-# Blocklist regmap name of dumping registers (tracked by b/154177454)
-# Use the blank space as delimiter, e.g. 'name_a name_b name_c'
-name_blocklist='snd_hda_codec_hdmi'
-
-for file_path in /sys/kernel/debug/regmap/*
-do
-    [ -e "${file_path}" ] || break  # handle the case of no files
-    component=$(basename "${file_path}")
-
-    # Skip dumping registers if component is not listed in audio_comps
-    if ! in_the_list "${component}" "${audio_comps}"; then
-        continue
-    fi
-
-    if [ ! -f "${file_path}/name" ]; then
-        echo "Failed at dump registers: ${file_path}"
-        continue
-    fi
-
-    name=$(cat "${file_path}/name")
-    echo "=== dump registers component: ${component} name: ${name} ==="
-
-    # Skip dumping registers if regmap's name is in name_blocklist
-    if in_the_list "${name}" "${name_blocklist}"; then
-        echo 'skipped dumping due to b/154177454'
-        continue
-    fi
-
-    # Store back the original value
-    # Note: $(cat cache_bypass) returns 'Y' if flag is on; otherwise 'N'
-    cache_bypass=$(cat "${file_path}/cache_bypass")
-    if [ "${cache_bypass}" = "N" ]; then
-        echo 1 > "${file_path}/cache_bypass"
-    fi
-    cat "${file_path}/registers"
-    if [ "${cache_bypass}" = "N" ]; then
-        echo 0 > "${file_path}/cache_bypass"
-    fi
-done
diff --git a/scripts/audio_thread_log_viewer/README.md b/scripts/audio_thread_log_viewer/README.md
deleted file mode 100644
index 7b2612d..0000000
--- a/scripts/audio_thread_log_viewer/README.md
+++ /dev/null
@@ -1,45 +0,0 @@
-# Audio thread log viewer
-It is a tool to draw a time chart from audio thread log. It can make debug
-easier.
-
-[TOC]
-
-## Prepare an audio thread log
-The easiest way to get audio thread log is typing `cras_test_client --dump_a`
-in ChromeOS shell.
-
-The format should be like
-```
-Audio Thread Event Log:
-start at 4434i
-2019-07-02T15:30:46.539479158 cras atlog  SET_DEV_WAKE                   dev:7 hw_level:216 sleep:168
-2019-07-02T15:30:46.539482658 cras atlog  DEV_SLEEP_TIME                 dev:7 wake: 15:30:46.542974324
-2019-07-02T15:30:46.539492991 cras atlog  DEV_SLEEP_TIME                 dev:8 wake: 15:30:46.539358095
-2019-07-02T15:30:46.539501241 cras atlog  SLEEP                          sleep:000000000.000000000 longest_wake:001553999
-...
-```
-
-## Generate an HTML file
-```
-usage: viewer_c3.py [-h] [-o OUTPUT] [-d] FILE
-
-Draw time chart from audio thread log
-
-positional arguments:
-  FILE        The audio thread log file
-
-optional arguments:
-  -h, --help  show this help message and exit
-  -o OUTPUT   The output HTML file (default: view.html)
-  -d          Show debug message (default: False)
-```
-
-## View the result
-Open the output from vierwe_c3.py by Chrome. There are several functions in
-this site:
-+ The blue points show the hardware level change of the audio thread logs.
-  Click a point can jump to a corresponding line in the log area.
-+ There are some options can be selected. It can show the event in the chart
-  so that users can easily see when a stream is added, when a stream is fetched
-  , and so on.
-+ The textarea in the lower right corner can be used to note.
diff --git a/scripts/audio_thread_log_viewer/example.html b/scripts/audio_thread_log_viewer/example.html
deleted file mode 100644
index 2fd7c9c..0000000
--- a/scripts/audio_thread_log_viewer/example.html
+++ /dev/null
@@ -1,783 +0,0 @@
-
-<html meta charset="UTF8">
-<head>
-  <!-- Load c3.css -->
-  <link href="https://rawgit.com/masayuki0812/c3/master/c3.css" rel="stylesheet" type="text/css">
-  <!-- Load d3.js and c3.js -->
-  <script src="https://d3js.org/d3.v4.min.js" charset="utf-8"></script>
-  <script src="https://rawgit.com/masayuki0812/c3/master/c3.js" charset="utf-8"></script>
-  <style type="text/css">
-    .c3-grid text {
-        fill: grey;
-    }
-    .event_log_box {
-      font-family: 'Courier New', Courier, 'Lucida Sans Typewriter', 'Lucida Typewriter', monospace;
-      font-size: 20px;
-      font-style: normal;
-      font-variant: normal;
-      font-weight: 300;
-      line-height: 26.4px;
-      white-space: pre;
-      height:50%;
-      width:48%;
-      border:1px solid #ccc;
-      overflow:auto;
-    }
-    .checkbox {
-      font-size: 30px;
-      border: 2px;
-    }
-    .device {
-      font-size: 15px;
-    }
-    .stream{
-      font-size: 15px;
-    }
-    .fetch{
-    }
-    .wake{
-    }
-  </style>
-  <script type="text/javascript">
-    var selected = null;
-    draw_chart = function() {
-      var chart = c3.generate({
-        data: {
-          x: 'time',
-          columns: [
-            ['time',                   38274.654909156, 38274.657371167, 38274.657668959, 38274.676688159, 38274.676725281, 38274.676926906, 38274.677252890, 38274.697879928, 38274.697916480, 38274.698114806, 38274.698417024, 38274.719199290, 38274.719236981, 38274.719359698, 38274.719663005, 38274.740686503, 38274.740723661, 38274.740850997, 38274.741173582, 38274.762025805, 38274.762062690, 38274.762153748, 38274.762452548, 38274.783326364, 38274.783362532, 38274.783489920, 38274.783790725, 38274.804671376, 38274.804708721, 38274.804838233, 38274.805159078, 38274.826024162, 38274.826062337, 38274.826152748, 38274.826451927, 38274.847346397, 38274.847382560, 38274.847510294, 38274.847815798, 38274.868739650, 38274.868776554, 38274.868889760, 38274.869207769, 38274.890021859, 38274.890059702, 38274.890149892, 38274.890446925, 38274.911642356, 38274.911677780, 38274.911875825, 38274.912200713, 38274.932637511, 38274.932673739, 38274.932804355, 38274.933129716, 38274.954030314, 38274.954067674, 38274.954159335, 38274.954466654, 38274.975643692, 38274.975680354, 38274.975807387, 38274.976120622, 38274.996667671, 38274.996704048, 38274.996833804, 38274.997146185, 38275.017877797, 38275.017914904, 38275.018030670, 38275.018320047, 38275.039145228, 38275.039181369, 38275.039303282, 38275.039595139, 38275.060732607, 38275.060769291, 38275.060896906, 38275.061209809, 38275.082027553, 38275.082064736, 38275.082153665, 38275.082440331, 38275.103326735, 38275.103362951, 38275.103561185, 38275.103915541, 38275.124657946, 38275.124694671, 38275.124818548, 38275.125130858, 38275.146029029, 38275.146065845, 38275.146157000, 38275.146444659, 38275.167643000, 38275.167679011, 38275.167806856, 38275.168119122, 38275.188729928, 38275.188766573, 38275.188894276, 38275.189205852, 38275.210020752, 38275.210058744, 38275.210148466, 38275.210434597],
-            ['buffer_level',           null, 928, 1952, 1040, 1040, 1040, 2016, 1056, 1056, 1008, 2032, 1024, 1024, 1024, 2048, 1040, 1040, 1040, 2016, 1008, 1008, 1008, 2032, 1024, 1024, 1024, 2048, 1040, 1040, 1040, 2016, 1008, 1008, 1008, 2032, 1024, 1024, 1024, 2048, 1040, 1040, 1040, 2016, 1008, 1008, 1008, 2032, 1024, 1024, 1024, 2000, 1040, 1040, 1040, 2016, 1008, 1008, 1008, 2032, 1024, 1024, 1024, 2000, 1040, 1040, 1040, 2016, 1056, 1056, 1008, 2032, 1024, 1024, 1024, 2048, 1040, 1040, 1040, 2016, 1008, 1008, 1008, 2032, 1024, 1024, 1024, 2048, 1040, 1040, 1040, 2016, 1008, 1008, 1008, 2032, 1024, 1024, 1024, 2000, 1040, 1040, 1040, 2016, 1008, 1008, 1008, 2032],
-          ],
-          type: 'bar',
-          types: {
-            buffer_level: 'line',
-          },
-          onclick: function (d, i) {
-            elm = document.getElementById(d.x.toFixed(9));
-            if (selected)
-              selected.style.color = '';
-            if (elm === null) {
-              console.error("Can not find element by ID %s", d.x.toFixed(9));
-              return;
-            }
-            elm.style.color = 'blue';
-            elm.scrollIntoView();
-            selected = elm;
-          },
-        },
-        zoom: {
-          enabled: true,
-        },
-
-        grid: {
-          x: {
-            lines: [
-              {value: 38274.654888011, text: "num_fds 1", position: "middle", class: "wake"}, {value: 38274.654909156, text: "Added Device 6", position: "start", class: "device"}, {value: 38274.654958862, text: "num_fds 1", position: "middle", class: "wake"}, {value: 38274.655022911, text: "Add stream 1d0000", position: "middle", class: "stream"}, {value: 38274.655046329, text: "Fetch 1d0000", position: "end", class: "fetch"}, {value: 38274.656503188, text: "num_fds 1", position: "middle", class: "wake"}, {value: 38274.676639948, text: "Fetch 1d0000", position: "end", class: "fetch"}, {value: 38274.676860551, text: "num_fds 1", position: "middle", class: "wake"}, {value: 38274.697833022, text: "Fetch 1d0000", position: "end", class: "fetch"}, {value: 38274.698048577, text: "num_fds 1", position: "middle", class: "wake"}, {value: 38274.719153430, text: "Fetch 1d0000", position: "end", class: "fetch"}, {value: 38274.719301220, text: "num_fds 1", position: "middle", class: "wake"}, {value: 38274.740639477, text: "Fetch 1d0000", position: "end", class: "fetch"}, {value: 38274.740793102, text: "num_fds 1", position: "middle", class: "wake"}, {value: 38274.761962963, text: "Fetch 1d0000", position: "end", class: "fetch"}, {value: 38274.762102057, text: "num_fds 1", position: "middle", class: "wake"}, {value: 38274.783277641, text: "Fetch 1d0000", position: "end", class: "fetch"}, {value: 38274.783432165, text: "num_fds 1", position: "middle", class: "wake"}, {value: 38274.804623390, text: "Fetch 1d0000", position: "end", class: "fetch"}, {value: 38274.804780617, text: "num_fds 1", position: "middle", class: "wake"}, {value: 38274.825958417, text: "Fetch 1d0000", position: "end", class: "fetch"}, {value: 38274.826100424, text: "num_fds 1", position: "middle", class: "wake"}, {value: 38274.847298285, text: "Fetch 1d0000", position: "end", class: "fetch"}, {value: 38274.847453266, text: "num_fds 1", position: "middle", class: "wake"}, {value: 38274.868691938, text: "Fetch 1d0000", position: "end", class: "fetch"}, {value: 38274.868834120, text: "num_fds 1", position: "middle", class: "wake"}, {value: 38274.889955591, text: "Fetch 1d0000", position: "end", class: "fetch"}, {value: 38274.890097300, text: "num_fds 1", position: "middle", class: "wake"}, {value: 38274.911593780, text: "Fetch 1d0000", position: "end", class: "fetch"}, {value: 38274.911810046, text: "num_fds 1", position: "middle", class: "wake"}, {value: 38274.932589800, text: "Fetch 1d0000", position: "end", class: "fetch"}, {value: 38274.932746675, text: "num_fds 1", position: "middle", class: "wake"}, {value: 38274.953964062, text: "Fetch 1d0000", position: "end", class: "fetch"}, {value: 38274.954106963, text: "num_fds 1", position: "middle", class: "wake"}, {value: 38274.975595442, text: "Fetch 1d0000", position: "end", class: "fetch"}, {value: 38274.975750291, text: "num_fds 1", position: "middle", class: "wake"}, {value: 38274.996619059, text: "Fetch 1d0000", position: "end", class: "fetch"}, {value: 38274.996775539, text: "num_fds 1", position: "middle", class: "wake"}, {value: 38275.017830417, text: "Fetch 1d0000", position: "end", class: "fetch"}, {value: 38275.017961913, text: "num_fds 1", position: "middle", class: "wake"}, {value: 38275.039099808, text: "Fetch 1d0000", position: "end", class: "fetch"}, {value: 38275.039242696, text: "num_fds 1", position: "middle", class: "wake"}, {value: 38275.060684606, text: "Fetch 1d0000", position: "end", class: "fetch"}, {value: 38275.060839575, text: "num_fds 1", position: "middle", class: "wake"}, {value: 38275.081962397, text: "Fetch 1d0000", position: "end", class: "fetch"}, {value: 38275.082101703, text: "num_fds 1", position: "middle", class: "wake"}, {value: 38275.103278902, text: "Fetch 1d0000", position: "end", class: "fetch"}, {value: 38275.103495004, text: "num_fds 1", position: "middle", class: "wake"}, {value: 38275.124610042, text: "Fetch 1d0000", position: "end", class: "fetch"}, {value: 38275.124760504, text: "num_fds 1", position: "middle", class: "wake"}, {value: 38275.145964152, text: "Fetch 1d0000", position: "end", class: "fetch"}, {value: 38275.146104176, text: "num_fds 1", position: "middle", class: "wake"}, {value: 38275.167594886, text: "Fetch 1d0000", position: "end", class: "fetch"}, {value: 38275.167749677, text: "num_fds 1", position: "middle", class: "wake"}, {value: 38275.188682360, text: "Fetch 1d0000", position: "end", class: "fetch"}, {value: 38275.188837092, text: "num_fds 1", position: "middle", class: "wake"}, {value: 38275.209955429, text: "Fetch 1d0000", position: "end", class: "fetch"}, {value: 38275.210096165, text: "num_fds 1", position: "middle", class: "wake"}, {value: 38275.222778298, text: "num_fds 1", position: "middle", class: "wake"}, {value: 38275.222796197, text: "Remove stream 1d0000", position: "middle", class: "stream"},
-            ],
-          },
-        },
-
-        axis: {
-          y: {min: 0, max: 2048},
-        },
-      });
-    };
-
-    logs = `Audio Debug Stats:
--------------devices------------
-Output dev: kbl_r5514_5663_max: :0,0
-buffer_size: 16384
-min_buffer_level: 0
-min_cb_level: 8192
-max_cb_level: 0
-frame_rate: 48000
-num_channels: 2
-est_rate_ratio: 1.000000
-num_underruns: 0
-num_severe_underruns: 0
-highest_hw_level: 2048
-runtime: 2.148581272
-software_gain_scaler: 0.000000
-
--------------stream_dump------------
-Audio Thread Event Log:
-start at 2874
-<label id="38204.803651654">2019-08-19T10:36:44.803651654 cras atlog  SLEEP                          sleep:000000000.000000000 longest_wake:001565104</label>
-<label id="38274.654888011">2019-08-19T10:37:54.654888011 cras atlog  WAKE                           num_fds:1</label>
-<label id="38274.654901579">2019-08-19T10:37:54.654901579 cras atlog  PB_MSG                         msg_id:0</label>
-<label id="38274.654906341">2019-08-19T10:37:54.654906341 cras atlog  FILL_ODEV_ZEROS                dev:6 write:0</label>
-<label id="38274.654909156">2019-08-19T10:37:54.654909156 cras atlog  DEV_ADDED                      dev:6</label>
-<label id="38274.654950513">2019-08-19T10:37:54.654950513 cras atlog  SLEEP                          sleep:000000000.000000000 longest_wake:001565104</label>
-<label id="38274.654958862">2019-08-19T10:37:54.654958862 cras atlog  WAKE                           num_fds:1</label>
-<label id="38274.654966799">2019-08-19T10:37:54.654966799 cras atlog  PB_MSG                         msg_id:3</label>
-<label id="38274.654969277">2019-08-19T10:37:54.654969277 cras atlog  WRITE_STREAMS_WAIT             stream:1d0000</label>
-<label id="38274.655022911">2019-08-19T10:37:54.655022911 cras atlog  STREAM_ADDED                   id:1d0000 dev:6</label>
-<label id="38274.655046329">2019-08-19T10:37:54.655046329 cras atlog  WRITE_STREAMS_FETCH_STREAM     id:1d0000 cbth:1024 delay:288</label>
-<label id="38274.655069609">2019-08-19T10:37:54.655069609 cras atlog  SLEEP                          sleep:000000000.000000000 longest_wake:001565104</label>
-<label id="38274.656503188">2019-08-19T10:37:54.656503188 cras atlog  WAKE                           num_fds:1</label>
-<label id="38274.656538337">2019-08-19T10:37:54.656538337 cras atlog  FILL_ODEV_ZEROS                dev:6 write:1024</label>
-<label id="38274.656869440">2019-08-19T10:37:54.656869440 cras atlog  ODEV_START                     dev:6 min_cb_level:1024</label>
-<label id="38274.657368663">2019-08-19T10:37:54.657368663 cras atlog  FILL_AUDIO_TSTAMP              dev:6 tstamp: 10:37:54.657365837</label>
-<label id="38274.657371167">2019-08-19T10:37:54.657371167 cras atlog  FILL_AUDIO                     dev:6 hw_level:928</label>
-<label id="38274.657376118">2019-08-19T10:37:54.657376118 cras atlog  WRITE_STREAMS_STREAM           id:1d0000 shm_frames:1024 cb_pending:0</label>
-<label id="38274.657385868">2019-08-19T10:37:54.657385868 cras atlog  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0</label>
-<label id="38274.657395667">2019-08-19T10:37:54.657395667 cras atlog  DEV_STREAM_MIX                 written:1024 read:1024</label>
-<label id="38274.657398033">2019-08-19T10:37:54.657398033 cras atlog  WRITE_STREAMS_MIXED            write_limit:1024</label>
-<label id="38274.657646876">2019-08-19T10:37:54.657646876 cras atlog  FILL_AUDIO_DONE                hw_level:928 total_written:1024 min_cb_level:1024</label>
-<label id="38274.657668959">2019-08-19T10:37:54.657668959 cras atlog  SET_DEV_WAKE                   dev:6 hw_level:1952 sleep:1904</label>
-<label id="38274.657671042">2019-08-19T10:37:54.657671042 cras atlog  DEV_SLEEP_TIME                 dev:6 wake: 10:37:54.697332693</label>
-<label id="38274.657676157">2019-08-19T10:37:54.657676157 cras atlog  STREAM_SLEEP_TIME              id:1d0000 wake: 10:37:54.676321391</label>
-<label id="38274.657680973">2019-08-19T10:37:54.657680973 cras atlog  SLEEP                          sleep:000000000.018647412 longest_wake:001565104</label>
-<label id="38274.676595788">2019-08-19T10:37:54.676595788 cras atlog  WAKE                           num_fds:0</label>
-<label id="38274.676639948">2019-08-19T10:37:54.676639948 cras atlog  WRITE_STREAMS_FETCH_STREAM     id:1d0000 cbth:1024 delay:1328</label>
-<label id="38274.676685281">2019-08-19T10:37:54.676685281 cras atlog  FILL_AUDIO_TSTAMP              dev:6 tstamp: 10:37:54.676683159</label>
-<label id="38274.676688159">2019-08-19T10:37:54.676688159 cras atlog  FILL_AUDIO                     dev:6 hw_level:1040</label>
-<label id="38274.676694319">2019-08-19T10:37:54.676694319 cras atlog  WRITE_STREAMS_STREAM           id:1d0000 shm_frames:0 cb_pending:1</label>
-<label id="38274.676696512">2019-08-19T10:37:54.676696512 cras atlog  WRITE_STREAMS_MIX              write_limit:0 max_offset:0</label>
-<label id="38274.676699365">2019-08-19T10:37:54.676699365 cras atlog  WRITE_STREAMS_MIXED            write_limit:0</label>
-<label id="38274.676705462">2019-08-19T10:37:54.676705462 cras atlog  FILL_AUDIO_DONE                hw_level:1040 total_written:0 min_cb_level:1024</label>
-<label id="38274.676725281">2019-08-19T10:37:54.676725281 cras atlog  SET_DEV_WAKE                   dev:6 hw_level:1040 sleep:992</label>
-<label id="38274.676727345">2019-08-19T10:37:54.676727345 cras atlog  DEV_SLEEP_TIME                 dev:6 wake: 10:37:54.697389256</label>
-<label id="38274.676734968">2019-08-19T10:37:54.676734968 cras atlog  SLEEP                          sleep:000000000.020659324 longest_wake:001565104</label>
-<label id="38274.676860551">2019-08-19T10:37:54.676860551 cras atlog  WAKE                           num_fds:1</label>
-<label id="38274.676924328">2019-08-19T10:37:54.676924328 cras atlog  FILL_AUDIO_TSTAMP              dev:6 tstamp: 10:37:54.676922156</label>
-<label id="38274.676926906">2019-08-19T10:37:54.676926906 cras atlog  FILL_AUDIO                     dev:6 hw_level:1040</label>
-<label id="38274.676931349">2019-08-19T10:37:54.676931349 cras atlog  WRITE_STREAMS_STREAM           id:1d0000 shm_frames:1024 cb_pending:0</label>
-<label id="38274.676943036">2019-08-19T10:37:54.676943036 cras atlog  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0</label>
-<label id="38274.676953027">2019-08-19T10:37:54.676953027 cras atlog  DEV_STREAM_MIX                 written:1024 read:1024</label>
-<label id="38274.676955453">2019-08-19T10:37:54.676955453 cras atlog  WRITE_STREAMS_MIXED            write_limit:1024</label>
-<label id="38274.677231898">2019-08-19T10:37:54.677231898 cras atlog  FILL_AUDIO_DONE                hw_level:1040 total_written:1024 min_cb_level:1024</label>
-<label id="38274.677252890">2019-08-19T10:37:54.677252890 cras atlog  SET_DEV_WAKE                   dev:6 hw_level:2016 sleep:1968</label>
-<label id="38274.677254980">2019-08-19T10:37:54.677254980 cras atlog  DEV_SLEEP_TIME                 dev:6 wake: 10:37:54.718250167</label>
-<label id="38274.677259823">2019-08-19T10:37:54.677259823 cras atlog  STREAM_SLEEP_TIME              id:1d0000 wake: 10:37:54.697654724</label>
-<label id="38274.677264536">2019-08-19T10:37:54.677264536 cras atlog  SLEEP                          sleep:000000000.020396980 longest_wake:001565104</label>
-<label id="38274.697789394">2019-08-19T10:37:54.697789394 cras atlog  WAKE                           num_fds:0</label>
-<label id="38274.697833022">2019-08-19T10:37:54.697833022 cras atlog  WRITE_STREAMS_FETCH_STREAM     id:1d0000 cbth:1024 delay:1344</label>
-<label id="38274.697876956">2019-08-19T10:37:54.697876956 cras atlog  FILL_AUDIO_TSTAMP              dev:6 tstamp: 10:37:54.697874846</label>
-<label id="38274.697879928">2019-08-19T10:37:54.697879928 cras atlog  FILL_AUDIO                     dev:6 hw_level:1056</label>
-<label id="38274.697885964">2019-08-19T10:37:54.697885964 cras atlog  WRITE_STREAMS_STREAM           id:1d0000 shm_frames:0 cb_pending:1</label>
-<label id="38274.697888192">2019-08-19T10:37:54.697888192 cras atlog  WRITE_STREAMS_MIX              write_limit:0 max_offset:0</label>
-<label id="38274.697891024">2019-08-19T10:37:54.697891024 cras atlog  WRITE_STREAMS_MIXED            write_limit:0</label>
-<label id="38274.697897003">2019-08-19T10:37:54.697897003 cras atlog  FILL_AUDIO_DONE                hw_level:1056 total_written:0 min_cb_level:1024</label>
-<label id="38274.697916480">2019-08-19T10:37:54.697916480 cras atlog  SET_DEV_WAKE                   dev:6 hw_level:1056 sleep:1008</label>
-<label id="38274.697918569">2019-08-19T10:37:54.697918569 cras atlog  DEV_SLEEP_TIME                 dev:6 wake: 10:37:54.718913723</label>
-<label id="38274.697926449">2019-08-19T10:37:54.697926449 cras atlog  SLEEP                          sleep:000000000.020992361 longest_wake:001565104</label>
-<label id="38274.698048577">2019-08-19T10:37:54.698048577 cras atlog  WAKE                           num_fds:1</label>
-<label id="38274.698112219">2019-08-19T10:37:54.698112219 cras atlog  FILL_AUDIO_TSTAMP              dev:6 tstamp: 10:37:54.698110036</label>
-<label id="38274.698114806">2019-08-19T10:37:54.698114806 cras atlog  FILL_AUDIO                     dev:6 hw_level:1008</label>
-<label id="38274.698119339">2019-08-19T10:37:54.698119339 cras atlog  WRITE_STREAMS_STREAM           id:1d0000 shm_frames:1024 cb_pending:0</label>
-<label id="38274.698133295">2019-08-19T10:37:54.698133295 cras atlog  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0</label>
-<label id="38274.698138449">2019-08-19T10:37:54.698138449 cras atlog  DEV_STREAM_MIX                 written:1024 read:1024</label>
-<label id="38274.698140835">2019-08-19T10:37:54.698140835 cras atlog  WRITE_STREAMS_MIXED            write_limit:1024</label>
-<label id="38274.698396787">2019-08-19T10:37:54.698396787 cras atlog  FILL_AUDIO_DONE                hw_level:1008 total_written:1024 min_cb_level:1024</label>
-<label id="38274.698417024">2019-08-19T10:37:54.698417024 cras atlog  SET_DEV_WAKE                   dev:6 hw_level:2032 sleep:1984</label>
-<label id="38274.698419100">2019-08-19T10:37:54.698419100 cras atlog  DEV_SLEEP_TIME                 dev:6 wake: 10:37:54.739747637</label>
-<label id="38274.698423907">2019-08-19T10:37:54.698423907 cras atlog  STREAM_SLEEP_TIME              id:1d0000 wake: 10:37:54.718988057</label>
-<label id="38274.698428623">2019-08-19T10:37:54.698428623 cras atlog  SLEEP                          sleep:000000000.020566258 longest_wake:001565104</label>
-<label id="38274.719109903">2019-08-19T10:37:54.719109903 cras atlog  WAKE                           num_fds:0</label>
-<label id="38274.719153430">2019-08-19T10:37:54.719153430 cras atlog  WRITE_STREAMS_FETCH_STREAM     id:1d0000 cbth:1024 delay:1312</label>
-<label id="38274.719196387">2019-08-19T10:37:54.719196387 cras atlog  FILL_AUDIO_TSTAMP              dev:6 tstamp: 10:37:54.719194274</label>
-<label id="38274.719199290">2019-08-19T10:37:54.719199290 cras atlog  FILL_AUDIO                     dev:6 hw_level:1024</label>
-<label id="38274.719205301">2019-08-19T10:37:54.719205301 cras atlog  WRITE_STREAMS_STREAM           id:1d0000 shm_frames:0 cb_pending:1</label>
-<label id="38274.719207458">2019-08-19T10:37:54.719207458 cras atlog  WRITE_STREAMS_MIX              write_limit:0 max_offset:0</label>
-<label id="38274.719210354">2019-08-19T10:37:54.719210354 cras atlog  WRITE_STREAMS_MIXED            write_limit:0</label>
-<label id="38274.719216842">2019-08-19T10:37:54.719216842 cras atlog  FILL_AUDIO_DONE                hw_level:1024 total_written:0 min_cb_level:1024</label>
-<label id="38274.719236981">2019-08-19T10:37:54.719236981 cras atlog  SET_DEV_WAKE                   dev:6 hw_level:1024 sleep:976</label>
-<label id="38274.719239068">2019-08-19T10:37:54.719239068 cras atlog  DEV_SLEEP_TIME                 dev:6 wake: 10:37:54.739567597</label>
-<label id="38274.719246952">2019-08-19T10:37:54.719246952 cras atlog  SLEEP                          sleep:000000000.020325687 longest_wake:001565104</label>
-<label id="38274.719301220">2019-08-19T10:37:54.719301220 cras atlog  WAKE                           num_fds:1</label>
-<label id="38274.719357382">2019-08-19T10:37:54.719357382 cras atlog  FILL_AUDIO_TSTAMP              dev:6 tstamp: 10:37:54.719355237</label>
-<label id="38274.719359698">2019-08-19T10:37:54.719359698 cras atlog  FILL_AUDIO                     dev:6 hw_level:1024</label>
-<label id="38274.719362947">2019-08-19T10:37:54.719362947 cras atlog  WRITE_STREAMS_STREAM           id:1d0000 shm_frames:1024 cb_pending:0</label>
-<label id="38274.719377071">2019-08-19T10:37:54.719377071 cras atlog  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0</label>
-<label id="38274.719382615">2019-08-19T10:37:54.719382615 cras atlog  DEV_STREAM_MIX                 written:1024 read:1024</label>
-<label id="38274.719384824">2019-08-19T10:37:54.719384824 cras atlog  WRITE_STREAMS_MIXED            write_limit:1024</label>
-<label id="38274.719643101">2019-08-19T10:37:54.719643101 cras atlog  FILL_AUDIO_DONE                hw_level:1024 total_written:1024 min_cb_level:1024</label>
-<label id="38274.719663005">2019-08-19T10:37:54.719663005 cras atlog  SET_DEV_WAKE                   dev:6 hw_level:2048 sleep:2000</label>
-<label id="38274.719664987">2019-08-19T10:37:54.719664987 cras atlog  DEV_SLEEP_TIME                 dev:6 wake: 10:37:54.761327047</label>
-<label id="38274.719669473">2019-08-19T10:37:54.719669473 cras atlog  STREAM_SLEEP_TIME              id:1d0000 wake: 10:37:54.740321390</label>
-<label id="38274.719673899">2019-08-19T10:37:54.719673899 cras atlog  SLEEP                          sleep:000000000.020654025 longest_wake:001565104</label>
-<label id="38274.740595499">2019-08-19T10:37:54.740595499 cras atlog  WAKE                           num_fds:0</label>
-<label id="38274.740639477">2019-08-19T10:37:54.740639477 cras atlog  WRITE_STREAMS_FETCH_STREAM     id:1d0000 cbth:1024 delay:1328</label>
-<label id="38274.740683615">2019-08-19T10:37:54.740683615 cras atlog  FILL_AUDIO_TSTAMP              dev:6 tstamp: 10:37:54.740681512</label>
-<label id="38274.740686503">2019-08-19T10:37:54.740686503 cras atlog  FILL_AUDIO                     dev:6 hw_level:1040</label>
-<label id="38274.740692464">2019-08-19T10:37:54.740692464 cras atlog  WRITE_STREAMS_STREAM           id:1d0000 shm_frames:0 cb_pending:1</label>
-<label id="38274.740694600">2019-08-19T10:37:54.740694600 cras atlog  WRITE_STREAMS_MIX              write_limit:0 max_offset:0</label>
-<label id="38274.740697433">2019-08-19T10:37:54.740697433 cras atlog  WRITE_STREAMS_MIXED            write_limit:0</label>
-<label id="38274.740703643">2019-08-19T10:37:54.740703643 cras atlog  FILL_AUDIO_DONE                hw_level:1040 total_written:0 min_cb_level:1024</label>
-<label id="38274.740723661">2019-08-19T10:37:54.740723661 cras atlog  SET_DEV_WAKE                   dev:6 hw_level:1040 sleep:992</label>
-<label id="38274.740725763">2019-08-19T10:37:54.740725763 cras atlog  DEV_SLEEP_TIME                 dev:6 wake: 10:37:54.761387612</label>
-<label id="38274.740733471">2019-08-19T10:37:54.740733471 cras atlog  SLEEP                          sleep:000000000.020659319 longest_wake:001565104</label>
-<label id="38274.740793102">2019-08-19T10:37:54.740793102 cras atlog  WAKE                           num_fds:1</label>
-<label id="38274.740848639">2019-08-19T10:37:54.740848639 cras atlog  FILL_AUDIO_TSTAMP              dev:6 tstamp: 10:37:54.740846573</label>
-<label id="38274.740850997">2019-08-19T10:37:54.740850997 cras atlog  FILL_AUDIO                     dev:6 hw_level:1040</label>
-<label id="38274.740854311">2019-08-19T10:37:54.740854311 cras atlog  WRITE_STREAMS_STREAM           id:1d0000 shm_frames:1024 cb_pending:0</label>
-<label id="38274.740868736">2019-08-19T10:37:54.740868736 cras atlog  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0</label>
-<label id="38274.740873892">2019-08-19T10:37:54.740873892 cras atlog  DEV_STREAM_MIX                 written:1024 read:1024</label>
-<label id="38274.740875997">2019-08-19T10:37:54.740875997 cras atlog  WRITE_STREAMS_MIXED            write_limit:1024</label>
-<label id="38274.741153121">2019-08-19T10:37:54.741153121 cras atlog  FILL_AUDIO_DONE                hw_level:1040 total_written:1024 min_cb_level:1024</label>
-<label id="38274.741173582">2019-08-19T10:37:54.741173582 cras atlog  SET_DEV_WAKE                   dev:6 hw_level:2016 sleep:1968</label>
-<label id="38274.741175606">2019-08-19T10:37:54.741175606 cras atlog  DEV_SLEEP_TIME                 dev:6 wake: 10:37:54.782171115</label>
-<label id="38274.741180302">2019-08-19T10:37:54.741180302 cras atlog  STREAM_SLEEP_TIME              id:1d0000 wake: 10:37:54.761654723</label>
-<label id="38274.741184669">2019-08-19T10:37:54.741184669 cras atlog  SLEEP                          sleep:000000000.020476747 longest_wake:001565104</label>
-<label id="38274.761922026">2019-08-19T10:37:54.761922026 cras atlog  WAKE                           num_fds:0</label>
-<label id="38274.761962963">2019-08-19T10:37:54.761962963 cras atlog  WRITE_STREAMS_FETCH_STREAM     id:1d0000 cbth:1024 delay:1344</label>
-<label id="38274.762022826">2019-08-19T10:37:54.762022826 cras atlog  FILL_AUDIO_TSTAMP              dev:6 tstamp: 10:37:54.762020513</label>
-<label id="38274.762025805">2019-08-19T10:37:54.762025805 cras atlog  FILL_AUDIO                     dev:6 hw_level:1008</label>
-<label id="38274.762031594">2019-08-19T10:37:54.762031594 cras atlog  WRITE_STREAMS_STREAM           id:1d0000 shm_frames:0 cb_pending:1</label>
-<label id="38274.762033738">2019-08-19T10:37:54.762033738 cras atlog  WRITE_STREAMS_MIX              write_limit:0 max_offset:0</label>
-<label id="38274.762036536">2019-08-19T10:37:54.762036536 cras atlog  WRITE_STREAMS_MIXED            write_limit:0</label>
-<label id="38274.762042425">2019-08-19T10:37:54.762042425 cras atlog  FILL_AUDIO_DONE                hw_level:1008 total_written:0 min_cb_level:1024</label>
-<label id="38274.762062690">2019-08-19T10:37:54.762062690 cras atlog  SET_DEV_WAKE                   dev:6 hw_level:1008 sleep:960</label>
-<label id="38274.762065186">2019-08-19T10:37:54.762065186 cras atlog  DEV_SLEEP_TIME                 dev:6 wake: 10:37:54.782060173</label>
-<label id="38274.762072982">2019-08-19T10:37:54.762072982 cras atlog  SLEEP                          sleep:000000000.019992102 longest_wake:001565104</label>
-<label id="38274.762102057">2019-08-19T10:37:54.762102057 cras atlog  WAKE                           num_fds:1</label>
-<label id="38274.762151699">2019-08-19T10:37:54.762151699 cras atlog  FILL_AUDIO_TSTAMP              dev:6 tstamp: 10:37:54.762149704</label>
-<label id="38274.762153748">2019-08-19T10:37:54.762153748 cras atlog  FILL_AUDIO                     dev:6 hw_level:1008</label>
-<label id="38274.762156523">2019-08-19T10:37:54.762156523 cras atlog  WRITE_STREAMS_STREAM           id:1d0000 shm_frames:1024 cb_pending:0</label>
-<label id="38274.762170916">2019-08-19T10:37:54.762170916 cras atlog  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0</label>
-<label id="38274.762175916">2019-08-19T10:37:54.762175916 cras atlog  DEV_STREAM_MIX                 written:1024 read:1024</label>
-<label id="38274.762178058">2019-08-19T10:37:54.762178058 cras atlog  WRITE_STREAMS_MIXED            write_limit:1024</label>
-<label id="38274.762432618">2019-08-19T10:37:54.762432618 cras atlog  FILL_AUDIO_DONE                hw_level:1008 total_written:1024 min_cb_level:1024</label>
-<label id="38274.762452548">2019-08-19T10:37:54.762452548 cras atlog  SET_DEV_WAKE                   dev:6 hw_level:2032 sleep:1984</label>
-<label id="38274.762454582">2019-08-19T10:37:54.762454582 cras atlog  DEV_SLEEP_TIME                 dev:6 wake: 10:37:54.803783385</label>
-<label id="38274.762458984">2019-08-19T10:37:54.762458984 cras atlog  STREAM_SLEEP_TIME              id:1d0000 wake: 10:37:54.782988056</label>
-<label id="38274.762463390">2019-08-19T10:37:54.762463390 cras atlog  SLEEP                          sleep:000000000.020531186 longest_wake:001565104</label>
-<label id="38274.783234058">2019-08-19T10:37:54.783234058 cras atlog  WAKE                           num_fds:0</label>
-<label id="38274.783277641">2019-08-19T10:37:54.783277641 cras atlog  WRITE_STREAMS_FETCH_STREAM     id:1d0000 cbth:1024 delay:1312</label>
-<label id="38274.783323456">2019-08-19T10:37:54.783323456 cras atlog  FILL_AUDIO_TSTAMP              dev:6 tstamp: 10:37:54.783321345</label>
-<label id="38274.783326364">2019-08-19T10:37:54.783326364 cras atlog  FILL_AUDIO                     dev:6 hw_level:1024</label>
-<label id="38274.783332069">2019-08-19T10:37:54.783332069 cras atlog  WRITE_STREAMS_STREAM           id:1d0000 shm_frames:0 cb_pending:1</label>
-<label id="38274.783334227">2019-08-19T10:37:54.783334227 cras atlog  WRITE_STREAMS_MIX              write_limit:0 max_offset:0</label>
-<label id="38274.783337045">2019-08-19T10:37:54.783337045 cras atlog  WRITE_STREAMS_MIXED            write_limit:0</label>
-<label id="38274.783343042">2019-08-19T10:37:54.783343042 cras atlog  FILL_AUDIO_DONE                hw_level:1024 total_written:0 min_cb_level:1024</label>
-<label id="38274.783362532">2019-08-19T10:37:54.783362532 cras atlog  SET_DEV_WAKE                   dev:6 hw_level:1024 sleep:976</label>
-<label id="38274.783364628">2019-08-19T10:37:54.783364628 cras atlog  DEV_SLEEP_TIME                 dev:6 wake: 10:37:54.803693148</label>
-<label id="38274.783372345">2019-08-19T10:37:54.783372345 cras atlog  SLEEP                          sleep:000000000.020325873 longest_wake:001565104</label>
-<label id="38274.783432165">2019-08-19T10:37:54.783432165 cras atlog  WAKE                           num_fds:1</label>
-<label id="38274.783487514">2019-08-19T10:37:54.783487514 cras atlog  FILL_AUDIO_TSTAMP              dev:6 tstamp: 10:37:54.783485428</label>
-<label id="38274.783489920">2019-08-19T10:37:54.783489920 cras atlog  FILL_AUDIO                     dev:6 hw_level:1024</label>
-<label id="38274.783493117">2019-08-19T10:37:54.783493117 cras atlog  WRITE_STREAMS_STREAM           id:1d0000 shm_frames:1024 cb_pending:0</label>
-<label id="38274.783507178">2019-08-19T10:37:54.783507178 cras atlog  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0</label>
-<label id="38274.783512206">2019-08-19T10:37:54.783512206 cras atlog  DEV_STREAM_MIX                 written:1024 read:1024</label>
-<label id="38274.783514361">2019-08-19T10:37:54.783514361 cras atlog  WRITE_STREAMS_MIXED            write_limit:1024</label>
-<label id="38274.783772851">2019-08-19T10:37:54.783772851 cras atlog  FILL_AUDIO_DONE                hw_level:1024 total_written:1024 min_cb_level:1024</label>
-<label id="38274.783790725">2019-08-19T10:37:54.783790725 cras atlog  SET_DEV_WAKE                   dev:6 hw_level:2048 sleep:2000</label>
-<label id="38274.783792763">2019-08-19T10:37:54.783792763 cras atlog  DEV_SLEEP_TIME                 dev:6 wake: 10:37:54.825454687</label>
-<label id="38274.783797423">2019-08-19T10:37:54.783797423 cras atlog  STREAM_SLEEP_TIME              id:1d0000 wake: 10:37:54.804321389</label>
-<label id="38274.783801803">2019-08-19T10:37:54.783801803 cras atlog  SLEEP                          sleep:000000000.020526265 longest_wake:001565104</label>
-<label id="38274.804579013">2019-08-19T10:37:54.804579013 cras atlog  WAKE                           num_fds:0</label>
-<label id="38274.804623390">2019-08-19T10:37:54.804623390 cras atlog  WRITE_STREAMS_FETCH_STREAM     id:1d0000 cbth:1024 delay:1328</label>
-<label id="38274.804668478">2019-08-19T10:37:54.804668478 cras atlog  FILL_AUDIO_TSTAMP              dev:6 tstamp: 10:37:54.804666367</label>
-<label id="38274.804671376">2019-08-19T10:37:54.804671376 cras atlog  FILL_AUDIO                     dev:6 hw_level:1040</label>
-<label id="38274.804677338">2019-08-19T10:37:54.804677338 cras atlog  WRITE_STREAMS_STREAM           id:1d0000 shm_frames:0 cb_pending:1</label>
-<label id="38274.804679504">2019-08-19T10:37:54.804679504 cras atlog  WRITE_STREAMS_MIX              write_limit:0 max_offset:0</label>
-<label id="38274.804682310">2019-08-19T10:37:54.804682310 cras atlog  WRITE_STREAMS_MIXED            write_limit:0</label>
-<label id="38274.804688741">2019-08-19T10:37:54.804688741 cras atlog  FILL_AUDIO_DONE                hw_level:1040 total_written:0 min_cb_level:1024</label>
-<label id="38274.804708721">2019-08-19T10:37:54.804708721 cras atlog  SET_DEV_WAKE                   dev:6 hw_level:1040 sleep:992</label>
-<label id="38274.804710807">2019-08-19T10:37:54.804710807 cras atlog  DEV_SLEEP_TIME                 dev:6 wake: 10:37:54.825372685</label>
-<label id="38274.804718659">2019-08-19T10:37:54.804718659 cras atlog  SLEEP                          sleep:000000000.020659270 longest_wake:001565104</label>
-<label id="38274.804780617">2019-08-19T10:37:54.804780617 cras atlog  WAKE                           num_fds:1</label>
-<label id="38274.804835890">2019-08-19T10:37:54.804835890 cras atlog  FILL_AUDIO_TSTAMP              dev:6 tstamp: 10:37:54.804833797</label>
-<label id="38274.804838233">2019-08-19T10:37:54.804838233 cras atlog  FILL_AUDIO                     dev:6 hw_level:1040</label>
-<label id="38274.804841501">2019-08-19T10:37:54.804841501 cras atlog  WRITE_STREAMS_STREAM           id:1d0000 shm_frames:1024 cb_pending:0</label>
-<label id="38274.804855352">2019-08-19T10:37:54.804855352 cras atlog  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0</label>
-<label id="38274.804860473">2019-08-19T10:37:54.804860473 cras atlog  DEV_STREAM_MIX                 written:1024 read:1024</label>
-<label id="38274.804862636">2019-08-19T10:37:54.804862636 cras atlog  WRITE_STREAMS_MIXED            write_limit:1024</label>
-<label id="38274.805138821">2019-08-19T10:37:54.805138821 cras atlog  FILL_AUDIO_DONE                hw_level:1040 total_written:1024 min_cb_level:1024</label>
-<label id="38274.805159078">2019-08-19T10:37:54.805159078 cras atlog  SET_DEV_WAKE                   dev:6 hw_level:2016 sleep:1968</label>
-<label id="38274.805161124">2019-08-19T10:37:54.805161124 cras atlog  DEV_SLEEP_TIME                 dev:6 wake: 10:37:54.846156596</label>
-<label id="38274.805165757">2019-08-19T10:37:54.805165757 cras atlog  STREAM_SLEEP_TIME              id:1d0000 wake: 10:37:54.825654722</label>
-<label id="38274.805170306">2019-08-19T10:37:54.805170306 cras atlog  SLEEP                          sleep:000000000.020491218 longest_wake:001565104</label>
-<label id="38274.825913546">2019-08-19T10:37:54.825913546 cras atlog  WAKE                           num_fds:0</label>
-<label id="38274.825958417">2019-08-19T10:37:54.825958417 cras atlog  WRITE_STREAMS_FETCH_STREAM     id:1d0000 cbth:1024 delay:1344</label>
-<label id="38274.826020986">2019-08-19T10:37:54.826020986 cras atlog  FILL_AUDIO_TSTAMP              dev:6 tstamp: 10:37:54.826018114</label>
-<label id="38274.826024162">2019-08-19T10:37:54.826024162 cras atlog  FILL_AUDIO                     dev:6 hw_level:1008</label>
-<label id="38274.826030236">2019-08-19T10:37:54.826030236 cras atlog  WRITE_STREAMS_STREAM           id:1d0000 shm_frames:0 cb_pending:1</label>
-<label id="38274.826032511">2019-08-19T10:37:54.826032511 cras atlog  WRITE_STREAMS_MIX              write_limit:0 max_offset:0</label>
-<label id="38274.826035326">2019-08-19T10:37:54.826035326 cras atlog  WRITE_STREAMS_MIXED            write_limit:0</label>
-<label id="38274.826041230">2019-08-19T10:37:54.826041230 cras atlog  FILL_AUDIO_DONE                hw_level:1008 total_written:0 min_cb_level:1024</label>
-<label id="38274.826062337">2019-08-19T10:37:54.826062337 cras atlog  SET_DEV_WAKE                   dev:6 hw_level:1008 sleep:960</label>
-<label id="38274.826064399">2019-08-19T10:37:54.826064399 cras atlog  DEV_SLEEP_TIME                 dev:6 wake: 10:37:54.846059769</label>
-<label id="38274.826072024">2019-08-19T10:37:54.826072024 cras atlog  SLEEP                          sleep:000000000.019992730 longest_wake:001565104</label>
-<label id="38274.826100424">2019-08-19T10:37:54.826100424 cras atlog  WAKE                           num_fds:1</label>
-<label id="38274.826150628">2019-08-19T10:37:54.826150628 cras atlog  FILL_AUDIO_TSTAMP              dev:6 tstamp: 10:37:54.826148583</label>
-<label id="38274.826152748">2019-08-19T10:37:54.826152748 cras atlog  FILL_AUDIO                     dev:6 hw_level:1008</label>
-<label id="38274.826155423">2019-08-19T10:37:54.826155423 cras atlog  WRITE_STREAMS_STREAM           id:1d0000 shm_frames:1024 cb_pending:0</label>
-<label id="38274.826170179">2019-08-19T10:37:54.826170179 cras atlog  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0</label>
-<label id="38274.826175702">2019-08-19T10:37:54.826175702 cras atlog  DEV_STREAM_MIX                 written:1024 read:1024</label>
-<label id="38274.826177885">2019-08-19T10:37:54.826177885 cras atlog  WRITE_STREAMS_MIXED            write_limit:1024</label>
-<label id="38274.826431854">2019-08-19T10:37:54.826431854 cras atlog  FILL_AUDIO_DONE                hw_level:1008 total_written:1024 min_cb_level:1024</label>
-<label id="38274.826451927">2019-08-19T10:37:54.826451927 cras atlog  SET_DEV_WAKE                   dev:6 hw_level:2032 sleep:1984</label>
-<label id="38274.826453912">2019-08-19T10:37:54.826453912 cras atlog  DEV_SLEEP_TIME                 dev:6 wake: 10:37:54.867782437</label>
-<label id="38274.826458354">2019-08-19T10:37:54.826458354 cras atlog  STREAM_SLEEP_TIME              id:1d0000 wake: 10:37:54.846988055</label>
-<label id="38274.826462711">2019-08-19T10:37:54.826462711 cras atlog  SLEEP                          sleep:000000000.020531841 longest_wake:001565104</label>
-<label id="38274.847254169">2019-08-19T10:37:54.847254169 cras atlog  WAKE                           num_fds:0</label>
-<label id="38274.847298285">2019-08-19T10:37:54.847298285 cras atlog  WRITE_STREAMS_FETCH_STREAM     id:1d0000 cbth:1024 delay:1312</label>
-<label id="38274.847343532">2019-08-19T10:37:54.847343532 cras atlog  FILL_AUDIO_TSTAMP              dev:6 tstamp: 10:37:54.847341437</label>
-<label id="38274.847346397">2019-08-19T10:37:54.847346397 cras atlog  FILL_AUDIO                     dev:6 hw_level:1024</label>
-<label id="38274.847352242">2019-08-19T10:37:54.847352242 cras atlog  WRITE_STREAMS_STREAM           id:1d0000 shm_frames:0 cb_pending:1</label>
-<label id="38274.847354402">2019-08-19T10:37:54.847354402 cras atlog  WRITE_STREAMS_MIX              write_limit:0 max_offset:0</label>
-<label id="38274.847357232">2019-08-19T10:37:54.847357232 cras atlog  WRITE_STREAMS_MIXED            write_limit:0</label>
-<label id="38274.847363049">2019-08-19T10:37:54.847363049 cras atlog  FILL_AUDIO_DONE                hw_level:1024 total_written:0 min_cb_level:1024</label>
-<label id="38274.847382560">2019-08-19T10:37:54.847382560 cras atlog  SET_DEV_WAKE                   dev:6 hw_level:1024 sleep:976</label>
-<label id="38274.847384657">2019-08-19T10:37:54.847384657 cras atlog  DEV_SLEEP_TIME                 dev:6 wake: 10:37:54.867713298</label>
-<label id="38274.847392466">2019-08-19T10:37:54.847392466 cras atlog  SLEEP                          sleep:000000000.020325941 longest_wake:001565104</label>
-<label id="38274.847453266">2019-08-19T10:37:54.847453266 cras atlog  WAKE                           num_fds:1</label>
-<label id="38274.847507893">2019-08-19T10:37:54.847507893 cras atlog  FILL_AUDIO_TSTAMP              dev:6 tstamp: 10:37:54.847505842</label>
-<label id="38274.847510294">2019-08-19T10:37:54.847510294 cras atlog  FILL_AUDIO                     dev:6 hw_level:1024</label>
-<label id="38274.847513378">2019-08-19T10:37:54.847513378 cras atlog  WRITE_STREAMS_STREAM           id:1d0000 shm_frames:1024 cb_pending:0</label>
-<label id="38274.847527509">2019-08-19T10:37:54.847527509 cras atlog  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0</label>
-<label id="38274.847532608">2019-08-19T10:37:54.847532608 cras atlog  DEV_STREAM_MIX                 written:1024 read:1024</label>
-<label id="38274.847534792">2019-08-19T10:37:54.847534792 cras atlog  WRITE_STREAMS_MIXED            write_limit:1024</label>
-<label id="38274.847794682">2019-08-19T10:37:54.847794682 cras atlog  FILL_AUDIO_DONE                hw_level:1024 total_written:1024 min_cb_level:1024</label>
-<label id="38274.847815798">2019-08-19T10:37:54.847815798 cras atlog  SET_DEV_WAKE                   dev:6 hw_level:2048 sleep:2000</label>
-<label id="38274.847818230">2019-08-19T10:37:54.847818230 cras atlog  DEV_SLEEP_TIME                 dev:6 wake: 10:37:54.889479489</label>
-<label id="38274.847822643">2019-08-19T10:37:54.847822643 cras atlog  STREAM_SLEEP_TIME              id:1d0000 wake: 10:37:54.868321388</label>
-<label id="38274.847827174">2019-08-19T10:37:54.847827174 cras atlog  SLEEP                          sleep:000000000.020500850 longest_wake:001565104</label>
-<label id="38274.868647280">2019-08-19T10:37:54.868647280 cras atlog  WAKE                           num_fds:0</label>
-<label id="38274.868691938">2019-08-19T10:37:54.868691938 cras atlog  WRITE_STREAMS_FETCH_STREAM     id:1d0000 cbth:1024 delay:1328</label>
-<label id="38274.868736756">2019-08-19T10:37:54.868736756 cras atlog  FILL_AUDIO_TSTAMP              dev:6 tstamp: 10:37:54.868734631</label>
-<label id="38274.868739650">2019-08-19T10:37:54.868739650 cras atlog  FILL_AUDIO                     dev:6 hw_level:1040</label>
-<label id="38274.868745553">2019-08-19T10:37:54.868745553 cras atlog  WRITE_STREAMS_STREAM           id:1d0000 shm_frames:0 cb_pending:1</label>
-<label id="38274.868747712">2019-08-19T10:37:54.868747712 cras atlog  WRITE_STREAMS_MIX              write_limit:0 max_offset:0</label>
-<label id="38274.868750515">2019-08-19T10:37:54.868750515 cras atlog  WRITE_STREAMS_MIXED            write_limit:0</label>
-<label id="38274.868756826">2019-08-19T10:37:54.868756826 cras atlog  FILL_AUDIO_DONE                hw_level:1040 total_written:0 min_cb_level:1024</label>
-<label id="38274.868776554">2019-08-19T10:37:54.868776554 cras atlog  SET_DEV_WAKE                   dev:6 hw_level:1040 sleep:992</label>
-<label id="38274.868778635">2019-08-19T10:37:54.868778635 cras atlog  DEV_SLEEP_TIME                 dev:6 wake: 10:37:54.889440503</label>
-<label id="38274.868786877">2019-08-19T10:37:54.868786877 cras atlog  SLEEP                          sleep:000000000.020658858 longest_wake:001565104</label>
-<label id="38274.868834120">2019-08-19T10:37:54.868834120 cras atlog  WAKE                           num_fds:1</label>
-<label id="38274.868887396">2019-08-19T10:37:54.868887396 cras atlog  FILL_AUDIO_TSTAMP              dev:6 tstamp: 10:37:54.868885395</label>
-<label id="38274.868889760">2019-08-19T10:37:54.868889760 cras atlog  FILL_AUDIO                     dev:6 hw_level:1040</label>
-<label id="38274.868892743">2019-08-19T10:37:54.868892743 cras atlog  WRITE_STREAMS_STREAM           id:1d0000 shm_frames:1024 cb_pending:0</label>
-<label id="38274.868906663">2019-08-19T10:37:54.868906663 cras atlog  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0</label>
-<label id="38274.868911746">2019-08-19T10:37:54.868911746 cras atlog  DEV_STREAM_MIX                 written:1024 read:1024</label>
-<label id="38274.868913920">2019-08-19T10:37:54.868913920 cras atlog  WRITE_STREAMS_MIXED            write_limit:1024</label>
-<label id="38274.869187106">2019-08-19T10:37:54.869187106 cras atlog  FILL_AUDIO_DONE                hw_level:1040 total_written:1024 min_cb_level:1024</label>
-<label id="38274.869207769">2019-08-19T10:37:54.869207769 cras atlog  SET_DEV_WAKE                   dev:6 hw_level:2016 sleep:1968</label>
-<label id="38274.869209841">2019-08-19T10:37:54.869209841 cras atlog  DEV_SLEEP_TIME                 dev:6 wake: 10:37:54.910204925</label>
-<label id="38274.869214453">2019-08-19T10:37:54.869214453 cras atlog  STREAM_SLEEP_TIME              id:1d0000 wake: 10:37:54.889654721</label>
-<label id="38274.869218854">2019-08-19T10:37:54.869218854 cras atlog  SLEEP                          sleep:000000000.020442575 longest_wake:001565104</label>
-<label id="38274.889911594">2019-08-19T10:37:54.889911594 cras atlog  WAKE                           num_fds:0</label>
-<label id="38274.889955591">2019-08-19T10:37:54.889955591 cras atlog  WRITE_STREAMS_FETCH_STREAM     id:1d0000 cbth:1024 delay:1344</label>
-<label id="38274.890001028">2019-08-19T10:37:54.890001028 cras atlog  FILL_AUDIO_TSTAMP              dev:6 tstamp: 10:37:54.889998910</label>
-<label id="38274.890021859">2019-08-19T10:37:54.890021859 cras atlog  FILL_AUDIO                     dev:6 hw_level:1008</label>
-<label id="38274.890028088">2019-08-19T10:37:54.890028088 cras atlog  WRITE_STREAMS_STREAM           id:1d0000 shm_frames:0 cb_pending:1</label>
-<label id="38274.890030382">2019-08-19T10:37:54.890030382 cras atlog  WRITE_STREAMS_MIX              write_limit:0 max_offset:0</label>
-<label id="38274.890033213">2019-08-19T10:37:54.890033213 cras atlog  WRITE_STREAMS_MIXED            write_limit:0</label>
-<label id="38274.890039166">2019-08-19T10:37:54.890039166 cras atlog  FILL_AUDIO_DONE                hw_level:1008 total_written:0 min_cb_level:1024</label>
-<label id="38274.890059702">2019-08-19T10:37:54.890059702 cras atlog  SET_DEV_WAKE                   dev:6 hw_level:1008 sleep:960</label>
-<label id="38274.890061783">2019-08-19T10:37:54.890061783 cras atlog  DEV_SLEEP_TIME                 dev:6 wake: 10:37:54.910057166</label>
-<label id="38274.890069206">2019-08-19T10:37:54.890069206 cras atlog  SLEEP                          sleep:000000000.019992855 longest_wake:001565104</label>
-<label id="38274.890097300">2019-08-19T10:37:54.890097300 cras atlog  WAKE                           num_fds:1</label>
-<label id="38274.890147785">2019-08-19T10:37:54.890147785 cras atlog  FILL_AUDIO_TSTAMP              dev:6 tstamp: 10:37:54.890145728</label>
-<label id="38274.890149892">2019-08-19T10:37:54.890149892 cras atlog  FILL_AUDIO                     dev:6 hw_level:1008</label>
-<label id="38274.890152824">2019-08-19T10:37:54.890152824 cras atlog  WRITE_STREAMS_STREAM           id:1d0000 shm_frames:1024 cb_pending:0</label>
-<label id="38274.890166719">2019-08-19T10:37:54.890166719 cras atlog  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0</label>
-<label id="38274.890171766">2019-08-19T10:37:54.890171766 cras atlog  DEV_STREAM_MIX                 written:1024 read:1024</label>
-<label id="38274.890173949">2019-08-19T10:37:54.890173949 cras atlog  WRITE_STREAMS_MIXED            write_limit:1024</label>
-<label id="38274.890427138">2019-08-19T10:37:54.890427138 cras atlog  FILL_AUDIO_DONE                hw_level:1008 total_written:1024 min_cb_level:1024</label>
-<label id="38274.890446925">2019-08-19T10:37:54.890446925 cras atlog  SET_DEV_WAKE                   dev:6 hw_level:2032 sleep:1984</label>
-<label id="38274.890448924">2019-08-19T10:37:54.890448924 cras atlog  DEV_SLEEP_TIME                 dev:6 wake: 10:37:54.931777812</label>
-<label id="38274.890453296">2019-08-19T10:37:54.890453296 cras atlog  STREAM_SLEEP_TIME              id:1d0000 wake: 10:37:54.910988054</label>
-<label id="38274.890457622">2019-08-19T10:37:54.890457622 cras atlog  SLEEP                          sleep:000000000.020536883 longest_wake:001565104</label>
-<label id="38274.911549604">2019-08-19T10:37:54.911549604 cras atlog  WAKE                           num_fds:0</label>
-<label id="38274.911593780">2019-08-19T10:37:54.911593780 cras atlog  WRITE_STREAMS_FETCH_STREAM     id:1d0000 cbth:1024 delay:1312</label>
-<label id="38274.911639463">2019-08-19T10:37:54.911639463 cras atlog  FILL_AUDIO_TSTAMP              dev:6 tstamp: 10:37:54.911637349</label>
-<label id="38274.911642356">2019-08-19T10:37:54.911642356 cras atlog  FILL_AUDIO                     dev:6 hw_level:1024</label>
-<label id="38274.911648354">2019-08-19T10:37:54.911648354 cras atlog  WRITE_STREAMS_STREAM           id:1d0000 shm_frames:0 cb_pending:1</label>
-<label id="38274.911650495">2019-08-19T10:37:54.911650495 cras atlog  WRITE_STREAMS_MIX              write_limit:0 max_offset:0</label>
-<label id="38274.911653308">2019-08-19T10:37:54.911653308 cras atlog  WRITE_STREAMS_MIXED            write_limit:0</label>
-<label id="38274.911659036">2019-08-19T10:37:54.911659036 cras atlog  FILL_AUDIO_DONE                hw_level:1024 total_written:0 min_cb_level:1024</label>
-<label id="38274.911677780">2019-08-19T10:37:54.911677780 cras atlog  SET_DEV_WAKE                   dev:6 hw_level:1024 sleep:976</label>
-<label id="38274.911679870">2019-08-19T10:37:54.911679870 cras atlog  DEV_SLEEP_TIME                 dev:6 wake: 10:37:54.932008544</label>
-<label id="38274.911687437">2019-08-19T10:37:54.911687437 cras atlog  SLEEP                          sleep:000000000.020326063 longest_wake:001565104</label>
-<label id="38274.911810046">2019-08-19T10:37:54.911810046 cras atlog  WAKE                           num_fds:1</label>
-<label id="38274.911873260">2019-08-19T10:37:54.911873260 cras atlog  FILL_AUDIO_TSTAMP              dev:6 tstamp: 10:37:54.911871103</label>
-<label id="38274.911875825">2019-08-19T10:37:54.911875825 cras atlog  FILL_AUDIO                     dev:6 hw_level:1024</label>
-<label id="38274.911880257">2019-08-19T10:37:54.911880257 cras atlog  WRITE_STREAMS_STREAM           id:1d0000 shm_frames:1024 cb_pending:0</label>
-<label id="38274.911894516">2019-08-19T10:37:54.911894516 cras atlog  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0</label>
-<label id="38274.911899775">2019-08-19T10:37:54.911899775 cras atlog  DEV_STREAM_MIX                 written:1024 read:1024</label>
-<label id="38274.911902141">2019-08-19T10:37:54.911902141 cras atlog  WRITE_STREAMS_MIXED            write_limit:1024</label>
-<label id="38274.912179567">2019-08-19T10:37:54.912179567 cras atlog  FILL_AUDIO_DONE                hw_level:1024 total_written:1024 min_cb_level:1024</label>
-<label id="38274.912200713">2019-08-19T10:37:54.912200713 cras atlog  SET_DEV_WAKE                   dev:6 hw_level:2000 sleep:1952</label>
-<label id="38274.912202795">2019-08-19T10:37:54.912202795 cras atlog  DEV_SLEEP_TIME                 dev:6 wake: 10:37:54.952864609</label>
-<label id="38274.912207619">2019-08-19T10:37:54.912207619 cras atlog  STREAM_SLEEP_TIME              id:1d0000 wake: 10:37:54.932321387</label>
-<label id="38274.912212340">2019-08-19T10:37:54.912212340 cras atlog  SLEEP                          sleep:000000000.020115853 longest_wake:001565104</label>
-<label id="38274.932544653">2019-08-19T10:37:54.932544653 cras atlog  WAKE                           num_fds:0</label>
-<label id="38274.932589800">2019-08-19T10:37:54.932589800 cras atlog  WRITE_STREAMS_FETCH_STREAM     id:1d0000 cbth:1024 delay:1328</label>
-<label id="38274.932634557">2019-08-19T10:37:54.932634557 cras atlog  FILL_AUDIO_TSTAMP              dev:6 tstamp: 10:37:54.932632438</label>
-<label id="38274.932637511">2019-08-19T10:37:54.932637511 cras atlog  FILL_AUDIO                     dev:6 hw_level:1040</label>
-<label id="38274.932643460">2019-08-19T10:37:54.932643460 cras atlog  WRITE_STREAMS_STREAM           id:1d0000 shm_frames:0 cb_pending:1</label>
-<label id="38274.932645626">2019-08-19T10:37:54.932645626 cras atlog  WRITE_STREAMS_MIX              write_limit:0 max_offset:0</label>
-<label id="38274.932648431">2019-08-19T10:37:54.932648431 cras atlog  WRITE_STREAMS_MIXED            write_limit:0</label>
-<label id="38274.932654361">2019-08-19T10:37:54.932654361 cras atlog  FILL_AUDIO_DONE                hw_level:1040 total_written:0 min_cb_level:1024</label>
-<label id="38274.932673739">2019-08-19T10:37:54.932673739 cras atlog  SET_DEV_WAKE                   dev:6 hw_level:1040 sleep:992</label>
-<label id="38274.932675817">2019-08-19T10:37:54.932675817 cras atlog  DEV_SLEEP_TIME                 dev:6 wake: 10:37:54.953337688</label>
-<label id="38274.932683307">2019-08-19T10:37:54.932683307 cras atlog  SLEEP                          sleep:000000000.020659279 longest_wake:001565104</label>
-<label id="38274.932746675">2019-08-19T10:37:54.932746675 cras atlog  WAKE                           num_fds:1</label>
-<label id="38274.932802037">2019-08-19T10:37:54.932802037 cras atlog  FILL_AUDIO_TSTAMP              dev:6 tstamp: 10:37:54.932799966</label>
-<label id="38274.932804355">2019-08-19T10:37:54.932804355 cras atlog  FILL_AUDIO                     dev:6 hw_level:1040</label>
-<label id="38274.932807409">2019-08-19T10:37:54.932807409 cras atlog  WRITE_STREAMS_STREAM           id:1d0000 shm_frames:1024 cb_pending:0</label>
-<label id="38274.932821550">2019-08-19T10:37:54.932821550 cras atlog  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0</label>
-<label id="38274.932826892">2019-08-19T10:37:54.932826892 cras atlog  DEV_STREAM_MIX                 written:1024 read:1024</label>
-<label id="38274.932829082">2019-08-19T10:37:54.932829082 cras atlog  WRITE_STREAMS_MIXED            write_limit:1024</label>
-<label id="38274.933108135">2019-08-19T10:37:54.933108135 cras atlog  FILL_AUDIO_DONE                hw_level:1040 total_written:1024 min_cb_level:1024</label>
-<label id="38274.933129716">2019-08-19T10:37:54.933129716 cras atlog  SET_DEV_WAKE                   dev:6 hw_level:2016 sleep:1968</label>
-<label id="38274.933131709">2019-08-19T10:37:54.933131709 cras atlog  DEV_SLEEP_TIME                 dev:6 wake: 10:37:54.974126349</label>
-<label id="38274.933136150">2019-08-19T10:37:54.933136150 cras atlog  STREAM_SLEEP_TIME              id:1d0000 wake: 10:37:54.953654720</label>
-<label id="38274.933140489">2019-08-19T10:37:54.933140489 cras atlog  SLEEP                          sleep:000000000.020520690 longest_wake:001565104</label>
-<label id="38274.953927204">2019-08-19T10:37:54.953927204 cras atlog  WAKE                           num_fds:0</label>
-<label id="38274.953964062">2019-08-19T10:37:54.953964062 cras atlog  WRITE_STREAMS_FETCH_STREAM     id:1d0000 cbth:1024 delay:1296</label>
-<label id="38274.954027217">2019-08-19T10:37:54.954027217 cras atlog  FILL_AUDIO_TSTAMP              dev:6 tstamp: 10:37:54.954024954</label>
-<label id="38274.954030314">2019-08-19T10:37:54.954030314 cras atlog  FILL_AUDIO                     dev:6 hw_level:1008</label>
-<label id="38274.954036483">2019-08-19T10:37:54.954036483 cras atlog  WRITE_STREAMS_STREAM           id:1d0000 shm_frames:0 cb_pending:1</label>
-<label id="38274.954038676">2019-08-19T10:37:54.954038676 cras atlog  WRITE_STREAMS_MIX              write_limit:0 max_offset:0</label>
-<label id="38274.954041528">2019-08-19T10:37:54.954041528 cras atlog  WRITE_STREAMS_MIXED            write_limit:0</label>
-<label id="38274.954047105">2019-08-19T10:37:54.954047105 cras atlog  FILL_AUDIO_DONE                hw_level:1008 total_written:0 min_cb_level:1024</label>
-<label id="38274.954067674">2019-08-19T10:37:54.954067674 cras atlog  SET_DEV_WAKE                   dev:6 hw_level:1008 sleep:960</label>
-<label id="38274.954069771">2019-08-19T10:37:54.954069771 cras atlog  DEV_SLEEP_TIME                 dev:6 wake: 10:37:54.974064924</label>
-<label id="38274.954077360">2019-08-19T10:37:54.954077360 cras atlog  SLEEP                          sleep:000000000.019992481 longest_wake:001565104</label>
-<label id="38274.954106963">2019-08-19T10:37:54.954106963 cras atlog  WAKE                           num_fds:1</label>
-<label id="38274.954157230">2019-08-19T10:37:54.954157230 cras atlog  FILL_AUDIO_TSTAMP              dev:6 tstamp: 10:37:54.954155178</label>
-<label id="38274.954159335">2019-08-19T10:37:54.954159335 cras atlog  FILL_AUDIO                     dev:6 hw_level:1008</label>
-<label id="38274.954162037">2019-08-19T10:37:54.954162037 cras atlog  WRITE_STREAMS_STREAM           id:1d0000 shm_frames:1024 cb_pending:0</label>
-<label id="38274.954177049">2019-08-19T10:37:54.954177049 cras atlog  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0</label>
-<label id="38274.954182292">2019-08-19T10:37:54.954182292 cras atlog  DEV_STREAM_MIX                 written:1024 read:1024</label>
-<label id="38274.954184412">2019-08-19T10:37:54.954184412 cras atlog  WRITE_STREAMS_MIXED            write_limit:1024</label>
-<label id="38274.954439987">2019-08-19T10:37:54.954439987 cras atlog  WRITE_STREAMS_STREAM           id:1d0000 shm_frames:0 cb_pending:0</label>
-<label id="38274.954442042">2019-08-19T10:37:54.954442042 cras atlog  WRITE_STREAMS_MIX              write_limit:0 max_offset:0</label>
-<label id="38274.954444204">2019-08-19T10:37:54.954444204 cras atlog  WRITE_STREAMS_MIXED            write_limit:0</label>
-<label id="38274.954446985">2019-08-19T10:37:54.954446985 cras atlog  FILL_AUDIO_DONE                hw_level:1008 total_written:1024 min_cb_level:1024</label>
-<label id="38274.954466654">2019-08-19T10:37:54.954466654 cras atlog  SET_DEV_WAKE                   dev:6 hw_level:2032 sleep:1984</label>
-<label id="38274.954468696">2019-08-19T10:37:54.954468696 cras atlog  DEV_SLEEP_TIME                 dev:6 wake: 10:37:54.995797668</label>
-<label id="38274.954473224">2019-08-19T10:37:54.954473224 cras atlog  STREAM_SLEEP_TIME              id:1d0000 wake: 10:37:54.974988053</label>
-<label id="38274.954477555">2019-08-19T10:37:54.954477555 cras atlog  SLEEP                          sleep:000000000.020517058 longest_wake:001565104</label>
-<label id="38274.975550997">2019-08-19T10:37:54.975550997 cras atlog  WAKE                           num_fds:0</label>
-<label id="38274.975595442">2019-08-19T10:37:54.975595442 cras atlog  WRITE_STREAMS_FETCH_STREAM     id:1d0000 cbth:1024 delay:1312</label>
-<label id="38274.975640808">2019-08-19T10:37:54.975640808 cras atlog  FILL_AUDIO_TSTAMP              dev:6 tstamp: 10:37:54.975638709</label>
-<label id="38274.975643692">2019-08-19T10:37:54.975643692 cras atlog  FILL_AUDIO                     dev:6 hw_level:1024</label>
-<label id="38274.975649536">2019-08-19T10:37:54.975649536 cras atlog  WRITE_STREAMS_STREAM           id:1d0000 shm_frames:0 cb_pending:1</label>
-<label id="38274.975651738">2019-08-19T10:37:54.975651738 cras atlog  WRITE_STREAMS_MIX              write_limit:0 max_offset:0</label>
-<label id="38274.975654643">2019-08-19T10:37:54.975654643 cras atlog  WRITE_STREAMS_MIXED            write_limit:0</label>
-<label id="38274.975660861">2019-08-19T10:37:54.975660861 cras atlog  FILL_AUDIO_DONE                hw_level:1024 total_written:0 min_cb_level:1024</label>
-<label id="38274.975680354">2019-08-19T10:37:54.975680354 cras atlog  SET_DEV_WAKE                   dev:6 hw_level:1024 sleep:976</label>
-<label id="38274.975682447">2019-08-19T10:37:54.975682447 cras atlog  DEV_SLEEP_TIME                 dev:6 wake: 10:37:54.996011143</label>
-<label id="38274.975690215">2019-08-19T10:37:54.975690215 cras atlog  SLEEP                          sleep:000000000.020326081 longest_wake:001565104</label>
-<label id="38274.975750291">2019-08-19T10:37:54.975750291 cras atlog  WAKE                           num_fds:1</label>
-<label id="38274.975805101">2019-08-19T10:37:54.975805101 cras atlog  FILL_AUDIO_TSTAMP              dev:6 tstamp: 10:37:54.975802996</label>
-<label id="38274.975807387">2019-08-19T10:37:54.975807387 cras atlog  FILL_AUDIO                     dev:6 hw_level:1024</label>
-<label id="38274.975810666">2019-08-19T10:37:54.975810666 cras atlog  WRITE_STREAMS_STREAM           id:1d0000 shm_frames:1024 cb_pending:0</label>
-<label id="38274.975813858">2019-08-19T10:37:54.975813858 cras atlog  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0</label>
-<label id="38274.975818840">2019-08-19T10:37:54.975818840 cras atlog  DEV_STREAM_MIX                 written:1024 read:1024</label>
-<label id="38274.975820997">2019-08-19T10:37:54.975820997 cras atlog  WRITE_STREAMS_MIXED            write_limit:1024</label>
-<label id="38274.976100465">2019-08-19T10:37:54.976100465 cras atlog  FILL_AUDIO_DONE                hw_level:1024 total_written:1024 min_cb_level:1024</label>
-<label id="38274.976120622">2019-08-19T10:37:54.976120622 cras atlog  SET_DEV_WAKE                   dev:6 hw_level:2000 sleep:1952</label>
-<label id="38274.976122691">2019-08-19T10:37:54.976122691 cras atlog  DEV_SLEEP_TIME                 dev:6 wake: 10:37:55.016784703</label>
-<label id="38274.976127066">2019-08-19T10:37:54.976127066 cras atlog  STREAM_SLEEP_TIME              id:1d0000 wake: 10:37:54.996321386</label>
-<label id="38274.976131378">2019-08-19T10:37:54.976131378 cras atlog  SLEEP                          sleep:000000000.020196437 longest_wake:001565104</label>
-<label id="38274.996575651">2019-08-19T10:37:54.996575651 cras atlog  WAKE                           num_fds:0</label>
-<label id="38274.996619059">2019-08-19T10:37:54.996619059 cras atlog  WRITE_STREAMS_FETCH_STREAM     id:1d0000 cbth:1024 delay:1328</label>
-<label id="38274.996664756">2019-08-19T10:37:54.996664756 cras atlog  FILL_AUDIO_TSTAMP              dev:6 tstamp: 10:37:54.996662645</label>
-<label id="38274.996667671">2019-08-19T10:37:54.996667671 cras atlog  FILL_AUDIO                     dev:6 hw_level:1040</label>
-<label id="38274.996673482">2019-08-19T10:37:54.996673482 cras atlog  WRITE_STREAMS_STREAM           id:1d0000 shm_frames:0 cb_pending:1</label>
-<label id="38274.996675649">2019-08-19T10:37:54.996675649 cras atlog  WRITE_STREAMS_MIX              write_limit:0 max_offset:0</label>
-<label id="38274.996678438">2019-08-19T10:37:54.996678438 cras atlog  WRITE_STREAMS_MIXED            write_limit:0</label>
-<label id="38274.996684371">2019-08-19T10:37:54.996684371 cras atlog  FILL_AUDIO_DONE                hw_level:1040 total_written:0 min_cb_level:1024</label>
-<label id="38274.996704048">2019-08-19T10:37:54.996704048 cras atlog  SET_DEV_WAKE                   dev:6 hw_level:1040 sleep:992</label>
-<label id="38274.996706108">2019-08-19T10:37:54.996706108 cras atlog  DEV_SLEEP_TIME                 dev:6 wake: 10:37:55.017368028</label>
-<label id="38274.996713503">2019-08-19T10:37:54.996713503 cras atlog  SLEEP                          sleep:000000000.020659377 longest_wake:001565104</label>
-<label id="38274.996775539">2019-08-19T10:37:54.996775539 cras atlog  WAKE                           num_fds:1</label>
-<label id="38274.996831459">2019-08-19T10:37:54.996831459 cras atlog  FILL_AUDIO_TSTAMP              dev:6 tstamp: 10:37:54.996829346</label>
-<label id="38274.996833804">2019-08-19T10:37:54.996833804 cras atlog  FILL_AUDIO                     dev:6 hw_level:1040</label>
-<label id="38274.996837127">2019-08-19T10:37:54.996837127 cras atlog  WRITE_STREAMS_STREAM           id:1d0000 shm_frames:1024 cb_pending:0</label>
-<label id="38274.996840252">2019-08-19T10:37:54.996840252 cras atlog  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0</label>
-<label id="38274.996845333">2019-08-19T10:37:54.996845333 cras atlog  DEV_STREAM_MIX                 written:1024 read:1024</label>
-<label id="38274.996847487">2019-08-19T10:37:54.996847487 cras atlog  WRITE_STREAMS_MIXED            write_limit:1024</label>
-<label id="38274.997125727">2019-08-19T10:37:54.997125727 cras atlog  FILL_AUDIO_DONE                hw_level:1040 total_written:1024 min_cb_level:1024</label>
-<label id="38274.997146185">2019-08-19T10:37:54.997146185 cras atlog  SET_DEV_WAKE                   dev:6 hw_level:2016 sleep:1968</label>
-<label id="38274.997148232">2019-08-19T10:37:54.997148232 cras atlog  DEV_SLEEP_TIME                 dev:6 wake: 10:37:55.038143682</label>
-<label id="38274.997152901">2019-08-19T10:37:54.997152901 cras atlog  STREAM_SLEEP_TIME              id:1d0000 wake: 10:37:55.017654719</label>
-<label id="38274.997157330">2019-08-19T10:37:54.997157330 cras atlog  SLEEP                          sleep:000000000.020504113 longest_wake:001565104</label>
-<label id="38275.017787246">2019-08-19T10:37:55.017787246 cras atlog  WAKE                           num_fds:0</label>
-<label id="38275.017830417">2019-08-19T10:37:55.017830417 cras atlog  WRITE_STREAMS_FETCH_STREAM     id:1d0000 cbth:1024 delay:1344</label>
-<label id="38275.017874949">2019-08-19T10:37:55.017874949 cras atlog  FILL_AUDIO_TSTAMP              dev:6 tstamp: 10:37:55.017872854</label>
-<label id="38275.017877797">2019-08-19T10:37:55.017877797 cras atlog  FILL_AUDIO                     dev:6 hw_level:1056</label>
-<label id="38275.017883494">2019-08-19T10:37:55.017883494 cras atlog  WRITE_STREAMS_STREAM           id:1d0000 shm_frames:0 cb_pending:1</label>
-<label id="38275.017885650">2019-08-19T10:37:55.017885650 cras atlog  WRITE_STREAMS_MIX              write_limit:0 max_offset:0</label>
-<label id="38275.017888461">2019-08-19T10:37:55.017888461 cras atlog  WRITE_STREAMS_MIXED            write_limit:0</label>
-<label id="38275.017894387">2019-08-19T10:37:55.017894387 cras atlog  FILL_AUDIO_DONE                hw_level:1056 total_written:0 min_cb_level:1024</label>
-<label id="38275.017914904">2019-08-19T10:37:55.017914904 cras atlog  SET_DEV_WAKE                   dev:6 hw_level:1056 sleep:1008</label>
-<label id="38275.017917003">2019-08-19T10:37:55.017917003 cras atlog  DEV_SLEEP_TIME                 dev:6 wake: 10:37:55.038912232</label>
-<label id="38275.017924426">2019-08-19T10:37:55.017924426 cras atlog  SLEEP                          sleep:000000000.020992719 longest_wake:001565104</label>
-<label id="38275.017961913">2019-08-19T10:37:55.017961913 cras atlog  WAKE                           num_fds:1</label>
-<label id="38275.018028433">2019-08-19T10:37:55.018028433 cras atlog  FILL_AUDIO_TSTAMP              dev:6 tstamp: 10:37:55.018026226</label>
-<label id="38275.018030670">2019-08-19T10:37:55.018030670 cras atlog  FILL_AUDIO                     dev:6 hw_level:1008</label>
-<label id="38275.018034173">2019-08-19T10:37:55.018034173 cras atlog  WRITE_STREAMS_STREAM           id:1d0000 shm_frames:1024 cb_pending:0</label>
-<label id="38275.018037396">2019-08-19T10:37:55.018037396 cras atlog  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0</label>
-<label id="38275.018042811">2019-08-19T10:37:55.018042811 cras atlog  DEV_STREAM_MIX                 written:1024 read:1024</label>
-<label id="38275.018044970">2019-08-19T10:37:55.018044970 cras atlog  WRITE_STREAMS_MIXED            write_limit:1024</label>
-<label id="38275.018299235">2019-08-19T10:37:55.018299235 cras atlog  FILL_AUDIO_DONE                hw_level:1008 total_written:1024 min_cb_level:1024</label>
-<label id="38275.018320047">2019-08-19T10:37:55.018320047 cras atlog  SET_DEV_WAKE                   dev:6 hw_level:2032 sleep:1984</label>
-<label id="38275.018322052">2019-08-19T10:37:55.018322052 cras atlog  DEV_SLEEP_TIME                 dev:6 wake: 10:37:55.059651033</label>
-<label id="38275.018326693">2019-08-19T10:37:55.018326693 cras atlog  STREAM_SLEEP_TIME              id:1d0000 wake: 10:37:55.038988052</label>
-<label id="38275.018331332">2019-08-19T10:37:55.018331332 cras atlog  SLEEP                          sleep:000000000.020663485 longest_wake:001565104</label>
-<label id="38275.039056011">2019-08-19T10:37:55.039056011 cras atlog  WAKE                           num_fds:0</label>
-<label id="38275.039099808">2019-08-19T10:37:55.039099808 cras atlog  WRITE_STREAMS_FETCH_STREAM     id:1d0000 cbth:1024 delay:1312</label>
-<label id="38275.039142359">2019-08-19T10:37:55.039142359 cras atlog  FILL_AUDIO_TSTAMP              dev:6 tstamp: 10:37:55.039140236</label>
-<label id="38275.039145228">2019-08-19T10:37:55.039145228 cras atlog  FILL_AUDIO                     dev:6 hw_level:1024</label>
-<label id="38275.039150986">2019-08-19T10:37:55.039150986 cras atlog  WRITE_STREAMS_STREAM           id:1d0000 shm_frames:0 cb_pending:1</label>
-<label id="38275.039153113">2019-08-19T10:37:55.039153113 cras atlog  WRITE_STREAMS_MIX              write_limit:0 max_offset:0</label>
-<label id="38275.039155910">2019-08-19T10:37:55.039155910 cras atlog  WRITE_STREAMS_MIXED            write_limit:0</label>
-<label id="38275.039161845">2019-08-19T10:37:55.039161845 cras atlog  FILL_AUDIO_DONE                hw_level:1024 total_written:0 min_cb_level:1024</label>
-<label id="38275.039181369">2019-08-19T10:37:55.039181369 cras atlog  SET_DEV_WAKE                   dev:6 hw_level:1024 sleep:976</label>
-<label id="38275.039183576">2019-08-19T10:37:55.039183576 cras atlog  DEV_SLEEP_TIME                 dev:6 wake: 10:37:55.059512041</label>
-<label id="38275.039191418">2019-08-19T10:37:55.039191418 cras atlog  SLEEP                          sleep:000000000.020325678 longest_wake:001565104</label>
-<label id="38275.039242696">2019-08-19T10:37:55.039242696 cras atlog  WAKE                           num_fds:1</label>
-<label id="38275.039300872">2019-08-19T10:37:55.039300872 cras atlog  FILL_AUDIO_TSTAMP              dev:6 tstamp: 10:37:55.039298791</label>
-<label id="38275.039303282">2019-08-19T10:37:55.039303282 cras atlog  FILL_AUDIO                     dev:6 hw_level:1024</label>
-<label id="38275.039307147">2019-08-19T10:37:55.039307147 cras atlog  WRITE_STREAMS_STREAM           id:1d0000 shm_frames:1024 cb_pending:0</label>
-<label id="38275.039310453">2019-08-19T10:37:55.039310453 cras atlog  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0</label>
-<label id="38275.039315591">2019-08-19T10:37:55.039315591 cras atlog  DEV_STREAM_MIX                 written:1024 read:1024</label>
-<label id="38275.039317911">2019-08-19T10:37:55.039317911 cras atlog  WRITE_STREAMS_MIXED            write_limit:1024</label>
-<label id="38275.039574431">2019-08-19T10:37:55.039574431 cras atlog  FILL_AUDIO_DONE                hw_level:1024 total_written:1024 min_cb_level:1024</label>
-<label id="38275.039595139">2019-08-19T10:37:55.039595139 cras atlog  SET_DEV_WAKE                   dev:6 hw_level:2048 sleep:2000</label>
-<label id="38275.039597215">2019-08-19T10:37:55.039597215 cras atlog  DEV_SLEEP_TIME                 dev:6 wake: 10:37:55.081259079</label>
-<label id="38275.039602049">2019-08-19T10:37:55.039602049 cras atlog  STREAM_SLEEP_TIME              id:1d0000 wake: 10:37:55.060321385</label>
-<label id="38275.039606641">2019-08-19T10:37:55.039606641 cras atlog  SLEEP                          sleep:000000000.020721508 longest_wake:001565104</label>
-<label id="38275.060641094">2019-08-19T10:37:55.060641094 cras atlog  WAKE                           num_fds:0</label>
-<label id="38275.060684606">2019-08-19T10:37:55.060684606 cras atlog  WRITE_STREAMS_FETCH_STREAM     id:1d0000 cbth:1024 delay:1328</label>
-<label id="38275.060729748">2019-08-19T10:37:55.060729748 cras atlog  FILL_AUDIO_TSTAMP              dev:6 tstamp: 10:37:55.060727630</label>
-<label id="38275.060732607">2019-08-19T10:37:55.060732607 cras atlog  FILL_AUDIO                     dev:6 hw_level:1040</label>
-<label id="38275.060738367">2019-08-19T10:37:55.060738367 cras atlog  WRITE_STREAMS_STREAM           id:1d0000 shm_frames:0 cb_pending:1</label>
-<label id="38275.060740520">2019-08-19T10:37:55.060740520 cras atlog  WRITE_STREAMS_MIX              write_limit:0 max_offset:0</label>
-<label id="38275.060743314">2019-08-19T10:37:55.060743314 cras atlog  WRITE_STREAMS_MIXED            write_limit:0</label>
-<label id="38275.060749371">2019-08-19T10:37:55.060749371 cras atlog  FILL_AUDIO_DONE                hw_level:1040 total_written:0 min_cb_level:1024</label>
-<label id="38275.060769291">2019-08-19T10:37:55.060769291 cras atlog  SET_DEV_WAKE                   dev:6 hw_level:1040 sleep:992</label>
-<label id="38275.060771405">2019-08-19T10:37:55.060771405 cras atlog  DEV_SLEEP_TIME                 dev:6 wake: 10:37:55.081432962</label>
-<label id="38275.060778851">2019-08-19T10:37:55.060778851 cras atlog  SLEEP                          sleep:000000000.020659012 longest_wake:001565104</label>
-<label id="38275.060839575">2019-08-19T10:37:55.060839575 cras atlog  WAKE                           num_fds:1</label>
-<label id="38275.060894607">2019-08-19T10:37:55.060894607 cras atlog  FILL_AUDIO_TSTAMP              dev:6 tstamp: 10:37:55.060892493</label>
-<label id="38275.060896906">2019-08-19T10:37:55.060896906 cras atlog  FILL_AUDIO                     dev:6 hw_level:1040</label>
-<label id="38275.060900273">2019-08-19T10:37:55.060900273 cras atlog  WRITE_STREAMS_STREAM           id:1d0000 shm_frames:1024 cb_pending:0</label>
-<label id="38275.060903465">2019-08-19T10:37:55.060903465 cras atlog  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0</label>
-<label id="38275.060908541">2019-08-19T10:37:55.060908541 cras atlog  DEV_STREAM_MIX                 written:1024 read:1024</label>
-<label id="38275.060910667">2019-08-19T10:37:55.060910667 cras atlog  WRITE_STREAMS_MIXED            write_limit:1024</label>
-<label id="38275.061189546">2019-08-19T10:37:55.061189546 cras atlog  FILL_AUDIO_DONE                hw_level:1040 total_written:1024 min_cb_level:1024</label>
-<label id="38275.061209809">2019-08-19T10:37:55.061209809 cras atlog  SET_DEV_WAKE                   dev:6 hw_level:2016 sleep:1968</label>
-<label id="38275.061211862">2019-08-19T10:37:55.061211862 cras atlog  DEV_SLEEP_TIME                 dev:6 wake: 10:37:55.102207100</label>
-<label id="38275.061216513">2019-08-19T10:37:55.061216513 cras atlog  STREAM_SLEEP_TIME              id:1d0000 wake: 10:37:55.081654718</label>
-<label id="38275.061221096">2019-08-19T10:37:55.061221096 cras atlog  SLEEP                          sleep:000000000.020440532 longest_wake:001565104</label>
-<label id="38275.081923521">2019-08-19T10:37:55.081923521 cras atlog  WAKE                           num_fds:0</label>
-<label id="38275.081962397">2019-08-19T10:37:55.081962397 cras atlog  WRITE_STREAMS_FETCH_STREAM     id:1d0000 cbth:1024 delay:1344</label>
-<label id="38275.082024685">2019-08-19T10:37:55.082024685 cras atlog  FILL_AUDIO_TSTAMP              dev:6 tstamp: 10:37:55.082022354</label>
-<label id="38275.082027553">2019-08-19T10:37:55.082027553 cras atlog  FILL_AUDIO                     dev:6 hw_level:1008</label>
-<label id="38275.082033348">2019-08-19T10:37:55.082033348 cras atlog  WRITE_STREAMS_STREAM           id:1d0000 shm_frames:0 cb_pending:1</label>
-<label id="38275.082035492">2019-08-19T10:37:55.082035492 cras atlog  WRITE_STREAMS_MIX              write_limit:0 max_offset:0</label>
-<label id="38275.082038363">2019-08-19T10:37:55.082038363 cras atlog  WRITE_STREAMS_MIXED            write_limit:0</label>
-<label id="38275.082044372">2019-08-19T10:37:55.082044372 cras atlog  FILL_AUDIO_DONE                hw_level:1008 total_written:0 min_cb_level:1024</label>
-<label id="38275.082064736">2019-08-19T10:37:55.082064736 cras atlog  SET_DEV_WAKE                   dev:6 hw_level:1008 sleep:960</label>
-<label id="38275.082066844">2019-08-19T10:37:55.082066844 cras atlog  DEV_SLEEP_TIME                 dev:6 wake: 10:37:55.102062036</label>
-<label id="38275.082074672">2019-08-19T10:37:55.082074672 cras atlog  SLEEP                          sleep:000000000.019992279 longest_wake:001565104</label>
-<label id="38275.082101703">2019-08-19T10:37:55.082101703 cras atlog  WAKE                           num_fds:1</label>
-<label id="38275.082151613">2019-08-19T10:37:55.082151613 cras atlog  FILL_AUDIO_TSTAMP              dev:6 tstamp: 10:37:55.082149632</label>
-<label id="38275.082153665">2019-08-19T10:37:55.082153665 cras atlog  FILL_AUDIO                     dev:6 hw_level:1008</label>
-<label id="38275.082156304">2019-08-19T10:37:55.082156304 cras atlog  WRITE_STREAMS_STREAM           id:1d0000 shm_frames:1024 cb_pending:0</label>
-<label id="38275.082159578">2019-08-19T10:37:55.082159578 cras atlog  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0</label>
-<label id="38275.082164588">2019-08-19T10:37:55.082164588 cras atlog  DEV_STREAM_MIX                 written:1024 read:1024</label>
-<label id="38275.082166781">2019-08-19T10:37:55.082166781 cras atlog  WRITE_STREAMS_MIXED            write_limit:1024</label>
-<label id="38275.082420700">2019-08-19T10:37:55.082420700 cras atlog  FILL_AUDIO_DONE                hw_level:1008 total_written:1024 min_cb_level:1024</label>
-<label id="38275.082440331">2019-08-19T10:37:55.082440331 cras atlog  SET_DEV_WAKE                   dev:6 hw_level:2032 sleep:1984</label>
-<label id="38275.082442354">2019-08-19T10:37:55.082442354 cras atlog  DEV_SLEEP_TIME                 dev:6 wake: 10:37:55.123771185</label>
-<label id="38275.082446864">2019-08-19T10:37:55.082446864 cras atlog  STREAM_SLEEP_TIME              id:1d0000 wake: 10:37:55.102988051</label>
-<label id="38275.082451229">2019-08-19T10:37:55.082451229 cras atlog  SLEEP                          sleep:000000000.020543317 longest_wake:001565104</label>
-<label id="38275.103235081">2019-08-19T10:37:55.103235081 cras atlog  WAKE                           num_fds:0</label>
-<label id="38275.103278902">2019-08-19T10:37:55.103278902 cras atlog  WRITE_STREAMS_FETCH_STREAM     id:1d0000 cbth:1024 delay:1312</label>
-<label id="38275.103323855">2019-08-19T10:37:55.103323855 cras atlog  FILL_AUDIO_TSTAMP              dev:6 tstamp: 10:37:55.103321735</label>
-<label id="38275.103326735">2019-08-19T10:37:55.103326735 cras atlog  FILL_AUDIO                     dev:6 hw_level:1024</label>
-<label id="38275.103332368">2019-08-19T10:37:55.103332368 cras atlog  WRITE_STREAMS_STREAM           id:1d0000 shm_frames:0 cb_pending:1</label>
-<label id="38275.103334547">2019-08-19T10:37:55.103334547 cras atlog  WRITE_STREAMS_MIX              write_limit:0 max_offset:0</label>
-<label id="38275.103337442">2019-08-19T10:37:55.103337442 cras atlog  WRITE_STREAMS_MIXED            write_limit:0</label>
-<label id="38275.103343414">2019-08-19T10:37:55.103343414 cras atlog  FILL_AUDIO_DONE                hw_level:1024 total_written:0 min_cb_level:1024</label>
-<label id="38275.103362951">2019-08-19T10:37:55.103362951 cras atlog  SET_DEV_WAKE                   dev:6 hw_level:1024 sleep:976</label>
-<label id="38275.103365027">2019-08-19T10:37:55.103365027 cras atlog  DEV_SLEEP_TIME                 dev:6 wake: 10:37:55.123693749</label>
-<label id="38275.103372515">2019-08-19T10:37:55.103372515 cras atlog  SLEEP                          sleep:000000000.020326206 longest_wake:001565104</label>
-<label id="38275.103495004">2019-08-19T10:37:55.103495004 cras atlog  WAKE                           num_fds:1</label>
-<label id="38275.103558662">2019-08-19T10:37:55.103558662 cras atlog  FILL_AUDIO_TSTAMP              dev:6 tstamp: 10:37:55.103556509</label>
-<label id="38275.103561185">2019-08-19T10:37:55.103561185 cras atlog  FILL_AUDIO                     dev:6 hw_level:1024</label>
-<label id="38275.103565634">2019-08-19T10:37:55.103565634 cras atlog  WRITE_STREAMS_STREAM           id:1d0000 shm_frames:1024 cb_pending:0</label>
-<label id="38275.103568909">2019-08-19T10:37:55.103568909 cras atlog  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0</label>
-<label id="38275.103574106">2019-08-19T10:37:55.103574106 cras atlog  DEV_STREAM_MIX                 written:1024 read:1024</label>
-<label id="38275.103576534">2019-08-19T10:37:55.103576534 cras atlog  WRITE_STREAMS_MIXED            write_limit:1024</label>
-<label id="38275.103894760">2019-08-19T10:37:55.103894760 cras atlog  FILL_AUDIO_DONE                hw_level:1024 total_written:1024 min_cb_level:1024</label>
-<label id="38275.103915541">2019-08-19T10:37:55.103915541 cras atlog  SET_DEV_WAKE                   dev:6 hw_level:2048 sleep:2000</label>
-<label id="38275.103917608">2019-08-19T10:37:55.103917608 cras atlog  DEV_SLEEP_TIME                 dev:6 wake: 10:37:55.145579387</label>
-<label id="38275.103922443">2019-08-19T10:37:55.103922443 cras atlog  STREAM_SLEEP_TIME              id:1d0000 wake: 10:37:55.124321384</label>
-<label id="38275.103927126">2019-08-19T10:37:55.103927126 cras atlog  SLEEP                          sleep:000000000.020401063 longest_wake:001565104</label>
-<label id="38275.124565623">2019-08-19T10:37:55.124565623 cras atlog  WAKE                           num_fds:0</label>
-<label id="38275.124610042">2019-08-19T10:37:55.124610042 cras atlog  WRITE_STREAMS_FETCH_STREAM     id:1d0000 cbth:1024 delay:1328</label>
-<label id="38275.124655051">2019-08-19T10:37:55.124655051 cras atlog  FILL_AUDIO_TSTAMP              dev:6 tstamp: 10:37:55.124652899</label>
-<label id="38275.124657946">2019-08-19T10:37:55.124657946 cras atlog  FILL_AUDIO                     dev:6 hw_level:1040</label>
-<label id="38275.124663566">2019-08-19T10:37:55.124663566 cras atlog  WRITE_STREAMS_STREAM           id:1d0000 shm_frames:0 cb_pending:1</label>
-<label id="38275.124665720">2019-08-19T10:37:55.124665720 cras atlog  WRITE_STREAMS_MIX              write_limit:0 max_offset:0</label>
-<label id="38275.124668612">2019-08-19T10:37:55.124668612 cras atlog  WRITE_STREAMS_MIXED            write_limit:0</label>
-<label id="38275.124674855">2019-08-19T10:37:55.124674855 cras atlog  FILL_AUDIO_DONE                hw_level:1040 total_written:0 min_cb_level:1024</label>
-<label id="38275.124694671">2019-08-19T10:37:55.124694671 cras atlog  SET_DEV_WAKE                   dev:6 hw_level:1040 sleep:992</label>
-<label id="38275.124696783">2019-08-19T10:37:55.124696783 cras atlog  DEV_SLEEP_TIME                 dev:6 wake: 10:37:55.145358605</label>
-<label id="38275.124704191">2019-08-19T10:37:55.124704191 cras atlog  SLEEP                          sleep:000000000.020659309 longest_wake:001565104</label>
-<label id="38275.124760504">2019-08-19T10:37:55.124760504 cras atlog  WAKE                           num_fds:1</label>
-<label id="38275.124816244">2019-08-19T10:37:55.124816244 cras atlog  FILL_AUDIO_TSTAMP              dev:6 tstamp: 10:37:55.124814108</label>
-<label id="38275.124818548">2019-08-19T10:37:55.124818548 cras atlog  FILL_AUDIO                     dev:6 hw_level:1040</label>
-<label id="38275.124821764">2019-08-19T10:37:55.124821764 cras atlog  WRITE_STREAMS_STREAM           id:1d0000 shm_frames:1024 cb_pending:0</label>
-<label id="38275.124825000">2019-08-19T10:37:55.124825000 cras atlog  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0</label>
-<label id="38275.124830095">2019-08-19T10:37:55.124830095 cras atlog  DEV_STREAM_MIX                 written:1024 read:1024</label>
-<label id="38275.124832256">2019-08-19T10:37:55.124832256 cras atlog  WRITE_STREAMS_MIXED            write_limit:1024</label>
-<label id="38275.125110455">2019-08-19T10:37:55.125110455 cras atlog  FILL_AUDIO_DONE                hw_level:1040 total_written:1024 min_cb_level:1024</label>
-<label id="38275.125130858">2019-08-19T10:37:55.125130858 cras atlog  SET_DEV_WAKE                   dev:6 hw_level:2016 sleep:1968</label>
-<label id="38275.125132923">2019-08-19T10:37:55.125132923 cras atlog  DEV_SLEEP_TIME                 dev:6 wake: 10:37:55.166128332</label>
-<label id="38275.125137438">2019-08-19T10:37:55.125137438 cras atlog  STREAM_SLEEP_TIME              id:1d0000 wake: 10:37:55.145654717</label>
-<label id="38275.125141823">2019-08-19T10:37:55.125141823 cras atlog  SLEEP                          sleep:000000000.020519397 longest_wake:001565104</label>
-<label id="38275.145927558">2019-08-19T10:37:55.145927558 cras atlog  WAKE                           num_fds:0</label>
-<label id="38275.145964152">2019-08-19T10:37:55.145964152 cras atlog  WRITE_STREAMS_FETCH_STREAM     id:1d0000 cbth:1024 delay:1296</label>
-<label id="38275.146026003">2019-08-19T10:37:55.146026003 cras atlog  FILL_AUDIO_TSTAMP              dev:6 tstamp: 10:37:55.146023734</label>
-<label id="38275.146029029">2019-08-19T10:37:55.146029029 cras atlog  FILL_AUDIO                     dev:6 hw_level:1008</label>
-<label id="38275.146034797">2019-08-19T10:37:55.146034797 cras atlog  WRITE_STREAMS_STREAM           id:1d0000 shm_frames:0 cb_pending:1</label>
-<label id="38275.146036944">2019-08-19T10:37:55.146036944 cras atlog  WRITE_STREAMS_MIX              write_limit:0 max_offset:0</label>
-<label id="38275.146039804">2019-08-19T10:37:55.146039804 cras atlog  WRITE_STREAMS_MIXED            write_limit:0</label>
-<label id="38275.146045532">2019-08-19T10:37:55.146045532 cras atlog  FILL_AUDIO_DONE                hw_level:1008 total_written:0 min_cb_level:1024</label>
-<label id="38275.146065845">2019-08-19T10:37:55.146065845 cras atlog  SET_DEV_WAKE                   dev:6 hw_level:1008 sleep:960</label>
-<label id="38275.146067907">2019-08-19T10:37:55.146067907 cras atlog  DEV_SLEEP_TIME                 dev:6 wake: 10:37:55.166063093</label>
-<label id="38275.146075679">2019-08-19T10:37:55.146075679 cras atlog  SLEEP                          sleep:000000000.019992516 longest_wake:001565104</label>
-<label id="38275.146104176">2019-08-19T10:37:55.146104176 cras atlog  WAKE                           num_fds:1</label>
-<label id="38275.146154911">2019-08-19T10:37:55.146154911 cras atlog  FILL_AUDIO_TSTAMP              dev:6 tstamp: 10:37:55.146152940</label>
-<label id="38275.146157000">2019-08-19T10:37:55.146157000 cras atlog  FILL_AUDIO                     dev:6 hw_level:1008</label>
-<label id="38275.146159732">2019-08-19T10:37:55.146159732 cras atlog  WRITE_STREAMS_STREAM           id:1d0000 shm_frames:1024 cb_pending:0</label>
-<label id="38275.146162656">2019-08-19T10:37:55.146162656 cras atlog  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0</label>
-<label id="38275.146167707">2019-08-19T10:37:55.146167707 cras atlog  DEV_STREAM_MIX                 written:1024 read:1024</label>
-<label id="38275.146169907">2019-08-19T10:37:55.146169907 cras atlog  WRITE_STREAMS_MIXED            write_limit:1024</label>
-<label id="38275.146425051">2019-08-19T10:37:55.146425051 cras atlog  FILL_AUDIO_DONE                hw_level:1008 total_written:1024 min_cb_level:1024</label>
-<label id="38275.146444659">2019-08-19T10:37:55.146444659 cras atlog  SET_DEV_WAKE                   dev:6 hw_level:2032 sleep:1984</label>
-<label id="38275.146446660">2019-08-19T10:37:55.146446660 cras atlog  DEV_SLEEP_TIME                 dev:6 wake: 10:37:55.187775515</label>
-<label id="38275.146451169">2019-08-19T10:37:55.146451169 cras atlog  STREAM_SLEEP_TIME              id:1d0000 wake: 10:37:55.166988050</label>
-<label id="38275.146455570">2019-08-19T10:37:55.146455570 cras atlog  SLEEP                          sleep:000000000.020539017 longest_wake:001565104</label>
-<label id="38275.167553074">2019-08-19T10:37:55.167553074 cras atlog  WAKE                           num_fds:0</label>
-<label id="38275.167594886">2019-08-19T10:37:55.167594886 cras atlog  WRITE_STREAMS_FETCH_STREAM     id:1d0000 cbth:1024 delay:1312</label>
-<label id="38275.167640114">2019-08-19T10:37:55.167640114 cras atlog  FILL_AUDIO_TSTAMP              dev:6 tstamp: 10:37:55.167637997</label>
-<label id="38275.167643000">2019-08-19T10:37:55.167643000 cras atlog  FILL_AUDIO                     dev:6 hw_level:1024</label>
-<label id="38275.167648699">2019-08-19T10:37:55.167648699 cras atlog  WRITE_STREAMS_STREAM           id:1d0000 shm_frames:0 cb_pending:1</label>
-<label id="38275.167650882">2019-08-19T10:37:55.167650882 cras atlog  WRITE_STREAMS_MIX              write_limit:0 max_offset:0</label>
-<label id="38275.167653697">2019-08-19T10:37:55.167653697 cras atlog  WRITE_STREAMS_MIXED            write_limit:0</label>
-<label id="38275.167659615">2019-08-19T10:37:55.167659615 cras atlog  FILL_AUDIO_DONE                hw_level:1024 total_written:0 min_cb_level:1024</label>
-<label id="38275.167679011">2019-08-19T10:37:55.167679011 cras atlog  SET_DEV_WAKE                   dev:6 hw_level:1024 sleep:976</label>
-<label id="38275.167681098">2019-08-19T10:37:55.167681098 cras atlog  DEV_SLEEP_TIME                 dev:6 wake: 10:37:55.188009795</label>
-<label id="38275.167688811">2019-08-19T10:37:55.167688811 cras atlog  SLEEP                          sleep:000000000.020326143 longest_wake:001565104</label>
-<label id="38275.167749677">2019-08-19T10:37:55.167749677 cras atlog  WAKE                           num_fds:1</label>
-<label id="38275.167804583">2019-08-19T10:37:55.167804583 cras atlog  FILL_AUDIO_TSTAMP              dev:6 tstamp: 10:37:55.167802506</label>
-<label id="38275.167806856">2019-08-19T10:37:55.167806856 cras atlog  FILL_AUDIO                     dev:6 hw_level:1024</label>
-<label id="38275.167810111">2019-08-19T10:37:55.167810111 cras atlog  WRITE_STREAMS_STREAM           id:1d0000 shm_frames:1024 cb_pending:0</label>
-<label id="38275.167813451">2019-08-19T10:37:55.167813451 cras atlog  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0</label>
-<label id="38275.167818458">2019-08-19T10:37:55.167818458 cras atlog  DEV_STREAM_MIX                 written:1024 read:1024</label>
-<label id="38275.167820591">2019-08-19T10:37:55.167820591 cras atlog  WRITE_STREAMS_MIXED            write_limit:1024</label>
-<label id="38275.168098935">2019-08-19T10:37:55.168098935 cras atlog  FILL_AUDIO_DONE                hw_level:1024 total_written:1024 min_cb_level:1024</label>
-<label id="38275.168119122">2019-08-19T10:37:55.168119122 cras atlog  SET_DEV_WAKE                   dev:6 hw_level:2000 sleep:1952</label>
-<label id="38275.168121172">2019-08-19T10:37:55.168121172 cras atlog  DEV_SLEEP_TIME                 dev:6 wake: 10:37:55.208783150</label>
-<label id="38275.168125546">2019-08-19T10:37:55.168125546 cras atlog  STREAM_SLEEP_TIME              id:1d0000 wake: 10:37:55.188321383</label>
-<label id="38275.168129938">2019-08-19T10:37:55.168129938 cras atlog  SLEEP                          sleep:000000000.020197922 longest_wake:001565104</label>
-<label id="38275.188638183">2019-08-19T10:37:55.188638183 cras atlog  WAKE                           num_fds:0</label>
-<label id="38275.188682360">2019-08-19T10:37:55.188682360 cras atlog  WRITE_STREAMS_FETCH_STREAM     id:1d0000 cbth:1024 delay:1328</label>
-<label id="38275.188727068">2019-08-19T10:37:55.188727068 cras atlog  FILL_AUDIO_TSTAMP              dev:6 tstamp: 10:37:55.188724948</label>
-<label id="38275.188729928">2019-08-19T10:37:55.188729928 cras atlog  FILL_AUDIO                     dev:6 hw_level:1040</label>
-<label id="38275.188735860">2019-08-19T10:37:55.188735860 cras atlog  WRITE_STREAMS_STREAM           id:1d0000 shm_frames:0 cb_pending:1</label>
-<label id="38275.188738005">2019-08-19T10:37:55.188738005 cras atlog  WRITE_STREAMS_MIX              write_limit:0 max_offset:0</label>
-<label id="38275.188740801">2019-08-19T10:37:55.188740801 cras atlog  WRITE_STREAMS_MIXED            write_limit:0</label>
-<label id="38275.188746886">2019-08-19T10:37:55.188746886 cras atlog  FILL_AUDIO_DONE                hw_level:1040 total_written:0 min_cb_level:1024</label>
-<label id="38275.188766573">2019-08-19T10:37:55.188766573 cras atlog  SET_DEV_WAKE                   dev:6 hw_level:1040 sleep:992</label>
-<label id="38275.188768680">2019-08-19T10:37:55.188768680 cras atlog  DEV_SLEEP_TIME                 dev:6 wake: 10:37:55.209430581</label>
-<label id="38275.188776647">2019-08-19T10:37:55.188776647 cras atlog  SLEEP                          sleep:000000000.020659030 longest_wake:001565104</label>
-<label id="38275.188837092">2019-08-19T10:37:55.188837092 cras atlog  WAKE                           num_fds:1</label>
-<label id="38275.188891865">2019-08-19T10:37:55.188891865 cras atlog  FILL_AUDIO_TSTAMP              dev:6 tstamp: 10:37:55.188889848</label>
-<label id="38275.188894276">2019-08-19T10:37:55.188894276 cras atlog  FILL_AUDIO                     dev:6 hw_level:1040</label>
-<label id="38275.188897503">2019-08-19T10:37:55.188897503 cras atlog  WRITE_STREAMS_STREAM           id:1d0000 shm_frames:1024 cb_pending:0</label>
-<label id="38275.188900748">2019-08-19T10:37:55.188900748 cras atlog  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0</label>
-<label id="38275.188905918">2019-08-19T10:37:55.188905918 cras atlog  DEV_STREAM_MIX                 written:1024 read:1024</label>
-<label id="38275.188908049">2019-08-19T10:37:55.188908049 cras atlog  WRITE_STREAMS_MIXED            write_limit:1024</label>
-<label id="38275.189185844">2019-08-19T10:37:55.189185844 cras atlog  FILL_AUDIO_DONE                hw_level:1040 total_written:1024 min_cb_level:1024</label>
-<label id="38275.189205852">2019-08-19T10:37:55.189205852 cras atlog  SET_DEV_WAKE                   dev:6 hw_level:2016 sleep:1968</label>
-<label id="38275.189207862">2019-08-19T10:37:55.189207862 cras atlog  DEV_SLEEP_TIME                 dev:6 wake: 10:37:55.230203316</label>
-<label id="38275.189212302">2019-08-19T10:37:55.189212302 cras atlog  STREAM_SLEEP_TIME              id:1d0000 wake: 10:37:55.209654716</label>
-<label id="38275.189216722">2019-08-19T10:37:55.189216722 cras atlog  SLEEP                          sleep:000000000.020444572 longest_wake:001565104</label>
-<label id="38275.209911683">2019-08-19T10:37:55.209911683 cras atlog  WAKE                           num_fds:0</label>
-<label id="38275.209955429">2019-08-19T10:37:55.209955429 cras atlog  WRITE_STREAMS_FETCH_STREAM     id:1d0000 cbth:1024 delay:1344</label>
-<label id="38275.210000864">2019-08-19T10:37:55.210000864 cras atlog  FILL_AUDIO_TSTAMP              dev:6 tstamp: 10:37:55.209998749</label>
-<label id="38275.210020752">2019-08-19T10:37:55.210020752 cras atlog  FILL_AUDIO                     dev:6 hw_level:1008</label>
-<label id="38275.210026614">2019-08-19T10:37:55.210026614 cras atlog  WRITE_STREAMS_STREAM           id:1d0000 shm_frames:0 cb_pending:1</label>
-<label id="38275.210028898">2019-08-19T10:37:55.210028898 cras atlog  WRITE_STREAMS_MIX              write_limit:0 max_offset:0</label>
-<label id="38275.210031723">2019-08-19T10:37:55.210031723 cras atlog  WRITE_STREAMS_MIXED            write_limit:0</label>
-<label id="38275.210038139">2019-08-19T10:37:55.210038139 cras atlog  FILL_AUDIO_DONE                hw_level:1008 total_written:0 min_cb_level:1024</label>
-<label id="38275.210058744">2019-08-19T10:37:55.210058744 cras atlog  SET_DEV_WAKE                   dev:6 hw_level:1008 sleep:960</label>
-<label id="38275.210060812">2019-08-19T10:37:55.210060812 cras atlog  DEV_SLEEP_TIME                 dev:6 wake: 10:37:55.230056030</label>
-<label id="38275.210068424">2019-08-19T10:37:55.210068424 cras atlog  SLEEP                          sleep:000000000.019992546 longest_wake:001565104</label>
-<label id="38275.210096165">2019-08-19T10:37:55.210096165 cras atlog  WAKE                           num_fds:1</label>
-<label id="38275.210146366">2019-08-19T10:37:55.210146366 cras atlog  FILL_AUDIO_TSTAMP              dev:6 tstamp: 10:37:55.210144294</label>
-<label id="38275.210148466">2019-08-19T10:37:55.210148466 cras atlog  FILL_AUDIO                     dev:6 hw_level:1008</label>
-<label id="38275.210151084">2019-08-19T10:37:55.210151084 cras atlog  WRITE_STREAMS_STREAM           id:1d0000 shm_frames:1024 cb_pending:0</label>
-<label id="38275.210154312">2019-08-19T10:37:55.210154312 cras atlog  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0</label>
-<label id="38275.210159347">2019-08-19T10:37:55.210159347 cras atlog  DEV_STREAM_MIX                 written:1024 read:1024</label>
-<label id="38275.210161490">2019-08-19T10:37:55.210161490 cras atlog  WRITE_STREAMS_MIXED            write_limit:1024</label>
-<label id="38275.210414903">2019-08-19T10:37:55.210414903 cras atlog  FILL_AUDIO_DONE                hw_level:1008 total_written:1024 min_cb_level:1024</label>
-<label id="38275.210434597">2019-08-19T10:37:55.210434597 cras atlog  SET_DEV_WAKE                   dev:6 hw_level:2032 sleep:1984</label>
-<label id="38275.210436597">2019-08-19T10:37:55.210436597 cras atlog  DEV_SLEEP_TIME                 dev:6 wake: 10:37:55.251765477</label>
-<label id="38275.210441028">2019-08-19T10:37:55.210441028 cras atlog  STREAM_SLEEP_TIME              id:1d0000 wake: 10:37:55.230988049</label>
-<label id="38275.210445345">2019-08-19T10:37:55.210445345 cras atlog  SLEEP                          sleep:000000000.020549158 longest_wake:001565104</label>
-<label id="38275.222778298">2019-08-19T10:37:55.222778298 cras atlog  WAKE                           num_fds:1</label>
-<label id="38275.222790909">2019-08-19T10:37:55.222790909 cras atlog  PB_MSG                         msg_id:7</label>
-<label id="38275.222796197">2019-08-19T10:37:55.222796197 cras atlog  STREAM_REMOVED                 id:1d0000</label>`;
-    put_logs = function () {
-      document.getElementById('logs').innerHTML = logs;
-    };
-
-    set_initial_checkbox_value = function () {
-      document.getElementById('device').checked = true;
-      document.getElementById('stream').checked = true;
-      document.getElementById('fetch').checked = true;
-      document.getElementById('wake').checked = true;
-    }
-
-    window.onload = function() {
-      draw_chart();
-      put_logs();
-      set_initial_checkbox_value();
-    };
-
-    function handleClick(checkbox) {
-      var class_name = checkbox.id;
-      var elements = document.getElementsByClassName(class_name);
-      var i;
-
-      if (checkbox.checked) {
-        display_value = "block";
-      } else {
-        display_value = "none"
-      }
-
-      console.log("change " + class_name + " to " + display_value);
-      for (i = 0; i < elements.length; i++) {
-        elements[i].style.display = display_value;
-      }
-    }
-
-  </script>
-</head>
-
-<body>
-  <div id="chart" style="height:50%; width:100%" ></div>
-  <div style="margin:0 auto"; class="checkbox">
-      <label><input type="checkbox" onclick="handleClick(this);" id="device">Show device removed/added event</label>
-      <label><input type="checkbox" onclick="handleClick(this);" id="stream">Show stream removed/added event</label>
-      <label><input type="checkbox" onclick="handleClick(this);" id="fetch">Show fetch event</label>
-      <label><input type="checkbox" onclick="handleClick(this);" id="wake">Show wake by num_fds=1 event</label>
-  </div>
-  <div class="event_log_box", id="logs", style="float:left;"></div>
-  <textarea class="event_log_box", id="text", style="float:right;"></textarea>
-</body>
-</html>
diff --git a/scripts/audio_thread_log_viewer/log.test b/scripts/audio_thread_log_viewer/log.test
deleted file mode 100644
index 8206761..0000000
--- a/scripts/audio_thread_log_viewer/log.test
+++ /dev/null
@@ -1,6151 +0,0 @@
-Audio Debug Stats:
--------------devices------------
-Output dev: bdw-rt5677: :1,0
-65536 0 1024 0 48000 2 1.000000
--------------stream_dump------------
-Audio Thread Event Log:
-start at 736
-    496098.524565708  DEV_SLEEP_TIME                 dev:8 wake:000496098.545892346
-    496098.524567126  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496098.545959543  WAKE                           num_fds:0
-    496098.545994178  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496098.546000808  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496098.546001355  DEV_SLEEP_TIME                 dev:8 wake:000496098.567328258
-    496098.546002783  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496098.567581739  WAKE                           num_fds:0
-    496098.567615773  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496098.567622518  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496098.567623059  DEV_SLEEP_TIME                 dev:8 wake:000496098.588949912
-    496098.567624543  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496098.589207274  WAKE                           num_fds:0
-    496098.589240896  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496098.589247582  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496098.589248133  DEV_SLEEP_TIME                 dev:8 wake:000496098.610574976
-    496098.589250062  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496098.610821201  WAKE                           num_fds:0
-    496098.610854808  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496098.610861519  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496098.610862050  DEV_SLEEP_TIME                 dev:8 wake:000496098.632188948
-    496098.610863463  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496098.632443051  WAKE                           num_fds:0
-    496098.632476082  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496098.632482753  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496098.632483289  DEV_SLEEP_TIME                 dev:8 wake:000496098.653810157
-    496098.632484727  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496098.654059981  WAKE                           num_fds:0
-    496098.654093774  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496098.654100469  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496098.654101015  DEV_SLEEP_TIME                 dev:8 wake:000496098.675427884
-    496098.654102514  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496098.675676644  WAKE                           num_fds:0
-    496098.675709505  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496098.675715664  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496098.675716210  DEV_SLEEP_TIME                 dev:8 wake:000496098.697043620
-    496098.675717624  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496098.697292000  WAKE                           num_fds:0
-    496098.697325252  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496098.697331912  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496098.697332439  DEV_SLEEP_TIME                 dev:8 wake:000496098.718659357
-    496098.697333932  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496098.718759444  WAKE                           num_fds:0
-    496098.718791864  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496098.718798584  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496098.718799116  DEV_SLEEP_TIME                 dev:8 wake:000496098.740125964
-    496098.718800569  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496098.740374739  WAKE                           num_fds:0
-    496098.740407625  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496098.740414446  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496098.740414982  DEV_SLEEP_TIME                 dev:8 wake:000496098.761741745
-    496098.740416420  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496098.761990271  WAKE                           num_fds:0
-    496098.762023593  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496098.762030293  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496098.762030839  DEV_SLEEP_TIME                 dev:8 wake:000496098.783357712
-    496098.762032303  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496098.783607275  WAKE                           num_fds:0
-    496098.783640005  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496098.783646686  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496098.783647222  DEV_SLEEP_TIME                 dev:8 wake:000496098.804974110
-    496098.783648665  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496098.805225207  WAKE                           num_fds:0
-    496098.805258890  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496098.805265655  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496098.805266202  DEV_SLEEP_TIME                 dev:8 wake:000496098.826592999
-    496098.805267675  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496098.826841354  WAKE                           num_fds:0
-    496098.826874200  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496098.826880900  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496098.826881567  DEV_SLEEP_TIME                 dev:8 wake:000496098.848208295
-    496098.826883075  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496098.848306238  WAKE                           num_fds:0
-    496098.848338928  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496098.848345624  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496098.848346165  DEV_SLEEP_TIME                 dev:8 wake:000496098.869673018
-    496098.848367619  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496098.869943940  WAKE                           num_fds:0
-    496098.869977317  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496098.869983927  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496098.869984473  DEV_SLEEP_TIME                 dev:8 wake:000496098.891311411
-    496098.869985886  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496098.891556864  WAKE                           num_fds:0
-    496098.891589740  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496098.891596290  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496098.891596837  DEV_SLEEP_TIME                 dev:8 wake:000496098.912923825
-    496098.891598310  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496098.913173874  WAKE                           num_fds:0
-    496098.913207412  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496098.913214077  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496098.913214734  DEV_SLEEP_TIME                 dev:8 wake:000496098.934541466
-    496098.913216312  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496098.934788182  WAKE                           num_fds:0
-    496098.934820552  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496098.934827267  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496098.934827799  DEV_SLEEP_TIME                 dev:8 wake:000496098.956154637
-    496098.934829237  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496098.956406414  WAKE                           num_fds:0
-    496098.956439565  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496098.956446341  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496098.956446872  DEV_SLEEP_TIME                 dev:8 wake:000496098.977773730
-    496098.956448321  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496098.978020778  WAKE                           num_fds:0
-    496098.978053749  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496098.978060374  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496098.978060916  DEV_SLEEP_TIME                 dev:8 wake:000496098.999387834
-    496098.978062359  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496098.999634870  WAKE                           num_fds:0
-    496098.999667952  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496098.999674592  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496098.999675198  DEV_SLEEP_TIME                 dev:8 wake:000496099.021002041
-    496098.999676632  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496099.021101388  WAKE                           num_fds:0
-    496099.021133918  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496099.021140623  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496099.021141155  DEV_SLEEP_TIME                 dev:8 wake:000496099.042468008
-    496099.021142573  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496099.042718602  WAKE                           num_fds:0
-    496099.042751734  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496099.042758414  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496099.042758961  DEV_SLEEP_TIME                 dev:8 wake:000496099.064085824
-    496099.042760384  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496099.064330956  WAKE                           num_fds:0
-    496099.064382264  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496099.064388955  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496099.064389501  DEV_SLEEP_TIME                 dev:8 wake:000496099.085716384
-    496099.064390929  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496099.085964449  WAKE                           num_fds:0
-    496099.085997670  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496099.086004286  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496099.086004822  DEV_SLEEP_TIME                 dev:8 wake:000496099.107331775
-    496099.086006386  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496099.107586550  WAKE                           num_fds:0
-    496099.107619801  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496099.107626397  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496099.107626938  DEV_SLEEP_TIME                 dev:8 wake:000496099.128953866
-    496099.107628366  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496099.129204762  WAKE                           num_fds:0
-    496099.129237403  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496099.129244023  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496099.129244569  DEV_SLEEP_TIME                 dev:8 wake:000496099.150571487
-    496099.129246008  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496099.150641335  WAKE                           num_fds:0
-    496099.150673374  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496099.150680004  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496099.150680656  DEV_SLEEP_TIME                 dev:8 wake:000496099.172007509
-    496099.150682074  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496099.172256786  WAKE                           num_fds:0
-    496099.172289878  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496099.172296493  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496099.172297034  DEV_SLEEP_TIME                 dev:8 wake:000496099.193623983
-    496099.172298478  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496099.193874512  WAKE                           num_fds:0
-    496099.193907859  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496099.193914469  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496099.193915006  DEV_SLEEP_TIME                 dev:8 wake:000496099.215241949
-    496099.193916414  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496099.215492809  WAKE                           num_fds:0
-    496099.215525304  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496099.215531864  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496099.215532421  DEV_SLEEP_TIME                 dev:8 wake:000496099.236859384
-    496099.215533834  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496099.237111493  WAKE                           num_fds:0
-    496099.237143973  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496099.237150678  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496099.237151210  DEV_SLEEP_TIME                 dev:8 wake:000496099.258478073
-    496099.237152628  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496099.258726588  WAKE                           num_fds:0
-    496099.258759554  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496099.258766124  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496099.258766665  DEV_SLEEP_TIME                 dev:8 wake:000496099.280093668
-    496099.258768219  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496099.280340434  WAKE                           num_fds:0
-    496099.280393006  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496099.280399631  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496099.280400182  DEV_SLEEP_TIME                 dev:8 wake:000496099.301727090
-    496099.280401641  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496099.301975591  WAKE                           num_fds:0
-    496099.302008723  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496099.302015493  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496099.302016025  DEV_SLEEP_TIME                 dev:8 wake:000496099.323342868
-    496099.302017463  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496099.323440980  WAKE                           num_fds:0
-    496099.323477615  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496099.323484245  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496099.323484791  DEV_SLEEP_TIME                 dev:8 wake:000496099.344811715
-    496099.323486230  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496099.345086125  WAKE                           num_fds:0
-    496099.345126263  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496099.345131465  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496099.345131996  DEV_SLEEP_TIME                 dev:8 wake:000496099.366460378
-    496099.345133429  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496099.366708151  WAKE                           num_fds:0
-    496099.366739964  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496099.366746760  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496099.366747432  DEV_SLEEP_TIME                 dev:8 wake:000496099.388074069
-    496099.366748880  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496099.388144614  WAKE                           num_fds:0
-    496099.388176969  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496099.388183740  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496099.388184281  DEV_SLEEP_TIME                 dev:8 wake:000496099.409511159
-    496099.388185724  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496099.409545707  WAKE                           num_fds:0
-    496099.409566242  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496099.409571665  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496099.409571919  DEV_SLEEP_TIME                 dev:8 wake:000496099.430899910
-    496099.409572582  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496099.430927759  WAKE                           num_fds:0
-    496099.430955957  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496099.430962098  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496099.430962539  DEV_SLEEP_TIME                 dev:8 wake:000496099.452289928
-    496099.430963662  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496099.452379104  WAKE                           num_fds:0
-    496099.452413514  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496099.452418641  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496099.452419177  DEV_SLEEP_TIME                 dev:8 wake:000496099.473747588
-    496099.452420710  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496099.473884983  WAKE                           num_fds:0
-    496099.473917934  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496099.473924589  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496099.473925130  DEV_SLEEP_TIME                 dev:8 wake:000496099.495252069
-    496099.473926564  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496099.495367456  WAKE                           num_fds:0
-    496099.495399996  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496099.495406612  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496099.495407158  DEV_SLEEP_TIME                 dev:8 wake:000496099.516734061
-    496099.495408727  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496099.516763201  WAKE                           num_fds:0
-    496099.516795615  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496099.516802181  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496099.516802732  DEV_SLEEP_TIME                 dev:8 wake:000496099.538129745
-    496099.516804095  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496099.538207146  WAKE                           num_fds:0
-    496099.538238564  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496099.538245094  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496099.538245665  DEV_SLEEP_TIME                 dev:8 wake:000496099.559572673
-    496099.538247123  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496099.559628849  WAKE                           num_fds:0
-    496099.559659896  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496099.559665359  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496099.559665890  DEV_SLEEP_TIME                 dev:8 wake:000496099.580994046
-    496099.559667333  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496099.581019938  WAKE                           num_fds:0
-    496099.581050679  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496099.581057460  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496099.581057996  DEV_SLEEP_TIME                 dev:8 wake:000496099.602384964
-    496099.581059284  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496099.602418768  WAKE                           num_fds:0
-    496099.602454421  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496099.602462449  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496099.602463206  DEV_SLEEP_TIME                 dev:8 wake:000496099.623788801
-    496099.602465055  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496099.623858429  WAKE                           num_fds:0
-    496099.623890809  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496099.623897589  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496099.623898131  DEV_SLEEP_TIME                 dev:8 wake:000496099.645224914
-    496099.623899609  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496099.645296641  WAKE                           num_fds:0
-    496099.645334724  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496099.645340272  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496099.645340808  DEV_SLEEP_TIME                 dev:8 wake:000496099.666668954
-    496099.645342192  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496099.666692849  WAKE                           num_fds:0
-    496099.666719109  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496099.666725256  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496099.666725704  DEV_SLEEP_TIME                 dev:8 wake:000496099.688053104
-    496099.666726894  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496099.688074387  WAKE                           num_fds:0
-    496099.688096225  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496099.688101841  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496099.688102175  DEV_SLEEP_TIME                 dev:8 wake:000496099.709430072
-    496099.688102887  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496099.709443343  WAKE                           num_fds:0
-    496099.709455328  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496099.709459005  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496099.709459229  DEV_SLEEP_TIME                 dev:8 wake:000496099.730788957
-    496099.709459736  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496099.730805574  WAKE                           num_fds:0
-    496099.730824543  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496099.730829830  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496099.730830098  DEV_SLEEP_TIME                 dev:8 wake:000496099.752158351
-    496099.730830581  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496099.752172469  WAKE                           num_fds:0
-    496099.752187265  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496099.752190979  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496099.752191240  DEV_SLEEP_TIME                 dev:8 wake:000496099.773520970
-    496099.752191743  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496099.773533690  WAKE                           num_fds:0
-    496099.773549159  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496099.773552607  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496099.773552834  DEV_SLEEP_TIME                 dev:8 wake:000496099.794882783
-    496099.773553393  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496099.794893261  WAKE                           num_fds:0
-    496099.794905112  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496099.794908388  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496099.794908531  DEV_SLEEP_TIME                 dev:8 wake:000496099.816238663
-    496099.794908990  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496099.816248944  WAKE                           num_fds:0
-    496099.816260791  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496099.816263965  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496099.816264138  DEV_SLEEP_TIME                 dev:8 wake:000496099.837594355
-    496099.816264504  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496099.837604072  WAKE                           num_fds:0
-    496099.837616853  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496099.837619986  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496099.837620168  DEV_SLEEP_TIME                 dev:8 wake:000496099.858950398
-    496099.837620511  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496099.858961345  WAKE                           num_fds:0
-    496099.858976724  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496099.858979930  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496099.858980107  DEV_SLEEP_TIME                 dev:8 wake:000496099.880310281
-    496099.858980424  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496099.880319596  WAKE                           num_fds:0
-    496099.880330501  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496099.880333657  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496099.880333835  DEV_SLEEP_TIME                 dev:8 wake:000496099.901664064
-    496099.880334293  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496099.901673173  WAKE                           num_fds:0
-    496099.901683309  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496099.901686399  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496099.901686518  DEV_SLEEP_TIME                 dev:8 wake:000496099.923016808
-    496099.901686986  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496099.923026422  WAKE                           num_fds:0
-    496099.923039650  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496099.923042794  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496099.923042971  DEV_SLEEP_TIME                 dev:8 wake:000496099.944373193
-    496099.923043433  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496099.944382798  WAKE                           num_fds:0
-    496099.944393969  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496099.944397102  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496099.944397285  DEV_SLEEP_TIME                 dev:8 wake:000496099.965727428
-    496099.944397681  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496099.965737960  WAKE                           num_fds:0
-    496099.965751311  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496099.965754524  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496099.965754702  DEV_SLEEP_TIME                 dev:8 wake:000496099.987084869
-    496099.965755111  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496099.987093719  WAKE                           num_fds:0
-    496099.987104561  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496099.987107677  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496099.987107905  DEV_SLEEP_TIME                 dev:8 wake:000496100.008438069
-    496099.987108340  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496100.008446847  WAKE                           num_fds:0
-    496100.008457382  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496100.008460682  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496100.008460869  DEV_SLEEP_TIME                 dev:8 wake:000496100.029790961
-    496100.008461246  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496100.029818678  WAKE                           num_fds:0
-    496100.029837149  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496100.029843078  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496100.029843305  DEV_SLEEP_TIME                 dev:8 wake:000496100.051171009
-    496100.029843952  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496100.051190229  WAKE                           num_fds:0
-    496100.051209390  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496100.051214799  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496100.051215052  DEV_SLEEP_TIME                 dev:8 wake:000496100.072543113
-    496100.051215796  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496100.072561196  WAKE                           num_fds:0
-    496100.072576819  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496100.072580750  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496100.072581115  DEV_SLEEP_TIME                 dev:8 wake:000496100.093910689
-    496100.072581922  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496100.093973259  WAKE                           num_fds:0
-    496100.093991762  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496100.093995366  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496100.093995594  DEV_SLEEP_TIME                 dev:8 wake:000496100.115325510
-    496100.093996174  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496100.115537814  WAKE                           num_fds:0
-    496100.115557401  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496100.115560841  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496100.115561080  DEV_SLEEP_TIME                 dev:8 wake:000496100.136891036
-    496100.115561681  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496100.137102895  WAKE                           num_fds:0
-    496100.137121895  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496100.137125352  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496100.137125589  DEV_SLEEP_TIME                 dev:8 wake:000496100.158455544
-    496100.137126194  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496100.158690778  WAKE                           num_fds:0
-    496100.158718867  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496100.158724914  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496100.158725362  DEV_SLEEP_TIME                 dev:8 wake:000496100.180052858
-    496100.158726597  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496100.180291907  WAKE                           num_fds:0
-    496100.180334939  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496100.180341137  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496100.180341694  DEV_SLEEP_TIME                 dev:8 wake:000496100.201668888
-    496100.180342901  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496100.201904895  WAKE                           num_fds:0
-    496100.201935065  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496100.201941215  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496100.201941653  DEV_SLEEP_TIME                 dev:8 wake:000496100.223269028
-    496100.201942826  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496100.223392063  WAKE                           num_fds:0
-    496100.223421828  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496100.223427926  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496100.223428484  DEV_SLEEP_TIME                 dev:8 wake:000496100.244755795
-    496100.223429666  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496100.245001270  WAKE                           num_fds:0
-    496100.245034126  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496100.245041097  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496100.245041638  DEV_SLEEP_TIME                 dev:8 wake:000496100.266368371
-    496100.245043102  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496100.266620745  WAKE                           num_fds:0
-    496100.266654027  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496100.266660717  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496100.266661253  DEV_SLEEP_TIME                 dev:8 wake:000496100.287988172
-    496100.266662682  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496100.288238777  WAKE                           num_fds:0
-    496100.288272199  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496100.288278840  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496100.288279496  DEV_SLEEP_TIME                 dev:8 wake:000496100.309606269
-    496100.288280920  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496100.309680702  WAKE                           num_fds:0
-    496100.309714560  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496100.309721221  SET_DEV_WAKE                   dev:8 hw_level:2000 sleep:976
-    496100.309721767  DEV_SLEEP_TIME                 dev:8 wake:000496100.330048685
-    496100.309723215  SLEEP                          sleep:000000000.020333333 longest_wake:000158140
-    496100.330297374  WAKE                           num_fds:0
-    496100.330330320  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496100.330336875  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496100.330337422  DEV_SLEEP_TIME                 dev:8 wake:000496100.351664410
-    496100.330338870  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496100.351764312  WAKE                           num_fds:0
-    496100.351796516  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496100.351803227  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496100.351803773  DEV_SLEEP_TIME                 dev:8 wake:000496100.373130636
-    496100.351805196  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496100.373381346  WAKE                           num_fds:0
-    496100.373414302  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496100.373421028  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496100.373421579  DEV_SLEEP_TIME                 dev:8 wake:000496100.394748397
-    496100.373422997  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496100.394996512  WAKE                           num_fds:0
-    496100.395030009  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496100.395036710  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496100.395037256  DEV_SLEEP_TIME                 dev:8 wake:000496100.416364124
-    496100.395038699  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496100.416614232  WAKE                           num_fds:0
-    496100.416646743  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496100.416653363  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496100.416653904  DEV_SLEEP_TIME                 dev:8 wake:000496100.437980857
-    496100.416655448  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496100.438214409  WAKE                           num_fds:0
-    496100.438247169  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496100.438253865  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496100.438254401  DEV_SLEEP_TIME                 dev:8 wake:000496100.459581389
-    496100.438255839  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496100.459827454  WAKE                           num_fds:0
-    496100.459861848  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496100.459868483  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496100.459869060  DEV_SLEEP_TIME                 dev:8 wake:000496100.481195973
-    496100.459870483  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496100.481448141  WAKE                           num_fds:0
-    496100.481481212  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496100.481487983  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496100.481488559  DEV_SLEEP_TIME                 dev:8 wake:000496100.502815503
-    496100.481489988  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496100.503061022  WAKE                           num_fds:0
-    496100.503093867  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496100.503100483  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496100.503101054  DEV_SLEEP_TIME                 dev:8 wake:000496100.524427977
-    496100.503102497  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496100.524533081  WAKE                           num_fds:0
-    496100.524566132  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496100.524572718  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496100.524573259  DEV_SLEEP_TIME                 dev:8 wake:000496100.545900277
-    496100.524574737  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496100.546150402  WAKE                           num_fds:0
-    496100.546183914  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496100.546190600  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496100.546191141  DEV_SLEEP_TIME                 dev:8 wake:000496100.567517989
-    496100.546192584  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496100.567766865  WAKE                           num_fds:0
-    496100.567800633  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496100.567807248  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496100.567807789  DEV_SLEEP_TIME                 dev:8 wake:000496100.589134742
-    496100.567809222  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496100.589386409  WAKE                           num_fds:0
-    496100.589419551  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496100.589426096  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496100.589426642  DEV_SLEEP_TIME                 dev:8 wake:000496100.610753641
-    496100.589428091  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496100.611000528  WAKE                           num_fds:0
-    496100.611033584  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496100.611040440  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496100.611040991  DEV_SLEEP_TIME                 dev:8 wake:000496100.632367749
-    496100.611042425  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496100.632618399  WAKE                           num_fds:0
-    496100.632651826  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496100.632658577  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496100.632659118  DEV_SLEEP_TIME                 dev:8 wake:000496100.653985931
-    496100.632660526  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496100.654089236  WAKE                           num_fds:0
-    496100.654122483  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496100.654129063  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496100.654129610  DEV_SLEEP_TIME                 dev:8 wake:000496100.675456613
-    496100.654131033  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496100.675707809  WAKE                           num_fds:0
-    496100.675739668  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496100.675746323  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496100.675746884  DEV_SLEEP_TIME                 dev:8 wake:000496100.697073767
-    496100.675748318  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496100.697320964  WAKE                           num_fds:0
-    496100.697371546  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496100.697378417  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496100.697378968  DEV_SLEEP_TIME                 dev:8 wake:000496100.718705691
-    496100.697380422  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496100.718805258  WAKE                           num_fds:0
-    496100.718838966  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496100.718845586  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496100.718846132  DEV_SLEEP_TIME                 dev:8 wake:000496100.740173041
-    496100.718847591  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496100.740425615  WAKE                           num_fds:0
-    496100.740458811  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496100.740465657  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496100.740466203  DEV_SLEEP_TIME                 dev:8 wake:000496100.761793051
-    496100.740467632  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496100.761892959  WAKE                           num_fds:0
-    496100.761925459  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496100.761932105  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496100.761932776  DEV_SLEEP_TIME                 dev:8 wake:000496100.783259524
-    496100.761934220  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496100.783381637  WAKE                           num_fds:0
-    496100.783414944  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496100.783421680  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496100.783422226  DEV_SLEEP_TIME                 dev:8 wake:000496100.804749039
-    496100.783423649  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496100.804853272  WAKE                           num_fds:0
-    496100.804885807  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496100.804892417  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496100.804892963  DEV_SLEEP_TIME                 dev:8 wake:000496100.826219907
-    496100.804894402  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496100.826322110  WAKE                           num_fds:0
-    496100.826373047  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496100.826380063  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496100.826380610  DEV_SLEEP_TIME                 dev:8 wake:000496100.847707192
-    496100.826382018  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496100.847959501  WAKE                           num_fds:0
-    496100.847992322  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496100.847999067  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496100.847999618  DEV_SLEEP_TIME                 dev:8 wake:000496100.869326431
-    496100.848001317  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496100.869578930  WAKE                           num_fds:0
-    496100.869612292  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496100.869619023  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496100.869619574  DEV_SLEEP_TIME                 dev:8 wake:000496100.890946412
-    496100.869620997  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496100.891197770  WAKE                           num_fds:0
-    496100.891230550  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496100.891237110  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496100.891237787  DEV_SLEEP_TIME                 dev:8 wake:000496100.912564655
-    496100.891239220  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496100.912816197  WAKE                           num_fds:0
-    496100.912849323  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496100.912855848  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496100.912856420  DEV_SLEEP_TIME                 dev:8 wake:000496100.934183418
-    496100.912857878  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496100.934430826  WAKE                           num_fds:0
-    496100.934464102  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496100.934470708  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496100.934471254  DEV_SLEEP_TIME                 dev:8 wake:000496100.955798272
-    496100.934472697  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496100.955901337  WAKE                           num_fds:0
-    496100.955933948  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496100.955940678  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496100.955941229  DEV_SLEEP_TIME                 dev:8 wake:000496100.977268047
-    496100.955942683  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496100.977519955  WAKE                           num_fds:0
-    496100.977552550  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496100.977559256  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496100.977559822  DEV_SLEEP_TIME                 dev:8 wake:000496100.998886650
-    496100.977561271  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496100.999137892  WAKE                           num_fds:0
-    496100.999169961  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496100.999176612  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496100.999177088  DEV_SLEEP_TIME                 dev:8 wake:000496101.020504061
-    496100.999178456  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496101.020757502  WAKE                           num_fds:0
-    496101.020790759  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496101.020797399  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496101.020797941  DEV_SLEEP_TIME                 dev:8 wake:000496101.042124944
-    496101.020799364  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496101.042376561  WAKE                           num_fds:0
-    496101.042409227  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496101.042415827  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496101.042416388  DEV_SLEEP_TIME                 dev:8 wake:000496101.063743316
-    496101.042417987  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496101.063993676  WAKE                           num_fds:0
-    496101.064026808  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496101.064033453  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496101.064033994  DEV_SLEEP_TIME                 dev:8 wake:000496101.085360928
-    496101.064035438  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496101.085608450  WAKE                           num_fds:0
-    496101.085642659  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496101.085649365  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496101.085649901  DEV_SLEEP_TIME                 dev:8 wake:000496101.106976764
-    496101.085651324  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496101.107228552  WAKE                           num_fds:0
-    496101.107261478  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496101.107268179  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496101.107268720  DEV_SLEEP_TIME                 dev:8 wake:000496101.128595704
-    496101.107270164  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496101.128696698  WAKE                           num_fds:0
-    496101.128726381  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496101.128733227  SET_DEV_WAKE                   dev:8 hw_level:2000 sleep:976
-    496101.128733768  DEV_SLEEP_TIME                 dev:8 wake:000496101.149060501
-    496101.128735212  SLEEP                          sleep:000000000.020333333 longest_wake:000158140
-    496101.149310393  WAKE                           num_fds:0
-    496101.149343359  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496101.149381326  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496101.149381917  DEV_SLEEP_TIME                 dev:8 wake:000496101.170677469
-    496101.149383436  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496101.170961115  WAKE                           num_fds:0
-    496101.170994692  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496101.171001378  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496101.171001924  DEV_SLEEP_TIME                 dev:8 wake:000496101.192328802
-    496101.171003367  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496101.192580429  WAKE                           num_fds:0
-    496101.192613290  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496101.192619910  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496101.192620462  DEV_SLEEP_TIME                 dev:8 wake:000496101.213947420
-    496101.192621920  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496101.214192247  WAKE                           num_fds:0
-    496101.214224998  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496101.214231573  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496101.214232119  DEV_SLEEP_TIME                 dev:8 wake:000496101.235559088
-    496101.214233553  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496101.235808094  WAKE                           num_fds:0
-    496101.235840980  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496101.235847595  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496101.235848146  DEV_SLEEP_TIME                 dev:8 wake:000496101.257175089
-    496101.235849590  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496101.257275849  WAKE                           num_fds:0
-    496101.257308500  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496101.257315135  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496101.257315676  DEV_SLEEP_TIME                 dev:8 wake:000496101.278642594
-    496101.257317104  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496101.278887125  WAKE                           num_fds:0
-    496101.278919525  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496101.278926135  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496101.278926676  DEV_SLEEP_TIME                 dev:8 wake:000496101.300253620
-    496101.278928120  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496101.300391730  WAKE                           num_fds:0
-    496101.300424490  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496101.300431176  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496101.300431722  DEV_SLEEP_TIME                 dev:8 wake:000496101.321758585
-    496101.300433160  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496101.322005658  WAKE                           num_fds:0
-    496101.322038759  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496101.322045274  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496101.322045820  DEV_SLEEP_TIME                 dev:8 wake:000496101.343372864
-    496101.322047254  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496101.343623649  WAKE                           num_fds:0
-    496101.343656334  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496101.343662930  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496101.343663471  DEV_SLEEP_TIME                 dev:8 wake:000496101.364990429
-    496101.343664909  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496101.365239140  WAKE                           num_fds:0
-    496101.365272096  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496101.365278837  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496101.365279378  DEV_SLEEP_TIME                 dev:8 wake:000496101.386606216
-    496101.365280832  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496101.386856460  WAKE                           num_fds:0
-    496101.386890138  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496101.386896783  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496101.386897330  DEV_SLEEP_TIME                 dev:8 wake:000496101.408224208
-    496101.386898763  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496101.408472672  WAKE                           num_fds:0
-    496101.408505724  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496101.408512364  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496101.408512905  DEV_SLEEP_TIME                 dev:8 wake:000496101.429839848
-    496101.408514329  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496101.429906550  WAKE                           num_fds:0
-    496101.429938428  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496101.429944993  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496101.429945535  DEV_SLEEP_TIME                 dev:8 wake:000496101.451272568
-    496101.429946993  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496101.451524275  WAKE                           num_fds:0
-    496101.451557176  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496101.451563777  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496101.451564328  DEV_SLEEP_TIME                 dev:8 wake:000496101.472891271
-    496101.451565906  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496101.473137346  WAKE                           num_fds:0
-    496101.473170368  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496101.473177068  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496101.473177609  DEV_SLEEP_TIME                 dev:8 wake:000496101.494504467
-    496101.473179058  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496101.494599058  WAKE                           num_fds:0
-    496101.494630274  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496101.494636524  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496101.494637017  DEV_SLEEP_TIME                 dev:8 wake:000496101.515964292
-    496101.494638308  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496101.516182970  WAKE                           num_fds:0
-    496101.516214183  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496101.516220585  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496101.516221074  DEV_SLEEP_TIME                 dev:8 wake:000496101.537548225
-    496101.516222409  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496101.537791076  WAKE                           num_fds:0
-    496101.537822243  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496101.537828687  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496101.537829164  DEV_SLEEP_TIME                 dev:8 wake:000496101.559156302
-    496101.537830627  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496101.559252688  WAKE                           num_fds:0
-    496101.559283407  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496101.559289745  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496101.559290243  DEV_SLEEP_TIME                 dev:8 wake:000496101.580617438
-    496101.559291526  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496101.580861870  WAKE                           num_fds:0
-    496101.580893182  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496101.580899553  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496101.580900034  DEV_SLEEP_TIME                 dev:8 wake:000496101.602227209
-    496101.580901321  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496101.602471830  WAKE                           num_fds:0
-    496101.602503226  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496101.602509601  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496101.602510086  DEV_SLEEP_TIME                 dev:8 wake:000496101.623837257
-    496101.602511361  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496101.624078044  WAKE                           num_fds:0
-    496101.624109220  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496101.624115607  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496101.624116088  DEV_SLEEP_TIME                 dev:8 wake:000496101.645443234
-    496101.624117382  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496101.645685689  WAKE                           num_fds:0
-    496101.645715144  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496101.645721455  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496101.645721940  DEV_SLEEP_TIME                 dev:8 wake:000496101.667049171
-    496101.645723231  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496101.667144488  WAKE                           num_fds:0
-    496101.667175468  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496101.667182259  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496101.667182761  DEV_SLEEP_TIME                 dev:8 wake:000496101.688509494
-    496101.667184067  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496101.688754196  WAKE                           num_fds:0
-    496101.688785797  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496101.688792043  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496101.688792544  DEV_SLEEP_TIME                 dev:8 wake:000496101.710119799
-    496101.688793835  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496101.710368568  WAKE                           num_fds:0
-    496101.710399467  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496101.710405854  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496101.710406339  DEV_SLEEP_TIME                 dev:8 wake:000496101.731733498
-    496101.710407618  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496101.731827954  WAKE                           num_fds:0
-    496101.731858565  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496101.731864803  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496101.731865301  DEV_SLEEP_TIME                 dev:8 wake:000496101.753192595
-    496101.731866592  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496101.753434542  WAKE                           num_fds:0
-    496101.753465201  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496101.753471516  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496101.753472073  DEV_SLEEP_TIME                 dev:8 wake:000496101.774799220
-    496101.753473400  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496101.775034482  WAKE                           num_fds:0
-    496101.775064488  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496101.775070890  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496101.775071391  DEV_SLEEP_TIME                 dev:8 wake:000496101.796398646
-    496101.775072682  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496101.796638895  WAKE                           num_fds:0
-    496101.796669879  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496101.796676257  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496101.796676734  DEV_SLEEP_TIME                 dev:8 wake:000496101.818003893
-    496101.796678026  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496101.818247105  WAKE                           num_fds:0
-    496101.818277917  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496101.818284203  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496101.818284684  DEV_SLEEP_TIME                 dev:8 wake:000496101.839611936
-    496101.818285967  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496101.839856667  WAKE                           num_fds:0
-    496101.839887703  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496101.839893985  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496101.839894482  DEV_SLEEP_TIME                 dev:8 wake:000496101.861221745
-    496101.839895877  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496101.861461557  WAKE                           num_fds:0
-    496101.861492472  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496101.861498774  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496101.861499264  DEV_SLEEP_TIME                 dev:8 wake:000496101.882826487
-    496101.861500567  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496101.883067472  WAKE                           num_fds:0
-    496101.883097802  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496101.883104085  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496101.883104586  DEV_SLEEP_TIME                 dev:8 wake:000496101.904431816
-    496101.883105897  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496101.904675842  WAKE                           num_fds:0
-    496101.904707142  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496101.904712154  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496101.904712656  DEV_SLEEP_TIME                 dev:8 wake:000496101.926041285
-    496101.904713943  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496101.926286481  WAKE                           num_fds:0
-    496101.926317412  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496101.926323746  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496101.926324244  DEV_SLEEP_TIME                 dev:8 wake:000496101.947651462
-    496101.926325542  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496101.947894255  WAKE                           num_fds:0
-    496101.947925656  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496101.947932034  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496101.947932528  DEV_SLEEP_TIME                 dev:8 wake:000496101.969259655
-    496101.947933819  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496101.969503271  WAKE                           num_fds:0
-    496101.969533801  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496101.969540176  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496101.969540650  DEV_SLEEP_TIME                 dev:8 wake:000496101.990867828
-    496101.969541940  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496101.991112235  WAKE                           num_fds:0
-    496101.991142850  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496101.991149285  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496101.991149702  DEV_SLEEP_TIME                 dev:8 wake:000496102.012476969
-    496101.991151093  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496102.012720280  WAKE                           num_fds:0
-    496102.012751156  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496102.012757551  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496102.012758032  DEV_SLEEP_TIME                 dev:8 wake:000496102.034085183
-    496102.012759347  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496102.034179223  WAKE                           num_fds:0
-    496102.034209573  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496102.034215959  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496102.034216445  DEV_SLEEP_TIME                 dev:8 wake:000496102.055543612
-    496102.034217748  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496102.055786354  WAKE                           num_fds:0
-    496102.055817274  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496102.055823596  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496102.055824098  DEV_SLEEP_TIME                 dev:8 wake:000496102.077151308
-    496102.055825385  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496102.077396578  WAKE                           num_fds:0
-    496102.077427578  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496102.077433828  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496102.077434386  DEV_SLEEP_TIME                 dev:8 wake:000496102.098761576
-    496102.077435665  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496102.099004172  WAKE                           num_fds:0
-    496102.099035175  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496102.099041530  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496102.099042024  DEV_SLEEP_TIME                 dev:8 wake:000496102.120369198
-    496102.099043326  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496102.120613023  WAKE                           num_fds:0
-    496102.120644090  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496102.120650614  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496102.120651091  DEV_SLEEP_TIME                 dev:8 wake:000496102.141978225
-    496102.120652494  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496102.142225706  WAKE                           num_fds:0
-    496102.142256890  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496102.142263153  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496102.142263645  DEV_SLEEP_TIME                 dev:8 wake:000496102.163590920
-    496102.142265037  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496102.163836347  WAKE                           num_fds:0
-    496102.163867587  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496102.163873914  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496102.163874460  DEV_SLEEP_TIME                 dev:8 wake:000496102.185201638
-    496102.163875798  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496102.185447500  WAKE                           num_fds:0
-    496102.185478163  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496102.185484509  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496102.185484991  DEV_SLEEP_TIME                 dev:8 wake:000496102.206812162
-    496102.185486293  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496102.207058359  WAKE                           num_fds:0
-    496102.207089563  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496102.207095821  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496102.207096391  DEV_SLEEP_TIME                 dev:8 wake:000496102.228423577
-    496102.207097693  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496102.228668781  WAKE                           num_fds:0
-    496102.228701857  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496102.228707109  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496102.228707636  DEV_SLEEP_TIME                 dev:8 wake:000496102.250035927
-    496102.228709310  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496102.250285696  WAKE                           num_fds:0
-    496102.250317905  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496102.250324535  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496102.250325072  DEV_SLEEP_TIME                 dev:8 wake:000496102.271651990
-    496102.250326550  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496102.271905241  WAKE                           num_fds:0
-    496102.271938628  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496102.271945223  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496102.271945764  DEV_SLEEP_TIME                 dev:8 wake:000496102.293272728
-    496102.271947358  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496102.293521749  WAKE                           num_fds:0
-    496102.293554584  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496102.293561180  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496102.293561721  DEV_SLEEP_TIME                 dev:8 wake:000496102.314888689
-    496102.293563174  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496102.315141390  WAKE                           num_fds:0
-    496102.315173950  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496102.315180640  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496102.315181177  DEV_SLEEP_TIME                 dev:8 wake:000496102.336508085
-    496102.315182615  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496102.336608964  WAKE                           num_fds:0
-    496102.336641554  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496102.336648134  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496102.336648786  DEV_SLEEP_TIME                 dev:8 wake:000496102.357975634
-    496102.336650354  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496102.358060502  WAKE                           num_fds:0
-    496102.358092746  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496102.358099572  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496102.358100118  DEV_SLEEP_TIME                 dev:8 wake:000496102.379426886
-    496102.358101582  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496102.379679310  WAKE                           num_fds:0
-    496102.379711860  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496102.379717002  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496102.379717538  DEV_SLEEP_TIME                 dev:8 wake:000496102.401045965
-    496102.379718967  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496102.401289935  WAKE                           num_fds:0
-    496102.401322290  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496102.401328976  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496102.401329512  DEV_SLEEP_TIME                 dev:8 wake:000496102.422656405
-    496102.401330940  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496102.422906689  WAKE                           num_fds:0
-    496102.422940056  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496102.422946696  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496102.422947232  DEV_SLEEP_TIME                 dev:8 wake:000496102.444274171
-    496102.422948681  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496102.444528128  WAKE                           num_fds:0
-    496102.444561089  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496102.444567699  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496102.444568241  DEV_SLEEP_TIME                 dev:8 wake:000496102.465895209
-    496102.444569724  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496102.466143570  WAKE                           num_fds:0
-    496102.466176561  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496102.466183417  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496102.466183943  DEV_SLEEP_TIME                 dev:8 wake:000496102.487510801
-    496102.466185391  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496102.487759281  WAKE                           num_fds:0
-    496102.487792688  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496102.487799288  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496102.487799839  DEV_SLEEP_TIME                 dev:8 wake:000496102.509126787
-    496102.487801283  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496102.509382158  WAKE                           num_fds:0
-    496102.509414728  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496102.509421519  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496102.509422050  DEV_SLEEP_TIME                 dev:8 wake:000496102.530748953
-    496102.509423484  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496102.530997274  WAKE                           num_fds:0
-    496102.531029418  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496102.531036073  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496102.531036610  DEV_SLEEP_TIME                 dev:8 wake:000496102.552363538
-    496102.531038068  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496102.552613621  WAKE                           num_fds:0
-    496102.552646277  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496102.552652837  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496102.552653398  DEV_SLEEP_TIME                 dev:8 wake:000496102.573980382
-    496102.552654847  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496102.574235683  WAKE                           num_fds:0
-    496102.574268759  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496102.574275550  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496102.574276086  DEV_SLEEP_TIME                 dev:8 wake:000496102.595602849
-    496102.574277530  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496102.595703738  WAKE                           num_fds:0
-    496102.595737742  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496102.595744357  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496102.595744903  DEV_SLEEP_TIME                 dev:8 wake:000496102.617071842
-    496102.595746362  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496102.617323143  WAKE                           num_fds:0
-    496102.617380144  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496102.617386815  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496102.617387476  DEV_SLEEP_TIME                 dev:8 wake:000496102.638714259
-    496102.617388925  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496102.638973490  WAKE                           num_fds:0
-    496102.639006691  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496102.639013432  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496102.639013983  DEV_SLEEP_TIME                 dev:8 wake:000496102.660340786
-    496102.639015447  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496102.660417244  WAKE                           num_fds:0
-    496102.660456845  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496102.660465896  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496102.660466528  DEV_SLEEP_TIME                 dev:8 wake:000496102.681791421
-    496102.660468447  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496102.682044914  WAKE                           num_fds:0
-    496102.682077384  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496102.682084109  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496102.682084761  DEV_SLEEP_TIME                 dev:8 wake:000496102.703411513
-    496102.682086214  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496102.703658395  WAKE                           num_fds:0
-    496102.703692107  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496102.703698723  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496102.703699274  DEV_SLEEP_TIME                 dev:8 wake:000496102.725026202
-    496102.703700717  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496102.725275906  WAKE                           num_fds:0
-    496102.725309578  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496102.725316209  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496102.725316870  DEV_SLEEP_TIME                 dev:8 wake:000496102.746643673
-    496102.725318439  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496102.746892644  WAKE                           num_fds:0
-    496102.746925380  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496102.746932065  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496102.746932596  DEV_SLEEP_TIME                 dev:8 wake:000496102.768259499
-    496102.746934020  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496102.768510786  WAKE                           num_fds:0
-    496102.768543812  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496102.768550613  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496102.768551154  DEV_SLEEP_TIME                 dev:8 wake:000496102.789877957
-    496102.768552672  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496102.790129755  WAKE                           num_fds:0
-    496102.790162812  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496102.790169432  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496102.790169988  DEV_SLEEP_TIME                 dev:8 wake:000496102.811496916
-    496102.790171416  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496102.811745406  WAKE                           num_fds:0
-    496102.811779034  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496102.811785589  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496102.811786140  DEV_SLEEP_TIME                 dev:8 wake:000496102.833113134
-    496102.811787564  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496102.833368700  WAKE                           num_fds:0
-    496102.833408141  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496102.833416480  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496102.833417112  DEV_SLEEP_TIME                 dev:8 wake:000496102.854742566
-    496102.833418956  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496102.854847040  WAKE                           num_fds:0
-    496102.854879640  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496102.854886280  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496102.854886832  DEV_SLEEP_TIME                 dev:8 wake:000496102.876213770
-    496102.854888265  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496102.876314619  WAKE                           num_fds:0
-    496102.876375595  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496102.876382566  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496102.876383112  DEV_SLEEP_TIME                 dev:8 wake:000496102.897709815
-    496102.876384550  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496102.897811827  WAKE                           num_fds:0
-    496102.897845044  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496102.897851795  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496102.897852431  DEV_SLEEP_TIME                 dev:8 wake:000496102.919179159
-    496102.897853869  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496102.919280565  WAKE                           num_fds:0
-    496102.919313952  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496102.919320728  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496102.919321274  DEV_SLEEP_TIME                 dev:8 wake:000496102.940648037
-    496102.919322707  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496102.940901293  WAKE                           num_fds:0
-    496102.940934504  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496102.940941105  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496102.940941661  DEV_SLEEP_TIME                 dev:8 wake:000496102.962268614
-    496102.940943109  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496102.962374715  WAKE                           num_fds:0
-    496102.962408604  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496102.962415304  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496102.962415840  DEV_SLEEP_TIME                 dev:8 wake:000496102.983742834
-    496102.962417289  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496102.983989801  WAKE                           num_fds:0
-    496102.984022416  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496102.984029127  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496102.984029598  DEV_SLEEP_TIME                 dev:8 wake:000496103.005356531
-    496102.984031001  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496103.005604715  WAKE                           num_fds:0
-    496103.005637877  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496103.005644412  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496103.005644948  DEV_SLEEP_TIME                 dev:8 wake:000496103.026971961
-    496103.005646371  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496103.027219901  WAKE                           num_fds:0
-    496103.027252371  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496103.027259051  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496103.027259603  DEV_SLEEP_TIME                 dev:8 wake:000496103.048586471
-    496103.027261016  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496103.048836534  WAKE                           num_fds:0
-    496103.048869601  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496103.048876291  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496103.048876837  DEV_SLEEP_TIME                 dev:8 wake:000496103.070203690
-    496103.048878406  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496103.070456866  WAKE                           num_fds:0
-    496103.070490058  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496103.070496793  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496103.070497324  DEV_SLEEP_TIME                 dev:8 wake:000496103.091824152
-    496103.070498778  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496103.092072047  WAKE                           num_fds:0
-    496103.092104782  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496103.092111468  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496103.092112014  DEV_SLEEP_TIME                 dev:8 wake:000496103.113438897
-    496103.092113457  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496103.113689061  WAKE                           num_fds:0
-    496103.113722453  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496103.113729133  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496103.113729675  DEV_SLEEP_TIME                 dev:8 wake:000496103.135056578
-    496103.113731128  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496103.135140323  WAKE                           num_fds:0
-    496103.135172087  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496103.135178677  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496103.135179223  DEV_SLEEP_TIME                 dev:8 wake:000496103.156506176
-    496103.135180651  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496103.156755693  WAKE                           num_fds:0
-    496103.156789141  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496103.156795941  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496103.156796473  DEV_SLEEP_TIME                 dev:8 wake:000496103.178123281
-    496103.156797911  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496103.178369600  WAKE                           num_fds:0
-    496103.178402637  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496103.178409347  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496103.178409878  DEV_SLEEP_TIME                 dev:8 wake:000496103.199736726
-    496103.178411312  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496103.199985012  WAKE                           num_fds:0
-    496103.200018454  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496103.200025154  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496103.200025706  DEV_SLEEP_TIME                 dev:8 wake:000496103.221352569
-    496103.200027164  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496103.221411887  WAKE                           num_fds:0
-    496103.221449599  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496103.221457367  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496103.221458149  DEV_SLEEP_TIME                 dev:8 wake:000496103.242784100
-    496103.221460163  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496103.243030786  WAKE                           num_fds:0
-    496103.243063321  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496103.243069992  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496103.243070543  DEV_SLEEP_TIME                 dev:8 wake:000496103.264397441
-    496103.243071991  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496103.264449458  WAKE                           num_fds:0
-    496103.264482559  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496103.264489289  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496103.264489826  DEV_SLEEP_TIME                 dev:8 wake:000496103.285816679
-    496103.264491259  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496103.285917784  WAKE                           num_fds:0
-    496103.285950585  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496103.285957336  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496103.285957867  DEV_SLEEP_TIME                 dev:8 wake:000496103.307284700
-    496103.285959300  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496103.307384411  WAKE                           num_fds:0
-    496103.307417092  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496103.307423752  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496103.307424298  DEV_SLEEP_TIME                 dev:8 wake:000496103.328751181
-    496103.307425727  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496103.328852327  WAKE                           num_fds:0
-    496103.328885203  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496103.328891733  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496103.328892279  DEV_SLEEP_TIME                 dev:8 wake:000496103.350219293
-    496103.328893698  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496103.350469121  WAKE                           num_fds:0
-    496103.350501911  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496103.350508482  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496103.350509028  DEV_SLEEP_TIME                 dev:8 wake:000496103.371836026
-    496103.350510602  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496103.372086512  WAKE                           num_fds:0
-    496103.372119994  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496103.372126719  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496103.372127266  DEV_SLEEP_TIME                 dev:8 wake:000496103.393454084
-    496103.372128694  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496103.393705741  WAKE                           num_fds:0
-    496103.393738817  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496103.393745367  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496103.393745909  DEV_SLEEP_TIME                 dev:8 wake:000496103.415072907
-    496103.393747357  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496103.415333750  WAKE                           num_fds:0
-    496103.415396976  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496103.415404193  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496103.415404729  DEV_SLEEP_TIME                 dev:8 wake:000496103.436731547
-    496103.415406162  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496103.436814764  WAKE                           num_fds:0
-    496103.436838871  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496103.436844444  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496103.436844804  DEV_SLEEP_TIME                 dev:8 wake:000496103.458172708
-    496103.436845753  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496103.458400798  WAKE                           num_fds:0
-    496103.458425703  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496103.458431340  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496103.458431693  DEV_SLEEP_TIME                 dev:8 wake:000496103.479759544
-    496103.458432626  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496103.479984935  WAKE                           num_fds:0
-    496103.480009455  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496103.480014980  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496103.480015343  DEV_SLEEP_TIME                 dev:8 wake:000496103.501343283
-    496103.480016274  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496103.501571552  WAKE                           num_fds:0
-    496103.501596146  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496103.501601748  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496103.501602114  DEV_SLEEP_TIME                 dev:8 wake:000496103.522930023
-    496103.501603047  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496103.523156936  WAKE                           num_fds:0
-    496103.523181532  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496103.523187086  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496103.523187437  DEV_SLEEP_TIME                 dev:8 wake:000496103.544515344
-    496103.523188369  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496103.544740125  WAKE                           num_fds:0
-    496103.544764472  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496103.544770082  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496103.544770446  DEV_SLEEP_TIME                 dev:8 wake:000496103.566098335
-    496103.544771384  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496103.566324453  WAKE                           num_fds:0
-    496103.566371205  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496103.566377992  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496103.566378422  DEV_SLEEP_TIME                 dev:8 wake:000496103.587705271
-    496103.566379814  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496103.587786308  WAKE                           num_fds:0
-    496103.587811809  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496103.587817500  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496103.587817863  DEV_SLEEP_TIME                 dev:8 wake:000496103.609145680
-    496103.587818973  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496103.609376370  WAKE                           num_fds:0
-    496103.609400933  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496103.609406578  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496103.609406944  DEV_SLEEP_TIME                 dev:8 wake:000496103.630734830
-    496103.609407885  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496103.630960573  WAKE                           num_fds:0
-    496103.630985847  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496103.630991468  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496103.630991821  DEV_SLEEP_TIME                 dev:8 wake:000496103.652319678
-    496103.630992762  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496103.652564901  WAKE                           num_fds:0
-    496103.652597787  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496103.652604413  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496103.652604944  DEV_SLEEP_TIME                 dev:8 wake:000496103.673931877
-    496103.652606367  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496103.674031369  WAKE                           num_fds:0
-    496103.674064982  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496103.674071517  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496103.674072063  DEV_SLEEP_TIME                 dev:8 wake:000496103.695399066
-    496103.674073511  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496103.695648238  WAKE                           num_fds:0
-    496103.695681735  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496103.695688531  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496103.695689082  DEV_SLEEP_TIME                 dev:8 wake:000496103.717015820
-    496103.695690631  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496103.717266806  WAKE                           num_fds:0
-    496103.717300549  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496103.717307220  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496103.717307761  DEV_SLEEP_TIME                 dev:8 wake:000496103.738634664
-    496103.717309194  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496103.738734857  WAKE                           num_fds:0
-    496103.738766890  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496103.738773646  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496103.738774192  DEV_SLEEP_TIME                 dev:8 wake:000496103.760101015
-    496103.738775641  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496103.760377525  WAKE                           num_fds:0
-    496103.760411473  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496103.760418114  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496103.760418660  DEV_SLEEP_TIME                 dev:8 wake:000496103.781745613
-    496103.760420098  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496103.781991819  WAKE                           num_fds:0
-    496103.782024419  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496103.782031049  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496103.782031595  DEV_SLEEP_TIME                 dev:8 wake:000496103.803358509
-    496103.782033034  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496103.803607936  WAKE                           num_fds:0
-    496103.803640907  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496103.803647532  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496103.803648068  DEV_SLEEP_TIME                 dev:8 wake:000496103.824975016
-    496103.803649532  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496103.825225166  WAKE                           num_fds:0
-    496103.825257711  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496103.825264397  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496103.825264928  DEV_SLEEP_TIME                 dev:8 wake:000496103.846591806
-    496103.825266386  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496103.846843268  WAKE                           num_fds:0
-    496103.846875868  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496103.846882468  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496103.846883004  DEV_SLEEP_TIME                 dev:8 wake:000496103.868210043
-    496103.846884453  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496103.868311589  WAKE                           num_fds:0
-    496103.868369121  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496103.868377471  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496103.868378172  DEV_SLEEP_TIME                 dev:8 wake:000496103.889703602
-    496103.868379906  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496103.889953992  WAKE                           num_fds:0
-    496103.889987179  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496103.889993729  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496103.889994275  DEV_SLEEP_TIME                 dev:8 wake:000496103.911321284
-    496103.889995693  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496103.911575091  WAKE                           num_fds:0
-    496103.911608678  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496103.911615268  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496103.911615805  DEV_SLEEP_TIME                 dev:8 wake:000496103.932942778
-    496103.911617248  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496103.933189961  WAKE                           num_fds:0
-    496103.933222922  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496103.933229587  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496103.933230138  DEV_SLEEP_TIME                 dev:8 wake:000496103.954557037
-    496103.933231577  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496103.954805246  WAKE                           num_fds:0
-    496103.954837916  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496103.954844572  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496103.954845108  DEV_SLEEP_TIME                 dev:8 wake:000496103.976172026
-    496103.954846546  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496103.976423272  WAKE                           num_fds:0
-    496103.976456529  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496103.976463194  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496103.976463851  DEV_SLEEP_TIME                 dev:8 wake:000496103.997790639
-    496103.976465369  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496103.998041575  WAKE                           num_fds:0
-    496103.998074456  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496103.998081157  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496103.998081628  DEV_SLEEP_TIME                 dev:8 wake:000496104.019408596
-    496103.998083011  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496104.019658098  WAKE                           num_fds:0
-    496104.019691300  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496104.019697830  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496104.019698386  DEV_SLEEP_TIME                 dev:8 wake:000496104.041025390
-    496104.019699855  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496104.041127397  WAKE                           num_fds:0
-    496104.041159612  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496104.041166252  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496104.041166798  DEV_SLEEP_TIME                 dev:8 wake:000496104.062493731
-    496104.041168216  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496104.062742647  WAKE                           num_fds:0
-    496104.062776280  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496104.062782875  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496104.062783416  DEV_SLEEP_TIME                 dev:8 wake:000496104.084110370
-    496104.062784850  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496104.084368467  WAKE                           num_fds:0
-    496104.084401583  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496104.084408108  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496104.084408649  DEV_SLEEP_TIME                 dev:8 wake:000496104.105735673
-    496104.084410068  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496104.105982034  WAKE                           num_fds:0
-    496104.106015741  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496104.106022367  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496104.106022913  DEV_SLEEP_TIME                 dev:8 wake:000496104.127349861
-    496104.106024341  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496104.127600586  WAKE                           num_fds:0
-    496104.127633903  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496104.127640669  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496104.127641320  DEV_SLEEP_TIME                 dev:8 wake:000496104.148968038
-    496104.127642744  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496104.149220703  WAKE                           num_fds:0
-    496104.149253800  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496104.149260330  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496104.149260871  DEV_SLEEP_TIME                 dev:8 wake:000496104.170587935
-    496104.149262269  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496104.170721179  WAKE                           num_fds:0
-    496104.170754495  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496104.170761211  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496104.170761747  DEV_SLEEP_TIME                 dev:8 wake:000496104.192088610
-    496104.170763170  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496104.192334148  WAKE                           num_fds:0
-    496104.192385321  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496104.192391932  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496104.192392483  DEV_SLEEP_TIME                 dev:8 wake:000496104.213719466
-    496104.192393901  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496104.213969626  WAKE                           num_fds:0
-    496104.214003173  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496104.214009784  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496104.214010325  DEV_SLEEP_TIME                 dev:8 wake:000496104.235337263
-    496104.214011758  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496104.235589010  WAKE                           num_fds:0
-    496104.235622558  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496104.235629233  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496104.235629765  DEV_SLEEP_TIME                 dev:8 wake:000496104.256956668
-    496104.235631193  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496104.257204853  WAKE                           num_fds:0
-    496104.257238110  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496104.257244850  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496104.257245391  DEV_SLEEP_TIME                 dev:8 wake:000496104.278572214
-    496104.257246820  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496104.278826247  WAKE                           num_fds:0
-    496104.278861418  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496104.278868550  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496104.278869111  DEV_SLEEP_TIME                 dev:8 wake:000496104.300195693
-    496104.278870524  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496104.300444238  WAKE                           num_fds:0
-    496104.300477420  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496104.300484135  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496104.300484672  DEV_SLEEP_TIME                 dev:8 wake:000496104.321811585
-    496104.300486110  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496104.322062401  WAKE                           num_fds:0
-    496104.322095693  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496104.322102308  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496104.322102975  DEV_SLEEP_TIME                 dev:8 wake:000496104.343429772
-    496104.322104433  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496104.343531524  WAKE                           num_fds:0
-    496104.343564685  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496104.343571270  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496104.343571817  DEV_SLEEP_TIME                 dev:8 wake:000496104.364898785
-    496104.343573265  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496104.365146048  WAKE                           num_fds:0
-    496104.365179570  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496104.365186266  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496104.365186807  DEV_SLEEP_TIME                 dev:8 wake:000496104.386513665
-    496104.365188245  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496104.386763683  WAKE                           num_fds:0
-    496104.386797366  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496104.386803886  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496104.386804427  DEV_SLEEP_TIME                 dev:8 wake:000496104.408131476
-    496104.386805876  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496104.408381509  WAKE                           num_fds:0
-    496104.408415418  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496104.408422178  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496104.408422729  DEV_SLEEP_TIME                 dev:8 wake:000496104.429749482
-    496104.408424293  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496104.430002674  WAKE                           num_fds:0
-    496104.430036221  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496104.430042706  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496104.430043283  DEV_SLEEP_TIME                 dev:8 wake:000496104.451370316
-    496104.430044801  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496104.451618891  WAKE                           num_fds:0
-    496104.451651647  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496104.451658357  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496104.451658904  DEV_SLEEP_TIME                 dev:8 wake:000496104.472985797
-    496104.451660332  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496104.473234513  WAKE                           num_fds:0
-    496104.473268396  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496104.473274946  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496104.473275518  DEV_SLEEP_TIME                 dev:8 wake:000496104.494602496
-    496104.473276971  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496104.494850299  WAKE                           num_fds:0
-    496104.494883872  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496104.494890522  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496104.494891058  DEV_SLEEP_TIME                 dev:8 wake:000496104.516217982
-    496104.494892497  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496104.516465429  WAKE                           num_fds:0
-    496104.516497849  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496104.516504484  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496104.516505025  DEV_SLEEP_TIME                 dev:8 wake:000496104.537831949
-    496104.516506474  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496104.538084509  WAKE                           num_fds:0
-    496104.538116688  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496104.538123419  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496104.538123950  DEV_SLEEP_TIME                 dev:8 wake:000496104.559450813
-    496104.538125398  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496104.559701493  WAKE                           num_fds:0
-    496104.559734554  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496104.559741089  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496104.559741635  DEV_SLEEP_TIME                 dev:8 wake:000496104.581068669
-    496104.559743104  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496104.581317008  WAKE                           num_fds:0
-    496104.581373920  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496104.581381016  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496104.581381557  DEV_SLEEP_TIME                 dev:8 wake:000496104.602708135
-    496104.581383061  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496104.602955819  WAKE                           num_fds:0
-    496104.602989075  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496104.602995756  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496104.602996417  DEV_SLEEP_TIME                 dev:8 wake:000496104.624323190
-    496104.602997951  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496104.624574071  WAKE                           num_fds:0
-    496104.624606786  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496104.624613336  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496104.624613887  DEV_SLEEP_TIME                 dev:8 wake:000496104.645940886
-    496104.624615321  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496104.646039125  WAKE                           num_fds:0
-    496104.646072131  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496104.646078791  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496104.646079338  DEV_SLEEP_TIME                 dev:8 wake:000496104.667406256
-    496104.646080766  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496104.667623494  WAKE                           num_fds:0
-    496104.667664082  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496104.667672797  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496104.667673469  DEV_SLEEP_TIME                 dev:8 wake:000496104.688999335
-    496104.667675403  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496104.689252361  WAKE                           num_fds:0
-    496104.689285583  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496104.689292348  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496104.689292895  DEV_SLEEP_TIME                 dev:8 wake:000496104.710619672
-    496104.689294348  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496104.710870232  WAKE                           num_fds:0
-    496104.710903940  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496104.710910650  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496104.710911312  DEV_SLEEP_TIME                 dev:8 wake:000496104.732238050
-    496104.710912735  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496104.732487847  WAKE                           num_fds:0
-    496104.732520778  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496104.732527314  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496104.732527860  DEV_SLEEP_TIME                 dev:8 wake:000496104.753854878
-    496104.732529308  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496104.754105003  WAKE                           num_fds:0
-    496104.754137408  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496104.754144128  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496104.754144664  DEV_SLEEP_TIME                 dev:8 wake:000496104.775471517
-    496104.754146103  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496104.775719892  WAKE                           num_fds:0
-    496104.775752763  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496104.775759303  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496104.775759849  DEV_SLEEP_TIME                 dev:8 wake:000496104.797086893
-    496104.775761277  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496104.797331022  WAKE                           num_fds:0
-    496104.797383769  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496104.797390394  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496104.797390941  DEV_SLEEP_TIME                 dev:8 wake:000496104.818717909
-    496104.797392374  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496104.818964300  WAKE                           num_fds:0
-    496104.818996575  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496104.819003275  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496104.819003816  DEV_SLEEP_TIME                 dev:8 wake:000496104.840330689
-    496104.819005234  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496104.840580843  WAKE                           num_fds:0
-    496104.840613864  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496104.840620555  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496104.840621086  DEV_SLEEP_TIME                 dev:8 wake:000496104.861947939
-    496104.840622509  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496104.862198068  WAKE                           num_fds:0
-    496104.862231100  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496104.862237675  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496104.862238216  DEV_SLEEP_TIME                 dev:8 wake:000496104.883565189
-    496104.862239805  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496104.883815458  WAKE                           num_fds:0
-    496104.883848640  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496104.883855210  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496104.883855756  DEV_SLEEP_TIME                 dev:8 wake:000496104.905182735
-    496104.883857185  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496104.905430593  WAKE                           num_fds:0
-    496104.905463559  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496104.905470210  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496104.905470756  DEV_SLEEP_TIME                 dev:8 wake:000496104.926797684
-    496104.905472199  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496104.927045448  WAKE                           num_fds:0
-    496104.927078660  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496104.927085360  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496104.927085897  DEV_SLEEP_TIME                 dev:8 wake:000496104.948412810
-    496104.927087325  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496104.948489252  WAKE                           num_fds:0
-    496104.948522459  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496104.948529140  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496104.948529691  DEV_SLEEP_TIME                 dev:8 wake:000496104.969856534
-    496104.948531134  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496104.969958296  WAKE                           num_fds:0
-    496104.969991277  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496104.969997942  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496104.969998494  DEV_SLEEP_TIME                 dev:8 wake:000496104.991325397
-    496104.969999942  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496104.991576864  WAKE                           num_fds:0
-    496104.991610752  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496104.991617362  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496104.991617838  DEV_SLEEP_TIME                 dev:8 wake:000496105.012944852
-    496104.991619206  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496105.013197317  WAKE                           num_fds:0
-    496105.013229992  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496105.013236557  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496105.013237093  DEV_SLEEP_TIME                 dev:8 wake:000496105.034564082
-    496105.013238527  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496105.034815719  WAKE                           num_fds:0
-    496105.034849256  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496105.034855866  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496105.034856413  DEV_SLEEP_TIME                 dev:8 wake:000496105.056183386
-    496105.034857836  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496105.056432743  WAKE                           num_fds:0
-    496105.056465699  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496105.056472284  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496105.056472830  DEV_SLEEP_TIME                 dev:8 wake:000496105.077799809
-    496105.056474259  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496105.078050495  WAKE                           num_fds:0
-    496105.078083877  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496105.078090507  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496105.078091058  DEV_SLEEP_TIME                 dev:8 wake:000496105.099417966
-    496105.078092492  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496105.099669604  WAKE                           num_fds:0
-    496105.099702540  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496105.099707727  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496105.099708263  DEV_SLEEP_TIME                 dev:8 wake:000496105.121036634
-    496105.099709746  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496105.121285461  WAKE                           num_fds:0
-    496105.121317951  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496105.121324611  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496105.121325268  DEV_SLEEP_TIME                 dev:8 wake:000496105.142652076
-    496105.121326736  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496105.142903778  WAKE                           num_fds:0
-    496105.142936749  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496105.142943460  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496105.142943991  DEV_SLEEP_TIME                 dev:8 wake:000496105.164270849
-    496105.142945419  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496105.164519885  WAKE                           num_fds:0
-    496105.164552300  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496105.164558900  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496105.164559441  DEV_SLEEP_TIME                 dev:8 wake:000496105.185886405
-    496105.164560985  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496105.186137030  WAKE                           num_fds:0
-    496105.186170513  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496105.186177243  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496105.186177769  DEV_SLEEP_TIME                 dev:8 wake:000496105.207504597
-    496105.186179198  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496105.207754355  WAKE                           num_fds:0
-    496105.207786910  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496105.207793495  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496105.207794042  DEV_SLEEP_TIME                 dev:8 wake:000496105.229121015
-    496105.207795495  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496105.229371835  WAKE                           num_fds:0
-    496105.229404380  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496105.229411061  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496105.229411587  DEV_SLEEP_TIME                 dev:8 wake:000496105.250738520
-    496105.229413065  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496105.250989191  WAKE                           num_fds:0
-    496105.251022533  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496105.251029098  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496105.251029649  DEV_SLEEP_TIME                 dev:8 wake:000496105.272356643
-    496105.251031078  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496105.272465525  WAKE                           num_fds:0
-    496105.272498271  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496105.272505137  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496105.272505678  DEV_SLEEP_TIME                 dev:8 wake:000496105.293832411
-    496105.272507131  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496105.294080130  WAKE                           num_fds:0
-    496105.294113276  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496105.294119922  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496105.294120458  DEV_SLEEP_TIME                 dev:8 wake:000496105.315447346
-    496105.294121896  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496105.315695525  WAKE                           num_fds:0
-    496105.315727564  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496105.315734204  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496105.315734751  DEV_SLEEP_TIME                 dev:8 wake:000496105.337061674
-    496105.315736194  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496105.337311722  WAKE                           num_fds:0
-    496105.337363963  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496105.337370999  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496105.337371535  DEV_SLEEP_TIME                 dev:8 wake:000496105.358698148
-    496105.337373004  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496105.358950763  WAKE                           num_fds:0
-    496105.358983855  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496105.358990410  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496105.358990956  DEV_SLEEP_TIME                 dev:8 wake:000496105.380317989
-    496105.358992429  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496105.380568549  WAKE                           num_fds:0
-    496105.380601365  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496105.380607900  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496105.380608451  DEV_SLEEP_TIME                 dev:8 wake:000496105.401935460
-    496105.380609894  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496105.402180688  WAKE                           num_fds:0
-    496105.402212987  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496105.402219633  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496105.402220169  DEV_SLEEP_TIME                 dev:8 wake:000496105.423547082
-    496105.402221627  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496105.423793407  WAKE                           num_fds:0
-    496105.423826664  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496105.423833274  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496105.423833815  DEV_SLEEP_TIME                 dev:8 wake:000496105.445160758
-    496105.423835239  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496105.445409013  WAKE                           num_fds:0
-    496105.445441924  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496105.445448494  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496105.445449045  DEV_SLEEP_TIME                 dev:8 wake:000496105.466776074
-    496105.445450639  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496105.467024434  WAKE                           num_fds:0
-    496105.467057591  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496105.467064336  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496105.467064882  DEV_SLEEP_TIME                 dev:8 wake:000496105.488391700
-    496105.467066331  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496105.488641904  WAKE                           num_fds:0
-    496105.488674479  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496105.488681345  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496105.488681882  DEV_SLEEP_TIME                 dev:8 wake:000496105.510008579
-    496105.488683310  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496105.510259461  WAKE                           num_fds:0
-    496105.510292828  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496105.510299403  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496105.510299944  DEV_SLEEP_TIME                 dev:8 wake:000496105.531626892
-    496105.510301372  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496105.531877692  WAKE                           num_fds:0
-    496105.531910704  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496105.531917324  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496105.531917855  DEV_SLEEP_TIME                 dev:8 wake:000496105.553244793
-    496105.531919283  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496105.553365934  WAKE                           num_fds:0
-    496105.553398950  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496105.553405576  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496105.553406122  DEV_SLEEP_TIME                 dev:8 wake:000496105.574733040
-    496105.553407535  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496105.574834893  WAKE                           num_fds:0
-    496105.574867167  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496105.574873822  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496105.574874354  DEV_SLEEP_TIME                 dev:8 wake:000496105.596201262
-    496105.574875787  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496105.596446710  WAKE                           num_fds:0
-    496105.596479731  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496105.596486276  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496105.596486812  DEV_SLEEP_TIME                 dev:8 wake:000496105.617813856
-    496105.596488281  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496105.618065669  WAKE                           num_fds:0
-    496105.618099372  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496105.618106092  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496105.618106619  DEV_SLEEP_TIME                 dev:8 wake:000496105.639433497
-    496105.618108077  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496105.639683655  WAKE                           num_fds:0
-    496105.639714487  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496105.639721508  SET_DEV_WAKE                   dev:8 hw_level:2000 sleep:976
-    496105.639722054  DEV_SLEEP_TIME                 dev:8 wake:000496105.660048626
-    496105.639723477  SLEEP                          sleep:000000000.020333333 longest_wake:000158140
-    496105.660301504  WAKE                           num_fds:0
-    496105.660334535  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496105.660367015  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496105.660367572  DEV_SLEEP_TIME                 dev:8 wake:000496105.681668625
-    496105.660369040  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496105.681942991  WAKE                           num_fds:0
-    496105.681976147  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496105.681982883  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496105.681983419  DEV_SLEEP_TIME                 dev:8 wake:000496105.703310237
-    496105.681984857  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496105.703558436  WAKE                           num_fds:0
-    496105.703591708  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496105.703598413  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496105.703598950  DEV_SLEEP_TIME                 dev:8 wake:000496105.724925813
-    496105.703600388  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496105.725176313  WAKE                           num_fds:0
-    496105.725208658  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496105.725215549  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496105.725216080  DEV_SLEEP_TIME                 dev:8 wake:000496105.746542803
-    496105.725217568  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496105.746792781  WAKE                           num_fds:0
-    496105.746825331  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496105.746831876  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496105.746832453  DEV_SLEEP_TIME                 dev:8 wake:000496105.768159431
-    496105.746833886  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496105.768409820  WAKE                           num_fds:0
-    496105.768442711  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496105.768449406  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496105.768449953  DEV_SLEEP_TIME                 dev:8 wake:000496105.789776891
-    496105.768451421  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496105.790025698  WAKE                           num_fds:0
-    496105.790058914  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496105.790065650  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496105.790066186  DEV_SLEEP_TIME                 dev:8 wake:000496105.811393034
-    496105.790067619  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496105.811643934  WAKE                           num_fds:0
-    496105.811676870  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496105.811683431  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496105.811683977  DEV_SLEEP_TIME                 dev:8 wake:000496105.833010970
-    496105.811685410  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496105.833259676  WAKE                           num_fds:0
-    496105.833293284  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496105.833299784  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496105.833300325  DEV_SLEEP_TIME                 dev:8 wake:000496105.854627374
-    496105.833301869  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496105.854876535  WAKE                           num_fds:0
-    496105.854909596  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496105.854916192  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496105.854916733  DEV_SLEEP_TIME                 dev:8 wake:000496105.876243686
-    496105.854918171  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496105.876365955  WAKE                           num_fds:0
-    496105.876403862  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496105.876410763  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496105.876411304  DEV_SLEEP_TIME                 dev:8 wake:000496105.897738112
-    496105.876412748  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496105.897985014  WAKE                           num_fds:0
-    496105.898017996  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496105.898024566  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496105.898025112  DEV_SLEEP_TIME                 dev:8 wake:000496105.919352085
-    496105.898026530  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496105.919602019  WAKE                           num_fds:0
-    496105.919635095  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496105.919641750  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496105.919642291  DEV_SLEEP_TIME                 dev:8 wake:000496105.940969270
-    496105.919643785  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496105.941221058  WAKE                           num_fds:0
-    496105.941253709  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496105.941260544  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496105.941261091  DEV_SLEEP_TIME                 dev:8 wake:000496105.962587808
-    496105.941262514  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496105.962838809  WAKE                           num_fds:0
-    496105.962871800  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496105.962878330  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496105.962878866  DEV_SLEEP_TIME                 dev:8 wake:000496105.984205910
-    496105.962880375  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496105.984453327  WAKE                           num_fds:0
-    496105.984486108  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496105.984492768  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496105.984493239  DEV_SLEEP_TIME                 dev:8 wake:000496106.005820173
-    496105.984494638  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496106.006072327  WAKE                           num_fds:0
-    496106.006105654  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496106.006112179  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496106.006112715  DEV_SLEEP_TIME                 dev:8 wake:000496106.027439754
-    496106.006114163  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496106.027691130  WAKE                           num_fds:0
-    496106.027723174  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496106.027729900  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496106.027730446  DEV_SLEEP_TIME                 dev:8 wake:000496106.049057314
-    496106.027731899  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496106.049118332  WAKE                           num_fds:0
-    496106.049149760  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496106.049156335  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496106.049156886  DEV_SLEEP_TIME                 dev:8 wake:000496106.070483854
-    496106.049158304  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496106.070587359  WAKE                           num_fds:0
-    496106.070620506  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496106.070627071  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496106.070627617  DEV_SLEEP_TIME                 dev:8 wake:000496106.091954571
-    496106.070629041  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496106.092200591  WAKE                           num_fds:0
-    496106.092233722  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496106.092240292  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496106.092240839  DEV_SLEEP_TIME                 dev:8 wake:000496106.113567797
-    496106.092242292  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496106.113817610  WAKE                           num_fds:0
-    496106.113850350  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496106.113857006  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496106.113857657  DEV_SLEEP_TIME                 dev:8 wake:000496106.135184485
-    496106.113859181  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496106.135434824  WAKE                           num_fds:0
-    496106.135468362  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496106.135474907  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496106.135475448  DEV_SLEEP_TIME                 dev:8 wake:000496106.156802487
-    496106.135476881  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496106.157054420  WAKE                           num_fds:0
-    496106.157087412  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496106.157094092  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496106.157094628  DEV_SLEEP_TIME                 dev:8 wake:000496106.178421511
-    496106.157096102  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496106.178468120  WAKE                           num_fds:0
-    496106.178501477  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496106.178508318  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496106.178508849  DEV_SLEEP_TIME                 dev:8 wake:000496106.199835752
-    496106.178510348  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496106.200086092  WAKE                           num_fds:0
-    496106.200118818  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496106.200125523  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496106.200126065  DEV_SLEEP_TIME                 dev:8 wake:000496106.221452913
-    496106.200127518  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496106.221581095  WAKE                           num_fds:0
-    496106.221614773  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496106.221621473  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496106.221621999  DEV_SLEEP_TIME                 dev:8 wake:000496106.242948877
-    496106.221623513  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496106.243200696  WAKE                           num_fds:0
-    496106.243234359  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496106.243241069  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496106.243241610  DEV_SLEEP_TIME                 dev:8 wake:000496106.264568453
-    496106.243243039  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496106.264635264  WAKE                           num_fds:0
-    496106.264667323  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496106.264673953  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496106.264674489  DEV_SLEEP_TIME                 dev:8 wake:000496106.286001423
-    496106.264675948  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496106.286249247  WAKE                           num_fds:0
-    496106.286282017  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496106.286288618  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496106.286289159  DEV_SLEEP_TIME                 dev:8 wake:000496106.307616107
-    496106.286290592  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496106.307868020  WAKE                           num_fds:0
-    496106.307901131  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496106.307907807  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496106.307908353  DEV_SLEEP_TIME                 dev:8 wake:000496106.329235196
-    496106.307909776  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496106.329485164  WAKE                           num_fds:0
-    496106.329518181  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496106.329525026  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496106.329525563  DEV_SLEEP_TIME                 dev:8 wake:000496106.350852295
-    496106.329527071  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496106.350909770  WAKE                           num_fds:0
-    496106.350941839  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496106.350948820  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496106.350949357  DEV_SLEEP_TIME                 dev:8 wake:000496106.372276054
-    496106.350950795  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496106.372524735  WAKE                           num_fds:0
-    496106.372558297  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496106.372564937  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496106.372565469  DEV_SLEEP_TIME                 dev:8 wake:000496106.393892407
-    496106.372566922  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496106.394139539  WAKE                           num_fds:0
-    496106.394172305  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496106.394178965  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496106.394179517  DEV_SLEEP_TIME                 dev:8 wake:000496106.415506450
-    496106.394180940  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496106.415761560  WAKE                           num_fds:0
-    496106.415794401  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496106.415801106  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496106.415801663  DEV_SLEEP_TIME                 dev:8 wake:000496106.437128511
-    496106.415803201  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496106.437377767  WAKE                           num_fds:0
-    496106.437410964  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496106.437417664  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496106.437418206  DEV_SLEEP_TIME                 dev:8 wake:000496106.458745059
-    496106.437419634  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496106.458813434  WAKE                           num_fds:0
-    496106.458845648  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496106.458852308  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496106.458852850  DEV_SLEEP_TIME                 dev:8 wake:000496106.480179718
-    496106.458854293  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496106.480280397  WAKE                           num_fds:0
-    496106.480312832  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496106.480319598  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496106.480320129  DEV_SLEEP_TIME                 dev:8 wake:000496106.501646992
-    496106.480321598  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496106.501898760  WAKE                           num_fds:0
-    496106.501932046  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496106.501938717  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496106.501939258  DEV_SLEEP_TIME                 dev:8 wake:000496106.523266191
-    496106.501940681  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496106.523515268  WAKE                           num_fds:0
-    496106.523547652  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496106.523554283  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496106.523554824  DEV_SLEEP_TIME                 dev:8 wake:000496106.544881747
-    496106.523556262  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496106.545129010  WAKE                           num_fds:0
-    496106.545161906  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496106.545168631  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496106.545169168  DEV_SLEEP_TIME                 dev:8 wake:000496106.566495986
-    496106.545170621  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496106.566746781  WAKE                           num_fds:0
-    496106.566779802  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496106.566786387  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496106.566786938  DEV_SLEEP_TIME                 dev:8 wake:000496106.588113892
-    496106.566788472  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496106.588381170  WAKE                           num_fds:0
-    496106.588413956  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496106.588420536  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496106.588421082  DEV_SLEEP_TIME                 dev:8 wake:000496106.609748050
-    496106.588422505  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496106.609997674  WAKE                           num_fds:0
-    496106.610030184  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496106.610036814  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496106.610037365  DEV_SLEEP_TIME                 dev:8 wake:000496106.631364289
-    496106.610038794  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496106.631612047  WAKE                           num_fds:0
-    496106.631644993  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496106.631651568  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496106.631652109  DEV_SLEEP_TIME                 dev:8 wake:000496106.652979113
-    496106.631653543  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496106.653079141  WAKE                           num_fds:0
-    496106.653111641  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496106.653118306  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496106.653118862  DEV_SLEEP_TIME                 dev:8 wake:000496106.674445796
-    496106.653120301  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496106.674531169  WAKE                           num_fds:0
-    496106.674566811  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496106.674573477  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496106.674574018  DEV_SLEEP_TIME                 dev:8 wake:000496106.695900961
-    496106.674575446  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496106.696158187  WAKE                           num_fds:0
-    496106.696191840  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496106.696198555  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496106.696199092  DEV_SLEEP_TIME                 dev:8 wake:000496106.717525935
-    496106.696201021  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496106.717774134  WAKE                           num_fds:0
-    496106.717807591  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496106.717814186  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496106.717814727  DEV_SLEEP_TIME                 dev:8 wake:000496106.739141681
-    496106.717816196  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496106.739392065  WAKE                           num_fds:0
-    496106.739426254  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496106.739432934  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496106.739433591  DEV_SLEEP_TIME                 dev:8 wake:000496106.760760369
-    496106.739435179  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496106.760007023  WAKE                           num_fds:1
-    496106.760016440  PB_MSG                         msg_id:1
-    496106.760018008  DEV_REMOVED                    dev:8
-    496106.760032377  SLEEP                          sleep:000000000.000000000 longest_wake:000158140
-    496118.354002034  WAKE                           num_fds:1
-    496118.354013360  PB_MSG                         msg_id:0
-    496118.354015856  DEV_ADDED                      dev:8
-    496118.354055002  ODEV_NO_STREAMS                dev:8 hw_level:0 write:2048
-    496118.354057131  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496118.354057663  DEV_SLEEP_TIME                 dev:8 wake:000496118.375389076
-    496118.354058795  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496118.354063185  WAKE                           num_fds:1
-    496118.354066032  PB_MSG                         msg_id:2
-    496118.354066598  WRITE_STREAMS_WAIT             stream:140000
-    496118.354078641  STREAM_ADDED                   id:140000 dev:8
-    496118.354085291  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2048
-    496118.354096267  FILL_AUDIO                     dev:8 hw_level:2048
-    496118.354097760  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496118.354098121  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496118.354098893  WRITE_STREAMS_MIXED            write_limit:0
-    496118.354111888  FILL_AUDIO_DONE                hw_level:2048 total_written:0 min_cb_level:1024
-    496118.354120337  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:2048
-    496118.354120738  DEV_SLEEP_TIME                 dev:8 wake:000496118.396779331
-    496118.354121530  SLEEP                          sleep:000000000.042666666 longest_wake:000158140
-    496118.354648175  WAKE                           num_fds:1
-    496118.354678825  FILL_AUDIO                     dev:8 hw_level:2048
-    496118.354682173  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496118.354690728  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496118.354702069  DEV_STREAM_MIX                 written:1024 read:1024
-    496118.354703026  WRITE_STREAMS_MIXED            write_limit:1024
-    496118.354705141  FILL_AUDIO_DONE                hw_level:2048 total_written:1024 min_cb_level:1024
-    496118.354706975  STREAM_SLEEP_TIME              id:140000 wake:000496118.375409268
-    496118.354714473  SET_DEV_WAKE                   dev:8 hw_level:3072 sleep:3072
-    496118.354714989  DEV_SLEEP_TIME                 dev:8 wake:000496118.418706179
-    496118.354716537  SLEEP                          sleep:000000000.020703089 longest_wake:000158140
-    496118.375445608  WAKE                           num_fds:0
-    496118.375470776  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496118.375493288  FILL_AUDIO                     dev:8 hw_level:2208
-    496118.375498029  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496118.375498460  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496118.375499492  WRITE_STREAMS_MIXED            write_limit:0
-    496118.375502529  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496118.375511756  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496118.375512242  DEV_SLEEP_TIME                 dev:8 wake:000496118.421503923
-    496118.375514156  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496118.375625007  WAKE                           num_fds:1
-    496118.375650521  FILL_AUDIO                     dev:8 hw_level:2208
-    496118.375652766  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496118.375665305  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496118.375680355  DEV_STREAM_MIX                 written:1024 read:1024
-    496118.375681277  WRITE_STREAMS_MIXED            write_limit:1024
-    496118.375683131  FILL_AUDIO_DONE                hw_level:2208 total_written:1024 min_cb_level:1024
-    496118.375684780  STREAM_SLEEP_TIME              id:140000 wake:000496118.396742601
-    496118.375692087  SET_DEV_WAKE                   dev:8 hw_level:3232 sleep:3232
-    496118.375692633  DEV_SLEEP_TIME                 dev:8 wake:000496118.443017306
-    496118.375694217  SLEEP                          sleep:000000000.021058628 longest_wake:000158140
-    496118.396778232  WAKE                           num_fds:0
-    496118.396804492  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2224
-    496118.396830803  FILL_AUDIO                     dev:8 hw_level:2176
-    496118.396835373  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496118.396835890  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496118.396837007  WRITE_STREAMS_MIXED            write_limit:0
-    496118.396839979  FILL_AUDIO_DONE                hw_level:2176 total_written:0 min_cb_level:1024
-    496118.396848248  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496118.396848825  DEV_SLEEP_TIME                 dev:8 wake:000496118.442174490
-    496118.396850488  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496118.396934603  WAKE                           num_fds:1
-    496118.396958914  FILL_AUDIO                     dev:8 hw_level:2176
-    496118.396961299  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496118.396978694  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496118.396986317  DEV_STREAM_MIX                 written:1024 read:1024
-    496118.396987114  WRITE_STREAMS_MIXED            write_limit:1024
-    496118.396989123  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496118.396990582  STREAM_SLEEP_TIME              id:140000 wake:000496118.418075934
-    496118.396997628  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496118.396998149  DEV_SLEEP_TIME                 dev:8 wake:000496118.463656556
-    496118.396999758  SLEEP                          sleep:000000000.021086044 longest_wake:000158140
-    496118.418106179  WAKE                           num_fds:0
-    496118.418127885  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496118.418148733  FILL_AUDIO                     dev:8 hw_level:2192
-    496118.418152962  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496118.418153584  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496118.418154666  WRITE_STREAMS_MIXED            write_limit:0
-    496118.418157608  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496118.418166053  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496118.418166554  DEV_SLEEP_TIME                 dev:8 wake:000496118.463825722
-    496118.418168558  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496118.418266114  WAKE                           num_fds:1
-    496118.418294374  FILL_AUDIO                     dev:8 hw_level:2192
-    496118.418296063  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496118.418306216  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496118.418312010  DEV_STREAM_MIX                 written:1024 read:1024
-    496118.418312576  WRITE_STREAMS_MIXED            write_limit:1024
-    496118.418313588  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496118.418314871  STREAM_SLEEP_TIME              id:140000 wake:000496118.439409267
-    496118.418320720  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496118.418321136  DEV_SLEEP_TIME                 dev:8 wake:000496118.485314360
-    496118.418322293  SLEEP                          sleep:000000000.021094907 longest_wake:000158140
-    496118.439496761  WAKE                           num_fds:0
-    496118.439530519  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496118.439586553  FILL_AUDIO                     dev:8 hw_level:2208
-    496118.439591966  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496118.439592507  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496118.439593695  WRITE_STREAMS_MIXED            write_limit:0
-    496118.439597258  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496118.439605853  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496118.439606354  DEV_SLEEP_TIME                 dev:8 wake:000496118.485598576
-    496118.439608218  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496118.439716288  WAKE                           num_fds:1
-    496118.439750747  FILL_AUDIO                     dev:8 hw_level:2208
-    496118.439752842  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496118.439767887  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496118.439772748  DEV_STREAM_MIX                 written:1024 read:1024
-    496118.439773409  WRITE_STREAMS_MIXED            write_limit:1024
-    496118.439774372  FILL_AUDIO_DONE                hw_level:2208 total_written:1024 min_cb_level:1024
-    496118.439775434  STREAM_SLEEP_TIME              id:140000 wake:000496118.460742600
-    496118.439781538  SET_DEV_WAKE                   dev:8 hw_level:3232 sleep:3232
-    496118.439781894  DEV_SLEEP_TIME                 dev:8 wake:000496118.507108286
-    496118.439782906  SLEEP                          sleep:000000000.020967647 longest_wake:000158140
-    496118.460789142  WAKE                           num_fds:0
-    496118.460810982  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2224
-    496118.460836150  FILL_AUDIO                     dev:8 hw_level:2176
-    496118.460840610  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496118.460841127  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496118.460842124  WRITE_STREAMS_MIXED            write_limit:0
-    496118.460844995  FILL_AUDIO_DONE                hw_level:2176 total_written:0 min_cb_level:1024
-    496118.460853270  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496118.460853771  DEV_SLEEP_TIME                 dev:8 wake:000496118.506179516
-    496118.460855876  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496118.460930107  WAKE                           num_fds:1
-    496118.460954508  FILL_AUDIO                     dev:8 hw_level:2176
-    496118.460955716  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496118.460966080  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496118.460971678  DEV_STREAM_MIX                 written:1024 read:1024
-    496118.460972239  WRITE_STREAMS_MIXED            write_limit:1024
-    496118.460973136  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496118.460974234  STREAM_SLEEP_TIME              id:140000 wake:000496118.482075933
-    496118.460979857  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496118.460980238  DEV_SLEEP_TIME                 dev:8 wake:000496118.527640454
-    496118.460981235  SLEEP                          sleep:000000000.021102145 longest_wake:000158140
-    496118.482113920  WAKE                           num_fds:0
-    496118.482135974  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496118.482159569  FILL_AUDIO                     dev:8 hw_level:2192
-    496118.482163130  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496118.482163491  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496118.482164624  WRITE_STREAMS_MIXED            write_limit:0
-    496118.482167216  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496118.482175522  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496118.482175939  DEV_SLEEP_TIME                 dev:8 wake:000496118.527835011
-    496118.482177634  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496118.482244261  WAKE                           num_fds:1
-    496118.482270354  FILL_AUDIO                     dev:8 hw_level:2192
-    496118.482271744  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496118.482283118  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496118.482287734  DEV_STREAM_MIX                 written:1024 read:1024
-    496118.482288242  WRITE_STREAMS_MIXED            write_limit:1024
-    496118.482289425  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496118.482290547  STREAM_SLEEP_TIME              id:140000 wake:000496118.503409266
-    496118.482297115  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496118.482297491  DEV_SLEEP_TIME                 dev:8 wake:000496118.549289966
-    496118.482298539  SLEEP                          sleep:000000000.021119300 longest_wake:000158140
-    496118.503438723  WAKE                           num_fds:0
-    496118.503461769  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496118.503484060  FILL_AUDIO                     dev:8 hw_level:2208
-    496118.503488733  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496118.503489426  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496118.503490351  WRITE_STREAMS_MIXED            write_limit:0
-    496118.503493748  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496118.503503115  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496118.503503465  DEV_SLEEP_TIME                 dev:8 wake:000496118.549495009
-    496118.503505371  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496118.503555888  WAKE                           num_fds:1
-    496118.503581022  FILL_AUDIO                     dev:8 hw_level:2208
-    496118.503582739  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496118.503592868  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496118.503597479  DEV_STREAM_MIX                 written:1024 read:1024
-    496118.503598142  WRITE_STREAMS_MIXED            write_limit:1024
-    496118.503599527  FILL_AUDIO_DONE                hw_level:2208 total_written:1024 min_cb_level:1024
-    496118.503600467  STREAM_SLEEP_TIME              id:140000 wake:000496118.524742599
-    496118.503605592  SET_DEV_WAKE                   dev:8 hw_level:3232 sleep:3232
-    496118.503605971  DEV_SLEEP_TIME                 dev:8 wake:000496118.570933428
-    496118.503607064  SLEEP                          sleep:000000000.021142504 longest_wake:000158140
-    496118.524771187  WAKE                           num_fds:0
-    496118.524792444  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2224
-    496118.524811297  FILL_AUDIO                     dev:8 hw_level:2224
-    496118.524814347  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496118.524814633  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496118.524815430  WRITE_STREAMS_MIXED            write_limit:0
-    496118.524817932  FILL_AUDIO_DONE                hw_level:2224 total_written:0 min_cb_level:1024
-    496118.524825913  SET_DEV_WAKE                   dev:8 hw_level:2224 sleep:2224
-    496118.524826242  DEV_SLEEP_TIME                 dev:8 wake:000496118.571152173
-    496118.524827565  SLEEP                          sleep:000000000.046333333 longest_wake:000158140
-    496118.524879030  WAKE                           num_fds:1
-    496118.524900851  FILL_AUDIO                     dev:8 hw_level:2176
-    496118.524902685  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496118.524911230  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496118.524915787  DEV_STREAM_MIX                 written:1024 read:1024
-    496118.524916319  WRITE_STREAMS_MIXED            write_limit:1024
-    496118.524917543  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496118.524918588  STREAM_SLEEP_TIME              id:140000 wake:000496118.546075932
-    496118.524924426  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496118.524924899  DEV_SLEEP_TIME                 dev:8 wake:000496118.591584778
-    496118.524925885  SLEEP                          sleep:000000000.021157820 longest_wake:000158140
-    496118.546097655  WAKE                           num_fds:0
-    496118.546112541  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496118.546126703  FILL_AUDIO                     dev:8 hw_level:2192
-    496118.546128925  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496118.546129092  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496118.546129613  WRITE_STREAMS_MIXED            write_limit:0
-    496118.546130952  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496118.546136209  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496118.546136370  DEV_SLEEP_TIME                 dev:8 wake:000496118.591798078
-    496118.546137203  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496118.546161324  WAKE                           num_fds:1
-    496118.546173430  FILL_AUDIO                     dev:8 hw_level:2192
-    496118.546174217  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496118.546179310  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496118.546183028  DEV_STREAM_MIX                 written:1024 read:1024
-    496118.546183368  WRITE_STREAMS_MIXED            write_limit:1024
-    496118.546183858  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496118.546184331  STREAM_SLEEP_TIME              id:140000 wake:000496118.567409265
-    496118.546189248  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496118.546189390  DEV_SLEEP_TIME                 dev:8 wake:000496118.613184163
-    496118.546189920  SLEEP                          sleep:000000000.021225102 longest_wake:000158140
-    496118.567424239  WAKE                           num_fds:0
-    496118.567439411  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496118.567452286  FILL_AUDIO                     dev:8 hw_level:2208
-    496118.567454872  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496118.567455174  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496118.567455825  WRITE_STREAMS_MIXED            write_limit:0
-    496118.567457476  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496118.567464131  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496118.567464314  DEV_SLEEP_TIME                 dev:8 wake:000496118.613458159
-    496118.567465126  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496118.567490875  WAKE                           num_fds:1
-    496118.567505725  FILL_AUDIO                     dev:8 hw_level:2208
-    496118.567506502  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496118.567511232  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496118.567512996  DEV_STREAM_MIX                 written:1024 read:1024
-    496118.567513203  WRITE_STREAMS_MIXED            write_limit:1024
-    496118.567513727  FILL_AUDIO_DONE                hw_level:2208 total_written:1024 min_cb_level:1024
-    496118.567514129  STREAM_SLEEP_TIME              id:140000 wake:000496118.588742598
-    496118.567518840  SET_DEV_WAKE                   dev:8 hw_level:3232 sleep:3232
-    496118.567518992  DEV_SLEEP_TIME                 dev:8 wake:000496118.634847296
-    496118.567519449  SLEEP                          sleep:000000000.021228635 longest_wake:000158140
-    496118.588780218  WAKE                           num_fds:0
-    496118.588794235  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2224
-    496118.588810187  FILL_AUDIO                     dev:8 hw_level:2224
-    496118.588812252  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496118.588812393  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496118.588812942  WRITE_STREAMS_MIXED            write_limit:0
-    496118.588814561  FILL_AUDIO_DONE                hw_level:2224 total_written:0 min_cb_level:1024
-    496118.588819039  SET_DEV_WAKE                   dev:8 hw_level:2224 sleep:2224
-    496118.588819202  DEV_SLEEP_TIME                 dev:8 wake:000496118.635148443
-    496118.588820036  SLEEP                          sleep:000000000.046333333 longest_wake:000158140
-    496118.588854210  WAKE                           num_fds:1
-    496118.588870487  FILL_AUDIO                     dev:8 hw_level:2176
-    496118.588871082  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496118.588877727  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496118.588880046  DEV_STREAM_MIX                 written:1024 read:1024
-    496118.588880375  WRITE_STREAMS_MIXED            write_limit:1024
-    496118.588881027  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496118.588881474  STREAM_SLEEP_TIME              id:140000 wake:000496118.610075931
-    496118.588886516  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496118.588886664  DEV_SLEEP_TIME                 dev:8 wake:000496118.655547937
-    496118.588887092  SLEEP                          sleep:000000000.021194660 longest_wake:000158140
-    496118.610097814  WAKE                           num_fds:0
-    496118.610123399  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496118.610137913  FILL_AUDIO                     dev:8 hw_level:2192
-    496118.610140374  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496118.610140519  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496118.610141505  WRITE_STREAMS_MIXED            write_limit:0
-    496118.610143585  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496118.610149415  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496118.610149652  DEV_SLEEP_TIME                 dev:8 wake:000496118.655810785
-    496118.610150372  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496118.610181468  WAKE                           num_fds:1
-    496118.610197004  FILL_AUDIO                     dev:8 hw_level:2192
-    496118.610198230  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496118.610203984  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496118.610206515  DEV_STREAM_MIX                 written:1024 read:1024
-    496118.610206788  WRITE_STREAMS_MIXED            write_limit:1024
-    496118.610207314  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496118.610207787  STREAM_SLEEP_TIME              id:140000 wake:000496118.631409264
-    496118.610212963  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496118.610213165  DEV_SLEEP_TIME                 dev:8 wake:000496118.677207596
-    496118.610213722  SLEEP                          sleep:000000000.021201668 longest_wake:000158140
-    496118.631437687  WAKE                           num_fds:0
-    496118.631451138  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496118.631464477  FILL_AUDIO                     dev:8 hw_level:2208
-    496118.631466576  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496118.631466740  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496118.631467215  WRITE_STREAMS_MIXED            write_limit:0
-    496118.631468559  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496118.631474164  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496118.631474394  DEV_SLEEP_TIME                 dev:8 wake:000496118.677468970
-    496118.631475094  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496118.631557823  WAKE                           num_fds:1
-    496118.631572529  FILL_AUDIO                     dev:8 hw_level:2208
-    496118.631573346  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496118.631578696  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496118.631580226  DEV_STREAM_MIX                 written:1024 read:1024
-    496118.631580423  WRITE_STREAMS_MIXED            write_limit:1024
-    496118.631581039  FILL_AUDIO_DONE                hw_level:2208 total_written:1024 min_cb_level:1024
-    496118.631581413  STREAM_SLEEP_TIME              id:140000 wake:000496118.652742597
-    496118.631585882  SET_DEV_WAKE                   dev:8 hw_level:3232 sleep:3232
-    496118.631585996  DEV_SLEEP_TIME                 dev:8 wake:000496118.698914565
-    496118.631586399  SLEEP                          sleep:000000000.021161365 longest_wake:000158140
-    496118.652804884  WAKE                           num_fds:0
-    496118.652853602  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2176
-    496118.652906300  FILL_AUDIO                     dev:8 hw_level:2176
-    496118.652916970  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496118.652917116  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496118.652918057  WRITE_STREAMS_MIXED            write_limit:0
-    496118.652923991  FILL_AUDIO_DONE                hw_level:2176 total_written:0 min_cb_level:1024
-    496118.652949242  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496118.652950075  DEV_SLEEP_TIME                 dev:8 wake:000496118.698258600
-    496118.652951721  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496118.653034042  WAKE                           num_fds:1
-    496118.653082023  FILL_AUDIO                     dev:8 hw_level:2176
-    496118.653087608  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496118.653115701  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496118.653126099  DEV_STREAM_MIX                 written:1024 read:1024
-    496118.653126366  WRITE_STREAMS_MIXED            write_limit:1024
-    496118.653128297  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496118.653129600  STREAM_SLEEP_TIME              id:140000 wake:000496118.674075930
-    496118.653141084  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496118.653141227  DEV_SLEEP_TIME                 dev:8 wake:000496118.719796011
-    496118.653142617  SLEEP                          sleep:000000000.020946585 longest_wake:000158140
-    496118.674106400  WAKE                           num_fds:0
-    496118.674120878  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496118.674135054  FILL_AUDIO                     dev:8 hw_level:2192
-    496118.674137010  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496118.674137173  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496118.674137648  WRITE_STREAMS_MIXED            write_limit:0
-    496118.674139240  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496118.674144657  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496118.674144812  DEV_SLEEP_TIME                 dev:8 wake:000496118.719806407
-    496118.674145446  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496118.674178767  WAKE                           num_fds:1
-    496118.674190201  FILL_AUDIO                     dev:8 hw_level:2192
-    496118.674190857  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496118.674195897  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496118.674197446  DEV_STREAM_MIX                 written:1024 read:1024
-    496118.674197623  WRITE_STREAMS_MIXED            write_limit:1024
-    496118.674197903  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496118.674198238  STREAM_SLEEP_TIME              id:140000 wake:000496118.695409263
-    496118.674202644  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496118.674202766  DEV_SLEEP_TIME                 dev:8 wake:000496118.741198093
-    496118.674203141  SLEEP                          sleep:000000000.021211170 longest_wake:000158140
-    496118.695425973  WAKE                           num_fds:0
-    496118.695442160  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496118.695456413  FILL_AUDIO                     dev:8 hw_level:2208
-    496118.695458598  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496118.695458801  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496118.695459398  WRITE_STREAMS_MIXED            write_limit:0
-    496118.695461090  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496118.695466757  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496118.695466949  DEV_SLEEP_TIME                 dev:8 wake:000496118.741461697
-    496118.695467723  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496118.695503662  WAKE                           num_fds:1
-    496118.695518956  FILL_AUDIO                     dev:8 hw_level:2208
-    496118.695519793  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496118.695526046  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496118.695528211  DEV_STREAM_MIX                 written:1024 read:1024
-    496118.695528463  WRITE_STREAMS_MIXED            write_limit:1024
-    496118.695528914  FILL_AUDIO_DONE                hw_level:2208 total_written:1024 min_cb_level:1024
-    496118.695529424  STREAM_SLEEP_TIME              id:140000 wake:000496118.716742596
-    496118.695534156  SET_DEV_WAKE                   dev:8 hw_level:3232 sleep:3232
-    496118.695534347  DEV_SLEEP_TIME                 dev:8 wake:000496118.762862556
-    496118.695534780  SLEEP                          sleep:000000000.021213373 longest_wake:000158140
-    496118.716796026  WAKE                           num_fds:0
-    496118.716844186  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2176
-    496118.716881094  FILL_AUDIO                     dev:8 hw_level:2176
-    496118.716892655  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496118.716892910  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496118.716894646  WRITE_STREAMS_MIXED            write_limit:0
-    496118.716899983  FILL_AUDIO_DONE                hw_level:2176 total_written:0 min_cb_level:1024
-    496118.716910139  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496118.716910410  DEV_SLEEP_TIME                 dev:8 wake:000496118.762235198
-    496118.716914465  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496118.717037504  WAKE                           num_fds:1
-    496118.717069219  FILL_AUDIO                     dev:8 hw_level:2176
-    496118.717073251  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496118.717093009  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496118.717099155  DEV_STREAM_MIX                 written:1024 read:1024
-    496118.717099507  WRITE_STREAMS_MIXED            write_limit:1024
-    496118.717100701  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496118.717101460  STREAM_SLEEP_TIME              id:140000 wake:000496118.738075929
-    496118.717107009  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496118.717107210  DEV_SLEEP_TIME                 dev:8 wake:000496118.783767828
-    496118.717109169  SLEEP                          sleep:000000000.020974767 longest_wake:000158140
-    496118.738099922  WAKE                           num_fds:0
-    496118.738113821  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496118.738128082  FILL_AUDIO                     dev:8 hw_level:2192
-    496118.738130192  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496118.738130387  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496118.738130972  WRITE_STREAMS_MIXED            write_limit:0
-    496118.738132446  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496118.738137824  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496118.738138054  DEV_SLEEP_TIME                 dev:8 wake:000496118.783799661
-    496118.738138719  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496118.738174290  WAKE                           num_fds:1
-    496118.738189554  FILL_AUDIO                     dev:8 hw_level:2192
-    496118.738190236  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496118.738195073  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496118.738198050  DEV_STREAM_MIX                 written:1024 read:1024
-    496118.738198380  WRITE_STREAMS_MIXED            write_limit:1024
-    496118.738198938  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496118.738199357  STREAM_SLEEP_TIME              id:140000 wake:000496118.759409262
-    496118.738203929  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496118.738204062  DEV_SLEEP_TIME                 dev:8 wake:000496118.805199158
-    496118.738204447  SLEEP                          sleep:000000000.021210104 longest_wake:000158140
-    496118.759429248  WAKE                           num_fds:0
-    496118.759443563  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496118.759460244  FILL_AUDIO                     dev:8 hw_level:2208
-    496118.759462267  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496118.759462398  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496118.759462818  WRITE_STREAMS_MIXED            write_limit:0
-    496118.759464345  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496118.759469501  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496118.759469655  DEV_SLEEP_TIME                 dev:8 wake:000496118.805464831
-    496118.759470367  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496118.759517748  WAKE                           num_fds:1
-    496118.759531678  FILL_AUDIO                     dev:8 hw_level:2208
-    496118.759532357  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496118.759537800  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496118.759540617  DEV_STREAM_MIX                 written:1024 read:1024
-    496118.759540905  WRITE_STREAMS_MIXED            write_limit:1024
-    496118.759541444  FILL_AUDIO_DONE                hw_level:2208 total_written:1024 min_cb_level:1024
-    496118.759541852  STREAM_SLEEP_TIME              id:140000 wake:000496118.780742595
-    496118.759546251  SET_DEV_WAKE                   dev:8 hw_level:3232 sleep:3232
-    496118.759546357  DEV_SLEEP_TIME                 dev:8 wake:000496118.826875025
-    496118.759546696  SLEEP                          sleep:000000000.021200903 longest_wake:000158140
-    496118.780759760  WAKE                           num_fds:0
-    496118.780775008  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2224
-    496118.780790131  FILL_AUDIO                     dev:8 hw_level:2224
-    496118.780791975  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496118.780792123  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496118.780792803  WRITE_STREAMS_MIXED            write_limit:0
-    496118.780793974  FILL_AUDIO_DONE                hw_level:2224 total_written:0 min_cb_level:1024
-    496118.780800286  SET_DEV_WAKE                   dev:8 hw_level:2224 sleep:2224
-    496118.780800421  DEV_SLEEP_TIME                 dev:8 wake:000496118.827128100
-    496118.780801289  SLEEP                          sleep:000000000.046333333 longest_wake:000158140
-    496118.780847586  WAKE                           num_fds:1
-    496118.780862518  FILL_AUDIO                     dev:8 hw_level:2176
-    496118.780863379  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496118.780868464  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496118.780870041  DEV_STREAM_MIX                 written:1024 read:1024
-    496118.780870230  WRITE_STREAMS_MIXED            write_limit:1024
-    496118.780870593  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496118.780870958  STREAM_SLEEP_TIME              id:140000 wake:000496118.802075928
-    496118.780875355  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496118.780875478  DEV_SLEEP_TIME                 dev:8 wake:000496118.847537449
-    496118.780875847  SLEEP                          sleep:000000000.021205145 longest_wake:000158140
-    496118.802102780  WAKE                           num_fds:0
-    496118.802120472  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496118.802137210  FILL_AUDIO                     dev:8 hw_level:2192
-    496118.802139917  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496118.802140064  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496118.802140609  WRITE_STREAMS_MIXED            write_limit:0
-    496118.802142432  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496118.802147701  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496118.802147852  DEV_SLEEP_TIME                 dev:8 wake:000496118.847809557
-    496118.802148516  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496118.802195380  WAKE                           num_fds:1
-    496118.802209967  FILL_AUDIO                     dev:8 hw_level:2192
-    496118.802210703  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496118.802217788  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496118.802219789  DEV_STREAM_MIX                 written:1024 read:1024
-    496118.802219989  WRITE_STREAMS_MIXED            write_limit:1024
-    496118.802220449  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496118.802220872  STREAM_SLEEP_TIME              id:140000 wake:000496118.823409261
-    496118.802225303  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496118.802225418  DEV_SLEEP_TIME                 dev:8 wake:000496118.869220669
-    496118.802225820  SLEEP                          sleep:000000000.021188592 longest_wake:000158140
-    496118.823426698  WAKE                           num_fds:0
-    496118.823441151  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496118.823457708  FILL_AUDIO                     dev:8 hw_level:2208
-    496118.823460089  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496118.823460330  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496118.823460828  WRITE_STREAMS_MIXED            write_limit:0
-    496118.823462430  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496118.823467790  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496118.823467949  DEV_SLEEP_TIME                 dev:8 wake:000496118.869462918
-    496118.823468618  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496118.823507440  WAKE                           num_fds:1
-    496118.823521661  FILL_AUDIO                     dev:8 hw_level:2208
-    496118.823522559  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496118.823529596  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496118.823531920  DEV_STREAM_MIX                 written:1024 read:1024
-    496118.823532244  WRITE_STREAMS_MIXED            write_limit:1024
-    496118.823533007  FILL_AUDIO_DONE                hw_level:2208 total_written:1024 min_cb_level:1024
-    496118.823533383  STREAM_SLEEP_TIME              id:140000 wake:000496118.844742594
-    496118.823538141  SET_DEV_WAKE                   dev:8 hw_level:3232 sleep:3232
-    496118.823538313  DEV_SLEEP_TIME                 dev:8 wake:000496118.890866568
-    496118.823538782  SLEEP                          sleep:000000000.021209359 longest_wake:000158140
-    496118.844793611  WAKE                           num_fds:0
-    496118.844842455  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2176
-    496118.844888762  FILL_AUDIO                     dev:8 hw_level:2176
-    496118.844899355  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496118.844899489  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496118.844901921  WRITE_STREAMS_MIXED            write_limit:0
-    496118.844909466  FILL_AUDIO_DONE                hw_level:2176 total_written:0 min_cb_level:1024
-    496118.844922258  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496118.844923289  DEV_SLEEP_TIME                 dev:8 wake:000496118.890245017
-    496118.844926573  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496118.845050151  WAKE                           num_fds:1
-    496118.845096292  FILL_AUDIO                     dev:8 hw_level:2176
-    496118.845101172  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496118.845127890  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496118.845137332  DEV_STREAM_MIX                 written:1024 read:1024
-    496118.845138226  WRITE_STREAMS_MIXED            write_limit:1024
-    496118.845140015  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496118.845143090  STREAM_SLEEP_TIME              id:140000 wake:000496118.866075927
-    496118.845154493  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496118.845155261  DEV_SLEEP_TIME                 dev:8 wake:000496118.911809504
-    496118.845156233  SLEEP                          sleep:000000000.020933089 longest_wake:000158140
-    496118.866103566  WAKE                           num_fds:0
-    496118.866119526  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496118.866134595  FILL_AUDIO                     dev:8 hw_level:2192
-    496118.866137519  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496118.866137677  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496118.866138149  WRITE_STREAMS_MIXED            write_limit:0
-    496118.866140088  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496118.866146294  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496118.866146511  DEV_SLEEP_TIME                 dev:8 wake:000496118.911807282
-    496118.866147537  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496118.866177435  WAKE                           num_fds:1
-    496118.866192557  FILL_AUDIO                     dev:8 hw_level:2192
-    496118.866193498  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496118.866198506  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496118.866200264  DEV_STREAM_MIX                 written:1024 read:1024
-    496118.866200426  WRITE_STREAMS_MIXED            write_limit:1024
-    496118.866200819  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496118.866201185  STREAM_SLEEP_TIME              id:140000 wake:000496118.887409260
-    496118.866205681  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496118.866205793  DEV_SLEEP_TIME                 dev:8 wake:000496118.933201012
-    496118.866206313  SLEEP                          sleep:000000000.021208248 longest_wake:000158140
-    496118.887425173  WAKE                           num_fds:0
-    496118.887438794  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496118.887455874  FILL_AUDIO                     dev:8 hw_level:2208
-    496118.887457788  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496118.887457958  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496118.887458388  WRITE_STREAMS_MIXED            write_limit:0
-    496118.887460020  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496118.887465184  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496118.887465331  DEV_SLEEP_TIME                 dev:8 wake:000496118.933460516
-    496118.887465992  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496118.887502924  WAKE                           num_fds:1
-    496118.887517026  FILL_AUDIO                     dev:8 hw_level:2208
-    496118.887517553  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496118.887522198  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496118.887524704  DEV_STREAM_MIX                 written:1024 read:1024
-    496118.887524986  WRITE_STREAMS_MIXED            write_limit:1024
-    496118.887525564  FILL_AUDIO_DONE                hw_level:2208 total_written:1024 min_cb_level:1024
-    496118.887525976  STREAM_SLEEP_TIME              id:140000 wake:000496118.908742593
-    496118.887530536  SET_DEV_WAKE                   dev:8 hw_level:3232 sleep:3232
-    496118.887530658  DEV_SLEEP_TIME                 dev:8 wake:000496118.954859148
-    496118.887531007  SLEEP                          sleep:000000000.021216778 longest_wake:000158140
-    496118.908761014  WAKE                           num_fds:0
-    496118.908774255  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2224
-    496118.908788078  FILL_AUDIO                     dev:8 hw_level:2224
-    496118.908791095  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496118.908791227  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496118.908791643  WRITE_STREAMS_MIXED            write_limit:0
-    496118.908792879  FILL_AUDIO_DONE                hw_level:2224 total_written:0 min_cb_level:1024
-    496118.908798303  SET_DEV_WAKE                   dev:8 hw_level:2224 sleep:2224
-    496118.908798448  DEV_SLEEP_TIME                 dev:8 wake:000496118.955126660
-    496118.908799066  SLEEP                          sleep:000000000.046333333 longest_wake:000158140
-    496118.908840065  WAKE                           num_fds:1
-    496118.908854501  FILL_AUDIO                     dev:8 hw_level:2176
-    496118.908855141  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496118.908859990  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496118.908861559  DEV_STREAM_MIX                 written:1024 read:1024
-    496118.908861758  WRITE_STREAMS_MIXED            write_limit:1024
-    496118.908862178  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496118.908862536  STREAM_SLEEP_TIME              id:140000 wake:000496118.930075926
-    496118.908866946  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496118.908867060  DEV_SLEEP_TIME                 dev:8 wake:000496118.975529057
-    496118.908867432  SLEEP                          sleep:000000000.021213535 longest_wake:000158140
-    496118.930094024  WAKE                           num_fds:0
-    496118.930107968  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496118.930124375  FILL_AUDIO                     dev:8 hw_level:2192
-    496118.930126805  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496118.930127218  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496118.930127938  WRITE_STREAMS_MIXED            write_limit:0
-    496118.930129478  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496118.930136050  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496118.930136345  DEV_SLEEP_TIME                 dev:8 wake:000496118.975796868
-    496118.930137375  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496118.930180425  WAKE                           num_fds:1
-    496118.930195856  FILL_AUDIO                     dev:8 hw_level:2192
-    496118.930197015  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496118.930202916  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496118.930204953  DEV_STREAM_MIX                 written:1024 read:1024
-    496118.930205305  WRITE_STREAMS_MIXED            write_limit:1024
-    496118.930205985  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496118.930206375  STREAM_SLEEP_TIME              id:140000 wake:000496118.951409259
-    496118.930211062  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496118.930211211  DEV_SLEEP_TIME                 dev:8 wake:000496118.997206196
-    496118.930211579  SLEEP                          sleep:000000000.021203063 longest_wake:000158140
-    496118.951427153  WAKE                           num_fds:0
-    496118.951440867  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496118.951457640  FILL_AUDIO                     dev:8 hw_level:2208
-    496118.951459818  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496118.951459979  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496118.951460418  WRITE_STREAMS_MIXED            write_limit:0
-    496118.951462188  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496118.951468096  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496118.951468253  DEV_SLEEP_TIME                 dev:8 wake:000496118.997462723
-    496118.951469025  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496118.951511365  WAKE                           num_fds:1
-    496118.951527108  FILL_AUDIO                     dev:8 hw_level:2208
-    496118.951527922  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496118.951533170  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496118.951534775  DEV_STREAM_MIX                 written:1024 read:1024
-    496118.951534973  WRITE_STREAMS_MIXED            write_limit:1024
-    496118.951536328  FILL_AUDIO_DONE                hw_level:2208 total_written:1024 min_cb_level:1024
-    496118.951536704  STREAM_SLEEP_TIME              id:140000 wake:000496118.972742592
-    496118.951541447  SET_DEV_WAKE                   dev:8 hw_level:3232 sleep:3232
-    496118.951541573  DEV_SLEEP_TIME                 dev:8 wake:000496119.018869867
-    496118.951542050  SLEEP                          sleep:000000000.021206058 longest_wake:000158140
-    496118.972761770  WAKE                           num_fds:0
-    496118.972776276  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2224
-    496118.972797345  FILL_AUDIO                     dev:8 hw_level:2224
-    496118.972803518  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496118.972803884  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496118.972804436  WRITE_STREAMS_MIXED            write_limit:0
-    496118.972806221  FILL_AUDIO_DONE                hw_level:2224 total_written:0 min_cb_level:1024
-    496118.972822039  SET_DEV_WAKE                   dev:8 hw_level:2224 sleep:2224
-    496118.972822283  DEV_SLEEP_TIME                 dev:8 wake:000496119.019140179
-    496118.972823594  SLEEP                          sleep:000000000.046333333 longest_wake:000158140
-    496118.972882579  WAKE                           num_fds:1
-    496118.972898523  FILL_AUDIO                     dev:8 hw_level:2176
-    496118.972899309  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496118.972905056  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496118.972906877  DEV_STREAM_MIX                 written:1024 read:1024
-    496118.972907047  WRITE_STREAMS_MIXED            write_limit:1024
-    496118.972907575  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496118.972907888  STREAM_SLEEP_TIME              id:140000 wake:000496118.994075925
-    496118.972912755  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496118.972912878  DEV_SLEEP_TIME                 dev:8 wake:000496119.039574389
-    496118.972913362  SLEEP                          sleep:000000000.021168202 longest_wake:000158140
-    496118.994114414  WAKE                           num_fds:0
-    496118.994140794  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496118.994156916  FILL_AUDIO                     dev:8 hw_level:2192
-    496118.994159491  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496118.994159650  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496118.994160169  WRITE_STREAMS_MIXED            write_limit:0
-    496118.994164191  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496118.994171200  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496118.994171359  DEV_SLEEP_TIME                 dev:8 wake:000496119.039831814
-    496118.994172168  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496118.994205388  WAKE                           num_fds:1
-    496118.994222444  FILL_AUDIO                     dev:8 hw_level:2192
-    496118.994223295  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496118.994229362  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496118.994232914  DEV_STREAM_MIX                 written:1024 read:1024
-    496118.994233254  WRITE_STREAMS_MIXED            write_limit:1024
-    496118.994233932  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496118.994234486  STREAM_SLEEP_TIME              id:140000 wake:000496119.015409258
-    496118.994239352  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496118.994239573  DEV_SLEEP_TIME                 dev:8 wake:000496119.061234321
-    496118.994239966  SLEEP                          sleep:000000000.021174937 longest_wake:000158140
-    496119.015494273  WAKE                           num_fds:0
-    496119.015517241  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496119.015543933  FILL_AUDIO                     dev:8 hw_level:2208
-    496119.015548213  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496119.015548684  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496119.015549922  WRITE_STREAMS_MIXED            write_limit:0
-    496119.015552888  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496119.015562300  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496119.015563077  DEV_SLEEP_TIME                 dev:8 wake:000496119.061554262
-    496119.015565252  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496119.015647747  WAKE                           num_fds:1
-    496119.015677927  FILL_AUDIO                     dev:8 hw_level:2208
-    496119.015679811  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496119.015695257  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496119.015700629  DEV_STREAM_MIX                 written:1024 read:1024
-    496119.015701276  WRITE_STREAMS_MIXED            write_limit:1024
-    496119.015702835  FILL_AUDIO_DONE                hw_level:2208 total_written:1024 min_cb_level:1024
-    496119.015704443  STREAM_SLEEP_TIME              id:140000 wake:000496119.036742591
-    496119.015711715  SET_DEV_WAKE                   dev:8 hw_level:3232 sleep:3232
-    496119.015712136  DEV_SLEEP_TIME                 dev:8 wake:000496119.083037125
-    496119.015713529  SLEEP                          sleep:000000000.021038799 longest_wake:000158140
-    496119.036811692  WAKE                           num_fds:0
-    496119.036832364  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2176
-    496119.036857117  FILL_AUDIO                     dev:8 hw_level:2176
-    496119.036861557  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496119.036862023  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496119.036863201  WRITE_STREAMS_MIXED            write_limit:0
-    496119.036866368  FILL_AUDIO_DONE                hw_level:2176 total_written:0 min_cb_level:1024
-    496119.036875123  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496119.036875629  DEV_SLEEP_TIME                 dev:8 wake:000496119.082201545
-    496119.036877418  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496119.036947164  WAKE                           num_fds:1
-    496119.036973731  FILL_AUDIO                     dev:8 hw_level:2176
-    496119.036975349  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496119.036987853  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496119.036993702  DEV_STREAM_MIX                 written:1024 read:1024
-    496119.036994293  WRITE_STREAMS_MIXED            write_limit:1024
-    496119.036995441  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496119.036996538  STREAM_SLEEP_TIME              id:140000 wake:000496119.058075924
-    496119.037002352  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496119.037002703  DEV_SLEEP_TIME                 dev:8 wake:000496119.103662693
-    496119.037003665  SLEEP                          sleep:000000000.021079897 longest_wake:000158140
-    496119.058114096  WAKE                           num_fds:0
-    496119.058141173  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496119.058170250  FILL_AUDIO                     dev:8 hw_level:2192
-    496119.058174380  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496119.058174856  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496119.058176079  WRITE_STREAMS_MIXED            write_limit:0
-    496119.058179060  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496119.058186803  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496119.058187274  DEV_SLEEP_TIME                 dev:8 wake:000496119.103846909
-    496119.058189705  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496119.058271589  WAKE                           num_fds:1
-    496119.058298411  FILL_AUDIO                     dev:8 hw_level:2192
-    496119.058300596  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496119.058314814  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496119.058320702  DEV_STREAM_MIX                 written:1024 read:1024
-    496119.058321610  WRITE_STREAMS_MIXED            write_limit:1024
-    496119.058323068  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496119.058324672  STREAM_SLEEP_TIME              id:140000 wake:000496119.079409257
-    496119.058343765  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496119.058344301  DEV_SLEEP_TIME                 dev:8 wake:000496119.125323950
-    496119.058345935  SLEEP                          sleep:000000000.021085307 longest_wake:000158140
-    496119.079480188  WAKE                           num_fds:0
-    496119.079495256  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496119.079509743  FILL_AUDIO                     dev:8 hw_level:2208
-    496119.079512120  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496119.079512360  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496119.079512974  WRITE_STREAMS_MIXED            write_limit:0
-    496119.079514674  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496119.079521296  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496119.079521544  DEV_SLEEP_TIME                 dev:8 wake:000496119.125515340
-    496119.079522548  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496119.079554700  WAKE                           num_fds:1
-    496119.079570214  FILL_AUDIO                     dev:8 hw_level:2208
-    496119.079570828  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496119.079578731  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496119.079580760  DEV_STREAM_MIX                 written:1024 read:1024
-    496119.079581043  WRITE_STREAMS_MIXED            write_limit:1024
-    496119.079581535  FILL_AUDIO_DONE                hw_level:2208 total_written:1024 min_cb_level:1024
-    496119.079582051  STREAM_SLEEP_TIME              id:140000 wake:000496119.100742590
-    496119.079586774  SET_DEV_WAKE                   dev:8 hw_level:3232 sleep:3232
-    496119.079586940  DEV_SLEEP_TIME                 dev:8 wake:000496119.146915148
-    496119.079587422  SLEEP                          sleep:000000000.021160775 longest_wake:000158140
-    496119.100983708  WAKE                           num_fds:0
-    496119.101006952  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2176
-    496119.101039086  FILL_AUDIO                     dev:8 hw_level:2176
-    496119.101043727  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496119.101044840  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496119.101045897  WRITE_STREAMS_MIXED            write_limit:0
-    496119.101049455  FILL_AUDIO_DONE                hw_level:2176 total_written:0 min_cb_level:1024
-    496119.101057769  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496119.101058316  DEV_SLEEP_TIME                 dev:8 wake:000496119.146384086
-    496119.101060616  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496119.101152679  WAKE                           num_fds:1
-    496119.101184647  FILL_AUDIO                     dev:8 hw_level:2176
-    496119.101186787  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496119.101201316  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496119.101205696  DEV_STREAM_MIX                 written:1024 read:1024
-    496119.101206237  WRITE_STREAMS_MIXED            write_limit:1024
-    496119.101207300  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496119.101208487  STREAM_SLEEP_TIME              id:140000 wake:000496119.122075923
-    496119.101214476  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496119.101214857  DEV_SLEEP_TIME                 dev:8 wake:000496119.167874687
-    496119.101215909  SLEEP                          sleep:000000000.020867902 longest_wake:000158140
-    496119.122173783  WAKE                           num_fds:0
-    496119.122197212  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496119.122228920  FILL_AUDIO                     dev:8 hw_level:2192
-    496119.122234067  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496119.122234538  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496119.122235896  WRITE_STREAMS_MIXED            write_limit:0
-    496119.122238828  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496119.122248681  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496119.122249172  DEV_SLEEP_TIME                 dev:8 wake:000496119.167907429
-    496119.122251026  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496119.122367113  WAKE                           num_fds:1
-    496119.122402269  FILL_AUDIO                     dev:8 hw_level:2192
-    496119.122404324  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496119.122419379  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496119.122424220  DEV_STREAM_MIX                 written:1024 read:1024
-    496119.122424812  WRITE_STREAMS_MIXED            write_limit:1024
-    496119.122425909  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496119.122427007  STREAM_SLEEP_TIME              id:140000 wake:000496119.143409256
-    496119.122433276  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496119.122433662  DEV_SLEEP_TIME                 dev:8 wake:000496119.189426520
-    496119.122434704  SLEEP                          sleep:000000000.020982736 longest_wake:000158140
-    496119.143482275  WAKE                           num_fds:0
-    496119.143518679  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496119.143547377  FILL_AUDIO                     dev:8 hw_level:2208
-    496119.143553840  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496119.143554353  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496119.143555696  WRITE_STREAMS_MIXED            write_limit:0
-    496119.143561538  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496119.143570165  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496119.143570707  DEV_SLEEP_TIME                 dev:8 wake:000496119.189563077
-    496119.143572956  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496119.143667142  WAKE                           num_fds:1
-    496119.143695684  FILL_AUDIO                     dev:8 hw_level:2208
-    496119.143698005  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496119.143716969  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496119.143722870  DEV_STREAM_MIX                 written:1024 read:1024
-    496119.143723459  WRITE_STREAMS_MIXED            write_limit:1024
-    496119.143724850  FILL_AUDIO_DONE                hw_level:2208 total_written:1024 min_cb_level:1024
-    496119.143725889  STREAM_SLEEP_TIME              id:140000 wake:000496119.164742589
-    496119.143732011  SET_DEV_WAKE                   dev:8 hw_level:3232 sleep:3232
-    496119.143732364  DEV_SLEEP_TIME                 dev:8 wake:000496119.211058825
-    496119.143734365  SLEEP                          sleep:000000000.021017097 longest_wake:000158140
-    496119.164992925  WAKE                           num_fds:0
-    496119.165016424  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2176
-    496119.165048107  FILL_AUDIO                     dev:8 hw_level:2176
-    496119.165052342  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496119.165053244  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496119.165054607  WRITE_STREAMS_MIXED            write_limit:0
-    496119.165057874  FILL_AUDIO_DONE                hw_level:2176 total_written:0 min_cb_level:1024
-    496119.165065933  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496119.165066519  DEV_SLEEP_TIME                 dev:8 wake:000496119.210392460
-    496119.165068399  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496119.165163333  WAKE                           num_fds:1
-    496119.165194605  FILL_AUDIO                     dev:8 hw_level:2176
-    496119.165196530  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496119.165211549  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496119.165216014  DEV_STREAM_MIX                 written:1024 read:1024
-    496119.165216566  WRITE_STREAMS_MIXED            write_limit:1024
-    496119.165217433  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496119.165218575  STREAM_SLEEP_TIME              id:140000 wake:000496119.186075922
-    496119.165224735  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496119.165225080  DEV_SLEEP_TIME                 dev:8 wake:000496119.231884610
-    496119.165226073  SLEEP                          sleep:000000000.020857978 longest_wake:000158140
-    496119.186110447  WAKE                           num_fds:0
-    496119.186133796  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496119.186157525  FILL_AUDIO                     dev:8 hw_level:2192
-    496119.186161725  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496119.186162151  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496119.186163629  WRITE_STREAMS_MIXED            write_limit:0
-    496119.186166561  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496119.186175261  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496119.186175828  DEV_SLEEP_TIME                 dev:8 wake:000496119.231834500
-    496119.186177707  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496119.186268025  WAKE                           num_fds:1
-    496119.186295584  FILL_AUDIO                     dev:8 hw_level:2192
-    496119.186297734  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496119.186308379  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496119.186312207  DEV_STREAM_MIX                 written:1024 read:1024
-    496119.186312824  WRITE_STREAMS_MIXED            write_limit:1024
-    496119.186313921  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496119.186315004  STREAM_SLEEP_TIME              id:140000 wake:000496119.207409255
-    496119.186320902  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496119.186321253  DEV_SLEEP_TIME                 dev:8 wake:000496119.253314533
-    496119.186322296  SLEEP                          sleep:000000000.021094722 longest_wake:000158140
-    496119.207471590  WAKE                           num_fds:0
-    496119.207496974  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496119.207525795  FILL_AUDIO                     dev:8 hw_level:2208
-    496119.207530271  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496119.207530767  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496119.207532561  WRITE_STREAMS_MIXED            write_limit:0
-    496119.207535513  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496119.207543070  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496119.207543581  DEV_SLEEP_TIME                 dev:8 wake:000496119.253536665
-    496119.207545335  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496119.207627590  WAKE                           num_fds:1
-    496119.207655034  FILL_AUDIO                     dev:8 hw_level:2208
-    496119.207657244  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496119.207673451  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496119.207679410  DEV_STREAM_MIX                 written:1024 read:1024
-    496119.207680162  WRITE_STREAMS_MIXED            write_limit:1024
-    496119.207681600  FILL_AUDIO_DONE                hw_level:2208 total_written:1024 min_cb_level:1024
-    496119.207683068  STREAM_SLEEP_TIME              id:140000 wake:000496119.228742588
-    496119.207690606  SET_DEV_WAKE                   dev:8 hw_level:3232 sleep:3232
-    496119.207691172  DEV_SLEEP_TIME                 dev:8 wake:000496119.275015700
-    496119.207692600  SLEEP                          sleep:000000000.021060221 longest_wake:000158140
-    496119.228853062  WAKE                           num_fds:0
-    496119.228876095  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2176
-    496119.228907021  FILL_AUDIO                     dev:8 hw_level:2176
-    496119.228912308  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496119.228913446  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496119.228914463  WRITE_STREAMS_MIXED            write_limit:0
-    496119.228917315  FILL_AUDIO_DONE                hw_level:2176 total_written:0 min_cb_level:1024
-    496119.228925719  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496119.228926215  DEV_SLEEP_TIME                 dev:8 wake:000496119.274252016
-    496119.228928676  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496119.229018133  WAKE                           num_fds:1
-    496119.229047681  FILL_AUDIO                     dev:8 hw_level:2176
-    496119.229049234  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496119.229064119  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496119.229070388  DEV_STREAM_MIX                 written:1024 read:1024
-    496119.229070959  WRITE_STREAMS_MIXED            write_limit:1024
-    496119.229071967  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496119.229072949  STREAM_SLEEP_TIME              id:140000 wake:000496119.250075921
-    496119.229079509  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496119.229079870  DEV_SLEEP_TIME                 dev:8 wake:000496119.295739144
-    496119.229080907  SLEEP                          sleep:000000000.021003443 longest_wake:000158140
-    496119.250343383  WAKE                           num_fds:0
-    496119.250367173  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496119.250399042  FILL_AUDIO                     dev:8 hw_level:2192
-    496119.250403953  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496119.250404414  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496119.250406243  WRITE_STREAMS_MIXED            write_limit:0
-    496119.250409240  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496119.250418672  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496119.250419183  DEV_SLEEP_TIME                 dev:8 wake:000496119.296078016
-    496119.250421268  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496119.250517861  WAKE                           num_fds:1
-    496119.250549253  FILL_AUDIO                     dev:8 hw_level:2192
-    496119.250551022  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496119.250566493  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496119.250571199  DEV_STREAM_MIX                 written:1024 read:1024
-    496119.250571770  WRITE_STREAMS_MIXED            write_limit:1024
-    496119.250572933  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496119.250573955  STREAM_SLEEP_TIME              id:140000 wake:000496119.271409254
-    496119.250580571  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496119.250580951  DEV_SLEEP_TIME                 dev:8 wake:000496119.317573489
-    496119.250582019  SLEEP                          sleep:000000000.020835765 longest_wake:000158140
-    496119.271663162  WAKE                           num_fds:0
-    496119.271686306  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496119.271718400  FILL_AUDIO                     dev:8 hw_level:2208
-    496119.271722684  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496119.271723126  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496119.271725130  WRITE_STREAMS_MIXED            write_limit:0
-    496119.271728042  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496119.271736516  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496119.271737058  DEV_SLEEP_TIME                 dev:8 wake:000496119.317729726
-    496119.271738827  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496119.271834628  WAKE                           num_fds:1
-    496119.271865213  FILL_AUDIO                     dev:8 hw_level:2160
-    496119.271867238  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496119.271881546  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496119.271887019  DEV_STREAM_MIX                 written:1024 read:1024
-    496119.271887685  WRITE_STREAMS_MIXED            write_limit:1024
-    496119.271888612  FILL_AUDIO_DONE                hw_level:2160 total_written:1024 min_cb_level:1024
-    496119.271889700  STREAM_SLEEP_TIME              id:140000 wake:000496119.292742587
-    496119.271895884  SET_DEV_WAKE                   dev:8 hw_level:3184 sleep:3184
-    496119.271896255  DEV_SLEEP_TIME                 dev:8 wake:000496119.338222557
-    496119.271897242  SLEEP                          sleep:000000000.020853363 longest_wake:000158140
-    496119.292999314  WAKE                           num_fds:0
-    496119.293023229  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2176
-    496119.293055559  FILL_AUDIO                     dev:8 hw_level:2176
-    496119.293060059  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496119.293060520  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496119.293062169  WRITE_STREAMS_MIXED            write_limit:0
-    496119.293065406  FILL_AUDIO_DONE                hw_level:2176 total_written:0 min_cb_level:1024
-    496119.293073836  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496119.293074387  DEV_SLEEP_TIME                 dev:8 wake:000496119.338400093
-    496119.293076161  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496119.293169717  WAKE                           num_fds:1
-    496119.293197421  FILL_AUDIO                     dev:8 hw_level:2176
-    496119.293199205  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496119.293213278  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496119.293217447  DEV_STREAM_MIX                 written:1024 read:1024
-    496119.293218024  WRITE_STREAMS_MIXED            write_limit:1024
-    496119.293219562  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496119.293220524  STREAM_SLEEP_TIME              id:140000 wake:000496119.314075920
-    496119.293226634  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496119.293227014  DEV_SLEEP_TIME                 dev:8 wake:000496119.359886734
-    496119.293228157  SLEEP                          sleep:000000000.020855852 longest_wake:000158140
-    496119.314326940  WAKE                           num_fds:0
-    496119.314367935  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496119.314398355  FILL_AUDIO                     dev:8 hw_level:2192
-    496119.314402439  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496119.314402945  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496119.314404148  WRITE_STREAMS_MIXED            write_limit:0
-    496119.314406874  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496119.314415835  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496119.314416366  DEV_SLEEP_TIME                 dev:8 wake:000496119.360075290
-    496119.314418211  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496119.314513646  WAKE                           num_fds:1
-    496119.314545354  FILL_AUDIO                     dev:8 hw_level:2192
-    496119.314547228  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496119.314562363  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496119.314566809  DEV_STREAM_MIX                 written:1024 read:1024
-    496119.314567295  WRITE_STREAMS_MIXED            write_limit:1024
-    496119.314568227  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496119.314569314  STREAM_SLEEP_TIME              id:140000 wake:000496119.335409253
-    496119.314575188  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496119.314575539  DEV_SLEEP_TIME                 dev:8 wake:000496119.381568818
-    496119.314576531  SLEEP                          sleep:000000000.020840435 longest_wake:000158140
-    496119.335516443  WAKE                           num_fds:0
-    496119.335539261  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496119.335569801  FILL_AUDIO                     dev:8 hw_level:2208
-    496119.335574597  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496119.335575099  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496119.335576286  WRITE_STREAMS_MIXED            write_limit:0
-    496119.335579890  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496119.335588279  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496119.335588815  DEV_SLEEP_TIME                 dev:8 wake:000496119.381581313
-    496119.335590930  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496119.335683594  WAKE                           num_fds:1
-    496119.335716806  FILL_AUDIO                     dev:8 hw_level:2208
-    496119.335718695  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496119.335733775  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496119.335738676  DEV_STREAM_MIX                 written:1024 read:1024
-    496119.335739258  WRITE_STREAMS_MIXED            write_limit:1024
-    496119.335740340  FILL_AUDIO_DONE                hw_level:2208 total_written:1024 min_cb_level:1024
-    496119.335741733  STREAM_SLEEP_TIME              id:140000 wake:000496119.356742586
-    496119.335747988  SET_DEV_WAKE                   dev:8 hw_level:3232 sleep:3232
-    496119.335748384  DEV_SLEEP_TIME                 dev:8 wake:000496119.403074355
-    496119.335749381  SLEEP                          sleep:000000000.021001564 longest_wake:000158140
-    496119.356772896  WAKE                           num_fds:0
-    496119.356796024  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2224
-    496119.356818947  FILL_AUDIO                     dev:8 hw_level:2224
-    496119.356823142  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496119.356823573  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496119.356824741  WRITE_STREAMS_MIXED            write_limit:0
-    496119.356827893  FILL_AUDIO_DONE                hw_level:2224 total_written:0 min_cb_level:1024
-    496119.356836297  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496119.356836784  DEV_SLEEP_TIME                 dev:8 wake:000496119.402162539
-    496119.356838492  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496119.356924451  WAKE                           num_fds:1
-    496119.356950401  FILL_AUDIO                     dev:8 hw_level:2176
-    496119.356952285  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496119.356965009  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496119.356969244  DEV_STREAM_MIX                 written:1024 read:1024
-    496119.356969806  WRITE_STREAMS_MIXED            write_limit:1024
-    496119.356971003  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496119.356972096  STREAM_SLEEP_TIME              id:140000 wake:000496119.378075919
-    496119.356977999  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496119.356978415  DEV_SLEEP_TIME                 dev:8 wake:000496119.423638251
-    496119.356979448  SLEEP                          sleep:000000000.021104334 longest_wake:000158140
-    496119.378141728  WAKE                           num_fds:0
-    496119.378163549  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496119.378184522  FILL_AUDIO                     dev:8 hw_level:2192
-    496119.378189328  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496119.378189804  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496119.378190987  WRITE_STREAMS_MIXED            write_limit:0
-    496119.378193969  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496119.378202564  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496119.378203050  DEV_SLEEP_TIME                 dev:8 wake:000496119.423862198
-    496119.378204924  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496119.378286091  WAKE                           num_fds:1
-    496119.378312282  FILL_AUDIO                     dev:8 hw_level:2192
-    496119.378313760  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496119.378325999  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496119.378342576  DEV_STREAM_MIX                 written:1024 read:1024
-    496119.378343172  WRITE_STREAMS_MIXED            write_limit:1024
-    496119.378344185  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496119.378345337  STREAM_SLEEP_TIME              id:140000 wake:000496119.399409252
-    496119.378351411  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496119.378351822  DEV_SLEEP_TIME                 dev:8 wake:000496119.445344856
-    496119.378352865  SLEEP                          sleep:000000000.021064396 longest_wake:000158140
-    496119.399442392  WAKE                           num_fds:0
-    496119.399463837  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496119.399490884  FILL_AUDIO                     dev:8 hw_level:2208
-    496119.399495094  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496119.399495550  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496119.399496602  WRITE_STREAMS_MIXED            write_limit:0
-    496119.399499955  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496119.399507778  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496119.399508294  DEV_SLEEP_TIME                 dev:8 wake:000496119.445501148
-    496119.399510033  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496119.399592408  WAKE                           num_fds:1
-    496119.399619716  FILL_AUDIO                     dev:8 hw_level:2208
-    496119.399621180  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496119.399633964  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496119.399637964  DEV_STREAM_MIX                 written:1024 read:1024
-    496119.399638485  WRITE_STREAMS_MIXED            write_limit:1024
-    496119.399639652  FILL_AUDIO_DONE                hw_level:2208 total_written:1024 min_cb_level:1024
-    496119.399640655  STREAM_SLEEP_TIME              id:140000 wake:000496119.420742585
-    496119.399646398  SET_DEV_WAKE                   dev:8 hw_level:3232 sleep:3232
-    496119.399646749  DEV_SLEEP_TIME                 dev:8 wake:000496119.466973537
-    496119.399647736  SLEEP                          sleep:000000000.021102381 longest_wake:000158140
-    496119.420990443  WAKE                           num_fds:0
-    496119.421014493  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2176
-    496119.421045224  FILL_AUDIO                     dev:8 hw_level:2176
-    496119.421050482  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496119.421050928  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496119.421052376  WRITE_STREAMS_MIXED            write_limit:0
-    496119.421055273  FILL_AUDIO_DONE                hw_level:2176 total_written:0 min_cb_level:1024
-    496119.421063802  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496119.421064384  DEV_SLEEP_TIME                 dev:8 wake:000496119.466390335
-    496119.421066238  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496119.421162485  WAKE                           num_fds:1
-    496119.421190410  FILL_AUDIO                     dev:8 hw_level:2176
-    496119.421192264  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496119.421208496  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496119.421213172  DEV_STREAM_MIX                 written:1024 read:1024
-    496119.421213728  WRITE_STREAMS_MIXED            write_limit:1024
-    496119.421214706  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496119.421215848  STREAM_SLEEP_TIME              id:140000 wake:000496119.442075918
-    496119.421222303  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496119.421222684  DEV_SLEEP_TIME                 dev:8 wake:000496119.487882013
-    496119.421223726  SLEEP                          sleep:000000000.020860571 longest_wake:000158140
-    496119.442117753  WAKE                           num_fds:0
-    496119.442143662  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496119.442172815  FILL_AUDIO                     dev:8 hw_level:2192
-    496119.442177621  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496119.442178072  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496119.442178974  WRITE_STREAMS_MIXED            write_limit:0
-    496119.442181911  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496119.442190205  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496119.442190776  DEV_SLEEP_TIME                 dev:8 wake:000496119.487849729
-    496119.442192661  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496119.442277682  WAKE                           num_fds:1
-    496119.442304804  FILL_AUDIO                     dev:8 hw_level:2192
-    496119.442307466  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496119.442319594  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496119.442325988  DEV_STREAM_MIX                 written:1024 read:1024
-    496119.442326830  WRITE_STREAMS_MIXED            write_limit:1024
-    496119.442342225  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496119.442343733  STREAM_SLEEP_TIME              id:140000 wake:000496119.463409251
-    496119.442351025  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496119.442351657  DEV_SLEEP_TIME                 dev:8 wake:000496119.509343087
-    496119.442353215  SLEEP                          sleep:000000000.021066164 longest_wake:000158140
-    496119.463441223  WAKE                           num_fds:0
-    496119.463463406  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496119.463494930  FILL_AUDIO                     dev:8 hw_level:2208
-    496119.463499425  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496119.463499838  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496119.463501037  WRITE_STREAMS_MIXED            write_limit:0
-    496119.463504016  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496119.463513001  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496119.463513429  DEV_SLEEP_TIME                 dev:8 wake:000496119.509505367
-    496119.463515069  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496119.463624173  WAKE                           num_fds:1
-    496119.463650301  FILL_AUDIO                     dev:8 hw_level:2208
-    496119.463653032  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496119.463670801  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496119.463678575  DEV_STREAM_MIX                 written:1024 read:1024
-    496119.463679252  WRITE_STREAMS_MIXED            write_limit:1024
-    496119.463680808  FILL_AUDIO_DONE                hw_level:2208 total_written:1024 min_cb_level:1024
-    496119.463682111  STREAM_SLEEP_TIME              id:140000 wake:000496119.484742584
-    496119.463688870  SET_DEV_WAKE                   dev:8 hw_level:3232 sleep:3232
-    496119.463689315  DEV_SLEEP_TIME                 dev:8 wake:000496119.531014955
-    496119.463690759  SLEEP                          sleep:000000000.021060962 longest_wake:000158140
-    496119.484761936  WAKE                           num_fds:0
-    496119.484774842  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2224
-    496119.484786984  FILL_AUDIO                     dev:8 hw_level:2224
-    496119.484789594  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496119.484789778  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496119.484790606  WRITE_STREAMS_MIXED            write_limit:0
-    496119.484791910  FILL_AUDIO_DONE                hw_level:2224 total_written:0 min_cb_level:1024
-    496119.484797359  SET_DEV_WAKE                   dev:8 hw_level:2224 sleep:2224
-    496119.484797534  DEV_SLEEP_TIME                 dev:8 wake:000496119.531125750
-    496119.484798276  SLEEP                          sleep:000000000.046333333 longest_wake:000158140
-    496119.484828393  WAKE                           num_fds:1
-    496119.484842892  FILL_AUDIO                     dev:8 hw_level:2176
-    496119.484843484  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496119.484849786  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496119.484852445  DEV_STREAM_MIX                 written:1024 read:1024
-    496119.484852760  WRITE_STREAMS_MIXED            write_limit:1024
-    496119.484853392  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496119.484853881  STREAM_SLEEP_TIME              id:140000 wake:000496119.506075917
-    496119.484858408  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496119.484858539  DEV_SLEEP_TIME                 dev:8 wake:000496119.551520364
-    496119.484858931  SLEEP                          sleep:000000000.021222219 longest_wake:000158140
-    496119.506277376  WAKE                           num_fds:0
-    496119.506291073  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496119.506307673  FILL_AUDIO                     dev:8 hw_level:2192
-    496119.506310095  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496119.506310261  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496119.506310695  WRITE_STREAMS_MIXED            write_limit:0
-    496119.506312020  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496119.506317760  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496119.506317950  DEV_SLEEP_TIME                 dev:8 wake:000496119.551979289
-    496119.506318606  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496119.506364111  WAKE                           num_fds:1
-    496119.506379211  FILL_AUDIO                     dev:8 hw_level:2192
-    496119.506380031  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496119.506386971  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496119.506388635  DEV_STREAM_MIX                 written:1024 read:1024
-    496119.506388839  WRITE_STREAMS_MIXED            write_limit:1024
-    496119.506389202  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496119.506389581  STREAM_SLEEP_TIME              id:140000 wake:000496119.527409250
-    496119.506394062  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496119.506394200  DEV_SLEEP_TIME                 dev:8 wake:000496119.573389409
-    496119.506394609  SLEEP                          sleep:000000000.021019841 longest_wake:000158140
-    496119.527434443  WAKE                           num_fds:0
-    496119.527460343  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496119.527484093  FILL_AUDIO                     dev:8 hw_level:2208
-    496119.527489130  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496119.527489626  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496119.527490718  WRITE_STREAMS_MIXED            write_limit:0
-    496119.527495374  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496119.527504154  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496119.527504685  DEV_SLEEP_TIME                 dev:8 wake:000496119.573496602
-    496119.527508008  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496119.527588594  WAKE                           num_fds:1
-    496119.527616604  FILL_AUDIO                     dev:8 hw_level:2208
-    496119.527619475  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496119.527633914  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496119.527640614  DEV_STREAM_MIX                 written:1024 read:1024
-    496119.527641321  WRITE_STREAMS_MIXED            write_limit:1024
-    496119.527643035  FILL_AUDIO_DONE                hw_level:2208 total_written:1024 min_cb_level:1024
-    496119.527644568  STREAM_SLEEP_TIME              id:140000 wake:000496119.548742583
-    496119.527651885  SET_DEV_WAKE                   dev:8 hw_level:3232 sleep:3232
-    496119.527653088  DEV_SLEEP_TIME                 dev:8 wake:000496119.594977240
-    496119.527654657  SLEEP                          sleep:000000000.021098676 longest_wake:000158140
-    496119.548999664  WAKE                           num_fds:0
-    496119.549022737  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2176
-    496119.549054295  FILL_AUDIO                     dev:8 hw_level:2176
-    496119.549059261  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496119.549059843  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496119.549061186  WRITE_STREAMS_MIXED            write_limit:0
-    496119.549064483  FILL_AUDIO_DONE                hw_level:2176 total_written:0 min_cb_level:1024
-    496119.549072813  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496119.549073359  DEV_SLEEP_TIME                 dev:8 wake:000496119.594399250
-    496119.549075689  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496119.549176036  WAKE                           num_fds:1
-    496119.549203574  FILL_AUDIO                     dev:8 hw_level:2176
-    496119.549205544  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496119.549220529  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496119.549224718  DEV_STREAM_MIX                 written:1024 read:1024
-    496119.549225270  WRITE_STREAMS_MIXED            write_limit:1024
-    496119.549226192  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496119.549227244  STREAM_SLEEP_TIME              id:140000 wake:000496119.570075916
-    496119.549234205  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496119.549234591  DEV_SLEEP_TIME                 dev:8 wake:000496119.615893439
-    496119.549235593  SLEEP                          sleep:000000000.020849143 longest_wake:000158140
-    496119.570344229  WAKE                           num_fds:0
-    496119.570367668  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496119.570397667  FILL_AUDIO                     dev:8 hw_level:2192
-    496119.570402293  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496119.570402749  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496119.570403942  WRITE_STREAMS_MIXED            write_limit:0
-    496119.570406964  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496119.570415654  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496119.570416160  DEV_SLEEP_TIME                 dev:8 wake:000496119.616075023
-    496119.570417854  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496119.570517549  WAKE                           num_fds:1
-    496119.570548375  FILL_AUDIO                     dev:8 hw_level:2192
-    496119.570550235  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496119.570565405  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496119.570570125  DEV_STREAM_MIX                 written:1024 read:1024
-    496119.570570832  WRITE_STREAMS_MIXED            write_limit:1024
-    496119.570571614  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496119.570572651  STREAM_SLEEP_TIME              id:140000 wake:000496119.591409249
-    496119.570578309  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496119.570578660  DEV_SLEEP_TIME                 dev:8 wake:000496119.637572175
-    496119.570579662  SLEEP                          sleep:000000000.020837074 longest_wake:000158140
-    496119.591447839  WAKE                           num_fds:0
-    496119.591471083  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496119.591498381  FILL_AUDIO                     dev:8 hw_level:2208
-    496119.591502641  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496119.591503082  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496119.591504470  WRITE_STREAMS_MIXED            write_limit:0
-    496119.591507331  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496119.591515575  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496119.591516077  DEV_SLEEP_TIME                 dev:8 wake:000496119.637508639
-    496119.591517911  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496119.591605508  WAKE                           num_fds:1
-    496119.591633272  FILL_AUDIO                     dev:8 hw_level:2208
-    496119.591634976  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496119.591649530  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496119.591655148  DEV_STREAM_MIX                 written:1024 read:1024
-    496119.591655869  WRITE_STREAMS_MIXED            write_limit:1024
-    496119.591657373  FILL_AUDIO_DONE                hw_level:2208 total_written:1024 min_cb_level:1024
-    496119.591658806  STREAM_SLEEP_TIME              id:140000 wake:000496119.612742582
-    496119.591665451  SET_DEV_WAKE                   dev:8 hw_level:3232 sleep:3232
-    496119.591665907  DEV_SLEEP_TIME                 dev:8 wake:000496119.658991447
-    496119.591667235  SLEEP                          sleep:000000000.021084468 longest_wake:000158140
-    496119.612826659  WAKE                           num_fds:0
-    496119.612848891  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2176
-    496119.612873648  FILL_AUDIO                     dev:8 hw_level:2176
-    496119.612878048  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496119.612878489  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496119.612879697  WRITE_STREAMS_MIXED            write_limit:0
-    496119.612882694  FILL_AUDIO_DONE                hw_level:2176 total_written:0 min_cb_level:1024
-    496119.612890742  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496119.612891319  DEV_SLEEP_TIME                 dev:8 wake:000496119.658217229
-    496119.612893073  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496119.612975583  WAKE                           num_fds:1
-    496119.613003011  FILL_AUDIO                     dev:8 hw_level:2176
-    496119.613004364  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496119.613018011  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496119.613022115  DEV_STREAM_MIX                 written:1024 read:1024
-    496119.613022672  WRITE_STREAMS_MIXED            write_limit:1024
-    496119.613023754  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496119.613024812  STREAM_SLEEP_TIME              id:140000 wake:000496119.634075915
-    496119.613030515  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496119.613030896  DEV_SLEEP_TIME                 dev:8 wake:000496119.679690987
-    496119.613031868  SLEEP                          sleep:000000000.021051594 longest_wake:000158140
-    496119.634323952  WAKE                           num_fds:0
-    496119.634365252  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496119.634397427  FILL_AUDIO                     dev:8 hw_level:2192
-    496119.634401792  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496119.634402208  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496119.634403330  WRITE_STREAMS_MIXED            write_limit:0
-    496119.634406733  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496119.634415082  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496119.634415644  DEV_SLEEP_TIME                 dev:8 wake:000496119.680074867
-    496119.634417673  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496119.634513685  WAKE                           num_fds:1
-    496119.634542587  FILL_AUDIO                     dev:8 hw_level:2192
-    496119.634544110  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496119.634559245  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496119.634563565  DEV_STREAM_MIX                 written:1024 read:1024
-    496119.634564222  WRITE_STREAMS_MIXED            write_limit:1024
-    496119.634565304  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496119.634566527  STREAM_SLEEP_TIME              id:140000 wake:000496119.655409248
-    496119.634572972  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496119.634573353  DEV_SLEEP_TIME                 dev:8 wake:000496119.701566016
-    496119.634574335  SLEEP                          sleep:000000000.020843232 longest_wake:000158140
-    496119.655663146  WAKE                           num_fds:0
-    496119.655686319  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496119.655718418  FILL_AUDIO                     dev:8 hw_level:2208
-    496119.655723791  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496119.655724302  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496119.655725710  WRITE_STREAMS_MIXED            write_limit:0
-    496119.655728542  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496119.655736746  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496119.655737322  DEV_SLEEP_TIME                 dev:8 wake:000496119.701729780
-    496119.655739201  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496119.655836651  WAKE                           num_fds:1
-    496119.655867467  FILL_AUDIO                     dev:8 hw_level:2160
-    496119.655869332  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496119.655883900  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496119.655888255  DEV_STREAM_MIX                 written:1024 read:1024
-    496119.655888807  WRITE_STREAMS_MIXED            write_limit:1024
-    496119.655890465  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:0
-    496119.655891047  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496119.655891503  WRITE_STREAMS_MIXED            write_limit:0
-    496119.655892059  FILL_AUDIO_DONE                hw_level:2160 total_written:1024 min_cb_level:1024
-    496119.655893267  STREAM_SLEEP_TIME              id:140000 wake:000496119.676742581
-    496119.655899216  SET_DEV_WAKE                   dev:8 hw_level:3184 sleep:3184
-    496119.655899561  DEV_SLEEP_TIME                 dev:8 wake:000496119.722225999
-    496119.655900579  SLEEP                          sleep:000000000.020849915 longest_wake:000158140
-    496119.676782360  WAKE                           num_fds:0
-    496119.676802491  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2224
-    496119.676828715  FILL_AUDIO                     dev:8 hw_level:2176
-    496119.676831930  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496119.676832205  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496119.676832933  WRITE_STREAMS_MIXED            write_limit:0
-    496119.676835095  FILL_AUDIO_DONE                hw_level:2176 total_written:0 min_cb_level:1024
-    496119.676841542  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496119.676841833  DEV_SLEEP_TIME                 dev:8 wake:000496119.722169273
-    496119.676843191  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496119.676901138  WAKE                           num_fds:1
-    496119.676923101  FILL_AUDIO                     dev:8 hw_level:2176
-    496119.676924667  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496119.676927011  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496119.676930681  DEV_STREAM_MIX                 written:1024 read:1024
-    496119.676931111  WRITE_STREAMS_MIXED            write_limit:1024
-    496119.676932162  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496119.676933078  STREAM_SLEEP_TIME              id:140000 wake:000496119.698075914
-    496119.676939028  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496119.676939378  DEV_SLEEP_TIME                 dev:8 wake:000496119.743599341
-    496119.676940404  SLEEP                          sleep:000000000.021143239 longest_wake:000158140
-    496119.698136425  WAKE                           num_fds:0
-    496119.698158456  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496119.698186947  FILL_AUDIO                     dev:8 hw_level:2192
-    496119.698191006  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496119.698191492  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496119.698192615  WRITE_STREAMS_MIXED            write_limit:0
-    496119.698195446  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496119.698203269  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496119.698203800  DEV_SLEEP_TIME                 dev:8 wake:000496119.743863350
-    496119.698205620  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496119.698283585  WAKE                           num_fds:1
-    496119.698308688  FILL_AUDIO                     dev:8 hw_level:2192
-    496119.698310517  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496119.698312035  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496119.698315914  DEV_STREAM_MIX                 written:1024 read:1024
-    496119.698316430  WRITE_STREAMS_MIXED            write_limit:1024
-    496119.698317528  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496119.698318540  STREAM_SLEEP_TIME              id:140000 wake:000496119.719409247
-    496119.698324143  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496119.698324524  DEV_SLEEP_TIME                 dev:8 wake:000496119.765318074
-    496119.698325461  SLEEP                          sleep:000000000.021091173 longest_wake:000158140
-    496119.719658229  WAKE                           num_fds:0
-    496119.719682220  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496119.719712981  FILL_AUDIO                     dev:8 hw_level:2208
-    496119.719717286  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496119.719717742  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496119.719718839  WRITE_STREAMS_MIXED            write_limit:0
-    496119.719721741  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496119.719730717  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496119.719731308  DEV_SLEEP_TIME                 dev:8 wake:000496119.765723665
-    496119.719733202  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496119.719836902  WAKE                           num_fds:1
-    496119.719868354  FILL_AUDIO                     dev:8 hw_level:2160
-    496119.719869998  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496119.719871687  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496119.719876724  DEV_STREAM_MIX                 written:1024 read:1024
-    496119.719877250  WRITE_STREAMS_MIXED            write_limit:1024
-    496119.719878513  FILL_AUDIO_DONE                hw_level:2160 total_written:1024 min_cb_level:1024
-    496119.719880016  STREAM_SLEEP_TIME              id:140000 wake:000496119.740742580
-    496119.719885724  SET_DEV_WAKE                   dev:8 hw_level:3184 sleep:3184
-    496119.719886100  DEV_SLEEP_TIME                 dev:8 wake:000496119.786212602
-    496119.719887067  SLEEP                          sleep:000000000.020863311 longest_wake:000158140
-    496119.740777485  WAKE                           num_fds:0
-    496119.740799787  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2224
-    496119.740819222  FILL_AUDIO                     dev:8 hw_level:2224
-    496119.740824434  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496119.740824920  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496119.740826088  WRITE_STREAMS_MIXED            write_limit:0
-    496119.740828989  FILL_AUDIO_DONE                hw_level:2224 total_written:0 min_cb_level:1024
-    496119.740837805  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496119.740838286  DEV_SLEEP_TIME                 dev:8 wake:000496119.786163525
-    496119.740840075  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496119.740937109  WAKE                           num_fds:1
-    496119.740963259  FILL_AUDIO                     dev:8 hw_level:2176
-    496119.740965564  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496119.740968697  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496119.740973979  DEV_STREAM_MIX                 written:1024 read:1024
-    496119.740974670  WRITE_STREAMS_MIXED            write_limit:1024
-    496119.740975984  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496119.740977372  STREAM_SLEEP_TIME              id:140000 wake:000496119.762075913
-    496119.740983656  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496119.740984132  DEV_SLEEP_TIME                 dev:8 wake:000496119.807643386
-    496119.740985510  SLEEP                          sleep:000000000.021099193 longest_wake:000158140
-    496119.762184771  WAKE                           num_fds:0
-    496119.762207604  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496119.762239753  FILL_AUDIO                     dev:8 hw_level:2192
-    496119.762244123  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496119.762245146  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496119.762246414  WRITE_STREAMS_MIXED            write_limit:0
-    496119.762249320  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496119.762257569  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496119.762258131  DEV_SLEEP_TIME                 dev:8 wake:000496119.807917415
-    496119.762261579  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496119.762376087  WAKE                           num_fds:1
-    496119.762404828  FILL_AUDIO                     dev:8 hw_level:2192
-    496119.762407088  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496119.762408577  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496119.762412676  DEV_STREAM_MIX                 written:1024 read:1024
-    496119.762413358  WRITE_STREAMS_MIXED            write_limit:1024
-    496119.762414671  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496119.762416124  STREAM_SLEEP_TIME              id:140000 wake:000496119.783409246
-    496119.762422289  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496119.762422689  DEV_SLEEP_TIME                 dev:8 wake:000496119.829415488
-    496119.762423667  SLEEP                          sleep:000000000.020993758 longest_wake:000158140
-    496119.783498916  WAKE                           num_fds:0
-    496119.783520847  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496119.783546040  FILL_AUDIO                     dev:8 hw_level:2208
-    496119.783550180  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496119.783550656  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496119.783551718  WRITE_STREAMS_MIXED            write_limit:0
-    496119.783554464  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496119.783562839  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496119.783563390  DEV_SLEEP_TIME                 dev:8 wake:000496119.829555798
-    496119.783565164  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496119.783648807  WAKE                           num_fds:1
-    496119.783676742  FILL_AUDIO                     dev:8 hw_level:2208
-    496119.783678280  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496119.783680801  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496119.783684720  DEV_STREAM_MIX                 written:1024 read:1024
-    496119.783685236  WRITE_STREAMS_MIXED            write_limit:1024
-    496119.783686750  FILL_AUDIO_DONE                hw_level:2208 total_written:1024 min_cb_level:1024
-    496119.783687847  STREAM_SLEEP_TIME              id:140000 wake:000496119.804742579
-    496119.783694097  SET_DEV_WAKE                   dev:8 hw_level:3232 sleep:3232
-    496119.783694618  DEV_SLEEP_TIME                 dev:8 wake:000496119.851020649
-    496119.783695881  SLEEP                          sleep:000000000.021055263 longest_wake:000158140
-    496119.804846154  WAKE                           num_fds:0
-    496119.804869563  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2176
-    496119.804900975  FILL_AUDIO                     dev:8 hw_level:2176
-    496119.804905260  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496119.804906282  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496119.804907335  WRITE_STREAMS_MIXED            write_limit:0
-    496119.804911094  FILL_AUDIO_DONE                hw_level:2176 total_written:0 min_cb_level:1024
-    496119.804919623  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496119.804920190  DEV_SLEEP_TIME                 dev:8 wake:000496119.850245890
-    496119.804922224  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496119.805017163  WAKE                           num_fds:1
-    496119.805048155  FILL_AUDIO                     dev:8 hw_level:2176
-    496119.805049984  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496119.805051578  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496119.805055662  DEV_STREAM_MIX                 written:1024 read:1024
-    496119.805056218  WRITE_STREAMS_MIXED            write_limit:1024
-    496119.805057331  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496119.805058439  STREAM_SLEEP_TIME              id:140000 wake:000496119.826075912
-    496119.805064147  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496119.805064523  DEV_SLEEP_TIME                 dev:8 wake:000496119.871724664
-    496119.805065520  SLEEP                          sleep:000000000.021017914 longest_wake:000158140
-    496119.826181499  WAKE                           num_fds:0
-    496119.826204557  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496119.826235859  FILL_AUDIO                     dev:8 hw_level:2192
-    496119.826240500  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496119.826240931  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496119.826242559  WRITE_STREAMS_MIXED            write_limit:0
-    496119.826245521  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496119.826253670  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496119.826254236  DEV_SLEEP_TIME                 dev:8 wake:000496119.871913500
-    496119.826256056  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496119.826373791  WAKE                           num_fds:1
-    496119.826402197  FILL_AUDIO                     dev:8 hw_level:2192
-    496119.826404943  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496119.826406793  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496119.826410982  DEV_STREAM_MIX                 written:1024 read:1024
-    496119.826411508  WRITE_STREAMS_MIXED            write_limit:1024
-    496119.826412541  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496119.826413729  STREAM_SLEEP_TIME              id:140000 wake:000496119.847409245
-    496119.826419271  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496119.826419938  DEV_SLEEP_TIME                 dev:8 wake:000496119.893413262
-    496119.826421141  SLEEP                          sleep:000000000.020995983 longest_wake:000158140
-    496119.847573032  WAKE                           num_fds:0
-    496119.847597188  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496119.847631537  FILL_AUDIO                     dev:8 hw_level:2208
-    496119.847636143  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496119.847636594  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496119.847638057  WRITE_STREAMS_MIXED            write_limit:0
-    496119.847642778  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496119.847652751  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496119.847653332  DEV_SLEEP_TIME                 dev:8 wake:000496119.893644703
-    496119.847655563  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496119.847751424  WAKE                           num_fds:1
-    496119.847777820  FILL_AUDIO                     dev:8 hw_level:2208
-    496119.847779419  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496119.847780937  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496119.847786791  DEV_STREAM_MIX                 written:1024 read:1024
-    496119.847787337  WRITE_STREAMS_MIXED            write_limit:1024
-    496119.847788499  FILL_AUDIO_DONE                hw_level:2208 total_written:1024 min_cb_level:1024
-    496119.847789517  STREAM_SLEEP_TIME              id:140000 wake:000496119.868742578
-    496119.847794999  SET_DEV_WAKE                   dev:8 hw_level:3232 sleep:3232
-    496119.847795365  DEV_SLEEP_TIME                 dev:8 wake:000496119.915122379
-    496119.847796523  SLEEP                          sleep:000000000.020953532 longest_wake:000158140
-    496119.868841929  WAKE                           num_fds:0
-    496119.868866084  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2176
-    496119.868897878  FILL_AUDIO                     dev:8 hw_level:2176
-    496119.868902263  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496119.868903210  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496119.868904428  WRITE_STREAMS_MIXED            write_limit:0
-    496119.868907149  FILL_AUDIO_DONE                hw_level:2176 total_written:0 min_cb_level:1024
-    496119.868915248  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496119.868915794  DEV_SLEEP_TIME                 dev:8 wake:000496119.914241845
-    496119.868917784  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496119.869015113  WAKE                           num_fds:1
-    496119.869048987  FILL_AUDIO                     dev:8 hw_level:2176
-    496119.869050751  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496119.869053281  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496119.869058158  DEV_STREAM_MIX                 written:1024 read:1024
-    496119.869058894  WRITE_STREAMS_MIXED            write_limit:1024
-    496119.869059566  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496119.869060543  STREAM_SLEEP_TIME              id:140000 wake:000496119.890075911
-    496119.869066547  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496119.869066923  DEV_SLEEP_TIME                 dev:8 wake:000496119.935726768
-    496119.869068086  SLEEP                          sleep:000000000.021015809 longest_wake:000158140
-    496119.890110720  WAKE                           num_fds:0
-    496119.890133212  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496119.890157759  FILL_AUDIO                     dev:8 hw_level:2192
-    496119.890162880  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496119.890163321  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496119.890164504  WRITE_STREAMS_MIXED            write_limit:0
-    496119.890167491  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496119.890175499  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496119.890176021  DEV_SLEEP_TIME                 dev:8 wake:000496119.935835435
-    496119.890177800  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496119.890260912  WAKE                           num_fds:1
-    496119.890286265  FILL_AUDIO                     dev:8 hw_level:2192
-    496119.890288195  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496119.890290149  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496119.890295557  DEV_STREAM_MIX                 written:1024 read:1024
-    496119.890296268  WRITE_STREAMS_MIXED            write_limit:1024
-    496119.890297671  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496119.890298914  STREAM_SLEEP_TIME              id:140000 wake:000496119.911409244
-    496119.890305374  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496119.890305805  DEV_SLEEP_TIME                 dev:8 wake:000496119.957298358
-    496119.890307223  SLEEP                          sleep:000000000.021110886 longest_wake:000158140
-    496119.911457981  WAKE                           num_fds:0
-    496119.911482252  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496119.911511630  FILL_AUDIO                     dev:8 hw_level:2208
-    496119.911516807  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496119.911517404  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496119.911518641  WRITE_STREAMS_MIXED            write_limit:0
-    496119.911521668  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496119.911529396  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496119.911529912  DEV_SLEEP_TIME                 dev:8 wake:000496119.957522851
-    496119.911531636  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496119.911612914  WAKE                           num_fds:1
-    496119.911641044  FILL_AUDIO                     dev:8 hw_level:2208
-    496119.911643039  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496119.911645043  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496119.911652420  DEV_STREAM_MIX                 written:1024 read:1024
-    496119.911653147  WRITE_STREAMS_MIXED            write_limit:1024
-    496119.911654886  FILL_AUDIO_DONE                hw_level:2208 total_written:1024 min_cb_level:1024
-    496119.911656239  STREAM_SLEEP_TIME              id:140000 wake:000496119.932742577
-    496119.911663180  SET_DEV_WAKE                   dev:8 hw_level:3232 sleep:3232
-    496119.911663601  DEV_SLEEP_TIME                 dev:8 wake:000496119.978989021
-    496119.911665014  SLEEP                          sleep:000000000.021086889 longest_wake:000158140
-    496119.932781594  WAKE                           num_fds:0
-    496119.932810225  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2224
-    496119.932837659  FILL_AUDIO                     dev:8 hw_level:2176
-    496119.932842344  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496119.932842941  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496119.932844214  WRITE_STREAMS_MIXED            write_limit:0
-    496119.932847311  FILL_AUDIO_DONE                hw_level:2176 total_written:0 min_cb_level:1024
-    496119.932856257  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496119.932856723  DEV_SLEEP_TIME                 dev:8 wake:000496119.978182037
-    496119.932858742  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496119.932950314  WAKE                           num_fds:1
-    496119.932981345  FILL_AUDIO                     dev:8 hw_level:2176
-    496119.932983395  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496119.932985836  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496119.932990792  DEV_STREAM_MIX                 written:1024 read:1024
-    496119.932991338  WRITE_STREAMS_MIXED            write_limit:1024
-    496119.932992311  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496119.932993358  STREAM_SLEEP_TIME              id:140000 wake:000496119.954075910
-    496119.932999216  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496119.932999838  DEV_SLEEP_TIME                 dev:8 wake:000496119.999659568
-    496119.933001116  SLEEP                          sleep:000000000.021083008 longest_wake:000158140
-    496119.954146565  WAKE                           num_fds:0
-    496119.954162536  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496119.954180693  FILL_AUDIO                     dev:8 hw_level:2192
-    496119.954183341  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496119.954183605  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496119.954184349  WRITE_STREAMS_MIXED            write_limit:0
-    496119.954186514  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496119.954192771  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496119.954193049  DEV_SLEEP_TIME                 dev:8 wake:000496119.999853959
-    496119.954194267  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496119.954240476  WAKE                           num_fds:1
-    496119.954258950  FILL_AUDIO                     dev:8 hw_level:2192
-    496119.954259846  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496119.954260998  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496119.954266147  DEV_STREAM_MIX                 written:1024 read:1024
-    496119.954266591  WRITE_STREAMS_MIXED            write_limit:1024
-    496119.954267353  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496119.954268157  STREAM_SLEEP_TIME              id:140000 wake:000496119.975409243
-    496119.954273532  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496119.954273850  DEV_SLEEP_TIME                 dev:8 wake:000496120.021267834
-    496119.954274529  SLEEP                          sleep:000000000.021141409 longest_wake:000158140
-    496119.975463624  WAKE                           num_fds:0
-    496119.975512667  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496119.975552860  FILL_AUDIO                     dev:8 hw_level:2208
-    496119.975562763  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496119.975563259  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496119.975564547  WRITE_STREAMS_MIXED            write_limit:0
-    496119.975572255  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496119.975582799  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496119.975583275  DEV_SLEEP_TIME                 dev:8 wake:000496120.021574064
-    496119.975585826  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496119.975725950  WAKE                           num_fds:1
-    496119.975762304  FILL_AUDIO                     dev:8 hw_level:2208
-    496119.975765351  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496119.975769365  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496119.975777188  DEV_STREAM_MIX                 written:1024 read:1024
-    496119.975777829  WRITE_STREAMS_MIXED            write_limit:1024
-    496119.975779543  FILL_AUDIO_DONE                hw_level:2208 total_written:1024 min_cb_level:1024
-    496119.975781348  STREAM_SLEEP_TIME              id:140000 wake:000496119.996742576
-    496119.975787873  SET_DEV_WAKE                   dev:8 hw_level:3232 sleep:3232
-    496119.975788269  DEV_SLEEP_TIME                 dev:8 wake:000496120.043114219
-    496119.975789411  SLEEP                          sleep:000000000.020961690 longest_wake:000158140
-    496119.996809488  WAKE                           num_fds:0
-    496119.996830326  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2176
-    496119.996856422  FILL_AUDIO                     dev:8 hw_level:2176
-    496119.996860426  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496119.996860867  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496119.996861919  WRITE_STREAMS_MIXED            write_limit:0
-    496119.996864570  FILL_AUDIO_DONE                hw_level:2176 total_written:0 min_cb_level:1024
-    496119.996872348  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496119.996872845  DEV_SLEEP_TIME                 dev:8 wake:000496120.042199096
-    496119.996874814  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496119.996972104  WAKE                           num_fds:1
-    496119.996998314  FILL_AUDIO                     dev:8 hw_level:2176
-    496119.996999908  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496119.997001361  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496119.997005220  DEV_STREAM_MIX                 written:1024 read:1024
-    496119.997005761  WRITE_STREAMS_MIXED            write_limit:1024
-    496119.997006899  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496119.997007997  STREAM_SLEEP_TIME              id:140000 wake:000496120.018075909
-    496119.997013484  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496119.997013880  DEV_SLEEP_TIME                 dev:8 wake:000496120.063674186
-    496119.997014872  SLEEP                          sleep:000000000.021068389 longest_wake:000158140
-    496120.018176962  WAKE                           num_fds:0
-    496120.018200617  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496120.018232290  FILL_AUDIO                     dev:8 hw_level:2192
-    496120.018237242  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496120.018237748  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496120.018238900  WRITE_STREAMS_MIXED            write_limit:0
-    496120.018243346  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496120.018251489  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496120.018252036  DEV_SLEEP_TIME                 dev:8 wake:000496120.063911239
-    496120.018254025  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496120.018371866  WAKE                           num_fds:1
-    496120.018402292  FILL_AUDIO                     dev:8 hw_level:2192
-    496120.018404587  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496120.018406206  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496120.018410290  DEV_STREAM_MIX                 written:1024 read:1024
-    496120.018410856  WRITE_STREAMS_MIXED            write_limit:1024
-    496120.018412074  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496120.018413157  STREAM_SLEEP_TIME              id:140000 wake:000496120.039409242
-    496120.018419020  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496120.018419371  DEV_SLEEP_TIME                 dev:8 wake:000496120.085412691
-    496120.018420468  SLEEP                          sleep:000000000.020996551 longest_wake:000158140
-    496120.039592015  WAKE                           num_fds:0
-    496120.039614197  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496120.039645043  FILL_AUDIO                     dev:8 hw_level:2208
-    496120.039649328  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496120.039649764  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496120.039651312  WRITE_STREAMS_MIXED            write_limit:0
-    496120.039654023  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496120.039662277  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496120.039662864  DEV_SLEEP_TIME                 dev:8 wake:000496120.085655417
-    496120.039664573  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496120.039757006  WAKE                           num_fds:1
-    496120.039786254  FILL_AUDIO                     dev:8 hw_level:2208
-    496120.039788358  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496120.039789902  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496120.039794478  DEV_STREAM_MIX                 written:1024 read:1024
-    496120.039795144  WRITE_STREAMS_MIXED            write_limit:1024
-    496120.039796482  FILL_AUDIO_DONE                hw_level:2208 total_written:1024 min_cb_level:1024
-    496120.039797560  STREAM_SLEEP_TIME              id:140000 wake:000496120.060742575
-    496120.039803468  SET_DEV_WAKE                   dev:8 hw_level:3232 sleep:3232
-    496120.039803824  DEV_SLEEP_TIME                 dev:8 wake:000496120.107130392
-    496120.039804832  SLEEP                          sleep:000000000.020945516 longest_wake:000158140
-    496120.060797771  WAKE                           num_fds:0
-    496120.060820273  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2224
-    496120.060854302  FILL_AUDIO                     dev:8 hw_level:2176
-    496120.060859644  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496120.060860160  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496120.060861328  WRITE_STREAMS_MIXED            write_limit:0
-    496120.060865207  FILL_AUDIO_DONE                hw_level:2176 total_written:0 min_cb_level:1024
-    496120.060874082  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496120.060874618  DEV_SLEEP_TIME                 dev:8 wake:000496120.106199748
-    496120.060876327  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496120.060978919  WAKE                           num_fds:1
-    496120.061008252  FILL_AUDIO                     dev:8 hw_level:2176
-    496120.061010392  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496120.061012447  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496120.061017007  DEV_STREAM_MIX                 written:1024 read:1024
-    496120.061017714  WRITE_STREAMS_MIXED            write_limit:1024
-    496120.061018736  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496120.061019864  STREAM_SLEEP_TIME              id:140000 wake:000496120.082075908
-    496120.061025281  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496120.061025662  DEV_SLEEP_TIME                 dev:8 wake:000496120.127686029
-    496120.061026895  SLEEP                          sleep:000000000.021056545 longest_wake:000158140
-    496120.082178195  WAKE                           num_fds:0
-    496120.082200907  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496120.082232125  FILL_AUDIO                     dev:8 hw_level:2192
-    496120.082237612  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496120.082238705  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496120.082240629  WRITE_STREAMS_MIXED            write_limit:0
-    496120.082243696  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496120.082252522  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496120.082253519  DEV_SLEEP_TIME                 dev:8 wake:000496120.127911745
-    496120.082255629  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496120.082367060  WAKE                           num_fds:1
-    496120.082395866  FILL_AUDIO                     dev:8 hw_level:2192
-    496120.082397595  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496120.082399144  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496120.082405188  DEV_STREAM_MIX                 written:1024 read:1024
-    496120.082405950  WRITE_STREAMS_MIXED            write_limit:1024
-    496120.082407373  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496120.082408405  STREAM_SLEEP_TIME              id:140000 wake:000496120.103409241
-    496120.082413963  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496120.082414670  DEV_SLEEP_TIME                 dev:8 wake:000496120.149407924
-    496120.082415858  SLEEP                          sleep:000000000.021001317 longest_wake:000158140
-    496120.103453866  WAKE                           num_fds:0
-    496120.103476263  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496120.103506513  FILL_AUDIO                     dev:8 hw_level:2208
-    496120.103511449  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496120.103512000  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496120.103513504  WRITE_STREAMS_MIXED            write_limit:0
-    496120.103516381  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496120.103524870  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496120.103525436  DEV_SLEEP_TIME                 dev:8 wake:000496120.149517653
-    496120.103527722  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496120.103621638  WAKE                           num_fds:1
-    496120.103650109  FILL_AUDIO                     dev:8 hw_level:2208
-    496120.103651953  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496120.103653607  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496120.103658398  DEV_STREAM_MIX                 written:1024 read:1024
-    496120.103658960  WRITE_STREAMS_MIXED            write_limit:1024
-    496120.103659942  FILL_AUDIO_DONE                hw_level:2208 total_written:1024 min_cb_level:1024
-    496120.103660949  STREAM_SLEEP_TIME              id:140000 wake:000496120.124742574
-    496120.103666838  SET_DEV_WAKE                   dev:8 hw_level:3232 sleep:3232
-    496120.103667234  DEV_SLEEP_TIME                 dev:8 wake:000496120.170993811
-    496120.103668261  SLEEP                          sleep:000000000.021082096 longest_wake:000158140
-    496120.124785237  WAKE                           num_fds:0
-    496120.124806356  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2224
-    496120.124831689  FILL_AUDIO                     dev:8 hw_level:2176
-    496120.124835618  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496120.124836190  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496120.124837197  WRITE_STREAMS_MIXED            write_limit:0
-    496120.124840109  FILL_AUDIO_DONE                hw_level:2176 total_written:0 min_cb_level:1024
-    496120.124848789  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496120.124849265  DEV_SLEEP_TIME                 dev:8 wake:000496120.170174865
-    496120.124851064  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496120.124937794  WAKE                           num_fds:1
-    496120.124963223  FILL_AUDIO                     dev:8 hw_level:2176
-    496120.124964751  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496120.124966350  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496120.124970339  DEV_STREAM_MIX                 written:1024 read:1024
-    496120.124970971  WRITE_STREAMS_MIXED            write_limit:1024
-    496120.124972018  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496120.124973111  STREAM_SLEEP_TIME              id:140000 wake:000496120.146075907
-    496120.124978849  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496120.124979235  DEV_SLEEP_TIME                 dev:8 wake:000496120.191639361
-    496120.124980252  SLEEP                          sleep:000000000.021103212 longest_wake:000158140
-    496120.146169219  WAKE                           num_fds:0
-    496120.146191606  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496120.146222547  FILL_AUDIO                     dev:8 hw_level:2192
-    496120.146228346  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496120.146228812  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496120.146230265  WRITE_STREAMS_MIXED            write_limit:0
-    496120.146233297  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496120.146243125  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496120.146243676  DEV_SLEEP_TIME                 dev:8 wake:000496120.191901662
-    496120.146245530  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496120.146362163  WAKE                           num_fds:1
-    496120.146392519  FILL_AUDIO                     dev:8 hw_level:2192
-    496120.146394378  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496120.146396062  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496120.146400091  DEV_STREAM_MIX                 written:1024 read:1024
-    496120.146400963  WRITE_STREAMS_MIXED            write_limit:1024
-    496120.146402020  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496120.146403308  STREAM_SLEEP_TIME              id:140000 wake:000496120.167409240
-    496120.146409392  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496120.146409743  DEV_SLEEP_TIME                 dev:8 wake:000496120.213402737
-    496120.146410746  SLEEP                          sleep:000000000.021006503 longest_wake:000158140
-    496120.167670100  WAKE                           num_fds:0
-    496120.167693524  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496120.167724260  FILL_AUDIO                     dev:8 hw_level:2208
-    496120.167728821  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496120.167729272  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496120.167730389  WRITE_STREAMS_MIXED            write_limit:0
-    496120.167733466  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496120.167742041  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496120.167742547  DEV_SLEEP_TIME                 dev:8 wake:000496120.213734845
-    496120.167744286  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496120.167843866  WAKE                           num_fds:1
-    496120.167874216  FILL_AUDIO                     dev:8 hw_level:2160
-    496120.167876241  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496120.167878035  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496120.167882305  DEV_STREAM_MIX                 written:1024 read:1024
-    496120.167882866  WRITE_STREAMS_MIXED            write_limit:1024
-    496120.167883713  FILL_AUDIO_DONE                hw_level:2160 total_written:1024 min_cb_level:1024
-    496120.167884645  STREAM_SLEEP_TIME              id:140000 wake:000496120.188742573
-    496120.167890554  SET_DEV_WAKE                   dev:8 hw_level:3184 sleep:3184
-    496120.167890915  DEV_SLEEP_TIME                 dev:8 wake:000496120.234217522
-    496120.167892268  SLEEP                          sleep:000000000.020858384 longest_wake:000158140
-    496120.188990921  WAKE                           num_fds:0
-    496120.189014721  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2176
-    496120.189046640  FILL_AUDIO                     dev:8 hw_level:2176
-    496120.189050845  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496120.189051361  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496120.189052930  WRITE_STREAMS_MIXED            write_limit:0
-    496120.189055856  FILL_AUDIO_DONE                hw_level:2176 total_written:0 min_cb_level:1024
-    496120.189064396  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496120.189064967  DEV_SLEEP_TIME                 dev:8 wake:000496120.234390863
-    496120.189067603  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496120.189162332  WAKE                           num_fds:1
-    496120.189191139  FILL_AUDIO                     dev:8 hw_level:2176
-    496120.189193003  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496120.189194577  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496120.189199142  DEV_STREAM_MIX                 written:1024 read:1024
-    496120.189199708  WRITE_STREAMS_MIXED            write_limit:1024
-    496120.189200570  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496120.189201663  STREAM_SLEEP_TIME              id:140000 wake:000496120.210075906
-    496120.189207286  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496120.189207657  DEV_SLEEP_TIME                 dev:8 wake:000496120.255867863
-    496120.189208654  SLEEP                          sleep:000000000.020874709 longest_wake:000158140
-    496120.210165596  WAKE                           num_fds:0
-    496120.210210895  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496120.210251669  FILL_AUDIO                     dev:8 hw_level:2192
-    496120.210260850  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496120.210261337  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496120.210262830  WRITE_STREAMS_MIXED            write_limit:0
-    496120.210268693  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496120.210279498  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496120.210280035  DEV_SLEEP_TIME                 dev:8 wake:000496120.255938211
-    496120.210282661  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496120.210445466  WAKE                           num_fds:1
-    496120.210479965  FILL_AUDIO                     dev:8 hw_level:2192
-    496120.210481915  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496120.210487217  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496120.210495035  DEV_STREAM_MIX                 written:1024 read:1024
-    496120.210495737  WRITE_STREAMS_MIXED            write_limit:1024
-    496120.210496979  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496120.210497957  STREAM_SLEEP_TIME              id:140000 wake:000496120.231409239
-    496120.210503740  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496120.210504116  DEV_SLEEP_TIME                 dev:8 wake:000496120.277497491
-    496120.210505173  SLEEP                          sleep:000000000.020911748 longest_wake:000158140
-    496120.231663695  WAKE                           num_fds:0
-    496120.231687425  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496120.231718522  FILL_AUDIO                     dev:8 hw_level:2208
-    496120.231723092  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496120.231723518  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496120.231725257  WRITE_STREAMS_MIXED            write_limit:0
-    496120.231728700  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496120.231737390  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496120.231737977  DEV_SLEEP_TIME                 dev:8 wake:000496120.277729958
-    496120.231740066  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496120.231836699  WAKE                           num_fds:1
-    496120.231867290  FILL_AUDIO                     dev:8 hw_level:2160
-    496120.231869004  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496120.231870808  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496120.231874722  DEV_STREAM_MIX                 written:1024 read:1024
-    496120.231875253  WRITE_STREAMS_MIXED            write_limit:1024
-    496120.231876421  FILL_AUDIO_DONE                hw_level:2160 total_written:1024 min_cb_level:1024
-    496120.231877634  STREAM_SLEEP_TIME              id:140000 wake:000496120.252742572
-    496120.231883943  SET_DEV_WAKE                   dev:8 hw_level:3184 sleep:3184
-    496120.231884314  DEV_SLEEP_TIME                 dev:8 wake:000496120.298210511
-    496120.231885317  SLEEP                          sleep:000000000.020865394 longest_wake:000158140
-    496120.252825725  WAKE                           num_fds:0
-    496120.252847370  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2176
-    496120.252873480  FILL_AUDIO                     dev:8 hw_level:2176
-    496120.252877595  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496120.252878031  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496120.252879183  WRITE_STREAMS_MIXED            write_limit:0
-    496120.252882060  FILL_AUDIO_DONE                hw_level:2176 total_written:0 min_cb_level:1024
-    496120.252889973  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496120.252890449  DEV_SLEEP_TIME                 dev:8 wake:000496120.298216616
-    496120.252892264  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496120.252976333  WAKE                           num_fds:1
-    496120.253004262  FILL_AUDIO                     dev:8 hw_level:2176
-    496120.253005560  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496120.253007124  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496120.253011143  DEV_STREAM_MIX                 written:1024 read:1024
-    496120.253011674  WRITE_STREAMS_MIXED            write_limit:1024
-    496120.253012526  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496120.253013624  STREAM_SLEEP_TIME              id:140000 wake:000496120.274075905
-    496120.253019227  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496120.253019572  DEV_SLEEP_TIME                 dev:8 wake:000496120.319679829
-    496120.253020595  SLEEP                          sleep:000000000.021062742 longest_wake:000158140
-    496120.274106404  WAKE                           num_fds:0
-    496120.274128715  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496120.274152144  FILL_AUDIO                     dev:8 hw_level:2192
-    496120.274156384  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496120.274156855  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496120.274157943  WRITE_STREAMS_MIXED            write_limit:0
-    496120.274161110  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496120.274169534  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496120.274170056  DEV_SLEEP_TIME                 dev:8 wake:000496120.319829134
-    496120.274171905  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496120.274253398  WAKE                           num_fds:1
-    496120.274278085  FILL_AUDIO                     dev:8 hw_level:2192
-    496120.274279458  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496120.274281037  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496120.274285166  DEV_STREAM_MIX                 written:1024 read:1024
-    496120.274285718  WRITE_STREAMS_MIXED            write_limit:1024
-    496120.274286800  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496120.274287888  STREAM_SLEEP_TIME              id:140000 wake:000496120.295409238
-    496120.274293445  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496120.274293796  DEV_SLEEP_TIME                 dev:8 wake:000496120.341287447
-    496120.274295009  SLEEP                          sleep:000000000.021121791 longest_wake:000158140
-    496120.295659600  WAKE                           num_fds:0
-    496120.295682664  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496120.295713329  FILL_AUDIO                     dev:8 hw_level:2208
-    496120.295717534  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496120.295718386  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496120.295720250  WRITE_STREAMS_MIXED            write_limit:0
-    496120.295723067  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496120.295731967  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496120.295732504  DEV_SLEEP_TIME                 dev:8 wake:000496120.341724505
-    496120.295734333  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496120.295829954  WAKE                           num_fds:1
-    496120.295858961  FILL_AUDIO                     dev:8 hw_level:2160
-    496120.295860870  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496120.295862925  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496120.295867099  DEV_STREAM_MIX                 written:1024 read:1024
-    496120.295867606  WRITE_STREAMS_MIXED            write_limit:1024
-    496120.295868347  FILL_AUDIO_DONE                hw_level:2160 total_written:1024 min_cb_level:1024
-    496120.295869871  STREAM_SLEEP_TIME              id:140000 wake:000496120.316742571
-    496120.295876075  SET_DEV_WAKE                   dev:8 hw_level:3184 sleep:3184
-    496120.295876441  DEV_SLEEP_TIME                 dev:8 wake:000496120.362202743
-    496120.295877448  SLEEP                          sleep:000000000.020873161 longest_wake:000158140
-    496120.317001495  WAKE                           num_fds:0
-    496120.317024874  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2176
-    496120.317055114  FILL_AUDIO                     dev:8 hw_level:2176
-    496120.317059414  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496120.317060487  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496120.317062541  WRITE_STREAMS_MIXED            write_limit:0
-    496120.317065453  FILL_AUDIO_DONE                hw_level:2176 total_written:0 min_cb_level:1024
-    496120.317073852  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496120.317074344  DEV_SLEEP_TIME                 dev:8 wake:000496120.362400199
-    496120.317076313  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496120.317171929  WAKE                           num_fds:1
-    496120.317202003  FILL_AUDIO                     dev:8 hw_level:2176
-    496120.317203762  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496120.317205486  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496120.317209596  DEV_STREAM_MIX                 written:1024 read:1024
-    496120.317210167  WRITE_STREAMS_MIXED            write_limit:1024
-    496120.317211310  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496120.317212497  STREAM_SLEEP_TIME              id:140000 wake:000496120.338075904
-    496120.317218276  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496120.317218647  DEV_SLEEP_TIME                 dev:8 wake:000496120.383878722
-    496120.317219604  SLEEP                          sleep:000000000.020863848 longest_wake:000158140
-    496120.338325157  WAKE                           num_fds:0
-    496120.338373825  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496120.338405919  FILL_AUDIO                     dev:8 hw_level:2192
-    496120.338411276  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496120.338411737  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496120.338413556  WRITE_STREAMS_MIXED            write_limit:0
-    496120.338416749  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496120.338424973  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496120.338425564  DEV_SLEEP_TIME                 dev:8 wake:000496120.384084738
-    496120.338427378  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496120.338521641  WAKE                           num_fds:1
-    496120.338549681  FILL_AUDIO                     dev:8 hw_level:2192
-    496120.338551405  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496120.338552868  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496120.338558997  DEV_STREAM_MIX                 written:1024 read:1024
-    496120.338559533  WRITE_STREAMS_MIXED            write_limit:1024
-    496120.338560415  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496120.338561518  STREAM_SLEEP_TIME              id:140000 wake:000496120.359409237
-    496120.338567281  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496120.338567632  DEV_SLEEP_TIME                 dev:8 wake:000496120.405561052
-    496120.338568614  SLEEP                          sleep:000000000.020848185 longest_wake:000158140
-    496120.359662607  WAKE                           num_fds:0
-    496120.359686227  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496120.359718331  FILL_AUDIO                     dev:8 hw_level:2208
-    496120.359722616  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496120.359723513  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496120.359724700  WRITE_STREAMS_MIXED            write_limit:0
-    496120.359727878  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496120.359736167  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496120.359736738  DEV_SLEEP_TIME                 dev:8 wake:000496120.405729211
-    496120.359738628  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496120.359837621  WAKE                           num_fds:1
-    496120.359869219  FILL_AUDIO                     dev:8 hw_level:2160
-    496120.359871189  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496120.359873679  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496120.359877814  DEV_STREAM_MIX                 written:1024 read:1024
-    496120.359878395  WRITE_STREAMS_MIXED            write_limit:1024
-    496120.359879197  FILL_AUDIO_DONE                hw_level:2160 total_written:1024 min_cb_level:1024
-    496120.359880245  STREAM_SLEEP_TIME              id:140000 wake:000496120.380742570
-    496120.359885867  SET_DEV_WAKE                   dev:8 hw_level:3184 sleep:3184
-    496120.359886213  DEV_SLEEP_TIME                 dev:8 wake:000496120.426213101
-    496120.359887266  SLEEP                          sleep:000000000.020862802 longest_wake:000158140
-    496120.380845520  WAKE                           num_fds:0
-    496120.380869776  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2176
-    496120.380902542  FILL_AUDIO                     dev:8 hw_level:2176
-    496120.380906721  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496120.380907649  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496120.380909438  WRITE_STREAMS_MIXED            write_limit:0
-    496120.380912520  FILL_AUDIO_DONE                hw_level:2176 total_written:0 min_cb_level:1024
-    496120.380921636  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496120.380922177  DEV_SLEEP_TIME                 dev:8 wake:000496120.426247958
-    496120.380924212  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496120.381017252  WAKE                           num_fds:1
-    496120.381045913  FILL_AUDIO                     dev:8 hw_level:2176
-    496120.381048008  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496120.381049777  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496120.381053916  DEV_STREAM_MIX                 written:1024 read:1024
-    496120.381054462  WRITE_STREAMS_MIXED            write_limit:1024
-    496120.381055660  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496120.381057169  STREAM_SLEEP_TIME              id:140000 wake:000496120.402075903
-    496120.381063062  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496120.381063408  DEV_SLEEP_TIME                 dev:8 wake:000496120.447722903
-    496120.381064390  SLEEP                          sleep:000000000.021019666 longest_wake:000158140
-    496120.402140933  WAKE                           num_fds:0
-    496120.402162097  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496120.402189415  FILL_AUDIO                     dev:8 hw_level:2192
-    496120.402193519  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496120.402193985  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496120.402195153  WRITE_STREAMS_MIXED            write_limit:0
-    496120.402198355  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496120.402206043  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496120.402206589  DEV_SLEEP_TIME                 dev:8 wake:000496120.447866189
-    496120.402208318  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496120.402282184  WAKE                           num_fds:1
-    496120.402306199  FILL_AUDIO                     dev:8 hw_level:2192
-    496120.402307868  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496120.402309497  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496120.402313747  DEV_STREAM_MIX                 written:1024 read:1024
-    496120.402314258  WRITE_STREAMS_MIXED            write_limit:1024
-    496120.402315240  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496120.402316273  STREAM_SLEEP_TIME              id:140000 wake:000496120.423409236
-    496120.402321866  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496120.402322251  DEV_SLEEP_TIME                 dev:8 wake:000496120.469315797
-    496120.402323179  SLEEP                          sleep:000000000.021093439 longest_wake:000158140
-    496120.423449244  WAKE                           num_fds:0
-    496120.423476422  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496120.423503059  FILL_AUDIO                     dev:8 hw_level:2208
-    496120.423507604  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496120.423508090  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496120.423509418  WRITE_STREAMS_MIXED            write_limit:0
-    496120.423512510  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496120.423520454  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496120.423520975  DEV_SLEEP_TIME                 dev:8 wake:000496120.469513698
-    496120.423522774  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496120.423600017  WAKE                           num_fds:1
-    496120.423628152  FILL_AUDIO                     dev:8 hw_level:2208
-    496120.423630277  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496120.423632317  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496120.423639759  DEV_STREAM_MIX                 written:1024 read:1024
-    496120.423640521  WRITE_STREAMS_MIXED            write_limit:1024
-    496120.423642105  FILL_AUDIO_DONE                hw_level:2208 total_written:1024 min_cb_level:1024
-    496120.423643353  STREAM_SLEEP_TIME              id:140000 wake:000496120.444742569
-    496120.423650028  SET_DEV_WAKE                   dev:8 hw_level:3232 sleep:3232
-    496120.423650594  DEV_SLEEP_TIME                 dev:8 wake:000496120.490976119
-    496120.423651992  SLEEP                          sleep:000000000.021099783 longest_wake:000158140
-    496120.444785897  WAKE                           num_fds:0
-    496120.444805768  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2224
-    496120.444826351  FILL_AUDIO                     dev:8 hw_level:2176
-    496120.444830240  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496120.444830731  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496120.444831889  WRITE_STREAMS_MIXED            write_limit:0
-    496120.444835256  FILL_AUDIO_DONE                hw_level:2176 total_written:0 min_cb_level:1024
-    496120.444842919  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496120.444843495  DEV_SLEEP_TIME                 dev:8 wake:000496120.490169752
-    496120.444845274  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496120.444910946  WAKE                           num_fds:1
-    496120.444933318  FILL_AUDIO                     dev:8 hw_level:2176
-    496120.444934841  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496120.444936269  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496120.444940083  DEV_STREAM_MIX                 written:1024 read:1024
-    496120.444940655  WRITE_STREAMS_MIXED            write_limit:1024
-    496120.444941451  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496120.444942519  STREAM_SLEEP_TIME              id:140000 wake:000496120.466075902
-    496120.444947921  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496120.444948317  DEV_SLEEP_TIME                 dev:8 wake:000496120.511608689
-    496120.444949335  SLEEP                          sleep:000000000.021133879 longest_wake:000158140
-    496120.466115369  WAKE                           num_fds:0
-    496120.466135761  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496120.466155045  FILL_AUDIO                     dev:8 hw_level:2192
-    496120.466159004  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496120.466159506  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496120.466160548  WRITE_STREAMS_MIXED            write_limit:0
-    496120.466163319  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496120.466170927  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496120.466171518  DEV_SLEEP_TIME                 dev:8 wake:000496120.511831198
-    496120.466173272  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496120.466238388  WAKE                           num_fds:1
-    496120.466260313  FILL_AUDIO                     dev:8 hw_level:2192
-    496120.466261681  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496120.466263085  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496120.466268868  DEV_STREAM_MIX                 written:1024 read:1024
-    496120.466269444  WRITE_STREAMS_MIXED            write_limit:1024
-    496120.466270301  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496120.466271249  STREAM_SLEEP_TIME              id:140000 wake:000496120.487409235
-    496120.466276636  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496120.466276992  DEV_SLEEP_TIME                 dev:8 wake:000496120.533270767
-    496120.466278014  SLEEP                          sleep:000000000.021138468 longest_wake:000158140
-    496120.487490685  WAKE                           num_fds:0
-    496120.487512195  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496120.487536877  FILL_AUDIO                     dev:8 hw_level:2208
-    496120.487540956  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496120.487541387  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496120.487542424  WRITE_STREAMS_MIXED            write_limit:0
-    496120.487545241  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496120.487553319  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496120.487553801  DEV_SLEEP_TIME                 dev:8 wake:000496120.533546479
-    496120.487555795  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496120.487637278  WAKE                           num_fds:1
-    496120.487664200  FILL_AUDIO                     dev:8 hw_level:2208
-    496120.487665549  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496120.487667388  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496120.487671317  DEV_STREAM_MIX                 written:1024 read:1024
-    496120.487671903  WRITE_STREAMS_MIXED            write_limit:1024
-    496120.487672976  FILL_AUDIO_DONE                hw_level:2208 total_written:1024 min_cb_level:1024
-    496120.487673953  STREAM_SLEEP_TIME              id:140000 wake:000496120.508742568
-    496120.487679601  SET_DEV_WAKE                   dev:8 hw_level:3232 sleep:3232
-    496120.487679967  DEV_SLEEP_TIME                 dev:8 wake:000496120.555006830
-    496120.487680884  SLEEP                          sleep:000000000.021069071 longest_wake:000158140
-    496120.508772677  WAKE                           num_fds:0
-    496120.508795374  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2224
-    496120.508815400  FILL_AUDIO                     dev:8 hw_level:2224
-    496120.508819660  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496120.508820161  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496120.508821374  WRITE_STREAMS_MIXED            write_limit:0
-    496120.508824196  FILL_AUDIO_DONE                hw_level:2224 total_written:0 min_cb_level:1024
-    496120.508832600  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496120.508833091  DEV_SLEEP_TIME                 dev:8 wake:000496120.554158651
-    496120.508834880  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496120.508902311  WAKE                           num_fds:1
-    496120.508923881  FILL_AUDIO                     dev:8 hw_level:2176
-    496120.508925309  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496120.508926873  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496120.508931017  DEV_STREAM_MIX                 written:1024 read:1024
-    496120.508931624  WRITE_STREAMS_MIXED            write_limit:1024
-    496120.508932751  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496120.508933844  STREAM_SLEEP_TIME              id:140000 wake:000496120.530075901
-    496120.508939532  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496120.508939878  DEV_SLEEP_TIME                 dev:8 wake:000496120.575600019
-    496120.508940905  SLEEP                          sleep:000000000.021142548 longest_wake:000158140
-    496120.530106994  WAKE                           num_fds:0
-    496120.530126138  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496120.530149222  FILL_AUDIO                     dev:8 hw_level:2192
-    496120.530153271  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496120.530153772  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496120.530154915  WRITE_STREAMS_MIXED            write_limit:0
-    496120.530157902  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496120.530166151  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496120.530166632  DEV_SLEEP_TIME                 dev:8 wake:000496120.575825851
-    496120.530168476  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496120.530263270  WAKE                           num_fds:1
-    496120.530287591  FILL_AUDIO                     dev:8 hw_level:2192
-    496120.530289390  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496120.530291224  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496120.530297243  DEV_STREAM_MIX                 written:1024 read:1024
-    496120.530298100  WRITE_STREAMS_MIXED            write_limit:1024
-    496120.530299073  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496120.530300030  STREAM_SLEEP_TIME              id:140000 wake:000496120.551409234
-    496120.530305537  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496120.530305923  DEV_SLEEP_TIME                 dev:8 wake:000496120.597299604
-    496120.530306931  SLEEP                          sleep:000000000.021109630 longest_wake:000158140
-    496120.551515216  WAKE                           num_fds:0
-    496120.551539643  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496120.551571982  FILL_AUDIO                     dev:8 hw_level:2208
-    496120.551576849  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496120.551577670  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496120.551578848  WRITE_STREAMS_MIXED            write_limit:0
-    496120.551581605  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496120.551589884  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496120.551590535  DEV_SLEEP_TIME                 dev:8 wake:000496120.597582882
-    496120.551592309  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496120.551687780  WAKE                           num_fds:1
-    496120.551717463  FILL_AUDIO                     dev:8 hw_level:2208
-    496120.551719322  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496120.551720916  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496120.551725036  DEV_STREAM_MIX                 written:1024 read:1024
-    496120.551725582  WRITE_STREAMS_MIXED            write_limit:1024
-    496120.551726554  FILL_AUDIO_DONE                hw_level:2208 total_written:1024 min_cb_level:1024
-    496120.551727752  STREAM_SLEEP_TIME              id:140000 wake:000496120.572742567
-    496120.551733861  SET_DEV_WAKE                   dev:8 hw_level:3232 sleep:3232
-    496120.551734207  DEV_SLEEP_TIME                 dev:8 wake:000496120.619060629
-    496120.551735425  SLEEP                          sleep:000000000.021015271 longest_wake:000158140
-    496120.572824676  WAKE                           num_fds:0
-    496120.572845770  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2176
-    496120.572870968  FILL_AUDIO                     dev:8 hw_level:2176
-    496120.572875679  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496120.572876100  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496120.572877102  WRITE_STREAMS_MIXED            write_limit:0
-    496120.572880210  FILL_AUDIO_DONE                hw_level:2176 total_written:0 min_cb_level:1024
-    496120.572888138  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496120.572888634  DEV_SLEEP_TIME                 dev:8 wake:000496120.618214821
-    496120.572890538  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496120.572971871  WAKE                           num_fds:1
-    496120.572998568  FILL_AUDIO                     dev:8 hw_level:2176
-    496120.573000197  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496120.573001775  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496120.573005724  DEV_STREAM_MIX                 written:1024 read:1024
-    496120.573006361  WRITE_STREAMS_MIXED            write_limit:1024
-    496120.573007188  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496120.573008170  STREAM_SLEEP_TIME              id:140000 wake:000496120.594075900
-    496120.573013723  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496120.573014129  DEV_SLEEP_TIME                 dev:8 wake:000496120.639674380
-    496120.573015131  SLEEP                          sleep:000000000.021068186 longest_wake:000158140
-    496120.594106428  WAKE                           num_fds:0
-    496120.594130167  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496120.594152995  FILL_AUDIO                     dev:8 hw_level:2192
-    496120.594157060  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496120.594157621  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496120.594158964  WRITE_STREAMS_MIXED            write_limit:0
-    496120.594162472  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496120.594171398  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496120.594171974  DEV_SLEEP_TIME                 dev:8 wake:000496120.639830446
-    496120.594173888  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496120.594300360  WAKE                           num_fds:1
-    496120.594345318  FILL_AUDIO                     dev:8 hw_level:2192
-    496120.594349362  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496120.594351888  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496120.594357862  DEV_STREAM_MIX                 written:1024 read:1024
-    496120.594359015  WRITE_STREAMS_MIXED            write_limit:1024
-    496120.594360694  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496120.594362272  STREAM_SLEEP_TIME              id:140000 wake:000496120.615409233
-    496120.594372245  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496120.594372631  DEV_SLEEP_TIME                 dev:8 wake:000496120.661361646
-    496120.594373869  SLEEP                          sleep:000000000.021047587 longest_wake:000158140
-    496120.615497480  WAKE                           num_fds:0
-    496120.615518910  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496120.615544870  FILL_AUDIO                     dev:8 hw_level:2208
-    496120.615549009  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496120.615549485  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496120.615550703  WRITE_STREAMS_MIXED            write_limit:0
-    496120.615553650  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496120.615561789  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496120.615562275  DEV_SLEEP_TIME                 dev:8 wake:000496120.661554928
-    496120.615564194  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496120.615648213  WAKE                           num_fds:1
-    496120.615675972  FILL_AUDIO                     dev:8 hw_level:2208
-    496120.615677651  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496120.615679205  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496120.615685173  DEV_STREAM_MIX                 written:1024 read:1024
-    496120.615685690  WRITE_STREAMS_MIXED            write_limit:1024
-    496120.615686592  FILL_AUDIO_DONE                hw_level:2208 total_written:1024 min_cb_level:1024
-    496120.615687614  STREAM_SLEEP_TIME              id:140000 wake:000496120.636742566
-    496120.615693242  SET_DEV_WAKE                   dev:8 hw_level:3232 sleep:3232
-    496120.615693638  DEV_SLEEP_TIME                 dev:8 wake:000496120.683020481
-    496120.615694630  SLEEP                          sleep:000000000.021055418 longest_wake:000158140
-    496120.636988830  WAKE                           num_fds:0
-    496120.637012740  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2176
-    496120.637044844  FILL_AUDIO                     dev:8 hw_level:2176
-    496120.637049500  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496120.637050006  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496120.637051670  WRITE_STREAMS_MIXED            write_limit:0
-    496120.637055198  FILL_AUDIO_DONE                hw_level:2176 total_written:0 min_cb_level:1024
-    496120.637063793  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496120.637064369  DEV_SLEEP_TIME                 dev:8 wake:000496120.682389804
-    496120.637066249  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496120.637165513  WAKE                           num_fds:1
-    496120.637197221  FILL_AUDIO                     dev:8 hw_level:2176
-    496120.637199186  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496120.637200739  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496120.637204809  DEV_STREAM_MIX                 written:1024 read:1024
-    496120.637205505  WRITE_STREAMS_MIXED            write_limit:1024
-    496120.637206292  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496120.637207460  STREAM_SLEEP_TIME              id:140000 wake:000496120.658075899
-    496120.637213203  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496120.637213549  DEV_SLEEP_TIME                 dev:8 wake:000496120.703873655
-    496120.637214581  SLEEP                          sleep:000000000.020868910 longest_wake:000158140
-    496120.658107059  WAKE                           num_fds:0
-    496120.658131099  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496120.658156964  FILL_AUDIO                     dev:8 hw_level:2192
-    496120.658161169  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496120.658161655  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496120.658162793  WRITE_STREAMS_MIXED            write_limit:0
-    496120.658165679  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496120.658173658  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496120.658174189  DEV_SLEEP_TIME                 dev:8 wake:000496120.703833628
-    496120.658176143  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496120.658282023  WAKE                           num_fds:1
-    496120.658308744  FILL_AUDIO                     dev:8 hw_level:2192
-    496120.658310418  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496120.658312052  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496120.658315991  DEV_STREAM_MIX                 written:1024 read:1024
-    496120.658316542  WRITE_STREAMS_MIXED            write_limit:1024
-    496120.658317565  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496120.658318632  STREAM_SLEEP_TIME              id:140000 wake:000496120.679409232
-    496120.658324140  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496120.658324521  DEV_SLEEP_TIME                 dev:8 wake:000496120.725318191
-    496120.658325598  SLEEP                          sleep:000000000.021091041 longest_wake:000158140
-    496120.679472577  WAKE                           num_fds:0
-    496120.679499710  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496120.679534876  FILL_AUDIO                     dev:8 hw_level:2208
-    496120.679539322  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496120.679539768  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496120.679540820  WRITE_STREAMS_MIXED            write_limit:0
-    496120.679543962  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496120.679552066  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496120.679552552  DEV_SLEEP_TIME                 dev:8 wake:000496120.725545526
-    496120.679554717  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496120.679658206  WAKE                           num_fds:1
-    496120.679687063  FILL_AUDIO                     dev:8 hw_level:2208
-    496120.679689233  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496120.679691282  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496120.679696504  DEV_STREAM_MIX                 written:1024 read:1024
-    496120.679697211  WRITE_STREAMS_MIXED            write_limit:1024
-    496120.679698694  FILL_AUDIO_DONE                hw_level:2208 total_written:1024 min_cb_level:1024
-    496120.679700002  STREAM_SLEEP_TIME              id:140000 wake:000496120.700742565
-    496120.679706392  SET_DEV_WAKE                   dev:8 hw_level:3232 sleep:3232
-    496120.679706863  DEV_SLEEP_TIME                 dev:8 wake:000496120.747032699
-    496120.679708442  SLEEP                          sleep:000000000.021043199 longest_wake:000158140
-    496120.701001735  WAKE                           num_fds:0
-    496120.701028687  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2176
-    496120.701068313  FILL_AUDIO                     dev:8 hw_level:2176
-    496120.701073981  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496120.701074483  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496120.701075831  WRITE_STREAMS_MIXED            write_limit:0
-    496120.701078873  FILL_AUDIO_DONE                hw_level:2176 total_written:0 min_cb_level:1024
-    496120.701087443  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496120.701088089  DEV_SLEEP_TIME                 dev:8 wake:000496120.746413599
-    496120.701089998  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496120.701178107  WAKE                           num_fds:1
-    496120.701210877  FILL_AUDIO                     dev:8 hw_level:2176
-    496120.701214907  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496120.701217107  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496120.701224354  DEV_STREAM_MIX                 written:1024 read:1024
-    496120.701225426  WRITE_STREAMS_MIXED            write_limit:1024
-    496120.701226919  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496120.701228268  STREAM_SLEEP_TIME              id:140000 wake:000496120.722075898
-    496120.701235750  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496120.701236226  DEV_SLEEP_TIME                 dev:8 wake:000496120.767894327
-    496120.701237489  SLEEP                          sleep:000000000.020848237 longest_wake:000158140
-    496120.722129751  WAKE                           num_fds:0
-    496120.722152443  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496120.722180463  FILL_AUDIO                     dev:8 hw_level:2192
-    496120.722184517  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496120.722185986  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496120.722187118  WRITE_STREAMS_MIXED            write_limit:0
-    496120.722190125  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496120.722198114  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496120.722198590  DEV_SLEEP_TIME                 dev:8 wake:000496120.767858014
-    496120.722200319  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496120.722290758  WAKE                           num_fds:1
-    496120.722319033  FILL_AUDIO                     dev:8 hw_level:2192
-    496120.722320817  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496120.722322326  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496120.722343188  DEV_STREAM_MIX                 written:1024 read:1024
-    496120.722344035  WRITE_STREAMS_MIXED            write_limit:1024
-    496120.722345638  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496120.722347122  STREAM_SLEEP_TIME              id:140000 wake:000496120.743409231
-    496120.722354043  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496120.722354504  DEV_SLEEP_TIME                 dev:8 wake:000496120.789346455
-    496120.722355882  SLEEP                          sleep:000000000.021062776 longest_wake:000158140
-    496120.743467496  WAKE                           num_fds:0
-    496120.743516138  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496120.743566865  FILL_AUDIO                     dev:8 hw_level:2208
-    496120.743580211  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496120.743581248  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496120.743582621  WRITE_STREAMS_MIXED            write_limit:0
-    496120.743591356  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496120.743609794  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496120.743611438  DEV_SLEEP_TIME                 dev:8 wake:000496120.789595295
-    496120.743614821  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496120.743749752  WAKE                           num_fds:1
-    496120.743794781  FILL_AUDIO                     dev:8 hw_level:2208
-    496120.743800940  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496120.743806643  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496120.743815474  DEV_STREAM_MIX                 written:1024 read:1024
-    496120.743816401  WRITE_STREAMS_MIXED            write_limit:1024
-    496120.743820355  FILL_AUDIO_DONE                hw_level:2208 total_written:1024 min_cb_level:1024
-    496120.743821543  STREAM_SLEEP_TIME              id:140000 wake:000496120.764742564
-    496120.743832989  SET_DEV_WAKE                   dev:8 hw_level:3184 sleep:3184
-    496120.743833335  DEV_SLEEP_TIME                 dev:8 wake:000496120.810154400
-    496120.743834934  SLEEP                          sleep:000000000.020921497 longest_wake:000158140
-    496120.764995124  WAKE                           num_fds:0
-    496120.765018142  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2176
-    496120.765049405  FILL_AUDIO                     dev:8 hw_level:2176
-    496120.765054130  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496120.765054607  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496120.765055724  WRITE_STREAMS_MIXED            write_limit:0
-    496120.765059077  FILL_AUDIO_DONE                hw_level:2176 total_written:0 min_cb_level:1024
-    496120.765067501  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496120.765068063  DEV_SLEEP_TIME                 dev:8 wake:000496120.810393783
-    496120.765069787  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496120.765170805  WAKE                           num_fds:1
-    496120.765200934  FILL_AUDIO                     dev:8 hw_level:2176
-    496120.765203149  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496120.765205049  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496120.765209123  DEV_STREAM_MIX                 written:1024 read:1024
-    496120.765209710  WRITE_STREAMS_MIXED            write_limit:1024
-    496120.765210597  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496120.765211584  STREAM_SLEEP_TIME              id:140000 wake:000496120.786075897
-    496120.765217232  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496120.765217583  DEV_SLEEP_TIME                 dev:8 wake:000496120.831877784
-    496120.765218565  SLEEP                          sleep:000000000.020864779 longest_wake:000158140
-    496120.786359235  WAKE                           num_fds:0
-    496120.786386748  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496120.786424054  FILL_AUDIO                     dev:8 hw_level:2192
-    496120.786429051  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496120.786429712  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496120.786430840  WRITE_STREAMS_MIXED            write_limit:0
-    496120.786434593  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496120.786442146  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496120.786442732  DEV_SLEEP_TIME                 dev:8 wake:000496120.832102517
-    496120.786444822  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496120.786626827  WAKE                           num_fds:1
-    496120.786663677  FILL_AUDIO                     dev:8 hw_level:2192
-    496120.786666764  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496120.786669656  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496120.786676146  DEV_STREAM_MIX                 written:1024 read:1024
-    496120.786676853  WRITE_STREAMS_MIXED            write_limit:1024
-    496120.786678446  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496120.786679774  STREAM_SLEEP_TIME              id:140000 wake:000496120.807409230
-    496120.786686410  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496120.786686836  DEV_SLEEP_TIME                 dev:8 wake:000496120.853679218
-    496120.786688139  SLEEP                          sleep:000000000.020730012 longest_wake:000158140
-    496120.807445429  WAKE                           num_fds:0
-    496120.807468548  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496120.807488058  FILL_AUDIO                     dev:8 hw_level:2208
-    496120.807491601  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496120.807491967  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496120.807492949  WRITE_STREAMS_MIXED            write_limit:0
-    496120.807495610  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496120.807502712  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496120.807503133  DEV_SLEEP_TIME                 dev:8 wake:000496120.853496708
-    496120.807504536  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496120.807594052  WAKE                           num_fds:1
-    496120.807615998  FILL_AUDIO                     dev:8 hw_level:2208
-    496120.807617141  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496120.807618714  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496120.807623114  DEV_STREAM_MIX                 written:1024 read:1024
-    496120.807623711  WRITE_STREAMS_MIXED            write_limit:1024
-    496120.807624498  FILL_AUDIO_DONE                hw_level:2208 total_written:1024 min_cb_level:1024
-    496120.807625550  STREAM_SLEEP_TIME              id:140000 wake:000496120.828742563
-    496120.807631148  SET_DEV_WAKE                   dev:8 hw_level:3232 sleep:3232
-    496120.807631539  DEV_SLEEP_TIME                 dev:8 wake:000496120.874958417
-    496120.807632491  SLEEP                          sleep:000000000.021117479 longest_wake:000158140
-    496120.828792742  WAKE                           num_fds:0
-    496120.828820235  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2224
-    496120.828856364  FILL_AUDIO                     dev:8 hw_level:2176
-    496120.828863094  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496120.828863861  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496120.828865430  WRITE_STREAMS_MIXED            write_limit:0
-    496120.828869083  FILL_AUDIO_DONE                hw_level:2176 total_written:0 min_cb_level:1024
-    496120.828879402  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496120.828880214  DEV_SLEEP_TIME                 dev:8 wake:000496120.874204110
-    496120.828883105  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496120.829016984  WAKE                           num_fds:1
-    496120.829054035  FILL_AUDIO                     dev:8 hw_level:2176
-    496120.829056892  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496120.829058781  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496120.829064614  DEV_STREAM_MIX                 written:1024 read:1024
-    496120.829065461  WRITE_STREAMS_MIXED            write_limit:1024
-    496120.829067341  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496120.829069421  STREAM_SLEEP_TIME              id:140000 wake:000496120.850075896
-    496120.829076051  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496120.829076938  DEV_SLEEP_TIME                 dev:8 wake:000496120.895735420
-    496120.829078632  SLEEP                          sleep:000000000.021007142 longest_wake:000158140
-    496120.850120456  WAKE                           num_fds:0
-    496120.850146552  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496120.850169236  FILL_AUDIO                     dev:8 hw_level:2192
-    496120.850174064  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496120.850174484  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496120.850175535  WRITE_STREAMS_MIXED            write_limit:0
-    496120.850178863  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496120.850186829  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496120.850187290  DEV_SLEEP_TIME                 dev:8 wake:000496120.895846740
-    496120.850189190  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496120.850269175  WAKE                           num_fds:1
-    496120.850295709  FILL_AUDIO                     dev:8 hw_level:2192
-    496120.850297505  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496120.850299301  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496120.850306373  DEV_STREAM_MIX                 written:1024 read:1024
-    496120.850307146  WRITE_STREAMS_MIXED            write_limit:1024
-    496120.850308429  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496120.850309942  STREAM_SLEEP_TIME              id:140000 wake:000496120.871409229
-    496120.850316384  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496120.850316865  DEV_SLEEP_TIME                 dev:8 wake:000496120.917309275
-    496120.850318385  SLEEP                          sleep:000000000.021099954 longest_wake:000158140
-    496120.871515551  WAKE                           num_fds:0
-    496120.871539366  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496120.871569746  FILL_AUDIO                     dev:8 hw_level:2208
-    496120.871573680  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496120.871574046  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496120.871574918  WRITE_STREAMS_MIXED            write_limit:0
-    496120.871578080  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496120.871584976  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496120.871585402  DEV_SLEEP_TIME                 dev:8 wake:000496120.917579043
-    496120.871586780  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496120.871750112  WAKE                           num_fds:1
-    496120.871778648  FILL_AUDIO                     dev:8 hw_level:2208
-    496120.871780162  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496120.871781846  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496120.871788481  DEV_STREAM_MIX                 written:1024 read:1024
-    496120.871789102  WRITE_STREAMS_MIXED            write_limit:1024
-    496120.871790060  FILL_AUDIO_DONE                hw_level:2208 total_written:1024 min_cb_level:1024
-    496120.871791287  STREAM_SLEEP_TIME              id:140000 wake:000496120.892742562
-    496120.871797371  SET_DEV_WAKE                   dev:8 hw_level:3232 sleep:3232
-    496120.871797833  DEV_SLEEP_TIME                 dev:8 wake:000496120.939124029
-    496120.871799045  SLEEP                          sleep:000000000.020951866 longest_wake:000158140
-    496120.892801211  WAKE                           num_fds:0
-    496120.892847132  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2176
-    496120.892888528  FILL_AUDIO                     dev:8 hw_level:2176
-    496120.892896396  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496120.892897123  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496120.892898987  WRITE_STREAMS_MIXED            write_limit:0
-    496120.892904364  FILL_AUDIO_DONE                hw_level:2176 total_written:0 min_cb_level:1024
-    496120.892913505  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496120.892914112  DEV_SLEEP_TIME                 dev:8 wake:000496120.938239276
-    496120.892917434  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496120.893084380  WAKE                           num_fds:1
-    496120.893127394  FILL_AUDIO                     dev:8 hw_level:2176
-    496120.893129760  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496120.893131584  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496120.893139863  DEV_STREAM_MIX                 written:1024 read:1024
-    496120.893140660  WRITE_STREAMS_MIXED            write_limit:1024
-    496120.893154903  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496120.893156266  STREAM_SLEEP_TIME              id:140000 wake:000496120.914075895
-    496120.893162600  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496120.893163157  DEV_SLEEP_TIME                 dev:8 wake:000496120.959822335
-    496120.893164620  SLEEP                          sleep:000000000.020920226 longest_wake:000158140
-    496120.914118665  WAKE                           num_fds:0
-    496120.914145071  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496120.914177055  FILL_AUDIO                     dev:8 hw_level:2192
-    496120.914181194  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496120.914181555  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496120.914182592  WRITE_STREAMS_MIXED            write_limit:0
-    496120.914185198  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496120.914192555  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496120.914192976  DEV_SLEEP_TIME                 dev:8 wake:000496120.959852962
-    496120.914194495  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496120.914342014  WAKE                           num_fds:1
-    496120.914374870  FILL_AUDIO                     dev:8 hw_level:2192
-    496120.914377005  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496120.914378849  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496120.914384623  DEV_STREAM_MIX                 written:1024 read:1024
-    496120.914385279  WRITE_STREAMS_MIXED            write_limit:1024
-    496120.914386522  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496120.914387710  STREAM_SLEEP_TIME              id:140000 wake:000496120.935409228
-    496120.914393338  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496120.914393764  DEV_SLEEP_TIME                 dev:8 wake:000496120.981387174
-    496120.914395007  SLEEP                          sleep:000000000.021022054 longest_wake:000158140
-    496120.935443284  WAKE                           num_fds:0
-    496120.935466292  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496120.935494723  FILL_AUDIO                     dev:8 hw_level:2208
-    496120.935498757  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496120.935499143  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496120.935500250  WRITE_STREAMS_MIXED            write_limit:0
-    496120.935502811  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496120.935509858  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496120.935510274  DEV_SLEEP_TIME                 dev:8 wake:000496120.981503844
-    496120.935512088  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496120.935671401  WAKE                           num_fds:1
-    496120.935705795  FILL_AUDIO                     dev:8 hw_level:2208
-    496120.935708366  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496120.935709944  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496120.935715983  DEV_STREAM_MIX                 written:1024 read:1024
-    496120.935716700  WRITE_STREAMS_MIXED            write_limit:1024
-    496120.935718204  FILL_AUDIO_DONE                hw_level:2208 total_written:1024 min_cb_level:1024
-    496120.935719502  STREAM_SLEEP_TIME              id:140000 wake:000496120.956742561
-    496120.935725365  SET_DEV_WAKE                   dev:8 hw_level:3232 sleep:3232
-    496120.935725731  DEV_SLEEP_TIME                 dev:8 wake:000496121.003052283
-    496120.935726974  SLEEP                          sleep:000000000.021023611 longest_wake:000158140
-    496120.956811014  WAKE                           num_fds:0
-    496120.956833380  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2176
-    496120.956857200  FILL_AUDIO                     dev:8 hw_level:2176
-    496120.956860568  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496120.956860934  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496120.956861791  WRITE_STREAMS_MIXED            write_limit:0
-    496120.956864337  FILL_AUDIO_DONE                hw_level:2176 total_written:0 min_cb_level:1024
-    496120.956871167  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496120.956871538  DEV_SLEEP_TIME                 dev:8 wake:000496121.002198642
-    496120.956872942  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496120.957023259  WAKE                           num_fds:1
-    496120.957050822  FILL_AUDIO                     dev:8 hw_level:2176
-    496120.957052085  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496120.957053584  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496120.957059472  DEV_STREAM_MIX                 written:1024 read:1024
-    496120.957060068  WRITE_STREAMS_MIXED            write_limit:1024
-    496120.957060795  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496120.957061727  STREAM_SLEEP_TIME              id:140000 wake:000496120.978075894
-    496120.957067446  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496120.957067826  DEV_SLEEP_TIME                 dev:8 wake:000496121.023727977
-    496120.957068839  SLEEP                          sleep:000000000.021014583 longest_wake:000158140
-    496120.978110225  WAKE                           num_fds:0
-    496120.978133193  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496120.978157349  FILL_AUDIO                     dev:8 hw_level:2192
-    496120.978161774  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496120.978162401  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496120.978163603  WRITE_STREAMS_MIXED            write_limit:0
-    496120.978166410  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496120.978174498  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496120.978175055  DEV_SLEEP_TIME                 dev:8 wake:000496121.023834404
-    496120.978176864  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496120.978294115  WAKE                           num_fds:1
-    496120.978341573  FILL_AUDIO                     dev:8 hw_level:2192
-    496120.978344284  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496120.978345853  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496120.978350043  DEV_STREAM_MIX                 written:1024 read:1024
-    496120.978350724  WRITE_STREAMS_MIXED            write_limit:1024
-    496120.978352358  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496120.978353656  STREAM_SLEEP_TIME              id:140000 wake:000496120.999409227
-    496120.978359555  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496120.978359931  DEV_SLEEP_TIME                 dev:8 wake:000496121.045353110
-    496120.978361198  SLEEP                          sleep:000000000.021056117 longest_wake:000158140
-    496120.999438377  WAKE                           num_fds:0
-    496120.999457772  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496120.999481026  FILL_AUDIO                     dev:8 hw_level:2208
-    496120.999484323  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496120.999484689  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496120.999485541  WRITE_STREAMS_MIXED            write_limit:0
-    496120.999487892  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496120.999494517  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496120.999494883  DEV_SLEEP_TIME                 dev:8 wake:000496121.045488844
-    496120.999496361  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496120.999657453  WAKE                           num_fds:1
-    496120.999688670  FILL_AUDIO                     dev:8 hw_level:2208
-    496120.999691136  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496120.999692664  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496120.999698443  DEV_STREAM_MIX                 written:1024 read:1024
-    496120.999699154  WRITE_STREAMS_MIXED            write_limit:1024
-    496120.999700618  FILL_AUDIO_DONE                hw_level:2208 total_written:1024 min_cb_level:1024
-    496120.999701906  STREAM_SLEEP_TIME              id:140000 wake:000496121.020742560
-    496120.999707408  SET_DEV_WAKE                   dev:8 hw_level:3232 sleep:3232
-    496120.999707779  DEV_SLEEP_TIME                 dev:8 wake:000496121.067034697
-    496120.999709032  SLEEP                          sleep:000000000.021041196 longest_wake:000158140
-    496121.020803596  WAKE                           num_fds:0
-    496121.020825632  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2176
-    496121.020845974  FILL_AUDIO                     dev:8 hw_level:2176
-    496121.020849552  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496121.020849963  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496121.020850860  WRITE_STREAMS_MIXED            write_limit:0
-    496121.020853421  FILL_AUDIO_DONE                hw_level:2176 total_written:0 min_cb_level:1024
-    496121.020860498  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496121.020860919  DEV_SLEEP_TIME                 dev:8 wake:000496121.066187902
-    496121.020862302  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496121.021012834  WAKE                           num_fds:1
-    496121.021038699  FILL_AUDIO                     dev:8 hw_level:2176
-    496121.021040107  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496121.021041651  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496121.021047835  DEV_STREAM_MIX                 written:1024 read:1024
-    496121.021048461  WRITE_STREAMS_MIXED            write_limit:1024
-    496121.021049830  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:0
-    496121.021050226  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496121.021050727  WRITE_STREAMS_MIXED            write_limit:0
-    496121.021051388  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496121.021052396  STREAM_SLEEP_TIME              id:140000 wake:000496121.042075893
-    496121.021057968  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496121.021058349  DEV_SLEEP_TIME                 dev:8 wake:000496121.087718621
-    496121.021059432  SLEEP                          sleep:000000000.021023938 longest_wake:000158140
-    496121.042115492  WAKE                           num_fds:0
-    496121.042141532  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496121.042168459  FILL_AUDIO                     dev:8 hw_level:2192
-    496121.042173215  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496121.042173726  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496121.042174779  WRITE_STREAMS_MIXED            write_limit:0
-    496121.042177791  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496121.042186050  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496121.042186571  DEV_SLEEP_TIME                 dev:8 wake:000496121.087845660
-    496121.042188430  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496121.042299602  WAKE                           num_fds:1
-    496121.042374133  FILL_AUDIO                     dev:8 hw_level:2192
-    496121.042379581  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496121.042383896  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496121.042396134  DEV_STREAM_MIX                 written:1024 read:1024
-    496121.042396845  WRITE_STREAMS_MIXED            write_limit:1024
-    496121.042399356  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496121.042401336  STREAM_SLEEP_TIME              id:140000 wake:000496121.063409226
-    496121.042408733  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496121.042409194  DEV_SLEEP_TIME                 dev:8 wake:000496121.109400118
-    496121.042411098  SLEEP                          sleep:000000000.021009108 longest_wake:000158140
-    496121.063442196  WAKE                           num_fds:0
-    496121.063463530  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496121.063487531  FILL_AUDIO                     dev:8 hw_level:2208
-    496121.063490733  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496121.063491094  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496121.063491956  WRITE_STREAMS_MIXED            write_limit:0
-    496121.063494311  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496121.063501097  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496121.063501518  DEV_SLEEP_TIME                 dev:8 wake:000496121.109495334
-    496121.063502906  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496121.063638629  WAKE                           num_fds:1
-    496121.063664449  FILL_AUDIO                     dev:8 hw_level:2208
-    496121.063665983  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496121.063667807  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496121.063672392  DEV_STREAM_MIX                 written:1024 read:1024
-    496121.063672979  WRITE_STREAMS_MIXED            write_limit:1024
-    496121.063673881  FILL_AUDIO_DONE                hw_level:2208 total_written:1024 min_cb_level:1024
-    496121.063674803  STREAM_SLEEP_TIME              id:140000 wake:000496121.084742559
-    496121.063680601  SET_DEV_WAKE                   dev:8 hw_level:3232 sleep:3232
-    496121.063680947  DEV_SLEEP_TIME                 dev:8 wake:000496121.131007700
-    496121.063681985  SLEEP                          sleep:000000000.021068192 longest_wake:000158140
-    496121.084972982  WAKE                           num_fds:0
-    496121.084998972  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2176
-    496121.085036704  FILL_AUDIO                     dev:8 hw_level:2176
-    496121.085042467  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496121.085043004  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496121.085044231  WRITE_STREAMS_MIXED            write_limit:0
-    496121.085047218  FILL_AUDIO_DONE                hw_level:2176 total_written:0 min_cb_level:1024
-    496121.085055317  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496121.085055828  DEV_SLEEP_TIME                 dev:8 wake:000496121.130381869
-    496121.085057853  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496121.085230672  WAKE                           num_fds:1
-    496121.085267442  FILL_AUDIO                     dev:8 hw_level:2176
-    496121.085269406  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496121.085270950  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496121.085275450  DEV_STREAM_MIX                 written:1024 read:1024
-    496121.085276072  WRITE_STREAMS_MIXED            write_limit:1024
-    496121.085277325  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496121.085278387  STREAM_SLEEP_TIME              id:140000 wake:000496121.106075892
-    496121.085284005  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496121.085284386  DEV_SLEEP_TIME                 dev:8 wake:000496121.151944572
-    496121.085285343  SLEEP                          sleep:000000000.020797986 longest_wake:000158140
-    496121.106153725  WAKE                           num_fds:0
-    496121.106176578  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496121.106205204  FILL_AUDIO                     dev:8 hw_level:2192
-    496121.106209083  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496121.106209449  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496121.106210311  WRITE_STREAMS_MIXED            write_limit:0
-    496121.106212756  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496121.106219677  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496121.106220093  DEV_SLEEP_TIME                 dev:8 wake:000496121.151880430
-    496121.106221497  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496121.106405836  WAKE                           num_fds:1
-    496121.106434848  FILL_AUDIO                     dev:8 hw_level:2192
-    496121.106436587  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496121.106438196  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496121.106442836  DEV_STREAM_MIX                 written:1024 read:1024
-    496121.106443453  WRITE_STREAMS_MIXED            write_limit:1024
-    496121.106444270  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496121.106445267  STREAM_SLEEP_TIME              id:140000 wake:000496121.127409225
-    496121.106450840  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496121.106451211  DEV_SLEEP_TIME                 dev:8 wake:000496121.173444846
-    496121.106452173  SLEEP                          sleep:000000000.020964379 longest_wake:000158140
-    496121.127456103  WAKE                           num_fds:0
-    496121.127480189  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496121.127509316  FILL_AUDIO                     dev:8 hw_level:2208
-    496121.127514788  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496121.127515350  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496121.127516447  WRITE_STREAMS_MIXED            write_limit:0
-    496121.127519494  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496121.127527327  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496121.127527949  DEV_SLEEP_TIME                 dev:8 wake:000496121.173520722
-    496121.127529863  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496121.127623489  WAKE                           num_fds:1
-    496121.127651173  FILL_AUDIO                     dev:8 hw_level:2208
-    496121.127653223  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496121.127655077  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496121.127661482  DEV_STREAM_MIX                 written:1024 read:1024
-    496121.127662299  WRITE_STREAMS_MIXED            write_limit:1024
-    496121.127663462  FILL_AUDIO_DONE                hw_level:2208 total_written:1024 min_cb_level:1024
-    496121.127664910  STREAM_SLEEP_TIME              id:140000 wake:000496121.148742558
-    496121.127671079  SET_DEV_WAKE                   dev:8 hw_level:3232 sleep:3232
-    496121.127671600  DEV_SLEEP_TIME                 dev:8 wake:000496121.194997566
-    496121.127673084  SLEEP                          sleep:000000000.021078325 longest_wake:000158140
-    496121.148794283  WAKE                           num_fds:0
-    496121.148808400  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2224
-    496121.148823722  FILL_AUDIO                     dev:8 hw_level:2176
-    496121.148826017  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496121.148826191  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496121.148826634  WRITE_STREAMS_MIXED            write_limit:0
-    496121.148828005  FILL_AUDIO_DONE                hw_level:2176 total_written:0 min_cb_level:1024
-    496121.148833984  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496121.148834180  DEV_SLEEP_TIME                 dev:8 wake:000496121.194161902
-    496121.148834991  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496121.148928624  WAKE                           num_fds:1
-    496121.148951279  FILL_AUDIO                     dev:8 hw_level:2176
-    496121.148952642  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496121.148953524  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496121.148957366  DEV_STREAM_MIX                 written:1024 read:1024
-    496121.148957752  WRITE_STREAMS_MIXED            write_limit:1024
-    496121.148958498  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496121.148959151  STREAM_SLEEP_TIME              id:140000 wake:000496121.170075891
-    496121.148964100  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496121.148964295  DEV_SLEEP_TIME                 dev:8 wake:000496121.215625558
-    496121.148965082  SLEEP                          sleep:000000000.021116999 longest_wake:000158140
-    496121.170295036  WAKE                           num_fds:0
-    496121.170310195  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496121.170338189  FILL_AUDIO                     dev:8 hw_level:2192
-    496121.170340356  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496121.170340526  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496121.170341064  WRITE_STREAMS_MIXED            write_limit:0
-    496121.170342450  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496121.170348111  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496121.170348306  DEV_SLEEP_TIME                 dev:8 wake:000496121.216009708
-    496121.170349021  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496121.170436685  WAKE                           num_fds:1
-    496121.170457636  FILL_AUDIO                     dev:8 hw_level:2192
-    496121.170458990  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496121.170459889  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496121.170463374  DEV_STREAM_MIX                 written:1024 read:1024
-    496121.170463768  WRITE_STREAMS_MIXED            write_limit:1024
-    496121.170464518  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496121.170465104  STREAM_SLEEP_TIME              id:140000 wake:000496121.191409224
-    496121.170469940  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496121.170470140  DEV_SLEEP_TIME                 dev:8 wake:000496121.237464872
-    496121.170470759  SLEEP                          sleep:000000000.020944352 longest_wake:000158140
-    496121.191442767  WAKE                           num_fds:0
-    496121.191468065  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496121.191492321  FILL_AUDIO                     dev:8 hw_level:2208
-    496121.191497173  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496121.191497739  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496121.191498982  WRITE_STREAMS_MIXED            write_limit:0
-    496121.191502044  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496121.191510178  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496121.191510804  DEV_SLEEP_TIME                 dev:8 wake:000496121.237503387
-    496121.191512688  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496121.191656004  WAKE                           num_fds:1
-    496121.191683488  FILL_AUDIO                     dev:8 hw_level:2208
-    496121.191685171  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496121.191687051  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496121.191693110  DEV_STREAM_MIX                 written:1024 read:1024
-    496121.191693912  WRITE_STREAMS_MIXED            write_limit:1024
-    496121.191694869  FILL_AUDIO_DONE                hw_level:2208 total_written:1024 min_cb_level:1024
-    496121.191696172  STREAM_SLEEP_TIME              id:140000 wake:000496121.212742557
-    496121.191702466  SET_DEV_WAKE                   dev:8 hw_level:3232 sleep:3232
-    496121.191703003  DEV_SLEEP_TIME                 dev:8 wake:000496121.259028934
-    496121.191704526  SLEEP                          sleep:000000000.021046956 longest_wake:000158140
-    496121.212804603  WAKE                           num_fds:0
-    496121.212826428  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2176
-    496121.212845046  FILL_AUDIO                     dev:8 hw_level:2176
-    496121.212848564  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496121.212848930  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496121.212849963  WRITE_STREAMS_MIXED            write_limit:0
-    496121.212852378  FILL_AUDIO_DONE                hw_level:2176 total_written:0 min_cb_level:1024
-    496121.212859840  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496121.212860281  DEV_SLEEP_TIME                 dev:8 wake:000496121.258187200
-    496121.212861805  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496121.213036739  WAKE                           num_fds:1
-    496121.213070923  FILL_AUDIO                     dev:8 hw_level:2176
-    496121.213073554  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496121.213075102  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496121.213081507  DEV_STREAM_MIX                 written:1024 read:1024
-    496121.213082214  WRITE_STREAMS_MIXED            write_limit:1024
-    496121.213083777  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496121.213085085  STREAM_SLEEP_TIME              id:140000 wake:000496121.234075890
-    496121.213090939  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496121.213091360  DEV_SLEEP_TIME                 dev:8 wake:000496121.279751190
-    496121.213092643  SLEEP                          sleep:000000000.020991366 longest_wake:000158140
-    496121.234340660  WAKE                           num_fds:0
-    496121.234364265  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496121.234393978  FILL_AUDIO                     dev:8 hw_level:2192
-    496121.234398053  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496121.234398418  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496121.234399290  WRITE_STREAMS_MIXED            write_limit:0
-    496121.234401912  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496121.234408692  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496121.234409113  DEV_SLEEP_TIME                 dev:8 wake:000496121.280069555
-    496121.234410491  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496121.234595734  WAKE                           num_fds:1
-    496121.234631867  FILL_AUDIO                     dev:8 hw_level:2192
-    496121.234634709  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496121.234636328  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496121.234640613  DEV_STREAM_MIX                 written:1024 read:1024
-    496121.234641319  WRITE_STREAMS_MIXED            write_limit:1024
-    496121.234643008  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496121.234644276  STREAM_SLEEP_TIME              id:140000 wake:000496121.255409223
-    496121.234650119  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496121.234650540  DEV_SLEEP_TIME                 dev:8 wake:000496121.301643780
-    496121.234651838  SLEEP                          sleep:000000000.020765443 longest_wake:000158140
-    496121.255666578  WAKE                           num_fds:0
-    496121.255690188  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496121.255720508  FILL_AUDIO                     dev:8 hw_level:2208
-    496121.255724261  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496121.255724632  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496121.255725509  WRITE_STREAMS_MIXED            write_limit:0
-    496121.255728055  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496121.255734826  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496121.255735242  DEV_SLEEP_TIME                 dev:8 wake:000496121.301729027
-    496121.255736630  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496121.255919587  WAKE                           num_fds:1
-    496121.255961218  FILL_AUDIO                     dev:8 hw_level:2160
-    496121.255964646  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496121.255966716  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496121.255972560  DEV_STREAM_MIX                 written:1024 read:1024
-    496121.255973502  WRITE_STREAMS_MIXED            write_limit:1024
-    496121.255975742  FILL_AUDIO_DONE                hw_level:2160 total_written:1024 min_cb_level:1024
-    496121.255977441  STREAM_SLEEP_TIME              id:140000 wake:000496121.276742556
-    496121.256005751  SET_DEV_WAKE                   dev:8 hw_level:3184 sleep:3184
-    496121.256006408  DEV_SLEEP_TIME                 dev:8 wake:000496121.322310077
-    496121.256008177  SLEEP                          sleep:000000000.020765812 longest_wake:000158140
-    496121.276833494  WAKE                           num_fds:0
-    496121.276877902  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2176
-    496121.276909971  FILL_AUDIO                     dev:8 hw_level:2176
-    496121.276917979  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496121.276918350  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496121.276919974  WRITE_STREAMS_MIXED            write_limit:0
-    496121.276924930  FILL_AUDIO_DONE                hw_level:2176 total_written:0 min_cb_level:1024
-    496121.276932894  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496121.276933325  DEV_SLEEP_TIME                 dev:8 wake:000496121.322259882
-    496121.276934914  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496121.277102220  WAKE                           num_fds:1
-    496121.277141049  FILL_AUDIO                     dev:8 hw_level:2176
-    496121.277146141  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496121.277147930  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496121.277154756  DEV_STREAM_MIX                 written:1024 read:1024
-    496121.277155468  WRITE_STREAMS_MIXED            write_limit:1024
-    496121.277157577  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496121.277159051  STREAM_SLEEP_TIME              id:140000 wake:000496121.298075889
-    496121.277165325  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496121.277165756  DEV_SLEEP_TIME                 dev:8 wake:000496121.343825146
-    496121.277167140  SLEEP                          sleep:000000000.020917409 longest_wake:000158140
-    496121.298348914  WAKE                           num_fds:0
-    496121.298371636  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496121.298402057  FILL_AUDIO                     dev:8 hw_level:2192
-    496121.298407078  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496121.298407444  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496121.298408321  WRITE_STREAMS_MIXED            write_limit:0
-    496121.298410827  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496121.298417593  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496121.298418013  DEV_SLEEP_TIME                 dev:8 wake:000496121.344078475
-    496121.298419487  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496121.298605947  WAKE                           num_fds:1
-    496121.298642421  FILL_AUDIO                     dev:8 hw_level:2192
-    496121.298645453  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496121.298646977  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496121.298651342  DEV_STREAM_MIX                 written:1024 read:1024
-    496121.298652024  WRITE_STREAMS_MIXED            write_limit:1024
-    496121.298653682  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496121.298654975  STREAM_SLEEP_TIME              id:140000 wake:000496121.319409222
-    496121.298660674  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496121.298661120  DEV_SLEEP_TIME                 dev:8 wake:000496121.365654424
-    496121.298662398  SLEEP                          sleep:000000000.020754798 longest_wake:000158140
-    496121.319517158  WAKE                           num_fds:0
-    496121.319540282  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496121.319569664  FILL_AUDIO                     dev:8 hw_level:2208
-    496121.319573483  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496121.319573844  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496121.319574716  WRITE_STREAMS_MIXED            write_limit:0
-    496121.319577397  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496121.319584288  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496121.319584709  DEV_SLEEP_TIME                 dev:8 wake:000496121.365578450
-    496121.319586107  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496121.319772252  WAKE                           num_fds:1
-    496121.319806747  FILL_AUDIO                     dev:8 hw_level:2208
-    496121.319809608  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496121.319811162  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496121.319817070  DEV_STREAM_MIX                 written:1024 read:1024
-    496121.319817782  WRITE_STREAMS_MIXED            write_limit:1024
-    496121.319819521  FILL_AUDIO_DONE                hw_level:2208 total_written:1024 min_cb_level:1024
-    496121.319820794  STREAM_SLEEP_TIME              id:140000 wake:000496121.340742555
-    496121.319826878  SET_DEV_WAKE                   dev:8 hw_level:3184 sleep:3184
-    496121.319827319  DEV_SLEEP_TIME                 dev:8 wake:000496121.386153636
-    496121.319828577  SLEEP                          sleep:000000000.020922252 longest_wake:000158140
-    496121.340779013  WAKE                           num_fds:0
-    496121.340801190  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2224
-    496121.340820529  FILL_AUDIO                     dev:8 hw_level:2224
-    496121.340824208  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496121.340824574  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496121.340825431  WRITE_STREAMS_MIXED            write_limit:0
-    496121.340827766  FILL_AUDIO_DONE                hw_level:2224 total_written:0 min_cb_level:1024
-    496121.340835128  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496121.340835564  DEV_SLEEP_TIME                 dev:8 wake:000496121.386162156
-    496121.340837022  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496121.340934888  WAKE                           num_fds:1
-    496121.340962677  FILL_AUDIO                     dev:8 hw_level:2176
-    496121.340965148  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496121.340967083  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496121.340972921  DEV_STREAM_MIX                 written:1024 read:1024
-    496121.340973838  WRITE_STREAMS_MIXED            write_limit:1024
-    496121.340975302  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496121.340976885  STREAM_SLEEP_TIME              id:140000 wake:000496121.362075888
-    496121.340983536  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496121.340984062  DEV_SLEEP_TIME                 dev:8 wake:000496121.407642910
-    496121.340985375  SLEEP                          sleep:000000000.021099644 longest_wake:000158140
-    496121.362354958  WAKE                           num_fds:0
-    496121.362378873  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496121.362408697  FILL_AUDIO                     dev:8 hw_level:2192
-    496121.362412716  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496121.362413087  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496121.362413959  WRITE_STREAMS_MIXED            write_limit:0
-    496121.362416470  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496121.362423406  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496121.362423822  DEV_SLEEP_TIME                 dev:8 wake:000496121.408084143
-    496121.362425310  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496121.362609405  WAKE                           num_fds:1
-    496121.362644947  FILL_AUDIO                     dev:8 hw_level:2192
-    496121.362647794  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496121.362649352  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496121.362655296  DEV_STREAM_MIX                 written:1024 read:1024
-    496121.362656003  WRITE_STREAMS_MIXED            write_limit:1024
-    496121.362657697  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496121.362658959  STREAM_SLEEP_TIME              id:140000 wake:000496121.383409221
-    496121.362664853  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496121.362665284  DEV_SLEEP_TIME                 dev:8 wake:000496121.429658468
-    496121.362666582  SLEEP                          sleep:000000000.020750753 longest_wake:000158140
-    496121.383661311  WAKE                           num_fds:0
-    496121.383685507  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496121.383715957  FILL_AUDIO                     dev:8 hw_level:2208
-    496121.383719771  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496121.383720152  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496121.383721169  WRITE_STREAMS_MIXED            write_limit:0
-    496121.383723635  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496121.383730520  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496121.383730941  DEV_SLEEP_TIME                 dev:8 wake:000496121.429724627
-    496121.383732590  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496121.383917362  WAKE                           num_fds:1
-    496121.383953876  FILL_AUDIO                     dev:8 hw_level:2160
-    496121.383956778  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496121.383958356  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496121.383964300  DEV_STREAM_MIX                 written:1024 read:1024
-    496121.383965012  WRITE_STREAMS_MIXED            write_limit:1024
-    496121.383966590  FILL_AUDIO_DONE                hw_level:2160 total_written:1024 min_cb_level:1024
-    496121.383967858  STREAM_SLEEP_TIME              id:140000 wake:000496121.404742554
-    496121.383973662  SET_DEV_WAKE                   dev:8 hw_level:3184 sleep:3184
-    496121.383974088  DEV_SLEEP_TIME                 dev:8 wake:000496121.450300690
-    496121.383975396  SLEEP                          sleep:000000000.020775197 longest_wake:000158140
-    496121.404849376  WAKE                           num_fds:0
-    496121.404872895  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2176
-    496121.404901997  FILL_AUDIO                     dev:8 hw_level:2176
-    496121.404905926  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496121.404906297  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496121.404907169  WRITE_STREAMS_MIXED            write_limit:0
-    496121.404909630  FILL_AUDIO_DONE                hw_level:2176 total_written:0 min_cb_level:1024
-    496121.404916471  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496121.404916897  DEV_SLEEP_TIME                 dev:8 wake:000496121.450243925
-    496121.404918325  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496121.405102806  WAKE                           num_fds:1
-    496121.405139886  FILL_AUDIO                     dev:8 hw_level:2176
-    496121.405142743  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496121.405144241  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496121.405150476  DEV_STREAM_MIX                 written:1024 read:1024
-    496121.405151182  WRITE_STREAMS_MIXED            write_limit:1024
-    496121.405152826  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496121.405154069  STREAM_SLEEP_TIME              id:140000 wake:000496121.426075887
-    496121.405159912  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496121.405160338  DEV_SLEEP_TIME                 dev:8 wake:000496121.471820239
-    496121.405161661  SLEEP                          sleep:000000000.020922314 longest_wake:000158140
-    496121.426187061  WAKE                           num_fds:0
-    496121.426210430  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496121.426240775  FILL_AUDIO                     dev:8 hw_level:2192
-    496121.426244468  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496121.426244844  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496121.426245716  WRITE_STREAMS_MIXED            write_limit:0
-    496121.426248337  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496121.426255243  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496121.426255674  DEV_SLEEP_TIME                 dev:8 wake:000496121.471916076
-    496121.426257068  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496121.426460306  WAKE                           num_fds:1
-    496121.426497361  FILL_AUDIO                     dev:8 hw_level:2192
-    496121.426500183  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496121.426501801  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496121.426507575  DEV_STREAM_MIX                 written:1024 read:1024
-    496121.426508286  WRITE_STREAMS_MIXED            write_limit:1024
-    496121.426509890  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496121.426511163  STREAM_SLEEP_TIME              id:140000 wake:000496121.447409220
-    496121.426516901  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496121.426517322  DEV_SLEEP_TIME                 dev:8 wake:000496121.493510657
-    496121.426518570  SLEEP                          sleep:000000000.020898563 longest_wake:000158140
-    496121.447437098  WAKE                           num_fds:0
-    496121.447459314  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496121.447478694  FILL_AUDIO                     dev:8 hw_level:2208
-    496121.447482052  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496121.447482413  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496121.447483420  WRITE_STREAMS_MIXED            write_limit:0
-    496121.447485916  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496121.447492992  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496121.447493413  DEV_SLEEP_TIME                 dev:8 wake:000496121.493486988
-    496121.447494891  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496121.447638448  WAKE                           num_fds:1
-    496121.447662433  FILL_AUDIO                     dev:8 hw_level:2208
-    496121.447663871  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496121.447665395  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496121.447669329  DEV_STREAM_MIX                 written:1024 read:1024
-    496121.447669940  WRITE_STREAMS_MIXED            write_limit:1024
-    496121.447670717  FILL_AUDIO_DONE                hw_level:2208 total_written:1024 min_cb_level:1024
-    496121.447671765  STREAM_SLEEP_TIME              id:140000 wake:000496121.468742553
-    496121.447677317  SET_DEV_WAKE                   dev:8 hw_level:3232 sleep:3232
-    496121.447677698  DEV_SLEEP_TIME                 dev:8 wake:000496121.515004652
-    496121.447678721  SLEEP                          sleep:000000000.021071234 longest_wake:000158140
-    496121.468810020  WAKE                           num_fds:0
-    496121.468833494  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2176
-    496121.468862756  FILL_AUDIO                     dev:8 hw_level:2176
-    496121.468866450  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496121.468866821  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496121.468867683  WRITE_STREAMS_MIXED            write_limit:0
-    496121.468870224  FILL_AUDIO_DONE                hw_level:2176 total_written:0 min_cb_level:1024
-    496121.468877119  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496121.468877535  DEV_SLEEP_TIME                 dev:8 wake:000496121.514204544
-    496121.468878934  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496121.469065043  WAKE                           num_fds:1
-    496121.469101332  FILL_AUDIO                     dev:8 hw_level:2176
-    496121.469104214  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496121.469105782  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496121.469110273  DEV_STREAM_MIX                 written:1024 read:1024
-    496121.469110984  WRITE_STREAMS_MIXED            write_limit:1024
-    496121.469112643  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496121.469113906  STREAM_SLEEP_TIME              id:140000 wake:000496121.490075886
-    496121.469119609  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496121.469120035  DEV_SLEEP_TIME                 dev:8 wake:000496121.535780076
-    496121.469121338  SLEEP                          sleep:000000000.020962476 longest_wake:000158140
-    496121.490134710  WAKE                           num_fds:0
-    496121.490157758  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496121.490176612  FILL_AUDIO                     dev:8 hw_level:2192
-    496121.490180090  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496121.490180455  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496121.490181328  WRITE_STREAMS_MIXED            write_limit:0
-    496121.490183939  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496121.490191015  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496121.490191441  DEV_SLEEP_TIME                 dev:8 wake:000496121.535851602
-    496121.490192819  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496121.490344027  WAKE                           num_fds:1
-    496121.490368824  FILL_AUDIO                     dev:8 hw_level:2192
-    496121.490369947  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496121.490371526  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496121.490375760  DEV_STREAM_MIX                 written:1024 read:1024
-    496121.490376372  WRITE_STREAMS_MIXED            write_limit:1024
-    496121.490377103  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496121.490378071  STREAM_SLEEP_TIME              id:140000 wake:000496121.511409219
-    496121.490383679  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496121.490384044  DEV_SLEEP_TIME                 dev:8 wake:000496121.557377630
-    496121.490385037  SLEEP                          sleep:000000000.021031589 longest_wake:000158140
-    496121.511477967  WAKE                           num_fds:0
-    496121.511498976  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496121.511518240  FILL_AUDIO                     dev:8 hw_level:2208
-    496121.511521848  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496121.511522214  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496121.511523071  WRITE_STREAMS_MIXED            write_limit:0
-    496121.511525662  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496121.511532739  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496121.511533159  DEV_SLEEP_TIME                 dev:8 wake:000496121.557526780
-    496121.511534738  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496121.511709978  WAKE                           num_fds:1
-    496121.511744327  FILL_AUDIO                     dev:8 hw_level:2208
-    496121.511746938  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496121.511748527  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496121.511752872  DEV_STREAM_MIX                 written:1024 read:1024
-    496121.511753583  WRITE_STREAMS_MIXED            write_limit:1024
-    496121.511755062  FILL_AUDIO_DONE                hw_level:2208 total_written:1024 min_cb_level:1024
-    496121.511756370  STREAM_SLEEP_TIME              id:140000 wake:000496121.532742552
-    496121.511762093  SET_DEV_WAKE                   dev:8 hw_level:3232 sleep:3232
-    496121.511762519  DEV_SLEEP_TIME                 dev:8 wake:000496121.579089151
-    496121.511763777  SLEEP                          sleep:000000000.020986734 longest_wake:000158140
-    496121.532787267  WAKE                           num_fds:0
-    496121.532806276  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2224
-    496121.532828853  FILL_AUDIO                     dev:8 hw_level:2176
-    496121.532832171  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496121.532832546  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496121.532833393  WRITE_STREAMS_MIXED            write_limit:0
-    496121.532835618  FILL_AUDIO_DONE                hw_level:2176 total_written:0 min_cb_level:1024
-    496121.532842209  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496121.532842640  DEV_SLEEP_TIME                 dev:8 wake:000496121.578169939
-    496121.532844013  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496121.533004248  WAKE                           num_fds:1
-    496121.533031992  FILL_AUDIO                     dev:8 hw_level:2176
-    496121.533033139  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496121.533034768  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496121.533039339  DEV_STREAM_MIX                 written:1024 read:1024
-    496121.533039885  WRITE_STREAMS_MIXED            write_limit:1024
-    496121.533040546  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496121.533041479  STREAM_SLEEP_TIME              id:140000 wake:000496121.554075885
-    496121.533046991  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496121.533047332  DEV_SLEEP_TIME                 dev:8 wake:000496121.599707689
-    496121.533048249  SLEEP                          sleep:000000000.021034862 longest_wake:000158140
-    496121.554149766  WAKE                           num_fds:0
-    496121.554166364  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496121.554188087  FILL_AUDIO                     dev:8 hw_level:2192
-    496121.554190863  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496121.554191054  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496121.554191551  WRITE_STREAMS_MIXED            write_limit:0
-    496121.554193238  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496121.554198768  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496121.554198995  DEV_SLEEP_TIME                 dev:8 wake:000496121.599860491
-    496121.554199801  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496121.554306442  WAKE                           num_fds:1
-    496121.554337642  FILL_AUDIO                     dev:8 hw_level:2192
-    496121.554339165  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496121.554340148  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496121.554342551  DEV_STREAM_MIX                 written:1024 read:1024
-    496121.554342938  WRITE_STREAMS_MIXED            write_limit:1024
-    496121.554343832  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496121.554344526  STREAM_SLEEP_TIME              id:140000 wake:000496121.575409218
-    496121.554349427  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496121.554349648  DEV_SLEEP_TIME                 dev:8 wake:000496121.621344250
-    496121.554350349  SLEEP                          sleep:000000000.021064968 longest_wake:000158140
-    496121.575454337  WAKE                           num_fds:0
-    496121.575494936  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496121.575524409  FILL_AUDIO                     dev:8 hw_level:2208
-    496121.575533510  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496121.575533881  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496121.575535084  WRITE_STREAMS_MIXED            write_limit:0
-    496121.575542005  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496121.575550880  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496121.575551301  DEV_SLEEP_TIME                 dev:8 wake:000496121.621544054
-    496121.575553642  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496121.575716452  WAKE                           num_fds:1
-    496121.575751844  FILL_AUDIO                     dev:8 hw_level:2208
-    496121.575754250  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496121.575758309  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496121.575767365  DEV_STREAM_MIX                 written:1024 read:1024
-    496121.575768162  WRITE_STREAMS_MIXED            write_limit:1024
-    496121.575770342  FILL_AUDIO_DONE                hw_level:2208 total_written:1024 min_cb_level:1024
-    496121.575771555  STREAM_SLEEP_TIME              id:140000 wake:000496121.596742551
-    496121.575778536  SET_DEV_WAKE                   dev:8 hw_level:3232 sleep:3232
-    496121.575778881  DEV_SLEEP_TIME                 dev:8 wake:000496121.643104391
-    496121.575779819  SLEEP                          sleep:000000000.020971493 longest_wake:000158140
-    496121.596772698  WAKE                           num_fds:0
-    496121.596791942  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2224
-    496121.596812365  FILL_AUDIO                     dev:8 hw_level:2224
-    496121.596816053  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496121.596816449  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496121.596817366  WRITE_STREAMS_MIXED            write_limit:0
-    496121.596819742  FILL_AUDIO_DONE                hw_level:2224 total_written:0 min_cb_level:1024
-    496121.596827289  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496121.596827710  DEV_SLEEP_TIME                 dev:8 wake:000496121.642154277
-    496121.596829168  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496121.596956217  WAKE                           num_fds:1
-    496121.596983470  FILL_AUDIO                     dev:8 hw_level:2176
-    496121.596984933  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496121.596986747  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496121.596992150  DEV_STREAM_MIX                 written:1024 read:1024
-    496121.596992816  WRITE_STREAMS_MIXED            write_limit:1024
-    496121.596993984  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496121.596995237  STREAM_SLEEP_TIME              id:140000 wake:000496121.618075884
-    496121.597001296  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496121.597001767  DEV_SLEEP_TIME                 dev:8 wake:000496121.663661412
-    496121.597003526  SLEEP                          sleep:000000000.021081138 longest_wake:000158140
-    496121.618124193  WAKE                           num_fds:0
-    496121.618142226  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496121.618162091  FILL_AUDIO                     dev:8 hw_level:2192
-    496121.618164259  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496121.618164430  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496121.618164887  WRITE_STREAMS_MIXED            write_limit:0
-    496121.618166527  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496121.618172515  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496121.618172712  DEV_SLEEP_TIME                 dev:8 wake:000496121.663833716
-    496121.618173602  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496121.618250086  WAKE                           num_fds:1
-    496121.618275409  FILL_AUDIO                     dev:8 hw_level:2192
-    496121.618277345  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496121.618278382  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496121.618282712  DEV_STREAM_MIX                 written:1024 read:1024
-    496121.618283080  WRITE_STREAMS_MIXED            write_limit:1024
-    496121.618284169  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496121.618284939  STREAM_SLEEP_TIME              id:140000 wake:000496121.639409217
-    496121.618290559  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496121.618290797  DEV_SLEEP_TIME                 dev:8 wake:000496121.685284641
-    496121.618291691  SLEEP                          sleep:000000000.021124576 longest_wake:000158140
-    496121.639440385  WAKE                           num_fds:0
-    496121.639455997  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496121.639474693  FILL_AUDIO                     dev:8 hw_level:2208
-    496121.639476921  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496121.639477163  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496121.639477713  WRITE_STREAMS_MIXED            write_limit:0
-    496121.639479088  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496121.639484385  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496121.639484585  DEV_SLEEP_TIME                 dev:8 wake:000496121.685479618
-    496121.639485314  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496121.639571021  WAKE                           num_fds:1
-    496121.639588187  FILL_AUDIO                     dev:8 hw_level:2208
-    496121.639588853  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496121.639589796  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496121.639591916  DEV_STREAM_MIX                 written:1024 read:1024
-    496121.639592176  WRITE_STREAMS_MIXED            write_limit:1024
-    496121.639592524  FILL_AUDIO_DONE                hw_level:2208 total_written:1024 min_cb_level:1024
-    496121.639592994  STREAM_SLEEP_TIME              id:140000 wake:000496121.660742550
-    496121.639597798  SET_DEV_WAKE                   dev:8 hw_level:3232 sleep:3232
-    496121.639598010  DEV_SLEEP_TIME                 dev:8 wake:000496121.706926113
-    496121.639598591  SLEEP                          sleep:000000000.021149770 longest_wake:000158140
-    496121.660777354  WAKE                           num_fds:0
-    496121.660803529  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2224
-    496121.660831248  FILL_AUDIO                     dev:8 hw_level:2176
-    496121.660837232  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496121.660837603  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496121.660838725  WRITE_STREAMS_MIXED            write_limit:0
-    496121.660842188  FILL_AUDIO_DONE                hw_level:2176 total_written:0 min_cb_level:1024
-    496121.660849174  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496121.660849605  DEV_SLEEP_TIME                 dev:8 wake:000496121.706176328
-    496121.660851059  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496121.660972434  WAKE                           num_fds:1
-    496121.660998349  FILL_AUDIO                     dev:8 hw_level:2176
-    496121.661000228  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496121.661001912  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496121.661007961  DEV_STREAM_MIX                 written:1024 read:1024
-    496121.661008622  WRITE_STREAMS_MIXED            write_limit:1024
-    496121.661009860  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496121.661011399  STREAM_SLEEP_TIME              id:140000 wake:000496121.682075883
-    496121.661017543  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496121.661017944  DEV_SLEEP_TIME                 dev:8 wake:000496121.727677223
-    496121.661018966  SLEEP                          sleep:000000000.021065326 longest_wake:000158140
-    496121.682107792  WAKE                           num_fds:0
-    496121.682128911  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496121.682148682  FILL_AUDIO                     dev:8 hw_level:2192
-    496121.682152465  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496121.682152846  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496121.682153863  WRITE_STREAMS_MIXED            write_limit:0
-    496121.682156525  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496121.682164117  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496121.682164533  DEV_SLEEP_TIME                 dev:8 wake:000496121.727824328
-    496121.682166262  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496121.682264925  WAKE                           num_fds:1
-    496121.682287552  FILL_AUDIO                     dev:8 hw_level:2192
-    496121.682289416  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496121.682291381  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496121.682297630  DEV_STREAM_MIX                 written:1024 read:1024
-    496121.682298352  WRITE_STREAMS_MIXED            write_limit:1024
-    496121.682299835  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496121.682301093  STREAM_SLEEP_TIME              id:140000 wake:000496121.703409216
-    496121.682306160  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496121.682306676  DEV_SLEEP_TIME                 dev:8 wake:000496121.749300442
-    496121.682308029  SLEEP                          sleep:000000000.021108774 longest_wake:000158140
-    496121.703497071  WAKE                           num_fds:0
-    496121.703520750  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496121.703547256  FILL_AUDIO                     dev:8 hw_level:2208
-    496121.703551261  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496121.703551837  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496121.703552945  WRITE_STREAMS_MIXED            write_limit:0
-    496121.703555796  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496121.703563900  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496121.703564391  DEV_SLEEP_TIME                 dev:8 wake:000496121.749557079
-    496121.703566491  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496121.703744086  WAKE                           num_fds:1
-    496121.703780810  FILL_AUDIO                     dev:8 hw_level:2208
-    496121.703783762  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496121.703785371  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496121.703791515  DEV_STREAM_MIX                 written:1024 read:1024
-    496121.703792207  WRITE_STREAMS_MIXED            write_limit:1024
-    496121.703793886  FILL_AUDIO_DONE                hw_level:2208 total_written:1024 min_cb_level:1024
-    496121.703795229  STREAM_SLEEP_TIME              id:140000 wake:000496121.724742549
-    496121.703801448  SET_DEV_WAKE                   dev:8 hw_level:3232 sleep:3232
-    496121.703801869  DEV_SLEEP_TIME                 dev:8 wake:000496121.771128005
-    496121.703803137  SLEEP                          sleep:000000000.020947877 longest_wake:000158140
-    496121.724787767  WAKE                           num_fds:0
-    496121.724808766  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2224
-    496121.724832015  FILL_AUDIO                     dev:8 hw_level:2176
-    496121.724835688  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496121.724836099  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496121.724837081  WRITE_STREAMS_MIXED            write_limit:0
-    496121.724839888  FILL_AUDIO_DONE                hw_level:2176 total_written:0 min_cb_level:1024
-    496121.724847761  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496121.724848197  DEV_SLEEP_TIME                 dev:8 wake:000496121.770174283
-    496121.724849776  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496121.724991743  WAKE                           num_fds:1
-    496121.725028934  FILL_AUDIO                     dev:8 hw_level:2176
-    496121.725031786  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496121.725033399  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496121.725039383  DEV_STREAM_MIX                 written:1024 read:1024
-    496121.725040095  WRITE_STREAMS_MIXED            write_limit:1024
-    496121.725041663  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496121.725042986  STREAM_SLEEP_TIME              id:140000 wake:000496121.746075882
-    496121.725049030  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496121.725049456  DEV_SLEEP_TIME                 dev:8 wake:000496121.791709096
-    496121.725050830  SLEEP                          sleep:000000000.021033452 longest_wake:000158140
-    496121.746183507  WAKE                           num_fds:0
-    496121.746206440  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496121.746236283  FILL_AUDIO                     dev:8 hw_level:2192
-    496121.746239977  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496121.746240348  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496121.746241220  WRITE_STREAMS_MIXED            write_limit:0
-    496121.746243841  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496121.746250787  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496121.746251208  DEV_SLEEP_TIME                 dev:8 wake:000496121.791911514
-    496121.746252752  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496121.746440178  WAKE                           num_fds:1
-    496121.746474552  FILL_AUDIO                     dev:8 hw_level:2192
-    496121.746477209  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496121.746478887  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496121.746484646  DEV_STREAM_MIX                 written:1024 read:1024
-    496121.746485362  WRITE_STREAMS_MIXED            write_limit:1024
-    496121.746487167  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496121.746488465  STREAM_SLEEP_TIME              id:140000 wake:000496121.767409215
-    496121.746494258  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496121.746494684  DEV_SLEEP_TIME                 dev:8 wake:000496121.813487968
-    496121.746495987  SLEEP                          sleep:000000000.020921247 longest_wake:000158140
-    496121.767517668  WAKE                           num_fds:0
-    496121.767540631  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496121.767570465  FILL_AUDIO                     dev:8 hw_level:2208
-    496121.767574359  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496121.767574730  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496121.767575607  WRITE_STREAMS_MIXED            write_limit:0
-    496121.767578077  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496121.767584953  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496121.767585374  DEV_SLEEP_TIME                 dev:8 wake:000496121.813579080
-    496121.767586833  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496121.767774586  WAKE                           num_fds:1
-    496121.767808720  FILL_AUDIO                     dev:8 hw_level:2208
-    496121.767811737  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496121.767813270  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496121.767819550  DEV_STREAM_MIX                 written:1024 read:1024
-    496121.767820261  WRITE_STREAMS_MIXED            write_limit:1024
-    496121.767821965  FILL_AUDIO_DONE                hw_level:2208 total_written:1024 min_cb_level:1024
-    496121.767823248  STREAM_SLEEP_TIME              id:140000 wake:000496121.788742548
-    496121.767829498  SET_DEV_WAKE                   dev:8 hw_level:3184 sleep:3184
-    496121.767829924  DEV_SLEEP_TIME                 dev:8 wake:000496121.834156085
-    496121.767831212  SLEEP                          sleep:000000000.020919796 longest_wake:000158140
-    496121.788852201  WAKE                           num_fds:0
-    496121.788875299  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2176
-    496121.788905694  FILL_AUDIO                     dev:8 hw_level:2176
-    496121.788909388  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496121.788909764  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496121.788910641  WRITE_STREAMS_MIXED            write_limit:0
-    496121.788913157  FILL_AUDIO_DONE                hw_level:2176 total_written:0 min_cb_level:1024
-    496121.788919962  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496121.788920378  DEV_SLEEP_TIME                 dev:8 wake:000496121.834247487
-    496121.788921847  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496121.789105962  WAKE                           num_fds:1
-    496121.789141990  FILL_AUDIO                     dev:8 hw_level:2176
-    496121.789144821  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496121.789146320  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496121.789152188  DEV_STREAM_MIX                 written:1024 read:1024
-    496121.789152905  WRITE_STREAMS_MIXED            write_limit:1024
-    496121.789154589  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496121.789155837  STREAM_SLEEP_TIME              id:140000 wake:000496121.810075881
-    496121.789161580  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496121.789162031  DEV_SLEEP_TIME                 dev:8 wake:000496121.855822012
-    496121.789163364  SLEEP                          sleep:000000000.020920535 longest_wake:000158140
-    496121.810105924  WAKE                           num_fds:0
-    496121.810127257  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496121.810146862  FILL_AUDIO                     dev:8 hw_level:2192
-    496121.810150015  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496121.810150306  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496121.810151004  WRITE_STREAMS_MIXED            write_limit:0
-    496121.810153450  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496121.810160382  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496121.810160763  DEV_SLEEP_TIME                 dev:8 wake:000496121.855821025
-    496121.810162046  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496121.810236321  WAKE                           num_fds:1
-    496121.810255739  FILL_AUDIO                     dev:8 hw_level:2192
-    496121.810256712  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496121.810257947  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496121.810261439  DEV_STREAM_MIX                 written:1024 read:1024
-    496121.810261907  WRITE_STREAMS_MIXED            write_limit:1024
-    496121.810262882  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496121.810263721  STREAM_SLEEP_TIME              id:140000 wake:000496121.831409214
-    496121.810269822  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496121.810270232  DEV_SLEEP_TIME                 dev:8 wake:000496121.877263347
-    496121.810271515  SLEEP                          sleep:000000000.021145867 longest_wake:000158140
-    496121.831434429  WAKE                           num_fds:0
-    496121.831453119  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496121.831472022  FILL_AUDIO                     dev:8 hw_level:2208
-    496121.831475096  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496121.831475410  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496121.831476122  WRITE_STREAMS_MIXED            write_limit:0
-    496121.831478086  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496121.831484565  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496121.831484852  DEV_SLEEP_TIME                 dev:8 wake:000496121.877478858
-    496121.831486095  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496121.831591475  WAKE                           num_fds:1
-    496121.831622506  FILL_AUDIO                     dev:8 hw_level:2208
-    496121.831624705  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496121.831626162  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496121.831630221  DEV_STREAM_MIX                 written:1024 read:1024
-    496121.831630832  WRITE_STREAMS_MIXED            write_limit:1024
-    496121.831632757  FILL_AUDIO_DONE                hw_level:2208 total_written:1024 min_cb_level:1024
-    496121.831633906  STREAM_SLEEP_TIME              id:140000 wake:000496121.852742547
-    496121.831640127  SET_DEV_WAKE                   dev:8 hw_level:3232 sleep:3232
-    496121.831640498  DEV_SLEEP_TIME                 dev:8 wake:000496121.898966785
-    496121.831641684  SLEEP                          sleep:000000000.021109095 longest_wake:000158140
-    496121.852996684  WAKE                           num_fds:0
-    496121.853020685  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2176
-    496121.853051536  FILL_AUDIO                     dev:8 hw_level:2176
-    496121.853055385  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496121.853055745  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496121.853056617  WRITE_STREAMS_MIXED            write_limit:0
-    496121.853059665  FILL_AUDIO_DONE                hw_level:2176 total_written:0 min_cb_level:1024
-    496121.853066580  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496121.853067001  DEV_SLEEP_TIME                 dev:8 wake:000496121.898393980
-    496121.853068390  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496121.853258724  WAKE                           num_fds:1
-    496121.853296812  FILL_AUDIO                     dev:8 hw_level:2176
-    496121.853300455  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496121.853302259  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496121.853307968  DEV_STREAM_MIX                 written:1024 read:1024
-    496121.853308880  WRITE_STREAMS_MIXED            write_limit:1024
-    496121.853311250  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496121.853312864  STREAM_SLEEP_TIME              id:140000 wake:000496121.874075880
-    496121.853319424  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496121.853319925  DEV_SLEEP_TIME                 dev:8 wake:000496121.919978883
-    496121.853321699  SLEEP                          sleep:000000000.020763663 longest_wake:000158140
-    496121.874121581  WAKE                           num_fds:0
-    496121.874137484  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496121.874154658  FILL_AUDIO                     dev:8 hw_level:2192
-    496121.874157144  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496121.874157263  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496121.874157596  WRITE_STREAMS_MIXED            write_limit:0
-    496121.874159259  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496121.874164831  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496121.874164963  DEV_SLEEP_TIME                 dev:8 wake:000496121.919826370
-    496121.874165593  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496121.874230568  WAKE                           num_fds:1
-    496121.874249311  FILL_AUDIO                     dev:8 hw_level:2192
-    496121.874250329  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496121.874251172  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496121.874253846  DEV_STREAM_MIX                 written:1024 read:1024
-    496121.874254168  WRITE_STREAMS_MIXED            write_limit:1024
-    496121.874254879  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496121.874255437  STREAM_SLEEP_TIME              id:140000 wake:000496121.895409213
-    496121.874260087  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496121.874260219  DEV_SLEEP_TIME                 dev:8 wake:000496121.941255230
-    496121.874260704  SLEEP                          sleep:000000000.021153983 longest_wake:000158140
-    496121.895621418  WAKE                           num_fds:0
-    496121.895637180  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496121.895653809  FILL_AUDIO                     dev:8 hw_level:2208
-    496121.895655732  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496121.895655866  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496121.895656225  WRITE_STREAMS_MIXED            write_limit:0
-    496121.895657665  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496121.895662759  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496121.895662914  DEV_SLEEP_TIME                 dev:8 wake:000496121.941658210
-    496121.895663513  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496121.895745235  WAKE                           num_fds:1
-    496121.895762578  FILL_AUDIO                     dev:8 hw_level:2208
-    496121.895763511  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496121.895764286  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496121.895767203  DEV_STREAM_MIX                 written:1024 read:1024
-    496121.895767568  WRITE_STREAMS_MIXED            write_limit:1024
-    496121.895768193  FILL_AUDIO_DONE                hw_level:2208 total_written:1024 min_cb_level:1024
-    496121.895768676  STREAM_SLEEP_TIME              id:140000 wake:000496121.916742546
-    496121.895773163  SET_DEV_WAKE                   dev:8 hw_level:3232 sleep:3232
-    496121.895773318  DEV_SLEEP_TIME                 dev:8 wake:000496121.963101805
-    496121.895773786  SLEEP                          sleep:000000000.020974074 longest_wake:000158140
-    496121.916816246  WAKE                           num_fds:0
-    496121.916829844  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2176
-    496121.916847665  FILL_AUDIO                     dev:8 hw_level:2176
-    496121.916849561  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496121.916849697  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496121.916850045  WRITE_STREAMS_MIXED            write_limit:0
-    496121.916851345  FILL_AUDIO_DONE                hw_level:2176 total_written:0 min_cb_level:1024
-    496121.916856369  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496121.916856526  DEV_SLEEP_TIME                 dev:8 wake:000496121.962185175
-    496121.916857127  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496121.916936358  WAKE                           num_fds:1
-    496121.916953777  FILL_AUDIO                     dev:8 hw_level:2176
-    496121.916954713  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496121.916955421  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496121.916957165  DEV_STREAM_MIX                 written:1024 read:1024
-    496121.916957412  WRITE_STREAMS_MIXED            write_limit:1024
-    496121.916957966  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496121.916958446  STREAM_SLEEP_TIME              id:140000 wake:000496121.938075879
-    496121.916962996  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496121.916963151  DEV_SLEEP_TIME                 dev:8 wake:000496121.983624913
-    496121.916963634  SLEEP                          sleep:000000000.021117632 longest_wake:000158140
-    496121.938161250  WAKE                           num_fds:0
-    496121.938185050  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496121.938214142  FILL_AUDIO                     dev:8 hw_level:2192
-    496121.938217785  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496121.938218156  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496121.938219033  WRITE_STREAMS_MIXED            write_limit:0
-    496121.938221504  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496121.938228400  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496121.938228816  DEV_SLEEP_TIME                 dev:8 wake:000496121.983889147
-    496121.938230174  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496121.938435592  WAKE                           num_fds:1
-    496121.938472612  FILL_AUDIO                     dev:8 hw_level:2192
-    496121.938476607  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496121.938478346  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496121.938484390  DEV_STREAM_MIX                 written:1024 read:1024
-    496121.938485106  WRITE_STREAMS_MIXED            write_limit:1024
-    496121.938486865  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496121.938488118  STREAM_SLEEP_TIME              id:140000 wake:000496121.959409212
-    496121.938493766  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496121.938494132  DEV_SLEEP_TIME                 dev:8 wake:000496122.005487627
-    496121.938495390  SLEEP                          sleep:000000000.020921585 longest_wake:000158140
-    496121.959493040  WAKE                           num_fds:0
-    496121.959515848  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496121.959537678  FILL_AUDIO                     dev:8 hw_level:2208
-    496121.959541187  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496121.959541547  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496121.959542444  WRITE_STREAMS_MIXED            write_limit:0
-    496121.959544775  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496121.959551766  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496121.959552132  DEV_SLEEP_TIME                 dev:8 wake:000496122.005545807
-    496121.959553570  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496121.959722871  WAKE                           num_fds:1
-    496121.959757015  FILL_AUDIO                     dev:8 hw_level:2208
-    496121.959759616  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496121.959761390  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496121.959765625  DEV_STREAM_MIX                 written:1024 read:1024
-    496121.959766331  WRITE_STREAMS_MIXED            write_limit:1024
-    496121.959767920  FILL_AUDIO_DONE                hw_level:2208 total_written:1024 min_cb_level:1024
-    496121.959769213  STREAM_SLEEP_TIME              id:140000 wake:000496121.980742545
-    496121.959775262  SET_DEV_WAKE                   dev:8 hw_level:3232 sleep:3232
-    496121.959775628  DEV_SLEEP_TIME                 dev:8 wake:000496122.027101990
-    496121.959776906  SLEEP                          sleep:000000000.020973888 longest_wake:000158140
-    496121.980846407  WAKE                           num_fds:0
-    496121.980870472  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2176
-    496121.980900422  FILL_AUDIO                     dev:8 hw_level:2176
-    496121.980904105  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496121.980904476  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496121.980905353  WRITE_STREAMS_MIXED            write_limit:0
-    496121.980907799  FILL_AUDIO_DONE                hw_level:2176 total_written:0 min_cb_level:1024
-    496121.980914860  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496121.980915226  DEV_SLEEP_TIME                 dev:8 wake:000496122.026242354
-    496121.980916564  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496121.981102759  WAKE                           num_fds:1
-    496121.981138190  FILL_AUDIO                     dev:8 hw_level:2176
-    496121.981141027  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496121.981142591  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496121.981148414  DEV_STREAM_MIX                 written:1024 read:1024
-    496121.981149101  WRITE_STREAMS_MIXED            write_limit:1024
-    496121.981150754  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496121.981152037  STREAM_SLEEP_TIME              id:140000 wake:000496122.002075878
-    496121.981157881  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496121.981158252  DEV_SLEEP_TIME                 dev:8 wake:000496122.047818162
-    496121.981159515  SLEEP                          sleep:000000000.020924382 longest_wake:000158140
-    496122.002337641  WAKE                           num_fds:0
-    496122.002361576  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496122.002391655  FILL_AUDIO                     dev:8 hw_level:2192
-    496122.002395404  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496122.002395775  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496122.002396652  WRITE_STREAMS_MIXED            write_limit:0
-    496122.002399092  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496122.002405908  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496122.002406324  DEV_SLEEP_TIME                 dev:8 wake:000496122.048066736
-    496122.002407727  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496122.002594263  WAKE                           num_fds:1
-    496122.002630126  FILL_AUDIO                     dev:8 hw_level:2192
-    496122.002632972  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496122.002634551  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496122.002640490  DEV_STREAM_MIX                 written:1024 read:1024
-    496122.002641201  WRITE_STREAMS_MIXED            write_limit:1024
-    496122.002642775  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496122.002644058  STREAM_SLEEP_TIME              id:140000 wake:000496122.023409211
-    496122.002649826  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496122.002650252  DEV_SLEEP_TIME                 dev:8 wake:000496122.069643567
-    496122.002651565  SLEEP                          sleep:000000000.020765644 longest_wake:000158140
-    496122.023443827  WAKE                           num_fds:0
-    496122.023465787  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496122.023484866  FILL_AUDIO                     dev:8 hw_level:2208
-    496122.023488024  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496122.023488409  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496122.023489432  WRITE_STREAMS_MIXED            write_limit:0
-    496122.023491757  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496122.023499440  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496122.023499856  DEV_SLEEP_TIME                 dev:8 wake:000496122.069493326
-    496122.023501389  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496122.023673351  WAKE                           num_fds:1
-    496122.023707245  FILL_AUDIO                     dev:8 hw_level:2208
-    496122.023709846  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496122.023711369  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496122.023715639  DEV_STREAM_MIX                 written:1024 read:1024
-    496122.023716356  WRITE_STREAMS_MIXED            write_limit:1024
-    496122.023717934  FILL_AUDIO_DONE                hw_level:2208 total_written:1024 min_cb_level:1024
-    496122.023719237  STREAM_SLEEP_TIME              id:140000 wake:000496122.044742544
-    496122.023724981  SET_DEV_WAKE                   dev:8 hw_level:3232 sleep:3232
-    496122.023725401  DEV_SLEEP_TIME                 dev:8 wake:000496122.091052019
-    496122.023726710  SLEEP                          sleep:000000000.021023858 longest_wake:000158140
-    496122.044805628  WAKE                           num_fds:0
-    496122.044828160  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2176
-    496122.044852285  FILL_AUDIO                     dev:8 hw_level:2176
-    496122.044855738  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496122.044856109  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496122.044857096  WRITE_STREAMS_MIXED            write_limit:0
-    496122.044859537  FILL_AUDIO_DONE                hw_level:2176 total_written:0 min_cb_level:1024
-    496122.044866443  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496122.044866884  DEV_SLEEP_TIME                 dev:8 wake:000496122.090193902
-    496122.044868277  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496122.045010320  WAKE                           num_fds:1
-    496122.045043877  FILL_AUDIO                     dev:8 hw_level:2176
-    496122.045046408  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496122.045048012  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496122.045054056  DEV_STREAM_MIX                 written:1024 read:1024
-    496122.045054773  WRITE_STREAMS_MIXED            write_limit:1024
-    496122.045056376  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496122.045057684  STREAM_SLEEP_TIME              id:140000 wake:000496122.066075877
-    496122.045063523  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496122.045063944  DEV_SLEEP_TIME                 dev:8 wake:000496122.111723799
-    496122.045065247  SLEEP                          sleep:000000000.021018744 longest_wake:000158140
-    496122.066136582  WAKE                           num_fds:0
-    496122.066157034  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496122.066179426  FILL_AUDIO                     dev:8 hw_level:2192
-    496122.066183501  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496122.066183871  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496122.066184819  WRITE_STREAMS_MIXED            write_limit:0
-    496122.066187029  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496122.066193809  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496122.066194230  DEV_SLEEP_TIME                 dev:8 wake:000496122.111854797
-    496122.066195614  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496122.066335856  WAKE                           num_fds:1
-    496122.066358799  FILL_AUDIO                     dev:8 hw_level:2192
-    496122.066359997  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496122.066361581  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496122.066365510  DEV_STREAM_MIX                 written:1024 read:1024
-    496122.066366071  WRITE_STREAMS_MIXED            write_limit:1024
-    496122.066366697  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496122.066367615  STREAM_SLEEP_TIME              id:140000 wake:000496122.087409210
-    496122.066372967  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496122.066373363  DEV_SLEEP_TIME                 dev:8 wake:000496122.133367189
-    496122.066374330  SLEEP                          sleep:000000000.021042021 longest_wake:000158140
-    496122.087471671  WAKE                           num_fds:0
-    496122.087493561  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496122.087517421  FILL_AUDIO                     dev:8 hw_level:2208
-    496122.087520754  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496122.087521140  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496122.087521987  WRITE_STREAMS_MIXED            write_limit:0
-    496122.087524713  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496122.087531669  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496122.087532090  DEV_SLEEP_TIME                 dev:8 wake:000496122.133525760
-    496122.087533503  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496122.087705320  WAKE                           num_fds:1
-    496122.087739699  FILL_AUDIO                     dev:8 hw_level:2208
-    496122.087742245  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496122.087743899  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496122.087748465  DEV_STREAM_MIX                 written:1024 read:1024
-    496122.087749151  WRITE_STREAMS_MIXED            write_limit:1024
-    496122.087750710  FILL_AUDIO_DONE                hw_level:2208 total_written:1024 min_cb_level:1024
-    496122.087752033  STREAM_SLEEP_TIME              id:140000 wake:000496122.108742543
-    496122.087757781  SET_DEV_WAKE                   dev:8 hw_level:3232 sleep:3232
-    496122.087758202  DEV_SLEEP_TIME                 dev:8 wake:000496122.155084819
-    496122.087759490  SLEEP                          sleep:000000000.020991057 longest_wake:000158140
-    496122.108799368  WAKE                           num_fds:0
-    496122.108822551  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2224
-    496122.108869730  FILL_AUDIO                     dev:8 hw_level:2176
-    496122.108877628  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496122.108877999  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496122.108881858  WRITE_STREAMS_MIXED            write_limit:0
-    496122.108886479  FILL_AUDIO_DONE                hw_level:2176 total_written:0 min_cb_level:1024
-    496122.108895164  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496122.108895585  DEV_SLEEP_TIME                 dev:8 wake:000496122.154221646
-    496122.108897805  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496122.109059453  WAKE                           num_fds:1
-    496122.109096789  FILL_AUDIO                     dev:8 hw_level:2176
-    496122.109100518  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496122.109105585  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496122.109113262  DEV_STREAM_MIX                 written:1024 read:1024
-    496122.109114079  WRITE_STREAMS_MIXED            write_limit:1024
-    496122.109118204  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496122.109119286  STREAM_SLEEP_TIME              id:140000 wake:000496122.130075876
-    496122.109126252  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496122.109126653  DEV_SLEEP_TIME                 dev:8 wake:000496122.175785456
-    496122.109127856  SLEEP                          sleep:000000000.020957086 longest_wake:000158140
-    496122.130119813  WAKE                           num_fds:0
-    496122.130140075  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496122.130163088  FILL_AUDIO                     dev:8 hw_level:2192
-    496122.130166421  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496122.130166792  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496122.130167639  WRITE_STREAMS_MIXED            write_limit:0
-    496122.130170480  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496122.130177431  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496122.130177852  DEV_SLEEP_TIME                 dev:8 wake:000496122.175838254
-    496122.130179326  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496122.130282258  WAKE                           num_fds:1
-    496122.130303026  FILL_AUDIO                     dev:8 hw_level:2192
-    496122.130304109  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496122.130305512  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496122.130311125  DEV_STREAM_MIX                 written:1024 read:1024
-    496122.130311711  WRITE_STREAMS_MIXED            write_limit:1024
-    496122.130312353  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496122.130313300  STREAM_SLEEP_TIME              id:140000 wake:000496122.151409209
-    496122.130318647  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496122.130319053  DEV_SLEEP_TIME                 dev:8 wake:000496122.197312804
-    496122.130320116  SLEEP                          sleep:000000000.021096405 longest_wake:000158140
-    496122.151491150  WAKE                           num_fds:0
-    496122.151513712  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496122.151539091  FILL_AUDIO                     dev:8 hw_level:2208
-    496122.151542780  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496122.151543150  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496122.151544022  WRITE_STREAMS_MIXED            write_limit:0
-    496122.151546684  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496122.151553564  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496122.151553985  DEV_SLEEP_TIME                 dev:8 wake:000496122.197547651
-    496122.151555409  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496122.151727611  WAKE                           num_fds:1
-    496122.151761519  FILL_AUDIO                     dev:8 hw_level:2208
-    496122.151764040  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496122.151765614  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496122.151770169  DEV_STREAM_MIX                 written:1024 read:1024
-    496122.151770876  WRITE_STREAMS_MIXED            write_limit:1024
-    496122.151772395  FILL_AUDIO_DONE                hw_level:2208 total_written:1024 min_cb_level:1024
-    496122.151773642  STREAM_SLEEP_TIME              id:140000 wake:000496122.172742542
-    496122.151779361  SET_DEV_WAKE                   dev:8 hw_level:3232 sleep:3232
-    496122.151779782  DEV_SLEEP_TIME                 dev:8 wake:000496122.219106479
-    496122.151781085  SLEEP                          sleep:000000000.020969396 longest_wake:000158140
-    496122.172792031  WAKE                           num_fds:0
-    496122.172815340  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2224
-    496122.172845539  FILL_AUDIO                     dev:8 hw_level:2176
-    496122.172849508  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496122.172849889  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496122.172850761  WRITE_STREAMS_MIXED            write_limit:0
-    496122.172853217  FILL_AUDIO_DONE                hw_level:2176 total_written:0 min_cb_level:1024
-    496122.172860223  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496122.172860644  DEV_SLEEP_TIME                 dev:8 wake:000496122.218187577
-    496122.172862143  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496122.173005714  WAKE                           num_fds:1
-    496122.173028998  FILL_AUDIO                     dev:8 hw_level:2176
-    496122.173029985  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496122.173031554  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496122.173037182  DEV_STREAM_MIX                 written:1024 read:1024
-    496122.173037808  WRITE_STREAMS_MIXED            write_limit:1024
-    496122.173038429  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496122.173039507  STREAM_SLEEP_TIME              id:140000 wake:000496122.194075875
-    496122.173045130  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496122.173045476  DEV_SLEEP_TIME                 dev:8 wake:000496122.239705692
-    496122.173046378  SLEEP                          sleep:000000000.021036849 longest_wake:000158140
-    496122.194116034  WAKE                           num_fds:0
-    496122.194140887  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496122.194162928  FILL_AUDIO                     dev:8 hw_level:2192
-    496122.194167077  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496122.194167443  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496122.194168390  WRITE_STREAMS_MIXED            write_limit:0
-    496122.194171227  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496122.194178529  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496122.194178980  DEV_SLEEP_TIME                 dev:8 wake:000496122.239839035
-    496122.194181155  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496122.194266111  WAKE                           num_fds:1
-    496122.194291179  FILL_AUDIO                     dev:8 hw_level:2192
-    496122.194292136  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496122.194294035  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496122.194300290  DEV_STREAM_MIX                 written:1024 read:1024
-    496122.194300896  WRITE_STREAMS_MIXED            write_limit:1024
-    496122.194301873  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496122.194302780  STREAM_SLEEP_TIME              id:140000 wake:000496122.215409208
-    496122.194309255  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496122.194310062  DEV_SLEEP_TIME                 dev:8 wake:000496122.261302294
-    496122.194311440  SLEEP                          sleep:000000000.021106914 longest_wake:000158140
-    496122.215448777  WAKE                           num_fds:0
-    496122.215463923  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496122.215476895  FILL_AUDIO                     dev:8 hw_level:2208
-    496122.215478751  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496122.215478927  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496122.215479448  WRITE_STREAMS_MIXED            write_limit:0
-    496122.215480831  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496122.215486357  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496122.215486562  DEV_SLEEP_TIME                 dev:8 wake:000496122.261481539
-    496122.215487384  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496122.215549002  WAKE                           num_fds:1
-    496122.215563098  FILL_AUDIO                     dev:8 hw_level:2208
-    496122.215563611  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496122.215565341  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496122.215567658  DEV_STREAM_MIX                 written:1024 read:1024
-    496122.215567938  WRITE_STREAMS_MIXED            write_limit:1024
-    496122.215568239  FILL_AUDIO_DONE                hw_level:2208 total_written:1024 min_cb_level:1024
-    496122.215568747  STREAM_SLEEP_TIME              id:140000 wake:000496122.236742541
-    496122.215573511  SET_DEV_WAKE                   dev:8 hw_level:3232 sleep:3232
-    496122.215573716  DEV_SLEEP_TIME                 dev:8 wake:000496122.282901820
-    496122.215574324  SLEEP                          sleep:000000000.021174054 longest_wake:000158140
-    496122.236813718  WAKE                           num_fds:0
-    496122.236830443  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2176
-    496122.236848304  FILL_AUDIO                     dev:8 hw_level:2176
-    496122.236850592  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496122.236850766  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496122.236851211  WRITE_STREAMS_MIXED            write_limit:0
-    496122.236853866  FILL_AUDIO_DONE                hw_level:2176 total_written:0 min_cb_level:1024
-    496122.236859339  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496122.236859539  DEV_SLEEP_TIME                 dev:8 wake:000496122.282187883
-    496122.236860303  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496122.236957758  WAKE                           num_fds:1
-    496122.236979930  FILL_AUDIO                     dev:8 hw_level:2176
-    496122.236981687  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496122.236982827  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496122.236987199  DEV_STREAM_MIX                 written:1024 read:1024
-    496122.236987605  WRITE_STREAMS_MIXED            write_limit:1024
-    496122.236988630  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496122.236989373  STREAM_SLEEP_TIME              id:140000 wake:000496122.258075874
-    496122.236994623  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496122.236994884  DEV_SLEEP_TIME                 dev:8 wake:000496122.303655730
-    496122.236995656  SLEEP                          sleep:000000000.021086810 longest_wake:000158140
-    496122.258105114  WAKE                           num_fds:0
-    496122.258126969  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496122.258149697  FILL_AUDIO                     dev:8 hw_level:2192
-    496122.258153501  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496122.258153867  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496122.258154713  WRITE_STREAMS_MIXED            write_limit:0
-    496122.258157274  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496122.258164351  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496122.258164817  DEV_SLEEP_TIME                 dev:8 wake:000496122.303825028
-    496122.258166230  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496122.258305507  WAKE                           num_fds:1
-    496122.258341639  FILL_AUDIO                     dev:8 hw_level:2192
-    496122.258343749  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496122.258345653  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496122.258351321  DEV_STREAM_MIX                 written:1024 read:1024
-    496122.258352123  WRITE_STREAMS_MIXED            write_limit:1024
-    496122.258353306  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496122.258354649  STREAM_SLEEP_TIME              id:140000 wake:000496122.279409207
-    496122.258361405  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496122.258361921  DEV_SLEEP_TIME                 dev:8 wake:000496122.325354028
-    496122.258363414  SLEEP                          sleep:000000000.021055179 longest_wake:000158140
-    496122.279475995  WAKE                           num_fds:0
-    496122.279498647  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496122.279522287  FILL_AUDIO                     dev:8 hw_level:2208
-    496122.279525795  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496122.279526166  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496122.279527153  WRITE_STREAMS_MIXED            write_limit:0
-    496122.279529684  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496122.279536585  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496122.279537021  DEV_SLEEP_TIME                 dev:8 wake:000496122.325530666
-    496122.279538424  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496122.279679094  WAKE                           num_fds:1
-    496122.279712721  FILL_AUDIO                     dev:8 hw_level:2208
-    496122.279715312  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496122.279717558  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496122.279723471  DEV_STREAM_MIX                 written:1024 read:1024
-    496122.279724183  WRITE_STREAMS_MIXED            write_limit:1024
-    496122.279725726  FILL_AUDIO_DONE                hw_level:2208 total_written:1024 min_cb_level:1024
-    496122.279727069  STREAM_SLEEP_TIME              id:140000 wake:000496122.300742540
-    496122.279732808  SET_DEV_WAKE                   dev:8 hw_level:3232 sleep:3232
-    496122.279733229  DEV_SLEEP_TIME                 dev:8 wake:000496122.347059836
-    496122.279734562  SLEEP                          sleep:000000000.021016037 longest_wake:000158140
-    496122.300998522  WAKE                           num_fds:0
-    496122.301022512  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2176
-    496122.301051805  FILL_AUDIO                     dev:8 hw_level:2176
-    496122.301055604  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496122.301055969  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496122.301056836  WRITE_STREAMS_MIXED            write_limit:0
-    496122.301059287  FILL_AUDIO_DONE                hw_level:2176 total_written:0 min_cb_level:1024
-    496122.301066183  SET_DEV_WAKE                   dev:8 hw_level:2176 sleep:2176
-    496122.301066619  DEV_SLEEP_TIME                 dev:8 wake:000496122.346393648
-    496122.301068007  SLEEP                          sleep:000000000.045333333 longest_wake:000158140
-    496122.301254372  WAKE                           num_fds:1
-    496122.301290025  FILL_AUDIO                     dev:8 hw_level:2176
-    496122.301292946  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496122.301294495  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496122.301300178  DEV_STREAM_MIX                 written:1024 read:1024
-    496122.301300885  WRITE_STREAMS_MIXED            write_limit:1024
-    496122.301302534  FILL_AUDIO_DONE                hw_level:2176 total_written:1024 min_cb_level:1024
-    496122.301303781  STREAM_SLEEP_TIME              id:140000 wake:000496122.322075873
-    496122.301309565  SET_DEV_WAKE                   dev:8 hw_level:3200 sleep:3200
-    496122.301309981  DEV_SLEEP_TIME                 dev:8 wake:000496122.367969956
-    496122.301311284  SLEEP                          sleep:000000000.020772583 longest_wake:000158140
-    496122.322353591  WAKE                           num_fds:0
-    496122.322376259  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2192
-    496122.322417509  FILL_AUDIO                     dev:8 hw_level:2192
-    496122.322421443  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496122.322421804  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496122.322422681  WRITE_STREAMS_MIXED            write_limit:0
-    496122.322424981  FILL_AUDIO_DONE                hw_level:2192 total_written:0 min_cb_level:1024
-    496122.322431852  SET_DEV_WAKE                   dev:8 hw_level:2192 sleep:2192
-    496122.322432273  DEV_SLEEP_TIME                 dev:8 wake:000496122.368092619
-    496122.322433771  SLEEP                          sleep:000000000.045666666 longest_wake:000158140
-    496122.322600105  WAKE                           num_fds:1
-    496122.322628852  FILL_AUDIO                     dev:8 hw_level:2192
-    496122.322631252  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496122.322633001  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496122.322638734  DEV_STREAM_MIX                 written:1024 read:1024
-    496122.322639617  WRITE_STREAMS_MIXED            write_limit:1024
-    496122.322641145  FILL_AUDIO_DONE                hw_level:2192 total_written:1024 min_cb_level:1024
-    496122.322642659  STREAM_SLEEP_TIME              id:140000 wake:000496122.343409206
-    496122.322648953  SET_DEV_WAKE                   dev:8 hw_level:3216 sleep:3216
-    496122.322649474  DEV_SLEEP_TIME                 dev:8 wake:000496122.389642037
-    496122.322651183  SLEEP                          sleep:000000000.020767169 longest_wake:000158140
-    496122.343460464  WAKE                           num_fds:0
-    496122.343483111  WRITE_STREAMS_FETCH_STREAM     id:140000 cbth:1024 delay:2208
-    496122.343504801  FILL_AUDIO                     dev:8 hw_level:2208
-    496122.343508630  WRITE_STREAMS_STREAM           id:140000 shm_frames:0 cb_pending:1
-    496122.343508996  WRITE_STREAMS_MIX              write_limit:0 max_offset:0
-    496122.343510093  WRITE_STREAMS_MIXED            write_limit:0
-    496122.343512629  FILL_AUDIO_DONE                hw_level:2208 total_written:0 min_cb_level:1024
-    496122.343519871  SET_DEV_WAKE                   dev:8 hw_level:2208 sleep:2208
-    496122.343520302  DEV_SLEEP_TIME                 dev:8 wake:000496122.389513687
-    496122.343521810  SLEEP                          sleep:000000000.046000000 longest_wake:000158140
-    496122.343659067  WAKE                           num_fds:1
-    496122.343692660  FILL_AUDIO                     dev:8 hw_level:2208
-    496122.343695401  WRITE_STREAMS_STREAM           id:140000 shm_frames:1024 cb_pending:0
-    496122.343697170  WRITE_STREAMS_MIX              write_limit:1024 max_offset:0
-    496122.343701300  DEV_STREAM_MIX                 written:1024 read:1024
-    496122.343702001  WRITE_STREAMS_MIXED            write_limit:1024
-    496122.343703570  FILL_AUDIO_DONE                hw_level:2208 total_written:1024 min_cb_level:1024
-    496122.343704858  STREAM_SLEEP_TIME              id:140000 wake:000496122.364742539
-    496122.343710616  SET_DEV_WAKE                   dev:8 hw_level:3232 sleep:3232
-    496122.343711027  DEV_SLEEP_TIME                 dev:8 wake:000496122.411037640
-    496122.343712340  SLEEP                          sleep:000000000.021038232 longest_wake:000158140
-    496122.359904900  WAKE                           num_fds:1
-    496122.359908867  PB_MSG                         msg_id:6
-    496122.359909941  STREAM_REMOVED                 id:140000
-    496122.359939533  ODEV_NO_STREAMS                dev:8 hw_level:2416 write:0
-    496122.359944076  SET_DEV_WAKE                   dev:8 hw_level:2416 sleep:1392
-    496122.359944442  DEV_SLEEP_TIME                 dev:8 wake:000496122.388940010
-    496122.359945062  SLEEP                          sleep:000000000.029000000 longest_wake:000158140
-    496122.388959912  WAKE                           num_fds:0
-    496122.388982707  ODEV_NO_STREAMS                dev:8 hw_level:1024 write:1024
-    496122.388988021  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496122.388988288  DEV_SLEEP_TIME                 dev:8 wake:000496122.410316487
-    496122.388988949  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496122.410345296  WAKE                           num_fds:0
-    496122.410370857  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496122.410376456  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496122.410376727  DEV_SLEEP_TIME                 dev:8 wake:000496122.431704661
-    496122.410377434  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496122.431764840  WAKE                           num_fds:0
-    496122.431833959  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496122.431843690  SET_DEV_WAKE                   dev:8 hw_level:2000 sleep:976
-    496122.431844254  DEV_SLEEP_TIME                 dev:8 wake:000496122.452168375
-    496122.431845811  SLEEP                          sleep:000000000.020333333 longest_wake:000158140
-    496122.452219198  WAKE                           num_fds:0
-    496122.452281422  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496122.452292006  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496122.452292589  DEV_SLEEP_TIME                 dev:8 wake:000496122.473616205
-    496122.452294378  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496122.473669621  WAKE                           num_fds:0
-    496122.473700008  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496122.473706996  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496122.473707244  DEV_SLEEP_TIME                 dev:8 wake:000496122.495033989
-    496122.473708271  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496122.495074480  WAKE                           num_fds:0
-    496122.495131374  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496122.495146355  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496122.495147373  DEV_SLEEP_TIME                 dev:8 wake:000496122.516468874
-    496122.495150668  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496122.516543702  WAKE                           num_fds:0
-    496122.516620145  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496122.516634195  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496122.516634731  DEV_SLEEP_TIME                 dev:8 wake:000496122.537955861
-    496122.516638331  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496122.537993577  WAKE                           num_fds:0
-    496122.538015496  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496122.538021060  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496122.538021339  DEV_SLEEP_TIME                 dev:8 wake:000496122.559349272
-    496122.538022084  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496122.559371175  WAKE                           num_fds:0
-    496122.559406369  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496122.559412084  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496122.559412308  DEV_SLEEP_TIME                 dev:8 wake:000496122.580740216
-    496122.559413309  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496122.580803483  WAKE                           num_fds:0
-    496122.580876491  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496122.580892291  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496122.580892889  DEV_SLEEP_TIME                 dev:8 wake:000496122.602212271
-    496122.580896126  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496122.602249850  WAKE                           num_fds:0
-    496122.602273699  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496122.602279632  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496122.602279889  DEV_SLEEP_TIME                 dev:8 wake:000496122.623607597
-    496122.602281013  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496122.623630275  WAKE                           num_fds:0
-    496122.623652277  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496122.623657745  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496122.623657981  DEV_SLEEP_TIME                 dev:8 wake:000496122.644985979
-    496122.623658807  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496122.645029671  WAKE                           num_fds:0
-    496122.645048901  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496122.645052376  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496122.645052602  DEV_SLEEP_TIME                 dev:8 wake:000496122.666382558
-    496122.645053154  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496122.666591508  WAKE                           num_fds:0
-    496122.666610205  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496122.666613617  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496122.666613845  DEV_SLEEP_TIME                 dev:8 wake:000496122.687943859
-    496122.666614421  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496122.688006670  WAKE                           num_fds:0
-    496122.688026198  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496122.688029632  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496122.688029858  DEV_SLEEP_TIME                 dev:8 wake:000496122.709359852
-    496122.688030443  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496122.709414448  WAKE                           num_fds:0
-    496122.709440781  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496122.709446781  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496122.709447196  DEV_SLEEP_TIME                 dev:8 wake:000496122.730774701
-    496122.709448436  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496122.730857004  WAKE                           num_fds:0
-    496122.730888497  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496122.730895228  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496122.730895769  DEV_SLEEP_TIME                 dev:8 wake:000496122.752222632
-    496122.730897217  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496122.752337493  WAKE                           num_fds:0
-    496122.752370820  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496122.752377486  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496122.752378032  DEV_SLEEP_TIME                 dev:8 wake:000496122.773704945
-    496122.752379530  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496122.773777745  WAKE                           num_fds:0
-    496122.773809844  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496122.773816680  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496122.773817282  DEV_SLEEP_TIME                 dev:8 wake:000496122.795143924
-    496122.773818700  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496122.795180466  WAKE                           num_fds:0
-    496122.795213337  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496122.795220052  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496122.795220588  DEV_SLEEP_TIME                 dev:8 wake:000496122.816547467
-    496122.795222002  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496122.816655372  WAKE                           num_fds:0
-    496122.816688037  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496122.816694728  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496122.816695264  DEV_SLEEP_TIME                 dev:8 wake:000496122.838022122
-    496122.816696782  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496122.838272918  WAKE                           num_fds:0
-    496122.838308290  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496122.838314910  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496122.838315456  DEV_SLEEP_TIME                 dev:8 wake:000496122.859642410
-    496122.838316890  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496122.859692416  WAKE                           num_fds:0
-    496122.859724926  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496122.859731943  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496122.859732479  DEV_SLEEP_TIME                 dev:8 wake:000496122.881059061
-    496122.859733932  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496122.881167273  WAKE                           num_fds:0
-    496122.881200094  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496122.881206664  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496122.881207215  DEV_SLEEP_TIME                 dev:8 wake:000496122.902534184
-    496122.881208654  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496122.902785139  WAKE                           num_fds:0
-    496122.902814893  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496122.902821764  SET_DEV_WAKE                   dev:8 hw_level:2000 sleep:976
-    496122.902822315  DEV_SLEEP_TIME                 dev:8 wake:000496122.923148978
-    496122.902823743  SLEEP                          sleep:000000000.020333333 longest_wake:000158140
-    496122.923196282  WAKE                           num_fds:0
-    496122.923229584  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496122.923236269  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496122.923236810  DEV_SLEEP_TIME                 dev:8 wake:000496122.944563663
-    496122.923238234  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496122.944615625  WAKE                           num_fds:0
-    496122.944650330  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496122.944657045  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496122.944657587  DEV_SLEEP_TIME                 dev:8 wake:000496122.965984470
-    496122.944659050  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496122.966082719  WAKE                           num_fds:0
-    496122.966116547  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496122.966123342  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496122.966123884  DEV_SLEEP_TIME                 dev:8 wake:000496122.987450657
-    496122.966125332  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496122.987704348  WAKE                           num_fds:0
-    496122.987737645  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496122.987744150  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496122.987744631  DEV_SLEEP_TIME                 dev:8 wake:000496123.009071715
-    496122.987746020  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496123.009107139  WAKE                           num_fds:0
-    496123.009145457  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496123.009153220  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496123.009153892  DEV_SLEEP_TIME                 dev:8 wake:000496123.030479863
-    496123.009155841  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496123.030584265  WAKE                           num_fds:0
-    496123.030618043  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496123.030624739  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496123.030625275  DEV_SLEEP_TIME                 dev:8 wake:000496123.051952138
-    496123.030626703  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496123.052094028  WAKE                           num_fds:0
-    496123.052127385  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496123.052134070  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496123.052134606  DEV_SLEEP_TIME                 dev:8 wake:000496123.073461509
-    496123.052136040  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496123.073511516  WAKE                           num_fds:0
-    496123.073544643  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496123.073551248  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496123.073551789  DEV_SLEEP_TIME                 dev:8 wake:000496123.094878732
-    496123.073553217  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496123.094926450  WAKE                           num_fds:0
-    496123.094961846  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496123.094968617  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496123.094969168  DEV_SLEEP_TIME                 dev:8 wake:000496123.116295946
-    496123.094970737  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496123.116406874  WAKE                           num_fds:0
-    496123.116439890  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496123.116446710  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496123.116447252  DEV_SLEEP_TIME                 dev:8 wake:000496123.137774020
-    496123.116448730  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496123.137883404  WAKE                           num_fds:0
-    496123.137916390  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496123.137923126  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496123.137923672  DEV_SLEEP_TIME                 dev:8 wake:000496123.159250490
-    496123.137925111  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496123.159287924  WAKE                           num_fds:0
-    496123.159335483  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496123.159343406  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496123.159344138  DEV_SLEEP_TIME                 dev:8 wake:000496123.180669833
-    496123.159346042  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496123.180704931  WAKE                           num_fds:0
-    496123.180736895  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496123.180743866  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496123.180744402  DEV_SLEEP_TIME                 dev:8 wake:000496123.202071140
-    496123.180745821  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496123.202319259  WAKE                           num_fds:0
-    496123.202364484  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496123.202371294  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496123.202371830  DEV_SLEEP_TIME                 dev:8 wake:000496123.223698598
-    496123.202373279  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496123.223730915  WAKE                           num_fds:0
-    496123.223763370  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496123.223770086  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496123.223770622  DEV_SLEEP_TIME                 dev:8 wake:000496123.245097470
-    496123.223772065  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496123.245148129  WAKE                           num_fds:0
-    496123.245184318  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496123.245190958  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496123.245191494  DEV_SLEEP_TIME                 dev:8 wake:000496123.266518437
-    496123.245192887  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496123.266776098  WAKE                           num_fds:0
-    496123.266809636  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496123.266817093  SET_DEV_WAKE                   dev:8 hw_level:2000 sleep:976
-    496123.266817634  DEV_SLEEP_TIME                 dev:8 wake:000496123.287143786
-    496123.266819078  SLEEP                          sleep:000000000.020333333 longest_wake:000158140
-    496123.287397671  WAKE                           num_fds:0
-    496123.287432130  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496123.287438836  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496123.287439367  DEV_SLEEP_TIME                 dev:8 wake:000496123.308766250
-    496123.287440785  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496123.308870132  WAKE                           num_fds:0
-    496123.308903564  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496123.308910340  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496123.308910881  DEV_SLEEP_TIME                 dev:8 wake:000496123.330237814
-    496123.308912360  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496123.330308465  WAKE                           num_fds:0
-    496123.330350260  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496123.330356966  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496123.330357512  DEV_SLEEP_TIME                 dev:8 wake:000496123.351684385
-    496123.330358955  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496123.351937251  WAKE                           num_fds:0
-    496123.351970653  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496123.351977293  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496123.351977825  DEV_SLEEP_TIME                 dev:8 wake:000496123.373304743
-    496123.351979268  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496123.373411526  WAKE                           num_fds:0
-    496123.373445334  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496123.373452009  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496123.373452550  DEV_SLEEP_TIME                 dev:8 wake:000496123.394779408
-    496123.373453984  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496123.395033698  WAKE                           num_fds:0
-    496123.395067641  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496123.395074336  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496123.395074883  DEV_SLEEP_TIME                 dev:8 wake:000496123.416401736
-    496123.395076306  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496123.416466100  WAKE                           num_fds:0
-    496123.416499903  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496123.416506809  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496123.416507341  DEV_SLEEP_TIME                 dev:8 wake:000496123.437833978
-    496123.416508784  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496123.437920547  WAKE                           num_fds:0
-    496123.437948816  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496123.437954655  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496123.437955070  DEV_SLEEP_TIME                 dev:8 wake:000496123.459282732
-    496123.437956175  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496123.459515811  WAKE                           num_fds:0
-    496123.459544842  ODEV_NO_STREAMS                dev:8 hw_level:1040 write:1008
-    496123.459550812  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496123.459551220  DEV_SLEEP_TIME                 dev:8 wake:000496123.480878732
-    496123.459552302  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496123.481115112  WAKE                           num_fds:0
-    496123.481142011  ODEV_NO_STREAMS                dev:8 hw_level:992 write:1056
-    496123.481147923  SET_DEV_WAKE                   dev:8 hw_level:2048 sleep:1024
-    496123.481148342  DEV_SLEEP_TIME                 dev:8 wake:000496123.502475931
-    496123.481149428  SLEEP                          sleep:000000000.021333333 longest_wake:000158140
-    496123.488698368  WAKE                           num_fds:1
-    496123.488701940  PB_MSG                         msg_id:5
diff --git a/scripts/audio_thread_log_viewer/viewer_c3.py b/scripts/audio_thread_log_viewer/viewer_c3.py
deleted file mode 100755
index f8d4f57..0000000
--- a/scripts/audio_thread_log_viewer/viewer_c3.py
+++ /dev/null
@@ -1,604 +0,0 @@
-#!/usr/bin/python
-#
-# Copyright 2016 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-#
-
-"""Generates an HTML file with plot of buffer level in the audio thread log."""
-
-import argparse
-import collections
-import logging
-import string
-import time
-
-page_content = string.Template("""
-<html meta charset="UTF8">
-<head>
-  <!-- Load c3.css -->
-  <link href="https://rawgit.com/masayuki0812/c3/master/c3.css" rel="stylesheet" type="text/css">
-  <!-- Load d3.js and c3.js -->
-  <script src="https://d3js.org/d3.v4.min.js" charset="utf-8"></script>
-  <script src="https://rawgit.com/masayuki0812/c3/master/c3.js" charset="utf-8"></script>
-  <style type="text/css">
-    .c3-grid text {
-        fill: grey;
-    }
-    .event_log_box {
-      font-family: 'Courier New', Courier, 'Lucida Sans Typewriter', 'Lucida Typewriter', monospace;
-      font-size: 20px;
-      font-style: normal;
-      font-variant: normal;
-      font-weight: 300;
-      line-height: 26.4px;
-      white-space: pre;
-      height:50%;
-      width:48%;
-      border:1px solid #ccc;
-      overflow:auto;
-    }
-    .checkbox {
-      font-size: 30px;
-      border: 2px;
-    }
-    .device {
-      font-size: 15px;
-    }
-    .stream{
-      font-size: 15px;
-    }
-    .fetch{
-    }
-    .wake{
-    }
-  </style>
-  <script type="text/javascript">
-    var selected = null;
-    draw_chart = function() {
-      var chart = c3.generate({
-        data: {
-          x: 'time',
-          columns: [
-            ['time',                   $times],
-            ['buffer_level',           $buffer_levels],
-          ],
-          type: 'bar',
-          types: {
-            buffer_level: 'line',
-          },
-          onclick: function (d, i) {
-            elm = document.getElementById(d.x.toFixed(9));
-            if (selected)
-              selected.style.color = '';
-            if (elm === null) {
-              console.error("Can not find element by ID %s", d.x.toFixed(9));
-              return;
-            }
-            elm.style.color = 'blue';
-            elm.scrollIntoView();
-            selected = elm;
-          },
-        },
-        zoom: {
-          enabled: true,
-        },
-
-        grid: {
-          x: {
-            lines: [
-              $grids,
-            ],
-          },
-        },
-
-        axis: {
-          y: {min: 0, max: $max_y},
-        },
-      });
-    };
-
-    logs = `$logs`;
-    put_logs = function () {
-      document.getElementById('logs').innerHTML = logs;
-    };
-
-    set_initial_checkbox_value = function () {
-      document.getElementById('device').checked = true;
-      document.getElementById('stream').checked = true;
-      document.getElementById('fetch').checked = true;
-      document.getElementById('wake').checked = true;
-    }
-
-    window.onload = function() {
-      draw_chart();
-      put_logs();
-      set_initial_checkbox_value();
-    };
-
-    function handleClick(checkbox) {
-      var class_name = checkbox.id;
-      var elements = document.getElementsByClassName(class_name);
-      var i;
-
-      if (checkbox.checked) {
-        display_value = "block";
-      } else {
-        display_value = "none"
-      }
-
-      console.log("change " + class_name + " to " + display_value);
-      for (i = 0; i < elements.length; i++) {
-        elements[i].style.display = display_value;
-      }
-    }
-
-  </script>
-</head>
-
-<body>
-  <div id="chart" style="height:50%; width:100%" ></div>
-  <div style="margin:0 auto"; class="checkbox">
-      <label><input type="checkbox" onclick="handleClick(this);" id="device">Show device removed/added event</label>
-      <label><input type="checkbox" onclick="handleClick(this);" id="stream">Show stream removed/added event</label>
-      <label><input type="checkbox" onclick="handleClick(this);" id="fetch">Show fetch event</label>
-      <label><input type="checkbox" onclick="handleClick(this);" id="wake">Show wake by num_fds=1 event</label>
-  </div>
-  <div class="event_log_box", id="logs", style="float:left;"></div>
-  <textarea class="event_log_box", id="text", style="float:right;"></textarea>
-</body>
-</html>
-""")
-
-
-def StrToTimestamp(s):
-    """Converts a time string to a timestamp.
-
-    @param s: A time string like "2019-07-02T15:30:46.684190644".
-
-    @returns: Returns a timestamp string like "55846.684190644".
-
-    """
-    fmt = "%Y-%m-%dT%H:%M:%S"
-    t = time.strptime(s[:-10], fmt)
-    # Ignore date to avoid a long timestamp.
-    ts = t.tm_hour * 3600 + t.tm_min * 60 + t.tm_sec
-    return "{:d}.{}".format(ts, s[-9:])
-
-
-Tag = collections.namedtuple('Tag', ['time', 'text', 'position', 'class_name'])
-"""
-The tuple for tags shown on the plot on certain time.
-text is the tag to show, position is the tag position, which is one of
-'start', 'middle', 'end', class_name is one of 'device', 'stream', 'fetch',
-and 'wake' which will be their CSS class name.
-"""
-
-class EventData(object):
-    """The base class of an event."""
-    def __init__(self, time, name):
-        """Initializes an EventData.
-
-        @param time: A string for event time.
-        @param name: A string for event name.
-
-        """
-        self.time = time
-        self.name = name
-        self._text = None
-        self._position = None
-        self._class_name = None
-
-    def GetTag(self):
-        """Gets the tag for this event.
-
-        @returns: A Tag object. Returns None if no need to show tag.
-
-        """
-        if self._text:
-            return Tag(
-                    time=self.time, text=self._text, position=self._position,
-                    class_name=self._class_name)
-        return None
-
-
-class DeviceEvent(EventData):
-    """Class for device event."""
-    def __init__(self, time, name, device):
-        """Initializes a DeviceEvent.
-
-        @param time: A string for event time.
-        @param name: A string for event name.
-        @param device: A string for device index.
-
-        """
-        super(DeviceEvent, self).__init__(time, name)
-        self.device = device
-        self._position = 'start'
-        self._class_name = 'device'
-
-
-class DeviceRemovedEvent(DeviceEvent):
-    """Class for device removed event."""
-    def __init__(self, time, name, device):
-        """Initializes a DeviceRemovedEvent.
-
-        @param time: A string for event time.
-        @param name: A string for event name.
-        @param device: A string for device index.
-
-        """
-        super(DeviceRemovedEvent, self).__init__(time, name, device)
-        self._text = 'Removed Device %s' % self.device
-
-
-class DeviceAddedEvent(DeviceEvent):
-    """Class for device added event."""
-    def __init__(self, time, name, device):
-        """Initializes a DeviceAddedEvent.
-
-        @param time: A string for event time.
-        @param name: A string for event name.
-        @param device: A string for device index.
-
-        """
-        super(DeviceAddedEvent, self).__init__(time, name, device)
-        self._text = 'Added Device %s' % self.device
-
-
-class LevelEvent(DeviceEvent):
-    """Class for device event with buffer level."""
-    def __init__(self, time, name, device, level):
-        """Initializes a LevelEvent.
-
-        @param time: A string for event time.
-        @param name: A string for event name.
-        @param device: A string for device index.
-        @param level: An int for buffer level.
-
-        """
-        super(LevelEvent, self).__init__(time, name, device)
-        self.level = level
-
-
-class StreamEvent(EventData):
-    """Class for event with stream."""
-    def __init__(self, time, name, stream):
-        """Initializes a StreamEvent.
-
-        @param time: A string for event time.
-        @param name: A string for event name.
-        @param stream: A string for stream id.
-
-        """
-        super(StreamEvent, self).__init__(time, name)
-        self.stream = stream
-        self._class_name = 'stream'
-
-
-class FetchStreamEvent(StreamEvent):
-    """Class for stream fetch event."""
-    def __init__(self, time, name, stream):
-        """Initializes a FetchStreamEvent.
-
-        @param time: A string for event time.
-        @param name: A string for event name.
-        @param stream: A string for stream id.
-
-        """
-        super(FetchStreamEvent, self).__init__(time, name, stream)
-        self._text = 'Fetch %s' % self.stream
-        self._position = 'end'
-        self._class_name = 'fetch'
-
-
-class StreamAddedEvent(StreamEvent):
-    """Class for stream added event."""
-    def __init__(self, time, name, stream):
-        """Initializes a StreamAddedEvent.
-
-        @param time: A string for event time.
-        @param name: A string for event name.
-        @param stream: A string for stream id.
-
-        """
-        super(StreamAddedEvent, self).__init__(time, name, stream)
-        self._text = 'Add stream %s' % self.stream
-        self._position = 'middle'
-
-
-class StreamRemovedEvent(StreamEvent):
-    """Class for stream removed event."""
-    def __init__(self, time, name, stream):
-        """Initializes a StreamRemovedEvent.
-
-        @param time: A string for event time.
-        @param name: A string for event name.
-        @param stream: A string for stream id.
-
-        """
-        super(StreamRemovedEvent, self).__init__(time, name, stream)
-        self._text = 'Remove stream %s' % self.stream
-        self._position = 'middle'
-
-
-class WakeEvent(EventData):
-    """Class for wake event."""
-    def __init__(self, time, name, num_fds):
-        """Initializes a WakeEvent.
-
-        @param time: A string for event time.
-        @param name: A string for event name.
-        @param num_fds: A string for number of fd that wakes audio thread up.
-
-        """
-        super(WakeEvent, self).__init__(time, name)
-        self._position = 'middle'
-        self._class_name = 'wake'
-        if num_fds != '0':
-            self._text = 'num_fds %s' % num_fds
-
-
-class C3LogWriter(object):
-    """Class to handle event data and fill an HTML page using c3.js library"""
-    def __init__(self):
-        """Initializes a C3LogWriter."""
-        self.times = []
-        self.buffer_levels = []
-        self.tags = []
-        self.max_y = 0
-
-    def AddEvent(self, event):
-        """Digests an event.
-
-        Add a tag if this event needs to be shown on grid.
-        Add a buffer level data into buffer_levels if this event has buffer
-        level.
-
-        @param event: An EventData object.
-
-        """
-        tag = event.GetTag()
-        if tag:
-            self.tags.append(tag)
-
-        if isinstance(event, LevelEvent):
-            self.times.append(event.time)
-            self.buffer_levels.append(str(event.level))
-            if event.level > self.max_y:
-                self.max_y = event.level
-            logging.debug('add data for a level event %s: %s',
-                          event.time, event.level)
-
-        if (isinstance(event, DeviceAddedEvent) or
-            isinstance(event, DeviceRemovedEvent)):
-            self.times.append(event.time)
-            self.buffer_levels.append('null')
-
-    def _GetGrids(self):
-        """Gets the content to be filled for grids.
-
-        @returns: A str for grid with format:
-           '{value: time1, text: "tag1", position: "position1"},
-            {value: time1, text: "tag1"},...'
-
-        """
-        grids = []
-        for tag in self.tags:
-            content = ('{value: %s, text: "%s", position: "%s", '
-                       'class: "%s"}') % (
-                              tag.time, tag.text, tag.position, tag.class_name)
-            grids.append(content)
-        grids_joined = ', '.join(grids)
-        return grids_joined
-
-    def FillPage(self, page_template):
-        """Fills in the page template with content.
-
-        @param page_template: A string for HTML page content with variables
-                              to be filled.
-
-        @returns: A string for filled page.
-
-        """
-        times = ', '.join(self.times)
-        buffer_levels = ', '.join(self.buffer_levels)
-        grids = self._GetGrids()
-        filled = page_template.safe_substitute(
-                times=times,
-                buffer_levels=buffer_levels,
-                grids=grids,
-                max_y=str(self.max_y))
-        return filled
-
-
-class EventLogParser(object):
-    """Class for event log parser."""
-    def __init__(self):
-        """Initializes an EventLogParse."""
-        self.parsed_events = []
-
-    def AddEventLog(self, event_log):
-        """Digests a line of event log.
-
-        @param event_log: A line for event log.
-
-        """
-        event = self._ParseOneLine(event_log)
-        if event:
-            self.parsed_events.append(event)
-
-    def GetParsedEvents(self):
-        """Gets the list of parsed events.
-
-        @returns: A list of parsed EventData.
-
-        """
-        return self.parsed_events
-
-    def _ParseOneLine(self, line):
-        """Parses one line of event log.
-
-        Split a line like
-        2019-07-02T15:30:46.683829810 cras atlog  WRITE_STREAMS_FETCH_STREAM     id:1e0000 cbth:512 delay:1136
-        into time, name, and props where
-        time = '54946.683829810'
-        name = 'WRITE_STREAMS_FETCH_STREAM'
-        props = {
-            'id': 0,
-            'cb_th': 512,
-            'delay': 1136
-        }
-
-        @param line: A line of event log.
-
-        @returns: A EventData object.
-
-        """
-        line_split = line.split()
-        time, name = StrToTimestamp(line_split[0]), line_split[3]
-        logging.debug('time: %s, name: %s', time, name)
-        props = {}
-        for index in xrange(4, len(line_split)):
-            key, value = line_split[index].split(':')[:2]
-            props[key] = value
-        logging.debug('props: %s', props)
-        return self._CreateEventData(time, name, props)
-
-    def _CreateEventData(self, time, name, props):
-        """Creates an EventData based on event name.
-
-        @param time: A string for event time.
-        @param name: A string for event name.
-        @param props: A dict for event properties.
-
-        @returns: A EventData object.
-
-        """
-        if name == 'WRITE_STREAMS_FETCH_STREAM':
-            return FetchStreamEvent(time, name, stream=props['id'])
-        if name == 'STREAM_ADDED':
-            return StreamAddedEvent(time, name, stream=props['id'])
-        if name == 'STREAM_REMOVED':
-            return StreamRemovedEvent(time, name, stream=props['id'])
-        if name in ['FILL_AUDIO', 'SET_DEV_WAKE']:
-            return LevelEvent(
-                    time, name, device=props['dev'],
-                    level=int(props['hw_level']))
-        if name == 'DEV_ADDED':
-            return DeviceAddedEvent(time, name, device=props['dev'])
-        if name == 'DEV_REMOVED':
-            return DeviceRemovedEvent(time, name, device=props['dev'])
-        if name == 'WAKE':
-            return WakeEvent(time, name, num_fds=props['num_fds'])
-        return None
-
-
-class AudioThreadLogParser(object):
-    """Class for audio thread log parser."""
-    def __init__(self, path):
-        """Initializes an AudioThreadLogParser.
-
-        @param path: The audio thread log file path.
-
-        """
-        self.path = path
-        self.content = None
-
-    def Parse(self):
-        """Prases the audio thread logs.
-
-        @returns: A list of event log lines.
-
-        """
-        logging.debug('Using file: %s', self.path)
-        with open(self.path, 'r') as f:
-            self.content = f.read().splitlines()
-
-        # Event logs starting at two lines after 'Audio Thread Event Log'.
-        index_start = self.content.index('Audio Thread Event Log:') + 2
-        # If input is from audio_diagnostic result, use aplay -l line to find
-        # the end of audio thread event logs.
-        try:
-            index_end = self.content.index('=== aplay -l ===')
-        except ValueError:
-            logging.debug(
-                    'Can not find aplay line. This is not from diagnostic')
-            index_end = len(self.content)
-        event_logs = self.content[index_start:index_end]
-        logging.info('Parsed %s log events', len(event_logs))
-        return event_logs
-
-    def FillLogs(self, page_template):
-        """Fills the HTML page template with contents for audio thread logs.
-
-        @param page_template: A string for HTML page content with log variable
-                              to be filled.
-
-        @returns: A string for filled page.
-
-        """
-        logs = []
-        for s in self.content:
-            if 'atlog' in s:
-                time = StrToTimestamp(s.split()[0])
-                logs.append('<label id="{}">{}</label>'.format(time, s))
-            else:
-                logs.append(s)
-        logs = '\n'.join(logs)
-
-        return page_template.substitute(logs=logs)
-
-
-def ParseArgs():
-    """Parses the arguments.
-
-    @returns: The namespace containing parsed arguments.
-
-    """
-    parser = argparse.ArgumentParser(
-            description='Draw time chart from audio thread log',
-            formatter_class=argparse.ArgumentDefaultsHelpFormatter)
-    parser.add_argument('FILE', type=str, help='The audio thread log file')
-    parser.add_argument('-o', type=str, dest='output',
-                        default='view.html', help='The output HTML file')
-    parser.add_argument('-d', dest='debug', action='store_true',
-                        default=False, help='Show debug message')
-    return parser.parse_args()
-
-
-def Main():
-    """The Main program."""
-    options = ParseArgs()
-    logging.basicConfig(
-            format='%(asctime)s:%(levelname)s:%(message)s',
-            level=logging.DEBUG if options.debug else logging.INFO)
-
-    # Gets lines of event logs.
-    audio_thread_log_parser = AudioThreadLogParser(options.FILE)
-    event_logs = audio_thread_log_parser.Parse()
-
-    # Parses event logs into events.
-    event_log_parser = EventLogParser()
-    for event_log in event_logs:
-        event_log_parser.AddEventLog(event_log)
-    events = event_log_parser.GetParsedEvents()
-
-    # Reads in events in preparation of filling HTML template.
-    c3_writer = C3LogWriter()
-    for event in events:
-        c3_writer.AddEvent(event)
-
-    # Fills in buffer level chart.
-    page_content_with_chart = c3_writer.FillPage(page_content)
-
-    # Fills in audio thread log into text box.
-    page_content_with_chart_and_logs = audio_thread_log_parser.FillLogs(
-            string.Template(page_content_with_chart))
-
-    with open(options.output, 'w') as f:
-        f.write(page_content_with_chart_and_logs)
-
-
-if __name__ == '__main__':
-    Main()
diff --git a/scripts/audio_tuning/conf2ini2.py b/scripts/audio_tuning/conf2ini2.py
deleted file mode 100755
index 476ffd5..0000000
--- a/scripts/audio_tuning/conf2ini2.py
+++ /dev/null
@@ -1,166 +0,0 @@
-#!/usr/bin/python
-#
-# Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-#
-# convert audio.conf from the audio tuning UI to dsp.ini which can be
-# accepted by cras eq/drc plugin.
-
-import json
-import sys
-import fnmatch
-
-biquad_type_name = [
-    "none",
-    "lowpass",
-    "highpass",
-    "bandpass",
-    "lowshelf",
-    "highshelf",
-    "peaking",
-    "notch",
-    "allpass"
-    ]
-
-header = """\
-[output_source]
-library=builtin
-label=source
-purpose=playback
-disable=(not (equal? dsp_name "speaker_eq"))
-output_0={src:0}
-output_1={src:1}
-
-[output_sink]
-library=builtin
-label=sink
-purpose=playback
-input_0={dst:0}
-input_1={dst:1}"""
-
-drc_header = """\
-[drc]
-library=builtin
-label=drc
-input_0={%s:0}
-input_1={%s:1}
-output_2={%s:0}
-output_3={%s:1}
-input_4=%-7d   ; emphasis_disabled"""
-
-drc_param = """\
-input_%d=%-7g   ; f
-input_%d=%-7g   ; enable
-input_%d=%-7g   ; threshold
-input_%d=%-7g   ; knee
-input_%d=%-7g   ; ratio
-input_%d=%-7g   ; attack
-input_%d=%-7g   ; release
-input_%d=%-7g   ; boost"""
-
-eq_header = """\
-[eq2]
-library=builtin
-label=eq2
-input_0={%s:0}
-input_1={%s:1}
-output_2={%s:0}
-output_3={%s:1}"""
-
-eq_param = """\
-input_%d=%-7d ; %s
-input_%d=%-7g ; freq
-input_%d=%-7g ; Q
-input_%d=%-7g ; gain"""
-
-def is_true(d, pattern):
-  for k in d:
-    if fnmatch.fnmatch(k, pattern) and d[k]:
-        return True
-  return False
-
-def intermediate_name(index):
-  return 'intermediate' + ('' if index == 1 else str(index))
-
-def main():
-  f = open(sys.argv[1])
-  d = json.loads(f.read())
-  print header
-
-  has_drc = is_true(d, 'global.enable_drc') and is_true(d, 'drc.*.enable')
-  has_eq = is_true(d, 'global.enable_eq') and is_true(d, 'eq.*.*.enable')
-
-  stages = []
-  if has_drc:
-    stages.append(print_drc)
-  if has_eq:
-    stages.append(print_eq)
-
-  if is_true(d, 'global.enable_swap') and len(stages) >= 2:
-    stages[0], stages[1] = stages[1], stages[0]
-
-  for i in range(len(stages)):
-    print
-    src = 'src' if i == 0 else intermediate_name(i)
-    dst = 'dst' if i == len(stages) - 1 else intermediate_name(i + 1)
-    stages[i](d, src, dst)
-
-def print_drc(d, src, dst):
-  print drc_header % (src, src, dst, dst, int(d['drc.emphasis_disabled']))
-  n = 5
-  for i in range(3):
-    prefix = 'drc.%d.' % i
-    f = d[prefix + 'f']
-    enable = int(d[prefix + 'enable'])
-    threshold = d[prefix + 'threshold']
-    knee = d[prefix + 'knee']
-    ratio = d[prefix + 'ratio']
-    attack = d[prefix + 'attack']
-    release = d[prefix + 'release']
-    boost = d[prefix + 'boost']
-
-    print drc_param % (n, f,
-                       n+1, enable,
-                       n+2, threshold,
-                       n+3, knee,
-                       n+4, ratio,
-                       n+5, attack,
-                       n+6, release,
-                       n+7, boost)
-    n += 8
-
-# Returns two sorted lists, each one contains the enabled eq index for a channel
-def enabled_eq(d):
-    eeq = [[], []]
-    for k in d:
-      s = k.split('.')
-      if s[0] == 'eq' and s[3] == 'enable' and d[k]:
-        ch_index = int(s[1])
-        eq_num = int(s[2])
-        eeq[ch_index].append(eq_num)
-    return sorted(eeq[0]), sorted(eeq[1])
-
-def print_eq(d, src, dst):
-  print eq_header % (src, src, dst, dst)
-  eeq = enabled_eq(d)
-  eeqn = max(len(eeq[0]), len(eeq[1]))
-  n = 4  # the first input index
-  for i in range(0, eeqn):
-    for ch in (0, 1):
-      if i < len(eeq[ch]):
-        prefix = 'eq.%d.%d.' % (ch, eeq[ch][i])
-        type_name = d[prefix + 'type']
-        type_index = biquad_type_name.index(type_name)
-        f = d[prefix + 'freq']
-        q = d[prefix + 'q']
-        g = d[prefix + 'gain']
-      else:
-        type_name = 'none';
-        type_index = 0;
-        f = q = g = 0
-      print eq_param % (n, type_index, type_name,
-                        n+1, f, n+2, q, n+3, g)
-      n += 4
-
-main()
diff --git a/scripts/audio_tuning/frontend/LICENSE b/scripts/audio_tuning/frontend/LICENSE
deleted file mode 100644
index 0aa7fc9..0000000
--- a/scripts/audio_tuning/frontend/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (c) 2006-2009 The Chromium OS Authors. All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//    * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-//    * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-//    * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/scripts/audio_tuning/frontend/app.yaml b/scripts/audio_tuning/frontend/app.yaml
deleted file mode 100644
index 1706e05..0000000
--- a/scripts/audio_tuning/frontend/app.yaml
+++ /dev/null
@@ -1,30 +0,0 @@
-application: audio-tuning
-version: 1
-runtime: python27
-api_version: 1
-threadsafe: true
-
-handlers:
-- url: /(.*\.css)
-  mime_type: text/css
-  static_files: \1
-  upload: (.*\.css)
-
-- url: /(.*\.html)
-  mime_type: text/html
-  static_files: \1
-  upload: (.*\.html)
-
-- url: /(.*\.js)
-  mime_type: text/javascript
-  static_files: \1
-  upload: (.*\.js)
-
-- url: /(LICENSE)
-  mime_type: text/plain
-  static_files: \1
-  upload: (LICENSE)
-
-- url: /
-  static_files: audio.html
-  upload: audio.html
diff --git a/scripts/audio_tuning/frontend/audio.css b/scripts/audio_tuning/frontend/audio.css
deleted file mode 100644
index 36ee14b..0000000
--- a/scripts/audio_tuning/frontend/audio.css
+++ /dev/null
@@ -1,88 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-body {
-    font-family: sans-serif;
-    text-align: center;
-}
-
-#audio_source_url {
-    border: 1px solid rgb(144,184,222);
-    font-size: large;
-}
-
-.nbox
-{
-    border: 1px solid rgb(144,184,222);
-    text-align:right;
-    position:relative;
-    padding: 2px;
-}
-
-.nslider
-{
-    width: 175px;
-    margin-left: 6px;
-}
-
-.drc_data
-{
-    border: solid 1px gray;
-    border-radius: 5px;
-    display: inline-block;
-    padding: 10px;
-    margin: 6px;
-    width: 370px;
-}
-
-.eq_data {
-    border: solid 1px black;
-    display: inline-block;
-    padding: 10px;
-    margin: 6px;
-}
-
-.drc_curve {
-    border: 1px solid blue;
-    width: 240px;
-    height: 180px;
-}
-
-.eq_curve {
-    border: 1px solid blue;
-    width: 960px;
-    height: 270px;
-    position: absolute;
-    left: 0;
-    top: 0;
-}
-
-.eq_curve_parent {
-    width: 960px;
-    height: 270px;
-    margin: 0 auto;
-    position: relative;
-}
-
-.enable_check {
-    float: right;
-    margin: -6px -6px;
-}
-
-.eq_table {
-    display: inline-block;
-    margin-right: 6px;
-}
-
-#config_file {
-    border: 1px solid rgb(144,184,222);
-    padding: 2px;
-}
-
-.biquad_type_select {
-    background: transparent;
-    border: 1px solid rgb(144,184,222);
-    padding: 2px;
-}
diff --git a/scripts/audio_tuning/frontend/audio.html b/scripts/audio_tuning/frontend/audio.html
deleted file mode 100644
index cf53198..0000000
--- a/scripts/audio_tuning/frontend/audio.html
+++ /dev/null
@@ -1,54 +0,0 @@
-<!-- Copyright (c) 2013 The Chromium OS Authors. All rights reserved. -->
-<!-- Use of this source code is governed by a BSD-style license that can be -->
-<!-- found in the LICENSE file. -->
-
-<html>
-  <head>
-    <TITLE>Audio Tuning</TITLE>
-    <link rel="stylesheet" href="audio.css" type="text/css">
-    <script type="text/javascript" src="audio.js"></script>
-    <script type="text/javascript" src="setup_credential.js"></script>
-    <script type="text/javascript" src="google_drive_picker.js"></script>
-    <script src="https://apis.google.com/js/client.js?onload=onGoogleClientApiLoad"></script>
-  </head>
-  <h1> Audio Source </h1>
-  URL: <input size=100 id="audio_source_url" list=samples autofocus=autofocus
-	      onchange="audio_source_set(this.value)"> </input>
-  <!-- Put your audio clip list here
-  <select id=samples onchange="audio_source_select(this)">
-    <option value="http://www.example.com/audio/clip1.wav">clip1</option>
-    <option value="http://www.example.com/audio/clip2.ogg">clip2</option>
-  </select>
-  -->
-  <input type=button value='Local Audio File' onclick="load_audio()"> </input>
-  <input type=button id='google_drive_pick_file' value='Select File from Google Drive' disable> </input>
-  <p></p>
-  <span id=audio_player_container>
-    <audio controls="controls" id="audio_player" loop=loop
-	   oncanplay="audio_source_canplay()"> </audio>
-  </span>
-  <span id=audio_loading style='visibility:hidden;color:#e59700'>Loading...</span>
-  <span id="global_section">
-  </span>
-
-  <input type=button value='Save Config' onclick="save_config()" id=save_config disabled> </input>
-  <input type=button value='Load Config' onclick="load_config()"> </input>
-  <div style="display:none">
-    <input type=file id=config_file onchange="config_file_changed()">
-    <input type=file id=audio_file onchange="audio_file_changed()">
-    <a id=save_config_anchor></a>
-  </div>
-
-  <h1> DRC </h1>
-  <div id="drc_section">
-  </div>
-  <h1> EQ Left </h1>
-  <div id="eq_left_section">
-  </div>
-  <h1> EQ Right </h1>
-  <div id="eq_right_section">
-  </div>
-  <body>
-  </body>
-</html>
-<html>
diff --git a/scripts/audio_tuning/frontend/audio.js b/scripts/audio_tuning/frontend/audio.js
deleted file mode 100644
index 98870cd..0000000
--- a/scripts/audio_tuning/frontend/audio.js
+++ /dev/null
@@ -1,1994 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-/* This is a program for tuning audio using Web Audio API. The processing
- * pipeline looks like this:
- *
- *                   INPUT
- *                     |
- *               +------------+
- *               | crossover  |
- *               +------------+
- *               /     |      \
- *      (low band) (mid band) (high band)
- *             /       |        \
- *         +------+ +------+ +------+
- *         |  DRC | |  DRC | |  DRC |
- *         +------+ +------+ +------+
- *              \      |        /
- *               \     |       /
- *              +-------------+
- *              |     (+)     |
- *              +-------------+
- *                 |        |
- *              (left)   (right)
- *                 |        |
- *              +----+   +----+
- *              | EQ |   | EQ |
- *              +----+   +----+
- *                 |        |
- *              +----+   +----+
- *              | EQ |   | EQ |
- *              +----+   +----+
- *                 .        .
- *                 .        .
- *              +----+   +----+
- *              | EQ |   | EQ |
- *              +----+   +----+
- *                  \     /
- *                   \   /
- *                     |
- *                   /   \
- *                  /     \
- *             +-----+   +-----+
- *             | FFT |   | FFT | (for visualization only)
- *             +-----+   +-----+
- *                  \     /
- *                   \   /
- *                     |
- *                   OUTPUT
- *
- * The parameters of each DRC and EQ can be adjusted or disabled independently.
- *
- * If enable_swap is set to true, the order of the DRC and the EQ stages are
- * swapped (EQ is applied first, then DRC).
- */
-
-/* The GLOBAL state has following parameters:
- * enable_drc - A switch to turn all DRC on/off.
- * enable_eq - A switch to turn all EQ on/off.
- * enable_fft - A switch to turn visualization on/off.
- * enable_swap - A switch to swap the order of EQ and DRC stages.
- */
-
-/* The DRC has following parameters:
- * f - The lower frequency of the band, in Hz.
- * enable - 1 to enable the compressor, 0 to disable it.
- * threshold - The value above which the compression starts, in dB.
- * knee - The value above which the knee region starts, in dB.
- * ratio - The input/output dB ratio after the knee region.
- * attack - The time to reduce the gain by 10dB, in seconds.
- * release - The time to increase the gain by 10dB, in seconds.
- * boost - The static boost value in output, in dB.
- */
-
-/* The EQ has following parameters:
- * enable - 1 to enable the eq, 0 to disable it.
- * type - The type of the eq, the available values are 'lowpass', 'highpass',
- *     'bandpass', 'lowshelf', 'highshelf', 'peaking', 'notch'.
- * freq - The frequency of the eq, in Hz.
- * q, gain - The meaning depends on the type of the filter. See Web Audio API
- *     for details.
- */
-
-/* The initial values of parameters for GLOBAL, DRC and EQ */
-var INIT_GLOBAL_ENABLE_DRC = true;
-var INIT_GLOBAL_ENABLE_EQ = true;
-var INIT_GLOBAL_ENABLE_FFT = true;
-var INIT_GLOBAL_ENABLE_SWAP = false;
-var INIT_DRC_XO_LOW = 200;
-var INIT_DRC_XO_HIGH = 2000;
-var INIT_DRC_ENABLE = true;
-var INIT_DRC_THRESHOLD = -24;
-var INIT_DRC_KNEE = 30;
-var INIT_DRC_RATIO = 12;
-var INIT_DRC_ATTACK = 0.003;
-var INIT_DRC_RELEASE = 0.250;
-var INIT_DRC_BOOST = 0;
-var INIT_EQ_ENABLE = true;
-var INIT_EQ_TYPE = 'peaking';
-var INIT_EQ_FREQ = 350;
-var INIT_EQ_Q = 1;
-var INIT_EQ_GAIN = 0;
-
-var NEQ = 8;  /* The number of EQs per channel */
-var FFT_SIZE = 2048;  /* The size of FFT used for visualization */
-
-var audioContext;  /* Web Audio context */
-var nyquist;       /* Nyquist frequency, in Hz */
-var sourceNode;
-var audio_graph;
-var audio_ui;
-var analyzer_left;      /* The FFT analyzer for left channel */
-var analyzer_right;     /* The FFT analyzer for right channel */
-/* get_emphasis_disabled detects if pre-emphasis in drc is disabled by browser.
- * The detection result will be stored in this value. When user saves config,
- * This value is stored in drc.emphasis_disabled in the config. */
-var browser_emphasis_disabled_detection_result;
-/* check_biquad_filter_q detects if the browser implements the lowpass and
- * highpass biquad filters with the original formula or the new formula from
- * Audio EQ Cookbook. Chrome changed the filter implementation in R53, see:
- * https://github.com/GoogleChrome/web-audio-samples/wiki/Detection-of-lowpass-BiquadFilter-implementation
- * The detection result is saved in this value before the page is initialized.
- * make_biquad_q() uses this value to compute Q to ensure consistent behavior
- * on different browser versions.
- */
-var browser_biquad_filter_uses_audio_cookbook_formula;
-
-/* Check the lowpass implementation and return a promise. */
-function check_biquad_filter_q() {
-  'use strict';
-  var context = new OfflineAudioContext(1, 128, 48000);
-  var osc = context.createOscillator();
-  var filter1 = context.createBiquadFilter();
-  var filter2 = context.createBiquadFilter();
-  var inverter = context.createGain();
-
-  osc.type = 'sawtooth';
-  osc.frequency.value = 8 * 440;
-  inverter.gain.value = -1;
-  /* each filter should get a different Q value */
-  filter1.Q.value = -1;
-  filter2.Q.value = -20;
-  osc.connect(filter1);
-  osc.connect(filter2);
-  filter1.connect(context.destination);
-  filter2.connect(inverter);
-  inverter.connect(context.destination);
-  osc.start();
-
-  return context.startRendering().then(function (buffer) {
-    return browser_biquad_filter_uses_audio_cookbook_formula =
-      Math.max(...buffer.getChannelData(0)) !== 0;
-  });
-}
-
-/* Return the Q value to be used with the lowpass and highpass biquad filters,
- * given Q in dB for the original filter formula. If the browser uses the new
- * formula, conversion is made to simulate the original frequency response
- * with the new formula.
- */
-function make_biquad_q(q_db) {
-  if (!browser_biquad_filter_uses_audio_cookbook_formula)
-    return q_db;
-
-  var q_lin = dBToLinear(q_db);
-  var q_new = 1 / Math.sqrt((4 - Math.sqrt(16 - 16 / (q_lin * q_lin))) / 2);
-  q_new = linearToDb(q_new);
-  return q_new;
-}
-
-/* The supported audio element names are different on browsers with different
- * versions.*/
-function fix_audio_elements() {
-  try {
-    window.AudioContext = window.AudioContext || window.webkitAudioContext;
-    window.OfflineAudioContext = (window.OfflineAudioContext ||
-        window.webkitOfflineAudioContext);
-  }
-  catch(e) {
-    alert('Web Audio API is not supported in this browser');
-  }
-}
-
-function init_audio() {
-  audioContext = new AudioContext();
-  nyquist = audioContext.sampleRate / 2;
-}
-
-function build_graph() {
-  if (sourceNode) {
-    audio_graph = new graph();
-    sourceNode.disconnect();
-    if (get_global('enable_drc') || get_global('enable_eq') ||
-        get_global('enable_fft')) {
-      connect_from_native(pin(sourceNode), audio_graph);
-      connect_to_native(audio_graph, pin(audioContext.destination));
-    } else {
-      /* no processing needed, directly connect from source to destination. */
-      sourceNode.connect(audioContext.destination);
-    }
-  }
-  apply_all_configs();
-}
-
-/* The available configuration variables are:
- *
- * global.{enable_drc, enable_eq, enable_fft, enable_swap}
- * drc.[0-2].{f, enable, threshold, knee, ratio, attack, release, boost}
- * eq.[01].[0-7].{enable, type, freq, q, gain}.
- *
- * Each configuration variable maps a name to a value. For example,
- * "drc.1.attack" is the attack time for the second drc (the "1" is the index of
- * the drc instance), and "eq.0.2.freq" is the frequency of the third eq on the
- * left channel (the "0" means left channel, and the "2" is the index of the
- * eq).
- */
-var all_configs = {};  /* stores all the configuration variables */
-
-function init_config() {
-  set_config('global', 'enable_drc', INIT_GLOBAL_ENABLE_DRC);
-  set_config('global', 'enable_eq', INIT_GLOBAL_ENABLE_EQ);
-  set_config('global', 'enable_fft', INIT_GLOBAL_ENABLE_FFT);
-  set_config('global', 'enable_swap', INIT_GLOBAL_ENABLE_SWAP);
-  set_config('drc', 0, 'f', 0);
-  set_config('drc', 1, 'f', INIT_DRC_XO_LOW);
-  set_config('drc', 2, 'f', INIT_DRC_XO_HIGH);
-  for (var i = 0; i < 3; i++) {
-    set_config('drc', i, 'enable', INIT_DRC_ENABLE);
-    set_config('drc', i, 'threshold', INIT_DRC_THRESHOLD);
-    set_config('drc', i, 'knee', INIT_DRC_KNEE);
-    set_config('drc', i, 'ratio', INIT_DRC_RATIO);
-    set_config('drc', i, 'attack', INIT_DRC_ATTACK);
-    set_config('drc', i, 'release', INIT_DRC_RELEASE);
-    set_config('drc', i, 'boost', INIT_DRC_BOOST);
-  }
-  for (var i = 0; i <= 1; i++) {
-    for (var j = 0; j < NEQ; j++) {
-      set_config('eq', i, j, 'enable', INIT_EQ_ENABLE);
-      set_config('eq', i, j, 'type', INIT_EQ_TYPE);
-      set_config('eq', i, j, 'freq', INIT_EQ_FREQ);
-      set_config('eq', i, j, 'q', INIT_EQ_Q);
-      set_config('eq', i, j, 'gain', INIT_EQ_GAIN);
-    }
-  }
-}
-
-/* Returns a string from the first n elements of a, joined by '.' */
-function make_name(a, n) {
-  var sub = [];
-  for (var i = 0; i < n; i++) {
-    sub.push(a[i].toString());
-  }
-  return sub.join('.');
-}
-
-function get_config() {
-  var name = make_name(arguments, arguments.length);
-  return all_configs[name];
-}
-
-function set_config() {
-  var n = arguments.length;
-  var name = make_name(arguments, n - 1);
-  all_configs[name] = arguments[n - 1];
-}
-
-/* Convenience function */
-function get_global(name) {
-  return get_config('global', name);
-}
-
-/* set_config and apply it to the audio graph and ui. */
-function use_config() {
-  var n = arguments.length;
-  var name = make_name(arguments, n - 1);
-  all_configs[name] = arguments[n - 1];
-  if (audio_graph) {
-    audio_graph.config(name.split('.'), all_configs[name]);
-  }
-  if (audio_ui) {
-    audio_ui.config(name.split('.'), all_configs[name]);
-  }
-}
-
-/* re-apply all the configs to audio graph and ui. */
-function apply_all_configs() {
-  for (var name in all_configs) {
-    if (audio_graph) {
-      audio_graph.config(name.split('.'), all_configs[name]);
-    }
-    if (audio_ui) {
-      audio_ui.config(name.split('.'), all_configs[name]);
-    }
-  }
-}
-
-/* Returns a zero-padded two digits number, for time formatting. */
-function two(n) {
-  var s = '00' + n;
-  return s.slice(-2);
-}
-
-/* Returns a time string, used for save file name */
-function time_str() {
-  var d = new Date();
-  var date = two(d.getDate());
-  var month = two(d.getMonth() + 1);
-  var hour = two(d.getHours());
-  var minutes = two(d.getMinutes());
-  return month + date + '-' + hour + minutes;
-}
-
-/* Downloads the current config to a file. */
-function save_config() {
-  set_config('drc', 'emphasis_disabled',
-             browser_emphasis_disabled_detection_result);
-  var a = document.getElementById('save_config_anchor');
-  var content = JSON.stringify(all_configs, undefined, 2);
-  var uriContent = 'data:application/octet-stream,' +
-      encodeURIComponent(content);
-  a.href = uriContent;
-  a.download = 'audio-' + time_str() + '.conf';
-  a.click();
-}
-
-/* Loads a config file. */
-function load_config() {
-  document.getElementById('config_file').click();
-}
-
-function config_file_changed() {
-  var input = document.getElementById('config_file');
-  var file = input.files[0];
-  var reader = new FileReader();
-  function onloadend() {
-    var configs = JSON.parse(reader.result);
-    init_config();
-    for (var name in configs) {
-      all_configs[name] = configs[name];
-    }
-    build_graph();
-  }
-  reader.onloadend = onloadend;
-  reader.readAsText(file);
-  input.value = '';
-}
-
-/* ============================ Audio components ============================ */
-
-/* We wrap Web Audio nodes into our own components. Each component has following
- * methods:
- *
- * function input(n) - Returns a list of pins which are the n-th input of the
- * component.
- *
- * function output(n) - Returns a list of pins which are the n-th output of the
- * component.
- *
- * function config(name, value) - Changes the configuration variable for the
- * component.
- *
- * Each "pin" is just one input/output of a Web Audio node.
- */
-
-/* Returns the top-level audio component */
-function graph() {
-  var stages = [];
-  var drcs, eqs, ffts;
-  if (get_global('enable_drc')) {
-    drcs = new drc_3band();
-  }
-  if (get_global('enable_eq')) {
-    eqs = new eq_2chan();
-  }
-  if (get_global('enable_swap')) {
-    if (eqs) stages.push(eqs);
-    if (drcs) stages.push(drcs);
-  } else {
-    if (drcs) stages.push(drcs);
-    if (eqs) stages.push(eqs);
-  }
-  if (get_global('enable_fft')) {
-    ffts = new fft_2chan();
-    stages.push(ffts);
-  }
-
-  for (var i = 1; i < stages.length; i++) {
-    connect(stages[i - 1], stages[i]);
-  }
-
-  function input(n) {
-    return stages[0].input(0);
-  }
-
-  function output(n) {
-    return stages[stages.length - 1].output(0);
-  }
-
-  function config(name, value) {
-    var p = name[0];
-    var s = name.slice(1);
-    if (p == 'global') {
-      /* do nothing */
-    } else if (p == 'drc') {
-      if (drcs) {
-        drcs.config(s, value);
-      }
-    } else if (p == 'eq') {
-      if (eqs) {
-        eqs.config(s, value);
-      }
-    } else {
-      console.log('invalid parameter: name =', name, 'value =', value);
-    }
-  }
-
-  this.input = input;
-  this.output = output;
-  this.config = config;
-}
-
-/* Returns the fft component for two channels */
-function fft_2chan() {
-  var splitter = audioContext.createChannelSplitter(2);
-  var merger = audioContext.createChannelMerger(2);
-
-  analyzer_left = audioContext.createAnalyser();
-  analyzer_right = audioContext.createAnalyser();
-  analyzer_left.fftSize = FFT_SIZE;
-  analyzer_right.fftSize = FFT_SIZE;
-
-  splitter.connect(analyzer_left, 0, 0);
-  splitter.connect(analyzer_right, 1, 0);
-  analyzer_left.connect(merger, 0, 0);
-  analyzer_right.connect(merger, 0, 1);
-
-  function input(n) {
-    return [pin(splitter)];
-  }
-
-  function output(n) {
-    return [pin(merger)];
-  }
-
-  this.input = input;
-  this.output = output;
-}
-
-/* Returns eq for two channels */
-function eq_2chan() {
-  var eqcs = [new eq_channel(0), new eq_channel(1)];
-  var splitter = audioContext.createChannelSplitter(2);
-  var merger = audioContext.createChannelMerger(2);
-
-  connect_from_native(pin(splitter, 0), eqcs[0]);
-  connect_from_native(pin(splitter, 1), eqcs[1]);
-  connect_to_native(eqcs[0], pin(merger, 0));
-  connect_to_native(eqcs[1], pin(merger, 1));
-
-  function input(n) {
-    return [pin(splitter)];
-  }
-
-  function output(n) {
-    return [pin(merger)];
-  }
-
-  function config(name, value) {
-    var p = parseInt(name[0]);
-    var s = name.slice(1);
-    eqcs[p].config(s, value);
-  }
-
-  this.input = input;
-  this.output = output;
-  this.config = config;
-}
-
-/* Returns eq for one channel (left or right). It contains a series of eq
- * filters.  */
-function eq_channel(channel) {
-  var eqs = [];
-  var first = new delay(0);
-  var last = first;
-  for (var i = 0; i < NEQ; i++) {
-    eqs.push(new eq());
-    if (get_config('eq', channel, i, 'enable')) {
-      connect(last, eqs[i]);
-      last = eqs[i];
-    }
-  }
-
-  function input(n) {
-    return first.input(0);
-  }
-
-  function output(n) {
-    return last.output(0);
-  }
-
-  function config(name, value) {
-    var p = parseInt(name[0]);
-    var s = name.slice(1);
-    eqs[p].config(s, value);
-  }
-
-  this.input = input;
-  this.output = output;
-  this.config = config;
-}
-
-/* Returns a delay component (output = input with n seconds delay) */
-function delay(n) {
-  var delay = audioContext.createDelay();
-  delay.delayTime.value = n;
-
-  function input(n) {
-    return [pin(delay)];
-  }
-
-  function output(n) {
-    return [pin(delay)];
-  }
-
-  function config(name, value) {
-    console.log('invalid parameter: name =', name, 'value =', value);
-  }
-
-  this.input = input;
-  this.output = output;
-  this.config = config;
-}
-
-/* Returns an eq filter */
-function eq() {
-  var filter = audioContext.createBiquadFilter();
-  filter.type = INIT_EQ_TYPE;
-  filter.frequency.value = INIT_EQ_FREQ;
-  filter.Q.value = INIT_EQ_Q;
-  filter.gain.value = INIT_EQ_GAIN;
-
-  function input(n) {
-    return [pin(filter)];
-  }
-
-  function output(n) {
-    return [pin(filter)];
-  }
-
-  function config(name, value) {
-    switch (name[0]) {
-    case 'type':
-      filter.type = value;
-      break;
-    case 'freq':
-      filter.frequency.value = parseFloat(value);
-      break;
-    case 'q':
-      value = parseFloat(value);
-      if (filter.type == 'lowpass' || filter.type == 'highpass')
-        value = make_biquad_q(value);
-      filter.Q.value = value;
-      break;
-    case 'gain':
-      filter.gain.value = parseFloat(value);
-      break;
-    case 'enable':
-      break;
-    default:
-      console.log('invalid parameter: name =', name, 'value =', value);
-    }
-  }
-
-  this.input = input;
-  this.output = output;
-  this.config = config;
-}
-
-/* Returns DRC for 3 bands */
-function drc_3band() {
-  var xo = new xo3();
-  var drcs = [new drc(), new drc(), new drc()];
-
-  var out = [];
-  for (var i = 0; i < 3; i++) {
-    if (get_config('drc', i, 'enable')) {
-      connect(xo, drcs[i], i);
-      out = out.concat(drcs[i].output());
-    } else {
-      /* The DynamicsCompressorNode in Chrome has 6ms pre-delay buffer. So for
-       * other bands we need to delay for the same amount of time.
-       */
-      var d = new delay(0.006);
-      connect(xo, d, i);
-      out = out.concat(d.output());
-    }
-  }
-
-  function input(n) {
-    return xo.input(0);
-  }
-
-  function output(n) {
-    return out;
-  }
-
-  function config(name, value) {
-    if (name[1] == 'f') {
-      xo.config(name, value);
-    } else if (name[0] != 'emphasis_disabled') {
-      var n = parseInt(name[0]);
-      drcs[n].config(name.slice(1), value);
-    }
-  }
-
-  this.input = input;
-  this.output = output;
-  this.config = config;
-}
-
-
-/* This snippet came from LayoutTests/webaudio/dynamicscompressor-simple.html in
- * https://codereview.chromium.org/152333003/. It can determine if
- * emphasis/deemphasis is disabled in the browser. Then it sets the value to
- * drc.emphasis_disabled in the config.*/
-function get_emphasis_disabled() {
-  var context;
-  var sampleRate = 44100;
-  var lengthInSeconds = 1;
-  var renderedData;
-  // This threshold is experimentally determined. It depends on the the gain
-  // value of the gain node below and the dynamics compressor.  When the
-  // DynamicsCompressor had the pre-emphasis filters, the peak value is about
-  // 0.21.  Without it, the peak is 0.85.
-  var peakThreshold = 0.85;
-
-  function checkResult(event) {
-    var renderedBuffer = event.renderedBuffer;
-    renderedData = renderedBuffer.getChannelData(0);
-    // Search for a peak in the last part of the data.
-    var startSample = sampleRate * (lengthInSeconds - .1);
-    var endSample = renderedData.length;
-    var k;
-    var peak = -1;
-    var emphasis_disabled = 0;
-
-    for (k = startSample; k < endSample; ++k) {
-      var sample = Math.abs(renderedData[k]);
-      if (peak < sample)
-         peak = sample;
-    }
-
-    if (peak >= peakThreshold) {
-      console.log("Pre-emphasis effect not applied as expected..");
-      emphasis_disabled = 1;
-    } else {
-      console.log("Pre-emphasis caused output to be decreased to " + peak
-                 + " (expected >= " + peakThreshold + ")");
-      emphasis_disabled = 0;
-    }
-    browser_emphasis_disabled_detection_result = emphasis_disabled;
-    /* save_config button will be disabled until we can decide
-       emphasis_disabled in chrome. */
-    document.getElementById('save_config').disabled = false;
-  }
-
-  function runTest() {
-    context = new OfflineAudioContext(1, sampleRate * lengthInSeconds,
-                                      sampleRate);
-    // Connect an oscillator to a gain node to the compressor.  The
-    // oscillator frequency is set to a high value for the (original)
-    // emphasis to kick in. The gain is a little extra boost to get the
-    // compressor enabled.
-    //
-    var osc = context.createOscillator();
-    osc.frequency.value = 15000;
-    var gain = context.createGain();
-    gain.gain.value = 1.5;
-    var compressor = context.createDynamicsCompressor();
-    osc.connect(gain);
-    gain.connect(compressor);
-    compressor.connect(context.destination);
-    osc.start();
-    context.oncomplete = checkResult;
-    context.startRendering();
-  }
-
-  runTest();
-
-}
-
-/* Returns one DRC filter */
-function drc() {
-  var comp = audioContext.createDynamicsCompressor();
-
-  /* The supported method names are different on browsers with different
-   * versions.*/
-  audioContext.createGainNode = (audioContext.createGainNode ||
-                                 audioContext.createGain);
-  var boost = audioContext.createGainNode();
-  comp.threshold.value = INIT_DRC_THRESHOLD;
-  comp.knee.value = INIT_DRC_KNEE;
-  comp.ratio.value = INIT_DRC_RATIO;
-  comp.attack.value = INIT_DRC_ATTACK;
-  comp.release.value = INIT_DRC_RELEASE;
-  boost.gain.value = dBToLinear(INIT_DRC_BOOST);
-
-  comp.connect(boost);
-
-  function input(n) {
-    return [pin(comp)];
-  }
-
-  function output(n) {
-    return [pin(boost)];
-  }
-
-  function config(name, value) {
-    var p = name[0];
-    switch (p) {
-    case 'threshold':
-    case 'knee':
-    case 'ratio':
-    case 'attack':
-    case 'release':
-      comp[p].value = parseFloat(value);
-      break;
-    case 'boost':
-      boost.gain.value = dBToLinear(parseFloat(value));
-      break;
-    case 'enable':
-      break;
-    default:
-      console.log('invalid parameter: name =', name, 'value =', value);
-    }
-  }
-
-  this.input = input;
-  this.output = output;
-  this.config = config;
-}
-
-/* Crossover filter
- *
- * INPUT --+-- lp1 --+-- lp2a --+-- LOW (0)
- *         |         |          |
- *         |         \-- hp2a --/
- *         |
- *         \-- hp1 --+-- lp2 ------ MID (1)
- *                   |
- *                   \-- hp2 ------ HIGH (2)
- *
- *            [f1]       [f2]
- */
-
-/* Returns a crossover component which splits input into 3 bands */
-function xo3() {
-  var f1 = INIT_DRC_XO_LOW;
-  var f2 = INIT_DRC_XO_HIGH;
-
-  var lp1 = lr4_lowpass(f1);
-  var hp1 = lr4_highpass(f1);
-  var lp2 = lr4_lowpass(f2);
-  var hp2 = lr4_highpass(f2);
-  var lp2a = lr4_lowpass(f2);
-  var hp2a = lr4_highpass(f2);
-
-  connect(lp1, lp2a);
-  connect(lp1, hp2a);
-  connect(hp1, lp2);
-  connect(hp1, hp2);
-
-  function input(n) {
-    return lp1.input().concat(hp1.input());
-  }
-
-  function output(n) {
-    switch (n) {
-    case 0:
-      return lp2a.output().concat(hp2a.output());
-    case 1:
-      return lp2.output();
-    case 2:
-      return hp2.output();
-    default:
-      console.log('invalid index ' + n);
-      return [];
-    }
-  }
-
-  function config(name, value) {
-    var p = name[0];
-    var s = name.slice(1);
-    if (p == '0') {
-      /* Ignore. The lower frequency of the low band is always 0. */
-    } else if (p == '1') {
-      lp1.config(s, value);
-      hp1.config(s, value);
-    } else if (p == '2') {
-      lp2.config(s, value);
-      hp2.config(s, value);
-      lp2a.config(s, value);
-      hp2a.config(s, value);
-    } else {
-      console.log('invalid parameter: name =', name, 'value =', value);
-    }
-  }
-
-  this.output = output;
-  this.input = input;
-  this.config = config;
-}
-
-/* Connects two components: the n-th output of c1 and the m-th input of c2. */
-function connect(c1, c2, n, m) {
-  n = n || 0; /* default is the first output */
-  m = m || 0; /* default is the first input */
-  outs = c1.output(n);
-  ins = c2.input(m);
-
-  for (var i = 0; i < outs.length; i++) {
-    for (var j = 0; j < ins.length; j++) {
-      var from = outs[i];
-      var to = ins[j];
-      from.node.connect(to.node, from.index, to.index);
-    }
-  }
-}
-
-/* Connects from pin "from" to the n-th input of component c2 */
-function connect_from_native(from, c2, n) {
-  n = n || 0;  /* default is the first input */
-  ins = c2.input(n);
-  for (var i = 0; i < ins.length; i++) {
-    var to = ins[i];
-    from.node.connect(to.node, from.index, to.index);
-  }
-}
-
-/* Connects from m-th output of component c1 to pin "to" */
-function connect_to_native(c1, to, m) {
-  m = m || 0;  /* default is the first output */
-  outs = c1.output(m);
-  for (var i = 0; i < outs.length; i++) {
-    var from = outs[i];
-    from.node.connect(to.node, from.index, to.index);
-  }
-}
-
-/* Returns a LR4 lowpass component */
-function lr4_lowpass(freq) {
-  return new double(freq, create_lowpass);
-}
-
-/* Returns a LR4 highpass component */
-function lr4_highpass(freq) {
-  return new double(freq, create_highpass);
-}
-
-/* Returns a component by apply the same filter twice. */
-function double(freq, creator) {
-  var f1 = creator(freq);
-  var f2 = creator(freq);
-  f1.connect(f2);
-
-  function input(n) {
-    return [pin(f1)];
-  }
-
-  function output(n) {
-    return [pin(f2)];
-  }
-
-  function config(name, value) {
-    if (name[0] == 'f') {
-      f1.frequency.value = parseFloat(value);
-      f2.frequency.value = parseFloat(value);
-    } else {
-      console.log('invalid parameter: name =', name, 'value =', value);
-    }
-  }
-
-  this.input = input;
-  this.output = output;
-  this.config = config;
-}
-
-/* Returns a lowpass filter */
-function create_lowpass(freq) {
-  var lp = audioContext.createBiquadFilter();
-  lp.type = 'lowpass';
-  lp.frequency.value = freq;
-  lp.Q.value = make_biquad_q(0);
-  return lp;
-}
-
-/* Returns a highpass filter */
-function create_highpass(freq) {
-  var hp = audioContext.createBiquadFilter();
-  hp.type = 'highpass';
-  hp.frequency.value = freq;
-  hp.Q.value = make_biquad_q(0);
-  return hp;
-}
-
-/* A pin specifies one of the input/output of a Web Audio node */
-function pin(node, index) {
-  var p = new Pin();
-  p.node = node;
-  p.index = index || 0;
-  return p;
-}
-
-function Pin(node, index) {
-}
-
-/* ============================ Event Handlers ============================ */
-
-function audio_source_select(select) {
-  var index = select.selectedIndex;
-  var url = document.getElementById('audio_source_url');
-  url.value = select.options[index].value;
-  url.blur();
-  audio_source_set(url.value);
-}
-
-/* Loads a local audio file. */
-function load_audio() {
-  document.getElementById('audio_file').click();
-}
-
-function audio_file_changed() {
-  var input = document.getElementById('audio_file');
-  var file = input.files[0];
-  var file_url = window.webkitURL.createObjectURL(file);
-  input.value = '';
-
-  var url = document.getElementById('audio_source_url');
-  url.value = file.name;
-
-  audio_source_set(file_url);
-}
-
-function audio_source_set(url) {
-  var player = document.getElementById('audio_player');
-  var container = document.getElementById('audio_player_container');
-  var loading = document.getElementById('audio_loading');
-  loading.style.visibility = 'visible';
-
-  /* Re-create an audio element when the audio source URL is changed. */
-  player.pause();
-  container.removeChild(player);
-  player = document.createElement('audio');
-  player.crossOrigin = 'anonymous';
-  player.id = 'audio_player';
-  player.loop = true;
-  player.controls = true;
-  player.addEventListener('canplay', audio_source_canplay);
-  container.appendChild(player);
-  update_source_node(player);
-
-  player.src = url;
-  player.load();
-}
-
-function audio_source_canplay() {
-  var player = document.getElementById('audio_player');
-  var loading = document.getElementById('audio_loading');
-  loading.style.visibility = 'hidden';
-  player.play();
-}
-
-function update_source_node(mediaElement) {
-  sourceNode = audioContext.createMediaElementSource(mediaElement);
-  build_graph();
-}
-
-function toggle_global_checkbox(name, enable) {
-  use_config('global', name, enable);
-  build_graph();
-}
-
-function toggle_one_drc(index, enable) {
-  use_config('drc', index, 'enable', enable);
-  build_graph();
-}
-
-function toggle_one_eq(channel, index, enable) {
-  use_config('eq', channel, index, 'enable', enable);
-  build_graph();
-}
-
-/* ============================== UI widgets ============================== */
-
-/* Adds a row to the table. The row contains an input box and a slider. */
-function slider_input(table, name, initial_value, min_value, max_value, step,
-                      suffix, handler) {
-  function id(x) {
-    return x;
-  }
-
-  return new slider_input_common(table, name, initial_value, min_value,
-                                 max_value, step, suffix, handler, id, id);
-}
-
-/* This is similar to slider_input, but uses log scale for the slider. */
-function slider_input_log(table, name, initial_value, min_value, max_value,
-                          suffix, precision, handler, mapping,
-                          inverse_mapping) {
-  function mapping(x) {
-    return Math.log(x + 1);
-  }
-
-  function inv_mapping(x) {
-    return (Math.exp(x) - 1).toFixed(precision);
-  }
-
-  return new slider_input_common(table, name, initial_value, min_value,
-                                 max_value, 1e-6, suffix, handler, mapping,
-                                 inv_mapping);
-}
-
-/* The common implementation of linear and log-scale sliders. Each slider has
- * the following methods:
- *
- * function update(v) - update the slider (and the text box) to the value v.
- *
- * function hide(h) - hide/unhide the slider.
- */
-function slider_input_common(table, name, initial_value, min_value, max_value,
-                             step, suffix, handler, mapping, inv_mapping) {
-  var row = table.insertRow(-1);
-  var col_name = row.insertCell(-1);
-  var col_box = row.insertCell(-1);
-  var col_slider = row.insertCell(-1);
-
-  var name_span = document.createElement('span');
-  name_span.appendChild(document.createTextNode(name));
-  col_name.appendChild(name_span);
-
-  var box = document.createElement('input');
-  box.defaultValue = initial_value;
-  box.type = 'text';
-  box.size = 5;
-  box.className = 'nbox';
-  col_box.appendChild(box);
-  var suffix_span = document.createElement('span');
-  suffix_span.appendChild(document.createTextNode(suffix));
-  col_box.appendChild(suffix_span);
-
-  var slider = document.createElement('input');
-  slider.defaultValue = Math.log(initial_value);
-  slider.type = 'range';
-  slider.className = 'nslider';
-  slider.min = mapping(min_value);
-  slider.max = mapping(max_value);
-  slider.step = step;
-  col_slider.appendChild(slider);
-
-  box.onchange = function() {
-    slider.value = mapping(box.value);
-    handler(parseFloat(box.value));
-  };
-
-  slider.onchange = function() {
-    box.value = inv_mapping(slider.value);
-    handler(parseFloat(box.value));
-  };
-
-  function update(v) {
-    box.value = v;
-    slider.value = mapping(v);
-  }
-
-  function hide(h) {
-    var v = h ? 'hidden' : 'visible';
-    name_span.style.visibility = v;
-    box.style.visibility = v;
-    suffix_span.style.visibility = v;
-    slider.style.visibility = v;
-  }
-
-  this.update = update;
-  this.hide = hide;
-}
-
-/* Adds a enable/disable checkbox to a div. The method "update" can change the
- * checkbox state. */
-function check_button(div, handler) {
-  var check = document.createElement('input');
-  check.className = 'enable_check';
-  check.type = 'checkbox';
-  check.checked = true;
-  check.onchange = function() {
-    handler(check.checked);
-  };
-  div.appendChild(check);
-
-  function update(v) {
-    check.checked = v;
-  }
-
-  this.update = update;
-}
-
-function empty() {
-}
-
-/* Changes the opacity of a div. */
-function toggle_card(div, enable) {
-  div.style.opacity = enable ? 1 : 0.3;
-}
-
-/* Appends a card of DRC controls and graphs to the specified parent.
- * Args:
- *     parent - The parent element
- *     index - The index of this DRC component (0-2)
- *     lower_freq - The lower frequency of this DRC component
- *     freq_label - The label for the lower frequency input text box
- */
-function drc_card(parent, index, lower_freq, freq_label) {
-  var top = document.createElement('div');
-  top.className = 'drc_data';
-  parent.appendChild(top);
-  function toggle_drc_card(enable) {
-    toggle_card(div, enable);
-    toggle_one_drc(index, enable);
-  }
-  var enable_button = new check_button(top, toggle_drc_card);
-
-  var div = document.createElement('div');
-  top.appendChild(div);
-
-  /* Canvas */
-  var p = document.createElement('p');
-  div.appendChild(p);
-
-  var canvas = document.createElement('canvas');
-  canvas.className = 'drc_curve';
-  p.appendChild(canvas);
-
-  canvas.width = 240;
-  canvas.height = 180;
-  var dd = new DrcDrawer(canvas);
-  dd.init();
-
-  /* Parameters */
-  var table = document.createElement('table');
-  div.appendChild(table);
-
-  function change_lower_freq(v) {
-    use_config('drc', index, 'f', v);
-  }
-
-  function change_threshold(v) {
-    dd.update_threshold(v);
-    use_config('drc', index, 'threshold', v);
-  }
-
-  function change_knee(v) {
-    dd.update_knee(v);
-    use_config('drc', index, 'knee', v);
-  }
-
-  function change_ratio(v) {
-    dd.update_ratio(v);
-    use_config('drc', index, 'ratio', v);
-  }
-
-  function change_boost(v) {
-    dd.update_boost(v);
-    use_config('drc', index, 'boost', v);
-  }
-
-  function change_attack(v) {
-    use_config('drc', index, 'attack', v);
-  }
-
-  function change_release(v) {
-    use_config('drc', index, 'release', v);
-  }
-
-  var f_slider;
-  if (lower_freq == 0) {  /* Special case for the lowest band */
-    f_slider = new slider_input_log(table, freq_label, lower_freq, 0, 1,
-                                    'Hz', 0, empty);
-    f_slider.hide(true);
-  } else {
-    f_slider = new slider_input_log(table, freq_label, lower_freq, 1,
-                                    nyquist, 'Hz', 0, change_lower_freq);
-  }
-
-  var sliders = {
-    'f': f_slider,
-    'threshold': new slider_input(table, 'Threshold', INIT_DRC_THRESHOLD,
-                                  -100, 0, 1, 'dB', change_threshold),
-    'knee': new slider_input(table, 'Knee', INIT_DRC_KNEE, 0, 40, 1, 'dB',
-                             change_knee),
-    'ratio': new slider_input(table, 'Ratio', INIT_DRC_RATIO, 1, 20, 0.001,
-                              '', change_ratio),
-    'boost': new slider_input(table, 'Boost', 0, -40, 40, 1, 'dB',
-                              change_boost),
-    'attack': new slider_input(table, 'Attack', INIT_DRC_ATTACK, 0.001,
-                               1, 0.001, 's', change_attack),
-    'release': new slider_input(table, 'Release', INIT_DRC_RELEASE,
-                                0.001, 1, 0.001, 's', change_release)
-  };
-
-  function config(name, value) {
-    var p = name[0];
-    var fv = parseFloat(value);
-    switch (p) {
-    case 'f':
-    case 'threshold':
-    case 'knee':
-    case 'ratio':
-    case 'boost':
-    case 'attack':
-    case 'release':
-      sliders[p].update(fv);
-      break;
-    case 'enable':
-      toggle_card(div, value);
-      enable_button.update(value);
-      break;
-    default:
-      console.log('invalid parameter: name =', name, 'value =', value);
-    }
-
-    switch (p) {
-    case 'threshold':
-      dd.update_threshold(fv);
-      break;
-    case 'knee':
-      dd.update_knee(fv);
-      break;
-    case 'ratio':
-      dd.update_ratio(fv);
-      break;
-    case 'boost':
-      dd.update_boost(fv);
-      break;
-    }
-  }
-
-  this.config = config;
-}
-
-/* Appends a menu of biquad types to the specified table. */
-function biquad_type_select(table, handler) {
-  var row = table.insertRow(-1);
-  var col_name = row.insertCell(-1);
-  var col_menu = row.insertCell(-1);
-
-  col_name.appendChild(document.createTextNode('Type'));
-
-  var select = document.createElement('select');
-  select.className = 'biquad_type_select';
-  var options = [
-    'lowpass',
-    'highpass',
-    'bandpass',
-    'lowshelf',
-    'highshelf',
-    'peaking',
-    'notch'
-    /* no need: 'allpass' */
-  ];
-
-  for (var i = 0; i < options.length; i++) {
-    var o = document.createElement('option');
-    o.appendChild(document.createTextNode(options[i]));
-    select.appendChild(o);
-  }
-
-  select.value = INIT_EQ_TYPE;
-  col_menu.appendChild(select);
-
-  function onchange() {
-    handler(select.value);
-  }
-  select.onchange = onchange;
-
-  function update(v) {
-    select.value = v;
-  }
-
-  this.update = update;
-}
-
-/* Appends a card of EQ controls to the specified parent.
- * Args:
- *     parent - The parent element
- *     channel - The index of the channel this EQ component is on (0-1)
- *     index - The index of this EQ on this channel (0-7)
- *     ed - The EQ curve drawer. We will notify the drawer to redraw if the
- *         parameters for this EQ changes.
- */
-function eq_card(parent, channel, index, ed) {
-  var top = document.createElement('div');
-  top.className = 'eq_data';
-  parent.appendChild(top);
-  function toggle_eq_card(enable) {
-    toggle_card(table, enable);
-    toggle_one_eq(channel, index, enable);
-    ed.update_enable(index, enable);
-  }
-  var enable_button = new check_button(top, toggle_eq_card);
-
-  var table = document.createElement('table');
-  table.className = 'eq_table';
-  top.appendChild(table);
-
-  function change_type(v) {
-    ed.update_type(index, v);
-    hide_unused_slider(v);
-    use_config('eq', channel, index, 'type', v);
-    /* Special case: automatically set Q to 0 for lowpass/highpass filters. */
-    if (v == 'lowpass' || v == 'highpass') {
-      use_config('eq', channel, index, 'q', 0);
-    }
-  }
-
-  function change_freq(v)
-  {
-    ed.update_freq(index, v);
-    use_config('eq', channel, index, 'freq', v);
-  }
-
-  function change_q(v)
-  {
-    ed.update_q(index, v);
-    use_config('eq', channel, index, 'q', v);
-  }
-
-  function change_gain(v)
-  {
-    ed.update_gain(index, v);
-    use_config('eq', channel, index, 'gain', v);
-  }
-
-  var type_select = new biquad_type_select(table, change_type);
-
-  var sliders = {
-    'freq': new slider_input_log(table, 'Frequency', INIT_EQ_FREQ, 1,
-                                 nyquist, 'Hz', 0, change_freq),
-    'q': new slider_input_log(table, 'Q', INIT_EQ_Q, 0, 1000, '', 4,
-                              change_q),
-    'gain': new slider_input(table, 'Gain', INIT_EQ_GAIN, -40, 40, 0.1,
-                             'dB', change_gain)
-  };
-
-  var unused = {
-    'lowpass': [0, 0, 1],
-    'highpass': [0, 0, 1],
-    'bandpass': [0, 0, 1],
-    'lowshelf': [0, 1, 0],
-    'highshelf': [0, 1, 0],
-    'peaking': [0, 0, 0],
-    'notch': [0, 0, 1],
-    'allpass': [0, 0, 1]
-  };
-  function hide_unused_slider(type) {
-    var u = unused[type];
-    sliders['freq'].hide(u[0]);
-    sliders['q'].hide(u[1]);
-    sliders['gain'].hide(u[2]);
-  }
-
-  function config(name, value) {
-    var p = name[0];
-    var fv = parseFloat(value);
-    switch (p) {
-    case 'type':
-      type_select.update(value);
-      break;
-    case 'freq':
-    case 'q':
-    case 'gain':
-      sliders[p].update(fv);
-      break;
-    case 'enable':
-      toggle_card(table, value);
-      enable_button.update(value);
-      break;
-    default:
-      console.log('invalid parameter: name =', name, 'value =', value);
-    }
-
-    switch (p) {
-    case 'type':
-      ed.update_type(index, value);
-      hide_unused_slider(value);
-      break;
-    case 'freq':
-      ed.update_freq(index, fv);
-      break;
-    case 'q':
-      ed.update_q(index, fv);
-      break;
-    case 'gain':
-      ed.update_gain(index, fv);
-      break;
-    }
-  }
-
-  this.config = config;
-}
-
-/* Appends the EQ UI for one channel to the specified parent */
-function eq_section(parent, channel) {
-  /* Two canvas, one for eq curve, another for fft. */
-  var p = document.createElement('p');
-  p.className = 'eq_curve_parent';
-
-  var canvas_eq = document.createElement('canvas');
-  canvas_eq.className = 'eq_curve';
-  canvas_eq.width = 960;
-  canvas_eq.height = 270;
-
-  p.appendChild(canvas_eq);
-  var ed = new EqDrawer(canvas_eq, channel);
-  ed.init();
-
-  var canvas_fft = document.createElement('canvas');
-  canvas_fft.className = 'eq_curve';
-  canvas_fft.width = 960;
-  canvas_fft.height = 270;
-
-  p.appendChild(canvas_fft);
-  var fd = new FFTDrawer(canvas_fft, channel);
-  fd.init();
-
-  parent.appendChild(p);
-
-  /* Eq cards */
-  var eq = {};
-  for (var i = 0; i < NEQ; i++) {
-    eq[i] = new eq_card(parent, channel, i, ed);
-  }
-
-  function config(name, value) {
-    var p = parseInt(name[0]);
-    var s = name.slice(1);
-    eq[p].config(s, value);
-  }
-
-  this.config = config;
-}
-
-function global_section(parent) {
-  var checkbox_data = [
-    /* config name, text label, checkbox object */
-    ['enable_drc', 'Enable DRC', null],
-    ['enable_eq', 'Enable EQ', null],
-    ['enable_fft', 'Show FFT', null],
-    ['enable_swap', 'Swap DRC/EQ', null]
-  ];
-
-  for (var i = 0; i < checkbox_data.length; i++) {
-    config_name = checkbox_data[i][0];
-    text_label = checkbox_data[i][1];
-
-    var cb = document.createElement('input');
-    cb.type = 'checkbox';
-    cb.checked = get_global(config_name);
-    cb.onchange = function(name) {
-      return function() { toggle_global_checkbox(name, this.checked); }
-    }(config_name);
-    checkbox_data[i][2] = cb;
-    parent.appendChild(cb);
-    parent.appendChild(document.createTextNode(text_label));
-  }
-
-  function config(name, value) {
-    var i;
-    for (i = 0; i < checkbox_data.length; i++) {
-      if (checkbox_data[i][0] == name[0]) {
-        break;
-      }
-    }
-    if (i < checkbox_data.length) {
-      checkbox_data[i][2].checked = value;
-    } else {
-      console.log('invalid parameter: name =', name, 'value =', value);
-    }
-  }
-
-  this.config = config;
-}
-
-window.onload = function() {
-  fix_audio_elements();
-  check_biquad_filter_q().then(function (flag) {
-    console.log('Browser biquad filter uses Audio Cookbook formula:', flag);
-    /* Detects if emphasis is disabled and sets
-     * browser_emphasis_disabled_detection_result. */
-    get_emphasis_disabled();
-    init_config();
-    init_audio();
-    init_ui();
-  }).catch(function (reason) {
-    alert('Cannot detect browser biquad filter implementation:', reason);
-  });
-};
-
-function init_ui() {
-  audio_ui = new ui();
-}
-
-/* Top-level UI */
-function ui() {
-  var global = new global_section(document.getElementById('global_section'));
-  var drc_div = document.getElementById('drc_section');
-  var drc_cards = [
-    new drc_card(drc_div, 0, 0, ''),
-    new drc_card(drc_div, 1, INIT_DRC_XO_LOW, 'Start From'),
-    new drc_card(drc_div, 2, INIT_DRC_XO_HIGH, 'Start From')
-  ];
-
-  var left_div = document.getElementById('eq_left_section');
-  var right_div = document.getElementById('eq_right_section');
-  var eq_sections = [
-    new eq_section(left_div, 0),
-    new eq_section(right_div, 1)
-  ];
-
-  function config(name, value) {
-    var p = name[0];
-    var i = parseInt(name[1]);
-    var s = name.slice(2);
-    if (p == 'global') {
-      global.config(name.slice(1), value);
-    } else if (p == 'drc') {
-      if (name[1] == 'emphasis_disabled') {
-        return;
-      }
-      drc_cards[i].config(s, value);
-    } else if (p == 'eq') {
-      eq_sections[i].config(s, value);
-    } else {
-      console.log('invalid parameter: name =', name, 'value =', value);
-    }
-  }
-
-  this.config = config;
-}
-
-/* Draws the DRC curve on a canvas. The update*() methods should be called when
- * the parameters change, so the curve can be redrawn. */
-function DrcDrawer(canvas) {
-  var canvasContext = canvas.getContext('2d');
-
-  var backgroundColor = 'black';
-  var curveColor = 'rgb(192,192,192)';
-  var gridColor = 'rgb(200,200,200)';
-  var textColor = 'rgb(238,221,130)';
-  var thresholdColor = 'rgb(255,160,122)';
-
-  var dbThreshold = INIT_DRC_THRESHOLD;
-  var dbKnee = INIT_DRC_KNEE;
-  var ratio = INIT_DRC_RATIO;
-  var boost = INIT_DRC_BOOST;
-
-  var curve_slope;
-  var curve_k;
-  var linearThreshold;
-  var kneeThresholdDb;
-  var kneeThreshold;
-  var ykneeThresholdDb;
-  var mainLinearGain;
-
-  var maxOutputDb = 6;
-  var minOutputDb = -36;
-
-  function xpixelToDb(x) {
-    /* This is right even though it looks like we should scale by width. We
-     * want the same pixel/dB scale for both. */
-    var k = x / canvas.height;
-    var db = minOutputDb + k * (maxOutputDb - minOutputDb);
-    return db;
-  }
-
-  function dBToXPixel(db) {
-    var k = (db - minOutputDb) / (maxOutputDb - minOutputDb);
-    var x = k * canvas.height;
-    return x;
-  }
-
-  function ypixelToDb(y) {
-    var k = y / canvas.height;
-    var db = maxOutputDb - k * (maxOutputDb - minOutputDb);
-    return db;
-  }
-
-  function dBToYPixel(db) {
-    var k = (maxOutputDb - db) / (maxOutputDb - minOutputDb);
-    var y = k * canvas.height;
-    return y;
-  }
-
-  function kneeCurve(x, k) {
-    if (x < linearThreshold)
-      return x;
-
-    return linearThreshold +
-        (1 - Math.exp(-k * (x - linearThreshold))) / k;
-  }
-
-  function saturate(x, k) {
-    var y;
-    if (x < kneeThreshold) {
-      y = kneeCurve(x, k);
-    } else {
-      var xDb = linearToDb(x);
-      var yDb = ykneeThresholdDb + curve_slope * (xDb - kneeThresholdDb);
-      y = dBToLinear(yDb);
-    }
-    return y;
-  }
-
-  function slopeAt(x, k) {
-    if (x < linearThreshold)
-      return 1;
-    var x2 = x * 1.001;
-    var xDb = linearToDb(x);
-    var x2Db = linearToDb(x2);
-    var yDb = linearToDb(kneeCurve(x, k));
-    var y2Db = linearToDb(kneeCurve(x2, k));
-    var m = (y2Db - yDb) / (x2Db - xDb);
-    return m;
-  }
-
-  function kAtSlope(desiredSlope) {
-    var xDb = dbThreshold + dbKnee;
-    var x = dBToLinear(xDb);
-
-    var minK = 0.1;
-    var maxK = 10000;
-    var k = 5;
-
-    for (var i = 0; i < 15; i++) {
-      var slope = slopeAt(x, k);
-      if (slope < desiredSlope) {
-        maxK = k;
-      } else {
-        minK = k;
-      }
-      k = Math.sqrt(minK * maxK);
-    }
-    return k;
-  }
-
-  function drawCurve() {
-    /* Update curve parameters */
-    linearThreshold = dBToLinear(dbThreshold);
-    curve_slope = 1 / ratio;
-    curve_k = kAtSlope(1 / ratio);
-    kneeThresholdDb = dbThreshold + dbKnee;
-    kneeThreshold = dBToLinear(kneeThresholdDb);
-    ykneeThresholdDb = linearToDb(kneeCurve(kneeThreshold, curve_k));
-
-    /* Calculate mainLinearGain */
-    var fullRangeGain = saturate(1, curve_k);
-    var fullRangeMakeupGain = Math.pow(1 / fullRangeGain, 0.6);
-    mainLinearGain = dBToLinear(boost) * fullRangeMakeupGain;
-
-    /* Clear canvas */
-    var width = canvas.width;
-    var height = canvas.height;
-    canvasContext.fillStyle = backgroundColor;
-    canvasContext.fillRect(0, 0, width, height);
-
-    /* Draw linear response for reference. */
-    canvasContext.strokeStyle = gridColor;
-    canvasContext.lineWidth = 1;
-    canvasContext.beginPath();
-    canvasContext.moveTo(dBToXPixel(minOutputDb), dBToYPixel(minOutputDb));
-    canvasContext.lineTo(dBToXPixel(maxOutputDb), dBToYPixel(maxOutputDb));
-    canvasContext.stroke();
-
-    /* Draw 0dBFS output levels from 0dBFS down to -36dBFS */
-    for (var dbFS = 0; dbFS >= -36; dbFS -= 6) {
-      canvasContext.beginPath();
-
-      var y = dBToYPixel(dbFS);
-      canvasContext.setLineDash([1, 4]);
-      canvasContext.moveTo(0, y);
-      canvasContext.lineTo(width, y);
-      canvasContext.stroke();
-      canvasContext.setLineDash([]);
-
-      canvasContext.textAlign = 'center';
-      canvasContext.strokeStyle = textColor;
-      canvasContext.strokeText(dbFS.toFixed(0) + ' dB', 15, y - 2);
-      canvasContext.strokeStyle = gridColor;
-    }
-
-    /* Draw 0dBFS input line */
-    canvasContext.beginPath();
-    canvasContext.moveTo(dBToXPixel(0), 0);
-    canvasContext.lineTo(dBToXPixel(0), height);
-    canvasContext.stroke();
-    canvasContext.strokeText('0dB', dBToXPixel(0), height);
-
-    /* Draw threshold input line */
-    canvasContext.beginPath();
-    canvasContext.moveTo(dBToXPixel(dbThreshold), 0);
-    canvasContext.lineTo(dBToXPixel(dbThreshold), height);
-    canvasContext.moveTo(dBToXPixel(kneeThresholdDb), 0);
-    canvasContext.lineTo(dBToXPixel(kneeThresholdDb), height);
-    canvasContext.strokeStyle = thresholdColor;
-    canvasContext.stroke();
-
-    /* Draw the compressor curve */
-    canvasContext.strokeStyle = curveColor;
-    canvasContext.lineWidth = 3;
-
-    canvasContext.beginPath();
-    var pixelsPerDb = (0.5 * height) / 40.0;
-
-    for (var x = 0; x < width; ++x) {
-      var inputDb = xpixelToDb(x);
-      var inputLinear = dBToLinear(inputDb);
-      var outputLinear = saturate(inputLinear, curve_k);
-      outputLinear *= mainLinearGain;
-      var outputDb = linearToDb(outputLinear);
-      var y = dBToYPixel(outputDb);
-
-      canvasContext.lineTo(x, y);
-    }
-    canvasContext.stroke();
-
-  }
-
-  function init() {
-    drawCurve();
-  }
-
-  function update_threshold(v)
-  {
-    dbThreshold = v;
-    drawCurve();
-  }
-
-  function update_knee(v)
-  {
-    dbKnee = v;
-    drawCurve();
-  }
-
-  function update_ratio(v)
-  {
-    ratio = v;
-    drawCurve();
-  }
-
-  function update_boost(v)
-  {
-    boost = v;
-    drawCurve();
-  }
-
-  this.init = init;
-  this.update_threshold = update_threshold;
-  this.update_knee = update_knee;
-  this.update_ratio = update_ratio;
-  this.update_boost = update_boost;
-}
-
-/* Draws the EQ curve on a canvas. The update*() methods should be called when
- * the parameters change, so the curve can be redrawn. */
-function EqDrawer(canvas, channel) {
-  var canvasContext = canvas.getContext('2d');
-  var curveColor = 'rgb(192,192,192)';
-  var gridColor = 'rgb(200,200,200)';
-  var textColor = 'rgb(238,221,130)';
-  var centerFreq = {};
-  var q = {};
-  var gain = {};
-
-  for (var i = 0; i < NEQ; i++) {
-    centerFreq[i] = INIT_EQ_FREQ;
-    q[i] = INIT_EQ_Q;
-    gain[i] = INIT_EQ_GAIN;
-  }
-
-  function drawCurve() {
-    /* Create a biquad node to calculate frequency response. */
-    var filter = audioContext.createBiquadFilter();
-    var width = canvas.width;
-    var height = canvas.height;
-    var pixelsPerDb = height / 48.0;
-    var noctaves = 10;
-
-    /* Prepare the frequency array */
-    var frequencyHz = new Float32Array(width);
-    for (var i = 0; i < width; ++i) {
-      var f = i / width;
-
-      /* Convert to log frequency scale (octaves). */
-      f = Math.pow(2.0, noctaves * (f - 1.0));
-      frequencyHz[i] = f * nyquist;
-    }
-
-    /* Get the response */
-    var magResponse = new Float32Array(width);
-    var phaseResponse = new Float32Array(width);
-    var totalMagResponse = new Float32Array(width);
-
-    for (var i = 0; i < width; i++) {
-      totalMagResponse[i] = 1;
-    }
-
-    for (var i = 0; i < NEQ; i++) {
-      if (!get_config('eq', channel, i, 'enable')) {
-        continue;
-      }
-      filter.type = get_config('eq', channel, i, 'type');
-      filter.frequency.value = centerFreq[i];
-      if (filter.type == 'lowpass' || filter.type == 'highpass')
-        filter.Q.value = make_biquad_q(q[i]);
-      else
-        filter.Q.value = q[i];
-      filter.gain.value = gain[i];
-      filter.getFrequencyResponse(frequencyHz, magResponse,
-                                  phaseResponse);
-      for (var j = 0; j < width; j++) {
-        totalMagResponse[j] *= magResponse[j];
-      }
-    }
-
-    /* Draw the response */
-    canvasContext.fillStyle = 'rgb(0, 0, 0)';
-    canvasContext.fillRect(0, 0, width, height);
-    canvasContext.strokeStyle = curveColor;
-    canvasContext.lineWidth = 3;
-    canvasContext.beginPath();
-
-    for (var i = 0; i < width; ++i) {
-      var response = totalMagResponse[i];
-      var dbResponse = linearToDb(response);
-
-      var x = i;
-      var y = height - (dbResponse + 24) * pixelsPerDb;
-
-      canvasContext.lineTo(x, y);
-    }
-    canvasContext.stroke();
-
-    /* Draw frequency scale. */
-    canvasContext.beginPath();
-    canvasContext.lineWidth = 1;
-    canvasContext.strokeStyle = gridColor;
-
-    for (var octave = 0; octave <= noctaves; octave++) {
-      var x = octave * width / noctaves;
-
-      canvasContext.moveTo(x, 30);
-      canvasContext.lineTo(x, height);
-      canvasContext.stroke();
-
-      var f = nyquist * Math.pow(2.0, octave - noctaves);
-      canvasContext.textAlign = 'center';
-      canvasContext.strokeText(f.toFixed(0) + 'Hz', x, 20);
-    }
-
-    /* Draw 0dB line. */
-    canvasContext.beginPath();
-    canvasContext.moveTo(0, 0.5 * height);
-    canvasContext.lineTo(width, 0.5 * height);
-    canvasContext.stroke();
-
-    /* Draw decibel scale. */
-    for (var db = -24.0; db < 24.0; db += 6) {
-      var y = height - (db + 24) * pixelsPerDb;
-      canvasContext.beginPath();
-      canvasContext.setLineDash([1, 4]);
-      canvasContext.moveTo(0, y);
-      canvasContext.lineTo(width, y);
-      canvasContext.stroke();
-      canvasContext.setLineDash([]);
-      canvasContext.strokeStyle = textColor;
-      canvasContext.strokeText(db.toFixed(0) + 'dB', width - 20, y);
-      canvasContext.strokeStyle = gridColor;
-    }
-  }
-
-  function update_freq(index, v) {
-    centerFreq[index] = v;
-    drawCurve();
-  }
-
-  function update_q(index, v) {
-    q[index] = v;
-    drawCurve();
-  }
-
-  function update_gain(index, v) {
-    gain[index] = v;
-    drawCurve();
-  }
-
-  function update_enable(index, v) {
-    drawCurve();
-  }
-
-  function update_type(index, v) {
-    drawCurve();
-  }
-
-  function init() {
-    drawCurve();
-  }
-
-  this.init = init;
-  this.update_freq = update_freq;
-  this.update_q = update_q;
-  this.update_gain = update_gain;
-  this.update_enable = update_enable;
-  this.update_type = update_type;
-}
-
-/* Draws the FFT curve on a canvas. This will update continuously when the audio
- * is playing. */
-function FFTDrawer(canvas, channel) {
-  var canvasContext = canvas.getContext('2d');
-  var curveColor = 'rgb(255,160,122)';
-  var binCount = FFT_SIZE / 2;
-  var data = new Float32Array(binCount);
-
-  function drawCurve() {
-    var width = canvas.width;
-    var height = canvas.height;
-    var pixelsPerDb = height / 96.0;
-
-    canvasContext.clearRect(0, 0, width, height);
-
-    /* Get the proper analyzer from the audio graph */
-    var analyzer = (channel == 0) ? analyzer_left : analyzer_right;
-    if (!analyzer || !get_global('enable_fft')) {
-      requestAnimationFrame(drawCurve);
-      return;
-    }
-
-    /* Draw decibel scale. */
-    for (var db = -96.0; db <= 0; db += 12) {
-      var y = height - (db + 96) * pixelsPerDb;
-      canvasContext.strokeStyle = curveColor;
-      canvasContext.strokeText(db.toFixed(0) + 'dB', 10, y);
-    }
-
-    /* Draw FFT */
-    analyzer.getFloatFrequencyData(data);
-    canvasContext.beginPath();
-    canvasContext.lineWidth = 1;
-    canvasContext.strokeStyle = curveColor;
-    canvasContext.moveTo(0, height);
-
-    var frequencyHz = new Float32Array(width);
-    for (var i = 0; i < binCount; ++i) {
-      var f = i / binCount;
-
-      /* Convert to log frequency scale (octaves). */
-      var noctaves = 10;
-      f = 1 + Math.log(f) / (noctaves * Math.LN2);
-
-      /* Draw the magnitude */
-      var x = f * width;
-      var y = height - (data[i] + 96) * pixelsPerDb;
-
-      canvasContext.lineTo(x, y);
-    }
-
-    canvasContext.stroke();
-    requestAnimationFrame(drawCurve);
-  }
-
-  function init() {
-    requestAnimationFrame(drawCurve);
-  }
-
-  this.init = init;
-}
-
-function dBToLinear(db) {
-  return Math.pow(10.0, 0.05 * db);
-}
-
-function linearToDb(x) {
-  return 20.0 * Math.log(x) / Math.LN10;
-}
diff --git a/scripts/audio_tuning/frontend/google_drive_picker.js b/scripts/audio_tuning/frontend/google_drive_picker.js
deleted file mode 100644
index 1a375de..0000000
--- a/scripts/audio_tuning/frontend/google_drive_picker.js
+++ /dev/null
@@ -1,83 +0,0 @@
-/* Copyright 2015 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-/* Client id obtained from API console credential page should be set before
- * running this script. */
-if (!CLIENT_ID) {
-  console.error.log('CLIENT_ID is not set');
-}
-
-/* Initialize a Google Drive picker after Google client API is loaded. */
-function onGoogleClientApiLoad() {
-  var picker = new Picker({
-      clientId: CLIENT_ID,
-      button: document.getElementById('google_drive_pick_file')
-  });
-}
-
-/* Initializes a Google Drive picker and loads drive API and picker API.*/
-var Picker = function(options) {
-  this.clientId = options.clientId;
-  this.button = options.button;
-  this.button.addEventListener('click', this.open.bind(this));
-
-  gapi.client.load('drive', 'v2');
-  gapi.load('picker', {callback: this.onPickerApiLoaded.bind(this) });
-}
-
-/* Enable the button after picker API is loaded. */
-Picker.prototype.onPickerApiLoaded = function() {
-  this.button.disabled = false;
-};
-
-/* Let user authenticate and show file picker. */
-Picker.prototype.open = function(){
-  if (gapi.auth.getToken()) {
-    this.showFilePicker();
-  } else {
-    this.authenticate(this.showFilePicker.bind(this));
-  }
-};
-
-/* Run authenticate using auth API. */
-Picker.prototype.authenticate = function(callback) {
-  gapi.auth.authorize(
-      {
-          client_id: this.clientId + '.apps.googleusercontent.com',
-          scope: 'https://www.googleapis.com/auth/drive.readonly',
-          immediate: false
-      },
-      callback);
-};
-
-/* Create a picker using picker API. */
-Picker.prototype.showFilePicker = function() {
-  var accessToken = gapi.auth.getToken().access_token;
-  this.picker = new google.picker.PickerBuilder().
-                addView(google.picker.ViewId.DOCS).
-                setAppId(this.clientId).
-                setOAuthToken(accessToken).
-                setCallback(this.onFilePicked.bind(this)).
-                build().
-                setVisible(true);
-};
-
-/* Request the file using drive API once a file is picked. */
-Picker.prototype.onFilePicked = function(data) {
-  if (data[google.picker.Response.ACTION] == google.picker.Action.PICKED) {
-    var file = data[google.picker.Response.DOCUMENTS][0];
-    var id = file[google.picker.Document.ID];
-    var request = gapi.client.drive.files.get({fileId: id});
-    request.execute(this.onFileGet.bind(this));
-  }
-};
-
-/* Retrieve the file URL and access token and set it as audio source. */
-Picker.prototype.onFileGet = function(file) {
-  var accessToken = gapi.auth.getToken().access_token;
-  var authedUrl = file.downloadUrl + "&access_token="
-      + encodeURIComponent(accessToken);
-  audio_source_set(authedUrl);
-};
diff --git a/scripts/audio_tuning/frontend/setup_credential.js b/scripts/audio_tuning/frontend/setup_credential.js
deleted file mode 100644
index 524b958..0000000
--- a/scripts/audio_tuning/frontend/setup_credential.js
+++ /dev/null
@@ -1,11 +0,0 @@
-/* Copyright 2015 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-/* Before deploying the project to the website, developer must
- * 1. Enable Google drive API in Google Developers Console.
- * 2. Set "JavaScript origins" and "Referers" in credential page.
- * 3. Fill in <API_KEY> and <CLIENT_ID> below from credential page. */
-document.write('<script src="https://www.google.com/jsapi?key=<API_KEY>" type="text/javascript"></script>');
-CLIENT_ID = '<CLIENT_ID>';
diff --git a/scripts/ini_editor.py b/scripts/ini_editor.py
deleted file mode 100755
index aeeaefb..0000000
--- a/scripts/ini_editor.py
+++ /dev/null
@@ -1,628 +0,0 @@
-#!/usr/bin/python
-#
-# Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""
-A script to modify dsp.ini config files.
-A dsp.ini config file is represented by an Ini object.
-An Ini object contains one or more Sections.
-Each Section has a name, a list of Ports, and a list of NonPorts.
-"""
-
-import argparse
-import logging
-import os
-import re
-import StringIO
-import sys
-from collections import namedtuple
-
-Parameter = namedtuple('Parameter', ['value', 'comment'])
-
-
-class Port(object):
-  """Class for port definition in ini file.
-
-  Properties:
-    io: "input" or "output".
-    index: an integer for port index.
-    definition: a string for the content after "=" in port definition line.
-    parameter: a Parameter namedtuple which is parsed from definition.
-  """
-  @staticmethod
-  def ParsePortLine(line):
-    """Parses a port definition line in ini file and init a Port object.
-
-    Args:
-      line: A string possibly containing port definition line like
-        "input_0=1;  something".
-
-    Returns:
-      A Port object if input is a valid port definition line. Returns
-      None if input is not a valid port definition line.
-    """
-    result = re.match(r'(input|output)_(\d+)=(.*)', line)
-    if result:
-      parse_values = result.groups()
-      io = parse_values[0]
-      index = int(parse_values[1])
-      definition = parse_values[2]
-      return Port(io, index, definition)
-    else:
-      return None
-
-  def __init__(self, io, index, definition):
-    """Initializes a port.
-
-    Initializes a port with io, index and definition. The definition will be
-    further parsed to Parameter(value, comment) if the format matches
-    "<some value> ; <some comment>".
-
-    Args:
-      io: "input" or "output".
-      index: an integer for port index.
-      definition: a string for the content after "=" in port definition line.
-    """
-    self.io = io
-    self.index = index
-    self.definition = definition
-    result = re.match(r'(\S+)\s+; (.+)', definition)
-    if result:
-      self.parameter = Parameter._make(result.groups())
-    else:
-      self.parameter = None
-
-  def FormatLine(self):
-    """Returns a port definition line which is used in ini file."""
-    line = '%s_%d=' % (self.io, self.index)
-    if self.parameter:
-      line +="{:<8}; {:}".format(self.parameter.value, self.parameter.comment)
-    else:
-      line += self.definition
-    return line
-
-  def _UpdateIndex(self, index):
-    """Updates index of this port.
-
-    Args:
-      index: The new index.
-    """
-    self.index = index
-
-
-class NonPort(object):
-  """Class for non-port definition in ini file.
-
-  Properties:
-    name: A string representing the non-port name.
-    definition: A string representing the non-port definition.
-  """
-  @staticmethod
-  def ParseNonPortLine(line):
-    """Parses a non-port definition line in ini file and init a NonPort object.
-
-    Args:
-      line: A string possibly containing non-port definition line like
-        "library=builtin".
-
-    Returns:
-      A NonPort object if input is a valid non-port definition line. Returns
-      None if input is not a valid non-port definition line.
-    """
-    result = re.match(r'(\w+)=(.*)', line)
-    if result:
-      parse_values = result.groups()
-      name = parse_values[0]
-      definition = parse_values[1]
-      return NonPort(name, definition)
-    else:
-      return None
-
-  def __init__(self, name, definition):
-    """Initializes a NonPort <name>=<definition>.
-
-    Args:
-      name: A string representing the non-port name.
-      definition: A string representing the non-port definition.
-    """
-    self.name = name
-    self.definition = definition
-
-  def FormatLine(self):
-    """Formats a string representation of a NonPort.
-
-    Returns:
-      A string "<name>=<definition>".
-    """
-    line = '%s=%s' % (self.name, self.definition)
-    return line
-
-
-class SectionException(Exception):
-  pass
-
-
-class Section(object):
-  """Class for section definition in ini file.
-
-  Properties:
-   name: Section name.
-   non_ports: A list containing NonPorts of this section.
-   ports: A list containing Ports of this section.
-  """
-  @staticmethod
-  def ParseSectionName(line):
-    """Parses a section name.
-
-    Args:
-      line: A string possibly containing a section name like [drc].
-
-    Returns:
-      Returns parsed section name without '[' and ']' if input matches
-      the syntax [<section name>]. Returns None if not.
-    """
-    result = re.match(r'\[(\w+)\]', line)
-    return result.groups()[0] if result else None
-
-  @staticmethod
-  def ParseLine(line):
-    """Parses a line that belongs to a section.
-
-    Returns:
-      A Port or NonPort object if input line matches the format. Returns None
-      if input line does not match the format of Port nor NonPort.
-    """
-    if not line:
-      return
-    parse_port = Port.ParsePortLine(line)
-    if parse_port:
-      return parse_port
-    parse_non_port = NonPort.ParseNonPortLine(line)
-    if parse_non_port:
-      return parse_non_port
-
-  def __init__(self, name):
-    """Initializes a Section with given name."""
-    self.name = name
-    self.non_ports= []
-    self.ports = []
-
-  def AddLine(self, line):
-    """Adds a line to this Section.
-
-    Args:
-      line: A line to be added to this section. If it matches port or non-port
-      format, a Port or NonPort will be added to this section. Otherwise,
-      this line is ignored.
-    """
-    to_add = Section.ParseLine(line)
-    if not to_add:
-      return
-    if isinstance(to_add, Port):
-      self.AppendPort(to_add)
-      return
-    if isinstance(to_add, NonPort):
-      self.AppendNonPort(to_add)
-      return
-
-  def AppendNonPort(self, non_port):
-    """Appends a NonPort to non_ports.
-
-    Args:
-      non_port: A NonPort object to be appended.
-    """
-    self.non_ports.append(non_port)
-
-  def AppendPort(self, port):
-    """Appends a Port to ports.
-
-    Args:
-      port: A Port object to be appended. The port should be appended
-      in the order of index, so the index of port should equal to the current
-      size of ports list.
-
-    Raises:
-      SectionException if the index of port is not the current size of ports
-      list.
-    """
-    if not port.index == len(self.ports):
-      raise SectionException(
-          'The port with index %r can not be appended to the end of ports'
-          ' of size' % (port.index, len(self.ports)))
-    else:
-      self.ports.append(port)
-
-  def InsertLine(self, line):
-    """Inserts a line to this section.
-
-    Inserts a line containing port or non-port definition to this section.
-    If input line matches Port or NonPort format, the corresponding insert
-    method InsertNonPort or InsertPort will be called. If input line does not
-    match the format, SectionException will be raised.
-
-    Args:
-      line: A line to be inserted. The line should
-
-    Raises:
-      SectionException if input line does not match the format of Port or
-      NonPort.
-    """
-    to_insert = Section.ParseLine(line)
-    if not to_insert:
-      raise SectionException(
-          'The line %s does not match Port or NonPort syntax' % line)
-    if isinstance(to_insert, Port):
-      self.InsertPort(to_insert)
-      return
-    if isinstance(to_insert, NonPort):
-      self.InsertNonPort(to_insert)
-      return
-
-  def InsertNonPort(self, non_port):
-    """Inserts a NonPort to non_ports list.
-
-    Currently there is no ordering for non-port definition. This method just
-    appends non_port to non_ports list.
-
-    Args:
-      non_port: A NonPort object.
-    """
-    self.non_ports.append(non_port)
-
-  def InsertPort(self, port):
-    """Inserts a Port to ports list.
-
-    The index of port should not be greater than the current size of ports.
-    After insertion, the index of each port in ports should be updated to the
-    new index of that port in the ports list.
-    E.g. Before insertion:
-    self.ports=[Port("input", 0, "foo0"),
-                Port("input", 1, "foo1"),
-                Port("output", 2, "foo2")]
-    Now we insert a Port with index 1 by invoking
-    InsertPort(Port("output, 1, "bar")),
-    Then,
-    self.ports=[Port("input", 0, "foo0"),
-                Port("output, 1, "bar"),
-                Port("input", 2, "foo1"),
-                Port("output", 3, "foo2")].
-    Note that the indices of foo1 and foo2 had been shifted by one because a
-    new port was inserted at index 1.
-
-    Args:
-      port: A Port object.
-
-    Raises:
-      SectionException: If the port to be inserted does not have a valid index.
-    """
-    if port.index > len(self.ports):
-      raise SectionException('Inserting port index %d but'
-          ' currently there are only %d ports' % (port.index,
-              len(self.ports)))
-
-    self.ports.insert(port.index, port)
-    self._UpdatePorts()
-
-  def _UpdatePorts(self):
-    """Updates the index property of each Port in ports.
-
-    Updates the index property of each Port in ports so the new index property
-    is the index of that Port in ports list.
-    """
-    for index, port in enumerate(self.ports):
-      port._UpdateIndex(index)
-
-  def Print(self, output):
-    """Prints the section definition to output.
-
-    The format is:
-    [section_name]
-    non_port_name_0=non_port_definition_0
-    non_port_name_1=non_port_definition_1
-    ...
-    port_name_0=port_definition_0
-    port_name_1=port_definition_1
-    ...
-
-    Args:
-      output: A StringIO.StringIO object.
-    """
-    output.write('[%s]\n' % self.name)
-    for non_port in self.non_ports:
-      output.write('%s\n' % non_port.FormatLine())
-    for port in self.ports:
-      output.write('%s\n' % port.FormatLine())
-
-
-class Ini(object):
-  """Class for an ini config file.
-
-  Properties:
-    sections: A dict containing mapping from section name to Section.
-    section_names: A list of section names.
-    file_path: The path of this ini config file.
-  """
-  def __init__(self, input_file):
-    """Initializes an Ini object from input config file.
-
-    Args:
-      input_file: The path to an ini config file.
-    """
-    self.sections = {}
-    self.section_names = []
-    self.file_path = input_file
-    self._ParseFromFile(input_file)
-
-  def _ParseFromFile(self, input_file):
-    """Parses sections in the input config file.
-
-    Reads in the content of the input config file and parses each sections.
-    The parsed sections are stored in sections dict.
-    The names of each section is stored in section_names list.
-
-    Args:
-      input_file: The path to an ini config file.
-    """
-    content = open(input_file, 'r').read()
-    content_lines = content.splitlines()
-    self.sections = {}
-    self.section_names = []
-    current_name = None
-    for line in content_lines:
-      name = Section.ParseSectionName(line)
-      if name:
-        self.section_names.append(name)
-        self.sections[name] = Section(name)
-        current_name = name
-      else:
-        self.sections[current_name].AddLine(line)
-
-  def Print(self, output_file=None):
-    """Prints all sections of this Ini object.
-
-    Args:
-      output_file: The path to write output. If this is not None, writes the
-        output to this path. Otherwise, just print the output to console.
-
-    Returns:
-      A StringIO.StringIO object containing output.
-    """
-    output = StringIO.StringIO()
-    for index, name in enumerate(self.section_names):
-      self.sections[name].Print(output)
-      if index < len(self.section_names) - 1:
-        output.write('\n')
-    if output_file:
-      with open(output_file, 'w') as f:
-        f.write(output.getvalue())
-        output.close()
-    else:
-      print output.getvalue()
-    return output
-
-  def HasSection(self, name):
-    """Checks if this Ini object has a section with certain name.
-
-    Args:
-      name: The name of the section.
-    """
-    return name in self.sections
-
-  def PrintSection(self, name):
-    """Prints a section to console.
-
-    Args:
-      name: The name of the section.
-
-    Returns:
-      A StringIO.StringIO object containing output.
-    """
-    output = StringIO.StringIO()
-    self.sections[name].Print(output)
-    output.write('\n')
-    print output.getvalue()
-    return output
-
-  def InsertLineToSection(self, name, line):
-    """Inserts a line to a section.
-
-    Args:
-      name: The name of the section.
-      line: A line to be inserted.
-    """
-    self.sections[name].InsertLine(line)
-
-
-def prompt(question, binary_answer=True):
-  """Displays the question to the user and wait for input.
-
-  Args:
-    question: The question to be displayed to user.
-    binary_answer: True to expect an yes/no answer from user.
-  Returns:
-    True/False if binary_answer is True. Otherwise, returns a string
-    containing user input to the question.
-  """
-
-  sys.stdout.write(question)
-  answer = raw_input()
-  if binary_answer:
-    answer = answer.lower()
-    if answer in ['y', 'yes']:
-      return True
-    elif answer in ['n', 'no']:
-      return False
-    else:
-      return prompt(question)
-  else:
-    return answer
-
-
-class IniEditorException(Exception):
-  pass
-
-
-class IniEditor(object):
-  """The class for ini file editing command line interface.
-
-  Properties:
-    input_files: The files to be edited. Note that the same editing command
-      can be applied on many config files.
-    args: The result of ArgumentParser.parse_args method. It is an object
-      containing args as attributes.
-  """
-  def __init__(self):
-    self.input_files = []
-    self.args = None
-
-  def Main(self):
-    """The main method of IniEditor.
-
-    Parses the arguments and processes files according to the arguments.
-    """
-    self.ParseArgs()
-    self.ProcessFiles()
-
-  def ParseArgs(self):
-    """Parses the arguments from command line.
-
-    Parses the arguments from command line to determine input_files.
-    Also, checks the arguments are valid.
-
-    Raises:
-      IniEditorException if arguments are not valid.
-    """
-    parser = argparse.ArgumentParser(
-        description=('Edit or show the config files'))
-    parser.add_argument('--input_file', '-i', default=None,
-                        help='Use the specified file as input file. If this '
-                             'is not given, the editor will try to find config '
-                             'files using config_dirs and board.')
-    parser.add_argument('--config_dirs', '-c',
-                        default='~/trunk/src/third_party/adhd/cras-config',
-                        help='Config directory. By default it is '
-                             '~/trunk/src/third_party/adhd/cras-config.')
-    parser.add_argument('--board', '-b', default=None, nargs='*',
-                        help='The boards to apply the changes. Use "all" '
-                             'to apply on all boards. '
-                             'Use --board <board_1> <board_2> to specify more '
-                             'than one boards')
-    parser.add_argument('--section', '-s', default=None,
-                        help='The section to be shown/edited in the ini file.')
-    parser.add_argument('--insert', '-n', default=None,
-                        help='The line to be inserted into the ini file. '
-                             'Must be used with --section.')
-    parser.add_argument('--output-suffix', '-o', default='.new',
-                        help='The output file suffix. Set it to "None" if you '
-                             'want to apply the changes in-place.')
-    self.args = parser.parse_args()
-
-    # If input file is given, just edit this file.
-    if self.args.input_file:
-      self.input_files.append(self.args.input_file)
-    # Otherwise, try to find config files in board directories of config
-    # directory.
-    else:
-      if self.args.config_dirs.startswith('~'):
-        self.args.config_dirs = os.path.join(
-            os.path.expanduser('~'),
-            self.args.config_dirs.split('~/')[1])
-      all_boards = os.walk(self.args.config_dirs).next()[1]
-      # "board" argument must be a valid board name or "all".
-      if (not self.args.board or
-          (self.args.board != ['all'] and
-           not set(self.args.board).issubset(set(all_boards)))):
-        logging.error('Please select a board from %s or use "all".' % (
-            ', '.join(all_boards)))
-        raise IniEditorException('User must specify board if input_file '
-                                 'is not given.')
-      if self.args.board == ['all']:
-        logging.info('Applying on all boards.')
-        boards = all_boards
-      else:
-        boards = self.args.board
-
-      self.input_files = []
-      # Finds dsp.ini files in candidate boards directories.
-      for board in boards:
-        ini_file = os.path.join(self.args.config_dirs, board, 'dsp.ini')
-        if os.path.exists(ini_file):
-          self.input_files.append(ini_file)
-
-    if self.args.insert and not self.args.section:
-      raise IniEditorException('--insert must be used with --section')
-
-  def ProcessFiles(self):
-    """Processes the config files in input_files.
-
-    Showes or edits every selected config file.
-    """
-    for input_file in self.input_files:
-      logging.info('Looking at dsp.ini file at %s', input_file)
-      ini = Ini(input_file)
-      if self.args.insert:
-        self.InsertCommand(ini)
-      else:
-        self.PrintCommand(ini)
-
-  def PrintCommand(self, ini):
-    """Prints this Ini object.
-
-    Prints all sections or a section in input Ini object if
-    args.section is specified and there is such section in this Ini object.
-
-    Args:
-      ini: An Ini object.
-    """
-    if self.args.section:
-      if ini.HasSection(self.args.section):
-        logging.info('Printing section %s.', self.args.section)
-        ini.PrintSection(self.args.section)
-      else:
-        logging.info('There is no section %s in %s',
-                     self.args.section, ini.file_path)
-    else:
-      logging.info('Printing ini content.')
-      ini.Print()
-
-  def InsertCommand(self, ini):
-    """Processes insertion editing on Ini object.
-
-    Inserts args.insert to section named args.section in input Ini object.
-    If input Ini object does not have a section named args.section, this method
-    does not do anything. If the editing is valid, prints the changed section
-    to console. Writes the editied config file to the same path as input path
-    plus a suffix speficied in args.output_suffix. If that suffix is "None",
-    prompts and waits for user to confirm editing in-place.
-
-    Args:
-      ini: An Ini object.
-    """
-    if not ini.HasSection(self.args.section):
-      logging.info('There is no section %s in %s',
-                   self.args.section, ini.file_path)
-      return
-
-    ini.InsertLineToSection(self.args.section, self.args.insert)
-    logging.info('Changed section:')
-    ini.PrintSection(self.args.section)
-
-    if self.args.output_suffix == 'None':
-      answer = prompt(
-          'Writing output file in-place at %s ? [y/n]' % ini.file_path)
-      if not answer:
-        sys.exit('Abort!')
-      output_file = ini.file_path
-    else:
-      output_file = ini.file_path + self.args.output_suffix
-      logging.info('Writing output file to : %s.', output_file)
-    ini.Print(output_file)
-
-
-if __name__ == '__main__':
-  logging.basicConfig(
-     format='%(asctime)s:%(levelname)s:%(filename)s:%(lineno)d:%(message)s',
-     level=logging.DEBUG)
-  IniEditor().Main()
diff --git a/scripts/ini_editor_unittest.py b/scripts/ini_editor_unittest.py
deleted file mode 100755
index b953c14..0000000
--- a/scripts/ini_editor_unittest.py
+++ /dev/null
@@ -1,145 +0,0 @@
-#!/usr/bin/env python
-# Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-
-"""Unittest for ini_editor.py."""
-
-
-import logging
-import os
-import re
-import tempfile
-import unittest
-
-from ini_editor import Ini
-
-SAMPLE_INI="""\
-[output_source]
-library=builtin
-label=source
-purpose=playback
-disable=(equal? output_jack "HDMI")
-output_0={src:0}
-output_1={src:1}
-
-[output_sink]
-library=builtin
-label=sink
-purpose=playback
-disable=(equal? output_jack "HDMI")
-input_0={dst:0}
-input_1={dst:1}
-
-[drc]
-library=builtin
-label=drc
-input_0={src:0}
-input_1={src:1}
-output_2={intermediate:0}
-output_3={intermediate:1}
-input_4=0       ; f
-input_5=0       ; enable
-input_6=-29     ; threshold
-input_7=3       ; knee
-input_8=6.677   ; ratio
-input_9=0.02    ; attack
-input_10=0.2     ; release
-input_11=-7      ; boost
-
-[eq2]
-library=builtin
-label=eq2
-input_0={intermediate:0}
-input_1={intermediate:1}
-output_2={dst:0}
-output_3={dst:1}
-input_4=6       ; peaking
-input_5=380     ; freq
-input_6=3       ; Q
-input_7=-10     ; gain
-input_8=6       ; peaking
-input_9=450     ; freq
-input_10=3       ; Q
-input_11=-12     ; gain
-"""
-
-SAMPLE_INI_DRC="""\
-[drc]
-library=builtin
-label=drc
-input_0={src:0}
-input_1={src:1}
-output_2={intermediate:0}
-output_3={intermediate:1}
-input_4=0       ; f
-input_5=0       ; enable
-input_6=-29     ; threshold
-input_7=3       ; knee
-input_8=6.677   ; ratio
-input_9=0.02    ; attack
-input_10=0.2     ; release
-input_11=-7      ; boost
-
-"""
-
-SAMPLE_INI_DRC_INSERTED="""\
-[drc]
-library=builtin
-label=drc
-input_0={src:0}
-input_1={src:1}
-output_2={intermediate:0}
-output_3={intermediate:1}
-input_4=1       ; new_parameter
-input_5=0       ; f
-input_6=0       ; enable
-input_7=-29     ; threshold
-input_8=3       ; knee
-input_9=6.677   ; ratio
-input_10=0.02    ; attack
-input_11=0.2     ; release
-input_12=-7      ; boost
-
-"""
-
-
-class IniTest(unittest.TestCase):
-  """Unittest for Ini class."""
-  def setUp(self):
-    self.ini_file = tempfile.NamedTemporaryFile(prefix='ini_editor_unittest')
-    with open(self.ini_file.name, 'w') as f:
-      f.write(SAMPLE_INI)
-    self.ini = Ini(self.ini_file.name)
-
-  def tearDown(self):
-    self.ini_file.close()
-
-  def testPrint(self):
-    """Unittest for Print method of Ini class."""
-    output = self.ini.Print()
-    self.assertEqual(output.getvalue(), SAMPLE_INI)
-
-  def testHasSection(self):
-    """Unittest for HasSection method of Ini class."""
-    self.assertTrue(self.ini.HasSection('drc'))
-    self.assertFalse(self.ini.HasSection('eq1'))
-
-  def testPrintSection(self):
-    """Unittest for PrintSection method of Ini class."""
-    output = self.ini.PrintSection('drc')
-    self.assertEqual(output.getvalue(), SAMPLE_INI_DRC)
-
-  def testInsertLineToSection(self):
-    """Unittest for InsertLineToSection method of Ini class."""
-    self.ini.InsertLineToSection('drc', 'input_4=1       ; new_parameter')
-    output = self.ini.PrintSection('drc')
-    self.assertEqual(output.getvalue(), SAMPLE_INI_DRC_INSERTED)
-
-
-if __name__ == '__main__':
-  logging.basicConfig(
-     format='%(asctime)s:%(levelname)s:%(filename)s:%(lineno)d:%(message)s',
-     level=logging.DEBUG)
-  unittest.main()
diff --git a/scripts/mic_testing/frontend/LICENSE b/scripts/mic_testing/frontend/LICENSE
deleted file mode 100644
index 0aa7fc9..0000000
--- a/scripts/mic_testing/frontend/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (c) 2006-2009 The Chromium OS Authors. All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//    * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-//    * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-//    * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/scripts/mic_testing/frontend/analysis.js b/scripts/mic_testing/frontend/analysis.js
deleted file mode 100644
index 871c764..0000000
--- a/scripts/mic_testing/frontend/analysis.js
+++ /dev/null
@@ -1,485 +0,0 @@
-/*
- * Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-/**
- * Gets a random color
- */
-function getRandomColor() {
-  var letters = '0123456789ABCDEF'.split('');
-  var color = '#';
-  for (var i = 0; i < 6; i++) {
-    color += letters[Math.floor(Math.random() * 16)];
-  }
-  return color;
-}
-
-/**
- * Audio channel class
- */
-var AudioChannel = function(buffer) {
-  this.init = function(buffer) {
-    this.buffer = buffer;
-    this.fftBuffer = this.toFFT(this.buffer);
-    this.curveColor = getRandomColor();
-    this.visible = true;
-  }
-
-  this.toFFT = function(buffer) {
-    var k = Math.ceil(Math.log(buffer.length) / Math.LN2);
-    var length = Math.pow(2, k);
-    var tmpBuffer = new Float32Array(length);
-
-    for (var i = 0; i < buffer.length; i++) {
-      tmpBuffer[i] = buffer[i];
-    }
-    for (var i = buffer.length; i < length; i++) {
-      tmpBuffer[i] = 0;
-    }
-    var fft = new FFT(length);
-    fft.forward(tmpBuffer);
-    return fft.spectrum;
-  }
-
-  this.init(buffer);
-}
-
-window.AudioChannel = AudioChannel;
-
-var numberOfCurve = 0;
-
-/**
- * Audio curve class
- */
-var AudioCurve = function(buffers, filename, sampleRate) {
-  this.init = function(buffers, filename) {
-    this.filename = filename;
-    this.id = numberOfCurve++;
-    this.sampleRate = sampleRate;
-    this.channel = [];
-    for (var i = 0; i < buffers.length; i++) {
-      this.channel.push(new AudioChannel(buffers[i]));
-    }
-  }
-  this.init(buffers, filename);
-}
-
-window.AudioCurve = AudioCurve;
-
-/**
- * Draw frequency response of curves on the canvas
- * @param {canvas} HTML canvas element to draw frequency response
- * @param {int} Nyquist frequency, in Hz
- */
-var DrawCanvas = function(canvas, nyquist) {
-  var HTML_TABLE_ROW_OFFSET = 2;
-  var topMargin = 30;
-  var leftMargin = 40;
-  var downMargin = 10;
-  var rightMargin = 30;
-  var width = canvas.width - leftMargin - rightMargin;
-  var height = canvas.height - topMargin - downMargin;
-  var canvasContext = canvas.getContext('2d');
-  var pixelsPerDb = height / 96.0;
-  var noctaves = 10;
-  var curveBuffer = [];
-
-  findId = function(id) {
-    for (var i = 0; i < curveBuffer.length; i++)
-      if (curveBuffer[i].id == id)
-        return i;
-    return -1;
-  }
-
-  /**
-   * Adds curve on the canvas
-   * @param {AudioCurve} audio curve object
-   */
-  this.add = function(audioCurve) {
-    curveBuffer.push(audioCurve);
-    addTableList();
-    this.drawCanvas();
-  }
-
-  /**
-   * Removes curve from the canvas
-   * @param {int} curve index
-   */
-  this.remove = function(id) {
-    var index = findId(id);
-    if (index != -1) {
-      curveBuffer.splice(index, 1);
-      removeTableList(index);
-      this.drawCanvas();
-    }
-  }
-
-  removeTableList = function(index) {
-    var table = document.getElementById('curve_table');
-    table.deleteRow(index + HTML_TABLE_ROW_OFFSET);
-  }
-
-  addTableList = function() {
-    var table = document.getElementById('curve_table');
-    var index = table.rows.length - HTML_TABLE_ROW_OFFSET;
-    var curve_id = curveBuffer[index].id;
-    var tr = table.insertRow(table.rows.length);
-    var tdCheckbox = tr.insertCell(0);
-    var tdFile = tr.insertCell(1);
-    var tdLeft = tr.insertCell(2);
-    var tdRight = tr.insertCell(3);
-    var tdRemove = tr.insertCell(4);
-
-    var checkbox = document.createElement('input');
-    checkbox.setAttribute('type', 'checkbox');
-    checkbox.checked = true;
-    checkbox.onclick = function() {
-      setCurveVisible(checkbox, curve_id, 'all');
-    }
-    tdCheckbox.appendChild(checkbox);
-    tdFile.innerHTML = curveBuffer[index].filename;
-
-    var checkLeft = document.createElement('input');
-    checkLeft.setAttribute('type', 'checkbox');
-    checkLeft.checked = true;
-    checkLeft.onclick = function() {
-      setCurveVisible(checkLeft, curve_id, 0);
-    }
-    tdLeft.bgColor = curveBuffer[index].channel[0].curveColor;
-    tdLeft.appendChild(checkLeft);
-
-    if (curveBuffer[index].channel.length > 1) {
-      var checkRight = document.createElement('input');
-      checkRight.setAttribute('type', 'checkbox');
-      checkRight.checked = true;
-      checkRight.onclick = function() {
-        setCurveVisible(checkRight, curve_id, 1);
-      }
-      tdRight.bgColor = curveBuffer[index].channel[1].curveColor;
-      tdRight.appendChild(checkRight);
-    }
-
-    var btnRemove = document.createElement('input');
-    btnRemove.setAttribute('type', 'button');
-    btnRemove.value = 'Remove';
-    btnRemove.onclick = function() { removeCurve(curve_id); }
-    tdRemove.appendChild(btnRemove);
-  }
-
-  /**
-   * Sets visibility of curves
-   * @param {boolean} visible or not
-   * @param {int} curve index
-   * @param {int,string} channel index.
-   */
-  this.setVisible = function(checkbox, id, channel) {
-    var index = findId(id);
-    if (channel == 'all') {
-      for (var i = 0; i < curveBuffer[index].channel.length; i++) {
-        curveBuffer[index].channel[i].visible = checkbox.checked;
-      }
-    } else if (channel == 0 || channel == 1) {
-      curveBuffer[index].channel[channel].visible = checkbox.checked;
-    }
-    this.drawCanvas();
-  }
-
-  /**
-   * Draws canvas background
-   */
-  this.drawBg = function() {
-    var gridColor = 'rgb(200,200,200)';
-    var textColor = 'rgb(238,221,130)';
-
-    /* Draw the background */
-    canvasContext.fillStyle = 'rgb(0, 0, 0)';
-    canvasContext.fillRect(0, 0, canvas.width, canvas.height);
-
-    /* Draw frequency scale. */
-    canvasContext.beginPath();
-    canvasContext.lineWidth = 1;
-    canvasContext.strokeStyle = gridColor;
-
-    for (var octave = 0; octave <= noctaves; octave++) {
-      var x = octave * width / noctaves + leftMargin;
-
-      canvasContext.moveTo(x, topMargin);
-      canvasContext.lineTo(x, topMargin + height);
-      canvasContext.stroke();
-
-      var f = nyquist * Math.pow(2.0, octave - noctaves);
-      canvasContext.textAlign = 'center';
-      canvasContext.strokeText(f.toFixed(0) + 'Hz', x, 20);
-    }
-
-    /* Draw 0dB line. */
-    canvasContext.beginPath();
-    canvasContext.moveTo(leftMargin, topMargin + 0.5 * height);
-    canvasContext.lineTo(leftMargin + width, topMargin + 0.5 * height);
-    canvasContext.stroke();
-
-    /* Draw decibel scale. */
-    for (var db = -96.0; db <= 0; db += 12) {
-      var y = topMargin + height - (db + 96) * pixelsPerDb;
-      canvasContext.beginPath();
-      canvasContext.setLineDash([1, 4]);
-      canvasContext.moveTo(leftMargin, y);
-      canvasContext.lineTo(leftMargin + width, y);
-      canvasContext.stroke();
-      canvasContext.setLineDash([]);
-      canvasContext.strokeStyle = textColor;
-      canvasContext.strokeText(db.toFixed(0) + 'dB', 20, y);
-      canvasContext.strokeStyle = gridColor;
-    }
-  }
-
-  /**
-   * Draws a channel of a curve
-   * @param {Float32Array} fft buffer of a channel
-   * @param {string} curve color
-   * @param {int} sample rate
-   */
-  this.drawCurve = function(buffer, curveColor, sampleRate) {
-    canvasContext.beginPath();
-    canvasContext.lineWidth = 1;
-    canvasContext.strokeStyle = curveColor;
-    canvasContext.moveTo(leftMargin, topMargin + height);
-
-    for (var i = 0; i < buffer.length; ++i) {
-      var f = i * sampleRate / 2 / nyquist / buffer.length;
-
-      /* Convert to log frequency scale (octaves). */
-      f = 1 + Math.log(f) / (noctaves * Math.LN2);
-      if (f < 0) { continue; }
-      /* Draw the magnitude */
-      var x = f * width + leftMargin;
-      var value = Math.max(20 * Math.log(buffer[i]) / Math.LN10, -96);
-      var y = topMargin + height - ((value + 96) * pixelsPerDb);
-
-      canvasContext.lineTo(x, y);
-    }
-    canvasContext.stroke();
-  }
-
-  /**
-   * Draws all curves
-   */
-  this.drawCanvas = function() {
-    this.drawBg();
-    for (var i = 0; i < curveBuffer.length; i++) {
-      for (var j = 0; j < curveBuffer[i].channel.length; j++) {
-        if (curveBuffer[i].channel[j].visible) {
-          this.drawCurve(curveBuffer[i].channel[j].fftBuffer,
-                         curveBuffer[i].channel[j].curveColor,
-                         curveBuffer[i].sampleRate);
-        }
-      }
-    }
-  }
-
-  /**
-   * Draws current buffer
-   * @param {Float32Array} left channel buffer
-   * @param {Float32Array} right channel buffer
-   * @param {int} sample rate
-   */
-  this.drawInstantCurve = function(leftData, rightData, sampleRate) {
-    this.drawBg();
-    var fftLeft = new FFT(leftData.length);
-    fftLeft.forward(leftData);
-    var fftRight = new FFT(rightData.length);
-    fftRight.forward(rightData);
-    this.drawCurve(fftLeft.spectrum, "#FF0000", sampleRate);
-    this.drawCurve(fftRight.spectrum, "#00FF00", sampleRate);
-  }
-
-  exportCurveByFreq = function(freqList) {
-    function calcIndex(freq, length, sampleRate) {
-      var idx = parseInt(freq * length * 2 / sampleRate);
-      return Math.min(idx, length - 1);
-    }
-    /* header */
-    channelName = ['L', 'R'];
-    cvsString = 'freq';
-    for (var i = 0; i < curveBuffer.length; i++) {
-      for (var j = 0; j < curveBuffer[i].channel.length; j++) {
-        cvsString += ',' + curveBuffer[i].filename + '_' + channelName[j];
-      }
-    }
-    for (var i = 0; i < freqList.length; i++) {
-      cvsString += '\n' + freqList[i];
-      for (var j = 0; j < curveBuffer.length; j++) {
-        var curve = curveBuffer[j];
-        for (var k = 0; k < curve.channel.length; k++) {
-          var fftBuffer = curve.channel[k].fftBuffer;
-          var prevIdx = (i - 1 < 0) ? 0 :
-              calcIndex(freqList[i - 1], fftBuffer.length, curve.sampleRate);
-          var currIdx = calcIndex(
-              freqList[i], fftBuffer.length, curve.sampleRate);
-
-          var sum = 0;
-          for (var l = prevIdx; l <= currIdx; l++) { // Get average
-            var value = 20 * Math.log(fftBuffer[l]) / Math.LN10;
-            sum += value;
-          }
-          cvsString += ',' + sum / (currIdx - prevIdx + 1);
-        }
-      }
-    }
-    return cvsString;
-  }
-
-  /**
-   * Exports frequency response of curves into CSV format
-   * @param {int} point number in octaves
-   * @return {string} a string with CSV format
-   */
-  this.exportCurve = function(nInOctaves) {
-    var freqList= [];
-    for (var i = 0; i < noctaves; i++) {
-      var fStart = nyquist * Math.pow(2.0, i - noctaves);
-      var fEnd = nyquist * Math.pow(2.0, i + 1 - noctaves);
-      var powerStart = Math.log(fStart) / Math.LN2;
-      var powerEnd = Math.log(fEnd) / Math.LN2;
-      for (var j = 0; j < nInOctaves; j++) {
-        f = Math.pow(2,
-            powerStart + j * (powerEnd - powerStart) / nInOctaves);
-        freqList.push(f);
-      }
-    }
-    freqList.push(nyquist);
-    return exportCurveByFreq(freqList);
-  }
-}
-
-window.DrawCanvas = DrawCanvas;
-
-/**
- * FFT is a class for calculating the Discrete Fourier Transform of a signal
- * with the Fast Fourier Transform algorithm.
- *
- * @param {Number} bufferSize The size of the sample buffer to be computed.
- * Must be power of 2
- * @constructor
- */
-function FFT(bufferSize) {
-  this.bufferSize = bufferSize;
-  this.spectrum   = new Float32Array(bufferSize/2);
-  this.real       = new Float32Array(bufferSize);
-  this.imag       = new Float32Array(bufferSize);
-
-  this.reverseTable = new Uint32Array(bufferSize);
-  this.sinTable = new Float32Array(bufferSize);
-  this.cosTable = new Float32Array(bufferSize);
-
-  var limit = 1;
-  var bit = bufferSize >> 1;
-  var i;
-
-  while (limit < bufferSize) {
-    for (i = 0; i < limit; i++) {
-      this.reverseTable[i + limit] = this.reverseTable[i] + bit;
-    }
-
-    limit = limit << 1;
-    bit = bit >> 1;
-  }
-
-  for (i = 0; i < bufferSize; i++) {
-    this.sinTable[i] = Math.sin(-Math.PI/i);
-    this.cosTable[i] = Math.cos(-Math.PI/i);
-  }
-}
-
-/**
- * Performs a forward transform on the sample buffer.
- * Converts a time domain signal to frequency domain spectra.
- *
- * @param {Array} buffer The sample buffer. Buffer Length must be power of 2
- * @returns The frequency spectrum array
- */
-FFT.prototype.forward = function(buffer) {
-  var bufferSize      = this.bufferSize,
-      cosTable        = this.cosTable,
-      sinTable        = this.sinTable,
-      reverseTable    = this.reverseTable,
-      real            = this.real,
-      imag            = this.imag,
-      spectrum        = this.spectrum;
-
-  var k = Math.floor(Math.log(bufferSize) / Math.LN2);
-
-  if (Math.pow(2, k) !== bufferSize) {
-    throw "Invalid buffer size, must be a power of 2.";
-  }
-  if (bufferSize !== buffer.length) {
-    throw "Supplied buffer is not the same size as defined FFT. FFT Size: "
-        + bufferSize + " Buffer Size: " + buffer.length;
-  }
-
-  var halfSize = 1,
-      phaseShiftStepReal,
-      phaseShiftStepImag,
-      currentPhaseShiftReal,
-      currentPhaseShiftImag,
-      off,
-      tr,
-      ti,
-      tmpReal,
-      i;
-
-  for (i = 0; i < bufferSize; i++) {
-    real[i] = buffer[reverseTable[i]];
-    imag[i] = 0;
-  }
-
-  while (halfSize < bufferSize) {
-    phaseShiftStepReal = cosTable[halfSize];
-    phaseShiftStepImag = sinTable[halfSize];
-
-    currentPhaseShiftReal = 1.0;
-    currentPhaseShiftImag = 0.0;
-
-    for (var fftStep = 0; fftStep < halfSize; fftStep++) {
-      i = fftStep;
-
-      while (i < bufferSize) {
-        off = i + halfSize;
-        tr = (currentPhaseShiftReal * real[off]) -
-            (currentPhaseShiftImag * imag[off]);
-        ti = (currentPhaseShiftReal * imag[off]) +
-            (currentPhaseShiftImag * real[off]);
-        real[off] = real[i] - tr;
-        imag[off] = imag[i] - ti;
-        real[i] += tr;
-        imag[i] += ti;
-
-        i += halfSize << 1;
-      }
-
-      tmpReal = currentPhaseShiftReal;
-      currentPhaseShiftReal = (tmpReal * phaseShiftStepReal) -
-          (currentPhaseShiftImag * phaseShiftStepImag);
-      currentPhaseShiftImag = (tmpReal * phaseShiftStepImag) +
-          (currentPhaseShiftImag * phaseShiftStepReal);
-    }
-
-    halfSize = halfSize << 1;
-  }
-
-  i = bufferSize / 2;
-  while(i--) {
-    spectrum[i] = 2 * Math.sqrt(real[i] * real[i] + imag[i] * imag[i]) /
-        bufferSize;
-  }
-};
-
-function setCurveVisible(checkbox, id, channel) {
-  drawContext.setVisible(checkbox, id, channel);
-}
-
-function removeCurve(id) {
-  drawContext.remove(id);
-}
diff --git a/scripts/mic_testing/frontend/app.yaml b/scripts/mic_testing/frontend/app.yaml
deleted file mode 100644
index 723472e..0000000
--- a/scripts/mic_testing/frontend/app.yaml
+++ /dev/null
@@ -1,30 +0,0 @@
-application: mic-testing
-version: 1
-runtime: python27
-api_version: 1
-threadsafe: true
-
-handlers:
-- url: /(.*\.css)
-  mime_type: text/css
-  static_files: \1
-  upload: (.*\.css)
-
-- url: /(.*\.html)
-  mime_type: text/html
-  static_files: \1
-  upload: (.*\.html)
-
-- url: /(.*\.js)
-  mime_type: text/javascript
-  static_files: \1
-  upload: (.*\.js)
-
-- url: /(LICENSE)
-  mime_type: text/plain
-  static_files: \1
-  upload: (LICENSE)
-
-- url: /
-  static_files: audio.html
-  upload: audio.html
diff --git a/scripts/mic_testing/frontend/audio.css b/scripts/mic_testing/frontend/audio.css
deleted file mode 100644
index 9bd2adc..0000000
--- a/scripts/mic_testing/frontend/audio.css
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-ul {
-  margin: 0;
-  padding: 0;
-}
-
-li {
-  list-style-type: none;
-}
-
-.tab-page {
-  display: table;
-  table-layout: fixed;
-  text-align: center;
-  width: 100%;
-}
-
-.tab-page li {
-  display: table-cell;
-  padding-right: 1px;
-  height: auto;
-  vertical-align: bottom;
-}
-
-.tab-page a {
-  font-size: x-large;
-  font-weight: bold;
-  display: block;
-  min-height: 100%;
-  padding: 4px 10px;
-  background-color: #FFFFFF;
-  color: black;
-  border-radius: 6px 6px 0 0;
-  border: 1px solid black;
-}
-
-.tab-page li.selected a {
-  font-size: x-large;
-  font-weight: bold;
-  display: block;
-  min-height: 100%;
-  padding: 4px 10px;
-  background-color: #FFFFFF;
-  color: black;
-  border-radius: 6px 6px 0 0;
-  border: 1px solid black;
-  border-bottom: none;
-}
-
-body {
-  text-align: center;
-}
-
-td {
-  text-align: center;
-  vertical-align: middle;
-}
-
-.btn-on-text {
-  display: none;
-}
-
-.btn-off-text {
-  display: none;
-}
-
-.btn-on .btn-on-text {
-  display: block;
-  font-size: large;
-}
-
-.btn-off .btn-off-text {
-  display: block;
-  font-size: large;
-}
-
-.tonegen-vol-cell input {
-  width: 20px;
-  height: 120px;
-  -webkit-appearance: slider-vertical;
-}
-
-.tonegen-vol-cell {
-  width: 15%;
-}
-
-.tonegen-main-cell {
-  width: 80%;
-  text-align: center;
-  vertical-align: middle;
-}
-
-.sweep_tone {
-  display: block;
-  text-align: center;
-  vertical-align: middle;
-}
-
-.canvas_detail {
-  vertical-align:top;
-  display: none;
-}
diff --git a/scripts/mic_testing/frontend/audio.html b/scripts/mic_testing/frontend/audio.html
deleted file mode 100644
index 39759f2..0000000
--- a/scripts/mic_testing/frontend/audio.html
+++ /dev/null
@@ -1,184 +0,0 @@
-<!-- Copyright (c) 2014 The Chromium OS Authors. All rights reserved. -->
-<!-- Use of this source code is governed by a BSD-style license that can be -->
-<!-- found in the LICENSE file. -->
-
-<html>
-  <head>
-    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-    <title>Audio Quality Test</title>
-    <script type="text/javascript" src="audio.js"></script>
-    <script type="text/javascript" src="source.js"></script>
-    <script type="text/javascript" src="recorder.js"></script>
-    <script type="text/javascript" src="analysis.js"></script>
-    <link rel="stylesheet" type="text/css" href="audio.css">
-  </head>
-  <body>
-    <ul class="tab-page">
-      <li id="play_tab" onclick="switchTab('play_tab')" class="selected"><a>Play</a></li>
-      <li id="record_tab" onclick="switchTab('record_tab')"><a>Record</a></li>
-    </ul>
-    <div id="play_div">
-      <h1>Audio Source</h1>
-      <input type="radio" name="audio_source" value="sine"
-          onclick="setupSourceLayer('sine')"> Sine Tone
-      <input type="radio" name="audio_source" value="sweep"
-          onclick="setupSourceLayer('sweep')" checked> Sweep Tone
-      <input type="radio" name="audio_source" value="file"
-          onclick="setupSourceLayer('file')"> Load from file
-      <br>
-      <br>
-      <div id="source_layer" align="center">
-        <div id="source_tone">
-          <table style="width: 50%;">
-            <tr>
-              <td class="tonegen-main-cell">
-                <table style="width: 100%;">
-                  <tr>
-                    <td width="50%">Frequency: (20 Hz ~ SampleRate / 2)</td>
-                    <td width="30%">Duration</td>
-                    <td class="sweep_tone">Log</td>
-                  </tr>
-                  <tr>
-                    <td>
-                      <input type="text" id="freq_start" size=5 maxlength=5 value=1000> Hz
-                      <div class="sweep_tone">
-                        <input type="text" id="freq_end" size=5 maxlength=5 value=1000> Hz
-                      </div>
-                    </td>
-                    <td>
-                      <input type="text" id="tone_sec" size=5 maxlength=5 value=3> Seconds
-                    </td>
-                    <td class="sweep_tone">
-                      <input type="checkbox" id="sweep_log">
-                    </td>
-                  </tr>
-                </table>
-              </td>
-              <td class="tonegen-vol-cell">
-                <input type="range" min="0" max="20" value="20" id="left_gain"
-                    onchange="gainChanged();"/>
-                <input type="range" min="0" max="20" value="20" id="right_gain"
-                    onchange="gainChanged();"/>
-                <br>
-                <div id="gain_label">
-                  L(20) / R(20)
-                </div>
-              </td>
-            </tr>
-          </table>
-        </div>
-        <div id="source_file">
-          <input type="button" value="Local Audio File" onclick="loadAudioFile()"
-              style="font-size: large;">
-          <br><br>
-          <div style="display:none">
-            <input type=file id=audio_file onchange="changeAudioFile()">
-          </div>
-        </div>
-      </div>
-      <hr>
-      <input type="checkbox" id="append_tone" checked> Append 1K Hz start tone and end tone
-      <br><br>
-      <button id="play_audio" class="btn-off" onclick="playAudioFile()">
-        <div>
-          <span class="btn-off-text">Play</span>
-          <span class="btn-on-text">Stop Play</span>
-        </div>
-      </button>
-    </div>
-    <div id="record_div" style="display: none;">
-      <h1> Record Samples </h1>
-      <input type="radio" name="record_source" value="audio_source"
-          onclick="setupRecordSource('audio')">
-      Play Audio Source
-      <input type="radio" name="record_source" value="microphone" checked
-          onclick="setupRecordSource('microphone')">
-      Microphone
-      <br><br>
-      <input type="checkbox" id="detect_tone" checked> Detect 1K Hz start tone and end tone
-      <input type="checkbox" id="auto_stop" checked> Auto stop when detected 1K Hz end tone
-      <br><br>
-      <button id="record_btn" class="btn-off" onclick="recordButtonClicked()">
-        <div>
-          <span class="btn-off-text">Start Record</span>
-          <span class="btn-on-text">Stop Record</span>
-        </div>
-      </button>
-      <br><hr>
-      <table align="center">
-        <tr>
-          <td>
-            <div style="overflow:auto; max-height: 250px;">
-              <table id="record_list" align="center">
-              </table>
-            </div>
-          </td>
-        </tr>
-      </table>
-
-    </div>
-
-    <h1> Frequency Response </h1>
-    <table align="center">
-      <tr>
-        <td width=800>
-          <div id="curve_section">
-            <canvas id='fr_canvas' width=800 height=300>
-          </div>
-        </td>
-        <td width=400 height=300 class="canvas_detail">
-          <div id="curve_list" style="overflow:auto; max-height:300px;">
-            <table id="curve_table" width=100% height=100%>
-              <tr>
-                <td colspan=1>
-                  <input type="button" value="Load File" onClick="loadButtonClicked();">
-                  <div style="display:none">
-                    <input type=file id=sample_file onchange="loadSampleFile()">
-                  </div>
-                </td>
-                <td colspan=4>
-                  <select id="noctaves">
-                    <option value="3">1/3</option>
-                    <option value="4">1/4</option>
-                    <option value="5" selected>1/5</option>
-                    <option value="6">1/6</option>
-                    <option value="7">1/7</option>
-                    <option value="8">1/8</option>
-                    <option value="9">1/9</option>
-                    <option value="10">1/10</option>
-                  </select> Octaves
-                  <a id='export_csv'>
-                    <input type="button" value="Export CSV" onClick="exportCSV();">
-                  </a>
-                </td>
-              </tr>
-              <tr>
-                <td>Show</td>
-                <td>File name</td>
-                <td width=50>Left</td>
-                <td width=50>Right</td>
-                <td>Remove</td>
-              </tr>
-            </table>
-          </div>
-        </td>
-      </tr>
-    </table>
-
-    <div id="debug" style="display:none;">
-      <h1>Debug</h1>
-      <a id='export_freq'>
-        <input type="button" value="Export Freq" onClick="exportFreq();">
-      </a>
-      <a id='export_buffer'>
-        <input type="button" value="Export Buffer">
-      </a>
-    </div>
-
-    <div id="log" style="display:none;">
-      <h1>Log</h1>
-      <pre id="log"></pre>
-    </div>
-
-  </body>
-</html>
diff --git a/scripts/mic_testing/frontend/audio.js b/scripts/mic_testing/frontend/audio.js
deleted file mode 100644
index 86974e7..0000000
--- a/scripts/mic_testing/frontend/audio.js
+++ /dev/null
@@ -1,363 +0,0 @@
-/*
- * Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-var FFT_SIZE = 2048;
-
-var audioContext;
-var tonegen;
-var recorder;
-var drawContext;
-var audioPlay, audioBuffer;
-var audioSourceType = "sweep";
-var recordSourceType = "microphone";
-
-/**
- * Switches Play/Record tab
- * @param {string} tab name
- */
-function switchTab(tabName) {
-  var canvas_detail = document.getElementsByClassName('canvas_detail');
-  switch (tabName) {
-    case 'play_tab':
-      document.getElementById('record_tab').setAttribute('class', '');
-      document.getElementById('record_div').style.display = 'none';
-      document.getElementById('play_div').style.display = 'block';
-      for (var i = 0; i < canvas_detail.length; i++) {
-        canvas_detail[i].style.display = "none";
-      }
-      drawContext.drawBg();
-      break;
-    case 'record_tab':
-      document.getElementById('play_tab').setAttribute('class', '');
-      document.getElementById('play_div').style.display = 'none';
-      document.getElementById('record_div').style.display = 'block';
-      for (var i = 0; i < canvas_detail.length; i++) {
-        canvas_detail[i].style.display = "block";
-      }
-      drawContext.drawCanvas();
-      break;
-  }
-  document.getElementById(tabName).setAttribute('class', 'selected');
-}
-
-function __log(e, data) {
-  log.innerHTML += "\n" + e + " " + (data || '');
-}
-
-function startUserMedia(stream) {
-  var input = audioContext.createMediaStreamSource(stream);
-  recorder = new Recorder(input);
-}
-
-window.onload = function init() {
-  setupSourceLayer(audioSourceType);
-  try {
-    // webkit shim
-    window.AudioContext = window.AudioContext || window.webkitAudioContext;
-    navigator.getUserMedia = navigator.getUserMedia ||
-        navigator.webkitGetUserMedia;
-    window.URL = window.URL || window.webkitURL;
-
-    audioContext = new AudioContext;
-  } catch (e) {
-    alert('No web audio support in this browser!');
-  }
-
-  navigator.getUserMedia({audio: true}, startUserMedia, function(e) {
-    alert('No live audio input: ' + e);
-  });
-
-  /* Initialize global objects */
-  tonegen = new ToneGen();
-  audioPlay = new AudioPlay();
-
-  var canvas = document.getElementById('fr_canvas');
-  drawContext = new DrawCanvas(canvas, audioContext.sampleRate / 2);
-  drawContext.drawBg();
-};
-
-/* For Play tab */
-
-/**
- * Sets audio source layer
- * @param {string} audio source type
- */
-function setupSourceLayer(value) {
-  var sourceTone = document.getElementById('source_tone');
-  var sourceFile = document.getElementById('source_file');
-  var sweepTone = document.getElementsByClassName('sweep_tone');
-  audioSourceType = value;
-  switch (value) {
-    case 'sine':
-      for (var i = 0; i < sweepTone.length; i++) {
-        sweepTone[i].style.display = "none";
-      }
-      document.getElementById('freq_start').value = 1000;
-      document.getElementById('freq_end').value = 1000;
-      sourceTone.style.display = "block";
-      sourceFile.style.display = "none";
-      document.getElementById('play_audio').disabled = false;
-      break;
-    case 'sweep':
-      for (var i = 0; i < sweepTone.length; i++) {
-        sweepTone[i].style.display = "block";
-      }
-      document.getElementById('freq_start').value = 20;
-      document.getElementById('freq_end').value = 12000;
-      sourceTone.style.display = "block";
-      sourceFile.style.display = "none";
-      document.getElementById('play_audio').disabled = false;
-      break;
-    case 'file':
-      sourceTone.style.display = "none";
-      sourceFile.style.display = "block";
-      document.getElementById('play_audio').disabled = true;
-      break;
-  }
-}
-
-/**
- * Sets left/right gain
- */
-function gainChanged() {
-  var leftGain = document.getElementById('left_gain').value;
-  var rightGain = document.getElementById('right_gain').value;
-  var gainLabel = document.getElementById('gain_label');
-  gainLabel.innerHTML = 'L(' + leftGain + ') / R(' + rightGain + ')';
-}
-
-/**
- * Checks sine tone generator parameters and sets audio buffer
- */
-function toneValueCheckSet() {
-  var passed = true;
-  var freqStart = parseInt(document.getElementById('freq_start').value);
-  var freqEnd = parseInt(document.getElementById('freq_end').value);
-  var duration = parseFloat(document.getElementById('tone_sec').value);
-  var leftGain = parseInt(document.getElementById('left_gain').value);
-  var rightGain = parseInt(document.getElementById('right_gain').value);
-  var sweepLog = document.getElementById('sweep_log').checked;
-
-  function isNumber(value, msg) {
-    if (isNaN(value) || value <= 0) {
-      alert(msg);
-      passed = false;
-    }
-  }
-
-  if (audioSourceType == 'sine') {
-    freqEnd = freqStart;
-  }
-
-  isNumber(freqStart, "Start frequency should be a positive number.");
-  isNumber(freqEnd, "Stop frequency should be a positive number.");
-  isNumber(duration, "Duration should be a positive number.");
-  if (freqEnd > audioContext.sampleRate / 2) {
-    alert('Stop frequency is too large.');
-    passed = false;
-  }
-  if (freqStart < 20) {
-    alert('Start frequency is too small.');
-    passed = false;
-  }
-  if (passed) {
-    /* Passed value check and generate tone buffer */
-    tonegen.setFreq(freqStart, freqEnd, sweepLog);
-    tonegen.setDuration(duration);
-    tonegen.setGain(leftGain / 20, rightGain / 20);
-    tonegen.setSampleRate(audioContext.sampleRate);
-    tonegen.genBuffer();
-    var buffer = tonegen.getBuffer();
-    audioPlay.setBuffer(buffer, document.getElementById('append_tone').checked);
-  }
-  return passed;
-}
-
-function loadAudioFile() {
-  document.getElementById('audio_file').click();
-}
-
-/**
- * Loads audio file from local drive
- */
-function changeAudioFile() {
-  function loadAudioDone(filename, buffer) {
-    audioBuffer = buffer;
-    document.getElementById('play_audio').disabled = false;
-  }
-  var input = document.getElementById('audio_file');
-  document.getElementById('play_audio').disabled = true;
-  audioPlay.loadFile(input.files[0], loadAudioDone);
-  input.value = '';
-}
-
-/**
- * Play audio according source type
- */
-function playAudioFile() {
-  /**
-   * Callback function to draw frequency response of current buffer
-   */
-  function getInstantBuffer(leftData, rightData, sampleRate) {
-    drawContext.drawInstantCurve(leftData, rightData, sampleRate);
-  }
-
-  var btn = document.getElementById('play_audio');
-  var append = document.getElementById('append_tone').checked;
-  if (btn.className == 'btn-off') {
-    switch (audioSourceType) {
-      case 'sine':
-      case 'sweep':
-        if (toneValueCheckSet()) {
-          audioPlay.play(playAudioFile, getInstantBuffer);
-          btn.className = 'btn-on';
-        }
-        break;
-      case 'file':
-        audioPlay.setBuffer(audioBuffer, append);
-        audioPlay.play(playAudioFile, getInstantBuffer);
-        btn.className = 'btn-on';
-        break;
-    }
-  } else {
-    audioPlay.stop();
-    btn.className = 'btn-off';
-    drawContext.drawBg();
-  }
-}
-
-/* For Record tab */
-
-/**
- * Sets record source type
- * @param {string} record source type
- */
-function setupRecordSource(value) {
-  recordSourceType = value;
-  var autoStop = document.getElementById('auto_stop');
-  if (value == 'audio') {
-    autoStop.disabled = true;
-    autoStop.checked = false;
-  } else {
-    autoStop.disabled = false;
-    autoStop.checked = true;
-  }
-}
-
-function loadButtonClicked() {
-  document.getElementById('sample_file').click();
-}
-
-/**
- * Loads sample file to draw frequency response curve into canvas
- */
-function loadSampleFile() {
-  /**
-   * Callback function when file loaded
-   * @param {string} file name
-   * @param {AudioBuffer} file buffer
-   */
-  function addFileToCanvas(filename, buffer) {
-    var newBuffer = [];
-    for (var i = 0; i < buffer.numberOfChannels; i++) {
-      newBuffer.push(buffer.getChannelData(i));
-    }
-    drawContext.add(new AudioCurve(newBuffer, filename, buffer.sampleRate));
-  }
-  var input = document.getElementById('sample_file');
-  audioPlay.loadFile(input.files[0], addFileToCanvas);
-  input.value = '';
-}
-
-/**
- * Starts/Stops record function
- */
-function recordButtonClicked() {
-  /**
-   * Callback function to draw frequency response of current recorded buffer
-   */
-  function getInstantBuffer(leftData, rightData, sampleRate, stop) {
-    drawContext.drawInstantCurve(leftData, rightData, sampleRate);
-    if (stop)
-      recordButtonClicked();
-  }
-
-  var btn = document.getElementById('record_btn');
-  if (btn.className == 'btn-off') {
-    var detect = document.getElementById('detect_tone').checked;
-    var autoStop = document.getElementById('auto_stop').checked;
-    var append = document.getElementById('append_tone').checked;
-    if (recordSourceType == 'audio') {
-      switch(audioSourceType) {
-        case 'sine':
-        case 'sweep':
-          if (toneValueCheckSet()) {
-            audioPlay.play(recordButtonClicked);
-            btn.className = 'btn-on';
-          }
-          break;
-        case 'file':
-          audioPlay.setBuffer(audioBuffer, append);
-          audioPlay.play(recordButtonClicked);
-          btn.className = 'btn-on';
-          break;
-      }
-    } else {
-      btn.className = 'btn-on';
-    }
-    recorder.record(getInstantBuffer, detect, autoStop);
-  } else {
-    recorder.stop();
-    if (recordSourceType == 'audio') {
-      audioPlay.stop();
-    }
-    // create WAV download link using audio data blob
-    var filename = new Date().toISOString() + '.wav';
-    buffer = recorder.getBuffer();
-    drawContext.add(new AudioCurve(buffer, filename, audioContext.sampleRate));
-    createDownloadLink(filename);
-    recorder.clear();
-    btn.className = 'btn-off';
-  }
-}
-
-/**
- * Creates download link of recorded file
- * @param {string} file name
- */
-function createDownloadLink(filename) {
-  var blob = recorder.exportWAV();
-  var url = URL.createObjectURL(blob);
-  var table = document.getElementById('record_list');
-  var au = document.createElement('audio');
-  au.controls = true;
-  au.src = url;
-
-  var hf = document.createElement('a');
-  hf.href = url;
-  hf.download = filename;
-  hf.innerHTML = hf.download;
-
-  var tr = table.insertRow(table.rows.length);
-  var td_au = tr.insertCell(0);
-  var td_hf = tr.insertCell(1);
-  td_hf.style = "white-space: nowrap";
-  td_au.appendChild(au);
-  td_hf.appendChild(hf);
-}
-
-/**
- * Exports frequency response CVS file of curves on the canvas
- */
-function exportCSV() {
-  var hf = document.getElementById('export_csv');
-  var noctaves = document.getElementById('noctaves').value;
-  content = drawContext.exportCurve(noctaves);
-  var blob = new Blob([content], {type: 'application/octet-stream'});
-  var url = URL.createObjectURL(blob);
-  hf.href = url;
-  hf.download = 'audio.csv';
-}
diff --git a/scripts/mic_testing/frontend/recorder.js b/scripts/mic_testing/frontend/recorder.js
deleted file mode 100644
index 92f2766..0000000
--- a/scripts/mic_testing/frontend/recorder.js
+++ /dev/null
@@ -1,366 +0,0 @@
-/*
- * Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-var Recorder = function(source){
-  var bufferLen = 4096;
-  var toneFreq = 1000, errorMargin = 0.05;
-
-  var context = source.context;
-  var sampleRate = context.sampleRate;
-  var recBuffersL = [], recBuffersR = [], recLength = 0;
-  this.node = (context.createScriptProcessor ||
-              context.createJavaScriptNode).call(context, bufferLen, 2, 2);
-  var detectAppend = false, autoStop = false, recordCallback;
-  var recording = false;
-  var freqString;
-
-  this.node.onaudioprocess = function(e) {
-    if (!recording) return;
-
-    var length = e.inputBuffer.getChannelData(0).length;
-    var tmpLeft = new Float32Array(length);
-    var tmpRight = new Float32Array(length);
-    tmpLeft.set(e.inputBuffer.getChannelData(0), 0);
-    tmpRight.set(e.inputBuffer.getChannelData(1), 0);
-
-    recBuffersL.push(tmpLeft);
-    recBuffersR.push(tmpRight);
-    recLength += length;
-    var stop = false;
-
-    if (autoStop && detectTone(getFreqList(tmpLeft)))
-      stop = true;
-
-    if (recordCallback) {
-      var tmpLeft = recBuffersL[recBuffersL.length - 1].subarray(
-          -FFT_SIZE-1, -1);
-      var tmpRight = recBuffersR[recBuffersR.length - 1].subarray(
-          -FFT_SIZE-1, -1);
-      recordCallback(tmpLeft, tmpRight, sampleRate, stop);
-    }
-  }
-
-  /**
-   * Starts recording
-   * @param {function} callback function to get current buffer
-   * @param {boolean} detect append tone or not
-   * @param {boolean} auto stop when detecting append tone
-   */
-  this.record = function(cb, detect, stop) {
-    recordCallback = cb;
-    detectAppend = detect;
-    autoStop = stop;
-    recording = true;
-  }
-
-  /**
-   * Stops recording
-   */
-  this.stop = function() {
-    recording = false;
-    recBuffersL = mergeBuffers(recBuffersL, recLength);
-    recBuffersR = mergeBuffers(recBuffersR, recLength);
-    if (detectAppend) {
-      var freqList = getFreqList(recBuffersL);
-      var index = getToneIndices(freqList);
-      removeAppendTone(index[0], index[1]);
-      exportFreqList(freqList);
-    }
-  }
-
-  /**
-   * Gets frequencies list
-   * @param {Float32Array} buffer
-   * @return {array} frequencies list
-   */
-  getFreqList = function(buffer) {
-    var prevPeak = 0;
-    var valid = true;
-    var freqList = [];
-    for (i = 1; i < recLength; i++) {
-      if (buffer[i] > 0.1 &&
-          buffer[i] >= buffer[i - 1] && buffer[i] >= buffer[i + 1]) {
-        if (valid) {
-          var freq = sampleRate / (i - prevPeak);
-          freqList.push([freq, prevPeak, i]);
-          prevPeak = i;
-          valid = false;
-        }
-      } else if (buffer[i] < -0.1) {
-        valid = true;
-      }
-    }
-    return freqList;
-  }
-
-  /**
-   * Checks average frequency is in allowed error margin
-   * @param {float} average frequency
-   * @return {boolean} checked result pass or fail
-   */
-  checkFreq = function (average) {
-    if (Math.abs(average - toneFreq) / toneFreq < errorMargin)
-      return true;
-    return false;
-  }
-
-  /**
-   * Detects append tone while recording.
-   * @param {array} frequencies list
-   * @return {boolean} detected or not
-   */
-  detectTone = function(freqList) {
-    var passCriterion = 50;
-    // Initialize function static variables
-    if (typeof detectTone.startDetected == 'undefined') {
-      detectTone.startDetected = false;
-      detectTone.canStop = false;
-      detectTone.accumulateTone = 0;
-    }
-
-    var windowSize = 10, windowSum = 0, i;
-    var detected = false;
-    for (i = 0; i < freqList.length && i < windowSize; i++) {
-      windowSum += freqList[i][0];
-    }
-    if (checkFreq(windowSum / Math.min(windowSize, freqList.length))) {
-      detected = true;
-      detectTone.accumulateTone++;
-    }
-    for (; i < freqList.length; i++) {
-      windowSum = windowSum + freqList[i][0] - freqList[i - windowSize][0];
-      if (checkFreq(windowSum / windowSize)) {
-        detected = true;
-        detectTone.accumulateTone++;
-      }
-    }
-    if (detected) {
-      if (detectTone.accumulateTone > passCriterion) {
-        if (!detectTone.startDetected)
-          detectTone.startDetected = true;
-        else if (detectTone.canStop) {
-          detectTone.startDetected = false;
-          detectTone.canStop = false;
-          detectTone.accumulateTone = 0;
-          return true;
-        }
-      }
-    } else {
-      detectTone.accumulateTone = 0;
-      if (detectTone.startDetected)
-        detectTone.canStop = true;
-    }
-    return false;
-  }
-
-  /**
-   * Gets start and end indices from a frquencies list except append tone
-   * @param {array} frequencies list
-   * @return {array} start and end indices
-   */
-  getToneIndices = function(freqList) {
-    // find start and end indices
-    var flag, j, k;
-    var windowSize = 10, windowSum;
-    var index = new Array(2);
-    var scanRange = [[0, freqList.length, 1], [freqList.length - 1, -1, -1]];
-
-    if (freqList.length == 0) return index;
-
-    for (i = 0; i < 2; i++) {
-      flag = false;
-      windowSum = 0;
-      for (j = scanRange[i][0], k = 0; k < windowSize && j != scanRange[i][1];
-          j += scanRange[i][2], k++) {
-        windowSum += freqList[j][0];
-      }
-      for (; j != scanRange[i][1]; j += scanRange[i][2]) {
-        windowSum = windowSum + freqList[j][0] -
-            freqList[j - scanRange[i][2] * windowSize][0];
-        var avg = windowSum / windowSize;
-        if (checkFreq(avg) && !flag) {
-          flag = true;
-        }
-        if (!checkFreq(avg) && flag) {
-          index[i] = freqList[j][1];
-          break;
-        }
-      }
-    }
-    return index;
-  }
-
-  /**
-   * Removes append tone from recorded buffer
-   * @param {int} start index
-   * @param {int} end index
-   */
-  removeAppendTone = function(start, end) {
-    if (!isNaN(start) && !isNaN(end) && end > start) {
-      recBuffersL = truncateBuffers(recBuffersL, recLength, start, end);
-      recBuffersR = truncateBuffers(recBuffersR, recLength, start, end);
-      recLength = end - start;
-    }
-  }
-
-  /**
-   * Exports frequency list for debugging purpose
-   */
-  exportFreqList = function(freqList) {
-    freqString = sampleRate + '\n';
-    for (var i = 0; i < freqList.length; i++) {
-      freqString += freqList[i][0] + ' ' + freqList[i][1] + ' ' +
-          freqList[i][2] + '\n';
-    }
-  }
-
-  this.getFreq = function() {
-    return freqString;
-  }
-
-  /**
-   * Clears recorded buffer
-   */
-  this.clear = function() {
-    recLength = 0;
-    recBuffersL = [];
-    recBuffersR = [];
-  }
-
-  /**
-   * Gets recorded buffer
-   */
-  this.getBuffer = function() {
-    var buffers = [];
-    buffers.push(recBuffersL);
-    buffers.push(recBuffersR);
-    return buffers;
-  }
-
-  /**
-   * Exports WAV format file
-   * @return {blob} audio file blob
-   */
-  this.exportWAV = function(type) {
-    type = type || 'audio/wav';
-    var interleaved = interleave(recBuffersL, recBuffersR);
-    var dataview = encodeWAV(interleaved);
-    var audioBlob = new Blob([dataview], { type: type });
-    return audioBlob;
-  }
-
-  /**
-   * Truncates buffer from start index to end index
-   * @param {Float32Array} audio buffer
-   * @param {int} buffer length
-   * @param {int} start index
-   * @param {int} end index
-   * @return {Float32Array} a truncated buffer
-   */
-  truncateBuffers = function(recBuffers, recLength, startIdx, endIdx) {
-    var buffer = new Float32Array(endIdx - startIdx);
-    for (var i = startIdx, j = 0; i < endIdx; i++, j++) {
-      buffer[j] = recBuffers[i];
-    }
-    return buffer;
-  }
-
-  /**
-   * Merges buffer into an array
-   * @param {array} a list of Float32Array of audio buffer
-   * @param {int} buffer length
-   * @return {Float32Array} a merged buffer
-   */
-  mergeBuffers = function(recBuffers, recLength) {
-    var result = new Float32Array(recLength);
-    var offset = 0;
-    for (var i = 0; i < recBuffers.length; i++){
-      result.set(recBuffers[i], offset);
-      offset += recBuffers[i].length;
-    }
-    return result;
-  }
-
-  /**
-   * Interleaves left and right channel buffer
-   * @param {Float32Array} left channel buffer
-   * @param {Float32Array} right channel buffer
-   * @return {Float32Array} an interleaved buffer
-   */
-  interleave = function(inputL, inputR) {
-    var length = inputL.length + inputR.length;
-    var result = new Float32Array(length);
-
-    var index = 0,
-      inputIndex = 0;
-
-    while (index < length){
-      result[index++] = inputL[inputIndex];
-      result[index++] = inputR[inputIndex];
-      inputIndex++;
-    }
-    return result;
-  }
-
-  floatTo16BitPCM = function(output, offset, input) {
-    for (var i = 0; i < input.length; i++, offset+=2){
-      var s = Math.max(-1, Math.min(1, input[i]));
-      output.setInt16(offset, s < 0 ? s * 0x8000 : s * 0x7FFF, true);
-    }
-  }
-
-  writeString = function(view, offset, string) {
-    for (var i = 0; i < string.length; i++){
-      view.setUint8(offset + i, string.charCodeAt(i));
-    }
-  }
-
-  /**
-   * Encodes audio buffer into WAV format raw data
-   * @param {Float32Array} an interleaved buffer
-   * @return {DataView} WAV format raw data
-   */
-  encodeWAV = function(samples) {
-    var buffer = new ArrayBuffer(44 + samples.length * 2);
-    var view = new DataView(buffer);
-
-    /* RIFF identifier */
-    writeString(view, 0, 'RIFF');
-    /* file length */
-    view.setUint32(4, 32 + samples.length * 2, true);
-    /* RIFF type */
-    writeString(view, 8, 'WAVE');
-    /* format chunk identifier */
-    writeString(view, 12, 'fmt ');
-    /* format chunk length */
-    view.setUint32(16, 16, true);
-    /* sample format (raw) */
-    view.setUint16(20, 1, true);
-    /* channel count */
-    view.setUint16(22, 2, true);
-    /* sample rate */
-    view.setUint32(24, sampleRate, true);
-    /* byte rate (sample rate * block align) */
-    view.setUint32(28, sampleRate * 4, true);
-    /* block align (channel count * bytes per sample) */
-    view.setUint16(32, 4, true);
-    /* bits per sample */
-    view.setUint16(34, 16, true);
-    /* data chunk identifier */
-    writeString(view, 36, 'data');
-    /* data chunk length */
-    view.setUint32(40, samples.length * 2, true);
-
-    floatTo16BitPCM(view, 44, samples);
-
-    return view;
-  }
-
-  source.connect(this.node);
-  this.node.connect(context.destination);
-};
-
-window.Recorder = Recorder;
diff --git a/scripts/mic_testing/frontend/source.js b/scripts/mic_testing/frontend/source.js
deleted file mode 100644
index a6f82a3..0000000
--- a/scripts/mic_testing/frontend/source.js
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
- * Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-var ToneGen = function() {
-  /**
-  * Initializes tone generator.
-   */
-  this.init = function() {
-    this.audioContext = new AudioContext();
-  }
-
-  /**
-   * Sets sample rate
-   * @param {int} sample rate
-   */
-  this.setSampleRate = function(sampleRate) {
-    this.sampleRate = sampleRate;
-  }
-
-  /**
-   * Sets start/end frequencies and logarithmic sweep
-   * @param {int} start frequency
-   * @param {int} end frequency
-   * @param {boolean} logarithmic sweep or not
-   */
-  this.setFreq = function(freqStart, freqEnd, sweepLog) {
-    this.freqStart = freqStart;
-    this.freqEnd = freqEnd;
-    this.sweepLog = sweepLog;
-  }
-
-  /**
-   * Sets tone duration
-   * @param {float} duration in seconds
-   */
-  this.setDuration = function(duration) {
-    this.duration = parseFloat(duration);
-  }
-
-  /**
-   * Sets left and right gain value
-   * @param {float} left gain between 0 and 1
-   * @param {float} right gain between 0 and 1
-   */
-  this.setGain = function(leftGain, rightGain) {
-    this.leftGain = parseFloat(leftGain);
-    this.rightGain = parseFloat(rightGain);
-  }
-
-  /**
-   * Generates sine tone buffer
-   */
-  this.genBuffer = function() {
-    this.buffer = this.audioContext.createBuffer(2,
-        this.sampleRate * this.duration, this.sampleRate);
-    var leftChannel = this.buffer.getChannelData(0);
-    var rightChannel = this.buffer.getChannelData(1);
-    var phi;
-    var k = this.freqEnd / this.freqStart;
-    var beta = this.duration / Math.log(k);
-    for (var i = 0; i < leftChannel.length; i++) {
-      if (this.sweepLog) {
-        phi = 2 * Math.PI * this.freqStart * beta *
-            (Math.pow(k, i / leftChannel.length) - 1.0);
-      } else {
-        var f = this.freqStart + (this.freqEnd - this.freqStart) *
-            i / leftChannel.length / 2;
-        phi = f * 2 * Math.PI * i / this.sampleRate;
-      }
-      leftChannel[i] = this.leftGain * Math.sin(phi);
-      rightChannel[i] = this.rightGain * Math.sin(phi);
-    }
-  }
-
-  /**
-   * Returns generated sine tone buffer
-   * @return {AudioBuffer} audio buffer
-   */
-  this.getBuffer = function() {
-    return this.buffer;
-  }
-
-  /**
-   * Returns append buffer
-   * @return {AudioBuffer} append audio buffer
-   */
-  this.getAppendTone = function(sampleRate) {
-    var tone_freq = 1000, duration = 0.5;
-    this.setFreq(tone_freq, tone_freq, false);
-    this.setDuration(duration);
-    this.setGain(1, 1);
-    this.setSampleRate(sampleRate);
-    this.genBuffer();
-    return this.getBuffer();
-  }
-
-  this.init();
-}
-
-window.ToneGen = ToneGen;
-
-var AudioPlay = function() {
-  var playCallback = null;
-  var sampleRate;
-  var playing = false;
-
-  /**
-   * Initializes audio play object
-   */
-  this.init = function() {
-    this.audioContext = new AudioContext();
-    this.genChannel();
-    this.buffer = null;
-    sampleRate = this.audioContext.sampleRate;
-  }
-
-  /**
-   * Loads audio file
-   * @param {blob} audio file
-   * @param {function} callback function when file loaded
-   */
-  this.loadFile = function(file_blob, done_cb) {
-    if (file_blob) {
-      var audioContext = this.audioContext;
-      reader = new FileReader();
-      reader.onloadend = function(e) {
-        audioContext.decodeAudioData(e.target.result,
-            function(buffer) {
-              done_cb(file_blob.name, buffer);
-            });
-      };
-      reader.readAsArrayBuffer(file_blob);
-    }
-  }
-
-  /**
-   * Sets audio path
-   */
-  this.genChannel = function() {
-    this.node = (this.audioContext.createScriptProcessor ||
-        this.audioContext.createJavaScriptNode).call(
-        this.audioContext, 4096, 2, 2);
-    this.splitter = this.audioContext.createChannelSplitter(2);
-    this.merger = this.audioContext.createChannelMerger(2);
-    this.node.connect(this.splitter);
-    this.splitter.connect(this.merger, 0, 0);
-    this.splitter.connect(this.merger, 1, 1);
-    this.merger.connect(this.audioContext.destination);
-
-    this.node.onaudioprocess = function(e) {
-      for (var i = 0; i < e.inputBuffer.numberOfChannels; i++) {
-        e.outputBuffer.getChannelData(i).set(
-            e.inputBuffer.getChannelData(i), 0);
-      }
-      if (!playing) return;
-      if (playCallback) {
-        var tmpLeft = e.inputBuffer.getChannelData(0).subarray(
-            -FFT_SIZE-1, -1);
-        var tmpRight = e.inputBuffer.getChannelData(1).subarray(
-            -FFT_SIZE-1, -1);
-        playCallback(tmpLeft, tmpRight, sampleRate);
-      }
-    }
-  }
-
-  /**
-   * Plays audio
-   * @param {function} callback function when audio end
-   * @param {function} callback function to get current buffer
-   */
-  this.play = function(done_cb, play_cb) {
-    playCallback = play_cb;
-    this.source = this.audioContext.createBufferSource();
-    this.source.buffer = this.buffer;
-    this.source.onended = function(e) {
-      playing = false;
-      this.disconnect();
-      if (done_cb) {
-        done_cb();
-      }
-    }
-    this.source.connect(this.node);
-    this.source.start(0);
-    playing = true;
-  }
-
-  /**
-   * Stops audio
-   */
-  this.stop = function() {
-    playing = false;
-    this.source.stop();
-    this.source.disconnect();
-  }
-
-  /**
-   * Sets audio buffer
-   * @param {AudioBuffer} audio buffer
-   * @param {boolean} append tone or not
-   */
-  this.setBuffer = function(buffer, append) {
-    if (append) {
-      function copyBuffer(src, dest, offset) {
-        for (var i = 0; i < dest.numberOfChannels; i++) {
-          dest.getChannelData(i).set(src.getChannelData(i), offset);
-        }
-      }
-      var appendTone = tonegen.getAppendTone(buffer.sampleRate);
-      var bufferLength = appendTone.length * 2 + buffer.length;
-      var newBuffer = this.audioContext.createBuffer(buffer.numberOfChannels,
-          bufferLength, buffer.sampleRate);
-      copyBuffer(appendTone, newBuffer, 0);
-      copyBuffer(buffer, newBuffer, appendTone.length);
-      copyBuffer(appendTone, newBuffer, appendTone.length + buffer.length);
-      this.buffer = newBuffer;
-    } else {
-      this.buffer = buffer;
-    }
-  }
-
-  this.init();
-}
-
-window.AudioPlay = AudioPlay;
diff --git a/scripts/volume_tuning/LICENSE b/scripts/volume_tuning/LICENSE
deleted file mode 100644
index 0aa7fc9..0000000
--- a/scripts/volume_tuning/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (c) 2006-2009 The Chromium OS Authors. All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//    * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-//    * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-//    * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/scripts/volume_tuning/app.yaml b/scripts/volume_tuning/app.yaml
deleted file mode 100644
index 4c580fa..0000000
--- a/scripts/volume_tuning/app.yaml
+++ /dev/null
@@ -1,30 +0,0 @@
-application: volume-tuning
-version: 1-1-default-volume-step
-runtime: python27
-api_version: 1
-threadsafe: true
-
-handlers:
-- url: /(.*\.css)
-  mime_type: text/css
-  static_files: \1
-  upload: (.*\.css)
-
-- url: /(.*\.html)
-  mime_type: text/html
-  static_files: \1
-  upload: (.*\.html)
-
-- url: /(.*\.js)
-  mime_type: text/javascript
-  static_files: \1
-  upload: (.*\.js)
-
-- url: /(LICENSE)
-  mime_type: text/plain
-  static_files: \1
-  upload: (LICENSE)
-
-- url: /
-  static_files: volume.html
-  upload: volume.html
diff --git a/scripts/volume_tuning/volume.css b/scripts/volume_tuning/volume.css
deleted file mode 100644
index a40fbb9..0000000
--- a/scripts/volume_tuning/volume.css
+++ /dev/null
@@ -1,30 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-body {
-    font-family: sans-serif;
-    text-align: center;
-}
-
-.box
-{
-    border: 1px solid rgb(144,184,222);
-    text-align:right;
-    position:relative;
-    padding: 2px;
-}
-
-table {
-    display: inline-block;
-    background-color: #d8e6f8;
-    border-radius: 5px;
-    padding: 5px;
-}
-
-canvas {
-    display: inline-block;
-    vertical-align: top;
-    padding-left: 20px;
-}
diff --git a/scripts/volume_tuning/volume.html b/scripts/volume_tuning/volume.html
deleted file mode 100644
index beb71c1..0000000
--- a/scripts/volume_tuning/volume.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!-- Copyright (c) 2013 The Chromium OS Authors. All rights reserved. -->
-<!-- Use of this source code is governed by a BSD-style license that can be -->
-<!-- found in the LICENSE file. -->
-
-<html>
-  <head>
-    <TITLE>Volume Tuning</TITLE>
-    <link rel="stylesheet" href="volume.css" type="text/css">
-    <script type="text/javascript" src="volume.js"></script>
-  </head>
-  <body>
-  <h1> Volume Tuning </h1>
-  <table id="minmax"></table>
-  <table id="fixes"> </table>
-  <canvas id="curve"> </canvas>
-  <hr>
-  <input type=button value='Download config' onclick="download_config()">
-  </input>
-  <div style="display:none">
-    <a id=save_config_anchor></a>
-  </div>
-  </body>
-</html>
-<html>
diff --git a/scripts/volume_tuning/volume.js b/scripts/volume_tuning/volume.js
deleted file mode 100644
index 88f3998..0000000
--- a/scripts/volume_tuning/volume.js
+++ /dev/null
@@ -1,315 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-var NN = 100;    // Total number of points
-var FIXES = 25;  // Number of fixed points, evenly spaced in the range [0, NN]
-var minmax_boxes = []; // The text input boxes for min/max/step
-var fix_boxes = [];  // The text input boxes for fixed points
-
-window.onload = function() {
-  init_minmax();
-  init_fixes();
-  init_canvas();
-};
-
-// Create min/max/step boxes
-function init_minmax() {
-  var table = document.getElementById('minmax');
-  var names = ['Min:' , 'Max:', 'Step:'];
-  for (var i = 0; i < names.length; i++) {
-    var row = table.insertRow(-1);
-    var col_name = row.insertCell(-1);
-    var col_box = row.insertCell(-1);
-    var col_db = row.insertCell(-1);
-    var box = document.createElement('input');
-    box.size = 5;
-    box.className = 'box';
-    col_name.appendChild(document.createTextNode(names[i]));
-    col_name.align = 'right';
-    col_box.appendChild(box);
-    col_db.appendChild(document.createTextNode('dB'));
-    minmax_boxes.push(box);
-    box.oninput = redraw;
-  }
-}
-
-// Create fixed point boxes
-function init_fixes() {
-  var table = document.getElementById('fixes');
-  for (var i = 0; i <= FIXES; i++) {
-    var row = table.insertRow(-1);
-    var col_name = row.insertCell(-1);
-    var col_box = row.insertCell(-1);
-    var col_db = row.insertCell(-1);
-    var box = document.createElement('input');
-    box.size = 5;
-    box.className = 'box';
-    // round fix_pos (the dB value for this fixed point) to one place
-    // after decimal point.
-    var fix_pos = Math.round(i * NN * 10 / FIXES) / 10;
-    col_name.appendChild(document.createTextNode(fix_pos + ':'));
-    col_name.align = 'right';
-    col_box.appendChild(box);
-    col_db.appendChild(document.createTextNode('dB'));
-    fix_boxes.push(box);
-    box.oninput = redraw;
-  }
-}
-
-function init_canvas() {
-  redraw();
-}
-
-// Redraw everything on the canvas. This is run every time any input is changed.
-function redraw() {
-  var backgroundColor = 'black';
-  var gridColor = 'rgb(200,200,200)';
-  var dotColor = 'rgb(245,245,0)';
-  var marginLeft = 60;
-  var marginBottom = 30;
-  var marginTop = 20;
-  var marginRight = 30;
-  var canvas = document.getElementById('curve');
-  var ctx = canvas.getContext('2d');
-  var w = 800;
-  var h = 400;
-  canvas.width = w + marginLeft + marginRight;
-  canvas.height = h + marginBottom + marginTop;
-  ctx.fillStyle = backgroundColor;
-  ctx.fillRect(0, 0, canvas.width, canvas.height);
-  ctx.lineWidth = 1;
-  ctx.font = '16px sans-serif';
-  ctx.textAlign = 'center';
-
-  // Set up coordinate system
-  ctx.translate(marginLeft, h + marginTop);
-  ctx.scale(1, -1);
-
-  // Draw two lines at x = 0 and y = 0 which are solid lines
-  ctx.strokeStyle = gridColor;
-  ctx.beginPath();
-  ctx.moveTo(0, h + marginTop / 2);
-  ctx.lineTo(0, 0);
-  ctx.lineTo(w + marginRight / 2, 0);
-  ctx.stroke();
-
-  // Draw vertical lines and labels on x axis
-  ctx.strokeStyle = gridColor;
-  ctx.fillStyle = gridColor;
-  ctx.beginPath();
-  ctx.setLineDash([1, 4]);
-  for (var i = 0; i <= FIXES; i++) {
-    var x = i * w / FIXES;
-    if (i > 0) {
-      ctx.moveTo(x, 0);
-      ctx.lineTo(x, h + marginTop / 2);
-    }
-    drawText(ctx, Math.round(i * NN * 10 / FIXES) / 10, x, -20, 'center');
-  }
-  ctx.stroke();
-  ctx.setLineDash([]);
-
-  // Draw horizontal lines and labels on y axis
-  var min = parseFloat(minmax_boxes[0].value);
-  var max = parseFloat(minmax_boxes[1].value);
-  var step = parseFloat(minmax_boxes[2].value);
-
-  // Soundness checks
-  if (isNaN(min) || isNaN(max) || isNaN(step)) return;
-  if (min >= max || step <= 0 || (max - min) / step > 10000) return;
-
-  // Let s = minimal multiple of step such that
-  // vdivs = Math.round((max - min) / s) <= 20
-  var vdivs;
-  var s = Math.max(1, Math.floor((max - min) / 20 / step)) * step;
-  while (true) {
-    var vdivs = Math.round((max - min) / s);
-    if (vdivs <= 20) break;
-    s += step;
-  }
-
-  // Scale from v to y is
-  // y = (v - min) / s * h / vdivs
-  ctx.strokeStyle = gridColor;
-  ctx.fillStyle = gridColor;
-  ctx.beginPath();
-  ctx.setLineDash([1, 4]);
-  for (var i = 0;; i++) {
-    var v = min + s * i;
-    var y;
-    if (v <= max) {
-      y = i * h / vdivs;
-    } else {
-      v = max;
-      y = (max - min) / s * h / vdivs;
-    }
-    drawText(ctx, v.toFixed(2), -5 , y - 4, 'right');
-    if (i > 0) {
-      ctx.moveTo(0, y);
-      ctx.lineTo(w + marginRight / 2, y);
-    }
-    if (v >= max) break;
-  }
-  ctx.stroke();
-  ctx.setLineDash([]);
-
-  // Draw fixed points
-  ctx.strokeStyle = dotColor;
-  ctx.fillStyle = dotColor;
-  for (var i = 0; i <= FIXES; i++) {
-    var v = getFix(i);
-    if (isNaN(v)) continue;
-    var x = i * w / FIXES;
-    var y = (v - min) / s * h / vdivs;
-    ctx.beginPath();
-    ctx.arc(x, y, 4, 0, 2 * Math.PI);
-    ctx.stroke();
-  }
-
-  // Draw interpolated points
-  var points = generatePoints();
-  for (var i = 0; i <= NN; i++) {
-    var v = points[i];
-    if (isNaN(v)) continue;
-    var x = i * w / NN;
-    var y = (v - min) / s * h / vdivs;
-    ctx.beginPath();
-    ctx.arc(x, y, 2, 0, 2 * Math.PI);
-    ctx.stroke();
-    ctx.fill();
-  }
-}
-
-// Returns the value of the fixed point with index i
-function getFix(i) {
-  var v = parseFloat(fix_boxes[i].value);
-  var min = parseFloat(minmax_boxes[0].value);
-  var max = parseFloat(minmax_boxes[1].value);
-
-  if (isNaN(v)) return v;
-  if (v > max) v = max;
-  if (v < min) v = min;
-  return v;
-}
-
-// Returns a value quantized to the given min/max/step
-function quantize(v) {
-  var min = parseFloat(minmax_boxes[0].value);
-  var max = parseFloat(minmax_boxes[1].value);
-  var step = parseFloat(minmax_boxes[2].value);
-
-  v = min + Math.round((v - min) / step) * step;
-  if (isNaN(v)) return v;
-  if (v > max) v = max;
-  if (v < min) v = min;
-  return v;
-}
-
-// Generate points indexed by 0 to NN, using interpolation and quantization
-function generatePoints() {
-  // Go through all points, for each point:
-  // (1) Find the left fix: the max defined fixed point <= current point
-  // (2) Find the right fix: the min defined fixed point >= current point
-  // (3) If both exist, interpolate value for current point
-  // (4) Otherwise skip current point
-
-  // Returns left fix index for current point, or NaN if it does not exist
-  var find_left = function(current) {
-    for (i = FIXES; i >= 0; i--) {
-      var x = NN * i / FIXES;
-      if (x <= current && !isNaN(getFix(i))) {
-        return i;
-      }
-    }
-    return NaN;
-  };
-
-  // Returns right fix index for current point, or NaN if it does not exist
-  var find_right = function(current) {
-    for (i = 0; i <= FIXES; i++) {
-      var x = NN * i / FIXES;
-      if (x >= current && !isNaN(getFix(i))) {
-        return i;
-      }
-    }
-    return NaN;
-  };
-
-  // Interpolate value for point x
-  var interpolate = function(x) {
-    var left = find_left(x);
-    if (isNaN(left)) return NaN;
-
-    var right = find_right(x);
-    if (isNaN(right)) return NaN;
-
-    var xl = NN * left / FIXES;
-    var xr = NN * right / FIXES;
-    var yl = getFix(left);
-    var yr = getFix(right);
-
-    if (xl == xr) return yl;
-
-    return yl + (yr - yl) * (x - xl) / (xr - xl);
-  };
-
-  var result = [];
-  for (var x = 0; x <= NN; x++) {
-    result.push(quantize(interpolate(x)));
-  }
-  return result;
-}
-
-function drawText(ctx, s, x, y, align) {
-  ctx.save();
-  ctx.translate(x, y);
-  ctx.scale(1, -1);
-  ctx.textAlign = align;
-  ctx.fillText(s, 0, 0);
-  ctx.restore();
-}
-
-// The output config file looks like:
-//
-// [Speaker]
-//   volume_curve = explicit
-//   db_at_100 = 0
-//   db_at_99 = -75
-//   db_at_98 = -75
-//   ...
-//   db_at_1 = -4500
-//   db_at_0 = -4800
-// [Headphone]
-//   volume_curve = simple_step
-//   volume_step = 70
-//   max_volume = 0
-//
-function download_config() {
-  var content = '';
-  content += '[Speaker]\n';
-  content += '  volume_curve = explicit\n';
-  var points = generatePoints();
-  var last = 0;
-  for (var i = NN; i >= 0; i--) {
-    var v = points[i];
-    if (isNaN(points[i])) v = last;
-    content += '  db_at_' + i + ' = ' + Math.round(v * 100) + '\n';
-  }
-
-  content += '[Headphone]\n';
-  content += '  volume_curve = simple_step\n';
-  content += '  volume_step = 70\n';
-  content += '  max_volume = 0\n';
-  save_config(content);
-}
-
-function save_config(content) {
-  var a = document.getElementById('save_config_anchor');
-  var uriContent = 'data:application/octet-stream,' +
-      encodeURIComponent(content);
-  a.href = uriContent;
-  a.download = 'HDA Intel PCH';
-  a.click();
-}
diff --git a/seccomp/cras-seccomp-amd64.policy b/seccomp/cras-seccomp-amd64.policy
deleted file mode 100644
index afa6ace..0000000
--- a/seccomp/cras-seccomp-amd64.policy
+++ /dev/null
@@ -1,95 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-clock_gettime: 1
-getuid: 1
-lstat: 1
-read: 1
-recvfrom: 1
-poll: 1
-ppoll: 1
-fstat: 1
-write: 1
-writev: 1
-open: 1
-openat: 1
-close: 1
-readlinkat: 1
-getrandom: 1
-access: 1
-fcntl: 1
-getdents: 1
-getdents64: 1
-sendmsg: 1
-stat: 1
-statfs: 1
-recvmsg: 1
-brk: 1
-mmap: 1
-getsockopt: 1
-accept: 1
-munmap: 1
-sendto: 1
-readlink: 1
-futex: 1
-lseek: 1
-rt_sigaction: 1
-socket: arg0 == AF_UNIX || arg0 == AF_BLUETOOTH || arg0 == AF_NETLINK
-socketpair: 1
-unlink: 1
-nanosleep: 1
-clock_nanosleep: 1
-pipe: 1
-ftruncate: 1
-fallocate: 1
-mprotect: 1
-connect: 1
-getsockname: 1
-setsockopt: 1
-bind: 1
-restart_syscall: 1
-exit: 1
-exit_group: 1
-rt_sigreturn: 1
-chmod: 1
-geteuid: 1
-uname: 1
-clock_getres: 1
-gettid: 1
-rt_sigprocmask: 1
-fchmod: 1
-getrlimit: 1
-setrlimit: 1
-listen: 1
-clone: 1
-set_robust_list: 1
-setpriority: 1
-getresuid: 1
-getresgid: 1
-sched_setscheduler: 1
-epoll_wait: 1
-getegid: 1
-getgid: 1
-prctl: arg0 == PR_SET_NAME
-epoll_create1: 1
-sched_get_priority_min: 1
-pipe2: 1
-epoll_ctl: 1
-sched_get_priority_max: 1
-lgetxattr: 1
-lsetxattr: 1
-madvise: 1
-sysinfo: 1
-flock: 1
-
-# Allow ioctl command of type 'A' and 'U' for SNDRV_PCM_IOCTL_* and
-# SNDRV_CTL_IOCTL_*, and EVIOCGSW(8), EVIOCGNAME(256), EVIOCGBIT(0x05, 8),
-# HCIGETDEVINFO
-ioctl: arg1 in 0xffff41ff && arg1 & 0x00004100 || arg1 in 0xffff55ff && arg1 & 0x00005500 || arg1 == 0x8008451b || arg1 == 0x81004506 || arg1 == 0x80084525 || arg1 == 0x800448d3
-getpid: 1
-prlimit64: 1
-tgkill: 1
-mremap: 1
-dup: 1
-gettimeofday: 1
diff --git a/seccomp/cras-seccomp-arm.policy b/seccomp/cras-seccomp-arm.policy
deleted file mode 100644
index cbaa622..0000000
--- a/seccomp/cras-seccomp-arm.policy
+++ /dev/null
@@ -1,104 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-clock_gettime: 1
-clock_gettime64: 1
-poll: 1
-read: 1
-ppoll: 1
-ppoll_time64: 1
-write: 1
-writev: 1
-recv: 1
-send: 1
-recvmsg: 1
-lstat64: 1
-fstat64: 1
-open: 1
-openat: 1
-close: 1
-fcntl64: 1
-readlinkat: 1
-sendmsg: 1
-access: 1
-getrandom: 1
-mmap2: 1
-epoll_wait: 1
-getsockopt: 1
-accept: 1
-stat64: 1
-mprotect: 1
-gettimeofday: 1
-getdents64: 1
-brk: 1
-statfs: 1
-readlink: 1
-munmap: 1
-rt_sigaction: 1
-lgetxattr: 1
-unlink: 1
-lsetxattr: 1
-rt_sigprocmask: 1
-ftruncate: 1
-fallocate: 1
-futex: 1
-futex_time64: 1
-execve: 1
-set_robust_list: 1
-socket: arg0 == AF_UNIX || arg0 == AF_BLUETOOTH || arg0 == AF_NETLINK
-socketpair: 1
-clone: 1
-setsockopt: 1
-geteuid32: 1
-ugetrlimit: 1
-uname: 1
-connect: 1
-bind: 1
-_llseek: 1
-getuid32: 1
-getgid32: 1
-getegid32: 1
-pipe: 1
-flock: 1
-# set_tls: 1
-set_tid_address: 1
-exit_group: 1
-getsockname: 1
-getdents: 1
-nanosleep: 1
-clock_nanosleep: 1
-clock_nanosleep_time64: 1
-epoll_ctl: 1
-sched_setscheduler: 1
-restart_syscall: 1
-rt_sigreturn: 1
-getresuid32: 1
-exit: 1
-prctl: arg0 == PR_SET_NAME
-clock_getres: 1
-clock_getres_time64: 1
-epoll_create1: 1
-fchmod: 1
-setpriority: 1
-setrlimit: 1
-listen: 1
-gettid: 1
-sched_get_priority_min: 1
-chmod: 1
-madvise: 1
-getresgid32: 1
-pipe2: 1
-sched_get_priority_max: 1
-sysinfo: 1
-
-# Allow ioctl command of type 'A' and 'U' for SNDRV_PCM_IOCTL_* and
-# SNDRV_CTL_IOCTL_*, and EVIOCGSW(8), EVIOCGNAME(256), EVIOCGBIT(0x05, 8),
-# HCIGETDEVINFO
-ioctl: arg1 in 0xffff41ff && arg1 & 0x00004100 || arg1 in 0xffff55ff && arg1 & 0x00005500 || arg1 == 0x8008451b || arg1 == 0x81004506 || arg1 == 0x80084525 || arg1 == 0x800448d3
-getpid: 1
-prlimit64: 1
-tgkill: 1
-mremap: 1
-dup: 1
-_newselect: 1
diff --git a/seccomp/cras-seccomp-arm64.policy b/seccomp/cras-seccomp-arm64.policy
deleted file mode 100644
index 4b52355..0000000
--- a/seccomp/cras-seccomp-arm64.policy
+++ /dev/null
@@ -1,90 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-clock_gettime: 1
-# Allow ioctl command of type 'A' and 'U' for SNDRV_PCM_IOCTL_* and
-# SNDRV_CTL_IOCTL_*, and EVIOCGSW(8), EVIOCGNAME(256), EVIOCGBIT(0x05, 8),
-# HCIGETDEVINFO
-ioctl: arg1 in 0xffff41ff && arg1 & 0x00004100 || arg1 in 0xffff55ff && arg1 & 0x00005500 || arg1 == 0x8008451b || arg1 == 0x81004506 || arg1 == 0x80084525 || arg1 == 0x800448d3
-ppoll: 1
-read: 1
-write: 1
-writev: 1
-newfstatat: 1
-fstat: 1
-openat: 1
-close: 1
-readlinkat: 1
-getrandom: 1
-faccessat: 1
-# Don't allow mmap or mprotect with both PROT_WRITE and PROT_EXEC
-mmap: arg2 in 0xfffffffb || arg2 in 0xfffffffd
-mprotect: arg2 in 0xfffffffb || arg2 in 0xfffffffd
-sendmsg: 1
-rt_sigaction: 1
-lseek: 1
-recvmsg: 1
-fcntl: 1
-getdents64: 1
-sendto: 1
-brk: 1
-munmap: 1
-socket: arg0 == AF_UNIX || arg0 == AF_BLUETOOTH || arg0 == AF_NETLINK
-socketpair: 1
-statfs: 1
-getsockopt: 1
-accept: 1
-pipe2: 1
-prctl: arg0 == PR_SET_NAME
-futex: 1
-ftruncate: 1
-fallocate: 1
-connect: 1
-bind: 1
-clock_getres: 1
-clone: 1
-epoll_create1: 1
-epoll_ctl: 1
-epoll_pwait: 1
-execve: 1
-exit: 1
-exit_group: 1
-fchmod: 1
-fchmodat: 1
-flock: 1
-getegid: 1
-geteuid: 1
-getgid: 1
-getresgid: 1
-getresuid: 1
-getrlimit: 1
-getsockname: 1
-gettid: 1
-gettimeofday: 1
-getuid: 1
-lgetxattr: 1
-listen: 1
-lsetxattr: 1
-madvise: 1
-nanosleep: 1
-clock_nanosleep: 1
-restart_syscall: 1
-rt_sigprocmask: 1
-rt_sigreturn: 1
-sched_get_priority_max: 1
-sched_get_priority_min: 1
-sched_setscheduler: 1
-setrlimit: 1
-set_robust_list: 1
-setpriority: 1
-setsockopt: 1
-set_tid_address: 1
-sysinfo: 1
-uname: 1
-unlinkat: 1
-getpid: 1
-prlimit64: 1
-tgkill: 1
-mremap: 1
-dup: 1
diff --git a/sof_sys/.gitignore b/sof_sys/.gitignore
deleted file mode 100644
index fa8d85a..0000000
--- a/sof_sys/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Cargo.lock
-target
diff --git a/sof_sys/.rustfmt.toml b/sof_sys/.rustfmt.toml
deleted file mode 100644
index a2db301..0000000
--- a/sof_sys/.rustfmt.toml
+++ /dev/null
@@ -1,2 +0,0 @@
-use_field_init_shorthand = true
-use_try_shorthand = true
diff --git a/sof_sys/Cargo.toml b/sof_sys/Cargo.toml
deleted file mode 100644
index 21934ee..0000000
--- a/sof_sys/Cargo.toml
+++ /dev/null
@@ -1,4 +0,0 @@
-[package]
-name = "sof_sys"
-version = "0.1.0"
-authors = ["The Chromium OS Authors"]
diff --git a/sof_sys/generator/.gitignore b/sof_sys/generator/.gitignore
deleted file mode 100644
index 03314f7..0000000
--- a/sof_sys/generator/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-Cargo.lock
diff --git a/sof_sys/generator/Cargo.toml b/sof_sys/generator/Cargo.toml
deleted file mode 100644
index 672d41d..0000000
--- a/sof_sys/generator/Cargo.toml
+++ /dev/null
@@ -1,6 +0,0 @@
-[package]
-name = "generator"
-version = "0.1.0"
-authors = ["The Chromium OS Authors"]
-[dependencies]
-bindgen = "0.43.0"
diff --git a/sof_sys/generator/README.md b/sof_sys/generator/README.md
deleted file mode 100644
index 3e2ca77..0000000
--- a/sof_sys/generator/README.md
+++ /dev/null
@@ -1 +0,0 @@
-Use `cargo run` to generate rust bindings at sof_sys/src/bindings.rs
diff --git a/sof_sys/generator/src/main.rs b/sof_sys/generator/src/main.rs
deleted file mode 100644
index 60f0102..0000000
--- a/sof_sys/generator/src/main.rs
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2020 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-extern crate bindgen;
-
-use std::fs::File;
-use std::io::Write;
-use std::path::PathBuf;
-
-fn main() {
-    let bindings = bindgen::Builder::default()
-        .header("wrapper.h")
-        .derive_debug(false)
-        .clang_arg("-I../../../sound-open-firmware-private/src/include")
-        .whitelist_type("sof_abi_hdr")
-        .whitelist_type("sof_ipc_ctrl_cmd")
-        .generate()
-        .expect("Unable to generate bindings");
-
-    let header = b"// Copyright 2020 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-/*
- * generated from files in sound-open-firmware-private/src/include:
- * kernel/header.h
- * ipc/control.h
- */
-
-";
-
-    // Write the bindings to the $OUT_DIR/bindings.rs file.
-    let out_path = PathBuf::from("../src").join("bindings.rs");
-
-    let mut output_file =
-        File::create(&out_path).expect(&format!("Couldn't create {:?}", out_path));
-    output_file
-        .write_all(header)
-        .expect("Couldn't write header");
-    output_file
-        .write_all(bindings.to_string().as_bytes())
-        .expect("Couldn't write bindings");
-}
diff --git a/sof_sys/generator/wrapper.h b/sof_sys/generator/wrapper.h
deleted file mode 100644
index 5bac0f5..0000000
--- a/sof_sys/generator/wrapper.h
+++ /dev/null
@@ -1,5 +0,0 @@
-// Copyright 2021 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-#include <kernel/header.h>
-#include <ipc/control.h>
diff --git a/sof_sys/src/bindings.rs b/sof_sys/src/bindings.rs
deleted file mode 100644
index 7bed0dc..0000000
--- a/sof_sys/src/bindings.rs
+++ /dev/null
@@ -1,154 +0,0 @@
-// Copyright 2020 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-/*
- * generated from files in sound-open-firmware-private/src/include:
- * kernel/header.h
- * ipc/control.h
- */
-
-/* automatically generated by rust-bindgen */
-
-#[repr(C)]
-#[derive(Default)]
-pub struct __IncompleteArrayField<T>(::std::marker::PhantomData<T>);
-impl<T> __IncompleteArrayField<T> {
-    #[inline]
-    pub fn new() -> Self {
-        __IncompleteArrayField(::std::marker::PhantomData)
-    }
-    #[inline]
-    pub unsafe fn as_ptr(&self) -> *const T {
-        ::std::mem::transmute(self)
-    }
-    #[inline]
-    pub unsafe fn as_mut_ptr(&mut self) -> *mut T {
-        ::std::mem::transmute(self)
-    }
-    #[inline]
-    pub unsafe fn as_slice(&self, len: usize) -> &[T] {
-        ::std::slice::from_raw_parts(self.as_ptr(), len)
-    }
-    #[inline]
-    pub unsafe fn as_mut_slice(&mut self, len: usize) -> &mut [T] {
-        ::std::slice::from_raw_parts_mut(self.as_mut_ptr(), len)
-    }
-}
-impl<T> ::std::fmt::Debug for __IncompleteArrayField<T> {
-    fn fmt(&self, fmt: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
-        fmt.write_str("__IncompleteArrayField")
-    }
-}
-impl<T> ::std::clone::Clone for __IncompleteArrayField<T> {
-    #[inline]
-    fn clone(&self) -> Self {
-        Self::new()
-    }
-}
-impl<T> ::std::marker::Copy for __IncompleteArrayField<T> {}
-pub type __uint32_t = ::std::os::raw::c_uint;
-/// \brief Header for all non IPC ABI data.
-///
-/// Identifies data type, size and ABI.
-/// Data header used for all component data structures and binary blobs sent to
-/// firmware as runtime data. This data is typically sent by userspace
-/// applications and tunnelled through any OS kernel (via binary kcontrol on
-/// Linux) to the firmware.
-#[repr(C, packed)]
-pub struct sof_abi_hdr {
-    ///< 'S', 'O', 'F', '\0'
-    pub magic: u32,
-    ///< component specific type
-    pub type_: u32,
-    ///< size in bytes of data excl. this struct
-    pub size: u32,
-    ///< SOF ABI version
-    pub abi: u32,
-    ///< reserved for future use
-    pub reserved: [u32; 4usize],
-    ///< Component data - opaque to core
-    pub data: __IncompleteArrayField<u32>,
-}
-#[test]
-fn bindgen_test_layout_sof_abi_hdr() {
-    assert_eq!(
-        ::std::mem::size_of::<sof_abi_hdr>(),
-        32usize,
-        concat!("Size of: ", stringify!(sof_abi_hdr))
-    );
-    assert_eq!(
-        ::std::mem::align_of::<sof_abi_hdr>(),
-        1usize,
-        concat!("Alignment of ", stringify!(sof_abi_hdr))
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<sof_abi_hdr>())).magic as *const _ as usize },
-        0usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(sof_abi_hdr),
-            "::",
-            stringify!(magic)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<sof_abi_hdr>())).type_ as *const _ as usize },
-        4usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(sof_abi_hdr),
-            "::",
-            stringify!(type_)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<sof_abi_hdr>())).size as *const _ as usize },
-        8usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(sof_abi_hdr),
-            "::",
-            stringify!(size)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<sof_abi_hdr>())).abi as *const _ as usize },
-        12usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(sof_abi_hdr),
-            "::",
-            stringify!(abi)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<sof_abi_hdr>())).reserved as *const _ as usize },
-        16usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(sof_abi_hdr),
-            "::",
-            stringify!(reserved)
-        )
-    );
-    assert_eq!(
-        unsafe { &(*(::std::ptr::null::<sof_abi_hdr>())).data as *const _ as usize },
-        32usize,
-        concat!(
-            "Offset of field: ",
-            stringify!(sof_abi_hdr),
-            "::",
-            stringify!(data)
-        )
-    );
-}
-///< maps to ALSA volume style controls
-pub const sof_ipc_ctrl_cmd_SOF_CTRL_CMD_VOLUME: sof_ipc_ctrl_cmd = 0;
-///< maps to ALSA enum style controls
-pub const sof_ipc_ctrl_cmd_SOF_CTRL_CMD_ENUM: sof_ipc_ctrl_cmd = 1;
-///< maps to ALSA switch style controls
-pub const sof_ipc_ctrl_cmd_SOF_CTRL_CMD_SWITCH: sof_ipc_ctrl_cmd = 2;
-///< maps to ALSA binary style controls
-pub const sof_ipc_ctrl_cmd_SOF_CTRL_CMD_BINARY: sof_ipc_ctrl_cmd = 3;
-/// Control command type.
-pub type sof_ipc_ctrl_cmd = u32;
diff --git a/sof_sys/src/lib.rs b/sof_sys/src/lib.rs
deleted file mode 100644
index 57119cf..0000000
--- a/sof_sys/src/lib.rs
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2020 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-#![allow(clippy::unreadable_literal)]
-#![allow(clippy::cognitive_complexity)]
-#![allow(non_upper_case_globals)]
-#![allow(non_camel_case_types)]
-#![allow(non_snake_case)]
-
-pub mod bindings;
-#[allow(unused_imports)]
-pub use bindings::sof_abi_hdr;
diff --git a/sound_card_init/.gitignore b/sound_card_init/.gitignore
deleted file mode 100644
index b6e8700..0000000
--- a/sound_card_init/.gitignore
+++ /dev/null
@@ -1,6 +0,0 @@
-# Generated by Cargo
-# will have compiled files and executables
-**/target/
-
-# These are backup files generated by rustfmt
-**/*.rs.bk
diff --git a/sound_card_init/99-sound_card_init.rules b/sound_card_init/99-sound_card_init.rules
deleted file mode 100644
index 82a3aec..0000000
--- a/sound_card_init/99-sound_card_init.rules
+++ /dev/null
@@ -1,13 +0,0 @@
-# Copyright 2020 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-SUBSYSTEM!="sound", GOTO="sci_end"
-ACTION!="change", GOTO="sci_end"
-KERNEL!="card*", GOTO="sci_end"
-
-GOTO="sci_action"
-
-LABEL="sci_action"
-RUN+="/sbin/initctl start sound_card_init SOUND_CARD_ID=$attr{id}"
-LABEL="sci_end"
diff --git a/sound_card_init/Cargo.lock b/sound_card_init/Cargo.lock
deleted file mode 100644
index c89ad1e..0000000
--- a/sound_card_init/Cargo.lock
+++ /dev/null
@@ -1,286 +0,0 @@
-# This file is automatically @generated by Cargo.
-# It is not intended for manual editing.
-[[package]]
-name = "alsa-sys"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "644d308f5822c2b39fba5a6d850f74c208bf73c61d1d2dfad62505d6960e4977"
-dependencies = [
- "libc",
- "pkg-config",
-]
-
-[[package]]
-name = "amp"
-version = "0.1.0"
-dependencies = [
- "cros_alsa",
- "dsm",
- "libcras",
- "remain",
- "serde",
- "serde_yaml",
- "sof_sys",
- "sys_util",
-]
-
-[[package]]
-name = "android_log-sys"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "85965b6739a430150bdd138e2374a98af0c3ee0d030b3bb7fc3bddff58d0102e"
-
-[[package]]
-name = "assertions"
-version = "0.1.0"
-
-[[package]]
-name = "audio_streams"
-version = "0.1.0"
-dependencies = [
- "sync",
- "sys_util",
-]
-
-[[package]]
-name = "cras-sys"
-version = "0.1.0"
-dependencies = [
- "audio_streams",
- "data_model",
-]
-
-[[package]]
-name = "cros_alsa"
-version = "0.1.0"
-dependencies = [
- "alsa-sys",
- "cros_alsa_derive",
- "libc",
- "remain",
-]
-
-[[package]]
-name = "cros_alsa_derive"
-version = "0.1.0"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "data_model"
-version = "0.1.0"
-dependencies = [
- "assertions",
- "libc",
-]
-
-[[package]]
-name = "dsm"
-version = "0.1.0"
-dependencies = [
- "audio_streams",
- "cros_alsa",
- "libcras",
- "remain",
- "serde",
- "serde_yaml",
- "sys_util",
-]
-
-[[package]]
-name = "dtoa"
-version = "0.4.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "88d7ed2934d741c6b37e33e3832298e8850b53fd2d2bea03873375596c7cea4e"
-
-[[package]]
-name = "getopts"
-version = "0.2.21"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "14dbbfd5c71d70241ecf9e6f13737f7b5ce823821063188d7e46c41d371eebd5"
-dependencies = [
- "unicode-width",
-]
-
-[[package]]
-name = "libc"
-version = "0.2.82"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "89203f3fba0a3795506acaad8ebce3c80c0af93f994d5a1d7a0b1eeb23271929"
-
-[[package]]
-name = "libcras"
-version = "0.1.0"
-dependencies = [
- "audio_streams",
- "cras-sys",
- "data_model",
- "libc",
- "sys_util",
-]
-
-[[package]]
-name = "linked-hash-map"
-version = "0.5.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3"
-
-[[package]]
-name = "pkg-config"
-version = "0.3.19"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c"
-
-[[package]]
-name = "poll_token_derive"
-version = "0.1.0"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "proc-macro2"
-version = "1.0.24"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71"
-dependencies = [
- "unicode-xid",
-]
-
-[[package]]
-name = "quote"
-version = "1.0.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "991431c3519a3f36861882da93630ce66b52918dcf1b8e2fd66b397fc96f28df"
-dependencies = [
- "proc-macro2",
-]
-
-[[package]]
-name = "remain"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "70ba1e78fa68412cb93ef642fd4d20b9a941be49ee9333875ebaf13112673ea7"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "serde"
-version = "1.0.119"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9bdd36f49e35b61d49efd8aa7fc068fd295961fd2286d0b2ee9a4c7a14e99cc3"
-dependencies = [
- "serde_derive",
-]
-
-[[package]]
-name = "serde_derive"
-version = "1.0.119"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "552954ce79a059ddd5fd68c271592374bd15cab2274970380c000118aeffe1cd"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "serde_yaml"
-version = "0.8.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "971be8f6e4d4a47163b405a3df70d14359186f9ab0f3a3ec37df144ca1ce089f"
-dependencies = [
- "dtoa",
- "linked-hash-map",
- "serde",
- "yaml-rust",
-]
-
-[[package]]
-name = "sof_sys"
-version = "0.1.0"
-
-[[package]]
-name = "sound_card_init"
-version = "0.1.0"
-dependencies = [
- "amp",
- "audio_streams",
- "cros_alsa",
- "dsm",
- "getopts",
- "libcras",
- "remain",
- "serde",
- "serde_yaml",
- "sof_sys",
- "sys_util",
-]
-
-[[package]]
-name = "syn"
-version = "1.0.58"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cc60a3d73ea6594cd712d830cc1f0390fd71542d8c8cd24e70cc54cdfd5e05d5"
-dependencies = [
- "proc-macro2",
- "quote",
- "unicode-xid",
-]
-
-[[package]]
-name = "sync"
-version = "0.1.0"
-
-[[package]]
-name = "sys_util"
-version = "0.1.0"
-dependencies = [
- "android_log-sys",
- "data_model",
- "libc",
- "poll_token_derive",
- "sync",
- "syscall_defines",
- "tempfile",
-]
-
-[[package]]
-name = "syscall_defines"
-version = "0.1.0"
-
-[[package]]
-name = "tempfile"
-version = "3.0.7"
-dependencies = [
- "libc",
-]
-
-[[package]]
-name = "unicode-width"
-version = "0.1.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3"
-
-[[package]]
-name = "unicode-xid"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564"
-
-[[package]]
-name = "yaml-rust"
-version = "0.4.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85"
-dependencies = [
- "linked-hash-map",
-]
diff --git a/sound_card_init/Cargo.toml b/sound_card_init/Cargo.toml
deleted file mode 100644
index 9d5a107..0000000
--- a/sound_card_init/Cargo.toml
+++ /dev/null
@@ -1,33 +0,0 @@
-[package]
-name = "sound_card_init"
-version = "0.1.0"
-authors = ["The Chromium OS Authors"]
-edition = "2018"
-description = "Sound Card Initializer"
-
-[workspace]
-members = [
-    "amp",
-    "dsm"
-]
-
-[dependencies]
-amp = { path = "amp" }
-audio_streams = "*"
-cros_alsa = "*"
-dsm = { path = "dsm" }
-getopts = "0.2"
-libcras = "*"
-remain = "0.2.1"
-serde = { version = "1.0", features = ["derive"] }
-serde_yaml = "0.8.11"
-sof_sys = "*"
-sys_util = "*"
-
-[patch.crates-io]
-audio_streams = { path = "../audio_streams" }  # ignored by ebuild
-cros_alsa = { path = "../cros_alsa" } # ignored by ebuild
-cros_alsa_derive = { path = "../cros_alsa/cros_alsa_derive" } # ignored by ebuild
-libcras = { path = "../cras/client/libcras" }  # ignored by ebuild
-sof_sys = { path = "../sof_sys" }  # ignored by ebuild
-sys_util = { path = "../../../platform/crosvm/sys_util" } # ignored by ebuild
diff --git a/sound_card_init/amp/Cargo.lock b/sound_card_init/amp/Cargo.lock
deleted file mode 100644
index 679e60c..0000000
--- a/sound_card_init/amp/Cargo.lock
+++ /dev/null
@@ -1,254 +0,0 @@
-# This file is automatically @generated by Cargo.
-# It is not intended for manual editing.
-[[package]]
-name = "alsa-sys"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "644d308f5822c2b39fba5a6d850f74c208bf73c61d1d2dfad62505d6960e4977"
-dependencies = [
- "libc",
- "pkg-config",
-]
-
-[[package]]
-name = "amp"
-version = "0.1.0"
-dependencies = [
- "cros_alsa",
- "dsm",
- "libcras",
- "remain",
- "serde",
- "serde_yaml",
- "sof_sys",
- "sys_util",
-]
-
-[[package]]
-name = "android_log-sys"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "85965b6739a430150bdd138e2374a98af0c3ee0d030b3bb7fc3bddff58d0102e"
-
-[[package]]
-name = "assertions"
-version = "0.1.0"
-
-[[package]]
-name = "audio_streams"
-version = "0.1.0"
-dependencies = [
- "sync",
- "sys_util",
-]
-
-[[package]]
-name = "cras-sys"
-version = "0.1.0"
-dependencies = [
- "audio_streams",
- "data_model",
-]
-
-[[package]]
-name = "cros_alsa"
-version = "0.1.0"
-dependencies = [
- "alsa-sys",
- "cros_alsa_derive",
- "libc",
- "remain",
-]
-
-[[package]]
-name = "cros_alsa_derive"
-version = "0.1.0"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "data_model"
-version = "0.1.0"
-dependencies = [
- "assertions",
- "libc",
-]
-
-[[package]]
-name = "dsm"
-version = "0.1.0"
-dependencies = [
- "audio_streams",
- "cros_alsa",
- "libcras",
- "remain",
- "serde",
- "serde_yaml",
- "sys_util",
-]
-
-[[package]]
-name = "dtoa"
-version = "0.4.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "88d7ed2934d741c6b37e33e3832298e8850b53fd2d2bea03873375596c7cea4e"
-
-[[package]]
-name = "libc"
-version = "0.2.84"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1cca32fa0182e8c0989459524dc356b8f2b5c10f1b9eb521b7d182c03cf8c5ff"
-
-[[package]]
-name = "libcras"
-version = "0.1.0"
-dependencies = [
- "audio_streams",
- "cras-sys",
- "data_model",
- "libc",
- "sys_util",
-]
-
-[[package]]
-name = "linked-hash-map"
-version = "0.5.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3"
-
-[[package]]
-name = "pkg-config"
-version = "0.3.19"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c"
-
-[[package]]
-name = "poll_token_derive"
-version = "0.1.0"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "proc-macro2"
-version = "1.0.24"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71"
-dependencies = [
- "unicode-xid",
-]
-
-[[package]]
-name = "quote"
-version = "1.0.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "991431c3519a3f36861882da93630ce66b52918dcf1b8e2fd66b397fc96f28df"
-dependencies = [
- "proc-macro2",
-]
-
-[[package]]
-name = "remain"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "70ba1e78fa68412cb93ef642fd4d20b9a941be49ee9333875ebaf13112673ea7"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "serde"
-version = "1.0.123"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "92d5161132722baa40d802cc70b15262b98258453e85e5d1d365c757c73869ae"
-dependencies = [
- "serde_derive",
-]
-
-[[package]]
-name = "serde_derive"
-version = "1.0.123"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9391c295d64fc0abb2c556bad848f33cb8296276b1ad2677d1ae1ace4f258f31"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "serde_yaml"
-version = "0.8.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "971be8f6e4d4a47163b405a3df70d14359186f9ab0f3a3ec37df144ca1ce089f"
-dependencies = [
- "dtoa",
- "linked-hash-map",
- "serde",
- "yaml-rust",
-]
-
-[[package]]
-name = "sof_sys"
-version = "0.1.0"
-
-[[package]]
-name = "syn"
-version = "1.0.60"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c700597eca8a5a762beb35753ef6b94df201c81cca676604f547495a0d7f0081"
-dependencies = [
- "proc-macro2",
- "quote",
- "unicode-xid",
-]
-
-[[package]]
-name = "sync"
-version = "0.1.0"
-
-[[package]]
-name = "sys_util"
-version = "0.1.0"
-dependencies = [
- "android_log-sys",
- "data_model",
- "libc",
- "poll_token_derive",
- "sync",
- "syscall_defines",
- "tempfile",
-]
-
-[[package]]
-name = "syscall_defines"
-version = "0.1.0"
-
-[[package]]
-name = "tempfile"
-version = "3.0.7"
-dependencies = [
- "libc",
-]
-
-[[package]]
-name = "unicode-xid"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564"
-
-[[package]]
-name = "yaml-rust"
-version = "0.4.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85"
-dependencies = [
- "linked-hash-map",
-]
diff --git a/sound_card_init/amp/Cargo.toml b/sound_card_init/amp/Cargo.toml
deleted file mode 100644
index 62e63db..0000000
--- a/sound_card_init/amp/Cargo.toml
+++ /dev/null
@@ -1,16 +0,0 @@
-[package]
-name = "amp"
-version = "0.1.0"
-authors = ["The Chromium OS Authors"]
-edition = "2018"
-description = "The boot time calibration logic for smart amp"
-
-[dependencies]
-cros_alsa = "*"
-libcras = "*"
-dsm = { path = "../dsm" }
-remain = "0.2.1"
-serde = { version = "1.0", features = ["derive"]}
-serde_yaml = "0.8.11"
-sof_sys = "*"
-sys_util = "*"
diff --git a/sound_card_init/amp/src/lib.rs b/sound_card_init/amp/src/lib.rs
deleted file mode 100644
index 7114233..0000000
--- a/sound_card_init/amp/src/lib.rs
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright 2021 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//! `amp` crate provides `Amp` trait for amplifier initializations and `AmpBuilder`
-//! to create `Amp` objects.
-#![deny(missing_docs)]
-
-mod max98373d;
-mod max98390d;
-use std::path::PathBuf;
-
-use dsm::Error;
-
-use max98373d::Max98373;
-use max98390d::Max98390;
-
-type Result<T> = std::result::Result<T, Error>;
-const CONF_DIR: &str = "/etc/sound_card_init";
-
-/// It creates `Amp` object based on the sound card name.
-pub struct AmpBuilder<'a> {
-    sound_card_id: &'a str,
-    config_path: PathBuf,
-}
-
-impl<'a> AmpBuilder<'a> {
-    /// Creates an `AmpBuilder`.
-    /// # Arguments
-    ///
-    /// * `card_name` - card name.
-    /// * `conf_file` - config file name.
-    pub fn new(sound_card_id: &'a str, conf_file: &'a str) -> Self {
-        let config_path = PathBuf::from(CONF_DIR).join(conf_file);
-        AmpBuilder {
-            sound_card_id,
-            config_path,
-        }
-    }
-
-    /// Creates an `Amp` based on the sound card name.
-    pub fn build(&self) -> Result<Box<dyn Amp>> {
-        match self.sound_card_id {
-            "sofcmlmax98390d" => {
-                Ok(Box::new(Max98390::new(self.sound_card_id, &self.config_path)?) as Box<dyn Amp>)
-            }
-            "sofrt5682" => {
-                Ok(Box::new(Max98373::new(self.sound_card_id, &self.config_path)?) as Box<dyn Amp>)
-            }
-            _ => Err(Error::UnsupportedSoundCard(self.sound_card_id.to_owned())),
-        }
-    }
-}
-
-/// It defines the required functions of amplifier objects.
-pub trait Amp {
-    /// The amplifier boot time calibration flow.
-    fn boot_time_calibration(&mut self) -> Result<()>;
-}
diff --git a/sound_card_init/amp/src/max98373d/dsm_param.rs b/sound_card_init/amp/src/max98373d/dsm_param.rs
deleted file mode 100644
index d925752..0000000
--- a/sound_card_init/amp/src/max98373d/dsm_param.rs
+++ /dev/null
@@ -1,211 +0,0 @@
-// Copyright 2020 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-use std::mem;
-
-use cros_alsa::{Card, TLV};
-use sof_sys::sof_abi_hdr;
-
-use dsm::{self, Error, Result};
-
-/// Amp volume mode enumeration used by set_volume().
-#[derive(Copy, Clone, PartialEq)]
-pub enum VolumeMode {
-    /// Low mode protects the speaker by limiting its output volume if the
-    /// calibration has not been completed successfully.
-    Low = 0x1009B9CF,
-    /// High mode removes the speaker output volume limitation after
-    /// having successfully completed the calibration.
-    High = 0x20000000,
-}
-
-#[derive(Copy, Clone)]
-/// Calibration mode enumeration.
-pub enum CalibMode {
-    ON = 0x4,
-    OFF = 0x1,
-}
-
-#[derive(Copy, Clone)]
-/// Smart pilot signal mode mode enumeration.
-pub enum SPTMode {
-    ON = 0x1,
-    OFF = 0x0,
-}
-
-#[derive(Copy, Clone)]
-/// DSM Parem field enumeration.
-enum DsmAPI {
-    ParamCount = 0x0,
-    CalibMode = 0x1,
-    MakeupGain = 0x5,
-    DsmRdc = 0x6,
-    DsmAmbientTemp = 0x8,
-    AdaptiveRdc = 0x12,
-    SPTMode = 0x68,
-}
-
-#[derive(Debug)]
-/// It implements functions to access the `DSMParam` fields.
-pub struct DSMParam {
-    param_count: usize,
-    num_channels: usize,
-    tlv: TLV,
-}
-
-impl DSMParam {
-    const DWORD_PER_PARAM: usize = 2;
-    const VALUE_OFFSET: usize = 1;
-    const SOF_HEADER_SIZE: usize = mem::size_of::<sof_abi_hdr>() / mem::size_of::<i32>();
-
-    /// Creates an `DSMParam`.
-    /// # Arguments
-    ///
-    /// * `card` - `&Card`.
-    /// * `num_channels` - number of channels.
-    /// * `ctl_name` - the mixer control name to access the DSM param.
-    ///
-    /// # Results
-    ///
-    /// * `DSMParam` - It is initialized by the content of the given byte control .
-    ///
-    /// # Errors
-    ///
-    /// * If `Card` creation from sound card name fails.
-    pub fn new(card: &mut Card, num_channels: usize, ctl_name: &str) -> Result<Self> {
-        let tlv = card.control_tlv_by_name(ctl_name)?.load()?;
-        Self::try_from_tlv(tlv, num_channels)
-    }
-
-    /// Sets DSMParam to the given calibration mode.
-    pub fn set_calibration_mode(&mut self, mode: CalibMode) {
-        for channel in 0..self.num_channels {
-            self.set(channel, DsmAPI::CalibMode, mode as i32);
-        }
-    }
-
-    /// Sets DSMParam to the given smart pilot signal mode.
-    pub fn set_spt_mode(&mut self, mode: SPTMode) {
-        for channel in 0..self.num_channels {
-            self.set(channel, DsmAPI::SPTMode, mode as i32);
-        }
-    }
-
-    /// Sets DSMParam to the given VolumeMode.
-    pub fn set_volume_mode(&mut self, mode: VolumeMode) {
-        for channel in 0..self.num_channels {
-            self.set(channel, DsmAPI::MakeupGain, mode as i32);
-        }
-    }
-
-    /// Reads the calibrated rdc from DSMParam.
-    pub fn get_adaptive_rdc(&self) -> Vec<i32> {
-        self.get(DsmAPI::AdaptiveRdc)
-    }
-
-    /// Sets DSMParam to the given the calibrated rdc.
-    pub fn set_rdc(&mut self, ch: usize, rdc: i32) {
-        self.set(ch, DsmAPI::DsmRdc, rdc);
-    }
-
-    /// Sets DSMParam to the given calibrated temp.
-    pub fn set_ambient_temp(&mut self, ch: usize, temp: i32) {
-        self.set(ch, DsmAPI::DsmAmbientTemp, temp);
-    }
-
-    /// Sets the `id` field to the given `val`.
-    fn set(&mut self, channel: usize, id: DsmAPI, val: i32) {
-        let pos = Self::value_pos(self.param_count, channel, id);
-        self.tlv[pos] = val as u32;
-    }
-
-    /// Gets the val from the `id` field from all the channels.
-    fn get(&self, id: DsmAPI) -> Vec<i32> {
-        (0..self.num_channels)
-            .map(|channel| {
-                let pos = Self::value_pos(self.param_count, channel, id);
-                self.tlv[pos] as i32
-            })
-            .collect()
-    }
-
-    fn try_from_tlv(tlv: TLV, num_channels: usize) -> Result<Self> {
-        let param_count_pos = Self::value_pos(0, 0, DsmAPI::ParamCount);
-
-        if tlv.len() < param_count_pos {
-            return Err(Error::InvalidDSMParam);
-        }
-
-        let param_count = tlv[param_count_pos] as usize;
-
-        if tlv.len() != Self::SOF_HEADER_SIZE + param_count * num_channels * Self::DWORD_PER_PARAM {
-            return Err(Error::InvalidDSMParam);
-        }
-
-        Ok(Self {
-            param_count,
-            num_channels,
-            tlv,
-        })
-    }
-
-    #[inline]
-    fn value_pos(param_count: usize, channel: usize, id: DsmAPI) -> usize {
-        Self::SOF_HEADER_SIZE
-            + (channel * param_count + id as usize) * Self::DWORD_PER_PARAM
-            + Self::VALUE_OFFSET
-    }
-}
-
-impl Into<TLV> for DSMParam {
-    fn into(self) -> TLV {
-        self.tlv
-    }
-}
-
-#[cfg(test)]
-mod tests {
-    use super::*;
-    const PARAM_COUNT: usize = 138;
-    const CHANNEL_COUNT: usize = 2;
-
-    #[test]
-    fn test_dsmparam_try_from_tlv_ok() {
-        let mut data = vec![
-            0u32;
-            DSMParam::SOF_HEADER_SIZE
-                + CHANNEL_COUNT * PARAM_COUNT * DSMParam::DWORD_PER_PARAM
-        ];
-        data[DSMParam::value_pos(PARAM_COUNT, 0, DsmAPI::ParamCount)] = PARAM_COUNT as u32;
-        data[DSMParam::value_pos(PARAM_COUNT, 1, DsmAPI::ParamCount)] = PARAM_COUNT as u32;
-
-        let tlv = TLV::new(0, data);
-        assert!(DSMParam::try_from_tlv(tlv, CHANNEL_COUNT).is_ok());
-    }
-
-    #[test]
-    fn test_dsmparam_try_from_invalid_len() {
-        let data = vec![0u32; DSMParam::SOF_HEADER_SIZE];
-
-        let tlv = TLV::new(0, data);
-        assert_eq!(
-            DSMParam::try_from_tlv(tlv, CHANNEL_COUNT).unwrap_err(),
-            Error::InvalidDSMParam
-        );
-    }
-
-    #[test]
-    fn test_dsmparam_try_from_param_count() {
-        let data = vec![
-            0u32;
-            DSMParam::SOF_HEADER_SIZE
-                + CHANNEL_COUNT * PARAM_COUNT * DSMParam::DWORD_PER_PARAM
-        ];
-
-        let tlv = TLV::new(0, data);
-        assert_eq!(
-            DSMParam::try_from_tlv(tlv, CHANNEL_COUNT).unwrap_err(),
-            Error::InvalidDSMParam
-        );
-    }
-}
diff --git a/sound_card_init/amp/src/max98373d/mod.rs b/sound_card_init/amp/src/max98373d/mod.rs
deleted file mode 100644
index 1ee29ce..0000000
--- a/sound_card_init/amp/src/max98373d/mod.rs
+++ /dev/null
@@ -1,274 +0,0 @@
-// Copyright 2020 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//! `max98373d` module implements the required initialization workflows for sound
-//! cards that use max98373d smart amp.
-//! It currently supports boot time calibration for max98373d.
-#![deny(missing_docs)]
-mod dsm_param;
-mod settings;
-
-use std::path::Path;
-use std::time::Duration;
-use std::{fs, thread};
-
-use cros_alsa::{Card, IntControl};
-use dsm::{CalibData, Error, Result, SpeakerStatus, ZeroPlayer, DSM};
-use sys_util::info;
-
-use crate::Amp;
-use dsm_param::*;
-use settings::{AmpCalibSettings, DeviceSettings};
-
-/// It implements the amplifier boot time calibration flow.
-pub struct Max98373 {
-    card: Card,
-    setting: AmpCalibSettings,
-}
-
-impl Amp for Max98373 {
-    /// Performs max98373d boot time calibration.
-    ///
-    /// # Errors
-    ///
-    /// If any amplifiers fail to complete the calibration.
-    fn boot_time_calibration(&mut self) -> Result<()> {
-        if !Path::new(&self.setting.dsm_param).exists() {
-            return Err(Error::MissingDSMParam);
-        }
-
-        let num_channels = self.setting.num_channels();
-        let dsm = DSM::new(
-            &self.card.name(),
-            num_channels,
-            Self::rdc_to_ohm,
-            Self::TEMP_UPPER_LIMIT_CELSIUS,
-            Self::TEMP_LOWER_LIMIT_CELSIUS,
-        );
-        self.set_volume(VolumeMode::Low)?;
-
-        let calib = if !self.setting.boot_time_calibration_enabled {
-            info!("skip boot time calibration and use vpd values");
-            // Needs Rdc updates to be done after internal speaker is ready otherwise
-            // it would be overwritten by the DSM blob update.
-            dsm.wait_for_speakers_ready()?;
-            dsm.get_all_vpd_calibration_value()?
-        } else {
-            match dsm.check_speaker_over_heated_workflow()? {
-                SpeakerStatus::Hot(previous_calib) => previous_calib,
-                SpeakerStatus::Cold => {
-                    let all_temp = self.get_ambient_temp()?;
-                    let all_rdc = self.do_rdc_calibration()?;
-                    all_rdc
-                        .iter()
-                        .zip(all_temp)
-                        .enumerate()
-                        .map(|(ch, (&rdc, temp))| {
-                            dsm.decide_calibration_value_workflow(ch, CalibData { rdc, temp })
-                        })
-                        .collect::<Result<Vec<_>>>()?
-                }
-            }
-        };
-        self.apply_calibration_value(&calib)?;
-        self.set_volume(VolumeMode::High)?;
-        Ok(())
-    }
-}
-
-impl Max98373 {
-    const TEMP_CALIB_WARM_UP_TIME: Duration = Duration::from_millis(10);
-    const RDC_CALIB_WARM_UP_TIME: Duration = Duration::from_millis(500);
-    const RDC_CALIB_INTERVAL: Duration = Duration::from_millis(200);
-    const CALIB_REPEAT_TIMES: usize = 5;
-
-    const TEMP_UPPER_LIMIT_CELSIUS: f32 = 40.0;
-    const TEMP_LOWER_LIMIT_CELSIUS: f32 = 0.0;
-
-    /// Creates an `Max98373`.
-    /// # Arguments
-    ///
-    /// * `card_name` - card_name.
-    /// * `config_path` - config file path.
-    ///
-    /// # Results
-    ///
-    /// * `Max98373` - It implements the Max98373 functions of boot time calibration.
-    ///
-    /// # Errors
-    ///
-    /// * If `Card` creation from sound card name fails.
-    pub fn new(card_name: &str, config_path: &Path) -> Result<Self> {
-        let conf = fs::read_to_string(config_path)
-            .map_err(|e| Error::FileIOFailed(config_path.to_path_buf(), e))?;
-        let settings = DeviceSettings::from_yaml_str(&conf)?;
-        Ok(Self {
-            card: Card::new(card_name)?,
-            setting: settings.amp_calibrations,
-        })
-    }
-
-    /// Triggers the amplifier calibration and reads the calibrated rdc.
-    /// To get accurate calibration results, the main thread calibrates the amplifier while
-    /// the `zero_player` starts another thread to play zeros to the speakers.
-    fn do_rdc_calibration(&mut self) -> Result<Vec<i32>> {
-        let mut zero_player: ZeroPlayer = Default::default();
-        zero_player.start(Self::RDC_CALIB_WARM_UP_TIME)?;
-        // Playback of zeros is started for Self::RDC_CALIB_WARM_UP_TIME, and the main thread
-        // can start the calibration.
-        self.set_spt_mode(SPTMode::OFF)?;
-        self.set_calibration_mode(CalibMode::ON)?;
-        // Playback of zeros is started, and the main thread can start the calibration.
-        let mut avg_rdc = vec![0; self.setting.num_channels()];
-        for _ in 0..Self::CALIB_REPEAT_TIMES {
-            let rdc = self.get_adaptive_rdc()?;
-            for i in 0..self.setting.num_channels() {
-                avg_rdc[i] += rdc[i];
-            }
-            thread::sleep(Self::RDC_CALIB_INTERVAL);
-        }
-        self.set_spt_mode(SPTMode::ON)?;
-        self.set_calibration_mode(CalibMode::OFF)?;
-        zero_player.stop()?;
-
-        avg_rdc = avg_rdc
-            .iter()
-            .map(|val| val / Self::CALIB_REPEAT_TIMES as i32)
-            .collect();
-        Ok(avg_rdc)
-    }
-
-    /// Sets the card volume control to the given VolumeMode.
-    fn set_volume(&mut self, mode: VolumeMode) -> Result<()> {
-        let mut dsm_param = DSMParam::new(
-            &mut self.card,
-            self.setting.num_channels(),
-            &self.setting.dsm_param_read_ctrl,
-        )?;
-
-        dsm_param.set_volume_mode(mode);
-
-        self.card
-            .control_tlv_by_name(&self.setting.dsm_param_write_ctrl)?
-            .save(dsm_param.into())
-            .map_err(Error::DSMParamUpdateFailed)?;
-        Ok(())
-    }
-
-    /// Applies the calibration value to the amp.
-    fn apply_calibration_value(&mut self, calib: &[CalibData]) -> Result<()> {
-        let mut dsm_param = DSMParam::new(
-            &mut self.card,
-            self.setting.num_channels(),
-            &self.setting.dsm_param_read_ctrl,
-        )?;
-        for ch in 0..self.setting.num_channels() {
-            dsm_param.set_rdc(ch, calib[ch].rdc);
-            dsm_param.set_ambient_temp(ch, Self::celsius_to_dsm_unit(calib[ch].temp));
-        }
-        self.card
-            .control_tlv_by_name(&self.setting.dsm_param_write_ctrl)?
-            .save(dsm_param.into())
-            .map_err(Error::DSMParamUpdateFailed)?;
-        Ok(())
-    }
-
-    /// Rdc (ohm) = [ID:0x12] * 3.66 / 2^27
-    #[inline]
-    fn rdc_to_ohm(x: i32) -> f32 {
-        (3.66 * x as f32) / (1 << 27) as f32
-    }
-
-    /// Returns the ambient temperature in celsius degree.
-    fn get_ambient_temp(&mut self) -> Result<Vec<f32>> {
-        let mut zero_player: ZeroPlayer = Default::default();
-        zero_player.start(Self::TEMP_CALIB_WARM_UP_TIME)?;
-        let mut temps = Vec::new();
-        for x in 0..self.setting.num_channels() as usize {
-            let temp = self
-                .card
-                .control_by_name::<IntControl>(&self.setting.temp_ctrl[x])?
-                .get()?;
-            let celsius = Self::measured_temp_to_celsius(temp);
-            temps.push(celsius);
-        }
-        zero_player.stop()?;
-
-        Ok(temps)
-    }
-
-    /// Converts the measured ambient temperature to celsius unit.
-    #[inline]
-    fn measured_temp_to_celsius(temp: i32) -> f32 {
-        // Measured Temperature (°C) = ([Mixer Val] * 1.28) - 29
-        (temp as f32 * 1.28) - 29.0
-    }
-
-    /// Converts the ambient temperature from celsius to the DsmSetAPI::DsmAmbientTemp unit.
-    #[inline]
-    fn celsius_to_dsm_unit(celsius: f32) -> i32 {
-        // Temperature (℃) = [ID:0x12] / 2^19
-        (celsius * (1 << 19) as f32) as i32
-    }
-
-    /// Sets the amp to the given smart pilot signal mode.
-    fn set_spt_mode(&mut self, mode: SPTMode) -> Result<()> {
-        let mut dsm_param = DSMParam::new(
-            &mut self.card,
-            self.setting.num_channels(),
-            &self.setting.dsm_param_read_ctrl,
-        )?;
-        dsm_param.set_spt_mode(mode);
-        self.card
-            .control_tlv_by_name(&self.setting.dsm_param_write_ctrl)?
-            .save(dsm_param.into())
-            .map_err(Error::DSMParamUpdateFailed)?;
-        Ok(())
-    }
-
-    /// Sets the amp to the given the calibration mode.
-    fn set_calibration_mode(&mut self, mode: CalibMode) -> Result<()> {
-        let mut dsm_param = DSMParam::new(
-            &mut self.card,
-            self.setting.num_channels(),
-            &self.setting.dsm_param_read_ctrl,
-        )?;
-        dsm_param.set_calibration_mode(mode);
-        self.card
-            .control_tlv_by_name(&self.setting.dsm_param_write_ctrl)?
-            .save(dsm_param.into())
-            .map_err(Error::DSMParamUpdateFailed)?;
-        Ok(())
-    }
-
-    /// Reads the calibrated rdc.
-    /// Must be called when the calibration mode in on.
-    fn get_adaptive_rdc(&mut self) -> Result<Vec<i32>> {
-        let dsm_param = DSMParam::new(
-            &mut self.card,
-            self.setting.num_channels(),
-            &self.setting.dsm_param_read_ctrl,
-        )?;
-        Ok(dsm_param.get_adaptive_rdc())
-    }
-}
-
-#[cfg(test)]
-mod tests {
-    use super::*;
-    #[test]
-    fn celsius_to_dsm_unit() {
-        assert_eq!(Max98373::celsius_to_dsm_unit(37.0), 0x01280000);
-        assert_eq!(Max98373::celsius_to_dsm_unit(50.0), 0x01900000);
-    }
-
-    #[test]
-    fn rdc_to_ohm() {
-        assert_eq!(Max98373::rdc_to_ohm(0x05cea0c7), 2.656767);
-    }
-
-    #[test]
-    fn measured_temp_to_celsius() {
-        assert_eq!(Max98373::measured_temp_to_celsius(56), 42.68);
-    }
-}
diff --git a/sound_card_init/amp/src/max98373d/settings.rs b/sound_card_init/amp/src/max98373d/settings.rs
deleted file mode 100644
index 1d6e64e..0000000
--- a/sound_card_init/amp/src/max98373d/settings.rs
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2020 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-use std::string::String;
-
-use dsm::{self, Error, Result};
-use serde::Deserialize;
-/// `DeviceSettings` includes the settings of max98373. It currently includes:
-/// * the settings of amplifier calibration.
-/// * the path of dsm_param.
-#[derive(Debug, Default, PartialEq, Deserialize, Clone)]
-pub struct DeviceSettings {
-    pub amp_calibrations: AmpCalibSettings,
-}
-
-/// `AmpCalibSettings` includes the settings needed for amplifier calibration.
-#[derive(Debug, Default, PartialEq, Deserialize, Clone)]
-pub struct AmpCalibSettings {
-    pub dsm_param_read_ctrl: String,
-    pub dsm_param_write_ctrl: String,
-    pub temp_ctrl: Vec<String>,
-    // Path of the dsm_param.bin file.
-    pub dsm_param: String,
-    pub boot_time_calibration_enabled: bool,
-}
-
-impl AmpCalibSettings {
-    /// Returns the number of channels.
-    pub fn num_channels(&self) -> usize {
-        self.temp_ctrl.len()
-    }
-}
-
-impl DeviceSettings {
-    /// Creates a `DeviceSettings` from a yaml str.
-    pub fn from_yaml_str(conf: &str) -> Result<DeviceSettings> {
-        let settings: DeviceSettings = serde_yaml::from_str(conf)
-            .map_err(|e| Error::DeserializationFailed("DeviceSettings".to_owned(), e))?;
-        Ok(settings)
-    }
-}
diff --git a/sound_card_init/amp/src/max98390d/mod.rs b/sound_card_init/amp/src/max98390d/mod.rs
deleted file mode 100644
index 601165e..0000000
--- a/sound_card_init/amp/src/max98390d/mod.rs
+++ /dev/null
@@ -1,213 +0,0 @@
-// Copyright 2020 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//! `max98390d` module implements the required initialization workflows for sound
-//! cards that use max98390d smart amp.
-//! It currently supports boot time calibration for max98390d.
-#![deny(missing_docs)]
-mod settings;
-
-use std::time::Duration;
-use std::{fs, path::Path};
-
-use cros_alsa::{Card, IntControl, SwitchControl};
-use dsm::{CalibData, Error, Result, SpeakerStatus, TempConverter, ZeroPlayer, DSM};
-
-use crate::Amp;
-use settings::{AmpCalibSettings, DeviceSettings};
-
-/// Amp volume mode emulation used by set_volume().
-#[derive(PartialEq, Clone, Copy)]
-enum VolumeMode {
-    /// Low mode protects the speaker by limiting its output volume if the
-    /// calibration has not been completed successfully.
-    Low = 138,
-    /// High mode removes the speaker output volume limitation after
-    /// having successfully completed the calibration.
-    High = 148,
-}
-
-/// It implements the Max98390 functions of boot time calibration.
-#[derive(Debug)]
-pub struct Max98390 {
-    card: Card,
-    setting: AmpCalibSettings,
-}
-
-impl Amp for Max98390 {
-    /// Performs max98390d boot time calibration.
-    ///
-    /// # Errors
-    ///
-    /// If the amplifier fails to complete the calibration.
-    fn boot_time_calibration(&mut self) -> Result<()> {
-        if !Path::new(&self.setting.dsm_param).exists() {
-            return Err(Error::MissingDSMParam);
-        }
-
-        let mut dsm = DSM::new(
-            &self.card.name(),
-            self.setting.num_channels(),
-            Self::rdc_to_ohm,
-            Self::TEMP_UPPER_LIMIT_CELSIUS,
-            Self::TEMP_LOWER_LIMIT_CELSIUS,
-        );
-        dsm.set_temp_converter(TempConverter::new(
-            Self::dsm_unit_to_celsius,
-            Self::celsius_to_dsm_unit,
-        ));
-
-        self.set_volume(VolumeMode::Low)?;
-        let calib = match dsm.check_speaker_over_heated_workflow()? {
-            SpeakerStatus::Hot(previous_calib) => previous_calib,
-            SpeakerStatus::Cold => self
-                .do_calibration()?
-                .iter()
-                .enumerate()
-                .map(|(ch, calib_data)| dsm.decide_calibration_value_workflow(ch, *calib_data))
-                .collect::<Result<Vec<_>>>()?,
-        };
-        self.apply_calibration_value(calib)?;
-        self.set_volume(VolumeMode::High)?;
-        Ok(())
-    }
-}
-
-impl Max98390 {
-    const TEMP_UPPER_LIMIT_CELSIUS: f32 = 40.0;
-    const TEMP_LOWER_LIMIT_CELSIUS: f32 = 0.0;
-    const RDC_CALIB_WARM_UP_TIME: Duration = Duration::from_millis(300);
-
-    /// Creates an `Max98390`.
-    /// # Arguments
-    ///
-    /// * `card_name` - card name.
-    /// * `config_path` - config file path.
-    ///
-    /// # Results
-    ///
-    /// * `Max98390` - It implements the Max98390 functions of boot time calibration.
-    ///
-    /// # Errors
-    ///
-    /// * If `Card` creation from sound card name fails.
-    pub fn new(card_name: &str, config_path: &Path) -> Result<Self> {
-        let conf = fs::read_to_string(config_path)
-            .map_err(|e| Error::FileIOFailed(config_path.to_path_buf(), e))?;
-        let settings = DeviceSettings::from_yaml_str(&conf)?;
-        Ok(Self {
-            card: Card::new(card_name)?,
-            setting: settings.amp_calibrations,
-        })
-    }
-
-    /// Sets the card volume control to given VolumeMode.
-    fn set_volume(&mut self, mode: VolumeMode) -> Result<()> {
-        for control in &self.setting.controls {
-            self.card
-                .control_by_name::<IntControl>(&control.volume_ctrl)?
-                .set(mode as i32)?;
-        }
-        Ok(())
-    }
-
-    /// Applies the calibration value to the amp.
-    fn apply_calibration_value(&mut self, calib: Vec<CalibData>) -> Result<()> {
-        for (ch, &CalibData { rdc, temp }) in calib.iter().enumerate() {
-            self.card
-                .control_by_name::<IntControl>(&self.setting.controls[ch].rdc_ctrl)?
-                .set(rdc)?;
-            self.card
-                .control_by_name::<IntControl>(&self.setting.controls[ch].temp_ctrl)?
-                .set(Self::celsius_to_dsm_unit(temp))?;
-        }
-        Ok(())
-    }
-
-    /// Triggers the amplifier calibration and reads the calibrated rdc and ambient_temp value
-    /// from the mixer control.
-    /// To get accurate calibration results, the main thread calibrates the amplifier while
-    /// the `zero_player` starts another thread to play zeros to the speakers.
-    fn do_calibration(&mut self) -> Result<Vec<CalibData>> {
-        let mut zero_player: ZeroPlayer = Default::default();
-        zero_player.start(Self::RDC_CALIB_WARM_UP_TIME)?;
-        // Playback of zeros is started for Self::RDC_CALIB_WARM_UP_TIME, and the main thread
-        // can start the calibration.
-        let setting = &self.setting;
-        let card = &mut self.card;
-        let calib = setting
-            .controls
-            .iter()
-            .map(|control| {
-                card.control_by_name::<SwitchControl>(&control.calib_ctrl)?
-                    .on()?;
-                let rdc = card
-                    .control_by_name::<IntControl>(&control.rdc_ctrl)?
-                    .get()?;
-                let temp = card
-                    .control_by_name::<IntControl>(&control.temp_ctrl)?
-                    .get()?;
-                card.control_by_name::<SwitchControl>(&control.calib_ctrl)?
-                    .off()?;
-                Ok(CalibData {
-                    rdc,
-                    temp: Self::dsm_unit_to_celsius(temp),
-                })
-            })
-            .collect::<Result<Vec<CalibData>>>()?;
-        zero_player.stop()?;
-        Ok(calib)
-    }
-
-    /// Converts the ambient temperature from celsius to the DSM unit.
-    #[inline]
-    fn celsius_to_dsm_unit(celsius: f32) -> i32 {
-        (celsius * ((1 << 12) as f32) / 100.0) as i32
-    }
-
-    /// Converts the ambient temperature from  DSM unit to celsius.
-    #[inline]
-    fn dsm_unit_to_celsius(temp: i32) -> f32 {
-        temp as f32 * 100.0 / (1 << 12) as f32
-    }
-
-    /// Converts the calibrated value to real DC resistance in ohm unit.
-    #[inline]
-    fn rdc_to_ohm(x: i32) -> f32 {
-        3.66 * (1 << 20) as f32 / x as f32
-    }
-}
-
-#[cfg(test)]
-mod tests {
-    use super::*;
-    #[test]
-    fn celsius_to_dsm_unit() {
-        assert_eq!(
-            Max98390::celsius_to_dsm_unit(Max98390::TEMP_UPPER_LIMIT_CELSIUS),
-            1638
-        );
-        assert_eq!(
-            Max98390::celsius_to_dsm_unit(Max98390::TEMP_LOWER_LIMIT_CELSIUS),
-            0
-        );
-    }
-
-    #[test]
-    fn dsm_unit_to_celsius() {
-        assert_eq!(
-            Max98390::dsm_unit_to_celsius(1638).round(),
-            Max98390::TEMP_UPPER_LIMIT_CELSIUS
-        );
-        assert_eq!(
-            Max98390::dsm_unit_to_celsius(0),
-            Max98390::TEMP_LOWER_LIMIT_CELSIUS
-        );
-    }
-
-    #[test]
-    fn rdc_to_ohm() {
-        assert_eq!(Max98390::rdc_to_ohm(1123160), 3.416956);
-        assert_eq!(Max98390::rdc_to_ohm(1157049), 3.3168762);
-    }
-}
diff --git a/sound_card_init/amp/src/max98390d/settings.rs b/sound_card_init/amp/src/max98390d/settings.rs
deleted file mode 100644
index 316f25b..0000000
--- a/sound_card_init/amp/src/max98390d/settings.rs
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2020 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-use std::string::String;
-
-use dsm::{self, Error, Result};
-use serde::Deserialize;
-
-/// `DeviceSettings` includes the settings of max98390. It currently includes:
-/// * the settings of amplifier calibration.
-/// * the path of dsm_param.
-#[derive(Debug, Default, PartialEq, Deserialize, Clone)]
-pub struct DeviceSettings {
-    pub amp_calibrations: AmpCalibSettings,
-}
-#[derive(Debug, Default, PartialEq, Deserialize, Clone)]
-pub struct AmpCalibCtrl {
-    // Mixer control to get/set rdc value.
-    pub rdc_ctrl: String,
-    // Mixer control to get/set ambient temperature value.
-    pub temp_ctrl: String,
-    // Mixer control to trigger calibration.
-    pub calib_ctrl: String,
-    // Mixer control to adjust volume.
-    pub volume_ctrl: String,
-}
-
-/// `AmpCalibSettings` includes the settings needed for amplifier calibration.
-#[derive(Debug, Default, PartialEq, Deserialize, Clone)]
-pub struct AmpCalibSettings {
-    // Mixer control to get/set rdc value.
-    pub controls: Vec<AmpCalibCtrl>,
-    // Path of the dsm_param.bin file.
-    pub dsm_param: String,
-}
-
-impl AmpCalibSettings {
-    /// Returns the number of channels.
-    pub fn num_channels(&self) -> usize {
-        self.controls.len()
-    }
-}
-
-impl DeviceSettings {
-    /// Creates a `DeviceSettings` from a yaml str.
-    pub fn from_yaml_str(conf: &str) -> Result<DeviceSettings> {
-        let settings: DeviceSettings = serde_yaml::from_str(conf)
-            .map_err(|e| Error::DeserializationFailed("DeviceSettings".to_owned(), e))?;
-        Ok(settings)
-    }
-}
diff --git a/sound_card_init/dsm/Cargo.lock b/sound_card_init/dsm/Cargo.lock
deleted file mode 100644
index 411c752..0000000
--- a/sound_card_init/dsm/Cargo.lock
+++ /dev/null
@@ -1,229 +0,0 @@
-# This file is automatically @generated by Cargo.
-# It is not intended for manual editing.
-[[package]]
-name = "alsa-sys"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "644d308f5822c2b39fba5a6d850f74c208bf73c61d1d2dfad62505d6960e4977"
-dependencies = [
- "libc",
- "pkg-config",
-]
-
-[[package]]
-name = "assertions"
-version = "0.1.0"
-
-[[package]]
-name = "audio_streams"
-version = "0.1.0"
-dependencies = [
- "sync",
- "sys_util",
-]
-
-[[package]]
-name = "cras-sys"
-version = "0.1.0"
-dependencies = [
- "audio_streams",
- "data_model",
-]
-
-[[package]]
-name = "cros_alsa"
-version = "0.1.0"
-dependencies = [
- "alsa-sys",
- "libc",
- "remain",
- "sys_util",
-]
-
-[[package]]
-name = "data_model"
-version = "0.1.0"
-dependencies = [
- "assertions",
-]
-
-[[package]]
-name = "dtoa"
-version = "0.4.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4358a9e11b9a09cf52383b451b49a169e8d797b68aa02301ff586d70d9661ea3"
-
-[[package]]
-name = "libc"
-version = "0.2.69"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "99e85c08494b21a9054e7fe1374a732aeadaff3980b6990b94bfd3a70f690005"
-
-[[package]]
-name = "libcras"
-version = "0.1.0"
-dependencies = [
- "audio_streams",
- "cras-sys",
- "data_model",
- "libc",
- "sys_util",
-]
-
-[[package]]
-name = "linked-hash-map"
-version = "0.5.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ae91b68aebc4ddb91978b11a1b02ddd8602a05ec19002801c5666000e05e0f83"
-
-[[package]]
-name = "max98390d"
-version = "0.1.0"
-dependencies = [
- "audio_streams",
- "cros_alsa",
- "libcras",
- "remain",
- "serde",
- "serde_yaml",
- "sound_card_util",
- "sys_util",
-]
-
-[[package]]
-name = "pkg-config"
-version = "0.3.17"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "05da548ad6865900e60eaba7f589cc0783590a92e940c26953ff81ddbab2d677"
-
-[[package]]
-name = "poll_token_derive"
-version = "0.1.0"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "proc-macro2"
-version = "1.0.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "df246d292ff63439fea9bc8c0a270bed0e390d5ebd4db4ba15aba81111b5abe3"
-dependencies = [
- "unicode-xid",
-]
-
-[[package]]
-name = "quote"
-version = "1.0.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2bdc6c187c65bca4260c9011c9e3132efe4909da44726bad24cf7572ae338d7f"
-dependencies = [
- "proc-macro2",
-]
-
-[[package]]
-name = "remain"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "99c861227fc40c8da6fdaa3d58144ac84c0537080a43eb1d7d45c28f88dcb888"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "serde"
-version = "1.0.106"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "36df6ac6412072f67cf767ebbde4133a5b2e88e76dc6187fa7104cd16f783399"
-dependencies = [
- "serde_derive",
-]
-
-[[package]]
-name = "serde_derive"
-version = "1.0.106"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9e549e3abf4fb8621bd1609f11dfc9f5e50320802273b12f3811a67e6716ea6c"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "serde_yaml"
-version = "0.8.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "691b17f19fc1ec9d94ec0b5864859290dff279dbd7b03f017afda54eb36c3c35"
-dependencies = [
- "dtoa",
- "linked-hash-map",
- "serde",
- "yaml-rust",
-]
-
-[[package]]
-name = "sound_card_util"
-version = "0.1.0"
-dependencies = [
- "cros_alsa",
- "remain",
- "sys_util",
-]
-
-[[package]]
-name = "syn"
-version = "1.0.17"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0df0eb663f387145cab623dea85b09c2c5b4b0aef44e945d928e682fce71bb03"
-dependencies = [
- "proc-macro2",
- "quote",
- "unicode-xid",
-]
-
-[[package]]
-name = "sync"
-version = "0.1.0"
-
-[[package]]
-name = "sys_util"
-version = "0.1.0"
-dependencies = [
- "data_model",
- "libc",
- "poll_token_derive",
- "sync",
- "syscall_defines",
- "tempfile",
-]
-
-[[package]]
-name = "syscall_defines"
-version = "0.1.0"
-
-[[package]]
-name = "tempfile"
-version = "3.0.7"
-dependencies = [
- "libc",
-]
-
-[[package]]
-name = "unicode-xid"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c"
-
-[[package]]
-name = "yaml-rust"
-version = "0.4.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "65923dd1784f44da1d2c3dbbc5e822045628c590ba72123e1c73d3c230c4434d"
-dependencies = [
- "linked-hash-map",
-]
diff --git a/sound_card_init/dsm/Cargo.toml b/sound_card_init/dsm/Cargo.toml
deleted file mode 100644
index 280896d..0000000
--- a/sound_card_init/dsm/Cargo.toml
+++ /dev/null
@@ -1,15 +0,0 @@
-[package]
-name = "dsm"
-version = "0.1.0"
-authors = ["The Chromium OS Authors"]
-edition = "2018"
-description = "The boot time calibration logic for smart amp"
-
-[dependencies]
-cros_alsa = "*"
-audio_streams = "*"
-libcras = "*"
-remain = "0.2.1"
-serde = { version = "1.0", features = ["derive"]}
-serde_yaml = "0.8.11"
-sys_util = "*"
\ No newline at end of file
diff --git a/sound_card_init/dsm/src/datastore.rs b/sound_card_init/dsm/src/datastore.rs
deleted file mode 100644
index f0180cc..0000000
--- a/sound_card_init/dsm/src/datastore.rs
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright 2020 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-use std::fs::{remove_file, File};
-use std::io::{prelude::*, BufReader, BufWriter};
-use std::path::PathBuf;
-
-use serde::{Deserialize, Serialize};
-use sys_util::info;
-
-use crate::error::{Error, Result};
-
-/// `Datastore`, which stores and reads calibration values in yaml format.
-#[derive(Debug, Deserialize, Serialize, Copy, Clone)]
-pub enum Datastore {
-    /// Indicates using values in VPD.
-    UseVPD,
-    DSM {
-        rdc: i32,
-        temp: i32,
-    },
-}
-
-impl Datastore {
-    /// The dir of datastore.
-    pub const DATASTORE_DIR: &'static str = "/var/lib/sound_card_init";
-
-    /// Creates a `Datastore` and initializes its fields from the datastore file.
-    pub fn from_file(snd_card: &str, channel: usize) -> Result<Datastore> {
-        let path = Self::path(snd_card, channel);
-        let reader =
-            BufReader::new(File::open(&path).map_err(|e| Error::FileIOFailed(path.to_owned(), e))?);
-        let datastore: Datastore =
-            serde_yaml::from_reader(reader).map_err(|e| Error::SerdeError(path.to_owned(), e))?;
-        Ok(datastore)
-    }
-
-    /// Saves a `Datastore` to file.
-    pub fn save(&self, snd_card: &str, channel: usize) -> Result<()> {
-        let path = Self::path(snd_card, channel);
-
-        let mut writer = BufWriter::new(
-            File::create(&path).map_err(|e| Error::FileIOFailed(path.to_owned(), e))?,
-        );
-        writer
-            .write(
-                serde_yaml::to_string(self)
-                    .map_err(|e| Error::SerdeError(path.to_owned(), e))?
-                    .as_bytes(),
-            )
-            .map_err(|e| Error::FileIOFailed(path.to_owned(), e))?;
-        writer
-            .flush()
-            .map_err(|e| Error::FileIOFailed(path.to_owned(), e))?;
-        info!("update Datastore {}: {:?}", path.to_string_lossy(), self);
-        Ok(())
-    }
-
-    /// Deletes the datastore file.
-    pub fn delete(snd_card: &str, channel: usize) -> Result<()> {
-        let path = Self::path(snd_card, channel);
-        remove_file(&path).map_err(|e| Error::FileIOFailed(path.to_owned(), e))?;
-        info!("datastore: {:#?} is deleted.", path);
-        Ok(())
-    }
-
-    fn path(snd_card: &str, channel: usize) -> PathBuf {
-        PathBuf::from(Self::DATASTORE_DIR)
-            .join(snd_card)
-            .join(format!("calib_{}", channel))
-    }
-}
diff --git a/sound_card_init/dsm/src/error.rs b/sound_card_init/dsm/src/error.rs
deleted file mode 100644
index 4b6e8dc..0000000
--- a/sound_card_init/dsm/src/error.rs
+++ /dev/null
@@ -1,128 +0,0 @@
-// Copyright 2020 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-use std::any::Any;
-use std::error;
-use std::fmt;
-use std::io;
-use std::num::ParseIntError;
-use std::path::PathBuf;
-use std::sync::PoisonError;
-use std::time;
-
-use remain::sorted;
-
-use crate::CalibData;
-
-pub type Result<T> = std::result::Result<T, Error>;
-
-#[sorted]
-#[derive(Debug)]
-pub enum Error {
-    AlsaCardError(cros_alsa::CardError),
-    AlsaControlError(cros_alsa::ControlError),
-    AlsaControlTLVError(cros_alsa::ControlTLVError),
-    CalibrationTimeout,
-    CrasClientFailed(libcras::Error),
-    DeserializationFailed(String, serde_yaml::Error),
-    DSMParamUpdateFailed(cros_alsa::ControlTLVError),
-    FileIOFailed(PathBuf, io::Error),
-    InternalSpeakerNotFound,
-    InvalidDatastore,
-    InvalidDSMParam,
-    InvalidShutDownTime,
-    InvalidTemperature(f32),
-    LargeCalibrationDiff(CalibData),
-    MissingDSMParam,
-    MutexPoisonError,
-    NewPlayStreamFailed(libcras::BoxError),
-    NextPlaybackBufferFailed(libcras::BoxError),
-    PlaybackFailed(io::Error),
-    SerdeError(PathBuf, serde_yaml::Error),
-    StartPlaybackTimeout,
-    SystemTimeError(time::SystemTimeError),
-    UnsupportedSoundCard(String),
-    VPDParseFailed(String, ParseIntError),
-    WorkerPanics(Box<dyn Any + Send + 'static>),
-    ZeroPlayerIsNotRunning,
-    ZeroPlayerIsRunning,
-}
-
-impl PartialEq for Error {
-    // Implement eq for more Error when needed.
-    fn eq(&self, other: &Error) -> bool {
-        match (self, other) {
-            (Error::InvalidDSMParam, Error::InvalidDSMParam) => true,
-            _ => false,
-        }
-    }
-}
-
-impl From<cros_alsa::CardError> for Error {
-    fn from(err: cros_alsa::CardError) -> Error {
-        Error::AlsaCardError(err)
-    }
-}
-
-impl From<cros_alsa::ControlError> for Error {
-    fn from(err: cros_alsa::ControlError) -> Error {
-        Error::AlsaControlError(err)
-    }
-}
-
-impl From<cros_alsa::ControlTLVError> for Error {
-    fn from(err: cros_alsa::ControlTLVError) -> Error {
-        Error::AlsaControlTLVError(err)
-    }
-}
-
-impl<T> From<PoisonError<T>> for Error {
-    fn from(_: PoisonError<T>) -> Error {
-        Error::MutexPoisonError
-    }
-}
-
-impl error::Error for Error {}
-
-impl fmt::Display for Error {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        use Error::*;
-        match self {
-            AlsaCardError(e) => write!(f, "AlsaCardError: {}", e),
-            AlsaControlError(e) => write!(f, "AlsaControlError: {}", e),
-            AlsaControlTLVError(e) => write!(f, "AlsaControlTLVError: {}", e),
-            CalibrationTimeout => write!(f, "calibration is not finished in time"),
-            DSMParamUpdateFailed(e) => write!(f, "failed to update DsmParam, err: {}", e),
-            CrasClientFailed(e) => write!(f, "failed to create cras client: {}", e),
-            DeserializationFailed(file_path, e) => {
-                write!(f, "failed to parse {}: {}", file_path, e)
-            }
-            FileIOFailed(file_path, e) => write!(f, "{:#?}: {}", file_path, e),
-            InvalidShutDownTime => write!(f, "invalid shutdown time"),
-            InternalSpeakerNotFound => write!(f, "internal speaker is not found in cras"),
-            InvalidTemperature(temp) => write!(
-                f,
-                "invalid calibration temperature: {}, and there is no datastore",
-                temp
-            ),
-            InvalidDatastore => write!(f, "invalid datastore format"),
-            InvalidDSMParam => write!(f, "invalid dsm param from kcontrol"),
-            LargeCalibrationDiff(calib) => {
-                write!(f, "calibration difference is too large, calib: {:?}", calib)
-            }
-            MissingDSMParam => write!(f, "missing dsm_param.bin"),
-            MutexPoisonError => write!(f, "mutex is poisoned"),
-            NewPlayStreamFailed(e) => write!(f, "{}", e),
-            NextPlaybackBufferFailed(e) => write!(f, "{}", e),
-            PlaybackFailed(e) => write!(f, "{}", e),
-            SerdeError(file_path, e) => write!(f, "{:?}: {}", file_path, e),
-            StartPlaybackTimeout => write!(f, "playback is not started in time"),
-            SystemTimeError(e) => write!(f, "{}", e),
-            UnsupportedSoundCard(name) => write!(f, "unsupported sound card: {}", name),
-            VPDParseFailed(file_path, e) => write!(f, "failed to parse vpd {}: {}", file_path, e),
-            WorkerPanics(e) => write!(f, "run_play_zero_worker panics: {:#?}", e),
-            ZeroPlayerIsNotRunning => write!(f, "zero player is not running"),
-            ZeroPlayerIsRunning => write!(f, "zero player is running"),
-        }
-    }
-}
diff --git a/sound_card_init/dsm/src/lib.rs b/sound_card_init/dsm/src/lib.rs
deleted file mode 100644
index 0b3ec64..0000000
--- a/sound_card_init/dsm/src/lib.rs
+++ /dev/null
@@ -1,335 +0,0 @@
-// Copyright 2020 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//! `dsm` crate implements the required initialization workflows for smart amps.
-
-mod datastore;
-mod error;
-pub mod utils;
-mod vpd;
-mod zero_player;
-
-use std::{
-    thread,
-    time::{Duration, SystemTime, UNIX_EPOCH},
-};
-
-use libcras::{CrasClient, CrasNodeType};
-use sys_util::{error, info};
-
-use crate::datastore::Datastore;
-pub use crate::error::{Error, Result};
-use crate::utils::{run_time, shutdown_time};
-use crate::vpd::VPD;
-pub use crate::zero_player::ZeroPlayer;
-
-#[derive(Debug, Clone, Copy)]
-/// `CalibData` represents the calibration data.
-pub struct CalibData {
-    /// The DC resistance of the speaker is DSM unit.
-    pub rdc: i32,
-    /// The ambient temperature in celsius unit at which the rdc is measured.
-    pub temp: f32,
-}
-
-/// `TempConverter` converts the temperature value between celsius and unit in VPD::dsm_calib_temp.
-pub struct TempConverter {
-    vpd_to_celsius: fn(i32) -> f32,
-    celsius_to_vpd: fn(f32) -> i32,
-}
-
-impl Default for TempConverter {
-    fn default() -> Self {
-        let vpd_to_celsius = |x: i32| x as f32;
-        let celsius_to_vpd = |x: f32| x.round() as i32;
-        Self {
-            vpd_to_celsius,
-            celsius_to_vpd,
-        }
-    }
-}
-
-impl TempConverter {
-    /// Creates a `TempConverter`
-    ///
-    /// # Arguments
-    ///
-    /// * `vpd_to_celsius` - function to convert VPD::dsm_calib_temp to celsius unit`
-    /// * `celsius_to_vpd` - function to convert celsius unit to VPD::dsm_calib_temp`
-    /// # Results
-    ///
-    /// * `TempConverter` - it converts the temperature value between celsius and unit in VPD::dsm_calib_temp.
-    pub fn new(vpd_to_celsius: fn(i32) -> f32, celsius_to_vpd: fn(f32) -> i32) -> Self {
-        Self {
-            vpd_to_celsius,
-            celsius_to_vpd,
-        }
-    }
-}
-
-/// `SpeakerStatus` are the possible return results of
-/// DSM::check_speaker_over_heated_workflow.
-pub enum SpeakerStatus {
-    ///`SpeakerStatus::Cold` means the speakers are not overheated and the Amp can
-    /// trigger the boot time calibration.
-    Cold,
-    /// `SpeakerStatus::Hot(Vec<CalibData>)` means the speakers may be too hot for calibration.
-    /// The boot time calibration should be skipped and the Amp should use the previous
-    /// calibration values returned by the enum.
-    Hot(Vec<CalibData>),
-}
-
-/// `DSM`, which implements the required initialization workflows for smart amps.
-pub struct DSM {
-    snd_card: String,
-    num_channels: usize,
-    temp_converter: TempConverter,
-    rdc_to_ohm: fn(i32) -> f32,
-    temp_upper_limit: f32,
-    temp_lower_limit: f32,
-}
-
-impl DSM {
-    const SPEAKER_COOL_DOWN_TIME: Duration = Duration::from_secs(180);
-    const CALI_ERROR_UPPER_LIMIT: f32 = 0.3;
-    const CALI_ERROR_LOWER_LIMIT: f32 = 0.03;
-
-    /// Creates a `DSM`
-    ///
-    /// # Arguments
-    ///
-    /// * `snd_card` - `sound card name`.
-    /// * `num_channels` - `number of channels`.
-    /// * `rdc_to_ohm` - `fn(rdc: i32) -> f32 to convert the CalibData::rdc to ohm unit`.
-    /// * `temp_upper_limit` - the high limit of the valid ambient temperature in dsm unit.
-    /// * `temp_lower_limit` - the low limit of the valid ambient temperature in dsm unit.
-    ///
-    /// # Results
-    ///
-    /// * `DSM` - It implements the required initialization workflows for smart amps.
-    pub fn new(
-        snd_card: &str,
-        num_channels: usize,
-        rdc_to_ohm: fn(i32) -> f32,
-        temp_upper_limit: f32,
-        temp_lower_limit: f32,
-    ) -> Self {
-        Self {
-            snd_card: snd_card.to_owned(),
-            num_channels,
-            rdc_to_ohm,
-            temp_converter: TempConverter::default(),
-            temp_upper_limit,
-            temp_lower_limit,
-        }
-    }
-
-    /// Sets self.temp_converter to the given temp_converter.
-    ///
-    /// # Arguments
-    ///
-    /// * `temp_converter` - the convert function to use.
-    pub fn set_temp_converter(&mut self, temp_converter: TempConverter) {
-        self.temp_converter = temp_converter;
-    }
-
-    /// Checks whether the speakers are overheated or not according to the previous shutdown time.
-    /// The boot time calibration should be skipped when the speakers may be too hot
-    /// and the Amp should use the previous calibration value returned by the
-    /// SpeakerStatus::Hot(Vec<CalibData>).
-    ///
-    /// # Results
-    ///
-    /// * `SpeakerStatus::Cold` - which means the speakers are not overheated and the Amp can
-    ///    trigger the boot time calibration.
-    /// * `SpeakerStatus::Hot(Vec<CalibData>)` - when the speakers may be too hot. The boot
-    ///   time calibration should be skipped and the Amp should use the previous calibration values
-    ///   returned by the enum.
-    ///
-    /// # Errors
-    ///
-    /// * The speakers are overheated and there are no previous calibration values stored.
-    /// * Cannot determine whether the speakers are overheated as previous shutdown time record is
-    ///   invalid.
-    pub fn check_speaker_over_heated_workflow(&self) -> Result<SpeakerStatus> {
-        if self.is_first_boot() {
-            return Ok(SpeakerStatus::Cold);
-        }
-        match self.is_speaker_over_heated() {
-            Ok(overheated) => {
-                if overheated {
-                    let calib: Vec<CalibData> = (0..self.num_channels)
-                        .map(|ch| -> Result<CalibData> { self.get_previous_calibration_value(ch) })
-                        .collect::<Result<Vec<CalibData>>>()?;
-                    info!("the speakers are hot, the boot time calibration should be skipped");
-                    return Ok(SpeakerStatus::Hot(calib));
-                }
-                Ok(SpeakerStatus::Cold)
-            }
-            Err(err) => {
-                // We cannot assume the speakers are not replaced or not overheated
-                // when the shutdown time file is invalid; therefore we can not use the datastore
-                // value anymore and we can not trigger boot time calibration.
-                for ch in 0..self.num_channels {
-                    if let Err(e) = Datastore::delete(&self.snd_card, ch) {
-                        error!("error delete datastore: {}", e);
-                    }
-                }
-                Err(err)
-            }
-        }
-    }
-
-    /// Decides a good calibration value and updates the stored value according to the following
-    /// logic:
-    /// * Returns the previous value if the ambient temperature is not within a valid range.
-    /// * Returns Error::LargeCalibrationDiff if rdc difference is larger than
-    ///   `CALI_ERROR_UPPER_LIMIT`.
-    /// * Returns the previous value if the rdc difference is smaller than `CALI_ERROR_LOWER_LIMIT`.
-    /// * Returns the boot time calibration value and updates the datastore value if the rdc.
-    ///   difference is between `CALI_ERROR_UPPER_LIMIT` and `CALI_ERROR_LOWER_LIMIT`.
-    ///
-    /// # Arguments
-    ///
-    /// * `card` - `&Card`.
-    /// * `channel` - `channel number`.
-    /// * `calib_data` - `boot time calibrated data`.
-    ///
-    /// # Results
-    ///
-    /// * `CalibData` - the calibration data to be applied according to the deciding logic.
-    ///
-    /// # Errors
-    ///
-    /// * VPD does not exist.
-    /// * rdc difference is larger than `CALI_ERROR_UPPER_LIMIT`.
-    /// * Failed to update Datastore.
-    pub fn decide_calibration_value_workflow(
-        &self,
-        channel: usize,
-        calib_data: CalibData,
-    ) -> Result<CalibData> {
-        if calib_data.temp < self.temp_lower_limit || calib_data.temp > self.temp_upper_limit {
-            info!("invalid temperature: {}.", calib_data.temp);
-            return self
-                .get_previous_calibration_value(channel)
-                .map_err(|_| Error::InvalidTemperature(calib_data.temp));
-        }
-        let (datastore_exist, previous_calib) = match self.get_previous_calibration_value(channel) {
-            Ok(previous_calib) => (true, previous_calib),
-            Err(e) => {
-                info!("{}, use vpd as previous calibration value", e);
-                (false, self.get_vpd_calibration_value(channel)?)
-            }
-        };
-
-        let diff = {
-            let calib_rdc_ohm = (self.rdc_to_ohm)(calib_data.rdc);
-            let previous_rdc_ohm = (self.rdc_to_ohm)(previous_calib.rdc);
-            (calib_rdc_ohm - previous_rdc_ohm) / previous_rdc_ohm
-        };
-        if diff > Self::CALI_ERROR_UPPER_LIMIT {
-            Err(Error::LargeCalibrationDiff(calib_data))
-        } else if diff < Self::CALI_ERROR_LOWER_LIMIT {
-            if !datastore_exist {
-                Datastore::UseVPD.save(&self.snd_card, channel)?;
-            }
-            Ok(previous_calib)
-        } else {
-            Datastore::DSM {
-                rdc: calib_data.rdc,
-                temp: (self.temp_converter.celsius_to_vpd)(calib_data.temp),
-            }
-            .save(&self.snd_card, channel)?;
-            Ok(calib_data)
-        }
-    }
-
-    /// Gets the calibration values from vpd.
-    ///
-    /// # Results
-    ///
-    /// * `Vec<CalibData>` - the calibration values in vpd.
-    ///
-    /// # Errors
-    ///
-    /// * Failed to read vpd.
-    pub fn get_all_vpd_calibration_value(&self) -> Result<Vec<CalibData>> {
-        (0..self.num_channels)
-            .map(|ch| self.get_vpd_calibration_value(ch))
-            .collect::<Result<Vec<_>>>()
-    }
-
-    /// Blocks until the internal speakers are ready.
-    ///
-    /// # Errors
-    ///
-    /// * Failed to wait the internal speakers to be ready.
-    pub fn wait_for_speakers_ready(&self) -> Result<()> {
-        let find_speaker = || -> Result<()> {
-            let cras_client = CrasClient::new().map_err(Error::CrasClientFailed)?;
-            let _node = cras_client
-                .output_nodes()
-                .find(|node| node.node_type == CrasNodeType::CRAS_NODE_TYPE_INTERNAL_SPEAKER)
-                .ok_or(Error::InternalSpeakerNotFound)?;
-            Ok(())
-        };
-        // TODO(b/155007305): Implement cras_client.wait_node_change and use it here.
-        const RETRY: usize = 3;
-        const RETRY_INTERVAL: Duration = Duration::from_millis(500);
-        for _ in 0..RETRY {
-            match find_speaker() {
-                Ok(_) => return Ok(()),
-                Err(e) => error!("retry on finding speaker: {}", e),
-            };
-            thread::sleep(RETRY_INTERVAL);
-        }
-        Err(Error::InternalSpeakerNotFound)
-    }
-
-    fn is_first_boot(&self) -> bool {
-        !run_time::exists(&self.snd_card)
-    }
-
-    // If (Current time - the latest CRAS shutdown time) < cool_down_time, we assume that
-    // the speakers may be overheated.
-    fn is_speaker_over_heated(&self) -> Result<bool> {
-        let last_run = run_time::from_file(&self.snd_card)?;
-        let last_shutdown = shutdown_time::from_file()?;
-        if last_shutdown < last_run {
-            return Err(Error::InvalidShutDownTime);
-        }
-
-        let now = SystemTime::now()
-            .duration_since(UNIX_EPOCH)
-            .map_err(Error::SystemTimeError)?;
-
-        let elapsed = now
-            .checked_sub(last_shutdown)
-            .ok_or(Error::InvalidShutDownTime)?;
-
-        if elapsed < Self::SPEAKER_COOL_DOWN_TIME {
-            return Ok(true);
-        }
-        Ok(false)
-    }
-
-    fn get_previous_calibration_value(&self, ch: usize) -> Result<CalibData> {
-        let sci_calib = Datastore::from_file(&self.snd_card, ch)?;
-        match sci_calib {
-            Datastore::UseVPD => self.get_vpd_calibration_value(ch),
-            Datastore::DSM { rdc, temp } => Ok(CalibData {
-                rdc,
-                temp: (self.temp_converter.vpd_to_celsius)(temp),
-            }),
-        }
-    }
-
-    fn get_vpd_calibration_value(&self, channel: usize) -> Result<CalibData> {
-        let vpd = VPD::new(channel)?;
-        Ok(CalibData {
-            rdc: vpd.dsm_calib_r0,
-            temp: (self.temp_converter.vpd_to_celsius)(vpd.dsm_calib_temp),
-        })
-    }
-}
diff --git a/sound_card_init/dsm/src/utils.rs b/sound_card_init/dsm/src/utils.rs
deleted file mode 100644
index 64f6c97..0000000
--- a/sound_card_init/dsm/src/utils.rs
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2020 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//! It contains common utils shared within sound_card_init.
-#![deny(missing_docs)]
-
-use std::fs::File;
-use std::io::{prelude::*, BufReader, BufWriter};
-use std::path::PathBuf;
-use std::time::Duration;
-
-use crate::datastore::Datastore;
-use crate::error::{Error, Result};
-
-fn duration_from_file(path: &PathBuf) -> Result<Duration> {
-    let reader =
-        BufReader::new(File::open(&path).map_err(|e| Error::FileIOFailed(path.clone(), e))?);
-    serde_yaml::from_reader(reader).map_err(|e| Error::SerdeError(path.clone(), e))
-}
-
-/// The utils to parse CRAS shutdown time file.
-pub mod shutdown_time {
-    use super::*;
-    // The path of CRAS shutdown time file.
-    const SHUTDOWN_TIME_FILE: &str = "/var/lib/cras/stop";
-
-    /// Reads the unix time from CRAS shutdown time file.
-    pub fn from_file() -> Result<Duration> {
-        duration_from_file(&PathBuf::from(SHUTDOWN_TIME_FILE))
-    }
-}
-
-/// The utils to create and parse sound_card_init run time file.
-pub mod run_time {
-    use std::time::SystemTime;
-
-    use super::*;
-    // The filename of sound_card_init run time file.
-    const RUN_TIME_FILE: &str = "run";
-
-    /// Returns the sound_card_init run time file existence.
-    pub fn exists(snd_card: &str) -> bool {
-        run_time_file(snd_card).exists()
-    }
-
-    /// Reads the unix time from sound_card_init run time file.
-    pub fn from_file(snd_card: &str) -> Result<Duration> {
-        duration_from_file(&run_time_file(snd_card))
-    }
-
-    /// Saves the current unix time to sound_card_init run time file.
-    pub fn now_to_file(snd_card: &str) -> Result<()> {
-        match SystemTime::now().duration_since(SystemTime::UNIX_EPOCH) {
-            Ok(t) => to_file(snd_card, t),
-            Err(e) => Err(Error::SystemTimeError(e)),
-        }
-    }
-
-    /// Saves the unix time to sound_card_init run time file.
-    pub fn to_file(snd_card: &str, duration: Duration) -> Result<()> {
-        let path = run_time_file(snd_card);
-        let mut writer =
-            BufWriter::new(File::create(&path).map_err(|e| Error::FileIOFailed(path.clone(), e))?);
-        writer
-            .write_all(
-                serde_yaml::to_string(&duration)
-                    .map_err(|e| Error::SerdeError(path.clone(), e))?
-                    .as_bytes(),
-            )
-            .map_err(|e| Error::FileIOFailed(path.clone(), e))?;
-        writer
-            .flush()
-            .map_err(|e| Error::FileIOFailed(path.clone(), e))?;
-        Ok(())
-    }
-
-    fn run_time_file(snd_card: &str) -> PathBuf {
-        PathBuf::from(Datastore::DATASTORE_DIR)
-            .join(snd_card)
-            .join(RUN_TIME_FILE)
-    }
-}
diff --git a/sound_card_init/dsm/src/vpd.rs b/sound_card_init/dsm/src/vpd.rs
deleted file mode 100644
index b00864c..0000000
--- a/sound_card_init/dsm/src/vpd.rs
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2020 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-use std::fs::File;
-use std::io::prelude::*;
-use std::io::BufReader;
-use std::path::PathBuf;
-
-use crate::error::{Error, Result};
-
-const VPD_DIR: &str = "/sys/firmware/vpd/ro/vpdfile";
-
-/// `VPD`, which represents the amplifier factory calibration values.
-#[derive(Default, Debug)]
-pub struct VPD {
-    pub dsm_calib_r0: i32,
-    pub dsm_calib_temp: i32,
-}
-
-impl VPD {
-    /// Creates a `VPD` and initializes its fields from VPD_DIR/dsm_calib_r0_{channel}.
-    /// # Arguments
-    ///
-    /// * `channel` - channel number.
-    pub fn new(channel: usize) -> Result<VPD> {
-        let mut vpd: VPD = Default::default();
-        vpd.dsm_calib_r0 = read_vpd_files(&format!("dsm_calib_r0_{}", channel))?;
-        vpd.dsm_calib_temp = read_vpd_files(&format!("dsm_calib_temp_{}", channel))?;
-        Ok(vpd)
-    }
-}
-
-fn read_vpd_files(file: &str) -> Result<i32> {
-    let path = PathBuf::from(VPD_DIR).with_file_name(file);
-    let io_err = |e| Error::FileIOFailed(path.to_owned(), e);
-    let mut reader = BufReader::new(File::open(&path).map_err(io_err)?);
-    let mut line = String::new();
-    reader.read_line(&mut line).map_err(io_err)?;
-    line.parse::<i32>()
-        .map_err(|e| Error::VPDParseFailed(path.to_string_lossy().to_string(), e))
-}
diff --git a/sound_card_init/dsm/src/zero_player.rs b/sound_card_init/dsm/src/zero_player.rs
deleted file mode 100644
index 441f7ff..0000000
--- a/sound_card_init/dsm/src/zero_player.rs
+++ /dev/null
@@ -1,209 +0,0 @@
-// Copyright 2020 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-use std::io::Write;
-use std::sync::atomic::{AtomicBool, Ordering};
-use std::sync::{Arc, Condvar, Mutex};
-use std::thread;
-use std::thread::JoinHandle;
-use std::time::Duration;
-
-use audio_streams::SampleFormat;
-use libcras::{CrasClient, CrasNodeType};
-use sys_util::error;
-
-use crate::error::{Error, Result};
-
-/// `ZeroPlayer` provides the functionality to play zeros sample in the background thread.
-#[derive(Default)]
-pub struct ZeroPlayer {
-    thread_info: Option<PlayZeroWorkerInfo>,
-}
-
-impl Drop for ZeroPlayer {
-    fn drop(&mut self) {
-        if self.thread_info.is_some() {
-            if let Err(e) = self.stop() {
-                error!("{}", e);
-            }
-        }
-    }
-}
-
-impl ZeroPlayer {
-    /// It takes about 400 ms to get CRAS_NODE_TYPE_INTERNAL_SPEAKER during the boot time.
-    const TIMEOUT: Duration = Duration::from_millis(1000);
-
-    /// Returns whether the ZeroPlayer is running.
-    pub fn running(&self) -> bool {
-        self.thread_info.is_some()
-    }
-
-    /// Starts to play zeros for at most `max_playback_time`.
-    /// This function blocks and returns until playback has started for `min_playback_time`.
-    /// This function must be called when self.running() returns false.
-    ///
-    /// # Arguments
-    ///
-    /// * `min_playback_time` - It blocks and returns until playback has started for
-    ///                         `min_playback_time`.
-    ///
-    /// # Errors
-    ///
-    /// * If it's called when the `ZeroPlayer` is already running.
-    /// * Failed to find internal speakers.
-    /// * Failed to start the background thread.
-    pub fn start(&mut self, min_playback_time: Duration) -> Result<()> {
-        if self.running() {
-            return Err(Error::ZeroPlayerIsRunning);
-        }
-        self.thread_info = Some(PlayZeroWorkerInfo::new(min_playback_time));
-        if let Some(thread_info) = &mut self.thread_info {
-            // Block until playback of zeros has started for min_playback_time or timeout.
-            let (lock, cvar) = &*(thread_info.ready);
-            let result = cvar.wait_timeout_while(
-                lock.lock()?,
-                min_playback_time + ZeroPlayer::TIMEOUT,
-                |&mut is_ready| !is_ready,
-            )?;
-            if result.1.timed_out() {
-                return Err(Error::StartPlaybackTimeout);
-            }
-        }
-        Ok(())
-    }
-
-    /// Stops playing zeros in the background thread.
-    /// This function must be called when self.running() returns true.
-    ///
-    /// # Errors
-    ///
-    /// * If it's called again when the `ZeroPlayer` is not running.
-    /// * Failed to play zeros to internal speakers via CRAS client.
-    /// * Failed to join the background thread.
-    pub fn stop(&mut self) -> Result<()> {
-        match self.thread_info.take() {
-            Some(mut thread_info) => Ok(thread_info.destroy()?),
-            None => Err(Error::ZeroPlayerIsNotRunning),
-        }
-    }
-}
-
-// Audio thread book-keeping data
-struct PlayZeroWorkerInfo {
-    thread: Option<JoinHandle<Result<()>>>,
-    // Uses `thread_run` to notify the background thread to stop.
-    thread_run: Arc<AtomicBool>,
-    // The background thread uses `ready` to notify the main thread that playback
-    // of zeros has started for min_playback_time.
-    ready: Arc<(Mutex<bool>, Condvar)>,
-}
-
-impl Drop for PlayZeroWorkerInfo {
-    fn drop(&mut self) {
-        if let Err(e) = self.destroy() {
-            error!("{}", e);
-        }
-    }
-}
-
-impl PlayZeroWorkerInfo {
-    // Spawns the PlayZeroWorker.
-    fn new(min_playback_time: Duration) -> Self {
-        let thread_run = Arc::new(AtomicBool::new(false));
-        let ready = Arc::new((Mutex::new(false), Condvar::new()));
-        let mut worker = PlayZeroWorker::new(min_playback_time, thread_run.clone(), ready.clone());
-        Self {
-            thread: Some(thread::spawn(move || -> Result<()> {
-                worker.run()?;
-                Ok(())
-            })),
-            thread_run,
-            ready,
-        }
-    }
-
-    // Joins the PlayZeroWorker.
-    fn destroy(&mut self) -> Result<()> {
-        self.thread_run.store(false, Ordering::Relaxed);
-        if let Some(handle) = self.thread.take() {
-            let res = handle.join().map_err(Error::WorkerPanics)?;
-            return match res {
-                Err(e) => Err(e),
-                Ok(_) => Ok(()),
-            };
-        }
-        Ok(())
-    }
-}
-
-struct PlayZeroWorker {
-    min_playback_time: Duration,
-    // Uses `thread_run` to notify the background thread to stop.
-    thread_run: Arc<AtomicBool>,
-    // The background thread uses `ready` to notify the main thread that playback
-    // of zeros has started for min_playback_time.
-    ready: Arc<(Mutex<bool>, Condvar)>,
-}
-
-impl PlayZeroWorker {
-    const FRAMES_PER_BUFFER: usize = 256;
-    const FRAME_RATE: u32 = 48000;
-    const NUM_CHANNELS: usize = 2;
-    const FORMAT: SampleFormat = SampleFormat::S16LE;
-
-    fn new(
-        min_playback_time: Duration,
-        thread_run: Arc<AtomicBool>,
-        ready: Arc<(Mutex<bool>, Condvar)>,
-    ) -> Self {
-        Self {
-            min_playback_time,
-            thread_run,
-            ready,
-        }
-    }
-
-    fn run(&mut self) -> Result<()> {
-        let mut cras_client = CrasClient::new().map_err(Error::CrasClientFailed)?;
-        // TODO(b/155007305): Implement cras_client.wait_node_change and use it here.
-        let node = cras_client
-            .output_nodes()
-            .find(|node| node.node_type == CrasNodeType::CRAS_NODE_TYPE_INTERNAL_SPEAKER)
-            .ok_or(Error::InternalSpeakerNotFound)?;
-        let local_buffer =
-            vec![0u8; Self::FRAMES_PER_BUFFER * Self::NUM_CHANNELS * Self::FORMAT.sample_bytes()];
-        let min_playback_iterations = (Self::FRAME_RATE
-            * self.min_playback_time.as_millis() as u32)
-            / Self::FRAMES_PER_BUFFER as u32
-            / 1000;
-        let (_control, mut stream) = cras_client
-            .new_pinned_playback_stream(
-                node.iodev_index,
-                Self::NUM_CHANNELS,
-                Self::FORMAT,
-                Self::FRAME_RATE,
-                Self::FRAMES_PER_BUFFER,
-            )
-            .map_err(|e| Error::NewPlayStreamFailed(e))?;
-
-        let mut iter = 0;
-        self.thread_run.store(true, Ordering::Relaxed);
-        while self.thread_run.load(Ordering::Relaxed) {
-            let mut buffer = stream
-                .next_playback_buffer()
-                .map_err(|e| Error::NextPlaybackBufferFailed(e))?;
-            let _write_frames = buffer.write(&local_buffer).map_err(Error::PlaybackFailed)?;
-
-            // Notifies the main thread that playback of zeros has started for min_playback_time.
-            if iter == min_playback_iterations {
-                let (lock, cvar) = &*self.ready;
-                let mut is_ready = lock.lock()?;
-                *is_ready = true;
-                cvar.notify_one();
-            }
-            iter += 1;
-        }
-        Ok(())
-    }
-}
diff --git a/sound_card_init/seccomp/sound_card_init-seccomp-amd64.policy b/sound_card_init/seccomp/sound_card_init-seccomp-amd64.policy
deleted file mode 100644
index d06f225..0000000
--- a/sound_card_init/seccomp/sound_card_init-seccomp-amd64.policy
+++ /dev/null
@@ -1,82 +0,0 @@
-# Copyright 2020 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-access: 1
-arch_prctl: 1
-bind: 1
-brk: 1
-clone: 1
-close: 1
-connect: 1
-dup2: 1
-dup: 1
-epoll_create1: 1
-epoll_ctl: 1
-epoll_wait: 1
-execve: 1
-exit: 1
-exit_group: 1
-fcntl: 1
-fstat: 1
-futex: 1
-getcwd: 1
-getdents: 1
-getdents64: 1
-getegid: 1
-geteuid: 1
-getgid: 1
-getgroups: 1
-getpgid: 1
-getpgrp: 1
-getpid: 1
-getppid: 1
-getpriority: 1
-getrandom: 1
-getresgid: 1
-getresuid: 1
-getsid: 1
-getsockname: 1
-getuid: 1
-ioctl: arg1 == 0x5401 || arg1 == 0xc4c85512 || arg1 == 0x540f || arg1 == 0x80045500 || arg1 == 0xc4c85513 || arg1 == 0x81785501 || arg1 == 0x5413 || arg1 == 0xc1105511 || arg1 == 0x81785501 || arg1 == 0x80045500 || arg1 == 0xc008551a || arg1 == 0xc4c85512 || arg1 == 0xc008551b || arg1 == 0xc1105511
-lseek: 1
-madvise: 1
-mmap: arg2 in ~PROT_EXEC || arg2 in ~PROT_WRITE
-mprotect: arg2 in ~PROT_EXEC || arg2 in ~PROT_WRITE
-munmap: 1
-nanosleep: 1
-clock_nanosleep: 1
-openat: 1
-pipe2: 1
-ppoll: 1
-prctl: arg0 == 0x3 || arg0 == 0x4
-prlimit64: 1
-read: 1
-recvfrom: 1
-recvmsg: 1
-restart_syscall: 1
-rt_sigaction: 1
-rt_sigprocmask: 1
-rt_sigreturn: 1
-sched_getaffinity: 1
-sched_yield: 1
-sendmsg: 1
-sendto: 1
-set_robust_list: 1
-set_tid_address: 1
-setgid: 1
-setgroups: 1
-setpriority: 1
-setresgid: 1
-setresuid: 1
-setuid: 1
-sigaltstack: 1
-socket: arg0 == 0x10 || arg0 == 0x1
-socketpair: 1
-stat: 1
-statx: 1
-umask: 1
-uname: 1
-unlink: 1
-wait4: 1
-write: 1
diff --git a/sound_card_init/sound_card_init.conf b/sound_card_init/sound_card_init.conf
deleted file mode 100644
index 40bc88f..0000000
--- a/sound_card_init/sound_card_init.conf
+++ /dev/null
@@ -1,80 +0,0 @@
-# Copyright 2020 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# Installed by sound_card_init package.
-# sound_card_init upstart job.
-# sound_card_init is started by /lib/udev/rules.d/99-sound_card_init.rules
-
-description     "Chrome OS sound card initializer"
-author          "chromium-os-dev@chromium.org"
-
-# sound_card_init is a short-running process, but we don't start it as
-# a task job, because sound_card_init needs the sound card to be ready in
-# CRAS therefore we do not want to block the udev rule processing.
-
-# Make the task killable, because if it has a leak it's better to
-# restart it than to OOM-panic.
-oom score 0
-
-# SOUND_CARD_ID is provided by /lib/udev/rules.d/99-sound_card_init.rules.
-import SOUND_CARD_ID
-
-pre-start script
-  if ! echo "${SOUND_CARD_ID}" | grep -Eq "^[a-zA-Z0-9]+$"; then
-    logger -t "${UPSTART_JOB}" \
-      "Invalid SOUND_CARD_ID supplied"
-    exit 1
-  else
-    mkdir -m 0755 -p /var/lib/sound_card_init/"${SOUND_CARD_ID}"
-    chown -R sound_card_init:sound_card_init /var/lib/sound_card_init
-  fi
-end script
-
-
-script
-  CONFIG="$(cros_config /audio/main sound-card-init-conf)"
-  if [ -f /etc/sound_card_init/"${CONFIG}" ]; then
-    # Here (in order) are a list of the args added:
-    # --uts: Create and enter new UTS namespace (hostname/NIS domain name).
-    # -e: doesn't need network access.
-    # -l: process doesn't use SysV shared memory or IPC.
-    # -N: doesn't need to modify control groups settings.
-    # -v: run inside a new VFS namespace.
-    # -p -r: process doesn't need to access other processes in the system.
-    # -n: process doesn't need new privileges.
-    # -P: set /mnt/empty as the root fs.
-    # -b: bind /
-    # -k: Get a writeable and empty /run tmpfs path.
-    # -b: need /run/cras to connect cras.
-    # -b: need /dev to send ioctls to the system's block devices.
-    # -k: empty /sys tmpfs path.
-    # -b: need /sys/firmware/vpd/ro/ access to read the default calibration
-    #     value in vpd.
-    # -k: get a writeable and empty /var tmpfs path.
-    # -b: need /var/lib/sound_card_init/$SOUND_CARD_ID writable access for
-    #     datastore update.
-    # -b: need /var/lib/cras readable
-    exec minijail0 \
-        --uts \
-        -e \
-        -l \
-        -N \
-        -v \
-        -p -r \
-        -n \
-        -P /mnt/empty \
-        -b / \
-        -k 'tmpfs,/run,tmpfs,MS_NODEV|MS_NOEXEC|MS_NOSUID,mode=755,size=10M' \
-        -b /run/cras \
-        -b /dev \
-        -k 'tmpfs,/sys,tmpfs,MS_NODEV|MS_NOEXEC|MS_NOSUID,mode=755,size=10M' \
-        -b /sys/firmware/vpd/ro/ \
-        -k 'tmpfs,/var,tmpfs,MS_NODEV|MS_NOEXEC|MS_NOSUID,mode=755,size=10M' \
-        -b /var/lib/sound_card_init/"${SOUND_CARD_ID}"/,,1 \
-        -b /var/lib/cras/ \
-        -u sound_card_init -g sound_card_init -G \
-        -S /usr/share/policy/sound_card_init-seccomp.policy \
-        /usr/bin/sound_card_init "--id=${SOUND_CARD_ID}" "--conf=${CONFIG}"
-  fi
-end script
\ No newline at end of file
diff --git a/sound_card_init/src/main.rs b/sound_card_init/src/main.rs
deleted file mode 100644
index 806b7d5..0000000
--- a/sound_card_init/src/main.rs
+++ /dev/null
@@ -1,131 +0,0 @@
-// Copyright 2020 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//!  `sound_card_init` is an user space binary to perform sound card initialization during boot time.
-//!
-//!
-//!  # Arguments
-//!
-//!  * `sound_card_id` - The sound card name, ex: sofcmlmax98390d.
-//!
-//!  Given the `sound_card_id`, this binary parses the CONF_DIR/<sound_card_id>.yaml to perform per sound card initialization.
-//!  The upstart job of `sound_card_init` is started by the udev event specified in /lib/udev/rules.d/99-sound_card_init.rules.
-#![deny(missing_docs)]
-use std::env;
-use std::error;
-use std::fmt;
-use std::process;
-use std::string::String;
-
-use getopts::Options;
-use remain::sorted;
-use sys_util::{error, info, syslog};
-
-use amp::AmpBuilder;
-use dsm::utils::run_time;
-
-type Result<T> = std::result::Result<T, Error>;
-
-#[derive(Default)]
-struct Args {
-    pub sound_card_id: String,
-    pub conf: String,
-}
-
-#[sorted]
-#[derive(Debug)]
-enum Error {
-    MissingOption(String),
-    ParseArgsFailed(getopts::Fail),
-}
-
-impl error::Error for Error {}
-
-impl fmt::Display for Error {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        use Error::*;
-        match self {
-            MissingOption(option) => write!(f, "missing required option: {}", option),
-            ParseArgsFailed(e) => write!(f, "parse_args failed: {}", e),
-        }
-    }
-}
-
-fn print_usage(opts: &Options) {
-    let brief = "Usage: sound_card_init [options]".to_owned();
-    print!("{}", opts.usage(&brief));
-}
-
-fn parse_args() -> Result<Args> {
-    let mut opts = Options::new();
-    opts.optopt("", "id", "sound card id", "ID");
-    opts.optopt(
-        "",
-        "conf",
-        "the config file name. It should be $(cros_config /audio/main sound-card-init-conf)",
-        "CONFIG_NAME",
-    );
-    opts.optflag("h", "help", "print help menu");
-    let matches = opts
-        .parse(&env::args().collect::<Vec<_>>()[1..])
-        .map_err(|e| {
-            print_usage(&opts);
-            Error::ParseArgsFailed(e)
-        })?;
-
-    if matches.opt_present("h") {
-        print_usage(&opts);
-        process::exit(0);
-    }
-
-    let sound_card_id = matches
-        .opt_str("id")
-        .ok_or_else(|| Error::MissingOption("id".to_owned()))
-        .map_err(|e| {
-            print_usage(&opts);
-            e
-        })?;
-
-    let conf = matches
-        .opt_str("conf")
-        .ok_or_else(|| Error::MissingOption("conf".to_owned()))
-        .map_err(|e| {
-            print_usage(&opts);
-            e
-        })?;
-
-    Ok(Args {
-        sound_card_id,
-        conf,
-    })
-}
-
-/// Parses the CONF_DIR/${args.conf}.yaml and starts the boot time calibration.
-fn sound_card_init(args: &Args) -> std::result::Result<(), Box<dyn error::Error>> {
-    info!("sound_card_id: {}, conf:{}", args.sound_card_id, args.conf);
-    AmpBuilder::new(&args.sound_card_id, &args.conf)
-        .build()?
-        .boot_time_calibration()?;
-
-    Ok(())
-}
-
-fn main() {
-    syslog::init().expect("failed to initialize syslog");
-    let args = match parse_args() {
-        Ok(args) => args,
-        Err(e) => {
-            error!("failed to parse arguments: {}", e);
-            return;
-        }
-    };
-
-    match sound_card_init(&args) {
-        Ok(_) => info!("sound_card_init finished successfully."),
-        Err(e) => error!("sound_card_init: {}", e),
-    }
-
-    if let Err(e) = run_time::now_to_file(&args.sound_card_id) {
-        error!("failed to create sound_card_init run time file: {}", e);
-    }
-}
diff --git a/ubsan_blocklist.txt b/ubsan_blocklist.txt
deleted file mode 100644
index 983b1a8..0000000
--- a/ubsan_blocklist.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-# Suppress float devide-by-zero error in dsp.
-# https://crbug.com/965725
-[float-divide-by-zero]
-src:cras/src/dsp/drc_kernel.c
-fun:dk_update_envelope
diff --git a/ucm-config/for_all_boards/C505 HD Webcam/C505 HD Webcam.conf b/ucm-config/for_all_boards/C505 HD Webcam/C505 HD Webcam.conf
deleted file mode 100644
index 126ac33..0000000
--- a/ucm-config/for_all_boards/C505 HD Webcam/C505 HD Webcam.conf
+++ /dev/null
@@ -1,6 +0,0 @@
-Comment "Logitech Webcam C505"
-
-SectionUseCase."HiFi" {
-	File "HiFi.conf"
-	Comment "Default"
-}
diff --git a/ucm-config/for_all_boards/C505 HD Webcam/HiFi.conf b/ucm-config/for_all_boards/C505 HD Webcam/HiFi.conf
deleted file mode 100644
index c7e1342..0000000
--- a/ucm-config/for_all_boards/C505 HD Webcam/HiFi.conf
+++ /dev/null
@@ -1,25 +0,0 @@
-SectionVerb {
-	Value {
-		FullySpecifiedUCM "1"
-	}
-
-	EnableSequence [
-		cdev "hw:Webcam"
-		cset "name='Mic Capture Volume' 0"
-	]
-
-	DisableSequence [
-	]
-}
-
-SectionDevice."Webcam" {
-	Value {
-		CapturePCM "hw:Webcam,0"
-	}
-
-	EnableSequence [
-	]
-
-	DisableSequence [
-	]
-}
diff --git a/ucm-config/for_all_boards/Chat 150 C/Chat 150 C.conf b/ucm-config/for_all_boards/Chat 150 C/Chat 150 C.conf
deleted file mode 100644
index 329d5dc..0000000
--- a/ucm-config/for_all_boards/Chat 150 C/Chat 150 C.conf
+++ /dev/null
@@ -1,6 +0,0 @@
-Comment "ClearOne Chat 150C"
-
-SectionUseCase."HiFi" {
-	File "HiFi.conf"
-	Comment "Default"
-}
diff --git a/ucm-config/for_all_boards/Chat 150 C/HiFi.conf b/ucm-config/for_all_boards/Chat 150 C/HiFi.conf
deleted file mode 100644
index 368796d..0000000
--- a/ucm-config/for_all_boards/Chat 150 C/HiFi.conf
+++ /dev/null
@@ -1,19 +0,0 @@
-SectionVerb {
-	Value {
-		DisableSoftwareVolume "1"
-	}
-
-	EnableSequence [
-	]
-
-	DisableSequence [
-	]
-}
-
-SectionDevice."Chat 150 C".0 {
-	EnableSequence [
-	]
-
-	DisableSequence [
-	]
-}
diff --git a/ucm-config/for_all_boards/DELL PROFESSIONAL SOUND BAR AE5/DELL PROFESSIONAL SOUND BAR AE5.conf b/ucm-config/for_all_boards/DELL PROFESSIONAL SOUND BAR AE5/DELL PROFESSIONAL SOUND BAR AE5.conf
deleted file mode 100644
index e34c813..0000000
--- a/ucm-config/for_all_boards/DELL PROFESSIONAL SOUND BAR AE5/DELL PROFESSIONAL SOUND BAR AE5.conf
+++ /dev/null
@@ -1,6 +0,0 @@
-Comment "DELL PROFESSIONAL SOUND BAR AE5"
-
-SectionUseCase."HiFi" {
-	File "HiFi.conf"
-	Comment "Default"
-}
diff --git a/ucm-config/for_all_boards/DELL PROFESSIONAL SOUND BAR AE5/HiFi.conf b/ucm-config/for_all_boards/DELL PROFESSIONAL SOUND BAR AE5/HiFi.conf
deleted file mode 100644
index 67bd2d5..0000000
--- a/ucm-config/for_all_boards/DELL PROFESSIONAL SOUND BAR AE5/HiFi.conf
+++ /dev/null
@@ -1,27 +0,0 @@
-SectionVerb {
-	Value {
-		FullySpecifiedUCM "1"
-	}
-
-	EnableSequence [
-	]
-
-	DisableSequence [
-	]
-}
-
-SectionDevice."Dell AE515 USB SoundBar Output".0 {
-	Comment "SoundBar Output"
-
-	Value {
-		PlaybackPCM "hw:AE5,0"
-	}
-}
-
-SectionDevice."Dell AE515 USB SoundBar Input".0 {
-	Comment "SoundBar Input"
-
-	Value {
-		CapturePCM "hw:AE5,0"
-	}
-}
diff --git a/ucm-config/for_all_boards/Dell AC511 USB SoundBar/Dell AC511 USB SoundBar.conf b/ucm-config/for_all_boards/Dell AC511 USB SoundBar/Dell AC511 USB SoundBar.conf
deleted file mode 100644
index 5491378..0000000
--- a/ucm-config/for_all_boards/Dell AC511 USB SoundBar/Dell AC511 USB SoundBar.conf
+++ /dev/null
@@ -1,6 +0,0 @@
-Comment "Dell AC511 USB SoundBar"
-
-SectionUseCase."HiFi" {
-	File "HiFi.conf"
-	Comment "Default"
-}
diff --git a/ucm-config/for_all_boards/Dell AC511 USB SoundBar/HiFi.conf b/ucm-config/for_all_boards/Dell AC511 USB SoundBar/HiFi.conf
deleted file mode 100644
index e920e3c..0000000
--- a/ucm-config/for_all_boards/Dell AC511 USB SoundBar/HiFi.conf
+++ /dev/null
@@ -1,30 +0,0 @@
-SectionVerb {
-	Value {
-		FullySpecifiedUCM "1"
-	}
-
-	EnableSequence [
-		cdev "hw:SoundBar"
-
-		cset "name='PCM Playback Volume' 51"
-	]
-
-	DisableSequence [
-	]
-}
-
-SectionDevice."Dell AC511 USB SoundBar Output".0 {
-	Comment "SoundBar Output"
-
-	Value {
-		PlaybackPCM "hw:SoundBar,0"
-	}
-}
-
-SectionDevice."Dell AC511 USB SoundBar Input".0 {
-	Comment "SoundBar Input"
-
-	Value {
-		CapturePCM "hw:SoundBar,0"
-	}
-}
diff --git a/ucm-config/for_all_boards/Dell-WD15-Dock/Dell-WD15-Dock.conf b/ucm-config/for_all_boards/Dell-WD15-Dock/Dell-WD15-Dock.conf
deleted file mode 100644
index 290758a..0000000
--- a/ucm-config/for_all_boards/Dell-WD15-Dock/Dell-WD15-Dock.conf
+++ /dev/null
@@ -1,5 +0,0 @@
-Comment "USB-audio on Dell docking station"
-SectionUseCase."HiFi" {
-	File "HiFi.conf"
-	Comment "Default"
-}
diff --git a/ucm-config/for_all_boards/Dell-WD15-Dock/HiFi.conf b/ucm-config/for_all_boards/Dell-WD15-Dock/HiFi.conf
deleted file mode 100644
index c522540..0000000
--- a/ucm-config/for_all_boards/Dell-WD15-Dock/HiFi.conf
+++ /dev/null
@@ -1,40 +0,0 @@
-SectionVerb {
-	Value {
-		FullySpecifiedUCM "1"
-	}
-	EnableSequence [
-		cdev "hw:Dock"
-	]
-	DisableSequence [
-	]
-}
-
-SectionDevice."Dock Headphone".0 {
-	Comment "Headphone"
-
-	Value {
-		PlaybackPCM "hw:Dock,0"
-	}
-}
-
-SectionDevice."Dock Line Out".0 {
-	Value {
-		PlaybackPCM "hw:Dock,1"
-	}
-	EnableSequence [
-		cdev "hw:Dock"
-		cset "name='Line Playback Switch' on"
-	]
-	DisableSequence [
-		cdev "hw:Dock"
-		cset "name='Line Playback Switch' off"
-	]
-}
-
-SectionDevice."Dock Microphone".0 {
-	Comment "Microphone"
-
-	Value {
-		CapturePCM "hw:Dock,0"
-	}
-}
diff --git a/ucm-config/for_all_boards/HUAWEI USB-C HEADSET/HUAWEI USB-C HEADSET.conf b/ucm-config/for_all_boards/HUAWEI USB-C HEADSET/HUAWEI USB-C HEADSET.conf
deleted file mode 100644
index c1db519..0000000
--- a/ucm-config/for_all_boards/HUAWEI USB-C HEADSET/HUAWEI USB-C HEADSET.conf
+++ /dev/null
@@ -1,6 +0,0 @@
-Comment "HUAWEI USB-C HEADSET"
-
-SectionUseCase."HiFi" {
-	File "HiFi.conf"
-	Comment "Default"
-}
diff --git a/ucm-config/for_all_boards/HUAWEI USB-C HEADSET/HiFi.conf b/ucm-config/for_all_boards/HUAWEI USB-C HEADSET/HiFi.conf
deleted file mode 100644
index d48942b..0000000
--- a/ucm-config/for_all_boards/HUAWEI USB-C HEADSET/HiFi.conf
+++ /dev/null
@@ -1,25 +0,0 @@
-SectionVerb {
-	Value {
-		FullySpecifiedUCM "1"
-	}
-
-	EnableSequence [
-		cdev "hw:HEADSET"
-		cset "name='PCM Playback Volume' 45"
-	]
-
-	DisableSequence [
-	]
-}
-
-SectionDevice."HUAWEI USB-C HEADSET Output".0 {
-	Value {
-		PlaybackPCM "hw:HEADSET,0"
-	}
-}
-
-SectionDevice."HUAWEI USB-C HEADSET Input".0 {
-	Value {
-		CapturePCM "hw:HEADSET,0"
-	}
-}
diff --git a/ucm-config/for_all_boards/Hangouts Meet speakermic/Hangouts Meet speakermic.conf b/ucm-config/for_all_boards/Hangouts Meet speakermic/Hangouts Meet speakermic.conf
deleted file mode 100644
index c114430..0000000
--- a/ucm-config/for_all_boards/Hangouts Meet speakermic/Hangouts Meet speakermic.conf
+++ /dev/null
@@ -1,6 +0,0 @@
-Comment "Speakermic for Chrome for meeting"
-
-SectionUseCase."HiFi" {
-	File "HiFi.conf"
-	Comment "Default"
-}
diff --git a/ucm-config/for_all_boards/Hangouts Meet speakermic/HiFi.conf b/ucm-config/for_all_boards/Hangouts Meet speakermic/HiFi.conf
deleted file mode 100644
index b84e696..0000000
--- a/ucm-config/for_all_boards/Hangouts Meet speakermic/HiFi.conf
+++ /dev/null
@@ -1,8 +0,0 @@
-SectionVerb {
-	Value {
-		MinBufferLevel "0"
-	}
-}
-
-SectionDevice."Headset".0 {
-}
diff --git a/ucm-config/for_all_boards/ICUSBAUDIO7D/HiFi.conf b/ucm-config/for_all_boards/ICUSBAUDIO7D/HiFi.conf
deleted file mode 100644
index c44de8d..0000000
--- a/ucm-config/for_all_boards/ICUSBAUDIO7D/HiFi.conf
+++ /dev/null
@@ -1,132 +0,0 @@
-SectionVerb {
-	Value {
-		FullySpecifiedUCM "1"
-	}
-
-	EnableSequence [
-		cdev "hw:ICUSBAUDIO7D"
-
-		cset "name='Line Capture Switch', off"
-		cset "name='Mic Capture Switch', off"
-		cset "name='IEC958 In Capture Switch', off"
-		cset "name='PCM Capture Switch', off"
-		cset "name='Speaker Playback Switch', off"
-		cset "name='Mic Playback Switch', off"
-	]
-
-	DisableSequence [
-	]
-}
-
-SectionDevice."Speaker-Headset".0 {
-	Comment "Speaker out"
-
-	Value {
-		PlaybackPCM "hw:ICUSBAUDIO7D,0"
-		PlaybackMixerElem "Speaker"
-	}
-
-	EnableSequence [
-		cset "name='Speaker Playback Switch', on"
-	]
-
-	DisableSequence [
-		cset "name='Speaker Playback Switch', off"
-	]
-}
-
-SectionDevice."Line In".0 {
-	Comment "Line In"
-
-	Value {
-		CapturePCM "hw:ICUSBAUDIO7D,0"
-		CaptureMixerElem "Line"
-	}
-
-	ConflictingDevice [
-		"Mic"
-		"SPDIF In"
-		"PCM"
-	]
-
-	EnableSequence [
-		cset "name='Line Capture Switch', on"
-		cset "name='PCM Capture Source', Line"
-	]
-
-	DisableSequence [
-		cset "name='Line Capture Switch', off"
-	]
-}
-
-SectionDevice."Mic".0 {
-	Comment "Mic Input"
-
-	Value {
-		CapturePCM "hw:ICUSBAUDIO7D,0"
-		CaptureMixerElem "Mic"
-	}
-
-	ConflictingDevice [
-		"Line In"
-		"SPDIF In"
-		"PCM"
-	]
-
-	EnableSequence [
-		cset "name='Mic Capture Switch', on"
-		cset "name='PCM Capture Source', Mic"
-	]
-
-	DisableSequence [
-		cset "name='Mic Capture Switch', off"
-	]
-}
-
-SectionDevice."SPDIF In".0 {
-	Comment "S/PDIF In"
-
-	Value {
-		CapturePCM "hw:ICUSBAUDIO7D,0"
-		CaptureMixerElem "IEC958 In"
-	}
-
-	ConflictingDevice [
-		"Line In"
-		"Mic"
-		"PCM"
-	]
-
-	EnableSequence [
-		cset "name='IEC958 In Capture Switch', on"
-		cset "name='PCM Capture Source', IEC958 In"
-	]
-
-	DisableSequence [
-		cset "name='IEC958 In Capture Switch', off"
-	]
-}
-
-SectionDevice."PCM".0 {
-	Comment "PCM Capture"
-
-	Value {
-		CapturePCM "hw:ICUSBAUDIO7D,0"
-		CaptureMixerElem "PCM"
-	}
-
-	ConflictingDevice [
-		"Line In"
-		"Mic"
-		"SPDIF In"
-	]
-
-	EnableSequence [
-		cset "name='PCM Capture Switch', on"
-		cset "name='PCM Capture Source', Mixer"
-	]
-
-	DisableSequence [
-		cset "name='PCM Capture Switch', off"
-	]
-}
diff --git a/ucm-config/for_all_boards/ICUSBAUDIO7D/ICUSBAUDIO7D.conf b/ucm-config/for_all_boards/ICUSBAUDIO7D/ICUSBAUDIO7D.conf
deleted file mode 100644
index 3dc10fa..0000000
--- a/ucm-config/for_all_boards/ICUSBAUDIO7D/ICUSBAUDIO7D.conf
+++ /dev/null
@@ -1,6 +0,0 @@
-Comment "Startech USB 7D Audio"
-
-SectionUseCase."HiFi" {
-	File "HiFi.conf"
-	Comment "Default"
-}
diff --git a/ucm-config/for_all_boards/Jabra SPEAK 810/HiFi.conf b/ucm-config/for_all_boards/Jabra SPEAK 810/HiFi.conf
deleted file mode 100644
index 313bffe..0000000
--- a/ucm-config/for_all_boards/Jabra SPEAK 810/HiFi.conf
+++ /dev/null
@@ -1,19 +0,0 @@
-SectionVerb {
-	Value {
-		DisableSoftwareVolume "1"
-	}
-
-	EnableSequence [
-	]
-
-	DisableSequence [
-	]
-}
-
-SectionDevice."Jabra Speak 810".0 {
-	EnableSequence [
-	]
-
-	DisableSequence [
-	]
-}
diff --git a/ucm-config/for_all_boards/Jabra SPEAK 810/Jabra SPEAK 810.conf b/ucm-config/for_all_boards/Jabra SPEAK 810/Jabra SPEAK 810.conf
deleted file mode 100644
index b8e817c..0000000
--- a/ucm-config/for_all_boards/Jabra SPEAK 810/Jabra SPEAK 810.conf
+++ /dev/null
@@ -1,6 +0,0 @@
-Comment "Jabra Speak 810"
-
-SectionUseCase."HiFi" {
-	File "HiFi.conf"
-	Comment "Default"
-}
diff --git a/ucm-config/for_all_boards/Logitech BRIO/HiFi.conf b/ucm-config/for_all_boards/Logitech BRIO/HiFi.conf
deleted file mode 100644
index eb20ee2..0000000
--- a/ucm-config/for_all_boards/Logitech BRIO/HiFi.conf
+++ /dev/null
@@ -1,25 +0,0 @@
-SectionVerb {
-	Value {
-		FullySpecifiedUCM "1"
-	}
-
-	EnableSequence [
-		cdev "hw:BRIO"
-		cset "name='Mic Capture Volume' 24"
-	]
-
-	DisableSequence [
-	]
-}
-
-SectionDevice."BRIO" {
-	Value {
-		CapturePCM "hw:BRIO,0"
-	}
-
-	EnableSequence [
-	]
-
-	DisableSequence [
-	]
-}
diff --git a/ucm-config/for_all_boards/Logitech BRIO/Logitech BRIO.conf b/ucm-config/for_all_boards/Logitech BRIO/Logitech BRIO.conf
deleted file mode 100644
index 7059eda..0000000
--- a/ucm-config/for_all_boards/Logitech BRIO/Logitech BRIO.conf
+++ /dev/null
@@ -1,6 +0,0 @@
-Comment "Logitech BRIO"
-
-SectionUseCase."HiFi" {
-	File "HiFi.conf"
-	Comment "Default"
-}
diff --git a/ucm-config/for_all_boards/Logitech Webcam C930e/HiFi.conf b/ucm-config/for_all_boards/Logitech Webcam C930e/HiFi.conf
deleted file mode 100644
index 95f2fcf..0000000
--- a/ucm-config/for_all_boards/Logitech Webcam C930e/HiFi.conf
+++ /dev/null
@@ -1,25 +0,0 @@
-SectionVerb {
-	Value {
-		FullySpecifiedUCM "1"
-	}
-
-	EnableSequence [
-		cdev "hw:C930e"
-		cset "name='Mic Capture Volume' 30"
-	]
-
-	DisableSequence [
-	]
-}
-
-SectionDevice."C930e" {
-	Value {
-		CapturePCM "hw:C930e,0"
-	}
-
-	EnableSequence [
-	]
-
-	DisableSequence [
-	]
-}
diff --git a/ucm-config/for_all_boards/Logitech Webcam C930e/Logitech Webcam C930e.conf b/ucm-config/for_all_boards/Logitech Webcam C930e/Logitech Webcam C930e.conf
deleted file mode 100644
index f6760e2..0000000
--- a/ucm-config/for_all_boards/Logitech Webcam C930e/Logitech Webcam C930e.conf
+++ /dev/null
@@ -1,6 +0,0 @@
-Comment "Logitech Webcam C930e"
-
-SectionUseCase."HiFi" {
-	File "HiFi.conf"
-	Comment "Default"
-}
diff --git a/ucm-config/for_all_boards/Loopback/HiFi.conf b/ucm-config/for_all_boards/Loopback/HiFi.conf
deleted file mode 100644
index 254c995..0000000
--- a/ucm-config/for_all_boards/Loopback/HiFi.conf
+++ /dev/null
@@ -1,25 +0,0 @@
-SectionVerb {
-	Value {
-		FullySpecifiedUCM "1"
-	}
-
-	EnableSequence [
-	]
-
-	DisableSequence [
-	]
-}
-
-SectionDevice."Loopback Playback".0 {
-	Value {
-		PlaybackPCM "hw:Loopback,0"
-		PlaybackChannels "8"
-	}
-}
-
-SectionDevice."Loopback Capture".0 {
-	Value {
-		CapturePCM "hw:Loopback,1"
-		CaptureChannels "8"
-	}
-}
diff --git a/ucm-config/for_all_boards/Loopback/Loopback.conf b/ucm-config/for_all_boards/Loopback/Loopback.conf
deleted file mode 100644
index 44abedd..0000000
--- a/ucm-config/for_all_boards/Loopback/Loopback.conf
+++ /dev/null
@@ -1,6 +0,0 @@
-Comment "Loopback"
-
-SectionUseCase."HiFi" {
-	File "HiFi.conf"
-	Comment "Default"
-}
diff --git a/ucm-config/for_all_boards/Mi Dual Driver Earphones Type-C/HiFi.conf b/ucm-config/for_all_boards/Mi Dual Driver Earphones Type-C/HiFi.conf
deleted file mode 100644
index 9d63e16..0000000
--- a/ucm-config/for_all_boards/Mi Dual Driver Earphones Type-C/HiFi.conf
+++ /dev/null
@@ -1,25 +0,0 @@
-SectionVerb {
-	Value {
-		FullySpecifiedUCM "1"
-	}
-
-	EnableSequence [
-		cdev "hw:TypeC"
-		cset "name='PCM Playback Volume' 45"
-	]
-
-	DisableSequence [
-	]
-}
-
-SectionDevice."Mi Earphones Output".0 {
-	Value {
-		PlaybackPCM "hw:TypeC,0"
-	}
-}
-
-SectionDevice."Mi Earphones Input".0 {
-	Value {
-		CapturePCM "hw:TypeC,0"
-	}
-}
diff --git a/ucm-config/for_all_boards/Mi Dual Driver Earphones Type-C/Mi Dual Driver Earphones Type-C.conf b/ucm-config/for_all_boards/Mi Dual Driver Earphones Type-C/Mi Dual Driver Earphones Type-C.conf
deleted file mode 100644
index df19b47..0000000
--- a/ucm-config/for_all_boards/Mi Dual Driver Earphones Type-C/Mi Dual Driver Earphones Type-C.conf
+++ /dev/null
@@ -1,6 +0,0 @@
-Comment "Mi Dual Driver Earphones Type-C"
-
-SectionUseCase."HiFi" {
-	File "HiFi.conf"
-	Comment "Default"
-}
diff --git a/ucm-config/for_all_boards/PCP-USB/HiFi.conf b/ucm-config/for_all_boards/PCP-USB/HiFi.conf
deleted file mode 100644
index ac5c7ed..0000000
--- a/ucm-config/for_all_boards/PCP-USB/HiFi.conf
+++ /dev/null
@@ -1,20 +0,0 @@
-SectionVerb {
-	Value {
-		FullySpecifiedUCM "1"
-	}
-
-	EnableSequence [
-		cdev "hw:PCPUSB"
-
-		cset "name='Mic Capture Volume' 19"
-	]
-
-	DisableSequence [
-	]
-}
-
-SectionDevice."PCP USB Input".0 {
-	Value {
-		CapturePCM "hw:PCPUSB,0"
-	}
-}
diff --git a/ucm-config/for_all_boards/PCP-USB/PCP-USB.conf b/ucm-config/for_all_boards/PCP-USB/PCP-USB.conf
deleted file mode 100644
index b468927..0000000
--- a/ucm-config/for_all_boards/PCP-USB/PCP-USB.conf
+++ /dev/null
@@ -1,6 +0,0 @@
-Comment "PCP USB Stethoscope"
-
-SectionUseCase."HiFi" {
-	File "HiFi.conf"
-	Comment "Default"
-}
diff --git a/ucm-config/for_all_boards/Pixel USB-C earbuds/HiFi.conf b/ucm-config/for_all_boards/Pixel USB-C earbuds/HiFi.conf
deleted file mode 100644
index 7a60745..0000000
--- a/ucm-config/for_all_boards/Pixel USB-C earbuds/HiFi.conf
+++ /dev/null
@@ -1,24 +0,0 @@
-SectionVerb {
-	Value {
-		FullySpecifiedUCM "1"
-	}
-
-	EnableSequence [
-	]
-
-	DisableSequence [
-	]
-}
-
-SectionDevice."Google Pixel earbuds Output".0 {
-	Value {
-		PlaybackPCM "hw:earbuds,0"
-	}
-}
-
-SectionDevice."Google Pixel earbuds Input".0 {
-	Value {
-		CapturePCM "hw:earbuds,0"
-		IntrinsicSensitivity "-3100"
-	}
-}
diff --git a/ucm-config/for_all_boards/Pixel USB-C earbuds/Pixel USB-C earbuds.conf b/ucm-config/for_all_boards/Pixel USB-C earbuds/Pixel USB-C earbuds.conf
deleted file mode 100644
index 4166632..0000000
--- a/ucm-config/for_all_boards/Pixel USB-C earbuds/Pixel USB-C earbuds.conf
+++ /dev/null
@@ -1,6 +0,0 @@
-Comment "Pixel USB-C earbuds"
-
-SectionUseCase."HiFi" {
-	File "HiFi.conf"
-	Comment "Default"
-}
diff --git a/ucm-config/for_all_boards/Plantronics DA70/HiFi.conf b/ucm-config/for_all_boards/Plantronics DA70/HiFi.conf
deleted file mode 100644
index 0840b5d..0000000
--- a/ucm-config/for_all_boards/Plantronics DA70/HiFi.conf
+++ /dev/null
@@ -1,28 +0,0 @@
-SectionVerb {
-	Value {
-		FullySpecifiedUCM "1"
-	}
-
-	EnableSequence [
-		cdev "hw:SoundBar"
-	]
-
-	DisableSequence [
-	]
-}
-
-SectionDevice."Plantronics DA70 Output".0 {
-	Comment "DA70 Output"
-
-	Value {
-		PlaybackPCM "hw:DA70,0"
-	}
-}
-
-SectionDevice."Plantronics DA70 Input".0 {
-	Comment "DA70 Input"
-
-	Value {
-		CapturePCM "hw:DA70,0"
-	}
-}
diff --git a/ucm-config/for_all_boards/Plantronics DA70/Plantronics DA70.conf b/ucm-config/for_all_boards/Plantronics DA70/Plantronics DA70.conf
deleted file mode 100644
index 7857d47..0000000
--- a/ucm-config/for_all_boards/Plantronics DA70/Plantronics DA70.conf
+++ /dev/null
@@ -1,6 +0,0 @@
-Comment "Plantronics DA70"
-
-SectionUseCase."HiFi" {
-	File "HiFi.conf"
-	Comment "Default"
-}
diff --git a/ucm-config/for_all_boards/Scarlett 2i2 USB/HiFi.conf b/ucm-config/for_all_boards/Scarlett 2i2 USB/HiFi.conf
deleted file mode 100644
index f49d681..0000000
--- a/ucm-config/for_all_boards/Scarlett 2i2 USB/HiFi.conf
+++ /dev/null
@@ -1,27 +0,0 @@
-SectionVerb {
-	Value {
-		FullySpecifiedUCM "1"
-	}
-	EnableSequence [
-		cdev "hw:USB,0"
-	]
-	DisableSequence [
-	]
-}
-
-SectionDevice."Scarlett 2i2 USB Output".0 {
-	Comment "Scarlett 2i2 Output"
-
-	Value {
-		PlaybackPCM "hw:USB,0"
-		PlaybackRate "48000"
-	}
-}
-
-SectionDevice."Scarlett 2i2 USB Input".0 {
-	Comment "Scarlett 2i2 Input"
-	Value {
-		CapturePCM "hw:USB,0"
-		CaptureRate "48000"
-	}
-}
diff --git a/ucm-config/for_all_boards/Scarlett 2i2 USB/Scarlett 2i2 USB.conf b/ucm-config/for_all_boards/Scarlett 2i2 USB/Scarlett 2i2 USB.conf
deleted file mode 100644
index 88bac6b..0000000
--- a/ucm-config/for_all_boards/Scarlett 2i2 USB/Scarlett 2i2 USB.conf
+++ /dev/null
@@ -1,5 +0,0 @@
-Comment "Scarlett 2i2 USB"
-SectionUseCase."HiFi" {
-	File "HiFi.conf"
-	Comment "Default"
-}
diff --git a/ucm-config/for_all_boards/Scarlett 2i4 USB/HiFi.conf b/ucm-config/for_all_boards/Scarlett 2i4 USB/HiFi.conf
deleted file mode 100644
index 894683c..0000000
--- a/ucm-config/for_all_boards/Scarlett 2i4 USB/HiFi.conf
+++ /dev/null
@@ -1,27 +0,0 @@
-SectionVerb {
-	Value {
-		FullySpecifiedUCM "1"
-	}
-	EnableSequence [
-		cdev "hw:USB,0"
-	]
-	DisableSequence [
-	]
-}
-
-SectionDevice."Scarlett 2i4 USB Output".0 {
-	Comment "Scarlett 2i4 Output"
-
-	Value {
-		PlaybackPCM "hw:USB,0"
-		PlaybackRate "48000"
-	}
-}
-
-SectionDevice."Scarlett 2i4 USB Input".0 {
-	Comment "Scarlett 2i4 Input"
-	Value {
-		CapturePCM "hw:USB,0"
-		CaptureRate "48000"
-	}
-}
diff --git a/ucm-config/for_all_boards/Scarlett 2i4 USB/Scarlett 2i4 USB.conf b/ucm-config/for_all_boards/Scarlett 2i4 USB/Scarlett 2i4 USB.conf
deleted file mode 100644
index 71ea169..0000000
--- a/ucm-config/for_all_boards/Scarlett 2i4 USB/Scarlett 2i4 USB.conf
+++ /dev/null
@@ -1,5 +0,0 @@
-Comment "Scarlett 2i4 USB"
-SectionUseCase."HiFi" {
-	File "HiFi.conf"
-	Comment "Default"
-}
diff --git a/ucm-config/for_all_boards/USB 2.0 Camera/HiFi.conf b/ucm-config/for_all_boards/USB 2.0 Camera/HiFi.conf
deleted file mode 100644
index e4121da..0000000
--- a/ucm-config/for_all_boards/USB 2.0 Camera/HiFi.conf
+++ /dev/null
@@ -1,25 +0,0 @@
-SectionVerb {
-	Value {
-		FullySpecifiedUCM "1"
-	}
-
-	EnableSequence [
-		cdev "hw:Camera"
-		cset "name='Mic Capture Volume' 200"
-	]
-
-	DisableSequence [
-	]
-}
-
-SectionDevice."Camera" {
-	Value {
-		CapturePCM "hw:Camera,0"
-	}
-
-	EnableSequence [
-	]
-
-	DisableSequence [
-	]
-}
diff --git a/ucm-config/for_all_boards/USB 2.0 Camera/USB 2.0 Camera b/ucm-config/for_all_boards/USB 2.0 Camera/USB 2.0 Camera
deleted file mode 100644
index 52bd294..0000000
--- a/ucm-config/for_all_boards/USB 2.0 Camera/USB 2.0 Camera
+++ /dev/null
@@ -1,6 +0,0 @@
-Comment "ZIQIAN N21 1080P Webcam"
-
-SectionUseCase."HiFi" {
-	File "HiFi.conf"
-	Comment "Default"
-}
diff --git a/ucm-config/for_all_boards/WD15 Dock b/ucm-config/for_all_boards/WD15 Dock
deleted file mode 120000
index 0d69a72..0000000
--- a/ucm-config/for_all_boards/WD15 Dock
+++ /dev/null
@@ -1 +0,0 @@
-Dell-WD15-Dock
\ No newline at end of file
diff --git a/ucm-config/for_all_boards/WD19 Dock b/ucm-config/for_all_boards/WD19 Dock
deleted file mode 120000
index 0d69a72..0000000
--- a/ucm-config/for_all_boards/WD19 Dock
+++ /dev/null
@@ -1 +0,0 @@
-Dell-WD15-Dock
\ No newline at end of file
diff --git a/unblocked_terms.txt b/unblocked_terms.txt
deleted file mode 100644
index cba7545..0000000
--- a/unblocked_terms.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-# KEEP THIS COMMENT IN YOUR COPY.
-#
-# Don't delete this file if you want to keep keyword_check enabled even if it's
-# empty.
-#
-# See repohooks/README.md for more details.
-
-master
-\bnative
-white.?list
