/* * Copyright (C) 2007 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include "SoundManager.h" #include "StreamManager.h" #include namespace android { /** * Native class for Java SoundPool, manages a pool of sounds. * * See the Android SoundPool Java documentation for description of valid values. * https://developer.android.com/reference/android/media/SoundPool */ class SoundPool { public: SoundPool(int32_t maxStreams, const audio_attributes_t* attributes, const std::string& opPackageName = {}); ~SoundPool(); // SoundPool Java API support int32_t load(int fd, int64_t offset, int64_t length, int32_t priority); bool unload(int32_t soundID); int32_t play(int32_t soundID, float leftVolume, float rightVolume, int32_t priority, int32_t loop, float rate); void pause(int32_t streamID); void autoPause(); void resume(int32_t streamID); void autoResume(); void stop(int32_t streamID); void setVolume(int32_t streamID, float leftVolume, float rightVolume); void setPriority(int32_t streamID, int32_t priority); void setLoop(int32_t streamID, int32_t loop); void setRate(int32_t streamID, float rate); void setCallback(SoundPoolCallback* callback, void* user); void* getUserData() const; // not exposed in the public Java API, used for internal playerSetVolume() muting. void mute(bool muting); private: // Constructor initialized variables // Can access without lock as they are internally locked, // though care needs to be taken that the final result composed of // individually consistent actions are consistent. soundpool::SoundManager mSoundManager; soundpool::StreamManager mStreamManager; // mApiLock serializes SoundPool application calls (configurable by kUseApiLock). // It only locks at the SoundPool layer and not below. At this level, // mApiLock is only required for autoPause() and autoResume() to prevent zippering // of the individual pauses and resumes, and mute() for self-interaction with itself. // It is optional for all other apis. mutable std::mutex mApiLock; }; } // end namespace android