OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. | 2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 #include "webrtc/sound/alsasoundsystem.h" | 11 #include "webrtc/sound/alsasoundsystem.h" |
12 | 12 |
13 #include <algorithm> | 13 #include <algorithm> |
14 #include "webrtc/sound/sounddevicelocator.h" | 14 |
15 #include "webrtc/sound/soundinputstreaminterface.h" | 15 #include "webrtc/base/arraysize.h" |
16 #include "webrtc/sound/soundoutputstreaminterface.h" | |
17 #include "webrtc/base/common.h" | 16 #include "webrtc/base/common.h" |
18 #include "webrtc/base/logging.h" | 17 #include "webrtc/base/logging.h" |
19 #include "webrtc/base/scoped_ptr.h" | 18 #include "webrtc/base/scoped_ptr.h" |
20 #include "webrtc/base/stringutils.h" | 19 #include "webrtc/base/stringutils.h" |
21 #include "webrtc/base/timeutils.h" | 20 #include "webrtc/base/timeutils.h" |
22 #include "webrtc/base/worker.h" | 21 #include "webrtc/base/worker.h" |
| 22 #include "webrtc/sound/sounddevicelocator.h" |
| 23 #include "webrtc/sound/soundinputstreaminterface.h" |
| 24 #include "webrtc/sound/soundoutputstreaminterface.h" |
23 | 25 |
24 namespace rtc { | 26 namespace rtc { |
25 | 27 |
26 // Lookup table from the rtc format enum in soundsysteminterface.h to | 28 // Lookup table from the rtc format enum in soundsysteminterface.h to |
27 // ALSA's enums. | 29 // ALSA's enums. |
28 static const snd_pcm_format_t kCricketFormatToAlsaFormatTable[] = { | 30 static const snd_pcm_format_t kCricketFormatToAlsaFormatTable[] = { |
29 // The order here must match the order in soundsysteminterface.h | 31 // The order here must match the order in soundsysteminterface.h |
30 SND_PCM_FORMAT_S16_LE, | 32 SND_PCM_FORMAT_S16_LE, |
31 }; | 33 }; |
32 | 34 |
(...skipping 566 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
599 | 601 |
600 bool AlsaSoundSystem::GetDefaultDevice(SoundDeviceLocator **device) { | 602 bool AlsaSoundSystem::GetDefaultDevice(SoundDeviceLocator **device) { |
601 if (!IsInitialized()) { | 603 if (!IsInitialized()) { |
602 return false; | 604 return false; |
603 } | 605 } |
604 *device = new AlsaDeviceLocator("Default device", "default"); | 606 *device = new AlsaDeviceLocator("Default device", "default"); |
605 return true; | 607 return true; |
606 } | 608 } |
607 | 609 |
608 inline size_t AlsaSoundSystem::FrameSize(const OpenParams ¶ms) { | 610 inline size_t AlsaSoundSystem::FrameSize(const OpenParams ¶ms) { |
609 ASSERT(static_cast<int>(params.format) < | |
610 ARRAY_SIZE(kCricketFormatToSampleSizeTable)); | |
611 return kCricketFormatToSampleSizeTable[params.format] * params.channels; | 611 return kCricketFormatToSampleSizeTable[params.format] * params.channels; |
612 } | 612 } |
613 | 613 |
614 template <typename StreamInterface> | 614 template <typename StreamInterface> |
615 StreamInterface *AlsaSoundSystem::OpenDevice( | 615 StreamInterface *AlsaSoundSystem::OpenDevice( |
616 const SoundDeviceLocator *device, | 616 const SoundDeviceLocator *device, |
617 const OpenParams ¶ms, | 617 const OpenParams ¶ms, |
618 snd_pcm_stream_t type, | 618 snd_pcm_stream_t type, |
619 StreamInterface *(AlsaSoundSystem::*start_fn)( | 619 StreamInterface *(AlsaSoundSystem::*start_fn)( |
620 snd_pcm_t *handle, | 620 snd_pcm_t *handle, |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
655 // kLowLatency is 0, so we treat it the same as a request for zero latency. | 655 // kLowLatency is 0, so we treat it the same as a request for zero latency. |
656 // Compute what the user asked for. | 656 // Compute what the user asked for. |
657 latency = rtc::kNumMicrosecsPerSec * | 657 latency = rtc::kNumMicrosecsPerSec * |
658 params.latency / | 658 params.latency / |
659 params.freq / | 659 params.freq / |
660 FrameSize(params); | 660 FrameSize(params); |
661 // And this is what we'll actually use. | 661 // And this is what we'll actually use. |
662 latency = std::max(latency, kMinimumLatencyUsecs); | 662 latency = std::max(latency, kMinimumLatencyUsecs); |
663 } | 663 } |
664 | 664 |
665 ASSERT(static_cast<int>(params.format) < | 665 ASSERT(params.format < arraysize(kCricketFormatToAlsaFormatTable)); |
666 ARRAY_SIZE(kCricketFormatToAlsaFormatTable)); | |
667 | 666 |
668 err = symbol_table_.snd_pcm_set_params()( | 667 err = symbol_table_.snd_pcm_set_params()( |
669 handle, | 668 handle, |
670 kCricketFormatToAlsaFormatTable[params.format], | 669 kCricketFormatToAlsaFormatTable[params.format], |
671 // SoundSystemInterface only supports interleaved audio. | 670 // SoundSystemInterface only supports interleaved audio. |
672 SND_PCM_ACCESS_RW_INTERLEAVED, | 671 SND_PCM_ACCESS_RW_INTERLEAVED, |
673 params.channels, | 672 params.channels, |
674 params.freq, | 673 params.freq, |
675 1, // Allow ALSA to resample. | 674 1, // Allow ALSA to resample. |
676 latency); | 675 latency); |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
734 } | 733 } |
735 return new AlsaInputStream( | 734 return new AlsaInputStream( |
736 this, handle, frame_size, wait_timeout_ms, flags, freq); | 735 this, handle, frame_size, wait_timeout_ms, flags, freq); |
737 } | 736 } |
738 | 737 |
739 inline const char *AlsaSoundSystem::GetError(int err) { | 738 inline const char *AlsaSoundSystem::GetError(int err) { |
740 return symbol_table_.snd_strerror()(err); | 739 return symbol_table_.snd_strerror()(err); |
741 } | 740 } |
742 | 741 |
743 } // namespace rtc | 742 } // namespace rtc |
OLD | NEW |