Skip to content

Commit 825e9d5

Browse files
committed
fix audio output thru mixer
1 parent b58dd7d commit 825e9d5

File tree

4 files changed

+12
-6
lines changed

4 files changed

+12
-6
lines changed

examples/local-audio/full_duplex.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,24 @@
11
import os
22
import asyncio
33
import logging
4+
from dotenv import load_dotenv, find_dotenv
45

56
from livekit import rtc
67

78

89
async def main() -> None:
910
logging.basicConfig(level=logging.INFO)
1011

12+
# Load environment variables from a .env file if present
13+
load_dotenv(find_dotenv())
14+
1115
url = os.getenv("LIVEKIT_URL")
1216
token = os.getenv("LIVEKIT_TOKEN")
1317
if not url or not token:
1418
raise RuntimeError("LIVEKIT_URL and LIVEKIT_TOKEN must be set in env")
1519

1620
room = rtc.Room()
21+
1722
devices = rtc.MediaDevices()
1823

1924
# Open microphone with AEC and prepare a player for remote audio feeding AEC reverse stream
@@ -43,7 +48,7 @@ async def _remove_stream(stream: rtc.AudioStream, participant_sid: str | None =
4348
if pub_sid is not None:
4449
streams_by_pub.pop(pub_sid, None)
4550

46-
async def on_track_subscribed(track: rtc.Track, publication: rtc.RemoteTrackPublication, participant: rtc.RemoteParticipant):
51+
def on_track_subscribed(track: rtc.Track, publication: rtc.RemoteTrackPublication, participant: rtc.RemoteParticipant):
4752
if track.kind == rtc.TrackKind.KIND_AUDIO:
4853
stream = rtc.AudioStream(track, sample_rate=48000, num_channels=1)
4954
streams_by_pub[publication.sid] = stream

examples/local-audio/publish_mic.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,7 @@
44
import logging
55
from dotenv import load_dotenv, find_dotenv
66

7-
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", "livekit-rtc")))
8-
97
from livekit import rtc
10-
from livekit.rtc import MediaDevices
118

129
async def main() -> None:
1310
logging.basicConfig(level=logging.INFO)
@@ -23,7 +20,7 @@ async def main() -> None:
2320
room = rtc.Room()
2421

2522
# Create media devices helper and open default microphone with AEC enabled
26-
devices = MediaDevices()
23+
devices = rtc.MediaDevices()
2724
mic = devices.open_microphone(enable_aec=True)
2825

2926
try:

livekit-rtc/livekit/rtc/audio_mixer.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,10 @@ async def _get_contribution(
184184
except StopAsyncIteration:
185185
exhausted = True
186186
break
187+
# AudioStream may yield either AudioFrame or AudioFrameEvent; unwrap if needed
188+
if hasattr(frame, "frame"):
189+
frame = frame.frame # type: ignore[assignment]
190+
187191
new_data = np.frombuffer(frame.data.tobytes(), dtype=np.int16).reshape(
188192
-1, self._num_channels
189193
)

livekit-rtc/livekit/rtc/media_devices.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ def _callback(outdata: np.ndarray, frame_count: int, time_info: Any, status: Any
181181
break
182182
render_chunk = outdata[start:end, 0]
183183
render_frame = AudioFrame(
184-
render_chunk.tobytes(), FRAME_SAMPLES, 1, FRAME_SAMPLES
184+
render_chunk.tobytes(), self._sample_rate, 1, FRAME_SAMPLES
185185
)
186186
try:
187187
self._apm.process_reverse_stream(render_frame)

0 commit comments

Comments
 (0)