16.04 Không thể sử dụng tai nghe bluetooth A2DP, cặp nhưng không kết nối. Nhật ký bên trong


15

Trước tiên, tôi đã thử làm theo cả hai điều sau: https://vilimpoc.org/blog/2016/04/30/ubfox-16-04-bluetooth-speaker/PulseAudio không thể tải mô-đun bluetooth 15.10 / 16.04 / 16.10

Khi tôi cố gắng kết nối Jaybird X2 của mình (đã thử trên cả máy tính để bàn và máy tính xách tay, máy chủ và intel), nó sẽ kết nối, kết nối trong hai giây rồi ngắt kết nối.

Nhật ký biểu mẫu nhật ký hệ thống (từ máy tính để bàn của tôi với BT rộng rãi)

May 31 23:50:54 desktop pulseaudio[6247]: [pulseaudio] socket-server.c: bind(): Address already in use
May 31 23:50:54 desktop pulseaudio[6247]: [pulseaudio] module.c: Failed to load module "module-cli-protocol-unix" (argument: ""): initialization failed.
May 31 23:50:54 desktop pulseaudio[6247]: [pulseaudio] socket-server.c: bind(): Address already in use
May 31 23:50:54 desktop pulseaudio[6247]: [pulseaudio] module.c: Failed to load module "module-cli-protocol-unix" (argument: ""): initialization failed.

Và những lần khác:

a2dp-sink profile connect failed for xxxxxxx Protocol not available

EDIT .. QUAN TRỌNG:

Bây giờ tôi đã phát hiện ra rằng cố gắng để kết nối với các thiết bị khác làm việc tốt (Micropod BT và Samsung AirTrack) hầu hết thời gian, nhưng ngay sau khi tôi cố gắng Jaybird X2, nó vô hiệu hóa / unloads mô-đun-bluetooth-khám phá và tôi phải pactl load-module module-bluetooth-discovercho hai cái khác để hoạt động trở lại ..

Bây giờ điều này xảy ra với máy tính xách tay:

May 31 17:02:58 vooze-x1 pulseaudio[3534]: [pulseaudio] backend-native.c: connect(): Function not implemented
May 31 17:02:58 vooze-x1 pulseaudio[3534]: [pulseaudio] volume.c: Assertion 'pa_channels_valid(channels)' failed at pulse/volume.c:74, function pa_cvolume_set(). Aborting.
May 31 17:02:58 vooze-x1 bluetoothd[865]: Endpoint unregistered: sender=:1.130 path=/MediaEndpoint/A2DPSource
May 31 17:02:58 vooze-x1 bluetoothd[865]: Endpoint unregistered: sender=:1.130 path=/MediaEndpoint/A2DPSink
May 31 17:03:00 vooze-x1 pulseaudio[3764]: [pulseaudio] main.c: User-configured server at {ddcf951d58914c47b9adca0056c50142}unix:/run/user/1000/pulse/native, which appears to be local. Probing deeper.
May 31 17:03:00 vooze-x1 pulseaudio[3767]: [pulseaudio] pid.c: Stale PID file, overwriting.

Trước đây tôi đã có thể kết nối nó trên máy tính để bàn của mình, nhưng A2DP không hoạt động hầu hết thời gian ..

Hai lỗi khác nhau nhưng cùng một vấn đề. Chuyện gì đang xảy ra vậy?

Có phải bluetooth vừa bị hỏng trong Ubuntu 16.04? Nó hoạt động trong Windows và với Điện thoại Android của tôi.

Bất cứ sự giúp đỡ nào cũng thật sự tuyệt vời! :) Tôi bằng cách nào đó đã xoay sở để làm cho nó hoạt động nhanh chóng, đầu tiên nó hoạt động, sau đó A2DP không hoạt động .. vì vậy tôi nghi ngờ điều này có liên quan đến A2DP. Không chắc.


Bạn đã đặt tai nghe vào chế độ ghép nối trước khi kết nối chưa? Từ tắt thiết bị, nhấn và giữ phím trung tâm trong 4 giây cho đến khi đèn nhấp nháy màu đỏ / xanh lục. Tìm kiếm nó trong Ubuntu và kết nối. Xem Askubfox.com/questions/259354/ trên
Takkat

