diff --git a/media/libaudiohal/impl/ConversionHelperAidl.cpp b/media/libaudiohal/impl/ConversionHelperAidl.cpp
index 7a32811..46abfda 100644
--- a/media/libaudiohal/impl/ConversionHelperAidl.cpp
+++ b/media/libaudiohal/impl/ConversionHelperAidl.cpp
@@ -37,6 +37,10 @@
     using ParameterScope = IHalAdapterVendorExtension::ParameterScope;
     if (parameterKeys.size() == 0) return OK;
     const String8 rawKeys = parameterKeys.keysToString();
+    if (vendorExt == nullptr) {
+        ALOGW("%s: unknown parameters, ignored: \"%s\"", __func__, rawKeys.c_str());
+        return OK;
+    }
 
     std::vector<std::string> parameterIds;
     RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(vendorExt->parseVendorParameterIds(
@@ -81,6 +85,10 @@
     using ParameterScope = IHalAdapterVendorExtension::ParameterScope;
     if (parameters.size() == 0) return OK;
     const String8 rawKeysAndValues = parameters.toString();
+    if (vendorExt == nullptr) {
+        ALOGW("%s: unknown parameters, ignored: \"%s\"", __func__, rawKeysAndValues.c_str());
+        return OK;
+    }
 
     std::vector<VendorParameter> syncParameters, asyncParameters;
     RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(vendorExt->parseVendorParameters(
diff --git a/media/libaudiohal/impl/DeviceHalAidl.cpp b/media/libaudiohal/impl/DeviceHalAidl.cpp
index fe44ecd..2af18cc 100644
--- a/media/libaudiohal/impl/DeviceHalAidl.cpp
+++ b/media/libaudiohal/impl/DeviceHalAidl.cpp
@@ -1024,11 +1024,15 @@
     (void)VALUE_OR_RETURN_STATUS(filterOutAndProcessParameter<String8>(
                     parameters, String8(AudioParameter::keyReconfigA2dp),
                     [&](const String8& value) -> status_t {
-                        std::vector<VendorParameter> result;
-                        RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
-                                mVendorExt->parseBluetoothA2dpReconfigureOffload(
-                                        std::string(value.c_str()), &result)));
-                        reconfigureOffload = std::move(result);
+                        if (mVendorExt != nullptr) {
+                            std::vector<VendorParameter> result;
+                            RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
+                                    mVendorExt->parseBluetoothA2dpReconfigureOffload(
+                                            std::string(value.c_str()), &result)));
+                            reconfigureOffload = std::move(result);
+                        } else {
+                            reconfigureOffload = std::vector<VendorParameter>();
+                        }
                         return OK;
                     }));
     if (mBluetoothA2dp != nullptr && a2dpEnabled.has_value()) {
diff --git a/media/libaudiohal/impl/DevicesFactoryHalAidl.cpp b/media/libaudiohal/impl/DevicesFactoryHalAidl.cpp
index 24df32d..3dbc14a 100644
--- a/media/libaudiohal/impl/DevicesFactoryHalAidl.cpp
+++ b/media/libaudiohal/impl/DevicesFactoryHalAidl.cpp
@@ -23,7 +23,6 @@
 //#define LOG_NDEBUG 0
 
 #include <aidl/android/hardware/audio/core/IModule.h>
-#include <aidl/android/media/audio/BnHalAdapterVendorExtension.h>
 #include <android/binder_manager.h>
 #include <media/AidlConversionNdkCpp.h>
 #include <media/AidlConversionUtil.h>
@@ -36,7 +35,6 @@
 using aidl::android::hardware::audio::core::IConfig;
 using aidl::android::hardware::audio::core::IModule;
 using aidl::android::hardware::audio::core::SurroundSoundConfig;
-using aidl::android::hardware::audio::core::VendorParameter;
 using aidl::android::media::audio::common::AudioHalEngineConfig;
 using aidl::android::media::audio::IHalAdapterVendorExtension;
 using android::detail::AudioHalVersionInfo;
@@ -64,86 +62,10 @@
     return cpp;
 }
 
