| Phil Burk | c0c70e3 | 2017-02-09 13:18:38 -0800 | [diff] [blame] | 1 | /* | 
 | 2 |  * Copyright (C) 2017 The Android Open Source Project | 
 | 3 |  * | 
 | 4 |  * Licensed under the Apache License, Version 2.0 (the "License"); | 
 | 5 |  * you may not use this file except in compliance with the License. | 
 | 6 |  * You may obtain a copy of the License at | 
 | 7 |  * | 
 | 8 |  *      http://www.apache.org/licenses/LICENSE-2.0 | 
 | 9 |  * | 
 | 10 |  * Unless required by applicable law or agreed to in writing, software | 
 | 11 |  * distributed under the License is distributed on an "AS IS" BASIS, | 
 | 12 |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
 | 13 |  * See the License for the specific language governing permissions and | 
 | 14 |  * limitations under the License. | 
 | 15 |  */ | 
 | 16 |  | 
| Eric Laurent | cb4dae2 | 2017-07-01 19:39:32 -0700 | [diff] [blame] | 17 | #define LOG_TAG "AAudioServiceEndpoint" | 
| Phil Burk | 71f35bb | 2017-04-13 16:05:07 -0700 | [diff] [blame] | 18 | //#define LOG_NDEBUG 0 | 
 | 19 | #include <utils/Log.h> | 
 | 20 |  | 
| Phil Burk | 4501b35 | 2017-06-29 18:12:36 -0700 | [diff] [blame] | 21 | #include <algorithm> | 
| Phil Burk | 71f35bb | 2017-04-13 16:05:07 -0700 | [diff] [blame] | 22 | #include <assert.h> | 
 | 23 | #include <map> | 
 | 24 | #include <mutex> | 
| Phil Burk | 4501b35 | 2017-06-29 18:12:36 -0700 | [diff] [blame] | 25 | #include <sstream> | 
 | 26 | #include <vector> | 
 | 27 |  | 
| Phil Burk | 71f35bb | 2017-04-13 16:05:07 -0700 | [diff] [blame] | 28 | #include <utils/Singleton.h> | 
 | 29 |  | 
 | 30 | #include "AAudioEndpointManager.h" | 
 | 31 | #include "AAudioServiceEndpoint.h" | 
| Phil Burk | c0c70e3 | 2017-02-09 13:18:38 -0800 | [diff] [blame] | 32 |  | 
 | 33 | #include "core/AudioStreamBuilder.h" | 
 | 34 | #include "AAudioServiceEndpoint.h" | 
 | 35 | #include "AAudioServiceStreamShared.h" | 
| Phil Burk | 39f02dd | 2017-08-04 09:13:31 -0700 | [diff] [blame] | 36 | #include "AAudioServiceEndpointShared.h" | 
| Phil Burk | c0c70e3 | 2017-02-09 13:18:38 -0800 | [diff] [blame] | 37 |  | 
 | 38 | using namespace android;  // TODO just import names needed | 
 | 39 | using namespace aaudio;   // TODO just import names needed | 
 | 40 |  | 
| Phil Burk | 39f02dd | 2017-08-04 09:13:31 -0700 | [diff] [blame] | 41 | AAudioServiceEndpoint::~AAudioServiceEndpoint() { | 
 | 42 |     ALOGD("AAudioServiceEndpoint::~AAudioServiceEndpoint() destroying endpoint %p", this); | 
 | 43 | } | 
| Phil Burk | 71f35bb | 2017-04-13 16:05:07 -0700 | [diff] [blame] | 44 |  | 
| Phil Burk | 4501b35 | 2017-06-29 18:12:36 -0700 | [diff] [blame] | 45 | std::string AAudioServiceEndpoint::dump() const { | 
 | 46 |     std::stringstream result; | 
 | 47 |  | 
 | 48 |     const bool isLocked = AAudio_tryUntilTrue( | 
 | 49 |             [this]()->bool { return mLockStreams.try_lock(); } /* f */, | 
 | 50 |             50 /* times */, | 
 | 51 |             20 /* sleepMs */); | 
 | 52 |     if (!isLocked) { | 
| Phil Burk | 39f02dd | 2017-08-04 09:13:31 -0700 | [diff] [blame] | 53 |         result << "AAudioServiceEndpoint may be deadlocked\n"; | 
| Phil Burk | 4501b35 | 2017-06-29 18:12:36 -0700 | [diff] [blame] | 54 |     } | 
 | 55 |  | 
| Phil Burk | 39f02dd | 2017-08-04 09:13:31 -0700 | [diff] [blame] | 56 |     result << "    Direction:            " << ((getDirection() == AAUDIO_DIRECTION_OUTPUT) | 
 | 57 |                                    ? "OUTPUT" : "INPUT") << "\n"; | 
 | 58 |     result << "    Sample Rate:          " << getSampleRate() << "\n"; | 
 | 59 |     result << "    Frames Per Burst:     " << mFramesPerBurst << "\n"; | 
 | 60 |     result << "    Reference Count:      " << mOpenCount << "\n"; | 
 | 61 |     result << "    Requested Device Id:  " << mRequestedDeviceId << "\n"; | 
 | 62 |     result << "    Device Id:            " << getDeviceId() << "\n"; | 
| Phil Burk | 523b304 | 2017-09-13 13:03:08 -0700 | [diff] [blame] | 63 |     result << "    Registered Streams:" << "\n"; | 
| Phil Burk | a5222e2 | 2017-07-28 13:31:14 -0700 | [diff] [blame] | 64 |     result << AAudioServiceStreamShared::dumpHeader() << "\n"; | 
| Phil Burk | 39f02dd | 2017-08-04 09:13:31 -0700 | [diff] [blame] | 65 |     for (const auto stream : mRegisteredStreams) { | 
 | 66 |         result << stream->dump() << "\n"; | 
| Phil Burk | 4501b35 | 2017-06-29 18:12:36 -0700 | [diff] [blame] | 67 |     } | 
 | 68 |  | 
 | 69 |     if (isLocked) { | 
 | 70 |         mLockStreams.unlock(); | 
 | 71 |     } | 
 | 72 |     return result.str(); | 
 | 73 | } | 
 | 74 |  | 