Có, và nó kết nối tốt .. Vấn đề không phải là ghép, mà là "kết nối" .. Nó kết nối và nói "kết nối tai nghe" và sau đó ngắt kết nối 2 giây sau.
Joakim Koed

Chỉ cần hỏi vì đó là một triệu chứng của các thiết bị không được ghép đúng cách xuất hiện để kết nối nhưng sau đó không thành công. Có thể đáng để thử lại (sau khi xóa thiết bị khỏi các thiết bị đã biết).
Takkat

Takket: Tôi có thể đã làm điều đó 20 lần. tai nghe hard-reset, v.v.
Joakim Koed

1
Cảm ơn bạn đã gửi lỗi, @RobertIanHawdon. Tôi đã đánh dấu mình là bị ảnh hưởng.
Joakim Koed

Câu trả lời:


12

Đây là một lỗi đã biết. Hãy thử rmmod btusb ; modprobe btusb. Tôi đã phải làm điều đó tới bốn lần.

Tôi đã thấy điều này với Lenovo P50 của tôi với Intel 8260 wifi / bluetooth. Đôi khi phần mềm bluetooth không tải chính xác khi khởi động. Những lần khác, nó không hoạt động.


2
Đã có một số hồi quy nghiêm trọng trong hỗ trợ Bluetooth cho 16.04.
Amias

@Amias Vâng, tôi cũng không thể làm cho bluetooth hoạt động vào 14.04.
jarno

1
Hoạt động với tôi trên Lenovo Y510P của tôi chạy 16.04. Tôi đã thêm bí danh vào ~ / .bashrc:alias headphones='sudo rmmod btusb ; sudo modprobe btusb'
BenB

3

Tôi đã gặp vấn đề tương tự với Jaybird X2 và Bluebuds X, mặc dù các thiết bị âm thanh Bluetooth khác hoạt động mà không gặp sự cố. Với tai nghe, tôi gặp lỗi này:

Assertion 'pa_channels_valid(channels)' failed at pulse/volume.c:74, function pa_cvolume_set(). Aborting.

và pulseaudio bị rơi. Điều gì đã giải quyết nó là cài đặt pulseaudio từ các nguồn:

  • Cài đặt tất cả các gói cần thiết: sudo apt-get build-dep pulseaudio
  • Tải xuống https://freedesktop.org/software/pulseaudio/release/pulseaudio-9.0.tar.gz và giải nén.
  • Trong thư mục nguồn, chạy : ./bootstrap.sh --prefix=/usr. Nếu bạn muốn, bạn có thể thay đổi CFLAGSbiến để kích hoạt tối ưu hóa trình biên dịch, ví dụ: sử dụng -O2thay vì-O0 .
  • Sau đó, makesudo make install

Điều này sẽ ghi đè cài đặt hệ thống mặc định, nhưng nó sẽ hoạt động cho đến khi các gói được cập nhật. Để ngăn chặn cập nhật, chúng tôi có thể tạm dừng các gói pulseaudio:

sudo apt-mark hold libpulse-dev libpulse0 libpulse-mainloop-glib0 pulseaudio pulseaudio-module-bluetooth pulseaudio-utils libpulsedsp pulseaudio-module-x11

Lưu ý rằng tôi đã cài đặt pulseaudio 9.0, nhưng nó không phải là phiên bản làm cho nó hoạt động. Tôi đã thử sử dụng phiên bản đóng gói của pulseaudio 9.0 từ PPA , nhưng nó cũng bị lỗi với cùng một lỗi.


Chào. Điều đó có tổng hợp tất cả các decencies không? Tôi thực sự đã hạ xuống còn 6 từ ngày hôm qua. Làm việc hoàn hảo.
Joakim Koed

Không có vấn đề với việc biên dịch. Ý anh là gì?
Andrzej Pronobis

Nếu không phải là phiên bản, điều gì làm nên sự khác biệt?
Daniel Szmulewicz

2

Tôi gặp vấn đề này với tai nghe Bluedio T + 3 của tôi và điều tôi nghĩ đang xảy ra là có thời gian chờ kết nối. Bạn cần bỏ ghi chú dòng ; exit-idle-time = 20trong tệp /etc/pulse/daemon.confbằng cách xóa dấu chấm phẩy (;).

Thay đổi giá trị -1để trở thành:

exit-idle-time = -1

Sau đó sử dụng bluetoothctllại để thử và kết nối với thiết bị. Xem ở đây để được hướng dẫn:

