Chromium Code Reviews

Side by Side Diff: media/audio/pulse/pulse_util.cc

Issue 10952024: Adding pulseaudio input support to chrome (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: switched to dynamic linking and addressed Andrew's comments. Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "media/audio/pulse/pulse_util.h"
6
7 #include "base/logging.h"
8 #include "base/time.h"
9 #include "media/audio/audio_manager_base.h"
10 #include "media/audio/pulse/pulse_wrapper.h"
11
12 namespace media {
13
14 namespace {
15
16 pa_channel_position ChromiumToPAChannelPosition(Channels channel) {
17 switch (channel) {
18 // PulseAudio does not differentiate between left/right and
19 // stereo-left/stereo-right, both translate to front-left/front-right.
20 case LEFT:
21 return PA_CHANNEL_POSITION_FRONT_LEFT;
22 case RIGHT:
23 return PA_CHANNEL_POSITION_FRONT_RIGHT;
24 case CENTER:
25 return PA_CHANNEL_POSITION_FRONT_CENTER;
26 case LFE:
27 return PA_CHANNEL_POSITION_LFE;
28 case BACK_LEFT:
29 return PA_CHANNEL_POSITION_REAR_LEFT;
30 case BACK_RIGHT:
31 return PA_CHANNEL_POSITION_REAR_RIGHT;
32 case LEFT_OF_CENTER:
33 return PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER;
34 case RIGHT_OF_CENTER:
35 return PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER;
36 case BACK_CENTER:
37 return PA_CHANNEL_POSITION_REAR_CENTER;
38 case SIDE_LEFT:
39 return PA_CHANNEL_POSITION_SIDE_LEFT;
40 case SIDE_RIGHT:
41 return PA_CHANNEL_POSITION_SIDE_RIGHT;
42 case CHANNELS_MAX:
43 return PA_CHANNEL_POSITION_INVALID;
44 default:
45 NOTREACHED() << "Invalid channel: " << channel;
46 return PA_CHANNEL_POSITION_INVALID;
47 }
48 }
49
50 } // namespace
51
52 AutoPulseLock::AutoPulseLock(PulseWrapper* wrapper,
53 pa_threaded_mainloop* pa_mainloop)
54 : wrapper_(wrapper),
55 pa_mainloop_(pa_mainloop) {
56 wrapper_->pa_threaded_mainloop_lock_(pa_mainloop_);
57 }
58
59 AutoPulseLock::~AutoPulseLock() {
60 wrapper_->pa_threaded_mainloop_unlock_(pa_mainloop_);
61 }
62
63 pa_sample_format_t BitsToPASampleFormat(PulseWrapper* wrapper,
64 int bits_per_sample) {
65 switch (bits_per_sample) {
66 case 8:
67 return PA_SAMPLE_U8;
68 case 16:
69 return PA_SAMPLE_S16LE;
70 case 24:
71 return PA_SAMPLE_S24LE;
72 case 32:
73 return PA_SAMPLE_S32LE;
74 default:
75 NOTREACHED() << "Invalid bits per sample: " << bits_per_sample;
76 return PA_SAMPLE_INVALID;
77 }
78 }
79
80 pa_channel_map ChannelLayoutToPAChannelMap(PulseWrapper* wrapper,
81 ChannelLayout channel_layout) {
82 pa_channel_map channel_map;
83 wrapper->pa_channel_map_init_(&channel_map);
84
85 channel_map.channels = ChannelLayoutToChannelCount(channel_layout);
86 for (Channels ch = LEFT; ch < CHANNELS_MAX;
87 ch = static_cast<Channels>(ch + 1)) {
88 int channel_index = ChannelOrder(channel_layout, ch);
89 if (channel_index < 0)
90 continue;
91
92 channel_map.map[channel_index] = ChromiumToPAChannelPosition(ch);
93 }
94
95 return channel_map;
96 }
97
98 void WaitForOperationCompletion(PulseWrapper* wrapper,
99 pa_threaded_mainloop* pa_mainloop,
100 pa_operation* operation) {
101 if (!operation) {
102 DLOG(WARNING) << "Operation is NULL";
103 return;
104 }
105
106 while (wrapper->pa_operation_get_state_(operation) == PA_OPERATION_RUNNING)
107 wrapper->pa_threaded_mainloop_wait_(pa_mainloop);
108
109 wrapper->pa_operation_unref_(operation);
110 }
111
112 int GetHardwareLatencyInBytes(PulseWrapper* wrapper,
113 pa_stream* stream,
114 int sample_rate,
115 int bytes_per_frame) {
116 DCHECK(stream);
117 int negative = 0;
118 pa_usec_t latency_micros = 0;
119 if (wrapper->pa_stream_get_latency_(stream, &latency_micros, &negative) != 0)
120 return 0;
121
122 if (negative)
123 return 0;
124
125 return latency_micros * sample_rate * bytes_per_frame /
126 base::Time::kMicrosecondsPerSecond;
127
128 }
129
130 } // namespace media
OLDNEW

Powered by Google App Engine