| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2010, Google Inc. All rights reserved. | 2 * Copyright (C) 2010, 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 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 266 // When a source node has no more processing to do (has finished playing), | 266 // When a source node has no more processing to do (has finished playing), |
| 267 // this method tells the context to release the corresponding node. | 267 // this method tells the context to release the corresponding node. |
| 268 void NotifySourceNodeFinishedProcessing(AudioHandler*); | 268 void NotifySourceNodeFinishedProcessing(AudioHandler*); |
| 269 | 269 |
| 270 // Called at the start of each render quantum. | 270 // Called at the start of each render quantum. |
| 271 void HandlePreRenderTasks(const AudioIOPosition& output_position); | 271 void HandlePreRenderTasks(const AudioIOPosition& output_position); |
| 272 | 272 |
| 273 // Called at the end of each render quantum. | 273 // Called at the end of each render quantum. |
| 274 void HandlePostRenderTasks(); | 274 void HandlePostRenderTasks(); |
| 275 | 275 |
| 276 // Called periodically at the end of each render quantum to release | |
| 277 // finished source nodes. Updates m_finishedSourceNodes with nodes | |
| 278 // to be deleted. Returns true if any node needs deletion. Must be | |
| 279 // run from the audio thread. | |
| 280 bool ReleaseFinishedSourceNodes(); | |
| 281 | |
| 282 // The finished source nodes found by |releaseFinishedSourceNodes| | |
| 283 // will be removed on the main thread, which is done here. | |
| 284 void RemoveFinishedSourceNodes(bool needs_removal); | |
| 285 | |
| 286 // Keeps track of the number of connections made. | 276 // Keeps track of the number of connections made. |
| 287 void IncrementConnectionCount() { | 277 void IncrementConnectionCount() { |
| 288 DCHECK(IsMainThread()); | 278 DCHECK(IsMainThread()); |
| 289 connection_count_++; | 279 connection_count_++; |
| 290 } | 280 } |
| 291 | 281 |
| 292 unsigned ConnectionCount() const { return connection_count_; } | 282 unsigned ConnectionCount() const { return connection_count_; } |
| 293 | 283 |
| 294 DeferredTaskHandler& GetDeferredTaskHandler() const { | 284 DeferredTaskHandler& GetDeferredTaskHandler() const { |
| 295 return *deferred_task_handler_; | 285 return *deferred_task_handler_; |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 406 kAutoplayStatusCount | 396 kAutoplayStatusCount |
| 407 }; | 397 }; |
| 408 | 398 |
| 409 bool is_cleared_; | 399 bool is_cleared_; |
| 410 void Clear(); | 400 void Clear(); |
| 411 | 401 |
| 412 // When the context goes away, there might still be some sources which | 402 // When the context goes away, there might still be some sources which |
| 413 // haven't finished playing. Make sure to release them here. | 403 // haven't finished playing. Make sure to release them here. |
| 414 void ReleaseActiveSourceNodes(); | 404 void ReleaseActiveSourceNodes(); |
| 415 | 405 |
| 416 // Actually remove the nodes noted for deletion by | |
| 417 // releaseFinishedSourceNodes. Must be run from the main thread, | |
| 418 // and must not be run with the context lock. | |
| 419 void RemoveFinishedSourceNodesOnMainThread(); | |
| 420 | |
| 421 // Returns the Document wich wich the instance is associated. | 406 // Returns the Document wich wich the instance is associated. |
| 422 Document* GetDocument() const; | 407 Document* GetDocument() const; |
| 423 | 408 |
| 424 // Returns the AutoplayPolicy currently applying to this instance. | 409 // Returns the AutoplayPolicy currently applying to this instance. |
| 425 AutoplayPolicy::Type GetAutoplayPolicy() const; | 410 AutoplayPolicy::Type GetAutoplayPolicy() const; |
| 426 | 411 |
| 427 // Returns whether the autoplay requirements are fulfilled. | 412 // Returns whether the autoplay requirements are fulfilled. |
| 428 bool AreAutoplayRequirementsFulfilled() const; | 413 bool AreAutoplayRequirementsFulfilled() const; |
| 429 | 414 |
| 430 // Listener for the PannerNodes | 415 // Listener for the PannerNodes |
| 431 Member<AudioListener> listener_; | 416 Member<AudioListener> listener_; |
| 432 | 417 |
| 433 // Only accessed in the audio thread. | 418 // Accessed by audio thread and main thread, coordinated using |
| 419 // the associated mutex. |
| 420 // |
| 434 // These raw pointers are safe because AudioSourceNodes in | 421 // These raw pointers are safe because AudioSourceNodes in |
| 435 // m_activeSourceNodes own them. | 422 // active_source_nodes_ own them. |
| 423 Mutex finished_source_handlers_mutex_; |
| 436 Vector<AudioHandler*> finished_source_handlers_; | 424 Vector<AudioHandler*> finished_source_handlers_; |
| 437 | 425 |
| 438 // List of source nodes. This is either accessed when the graph lock is | 426 // List of source nodes. This is either accessed when the graph lock is |
| 439 // held, or on the main thread when the audio thread has finished. | 427 // held, or on the main thread when the audio thread has finished. |
| 440 // Oilpan: This Vector holds connection references. We must call | 428 // Oilpan: This Vector holds connection references. We must call |
| 441 // AudioHandler::makeConnection when we add an AudioNode to this, and must | 429 // AudioHandler::makeConnection when we add an AudioNode to this, and must |
| 442 // call AudioHandler::breakConnection() when we remove an AudioNode from | 430 // call AudioHandler::breakConnection() when we remove an AudioNode from |
| 443 // this. | 431 // this. |
| 444 HeapVector<Member<AudioNode>> active_source_nodes_; | 432 HeapVector<Member<AudioNode>> active_source_nodes_; |
| 445 | 433 |
| 446 // The main thread controls m_activeSourceNodes, all updates and additions | 434 // Called by the audio thread to handle Promises for resume() and suspend(), |
| 447 // are performed by it. When the audio thread marks a source node as finished, | 435 // posting a main thread task to perform the actual resolving, if needed. |
| 448 // the nodes are added to |m_finishedSourceNodes| and scheduled for removal | 436 // |
| 449 // from |m_activeSourceNodes| by the main thread. | 437 // TODO(dominicc): Move to AudioContext because only it creates |
| 450 HashSet<UntracedMember<AudioNode>> finished_source_nodes_; | 438 // these Promises. |
| 439 void ResolvePromisesForResume(); |
| 451 | 440 |
| 452 // FIXME(dominicc): Move these to AudioContext because only | 441 // The audio thread relies on the main thread to perform some operations |
| 453 // it creates these Promises. | 442 // over the objects that it owns and controls; |ScheduleMainThreadCleanup()| |
| 454 // Handle Promises for resume() and suspend() | 443 // posts the task to initiate those. |
| 455 void ResolvePromisesForResume(); | 444 // |
| 456 void ResolvePromisesForResumeOnMainThread(); | 445 // That is, we combine all those sub-tasks into one task action for |
| 446 // convenience and performance, |PerformCleanupOnMainThread()|. It handles |
| 447 // promise resolving, stopping and finishing up of audio source nodes etc. |
| 448 // Actions that should happen, but can happen asynchronously to the |
| 449 // audio thread making rendering progress. |
| 450 void ScheduleMainThreadCleanup(); |
| 451 void PerformCleanupOnMainThread(); |
| 457 | 452 |
| 458 // When the context is going away, reject any pending script promise | 453 // When the context is going away, reject any pending script promise |
| 459 // resolvers. | 454 // resolvers. |
| 460 virtual void RejectPendingResolvers(); | 455 virtual void RejectPendingResolvers(); |
| 461 | 456 |
| 462 // Record the current autoplay status and clear it. | 457 // Record the current autoplay status and clear it. |
| 463 void RecordAutoplayStatus(); | 458 void RecordAutoplayStatus(); |
| 464 | 459 |
| 465 // True if we're in the process of resolving promises for resume(). Resolving | 460 // True if we're in the process of resolving promises for resume(). Resolving |
| 466 // can take some time and the audio context process loop is very fast, so we | 461 // can take some time and the audio context process loop is very fast, so we |
| 467 // don't want to call resolve an excessive number of times. | 462 // don't want to call resolve an excessive number of times. |
| 468 bool is_resolving_resume_promises_; | 463 bool is_resolving_resume_promises_; |
| 469 | 464 |
| 465 // Set to |true| by the audio thread when it posts a main-thread task to |
| 466 // perform delayed state sync'ing updates that needs to be done on the main |
| 467 // thread. Cleared by the main thread task once it has run. |
| 468 bool has_posted_cleanup_task_; |
| 469 |
| 470 // Whether a user gesture is required to start this AudioContext. | 470 // Whether a user gesture is required to start this AudioContext. |
| 471 bool user_gesture_required_; | 471 bool user_gesture_required_; |
| 472 | 472 |
| 473 unsigned connection_count_; | 473 unsigned connection_count_; |
| 474 | 474 |
| 475 // Graph locking. | 475 // Graph locking. |
| 476 RefPtr<DeferredTaskHandler> deferred_task_handler_; | 476 RefPtr<DeferredTaskHandler> deferred_task_handler_; |
| 477 | 477 |
| 478 // The state of the BaseAudioContext. | 478 // The state of the BaseAudioContext. |
| 479 AudioContextState context_state_; | 479 AudioContextState context_state_; |
| (...skipping 28 matching lines...) Expand all Loading... |
| 508 // It is somewhat arbitrary and could be increased if necessary. | 508 // It is somewhat arbitrary and could be increased if necessary. |
| 509 enum { kMaxNumberOfChannels = 32 }; | 509 enum { kMaxNumberOfChannels = 32 }; |
| 510 | 510 |
| 511 Optional<AutoplayStatus> autoplay_status_; | 511 Optional<AutoplayStatus> autoplay_status_; |
| 512 AudioIOPosition output_position_; | 512 AudioIOPosition output_position_; |
| 513 }; | 513 }; |
| 514 | 514 |
| 515 } // namespace blink | 515 } // namespace blink |
| 516 | 516 |
| 517 #endif // BaseAudioContext_h | 517 #endif // BaseAudioContext_h |
| OLD | NEW |