-class HalAdapterVendorExtensionWrapper :
-            public ::aidl::android::media::audio::BnHalAdapterVendorExtension {
-  private:
-    ndk::ScopedAStatus parseVendorParameterIds(ParameterScope in_scope,
-                                               const std::string& in_rawKeys,
-                                               std::vector<std::string>* _aidl_return) override {
-        ndk::ScopedAStatus status;
-        while (true) {
-            status = get()->parseVendorParameterIds(in_scope, in_rawKeys, _aidl_return);
-            if (status.getStatus() != STATUS_DEAD_OBJECT) break;
-            mVendorExt.reset();
-        }
-        return status;
-    }
-
-    ndk::ScopedAStatus parseVendorParameters(
-            ParameterScope in_scope, const std::string& in_rawKeysAndValues,
-            std::vector<VendorParameter>* out_syncParameters,
-            std::vector<VendorParameter>* out_asyncParameters) override {
-        ndk::ScopedAStatus status;
-        while (true) {
-            status = get()->parseVendorParameters(in_scope, in_rawKeysAndValues,
-                    out_syncParameters, out_asyncParameters);
-            if (status.getStatus() != STATUS_DEAD_OBJECT) break;
-            mVendorExt.reset();
-        }
-        return status;
-    }
-
-    ndk::ScopedAStatus parseBluetoothA2dpReconfigureOffload(
-            const std::string& in_rawValue, std::vector<VendorParameter>* _aidl_return) override {
-        ndk::ScopedAStatus status;
-        while (true) {
-            status = get()->parseBluetoothA2dpReconfigureOffload(in_rawValue, _aidl_return);
-            if (status.getStatus() != STATUS_DEAD_OBJECT) break;
-            mVendorExt.reset();
-        }
-        return status;
-    }
-
-    ndk::ScopedAStatus parseBluetoothLeReconfigureOffload(const std::string& in_rawValue,
-            std::vector<VendorParameter>* _aidl_return) override {
-        ndk::ScopedAStatus status;
-        while (true) {
-            status = get()->parseBluetoothLeReconfigureOffload(in_rawValue, _aidl_return);
-            if (status.getStatus() != STATUS_DEAD_OBJECT) break;
-            mVendorExt.reset();
-        }
-        return status;
-    }
-
-    ndk::ScopedAStatus processVendorParameters(ParameterScope in_scope,
-                                               const std::vector<VendorParameter>& in_parameters,
-                                               std::string* _aidl_return) override {
-        ndk::ScopedAStatus status;
-        while (true) {
-            status = get()->processVendorParameters(in_scope, in_parameters, _aidl_return);
-            if (status.getStatus() != STATUS_DEAD_OBJECT) break;
-            mVendorExt.reset();
-        }
-        return status;
-    }
-
-    std::shared_ptr<IHalAdapterVendorExtension> get() {
-        if (!mVendorExt) {
-            auto serviceName = std::string(IHalAdapterVendorExtension::descriptor) + "/default";
-            mVendorExt = IHalAdapterVendorExtension::fromBinder(ndk::SpAIBinder(
-                            AServiceManager_waitForService(serviceName.c_str())));
-        }
-        return mVendorExt;
-    }
-
-    std::shared_ptr<::aidl::android::media::audio::IHalAdapterVendorExtension> mVendorExt;
-};
-
 }  // namespace
 
 DevicesFactoryHalAidl::DevicesFactoryHalAidl(std::shared_ptr<IConfig> config)
-        : mConfig(std::move(config)),
-          mVendorExt(ndk::SharedRefBase::make<HalAdapterVendorExtensionWrapper>()) {
+    : mConfig(std::move(config)) {
 }
 
 status_t DevicesFactoryHalAidl::getDeviceNames(std::vector<std::string> *names) {
@@ -188,7 +110,7 @@
         ALOGE("%s fromBinder %s failed", __func__, serviceName.c_str());
         return NO_INIT;
     }
-    *device = sp<DeviceHalAidl>::make(name, service, mVendorExt);
+    *device = sp<DeviceHalAidl>::make(name, service, getVendorExtension());
     return OK;
 }
 