| Phil Burk | c0c70e3 | 2017-02-09 13:18:38 -0800 | [diff] [blame] | 75 | void AAudioServiceEndpoint::disconnectRegisteredStreams() { | 
 | 76 |     std::lock_guard<std::mutex> lock(mLockStreams); | 
| Phil Burk | 39f02dd | 2017-08-04 09:13:31 -0700 | [diff] [blame] | 77 |     for (const auto stream : mRegisteredStreams) { | 
 | 78 |         stream->stop(); | 
 | 79 |         stream->disconnect(); | 
| Phil Burk | c0c70e3 | 2017-02-09 13:18:38 -0800 | [diff] [blame] | 80 |     } | 
 | 81 |     mRegisteredStreams.clear(); | 
 | 82 | } | 
| Eric Laurent | a17ae74 | 2017-06-29 15:43:55 -0700 | [diff] [blame] | 83 |  | 
| Phil Burk | 39f02dd | 2017-08-04 09:13:31 -0700 | [diff] [blame] | 84 | aaudio_result_t AAudioServiceEndpoint::registerStream(sp<AAudioServiceStreamBase>stream) { | 
 | 85 |     std::lock_guard<std::mutex> lock(mLockStreams); | 
 | 86 |     mRegisteredStreams.push_back(stream); | 
 | 87 |     return AAUDIO_OK; | 
 | 88 | } | 
 | 89 |  | 
 | 90 | aaudio_result_t AAudioServiceEndpoint::unregisterStream(sp<AAudioServiceStreamBase>stream) { | 
 | 91 |     std::lock_guard<std::mutex> lock(mLockStreams); | 
 | 92 |     mRegisteredStreams.erase(std::remove( | 
 | 93 |             mRegisteredStreams.begin(), mRegisteredStreams.end(), stream), | 
 | 94 |                              mRegisteredStreams.end()); | 
 | 95 |     return AAUDIO_OK; | 
 | 96 | } | 
 | 97 |  | 
| Eric Laurent | a17ae74 | 2017-06-29 15:43:55 -0700 | [diff] [blame] | 98 | bool AAudioServiceEndpoint::matches(const AAudioStreamConfiguration& configuration) { | 
| Phil Burk | 39f02dd | 2017-08-04 09:13:31 -0700 | [diff] [blame] | 99 |     if (configuration.getDirection() != getDirection()) { | 
 | 100 |         return false; | 
 | 101 |     } | 
| Eric Laurent | a17ae74 | 2017-06-29 15:43:55 -0700 | [diff] [blame] | 102 |     if (configuration.getDeviceId() != AAUDIO_UNSPECIFIED && | 
| Phil Burk | 39f02dd | 2017-08-04 09:13:31 -0700 | [diff] [blame] | 103 |         configuration.getDeviceId() != getDeviceId()) { | 
| Eric Laurent | a17ae74 | 2017-06-29 15:43:55 -0700 | [diff] [blame] | 104 |         return false; | 
 | 105 |     } | 
 | 106 |     if (configuration.getSampleRate() != AAUDIO_UNSPECIFIED && | 
| Phil Burk | 39f02dd | 2017-08-04 09:13:31 -0700 | [diff] [blame] | 107 |         configuration.getSampleRate() != getSampleRate()) { | 
| Eric Laurent | a17ae74 | 2017-06-29 15:43:55 -0700 | [diff] [blame] | 108 |         return false; | 
 | 109 |     } | 
 | 110 |     if (configuration.getSamplesPerFrame() != AAUDIO_UNSPECIFIED && | 
| Phil Burk | 39f02dd | 2017-08-04 09:13:31 -0700 | [diff] [blame] | 111 |         configuration.getSamplesPerFrame() != getSamplesPerFrame()) { | 
| Eric Laurent | a17ae74 | 2017-06-29 15:43:55 -0700 | [diff] [blame] | 112 |         return false; | 
 | 113 |     } | 
| Eric Laurent | a17ae74 | 2017-06-29 15:43:55 -0700 | [diff] [blame] | 114 |     return true; | 
 | 115 | } |