Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(36)

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: used the stubs script to do the dynamic linking Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | 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
11 namespace media {
12
13 namespace {
14
15 pa_channel_position ChromiumToPAChannelPosition(Channels channel) {
16 switch (channel) {
17 // PulseAudio does not differentiate between left/right and
18 // stereo-left/stereo-right, both translate to front-left/front-right.
19 case LEFT:
20 return PA_CHANNEL_POSITION_FRONT_LEFT;
21 case RIGHT:
22 return PA_CHANNEL_POSITION_FRONT_RIGHT;
23 case CENTER:
24 return PA_CHANNEL_POSITION_FRONT_CENTER;
25 case LFE:
26 return PA_CHANNEL_POSITION_LFE;
27 case BACK_LEFT:
28 return PA_CHANNEL_POSITION_REAR_LEFT;
29 case BACK_RIGHT:
30 return PA_CHANNEL_POSITION_REAR_RIGHT;
31 case LEFT_OF_CENTER:
32 return PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER;
33 case RIGHT_OF_CENTER:
34 return PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER;
35 case BACK_CENTER:
36 return PA_CHANNEL_POSITION_REAR_CENTER;
37 case SIDE_LEFT:
38 return PA_CHANNEL_POSITION_SIDE_LEFT;
39 case SIDE_RIGHT:
40 return PA_CHANNEL_POSITION_SIDE_RIGHT;
41 case CHANNELS_MAX:
42 return PA_CHANNEL_POSITION_INVALID;
43 default:
44 NOTREACHED() << "Invalid channel: " << channel;
45 return PA_CHANNEL_POSITION_INVALID;
46 }
47 }
48
49 } // namespace
50
51 AutoPulseLock::AutoPulseLock(pa_threaded_mainloop* pa_mainloop)
52 : pa_mainloop_(pa_mainloop) {
53 pa_threaded_mainloop_lock(pa_mainloop_);
54 }
55
56 AutoPulseLock::~AutoPulseLock() {
57 pa_threaded_mainloop_unlock(pa_mainloop_);
58 }
59
60 // static, pa_stream_success_cb_t
61 void StreamSuccessCallback(pa_stream* s, int error, void* mainloop) {
62 pa_threaded_mainloop* pa_mainloop =
63 static_cast<pa_threaded_mainloop*>(mainloop);
64 pa_threaded_mainloop_signal(pa_mainloop, 0);
65 }
66
67 // |pa_context| and |pa_stream| state changed cb.
68 void ContextStateCallback(pa_context* context, void* mainloop) {
69 pa_threaded_mainloop* pa_mainloop =
70 static_cast<pa_threaded_mainloop*>(mainloop);
71 pa_threaded_mainloop_signal(pa_mainloop, 0);
72 }
73
74 pa_sample_format_t BitsToPASampleFormat(int bits_per_sample) {
75 switch (bits_per_sample) {
76 case 8:
77 return PA_SAMPLE_U8;
78 case 16:
79 return PA_SAMPLE_S16LE;
80 case 24:
81 return PA_SAMPLE_S24LE;
82 case 32:
83 return PA_SAMPLE_S32LE;
84 default:
85 NOTREACHED() << "Invalid bits per sample: " << bits_per_sample;
86 return PA_SAMPLE_INVALID;
87 }
88 }
89
90 pa_channel_map ChannelLayoutToPAChannelMap(ChannelLayout channel_layout) {
91 pa_channel_map channel_map;
92 pa_channel_map_init(&channel_map);
93
94 channel_map.channels = ChannelLayoutToChannelCount(channel_layout);
95 for (Channels ch = LEFT; ch < CHANNELS_MAX;
96 ch = static_cast<Channels>(ch + 1)) {
DaleCurtis 2013/02/20 00:17:38 Indent.
no longer working on chromium 2013/02/20 14:43:38 Done.
97 int channel_index = ChannelOrder(channel_layout, ch);
98 if (channel_index < 0)
99 continue;
100
101 channel_map.map[channel_index] = ChromiumToPAChannelPosition(ch);
102 }
103
104 return channel_map;
105 }
106
107 void WaitForOperationCompletion(pa_threaded_mainloop* pa_mainloop,
108 pa_operation* operation) {
109 if (!operation) {
110 DLOG(WARNING) << "Operation is NULL";
111 return;
112 }
113
114 while (pa_operation_get_state(operation) == PA_OPERATION_RUNNING)
115 pa_threaded_mainloop_wait(pa_mainloop);
116
117 pa_operation_unref(operation);
118 }
119
120 int GetHardwareLatencyInBytes(pa_stream* stream,
121 int sample_rate,
122 int bytes_per_frame) {
123 DCHECK(stream);
124 int negative = 0;
125 pa_usec_t latency_micros = 0;
126 if (pa_stream_get_latency(stream, &latency_micros, &negative) != 0)
127 return 0;
128
129 if (negative)
130 return 0;
131
132 return latency_micros * sample_rate * bytes_per_frame /
133 base::Time::kMicrosecondsPerSecond;
134 }
135
136 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698