Arch wiki: tai nghe bluetooth


1

Đảm bảo những điều sau:

  • Jaybird X2 được ghép nối
  • nó được đánh dấu là đáng tin cậy (thông qua bluetoothctltrust XX:XX:XX:XX( XX:XX:XX:XXđịa chỉ MAC của Jaybird của bạn) hoặc thông qua blueman-manager)
  • nó được bật

Nhấn nút nguồn của Jaybird X2 của bạn một lần. Điều này có thể kích hoạt tự động kết nối với các thiết bị đã biết. Vì vậy, bạn có thể cần đảm bảo rằng các thiết bị khác không can thiệp vào đây. Từ đó, kết nối ổn định và nó cũng tự động kết nối sau khi khởi động lại.

Hãy cho tôi biết liệu điều này cũng giải quyết vấn đề của bạn. Tôi cũng đã làm rất nhiều thứ khác và gần như bỏ cuộc, khi tôi vô tình nhấn nút nguồn ;-) Vì vậy, đó cũng có thể là một trong những điều khác đã giải quyết vấn đề. (đã tìm kiếm và thử mọi thứ xung quanh bluetooth, pulseaudio, bluez, pactl load-module bất cứ điều gì; vì vậy tôi vẫn còn rất nhiều gợi ý khác :-D)

CẬP NHẬT (sau khi gặp sự cố kết nối lại)

Sau khi tôi kết nối Jaybird X2 với điện thoại Android của mình, tôi không thể kết nối lại với máy tính xách tay của mình, ngay cả khi tôi đã ngắt kết nối từ điện thoại Android. Chưa biết chính xác vấn đề ở đây là gì, nhưng để lấy lại kết nối, tôi phải làm như sau:

  1. ngắt kết nối Jaybird X2 khỏi điện thoại Android của tôi (hoặc bất kỳ thiết bị nào khác)
  2. khởi động lại Ubuntu
  3. kết nối lại hoạt động và kết nối ổn định (nó thường không hoạt động khi ghép nối lần đầu tiên ... Tôi cũng yêu cầu khởi động lại sau đó)

Tôi cũng đã thử một số thứ khác và có vẻ như ít nhất pulseaudio-module-bluetoothlà bắt buộc. Ngoài ra, cấu hình cùng tồn tại wifi / bluetooth được yêu cầu ít nhất là trên máy của tôi (xem: https://askubfox.com/a/645072/558838 ). Và cuối cùng nhưng không kém phần quan trọng: luôn luôn phải khởi động lại để lấy lại kết nối trong trường hợp tôi chuyển sang thiết bị khác.

Tóm lại: với bước khởi động lại đó, tôi có thể kết nối lại Jaybird X2 thành công và kết nối ổn định. Nếu bất cứ ai biết một cách dễ dàng hơn để bỏ qua bước khởi động lại, vui lòng đóng góp :) /etc/init.d/bluetooth restartkhông đủ.

(các bước bổ sung tôi đã thử):

