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

Side by Side Diff: services/media/audio/audio_track_impl.cc

Issue 1509323002: Mojom updates for Motown. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: sync with master Created 5 years 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
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <algorithm> 5 #include <algorithm>
6 #include <limits> 6 #include <limits>
7 7
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "mojo/services/media/common/cpp/linear_transform.h" 9 #include "mojo/services/media/common/cpp/linear_transform.h"
10 #include "services/media/audio/audio_output_manager.h" 10 #include "services/media/audio/audio_output_manager.h"
11 #include "services/media/audio/audio_server_impl.h" 11 #include "services/media/audio/audio_server_impl.h"
12 #include "services/media/audio/audio_track_impl.h" 12 #include "services/media/audio/audio_track_impl.h"
13 #include "services/media/audio/audio_track_to_output_link.h" 13 #include "services/media/audio/audio_track_to_output_link.h"
14 14
15 namespace mojo { 15 namespace mojo {
16 namespace media { 16 namespace media {
17 namespace audio { 17 namespace audio {
18 18
19 constexpr size_t AudioTrackImpl::PTS_FRACTIONAL_BITS; 19 constexpr size_t AudioTrackImpl::PTS_FRACTIONAL_BITS;
20 20
21 // TODO(johngro): If there is ever a better way to do this type of static-table 21 // TODO(johngro): If there is ever a better way to do this type of static-table
22 // initialization using mojom generated structs, we should switch to it. 22 // initialization using mojom generated structs, we should switch to it.
23 static const struct { 23 static const struct {
24 LpcmSampleFormat sample_format; 24 LpcmSampleFormat sample_format;
25 uint8_t min_samples_per_frame; 25 BoolRange interleaved;
26 uint8_t max_samples_per_frame; 26 uint8_t min_channels;
27 uint8_t max_channels;
27 uint32_t min_frames_per_second; 28 uint32_t min_frames_per_second;
28 uint32_t max_frames_per_second; 29 uint32_t max_frames_per_second;
29 } kSupportedLpcmTypeSets[] = { 30 } kSupportedLpcmTypeSets[] = {
30 { 31 {
31 .sample_format = LpcmSampleFormat::UNSIGNED_8, 32 .sample_format = LpcmSampleFormat::UNSIGNED_8,
32 .min_samples_per_frame = 1, 33 .interleaved = BoolRange::TRUE,
33 .max_samples_per_frame = 2, 34 .min_channels = 1,
35 .max_channels = 2,
34 .min_frames_per_second = 1000, 36 .min_frames_per_second = 1000,
35 .max_frames_per_second = 48000, 37 .max_frames_per_second = 48000,
36 }, 38 },
37 { 39 {
38 .sample_format = LpcmSampleFormat::SIGNED_16, 40 .sample_format = LpcmSampleFormat::SIGNED_16,
39 .min_samples_per_frame = 1, 41 .interleaved = BoolRange::TRUE,
40 .max_samples_per_frame = 2, 42 .min_channels = 1,
43 .max_channels = 2,
41 .min_frames_per_second = 1000, 44 .min_frames_per_second = 1000,
42 .max_frames_per_second = 48000, 45 .max_frames_per_second = 48000,
43 }, 46 },
44 }; 47 };
45 48
46 AudioTrackImpl::AudioTrackImpl(InterfaceRequest<AudioTrack> iface, 49 AudioTrackImpl::AudioTrackImpl(InterfaceRequest<AudioTrack> iface,
47 AudioServerImpl* owner) 50 AudioServerImpl* owner)
48 : owner_(owner), 51 : owner_(owner),
49 binding_(this), 52 binding_(this),
50 pipe_(this, owner) { 53 pipe_(this, owner) {
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
84 const MediaTypeSetPtr& mts = 87 const MediaTypeSetPtr& mts =
85 (desc->supported_media_types[i] = MediaTypeSet::New()); 88 (desc->supported_media_types[i] = MediaTypeSet::New());
86 89
87 mts->scheme = MediaTypeScheme::LPCM; 90 mts->scheme = MediaTypeScheme::LPCM;
88 mts->details = MediaTypeSetDetails::New(); 91 mts->details = MediaTypeSetDetails::New();
89 92
90 const auto& s = kSupportedLpcmTypeSets[i]; 93 const auto& s = kSupportedLpcmTypeSets[i];
91 LpcmMediaTypeSetDetailsPtr lpcm_detail = LpcmMediaTypeSetDetails::New(); 94 LpcmMediaTypeSetDetailsPtr lpcm_detail = LpcmMediaTypeSetDetails::New();
92 95
93 lpcm_detail->sample_format = s.sample_format; 96 lpcm_detail->sample_format = s.sample_format;
94 lpcm_detail->min_samples_per_frame = s.min_samples_per_frame; 97 lpcm_detail->interleaved = s.interleaved;
95 lpcm_detail->max_samples_per_frame = s.max_samples_per_frame; 98 lpcm_detail->min_channels = s.min_channels;
99 lpcm_detail->max_channels = s.max_channels;
96 lpcm_detail->min_frames_per_second = s.min_frames_per_second; 100 lpcm_detail->min_frames_per_second = s.min_frames_per_second;
97 lpcm_detail->max_frames_per_second = s.max_frames_per_second; 101 lpcm_detail->max_frames_per_second = s.max_frames_per_second;
98 mts->details->set_lpcm(lpcm_detail.Pass()); 102 mts->details->set_lpcm(lpcm_detail.Pass());
99 } 103 }
100 104
101 cbk.Run(desc.Pass()); 105 cbk.Run(desc.Pass());
102 } 106 }
103 107
104 void AudioTrackImpl::Configure(AudioTrackConfigurationPtr configuration, 108 void AudioTrackImpl::Configure(AudioTrackConfigurationPtr configuration,
105 InterfaceRequest<MediaPipe> req, 109 InterfaceRequest<MediaPipe> req,
(...skipping 12 matching lines...) Expand all
118 } 122 }
119 123
120 // Search our supported configuration sets to find one compatible with this 124 // Search our supported configuration sets to find one compatible with this
121 // request. 125 // request.
122 auto& cfg = configuration->media_type->details->get_lpcm(); 126 auto& cfg = configuration->media_type->details->get_lpcm();
123 size_t i; 127 size_t i;
124 for (i = 0; i < arraysize(kSupportedLpcmTypeSets); ++i) { 128 for (i = 0; i < arraysize(kSupportedLpcmTypeSets); ++i) {
125 const auto& cfg_set = kSupportedLpcmTypeSets[i]; 129 const auto& cfg_set = kSupportedLpcmTypeSets[i];
126 130
127 if ((cfg->sample_format == cfg_set.sample_format) && 131 if ((cfg->sample_format == cfg_set.sample_format) &&
128 (cfg->samples_per_frame >= cfg_set.min_samples_per_frame) && 132 (cfg_set.interleaved == BoolRange::EITHER ||
129 (cfg->samples_per_frame <= cfg_set.max_samples_per_frame) && 133 cfg->interleaved == (cfg_set.interleaved == BoolRange::TRUE)) &&
134 (cfg->channels >= cfg_set.min_channels) &&
135 (cfg->channels <= cfg_set.max_channels) &&
130 (cfg->frames_per_second >= cfg_set.min_frames_per_second) && 136 (cfg->frames_per_second >= cfg_set.min_frames_per_second) &&
131 (cfg->frames_per_second <= cfg_set.max_frames_per_second)) { 137 (cfg->frames_per_second <= cfg_set.max_frames_per_second)) {
132 break; 138 break;
133 } 139 }
134 } 140 }
135 141
136 if (i >= arraysize(kSupportedLpcmTypeSets)) { 142 if (i >= arraysize(kSupportedLpcmTypeSets)) {
137 cbk.Run(MediaResult::UNSUPPORTED_CONFIG); 143 cbk.Run(MediaResult::UNSUPPORTED_CONFIG);
138 return; 144 return;
139 } 145 }
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
173 179
174 case LpcmSampleFormat::SIGNED_24_IN_32: 180 case LpcmSampleFormat::SIGNED_24_IN_32:
175 bytes_per_frame_ = 4; 181 bytes_per_frame_ = 4;
176 break; 182 break;
177 183
178 default: 184 default:
179 DCHECK(false); 185 DCHECK(false);
180 bytes_per_frame_ = 2; 186 bytes_per_frame_ = 2;
181 break; 187 break;
182 } 188 }
183 bytes_per_frame_ *= cfg->samples_per_frame; 189 bytes_per_frame_ *= cfg->channels;
184 190
185 // Overflow trying to convert from frames to bytes? 191 // Overflow trying to convert from frames to bytes?
186 uint64_t requested_frames = configuration->max_frames; 192 uint64_t requested_frames = configuration->max_frames;
187 if (requested_frames > 193 if (requested_frames >
188 (std::numeric_limits<size_t>::max() / bytes_per_frame_)) { 194 (std::numeric_limits<size_t>::max() / bytes_per_frame_)) {
189 cbk.Run(MediaResult::INSUFFICIENT_RESOURCES); 195 cbk.Run(MediaResult::INSUFFICIENT_RESOURCES);
190 return; 196 return;
191 } 197 }
192 198
193 size_t requested_bytes = (requested_frames * bytes_per_frame_); 199 size_t requested_bytes = (requested_frames * bytes_per_frame_);
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
265 for (const auto& output : outputs_) { 271 for (const auto& output : outputs_) {
266 DCHECK(output); 272 DCHECK(output);
267 output->FlushPendingQueue(); 273 output->FlushPendingQueue();
268 } 274 }
269 cbk.Run(MediaResult::OK); 275 cbk.Run(MediaResult::OK);
270 } 276 }
271 277
272 } // namespace audio 278 } // namespace audio
273 } // namespace media 279 } // namespace media
274 } // namespace mojo 280 } // namespace mojo
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698