| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2011, Google Inc. All rights reserved. | 2 * Copyright (C) 2011, Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
| 8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
| 9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
| 10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 175 | 175 |
| 176 unsigned number_of_channels; | 176 unsigned number_of_channels; |
| 177 Vector<float*> destinations; | 177 Vector<float*> destinations; |
| 178 { | 178 { |
| 179 // Main thread GCs cannot happen while we're reading out channel | 179 // Main thread GCs cannot happen while we're reading out channel |
| 180 // data. Detect that condition by trying to take the cross-thread | 180 // data. Detect that condition by trying to take the cross-thread |
| 181 // persistent lock which is held while a GC runs. If the lock is | 181 // persistent lock which is held while a GC runs. If the lock is |
| 182 // already held, simply delay rendering until the next quantum. | 182 // already held, simply delay rendering until the next quantum. |
| 183 CrossThreadPersistentRegion::LockScope gc_lock( | 183 CrossThreadPersistentRegion::LockScope gc_lock( |
| 184 ProcessHeap::GetCrossThreadPersistentRegion(), true); | 184 ProcessHeap::GetCrossThreadPersistentRegion(), true); |
| 185 if (!gc_lock.HasLock()) | 185 if (!gc_lock.HasLock()) { |
| 186 // To ensure that the rendering step eventually happens, repost. |
| 187 render_thread_->GetWebTaskRunner()->PostTask( |
| 188 BLINK_FROM_HERE, |
| 189 Bind(&OfflineAudioDestinationHandler::DoOfflineRendering, |
| 190 WrapPassRefPtr(this))); |
| 186 return; | 191 return; |
| 192 } |
| 187 | 193 |
| 188 number_of_channels = render_target_->numberOfChannels(); | 194 number_of_channels = render_target_->numberOfChannels(); |
| 189 destinations.ReserveInitialCapacity(number_of_channels); | 195 destinations.ReserveInitialCapacity(number_of_channels); |
| 190 for (unsigned i = 0; i < number_of_channels; ++i) | 196 for (unsigned i = 0; i < number_of_channels; ++i) |
| 191 destinations.push_back(render_target_->getChannelData(i).View()->Data()); | 197 destinations.push_back(render_target_->getChannelData(i).View()->Data()); |
| 192 } | 198 } |
| 193 | 199 |
| 194 // Reset the suspend flag. | 200 // Reset the suspend flag. |
| 195 should_suspend_ = false; | 201 should_suspend_ = false; |
| 196 | 202 |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 358 SetHandler(OfflineAudioDestinationHandler::Create(*this, render_target)); | 364 SetHandler(OfflineAudioDestinationHandler::Create(*this, render_target)); |
| 359 } | 365 } |
| 360 | 366 |
| 361 OfflineAudioDestinationNode* OfflineAudioDestinationNode::Create( | 367 OfflineAudioDestinationNode* OfflineAudioDestinationNode::Create( |
| 362 BaseAudioContext* context, | 368 BaseAudioContext* context, |
| 363 AudioBuffer* render_target) { | 369 AudioBuffer* render_target) { |
| 364 return new OfflineAudioDestinationNode(*context, render_target); | 370 return new OfflineAudioDestinationNode(*context, render_target); |
| 365 } | 371 } |
| 366 | 372 |
| 367 } // namespace blink | 373 } // namespace blink |
| OLD | NEW |