
{"id":9873,"date":"2022-06-21T09:10:27","date_gmt":"2022-06-21T09:10:27","guid":{"rendered":"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/documentation\/rdk_video_documentation\/components\/open-sourced_components\/audiocapturemgr\/"},"modified":"2026-07-28T12:15:33","modified_gmt":"2026-07-28T12:15:33","slug":"audiocapturemgr","status":"publish","type":"page","link":"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/components\/audiocapturemgr\/","title":{"rendered":"audiocapturemgr"},"content":{"rendered":"\n<p><code>audiocapturemgr<\/code>\u00a0is a userspace daemon that captures live audio from the platform audio subsystem and exposes control and clip-ready notifications over the IARM inter-process communication bus. Audio payloads are delivered to clients via local IPC endpoints (for example UNIX domain sockets) rather than over IARM.<\/p>\n\n\n\n<p>The service exposes audio capture sessions on a per-client basis. Each session is associated with the primary audio source and a delivery mode chosen at session open time: a buffered mode that maintains a rolling precapture queue and extracts audio clips on demand, or a realtime streaming mode that pushes live audio directly to the requesting client over a local socket connection. Clients are notified asynchronously over the bus when a requested audio clip becomes available.<\/p>\n\n\n\n<p>Internally, a central capture manager owns the connection to the audio hardware, maintains data queues, and distributes incoming audio to all active client sessions. Each delivery mode is handled by a dedicated subsystem responsible for either managing the precapture buffer and scheduling clip extraction, or forwarding live audio buffers to a connected socket consumer.<\/p>\n\n\n\n<div class=\"wp-block-merpress-mermaidjs diagram-source-mermaid\"><pre class=\"mermaid\">flowchart LR\n\nclassDef Apps  stroke:#00B9F1,fill:#E6F7FD,stroke-width:2px;\nclassDef RDKMW stroke:#75D701,fill:#F1FFE6,stroke-width:2px;\nclassDef VL stroke:#808080,fill:#F2F2F2,stroke-width:2px;\n\nsubgraph Apps[\"Apps &amp; Runtimes\"]\n    ClientApps[\"Client Applications\"]\nend\n\nsubgraph RDKMW[\"RDK Core Middleware\"]\n    IARMClients[\"IARM Clients\"]\n    ACM[\"audiocapturemgr\\n(standalone daemon)\"]\n    IARM[\"IARM Bus\"]\nend\n\nsubgraph VL[\"Vendor Layer\"]\n    RMF[\"RMF AudioCapture HAL\\n(media-utils)\"]\nend\n\nClientApps -->|Firebolt APS| IARMClients\nIARMClients --> IARM\nIARM --> ACM\nACM -->|API Calls| RMF\nRMF -->|Service Interaction| ACM\nACM -->|Event Notification| IARM<\/pre><\/div>\n\n\n\n<p><strong>Key Features &amp; Responsibilities:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>IARM service endpoint for audio capture control<\/strong>: Exposes session lifecycle operations (open, close, start, stop, sample request) and audio\/output property management as callable methods on the IARM bus, allowing any authorized process to control audio capture without direct hardware access.<\/li>\n\n\n\n<li><strong>Session-based output routing<\/strong>: Directs captured audio to either buffered clip extraction or realtime local socket streaming depending on the delivery mode selected when a session is opened.<\/li>\n\n\n\n<li><strong>Audio capture queue management<\/strong>: Maintains incoming and outgoing data queues between the hardware capture callback and active client sessions, with background monitoring to detect and log periods where audio inflow stalls.<\/li>\n\n\n\n<li><strong>Clip request scheduling<\/strong>: Satisfies audio clip requests either immediately from the precaptured rolling buffer or after a configured fresh-capture window, then notifies the requesting client asynchronously over the bus when the clip is ready.<\/li>\n\n\n\n<li><strong>Audio format conversion<\/strong>: Supports passthrough, channel downmix, sample-rate downsample, and combined conversion paths to adapt captured audio to the format required by each client session.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"audiocapturemgr-Design\">Design<\/h2>\n\n\n\n<p>The component is organized around a single capture source manager (<code>q_mgr<\/code>) with a client registration model. Audio data arrives via the RMF capture callback (<code>q_mgr::data_callback<\/code>) registered in&nbsp;<code>q_mgr::start()<\/code>&nbsp;(via&nbsp;<code>RMF_AudioCapture_Start()<\/code>&nbsp;settings) and is enqueued as&nbsp;<code>audio_buffer<\/code>&nbsp;objects with reference counting. A dedicated&nbsp;<code>data_processor_thread<\/code>&nbsp;swaps incoming and outgoing queues under mutex protection and dispatches buffer pointers to all registered clients, while&nbsp;<code>update_buffer_references()<\/code>&nbsp;adjusts refcounts based on active clients. A&nbsp;<code>data_monitor<\/code>&nbsp;thread runs independently to detect and log periods where inflow byte count stops advancing. Session orchestration in&nbsp;<code>acm_session_mgr<\/code>&nbsp;separates control-plane concerns (IARM method dispatch, session lookup, result mapping) from data-plane processing (capture, queuing, conversion, output transport). Queue overflow is bounded by&nbsp;<code>MAX_QMGR_BUFFER_DURATION_S = 30<\/code>&nbsp;seconds, beyond which the incoming queue is flushed.<\/p>\n\n\n\n<p>Northbound interaction flows exclusively through IARM, where clients invoke named calls and receive result codes and events. Southbound interaction uses the RMF AudioCapture APIs currently exercised by this component \u2014&nbsp;<code>Open<\/code>,&nbsp;<code>GetDefaultSettings<\/code>,&nbsp;<code>Start<\/code>,&nbsp;<code>Stop<\/code>, and&nbsp;<code>Close<\/code>&nbsp;(primary source only).<\/p>\n\n\n\n<p>IPC mechanisms include IARM call registration and event broadcast for control and asynchronous notifications, UNIX domain sockets (<code>AF_UNIX<\/code>,&nbsp;<code>SOCK_STREAM<\/code>) for realtime PCM streaming (<code>ip_out_client<\/code>) and socket-delivery clip output (<code>music_id_client<\/code>\/<code>socket_adaptor<\/code>), and internal control pipes combined with&nbsp;<code>select()<\/code>&nbsp;loops to shut down listener threads in&nbsp;<code>ip_out_client<\/code>.<\/p>\n\n\n\n<p>Buffered clip output (opened with&nbsp;<code>BUFFERED_FILE_OUTPUT<\/code>) is currently delivered over a UNIX domain socket (the session API constructs&nbsp;<code>music_id_client<\/code>&nbsp;in&nbsp;<code>SOCKET_OUTPUT<\/code>&nbsp;mode, and&nbsp;<code>dataLocator<\/code>&nbsp;is the socket path). File-mode delivery via&nbsp;<code>std::ofstream<\/code>&nbsp;exists in&nbsp;<code>music_id_client<\/code>&nbsp;but is not wired into the session manager.<\/p>\n\n\n\n<div class=\"wp-block-merpress-mermaidjs diagram-source-mermaid\"><pre class=\"mermaid\">graph LR\n\nsubgraph Proc[\"audiocapturemgr process (C++)\"]\n    direction TB\n    subgraph Control[\"Control Plane\"]\n        Main[\"acm_main\\nmain \/ launcher\"]\n        SessionMgr[\"acm_session_mgr\\nIARM method handlers\\nsession list management\"]\n    end\n    subgraph Capture[\"Capture &amp; Queuing\"]\n        QMgr[\"q_mgr\\nRMF capture device\\nqueue manager \/ client fan-out\"]\n        Buf[\"audio_buffer\\nrefcounted PCM buffer\"]\n    end\n    subgraph Delivery[\"Output Delivery\"]\n        MID[\"music_id_client\\nrolling precapture queue\\nclip extraction worker\"]\n        IPO[\"ip_out_client\\nrealtime UNIX socket writer\\nlistener thread\"]\n        Conv[\"audio_converter\\ndownmix \/ downsample\\nsink abstraction\"]\n        Sock[\"socket_adaptor\\nUNIX socket listener\\nconnected-callback dispatch\"]\n    end\nend\n\nsubgraph External[\"External Systems\"]\n    direction TB\n    IARMBus[(\"IARM Bus\")]\n    RMFHAL[(\"RMF AudioCapture HAL\\n(media-utils)\")]\n    UDSClients[(\"UNIX Domain\\nSocket Clients\")]\nend\n\nMain --> SessionMgr\nSessionMgr -->|Event Notification| IARMBus\nIARMBus --> SessionMgr\nSessionMgr --> MID\nSessionMgr --> IPO\nQMgr --> RMFHAL\nRMFHAL -->|Service Interaction| QMgr\nQMgr --> Buf\nMID --> QMgr\nMID --> Conv\nMID --> Sock\nIPO --> QMgr\nIPO --> UDSClients\nSock --> UDSClients<\/pre><\/div>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"audiocapturemgr-ThreadingModel\">Threading Model<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Threading Architecture<\/strong>: Multi-threaded, event-driven around RMF capture callbacks and semaphore\/worker loops.<\/li>\n\n\n\n<li><strong>Main Thread<\/strong>: Process startup, IARM\u00a0<code>activate<\/code>\/<code>deactivate<\/code>, and blocked wait via\u00a0<code>pause()<\/code>.<\/li>\n\n\n\n<li><strong>Worker Threads<\/strong>:<\/li>\n\n\n\n<li><em><code>q_mgr<\/code>\u00a0processing thread<\/em>\u00a0(<code>pthread_create<\/code>): waits on\u00a0<code>sem_t m_sem<\/code>\u00a0and wakes on\u00a0<code>notify_data_ready()<\/code>\u00a0to swap queues and dispatch buffers to clients.<\/li>\n\n\n\n<li><em><code>q_mgr<\/code>\u00a0data monitor thread<\/em>\u00a0(<code>std::thread<\/code>): checks\u00a0<code>m_inflow_byte_counter<\/code>\u00a0every 5 seconds via\u00a0<code>std::condition_variable<\/code>\u00a0and logs stall and resume events.<\/li>\n\n\n\n<li><em><code>music_id_client<\/code>\u00a0worker thread<\/em>\u00a0(<code>std::thread<\/code>): decrements\u00a0<code>time_remaining<\/code>\u00a0on pending requests and calls\u00a0<code>grab_last_n_seconds()<\/code>\u00a0to fulfill them.<\/li>\n\n\n\n<li><em><code>ip_out_client<\/code>\u00a0listener thread<\/em>\u00a0(<code>pthread_create<\/code>): runs\u00a0<code>select()<\/code>\u00a0over the listen socket and a control pipe, accepts connections, and stores the write fd.<\/li>\n\n\n\n<li><em><code>socket_adaptor<\/code>\u00a0listener thread<\/em>\u00a0(<code>std::thread<\/code>): accepts one connection and invokes the callback registered via\u00a0<code>register_data_ready_callback()<\/code>.<\/li>\n\n\n\n<li><strong>Synchronization<\/strong>:\u00a0<code>pthread_mutex_t<\/code>\u00a0(session manager, queue, client list),\u00a0<code>std::mutex<\/code>\u00a0(data monitor),\u00a0<code>sem_t<\/code>\u00a0(queue wakeup), and a global audio-buffer mutex for refcount operations.<\/li>\n\n\n\n<li><strong>Async \/ Event Dispatch<\/strong>: RMF capture callback pushes data into the incoming queue and posts the semaphore. IARM\u00a0<code>BroadcastEvent<\/code>\u00a0delivers\u00a0<code>AUDIO_CLIP_READY<\/code>\u00a0to subscribed clients. Socket callbacks trigger clip delivery for socket-output mode.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"audiocapturemgr-PrerequisitesandDependencies\">Prerequisites and Dependencies<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"audiocapturemgr-PlatformandIntegrationRequirements\">Platform and Integration Requirements<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Build Dependencies<\/strong>: Build-time recipe dependencies:\u00a0<code>virtual\/vendor-media-utils<\/code>\u00a0(RMF AudioCapture provider),\u00a0<code>media-utils-headers<\/code>\u00a0(supplies\u00a0<code>rmfAudioCapture.h<\/code>),\u00a0<code>iarmbus<\/code>,\u00a0<code>iarmmgrs<\/code>,\u00a0<code>libunpriv<\/code>,\u00a0<code>safec-common-wrapper<\/code>, and\u00a0<code>safec<\/code>\u00a0(conditional on\u00a0<code>safec<\/code>\u00a0in\u00a0<code>DISTRO_FEATURES<\/code>); runtime dependency on\u00a0<code>virtual\/vendor-media-utils<\/code>; link flags:\u00a0<code>-lprivilege<\/code>, and conditionally\u00a0<code>pkg-config --libs libsafec<\/code>\u00a0when\u00a0<code>safec<\/code>\u00a0is in\u00a0<code>DISTRO_FEATURES<\/code>; compile flags:\u00a0<code>-DDROP_ROOT_PRIV<\/code>\u00a0(enables privilege-drop path at build time), conditionally\u00a0<code>pkg-config --cflags libsafec<\/code>\u00a0or\u00a0<code>-fPIC<\/code>, and\u00a0<code>-DSAFEC_DUMMY_API<\/code>\u00a0when\u00a0<code>safec<\/code>\u00a0is absent from\u00a0<code>DISTRO_FEATURES<\/code>.<\/li>\n\n\n\n<li><strong>HAL<\/strong>: RMF AudioCapture HAL (<code>rmfAudioCapture.h<\/code>). See\u00a0<a href=\"https:\/\/wiki.rdkcentral.com\/spaces\/DOC\/pages\/502404654\/audiocapturemgr#major-hal-apis-integration\">Major HAL APIs Integration<\/a>\u00a0for the full API surface and return values.<\/li>\n\n\n\n<li><strong>IARM Bus<\/strong>: Bus name\u00a0<code>audiocapturemgr<\/code>; method names defined in\u00a0<code>include\/audiocapturemgr_iarm.h<\/code>.<\/li>\n\n\n\n<li><strong>Systemd Services<\/strong>:\u00a0<code>iarmbusd.service<\/code>\u00a0must be running before\u00a0<code>audiocapturemgr<\/code>\u00a0starts.<\/li>\n\n\n\n<li><strong>Startup Order<\/strong>: Defined by systemd unit\u00a0<code>After=<\/code>\u00a0\/\u00a0<code>Requires=<\/code>\u00a0dependency on\u00a0<code>iarmbusd.service<\/code>.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"audiocapturemgr-ComponentStateFlow\">Component State Flow<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"audiocapturemgr-InitializationtoActiveState\">Initialization to Active State<\/h4>\n\n\n\n<div class=\"wp-block-merpress-mermaidjs diagram-source-mermaid\"><pre class=\"mermaid\">sequenceDiagram\n    participant System as systemd\n    participant Comp as audiocapturemgr\n    participant IARM as IARM Bus\n    participant Q as q_mgr\n    participant RMF as RMF AudioCapture\n\n    System->>Comp: ExecStart \/usr\/bin\/audiocapturemgr\n    Comp->>IARM: IARM_Bus_Init(\"audiocapturemgr\")\n    Comp->>IARM: IARM_Bus_Connect()\n    Comp->>IARM: IARM_Bus_RegisterEvent(IARMBUS_MAX_ACM_EVENT)\n    Comp->>IARM: IARM_Bus_RegisterCall(open, close, start, stop, requestSample, ...)\n    Note over Comp: Control plane active \u2014 IARM methods available\n\n    IARM->>Comp: open(source=0, output_type)\n    Comp->>Comp: create session + create client (music_id or ip_out) bound to existing q_mgr\n    Note over Comp,Q: q_mgr performs RMF Open + GetDefaultSettings during acm_session_mgr initialization\n\n    IARM->>Comp: start(session_id)\n    Comp->>Q: register_client + start()\n    Q->>RMF: Start capture with settings and data callback\n    RMF-->>Q: audio data via callback\n\n    Q-->>Comp: clip ready (callback)\n    Comp->>IARM: BroadcastEvent DATA_CAPTURE_IARM_EVENT_AUDIO_CLIP_READY\n\n    System->>Comp: terminate (signal)\n    Comp->>IARM: IARM_Bus_Disconnect + Term<\/pre><\/div>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"audiocapturemgr-RuntimeStateChanges\">Runtime State Changes<\/h4>\n\n\n\n<p><strong>State Change Triggers<\/strong>&nbsp;<em>(all via IARM calls)<\/em>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>open<\/code>\u00a0creates a session and binds the output-mode client implementation; the output type cannot change without closing and reopening the session.<\/li>\n\n\n\n<li><code>start<\/code>\u00a0registers the client to\u00a0<code>q_mgr<\/code>\u00a0and initiates audio capture; data flow begins.<\/li>\n\n\n\n<li><code>stop<\/code>\u00a0unregisters the client and halts audio capture, data flow stops.<\/li>\n\n\n\n<li><code>close<\/code>\u00a0destroys the session object and releases resources.<\/li>\n\n\n\n<li><code>setAudioProperties<\/code>\u00a0may trigger a capture restart after applying new properties to\u00a0<code>q_mgr<\/code>.<\/li>\n<\/ul>\n\n\n\n<p><strong>Context Switching Scenarios:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Output mode switch (buffered vs. realtime) requires close\/open because the client type is fixed at\u00a0<code>open_handler()<\/code>\u00a0time.<\/li>\n\n\n\n<li>If a write error occurs on the realtime socket in\u00a0<code>ip_out_client::data_callback<\/code>, the write fd is closed and\u00a0<code>m_num_connections<\/code>\u00a0is decremented.<\/li>\n\n\n\n<li>When the incoming queue exceeds\u00a0<code>MAX_QMGR_BUFFER_DURATION_S<\/code>\u00a0seconds of buffered data, the incoming queue is flushed to discard queued buffers (see\u00a0<code>q_mgr::add_data()<\/code>).<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"audiocapturemgr-CallFlows\">Call Flows<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"audiocapturemgr-InitializationCallFlow\">Initialization Call Flow<\/h4>\n\n\n\n<div class=\"wp-block-merpress-mermaidjs diagram-source-mermaid\"><pre class=\"mermaid\">sequenceDiagram\n    participant Main as acm_main\n    participant Mgr as acm_session_mgr\n    participant IARM as IARM Bus\n\n    Main->>Mgr: get_instance()->activate()\n    Mgr->>IARM: IARM_Bus_Init(\"audiocapturemgr\")\n    Mgr->>IARM: IARM_Bus_Connect()\n    Mgr->>IARM: IARM_Bus_RegisterEvent(IARMBUS_MAX_ACM_EVENT)\n    Mgr->>IARM: IARM_Bus_RegisterCall(requestSample)\n    Mgr->>IARM: IARM_Bus_RegisterCall(open)\n    Mgr->>IARM: IARM_Bus_RegisterCall(close)\n    Mgr->>IARM: IARM_Bus_RegisterCall(start)\n    Mgr->>IARM: IARM_Bus_RegisterCall(stop)\n    Mgr->>IARM: IARM_Bus_RegisterCall(getDefaultAudioProperties)\n    Mgr->>IARM: IARM_Bus_RegisterCall(getAudioProperties)\n    Mgr->>IARM: IARM_Bus_RegisterCall(getOutputProperties)\n    Mgr->>IARM: IARM_Bus_RegisterCall(setAudioProperties)\n    Mgr->>IARM: IARM_Bus_RegisterCall(setOutputProperties)\n    Main->>Main: pause()<\/pre><\/div>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"audiocapturemgr-RequestProcessingCallFlow\">Request Processing Call Flow<\/h4>\n\n\n\n<div class=\"wp-block-merpress-mermaidjs diagram-source-mermaid\"><pre class=\"mermaid\">%%{init: { 'sequence': { 'actorMargin': 80, 'width': 200, 'messageMargin': 50, 'noteMargin': 25, 'mirrorActors': true, 'messageFontSize': 24, 'noteFontSize': 22, 'actorFontSize': 22 } } }%%\nsequenceDiagram\n    participant Client as IARM Client\n    participant IARM as IARM Bus\n    participant Mgr as acm_session_mgr\n    participant MID as music_id_client\n    participant Q as q_mgr\n\n    Client->>IARM: IARM_Bus_Call(requestSample, {duration, is_precapture})\n    IARM->>Mgr: get_sample_handler()\n\n    Note over Client,Q: Branch on is_precapture flag\n\n    alt is_precapture == true\n        Note over Mgr,Q: Precapture path \u2014 serve from rolling buffer\n        Mgr->>MID: grab_precaptured_sample(filename)\n        MID->>Q: use buffered audio_buffer queue\n        MID-->>Mgr: result (immediate)\n\n    else is_precapture == false\n        Note over Mgr,MID: Fresh capture path \u2014 defer until audio is collected\n        Mgr->>MID: grab_fresh_sample(seconds, filename, callback)\n        Note over MID: worker thread decrements timer, fulfills on completion\n        MID-->>Mgr: async via request_callback\n    end\n\n    Note over Mgr,Client: Common path \u2014 notify client with clip location\n    Mgr->>IARM: IARM_Bus_BroadcastEvent(DATA_CAPTURE_IARM_EVENT_AUDIO_CLIP_READY,{dataLocator})\n    IARM-->>Client: event payload with dataLocator<\/pre><\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"audiocapturemgr-InternalModules\">Internal Modules<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Module \/ Class<\/strong><\/td><td><strong>Description<\/strong><\/td><td><strong>Key Files<\/strong><\/td><\/tr><tr><td><code>acm_main<\/code><\/td><td>Process entry point. Calls&nbsp;<code>acm_session_mgr::activate()<\/code>, blocks in&nbsp;<code>pause()<\/code>, and calls&nbsp;<code>deactivate()<\/code>&nbsp;on exit. Optionally drops root privileges when built with&nbsp;<code>DROP_ROOT_PRIV<\/code>.<\/td><td><a href=\"https:\/\/wiki.rdkcentral.com\/src\/acm_main.cpp\">src\/acm_main.cpp<\/a><\/td><\/tr><tr><td><code>acm_session_mgr<\/code><\/td><td>IARM API surface that manages the session list (<code>m_sessions<\/code>), dispatches all IARM method handlers, creates\/destroys client and source objects, and issues&nbsp;<code>BroadcastEvent<\/code>&nbsp;calls. Singleton via&nbsp;<code>g_singleton<\/code>.<\/td><td><a href=\"https:\/\/wiki.rdkcentral.com\/src\/acm_session_mgr.cpp\">src\/acm_session_mgr.cpp<\/a>,&nbsp;<a href=\"https:\/\/wiki.rdkcentral.com\/include\/acm_session_mgr.h\">include\/acm_session_mgr.h<\/a><\/td><\/tr><tr><td><code>q_mgr<\/code><\/td><td>Owns the RMF capture device handle, dual buffer queues, processing thread (semaphore-driven), data-monitor thread, and the list of registered&nbsp;<code>audio_capture_client<\/code>&nbsp;objects. Calls&nbsp;<code>RMF_AudioCapture_Open<\/code>,&nbsp;<code>RMF_AudioCapture_GetDefaultSettings<\/code>,&nbsp;<code>RMF_AudioCapture_Start<\/code>,&nbsp;<code>RMF_AudioCapture_Stop<\/code>, and&nbsp;<code>RMF_AudioCapture_Close<\/code>.<\/td><td><a href=\"https:\/\/wiki.rdkcentral.com\/src\/audio_capture_manager.cpp\">src\/audio_capture_manager.cpp<\/a>,&nbsp;<a href=\"https:\/\/wiki.rdkcentral.com\/include\/audio_capture_manager.h\">include\/audio_capture_manager.h<\/a><\/td><\/tr><tr><td><code>music_id_client<\/code><\/td><td>Buffered clip extraction client. Maintains a rolling&nbsp;<code>std::list&lt;audio_buffer*&gt;<\/code>&nbsp;queue sized by precapture duration. Fulfills clip requests immediately (precapture) or via a worker thread timer (fresh sample). Supports file-output and socket-output delivery modes, using&nbsp;<code>socket_adaptor<\/code>&nbsp;for the latter.<\/td><td><a href=\"https:\/\/wiki.rdkcentral.com\/src\/music_id.cpp\">src\/music_id.cpp<\/a>,&nbsp;<a href=\"https:\/\/wiki.rdkcentral.com\/include\/music_id.h\">include\/music_id.h<\/a><\/td><\/tr><tr><td><code>ip_out_client<\/code><\/td><td>Realtime UNIX socket streaming client. Opens a listening UNIX socket on a path prefixed&nbsp;<code>\/tmp\/acm_ip_out_<\/code>. Accepts one connection (<code>MAX_CONNECTIONS = 1<\/code>) via a&nbsp;<code>pthread<\/code>-based listener thread controlled by a non-blocking pipe. Writes live PCM buffers on each&nbsp;<code>data_callback<\/code>&nbsp;invocation.<\/td><td><a href=\"https:\/\/wiki.rdkcentral.com\/src\/ip_out.cpp\">src\/ip_out.cpp<\/a>,&nbsp;<a href=\"https:\/\/wiki.rdkcentral.com\/include\/ip_out.h\">include\/ip_out.h<\/a><\/td><\/tr><tr><td><code>audio_converter<\/code><\/td><td>Determines the required conversion operation (passthrough, downmix, downsample, or combined) from input\/output&nbsp;<code>audio_properties_t<\/code>&nbsp;structs and applies it to a&nbsp;<code>std::list&lt;audio_buffer*&gt;<\/code>. Writes converted output via an&nbsp;<code>audio_converter_sink<\/code>&nbsp;abstraction (file or memory).<\/td><td><a href=\"https:\/\/wiki.rdkcentral.com\/src\/audio_converter.cpp\">src\/audio_converter.cpp<\/a>,&nbsp;<a href=\"https:\/\/wiki.rdkcentral.com\/include\/audio_converter.h\">include\/audio_converter.h<\/a><\/td><\/tr><tr><td><code>audio_buffer<\/code><\/td><td>Refcounted PCM buffer object. Created by&nbsp;<code>q_mgr<\/code>&nbsp;per incoming capture callback and freed when refcount reaches zero via&nbsp;<code>unref_audio_buffer()<\/code>. A global mutex protects refcount operations.<\/td><td><a href=\"https:\/\/wiki.rdkcentral.com\/src\/audio_buffer.cpp\">src\/audio_buffer.cpp<\/a>,&nbsp;<a href=\"https:\/\/wiki.rdkcentral.com\/include\/audio_buffer.h\">include\/audio_buffer.h<\/a><\/td><\/tr><tr><td><code>socket_adaptor<\/code><\/td><td>UNIX domain socket listener helper for&nbsp;<code>music_id_client<\/code>&nbsp;socket-delivery mode. Starts listening on a supplied path, accepts one connection on a&nbsp;<code>std::thread<\/code>, and invokes a registered data-ready callback.<\/td><td><a href=\"https:\/\/wiki.rdkcentral.com\/src\/socket_adaptor.cpp\">src\/socket_adaptor.cpp<\/a>,&nbsp;<a href=\"https:\/\/wiki.rdkcentral.com\/include\/socket_adaptor.h\">include\/socket_adaptor.h<\/a><\/td><\/tr><tr><td><code>acm_iarm_interface<\/code><\/td><td>Legacy IARM interface (original&nbsp;<code>enableCapture<\/code>&nbsp;\/&nbsp;<code>requestSample<\/code>&nbsp;API). Kept alongside the session manager for backward compatibility.<\/td><td><a href=\"https:\/\/wiki.rdkcentral.com\/src\/acm_iarm_interface.cpp\">src\/acm_iarm_interface.cpp<\/a><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"audiocapturemgr-ComponentInteractions\">Component Interactions<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"audiocapturemgr-InteractionMatrix\">Interaction Matrix<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Target Component \/ Layer<\/strong><\/td><td><strong>Interaction Purpose<\/strong><\/td><td><strong>Key APIs \/ Topics<\/strong><\/td><\/tr><tr><td><strong>HAL<\/strong><\/td><td><\/td><td><\/td><\/tr><tr><td>RMF AudioCapture<\/td><td>Open, configure, and control the capture device; receive PCM audio data via callback.<\/td><td><code>RMF_AudioCapture_Open<\/code>,&nbsp;<code>RMF_AudioCapture_GetDefaultSettings<\/code>,&nbsp;<code>RMF_AudioCapture_Start<\/code>,&nbsp;<code>RMF_AudioCapture_Stop<\/code>,&nbsp;<code>RMF_AudioCapture_Close<\/code><\/td><\/tr><tr><td><strong>Component APIs<\/strong><\/td><td><\/td><td><\/td><\/tr><tr><td>IARM Bus<\/td><td>Receive control calls from clients and publish clip-ready events.<\/td><td><code>IARM_Bus_Init<\/code>,&nbsp;<code>IARM_Bus_Connect<\/code>,&nbsp;<code>IARM_Bus_RegisterEvent<\/code>,&nbsp;<code>IARM_Bus_RegisterCall<\/code>,&nbsp;<code>IARM_Bus_BroadcastEvent<\/code>,&nbsp;<code>IARM_Bus_Disconnect<\/code>,&nbsp;<code>IARM_Bus_Term<\/code><\/td><\/tr><tr><td><strong>External Systems<\/strong><\/td><td><\/td><td><\/td><\/tr><tr><td>UNIX domain socket clients<\/td><td>Receive realtime PCM stream (ip_out) or audio clip bytes (music_id socket mode).<\/td><td><code>socket<\/code>,&nbsp;<code>bind<\/code>,&nbsp;<code>listen<\/code>,&nbsp;<code>accept<\/code>,&nbsp;<code>write<\/code>&nbsp;on paths under&nbsp;<code>\/tmp\/<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"audiocapturemgr-EventsPublished\">Events Published<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Event Name<\/strong><\/td><td><strong>IARM \/ JSON-RPC Topic<\/strong><\/td><td><strong>Trigger Condition<\/strong><\/td><td><strong>Subscriber Components<\/strong><\/td><\/tr><tr><td><code>DATA_CAPTURE_IARM_EVENT_AUDIO_CLIP_READY<\/code><\/td><td>IARM event on bus&nbsp;<code>audiocapturemgr<\/code>&nbsp;(index 0)<\/td><td><code>request_callback<\/code>&nbsp;invoked after clip generation completes (immediate precapture or fresh-sample timeout)<\/td><td>Any IARM client that registers a handler for this event<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"audiocapturemgr-IPCFlowPatterns\">IPC Flow Patterns<\/h3>\n\n\n\n<p><strong>Primary Request \/ Response Flow:<\/strong><\/p>\n\n\n\n<div class=\"wp-block-merpress-mermaidjs diagram-source-mermaid\"><pre class=\"mermaid\">sequenceDiagram\n    participant Client as Client Application\n    participant IARM as IARM Bus\n    participant ACM as audiocapturemgr\n    participant RMF as RMF AudioCapture\n\n    Client->>IARM: IARM_Bus_Call(\"audiocapturemgr\", method, payload)\n    IARM->>ACM: Dispatch to registered handler\n    ACM->>RMF: Start, stop, or configure capture as needed\n    RMF-->>ACM: Status or callback data\n    ACM-->>IARM: Result code written into payload struct\n    IARM-->>Client: Call return with populated payload<\/pre><\/div>\n\n\n\n<p><strong>Event Notification Flow:<\/strong><\/p>\n\n\n\n<div class=\"wp-block-merpress-mermaidjs diagram-source-mermaid\"><pre class=\"mermaid\">sequenceDiagram\n    participant Client as IARM Client\n    participant ACM as audiocapturemgr\n    participant IARM as IARM Bus\n\n    Client->>IARM: IARM_Bus_Call(requestSample, {duration, is_precapture})\n    IARM->>ACM: Dispatch to registered handler\n    ACM->>ACM: generate clip (immediate or deferred)\n    ACM->>IARM: IARM_Bus_BroadcastEvent(DATA_CAPTURE_IARM_EVENT_AUDIO_CLIP_READY)\n    IARM-->>Client: event payload {dataLocator}<\/pre><\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"audiocapturemgr-ImplementationDetails\">Implementation Details<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"audiocapturemgr-MajorHALAPIsIntegration\">Major HAL APIs Integration<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>HAL API<\/strong><\/td><td><strong>Purpose<\/strong><\/td><td><strong>Implementation File<\/strong><\/td><\/tr><tr><td><code>RMF_AudioCapture_Open()<\/code><\/td><td>Opens the capture device for the primary audio source and obtains a handle during&nbsp;<code>q_mgr<\/code>&nbsp;construction.<\/td><td><a href=\"https:\/\/wiki.rdkcentral.com\/src\/audio_capture_manager.cpp\">src\/audio_capture_manager.cpp<\/a><\/td><\/tr><tr><td><code>RMF_AudioCapture_GetDefaultSettings()<\/code><\/td><td>Retrieves default&nbsp;<code>RMF_AudioCapture_Settings<\/code>&nbsp;(used to seed\/restore capture settings before (re)starting capture).<\/td><td><a href=\"https:\/\/wiki.rdkcentral.com\/src\/audio_capture_manager.cpp\">src\/audio_capture_manager.cpp<\/a><\/td><\/tr><tr><td><code>RMF_AudioCapture_Open_Type()<\/code><\/td><td>Available in the RMF HAL to open the capture device for a specified source type (<code>RMF_AC_TYPE_PRIMARY<\/code>&nbsp;or&nbsp;<code>RMF_AC_TYPE_AUXILIARY<\/code>);&nbsp;<strong>not currently used by audiocapturemgr<\/strong>.<\/td><td><a href=\"https:\/\/github.com\/rdkcentral\/rdk-halif-rmf_audio_capture\/blob\/main\/include\/rmfAudioCapture.h\">rmfAudioCapture.h<\/a><\/td><\/tr><tr><td><code>RMF_AudioCapture_GetCurrentSettings()<\/code><\/td><td>Available in the RMF HAL to retrieve the&nbsp;<code>RMF_AudioCapture_Settings<\/code>&nbsp;currently in effect on a started handle;&nbsp;<strong>not currently used by audiocapturemgr<\/strong>.<\/td><td><a href=\"https:\/\/github.com\/rdkcentral\/rdk-halif-rmf_audio_capture\/blob\/main\/include\/rmfAudioCapture.h\">rmfAudioCapture.h<\/a><\/td><\/tr><tr><td><code>RMF_AudioCapture_GetStatus()<\/code><\/td><td>Available in the RMF HAL to query the&nbsp;<code>RMF_AudioCapture_Status<\/code>&nbsp;struct (started flag, format, sampling rate, FIFO depth, overflow\/underflow counts);&nbsp;<strong>not currently used by audiocapturemgr<\/strong>.<\/td><td><a href=\"https:\/\/github.com\/rdkcentral\/rdk-halif-rmf_audio_capture\/blob\/main\/include\/rmfAudioCapture.h\">rmfAudioCapture.h<\/a><\/td><\/tr><tr><td><code>RMF_AudioCapture_Start()<\/code><\/td><td>Starts capture with current settings and registers&nbsp;<code>q_mgr::data_callback<\/code>&nbsp;as the data handler.<\/td><td><a href=\"https:\/\/wiki.rdkcentral.com\/src\/audio_capture_manager.cpp\">src\/audio_capture_manager.cpp<\/a><\/td><\/tr><tr><td><code>RMF_AudioCapture_Stop()<\/code><\/td><td>Stops active audio capture, called on IARM&nbsp;<code>stop<\/code>&nbsp;or before property reconfiguration.<\/td><td><a href=\"https:\/\/wiki.rdkcentral.com\/src\/audio_capture_manager.cpp\">src\/audio_capture_manager.cpp<\/a><\/td><\/tr><tr><td><code>RMF_AudioCapture_Close()<\/code><\/td><td>Releases the capture handle and all hardware resources, called in&nbsp;<code>q_mgr<\/code>&nbsp;destructor.<\/td><td><a href=\"https:\/\/wiki.rdkcentral.com\/src\/audio_capture_manager.cpp\">src\/audio_capture_manager.cpp<\/a><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"audiocapturemgr-KeyImplementationLogic\">Key Implementation Logic<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>State \/ Lifecycle Management<\/strong>:<\/li>\n\n\n\n<li>Process lifecycle (<code>activate<\/code>\u00a0\/\u00a0<code>pause<\/code>\u00a0\/\u00a0<code>deactivate<\/code>) is implemented in\u00a0<a href=\"https:\/\/wiki.rdkcentral.com\/src\/acm_main.cpp\">src\/acm_main.cpp<\/a>\u00a0and\u00a0<a href=\"https:\/\/wiki.rdkcentral.com\/src\/acm_session_mgr.cpp\">src\/acm_session_mgr.cpp<\/a>.<\/li>\n\n\n\n<li>Per-session state (<code>enable<\/code>\u00a0flag, session lookup by ID, create\/destroy) is managed in\u00a0<a href=\"https:\/\/wiki.rdkcentral.com\/src\/acm_session_mgr.cpp\">src\/acm_session_mgr.cpp<\/a>\u00a0using the\u00a0<code>acm_session_t<\/code>\u00a0struct.<\/li>\n\n\n\n<li><strong>Event Processing<\/strong>:<\/li>\n\n\n\n<li><code>q_mgr::data_callback<\/code>\u00a0(called from RMF capture thread) creates an\u00a0<code>audio_buffer<\/code>\u00a0and calls\u00a0<code>add_data()<\/code>\u00a0which enqueues it and posts\u00a0<code>m_sem<\/code>.<\/li>\n\n\n\n<li><code>q_mgr::data_processor_thread<\/code>\u00a0wakes on the semaphore, locks\u00a0<code>m_q_mutex<\/code>, swaps queues, calls\u00a0<code>update_buffer_references()<\/code>\u00a0to set refcounts per registered client count, and invokes\u00a0<code>data_callback()<\/code>\u00a0on each client.<\/li>\n\n\n\n<li>Clip-ready notifications flow through\u00a0<code>request_callback<\/code>\u00a0\u2192\u00a0<code>IARM_Bus_BroadcastEvent(DATA_CAPTURE_IARM_EVENT_AUDIO_CLIP_READY)<\/code>.<\/li>\n\n\n\n<li><strong>Error Handling Strategy<\/strong>:<\/li>\n\n\n\n<li>Invalid session IDs return\u00a0<code>ACM_RESULT_BAD_SESSION_ID<\/code>.<\/li>\n\n\n\n<li>Unsupported API paths return\u00a0<code>ACM_RESULT_UNSUPPORTED_API<\/code>.<\/li>\n\n\n\n<li>Duration values outside allowed range return\u00a0<code>ACM_RESULT_DURATION_OUT_OF_BOUNDS<\/code>.<\/li>\n\n\n\n<li>Precapture-specific failure codes:\u00a0<code>ACM_RESULT_PRECAPTURE_DURATION_TOO_LONG<\/code>\u00a0(254) and\u00a0<code>ACM_RESULT_PRECAPTURE_NOT_SUPPORTED<\/code>\u00a0(255).<\/li>\n\n\n\n<li>Generic failures return\u00a0<code>ACM_RESULT_GENERAL_FAILURE<\/code>.<\/li>\n\n\n\n<li>Write failures on the realtime socket cause the connection to be closed and the write fd reset to\u00a0<code>-1<\/code>.<\/li>\n\n\n\n<li><strong>Logging &amp; Diagnostics<\/strong>:<\/li>\n\n\n\n<li>Source files use\u00a0<code>INFO<\/code>,\u00a0<code>WARN<\/code>,\u00a0<code>ERROR<\/code>, and\u00a0<code>DEBUG<\/code>\u00a0macros throughout.<\/li>\n\n\n\n<li><code>q_mgr::data_monitor<\/code>\u00a0logs data stall and resume events with a 5-second polling interval.<\/li>\n\n\n\n<li>Queue flush events and incomplete writes are logged at\u00a0<code>WARN<\/code>\u00a0level.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"audiocapturemgr-Configuration\">Configuration<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"audiocapturemgr-KeyConfigurationParameters\">Key Configuration Parameters<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Parameter<\/strong><\/td><td><strong>Type<\/strong><\/td><td><strong>Default<\/strong><\/td><td><strong>Description<\/strong><\/td><\/tr><tr><td><code>AUDIOCAPTUREMGR_FILENAME_PREFIX<\/code><\/td><td>string macro<\/td><td><code>\"audio_sample\"<\/code><\/td><td>Filename prefix constant used in session manager request naming paths. Defined in&nbsp;<a href=\"https:\/\/wiki.rdkcentral.com\/include\/audiocapturemgr_iarm.h\">include\/audiocapturemgr_iarm.h<\/a>.<\/td><\/tr><tr><td><code>AUDIOCAPTUREMGR_FILE_PATH<\/code><\/td><td>string macro<\/td><td><code>\"\/opt\/\"<\/code><\/td><td>Base path constant used alongside the filename prefix. Defined in&nbsp;<a href=\"https:\/\/wiki.rdkcentral.com\/include\/audiocapturemgr_iarm.h\">include\/audiocapturemgr_iarm.h<\/a>.<\/td><\/tr><tr><td><code>DEFAULT_PRECAPTURE_DURATION_SEC<\/code><\/td><td><code>unsigned int<\/code>&nbsp;constant<\/td><td><code>6<\/code><\/td><td>Default precapture rolling window in seconds. Set via&nbsp;<code>music_id_client::set_precapture_duration()<\/code>. Defined in&nbsp;<a href=\"https:\/\/wiki.rdkcentral.com\/src\/music_id.cpp\">src\/music_id.cpp<\/a>.<\/td><\/tr><tr><td><code>MAX_QMGR_BUFFER_DURATION_S<\/code><\/td><td><code>unsigned int<\/code>&nbsp;constant<\/td><td><code>30<\/code><\/td><td>Maximum queued audio duration in seconds before the incoming queue is flushed. Defined in&nbsp;<a href=\"https:\/\/wiki.rdkcentral.com\/src\/audio_capture_manager.cpp\">src\/audio_capture_manager.cpp<\/a>.<\/td><\/tr><tr><td><code>SOCKNAME_PREFIX<\/code>&nbsp;(<code>ip_out<\/code>)<\/td><td><code>std::string<\/code><\/td><td><code>\"\/tmp\/acm_ip_out_\"<\/code><\/td><td>Base path for the realtime output UNIX socket. Defined in&nbsp;<a href=\"https:\/\/wiki.rdkcentral.com\/src\/ip_out.cpp\">src\/ip_out.cpp<\/a>.<\/td><\/tr><tr><td><code>SOCKET_PATH<\/code>&nbsp;(<code>music_id<\/code>)<\/td><td>string constant<\/td><td><code>\"\/tmp\/acm-songid\"<\/code><\/td><td>Base path for the music-id UNIX socket. Suffix appended per instance. Defined in&nbsp;<a href=\"https:\/\/wiki.rdkcentral.com\/src\/music_id.cpp\">src\/music_id.cpp<\/a>.<\/td><\/tr><tr><td><code>DEFAULT_FIFO_SIZE<\/code><\/td><td><code>size_t<\/code>&nbsp;constant<\/td><td><code>65536<\/code>&nbsp;(64 KiB)<\/td><td>Default RMF capture FIFO size in bytes. Defined in&nbsp;<a href=\"https:\/\/wiki.rdkcentral.com\/src\/audio_capture_manager.cpp\">src\/audio_capture_manager.cpp<\/a>.<\/td><\/tr><tr><td><code>DEFAULT_THRESHOLD<\/code><\/td><td><code>size_t<\/code>&nbsp;constant<\/td><td><code>8192<\/code>&nbsp;(8 KiB)<\/td><td>Default RMF capture callback threshold in bytes. Defined in&nbsp;<a href=\"https:\/\/wiki.rdkcentral.com\/src\/audio_capture_manager.cpp\">src\/audio_capture_manager.cpp<\/a>.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"audiocapturemgr-RuntimeConfiguration\">Runtime Configuration<\/h3>\n\n\n\n<p>Runtime behavior is changed via IARM calls.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># Open a session (source=0, output_type=BUFFERED_FILE_OUTPUT or REALTIME_SOCKET)\nIARM_Bus_Call(\"audiocapturemgr\", \"open\", iarmbus_open_args)\n\n# Change audio capture properties for an open session\nIARM_Bus_Call(\"audiocapturemgr\", \"setAudioProperties\", iarmbus_acm_arg_t)\n\n# Change output delivery properties (e.g., precapture buffer duration)\nIARM_Bus_Call(\"audiocapturemgr\", \"setOutputProperties\", iarmbus_acm_arg_t)<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"audiocapturemgr-ConfigurationPersistence\">Configuration Persistence<\/h3>\n\n\n\n<p>Configuration changes are not persisted across reboots.<\/p>\n\n\n\n<p><a href=\"https:\/\/wiki.rdkcentral.com\/spaces\/DOC\/pages\/502404654\/audiocapturemgr\"><\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>audiocapturemgr\u00a0is a userspace daemon that captures live audio from the platform audio subsystem and exposes [&hellip;]<\/p>\n","protected":false},"author":28,"featured_media":0,"parent":9844,"menu_order":4,"comment_status":"open","ping_status":"closed","template":"","meta":{"_bbp_topic_count":0,"_bbp_reply_count":0,"_bbp_total_topic_count":0,"_bbp_total_reply_count":0,"_bbp_voice_count":0,"_bbp_anonymous_reply_count":0,"_bbp_topic_count_hidden":0,"_bbp_reply_count_hidden":0,"_bbp_forum_subforum_count":0,"footnotes":""},"class_list":["post-9873","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.9 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>audiocapturemgr - RDK Documentation Portal | Documentation<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/components\/audiocapturemgr\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"audiocapturemgr - RDK Documentation Portal | Documentation\" \/>\n<meta property=\"og:description\" content=\"audiocapturemgr\u00a0is a userspace daemon that captures live audio from the platform audio subsystem and exposes [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/components\/audiocapturemgr\/\" \/>\n<meta property=\"og:site_name\" content=\"RDK Documentation Portal | Documentation\" \/>\n<meta property=\"article:modified_time\" content=\"2026-07-28T12:15:33+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/components\/audiocapturemgr\/\",\"url\":\"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/components\/audiocapturemgr\/\",\"name\":\"audiocapturemgr - RDK Documentation Portal | Documentation\",\"isPartOf\":{\"@id\":\"https:\/\/developer.rdkcentral.com\/documentation\/#website\"},\"datePublished\":\"2022-06-21T09:10:27+00:00\",\"dateModified\":\"2026-07-28T12:15:33+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/components\/audiocapturemgr\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/components\/audiocapturemgr\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/components\/audiocapturemgr\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/developer.rdkcentral.com\/documentation\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Documentation\",\"item\":\"https:\/\/developer.rdkcentral.com\/documentation\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"RDK Video\",\"item\":\"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Components\",\"item\":\"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/components\/\"},{\"@type\":\"ListItem\",\"position\":5,\"name\":\"audiocapturemgr\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/developer.rdkcentral.com\/documentation\/#website\",\"url\":\"https:\/\/developer.rdkcentral.com\/documentation\/\",\"name\":\"RDK Documentation Portal | Documentation\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/developer.rdkcentral.com\/documentation\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"audiocapturemgr - RDK Documentation Portal | Documentation","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/components\/audiocapturemgr\/","og_locale":"en_US","og_type":"article","og_title":"audiocapturemgr - RDK Documentation Portal | Documentation","og_description":"audiocapturemgr\u00a0is a userspace daemon that captures live audio from the platform audio subsystem and exposes [&hellip;]","og_url":"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/components\/audiocapturemgr\/","og_site_name":"RDK Documentation Portal | Documentation","article_modified_time":"2026-07-28T12:15:33+00:00","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/components\/audiocapturemgr\/","url":"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/components\/audiocapturemgr\/","name":"audiocapturemgr - RDK Documentation Portal | Documentation","isPartOf":{"@id":"https:\/\/developer.rdkcentral.com\/documentation\/#website"},"datePublished":"2022-06-21T09:10:27+00:00","dateModified":"2026-07-28T12:15:33+00:00","breadcrumb":{"@id":"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/components\/audiocapturemgr\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/components\/audiocapturemgr\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/components\/audiocapturemgr\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/developer.rdkcentral.com\/documentation\/"},{"@type":"ListItem","position":2,"name":"Documentation","item":"https:\/\/developer.rdkcentral.com\/documentation\/"},{"@type":"ListItem","position":3,"name":"RDK Video","item":"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/"},{"@type":"ListItem","position":4,"name":"Components","item":"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/components\/"},{"@type":"ListItem","position":5,"name":"audiocapturemgr"}]},{"@type":"WebSite","@id":"https:\/\/developer.rdkcentral.com\/documentation\/#website","url":"https:\/\/developer.rdkcentral.com\/documentation\/","name":"RDK Documentation Portal | Documentation","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/developer.rdkcentral.com\/documentation\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"}]}},"_links":{"self":[{"href":"https:\/\/developer.rdkcentral.com\/documentation\/wp-json\/wp\/v2\/pages\/9873","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/developer.rdkcentral.com\/documentation\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/developer.rdkcentral.com\/documentation\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/developer.rdkcentral.com\/documentation\/wp-json\/wp\/v2\/users\/28"}],"replies":[{"embeddable":true,"href":"https:\/\/developer.rdkcentral.com\/documentation\/wp-json\/wp\/v2\/comments?post=9873"}],"version-history":[{"count":4,"href":"https:\/\/developer.rdkcentral.com\/documentation\/wp-json\/wp\/v2\/pages\/9873\/revisions"}],"predecessor-version":[{"id":12985,"href":"https:\/\/developer.rdkcentral.com\/documentation\/wp-json\/wp\/v2\/pages\/9873\/revisions\/12985"}],"up":[{"embeddable":true,"href":"https:\/\/developer.rdkcentral.com\/documentation\/wp-json\/wp\/v2\/pages\/9844"}],"wp:attachment":[{"href":"https:\/\/developer.rdkcentral.com\/documentation\/wp-json\/wp\/v2\/media?parent=9873"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}