1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/content/media/webaudio/PlayingRefChangeHandler.h Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,56 @@ 1.4 +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 1.5 +/* vim:set ts=2 sw=2 sts=2 et cindent: */ 1.6 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.7 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.8 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.9 + 1.10 +#ifndef PlayingRefChangeHandler_h__ 1.11 +#define PlayingRefChangeHandler_h__ 1.12 + 1.13 +#include "nsThreadUtils.h" 1.14 +#include "AudioNodeStream.h" 1.15 + 1.16 +namespace mozilla { 1.17 +namespace dom { 1.18 + 1.19 +class PlayingRefChangeHandler : public nsRunnable 1.20 +{ 1.21 +public: 1.22 + enum ChangeType { ADDREF, RELEASE }; 1.23 + PlayingRefChangeHandler(AudioNodeStream* aStream, ChangeType aChange) 1.24 + : mStream(aStream) 1.25 + , mChange(aChange) 1.26 + { 1.27 + } 1.28 + 1.29 + NS_IMETHOD Run() 1.30 + { 1.31 + nsRefPtr<AudioNode> node; 1.32 + { 1.33 + // No need to keep holding the lock for the whole duration of this 1.34 + // function, since we're holding a strong reference to it, so if 1.35 + // we can obtain the reference, we will hold the node alive in 1.36 + // this function. 1.37 + MutexAutoLock lock(mStream->Engine()->NodeMutex()); 1.38 + node = mStream->Engine()->Node(); 1.39 + } 1.40 + if (node) { 1.41 + if (mChange == ADDREF) { 1.42 + node->MarkActive(); 1.43 + } else if (mChange == RELEASE) { 1.44 + node->MarkInactive(); 1.45 + } 1.46 + } 1.47 + return NS_OK; 1.48 + } 1.49 + 1.50 +private: 1.51 + nsRefPtr<AudioNodeStream> mStream; 1.52 + ChangeType mChange; 1.53 +}; 1.54 + 1.55 +} 1.56 +} 1.57 + 1.58 +#endif 1.59 +