Tôi nhìn vào lịch sử của tôi. Tôi cũng đã thử những điều sau đây mà người này hoặc người kia có thể đã đóng góp cho giải pháp trên:

  • apt-get install pulseaudio-module-bluetooth (trên hệ thống của tôi, nó chưa được cài đặt)
  • Nhật ký đề cập đến một cái gì đó về thiếu ofono, vì vậy tôi cũng cài đặt
  • đã làm một sudo chown -R $USER ~/*
  • cũng được áp dụng: https://askubfox.com/a/691299/558838 (Tuy nhiên tôi đã hoàn nguyên nó vì nó không giúp ích gì. Nhưng nó vẫn có thể hoạt động, khi tôi thử tự động kết nối)
  • cũng đã thanh lọc / cài đặt pulseaudio, blueman, bluetooth packag

Cảm ơn bạn đã cố gắng giúp đỡ, chỉ cần thử nghiệm nó, sụp đổ ngay khi tôi cố gắng. Sau đó tôi đã thử: pactl tải mô-đun mô-đun-bluetooth-khám phá và nhấn nguồn một lần nữa, nó lại bị sập pulseaudio: /
Joakim Koed

Đã thêm các bước bổ sung cho câu trả lời mà tôi đã thử. Nếu bạn cần chi tiết về bất kỳ, chỉ cần hỏi.
Roland

ĐỒNG Ý. Phát hiện ra một điều khác ngày hôm nay: sau một giấc ngủ, tôi không thể làm cho nó hoạt động trở lại. Tuy nhiên, nó vẫn hoạt động sau khi khởi động lại. Tệ hơn nữa: ngay khi kết nối bluetooth được thiết lập, kết nối không dây của tôi không hoạt động nữa. Nó vẫn kết nối nhưng không chuyển bất cứ điều gì. Tôi phải điều tra thêm.
Roland

Cảm thấy tự do để đánh dấu ourself như bị ảnh hưởng: bugs.launchpad.net/ubuntu/+source/pulseaudio/+bug/1574324
Joakim KO

Tôi đã khắc phục sự cố cùng tồn tại wifi / bluetooth với các vấn đề sau: Askubfox.com/a/645072/558838 :) Đã ngủ lại và nó đã kết nối lại bluetooth ... vì vậy tôi có thể phải kiểm tra những gì tôi đã làm, vì vậy bây giờ nó hoạt động ... Có lẽ lỗi cùng tồn tại cũng là vấn đề cho kết nối ổn định? Ít nhất thì nó có vẻ hợp lý hơn những thứ khác tôi đã liệt kê :-) Bạn có thể thử cái đó không?
Roland

1

Chạy đoạn script ở đây trên GitHub

Và vấn đề sẽ tan biến.

#! /usr/bin/env python3.5
"""

Fixing bluetooth stereo headphone/headset problem in ubuntu 16.04 and also debian jessie, with bluez5.

Workaround for bug: https://bugs.launchpad.net/ubuntu/+source/indicator-sound/+bug/1577197
Run it with python3.5 or higher after pairing/connecting the bluetooth stereo headphone.

This will be only fixes the bluez5 problem mentioned above .

Licence: Freeware

See ``python3.5 a2dp.py -h``.

Shorthands:

    $ alias speakers="a2dp.py 10:08:C1:44:AE:BC"
    $ alias headphones="a2dp.py 00:22:37:3D:DA:50"
    $ alias headset="a2dp.py 00:22:37:F8:A0:77 -p hsp"

    $ speakers



Check here for the latest updates: https://gist.github.com/pylover/d68be364adac5f946887b85e6ed6e7ae

Thanks to:

 * https://github.com/DominicWatson, for adding the ``-p/--profile`` argument.
 * https://github.com/IzzySoft, for mentioning wait before connecting again.
 * https://github.com/AmploDev, for v0.4.0

Change Log
----------

- 0.4.1
  * Sorting device list

- 0.4.0
  * Adding ignore_fail argument by @AmploDev.
  * Sending all available streams into selected sink, after successfull connection by @AmploDev.

- 0.3.3
  * Updating default sink before turning to ``off`` profile.

- 0.3.2
  * Waiting a bit: ``-w/--wait`` before connecting again.

- 0.3.0
  * Adding -p / --profile option for using the same script to switch between headset and A2DP audio profiles

- 0.2.5
  * Mentioning [mac] argument.

- 0.2.4
  * Removing duplicated devices in select device list.

- 0.2.3
  * Matching ANSI escape characters. Tested on 16.10 & 16.04

- 0.2.2
  * Some sort of code enhancements.

- 0.2.0
  * Adding `-V/--version`, `-w/--wait` and `-t/--tries` CLI arguments.

- 0.1.1
  * Supporting the `[NEW]` prefix for devices & controllers as advised by @wdullaer
  * Drying the code.

"""

import sys
import re
import asyncio
import subprocess as sb
import argparse


__version__ = '0.4.0'


HEX_DIGIT_PATTERN = '[0-9A-F]'
HEX_BYTE_PATTERN = '%s{2}' % HEX_DIGIT_PATTERN
MAC_ADDRESS_PATTERN = ':'.join((HEX_BYTE_PATTERN, ) * 6)
DEVICE_PATTERN = re.compile('^(?:.*\s)?Device\s(?P<mac>%s)\s(?P<name>.*)' % MAC_ADDRESS_PATTERN)
CONTROLLER_PATTERN = re.compile('^(?:.*\s)?Controller\s(?P<mac>%s)\s(?P<name>.*)' % MAC_ADDRESS_PATTERN)
WAIT_TIME = .75
TRIES = 4
PROFILE = 'a2dp'


_profiles = {
    'a2dp': 'a2dp_sink',
    'hsp': 'headset_head_unit',
    'off': 'off'
}

# CLI Arguments
parser = argparse.ArgumentParser(prog=sys.argv[0])
parser.add_argument('-e', '--echo', action='store_true', default=False,
                    help='If given, the subprocess stdout will be also printed on stdout.')
parser.add_argument('-w', '--wait', default=WAIT_TIME, type=float,
                    help='The seconds to wait for subprocess output, default is: %s' % WAIT_TIME)
parser.add_argument('-t', '--tries', default=TRIES, type=int,
                    help='The number of tries if subprocess is failed. default is: %s' % TRIES)
parser.add_argument('-p', '--profile', default=PROFILE,
                    help='The profile to switch to. available options are: hsp, a2dp. default is: %s' % PROFILE)
parser.add_argument('-V', '--version', action='store_true', help='Show the version.')
parser.add_argument('mac', nargs='?', default=None)


# Exceptions
class SubprocessError(Exception):
    pass


class RetryExceededError(Exception):
    pass


class BluetoothctlProtocol(asyncio.SubprocessProtocol):
    def __init__(self, exit_future, echo=True):
        self.exit_future = exit_future
        self.transport = None
        self.output = None
        self.echo = echo

    def listen_output(self):
        self.output = ''

    def not_listen_output(self):
        self.output = None

    def pipe_data_received(self, fd, raw):
        d = raw.decode()
        if self.echo:
            print(d, end='')

        if self.output is not None:
            self.output += d

    def process_exited(self):
        self.exit_future.set_result(True)

    def connection_made(self, transport):
        self.transport = transport
        print('Connection MADE')

    async def send_command(self, c):
        stdin_transport = self.transport.get_pipe_transport(0)
        # noinspection PyProtectedMember
        stdin_transport._pipe.write(('%s\n' % c).encode())

    async def search_in_output(self, expression, fail_expression=None):
        if self.output is None:
            return None

        for l in self.output.splitlines():
            if fail_expression and re.search(fail_expression, l, re.IGNORECASE):
                raise SubprocessError('Expression "%s" failed with fail pattern: "%s"' % (l, fail_expression))

            if re.search(expression, l, re.IGNORECASE):
                return True

    async def send_and_wait(self, cmd, wait_expression, fail_expression='fail'):
        try:
            self.listen_output()
            await self.send_command(cmd)
            while not await self.search_in_output(wait_expression.lower(), fail_expression=fail_expression):
                await wait()
        finally:
            self.not_listen_output()

    async def disconnect(self, mac):
        print('Disconnecting the device.')
        await self.send_and_wait('disconnect %s' % ':'.join(mac), 'Successful disconnected')

    async def connect(self, mac):
        print('Connecting again.')
        await self.send_and_wait('connect %s' % ':'.join(mac), 'Connection successful')

    async def trust(self, mac):
        await self.send_and_wait('trust %s' % ':'.join(mac), 'trust succeeded')

    async def quit(self):
        await self.send_command('quit')

    async def get_list(self, command, pattern):
        result = set()
        try:
            self.listen_output()
            await self.send_command(command)
            await wait()
            for l in self.output.splitlines():
                m = pattern.match(l)
                if m:
                    result.add(m.groups())
            return sorted(list(result), key=lambda i: i[1])
        finally:
            self.not_listen_output()

    async def list_devices(self):
        return await self.get_list('devices', DEVICE_PATTERN)

    async def list_paired_devices(self):
        return await self.get_list('paired-devices', DEVICE_PATTERN)

    async def list_controllers(self):
        return await self.get_list('list', CONTROLLER_PATTERN)

    async def select_paired_device(self):
        print('Selecting device:')
        devices = await self.list_paired_devices()
        count = len(devices)

        if count < 1:
            raise SubprocessError('There is no connected device.')
        elif count == 1:
            return devices[0]

        for i, d in enumerate(devices):
            print('%d. %s %s' % (i+1, d[0], d[1]))
        print('Select device[1]:')
        selected = input()
        return devices[0 if not selected.strip() else (int(selected) - 1)]


async def wait():
    return await asyncio.sleep(WAIT_TIME)


async def execute_command(cmd, ignore_fail=False):
    p = await asyncio.create_subprocess_shell(cmd, stdout=sb.PIPE, stderr=sb.PIPE)
    stdout, stderr = await p.communicate()
    stdout, stderr = \
        stdout.decode() if stdout is not None else '', \
        stderr.decode() if stderr is not None else ''
    if p.returncode != 0 or stderr.strip() != '':
        message = 'Command: %s failed with status: %s\nstderr: %s' % (cmd, p.returncode, stderr)
        if ignore_fail:
            print('Ignoring: %s' % message)
        else:
            raise SubprocessError(message)
    return stdout


async def execute_find(cmd, pattern, tries=0, fail_safe=False):
    tries = tries or TRIES

    message = 'Cannot find `%s` using `%s`.' % (pattern, cmd)
    retry_message = message + ' Retrying %d more times'
    while True:
        stdout = await execute_command(cmd)
        match = re.search(pattern, stdout)

        if match:
            return match.group()
        elif tries > 0:
            await wait()
            print(retry_message % tries)
            tries -= 1
            continue

        if fail_safe:
            return None

        raise RetryExceededError('Retry times exceeded: %s' % message)


async def find_dev_id(mac, **kw):
    return await execute_find('pactl list cards short', 'bluez_card.%s' % '_'.join(mac), **kw)


async def find_sink(mac, **kw):
    return await execute_find('pacmd list-sinks', 'bluez_sink.%s' % '_'.join(mac), **kw)


async def set_profile(device_id, profile):
    print('Setting the %s profile' % profile)
    try:
        return await execute_command('pactl set-card-profile %s %s' % (device_id, _profiles[profile]))
    except KeyError:
        print('Invalid profile: %s, please select one one of a2dp or hsp.' % profile, file=sys.stderr)
        raise SystemExit(1)


async def set_default_sink(sink):
    print('Updating default sink to %s' % sink)
    return await execute_command('pacmd set-default-sink %s' % sink)


async def move_streams_to_sink(sink):
    streams = await execute_command('pacmd list-sink-inputs | grep "index:"', True)
    for i in streams.split():
        i = ''.join(n for n in i if n.isdigit())
        if i != '':
            print('Moving stream %s to sink' % i)
            await execute_command('pacmd move-sink-input %s %s' % (i, sink))
    return sink


async def main(args):
    global WAIT_TIME, TRIES

    if args.version:
        print(__version__)
        return 0

    mac = args.mac

    # Hacking, Changing the constants!
    WAIT_TIME = args.wait
    TRIES = args.tries

    exit_future = asyncio.Future()
    transport, protocol = await asyncio.get_event_loop().subprocess_exec(
        lambda: BluetoothctlProtocol(exit_future, echo=args.echo), 'bluetoothctl'
    )

    try:

        if mac is None:
            mac, _ = await protocol.select_paired_device()

        mac = mac.split(':' if ':' in mac else '_')
        print('Device MAC: %s' % ':'.join(mac))

        device_id = await find_dev_id(mac, fail_safe=True)
        if device_id is None:
            print('It seems device: %s is not connected yet, trying to connect.' % ':'.join(mac))
            await protocol.trust(mac)
            await protocol.connect(mac)
            device_id = await find_dev_id(mac)

        sink = await find_sink(mac, fail_safe=True)
        if sink is None:
            await set_profile(device_id, args.profile)
            sink = await find_sink(mac)

        print('Device ID: %s' % device_id)
        print('Sink: %s' % sink)

        await set_default_sink(sink)
        await wait()

        await set_profile(device_id, 'off')

        if args.profile is 'a2dp':
            await protocol.disconnect(mac)
            await wait()
            await protocol.connect(mac)

        device_id = await find_dev_id(mac)
        print('Device ID: %s' % device_id)

        await set_profile(device_id, args.profile)
        await set_default_sink(sink)
        await move_streams_to_sink(sink)

    except (SubprocessError, RetryExceededError) as ex:
        print(str(ex), file=sys.stderr)
        return 1
    finally:
        print('Exiting bluetoothctl')
        await protocol.quit()
        await exit_future

        # Close the stdout pipe
        transport.close()

    if args.profile == 'a2dp':
        print('"Enjoy" the HiFi stereo music :)')
    else:
        print('"Enjoy" your headset audio :)')


if __name__ == '__main__':
    sys.exit(asyncio.get_event_loop().run_until_complete(main(parser.parse_args())))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.