@@ -227,6 +149,20 @@
     return OK;
 }
 
+std::shared_ptr<IHalAdapterVendorExtension> DevicesFactoryHalAidl::getVendorExtension() {
+    if (!mVendorExt.has_value()) {
+        auto serviceName = std::string(IHalAdapterVendorExtension::descriptor) + "/default";
+        if (AServiceManager_isDeclared(serviceName.c_str())) {
+            mVendorExt = std::shared_ptr<IHalAdapterVendorExtension>(
+                    IHalAdapterVendorExtension::fromBinder(ndk::SpAIBinder(
+                                    AServiceManager_waitForService(serviceName.c_str()))));
+        } else {
+            mVendorExt = nullptr;
+        }
+    }
+    return mVendorExt.value();
+}
+
 // Main entry-point to the shared library.
 extern "C" __attribute__((visibility("default"))) void* createIDevicesFactoryImpl() {
     auto serviceName = std::string(IConfig::descriptor) + "/default";
diff --git a/media/libaudiohal/impl/DevicesFactoryHalAidl.h b/media/libaudiohal/impl/DevicesFactoryHalAidl.h
index 2a3a9e7..17bfe43 100644
--- a/media/libaudiohal/impl/DevicesFactoryHalAidl.h
+++ b/media/libaudiohal/impl/DevicesFactoryHalAidl.h
@@ -45,7 +45,10 @@
 
   private:
     const std::shared_ptr<::aidl::android::hardware::audio::core::IConfig> mConfig;
-    const std::shared_ptr<::aidl::android::media::audio::IHalAdapterVendorExtension> mVendorExt;
+    std::optional<std::shared_ptr<::aidl::android::media::audio::IHalAdapterVendorExtension>>
+            mVendorExt;
+
+    std::shared_ptr<::aidl::android::media::audio::IHalAdapterVendorExtension> getVendorExtension();
 
     ~DevicesFactoryHalAidl() = default;
 };
diff --git a/media/libaudiohal/tests/CoreAudioHalAidl_test.cpp b/media/libaudiohal/tests/CoreAudioHalAidl_test.cpp
index 3541078..1204a3b 100644
--- a/media/libaudiohal/tests/CoreAudioHalAidl_test.cpp
+++ b/media/libaudiohal/tests/CoreAudioHalAidl_test.cpp
@@ -443,6 +443,21 @@
     EXPECT_EQ(ScreenRotation::DEG_0, mModule->getScreenRotation());
 }
 
+// Without a vendor extension, any unrecognized parameters must be ignored.
+TEST_F(DeviceHalAidlTest, VendorParameterIgnored) {
+    EXPECT_EQ(0UL, mModule->getAsyncParameters().size());
+    EXPECT_EQ(0UL, mModule->getSyncParameters().size());
+    EXPECT_EQ(OK, mDevice->setParameters(createParameterString("random_name", "random_value")));
+    EXPECT_EQ(0UL, mModule->getAsyncParameters().size());
+    EXPECT_EQ(0UL, mModule->getSyncParameters().size());
+
+    EXPECT_EQ(0UL, mModule->getRetrievedParameterIds().size());
+    String8 values;
+    EXPECT_EQ(OK, mDevice->getParameters(String8("random_name"), &values));
+    EXPECT_EQ(0UL, mModule->getRetrievedParameterIds().size());
+    EXPECT_EQ(0UL, values.length());
+}
+
 class DeviceHalAidlVendorParametersTest : public testing::Test {
   public:
     void SetUp() override {
diff --git a/services/audioparameterparser/Android.bp b/services/audioparameterparser/Android.bp
deleted file mode 100644
index a7bfa4b..0000000
--- a/services/audioparameterparser/Android.bp
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright (C) 2024 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.
-
-package {
-    default_applicable_licenses: [
-        "frameworks_av_services_audioparameterparser_license",
-    ],
-}
-
-// Added automatically by a large-scale-change
-// See: http://go/android-license-faq
-license {
-    name: "frameworks_av_services_audioparameterparser_license",
-    visibility: [":__subpackages__"],
-    license_kinds: [
-        "SPDX-license-identifier-Apache-2.0",
-    ],
-    license_text: [
-        "NOTICE",
-    ],
-}
-
-cc_defaults {
-    name: "android.hardware.audio.parameter_parser.example_defaults",
-    defaults: [
-        "latest_android_hardware_audio_core_ndk_shared",
-    ],
-
-    shared_libs: [
-        "av-audio-types-aidl-ndk",
-        "libbase",
-        "libbinder_ndk",
-    ],
-
-    cflags: [
-        "-Wall",
-        "-Wextra",
-        "-Werror",
-        "-Wthread-safety",
-    ],
-}
-
-cc_binary {
-    name: "android.hardware.audio.parameter_parser.example_service",
-    system_ext_specific: true,
-    relative_install_path: "hw",
-
-    init_rc: ["android.hardware.audio.parameter_parser.example_service.rc"],
-
-    defaults: [
-        "android.hardware.audio.parameter_parser.example_defaults",
-    ],
-
-    srcs: [
-        "ParameterParser.cpp",
-        "main.cpp",
-    ],
-}
diff --git a/services/audioparameterparser/NOTICE b/services/audioparameterparser/NOTICE
deleted file mode 100644
index 44158cb..0000000
--- a/services/audioparameterparser/NOTICE
+++ /dev/null
@@ -1,190 +0,0 @@
-
-   Copyright (c) 2005-2024, 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.
-
-   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.
-
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
diff --git a/services/audioparameterparser/ParameterParser.cpp b/services/audioparameterparser/ParameterParser.cpp
deleted file mode 100644
index 8d6a64f..0000000
--- a/services/audioparameterparser/ParameterParser.cpp
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (C) 2024 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.
- */
-
-#include "ParameterParser.h"
-
-#define LOG_TAG "Audio_ParameterParser"
-#include <android-base/logging.h>
-
-namespace vendor::audio::parserservice {
-
-using ::aidl::android::hardware::audio::core::VendorParameter;
-using ParameterScope = ::aidl::android::media::audio::IHalAdapterVendorExtension::ParameterScope;
-
-::ndk::ScopedAStatus ParameterParser::parseVendorParameterIds(ParameterScope in_scope,
-                                                              const std::string& in_rawKeys,
-                                                              std::vector<std::string>*) {
-    LOG(DEBUG) << __func__ << ": scope: " << toString(in_scope) << ", keys: " << in_rawKeys;
-    return ::ndk::ScopedAStatus::ok();
-}
-
-::ndk::ScopedAStatus ParameterParser::parseVendorParameters(ParameterScope in_scope,
-                                                            const std::string& in_rawKeysAndValues,
-                                                            std::vector<VendorParameter>*,
-                                                            std::vector<VendorParameter>*) {
-    LOG(DEBUG) << __func__ << ": scope: " << toString(in_scope)
-               << ", keys/values: " << in_rawKeysAndValues;
-    return ::ndk::ScopedAStatus::ok();
-}
-
-::ndk::ScopedAStatus ParameterParser::parseBluetoothA2dpReconfigureOffload(
-        const std::string& in_rawValue, std::vector<VendorParameter>*) {
-    LOG(DEBUG) << __func__ << ": value: " << in_rawValue;
-    return ::ndk::ScopedAStatus::ok();
-}
-
-::ndk::ScopedAStatus ParameterParser::parseBluetoothLeReconfigureOffload(
-        const std::string& in_rawValue, std::vector<VendorParameter>*) {
-    LOG(DEBUG) << __func__ << ": value: " << in_rawValue;
-    return ::ndk::ScopedAStatus::ok();
-}
-
-::ndk::ScopedAStatus ParameterParser::processVendorParameters(
-        ParameterScope in_scope, const std::vector<VendorParameter>& in_parameters, std::string*) {
-    LOG(DEBUG) << __func__ << ": scope: " << toString(in_scope)
-               << ", parameters: " << ::android::internal::ToString(in_parameters);
-    return ::ndk::ScopedAStatus::ok();
-}
-
-}  // namespace vendor::audio::parserservice
diff --git a/services/audioparameterparser/ParameterParser.h b/services/audioparameterparser/ParameterParser.h
deleted file mode 100644
index 1e0e333..0000000
--- a/services/audioparameterparser/ParameterParser.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (C) 2024 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 <aidl/android/media/audio/BnHalAdapterVendorExtension.h>
-
-namespace vendor::audio::parserservice {
-
-class ParameterParser : public ::aidl::android::media::audio::BnHalAdapterVendorExtension {
-  public:
-    ParameterParser() = default;
-
-  private:
-    ::ndk::ScopedAStatus parseVendorParameterIds(
-            ::aidl::android::media::audio::IHalAdapterVendorExtension::ParameterScope in_scope,
-            const std::string& in_rawKeys, std::vector<std::string>* _aidl_return) override;
-
-    ::ndk::ScopedAStatus parseVendorParameters(
-            ::aidl::android::media::audio::IHalAdapterVendorExtension::ParameterScope in_scope,
-            const std::string& in_rawKeysAndValues,
-            std::vector<::aidl::android::hardware::audio::core::VendorParameter>*
-                    out_syncParameters,
-            std::vector<::aidl::android::hardware::audio::core::VendorParameter>*
-                    out_asyncParameters) override;
-
-    ::ndk::ScopedAStatus parseBluetoothA2dpReconfigureOffload(
-            const std::string& in_rawValue,
-            std::vector<::aidl::android::hardware::audio::core::VendorParameter>* _aidl_return)
-            override;
-
-    ::ndk::ScopedAStatus parseBluetoothLeReconfigureOffload(
-            const std::string& in_rawValue,
-            std::vector<::aidl::android::hardware::audio::core::VendorParameter>* _aidl_return)
-            override;
-
-    ::ndk::ScopedAStatus processVendorParameters(
-            ::aidl::android::media::audio::IHalAdapterVendorExtension::ParameterScope in_scope,
-            const std::vector<::aidl::android::hardware::audio::core::VendorParameter>&
-                    in_parameters,
-            std::string* _aidl_return) override;
-};
-
-}  // namespace vendor::audio::parserservice
diff --git a/services/audioparameterparser/android.hardware.audio.parameter_parser.example_service.rc b/services/audioparameterparser/android.hardware.audio.parameter_parser.example_service.rc
deleted file mode 100644
index b6aca5c..0000000
--- a/services/audioparameterparser/android.hardware.audio.parameter_parser.example_service.rc
+++ /dev/null
@@ -1,6 +0,0 @@
-service audio_parameter_parser_service /system_ext/bin/hw/android.hardware.audio.parameter_parser.example_service
-    class core
-    user audioserver
-    group media
-    ioprio rt 4
-    task_profiles ProcessCapacityHigh HighPerformance
diff --git a/services/audioparameterparser/main.cpp b/services/audioparameterparser/main.cpp
deleted file mode 100644
index d22eb55..0000000
--- a/services/audioparameterparser/main.cpp
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2024 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.
- */
-
-#define LOG_TAG "Audio_ParameterParser"
-#include <android-base/logging.h>
-#include <android/binder_manager.h>
-#include <android/binder_process.h>
-
-#include "ParameterParser.h"
-
-using vendor::audio::parserservice::ParameterParser;
-
-int main() {
-    // This is a debug implementation, always enable debug logging.
-    android::base::SetMinimumLogSeverity(::android::base::DEBUG);
-
-    auto parser = ndk::SharedRefBase::make<ParameterParser>();
-    const std::string parserFqn =
-            std::string().append(ParameterParser::descriptor).append("/default");
-    binder_status_t status =
-            AServiceManager_addService(parser->asBinder().get(), parserFqn.c_str());
-    if (status != STATUS_OK) {
-        LOG(ERROR) << "failed to register service for \"" << parserFqn << "\"";
-    }
-
-    ABinderProcess_joinThreadPool();
-    return EXIT_FAILURE;  // should not reach
-}
