From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id C2E9140306 for ; Wed, 19 Jan 2022 14:38:22 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 8DDB268B0D3; Wed, 19 Jan 2022 16:38:20 +0200 (EET) Received: from mail-qv1-f43.google.com (mail-qv1-f43.google.com [209.85.219.43]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id B757468AEDE for ; Wed, 19 Jan 2022 16:38:13 +0200 (EET) Received: by mail-qv1-f43.google.com with SMTP id 15so2979644qvp.12 for ; Wed, 19 Jan 2022 06:38:13 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:message-id:mime-version:subject:date :in-reply-to:cc:to:references; bh=NnBv/oV/HO7rTA70rQziLhI/+ARkCiuAhRDj7Xt+lAs=; b=NvUo/oc5NIX5XZ4qU7176xddQq3ufKTjacGlbyoDyYZbGjEKcfnVjDAMouaTDk3wHy corIqV4rsassLMpL26Yjw7qFJ9bjoWv1KVlRYinEnpjCmzGgLVgVd9hJPT3cUartZjzp 6I3d1d6HJNhXFiVr3gQWmbfuucUFp3zgPEip7m/NQqMerGrPtUu8YnWm9ihpSTRXNT0G WtQ3GFnpdXWLw0NhBxkJo9z6h/wp2jrAeit3zsX4Z0Jz2QMJjHK+fEvfZuagBzSObVh5 HmH3rKMNkqwkHaQ2a55mlCgT0GwTwxwc5N9X4h14Lj2ZkqiykQrQv2/XaOehoHazWLCc fqTw== X-Gm-Message-State: AOAM530gSjVMducXJkonxWgbXP/Gn6qSBTooQrQ0mE32haHHW+fSbn8C Md3DqvtyKFSeYhvT0WAHR5qxl3W4DqJNJegt X-Google-Smtp-Source: ABdhPJwOJSm3LsK2Ixj0NU5efuWhK6f7Tu8vXfPip9ofDNilXRRvmIg9dUgbqRHjEbhxEwI6ZE3fJQ== X-Received: by 2002:a05:6214:300b:: with SMTP id ke11mr27490756qvb.8.1642603092022; Wed, 19 Jan 2022 06:38:12 -0800 (PST) Received: from smtpclient.apple ([172.58.4.135]) by smtp.gmail.com with ESMTPSA id w9sm7706566qkp.34.2022.01.19.06.38.10 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 19 Jan 2022 06:38:11 -0800 (PST) From: Romain Beauxis Message-Id: <3AEEE829-F99A-4105-B6D0-3EA6D240FEF4@rastageeks.org> Content-Type: multipart/mixed; boundary="Apple-Mail=_D28B81D5-4D6B-4988-852C-8E3133B2507D" Mime-Version: 1.0 (Mac OS X Mail 15.0 \(3693.40.0.1.81\)) Date: Wed, 19 Jan 2022 08:38:09 -0600 In-Reply-To: To: FFmpeg development discussions and patches References: X-Mailer: Apple Mail (2.3693.40.0.1.81) Subject: [FFmpeg-devel] [PATCH 3/5] libavdevice/avfoundation.m: Allow to select devices by unique ID X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Thilo Borgmann , Marvin Scholz Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: --Apple-Mail=_D28B81D5-4D6B-4988-852C-8E3133B2507D Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=us-ascii This patch changes the logic around device selection to allow to use a = static, machine-readable unique ID when selecting devices. Device names = depends on locale settings and device index can change when = plugging/unplugging devices. --Apple-Mail=_D28B81D5-4D6B-4988-852C-8E3133B2507D Content-Disposition: attachment; filename=0001-libavdevice-avfoundation.m-Allow-to-select-devices-by-.eml Content-Type: message/rfc822; x-unix-mode=0644; name="0001-libavdevice-avfoundation.m-Allow-to-select-devices-by-.eml" Content-Transfer-Encoding: quoted-printable =46rom=20bf72d48c846f5116866ec588fc0ee54a2c354e87=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20Romain=20Beauxis=20=0A= Date:=20Mon,=2013=20Dec=202021=2009:14:50=20-0600=0ASubject:=20[PATCH]=20= libavdevice/avfoundation.m:=20Allow=20to=20select=20devices=20by=20= unique=0A=20ID=0AX-Unsent:=201=0ATo:=20ffmpeg-devel@ffmpeg.org=0A=0A= Signed-off-by:=20Romain=20Beauxis=20=0A---=0A=20= doc/indevs.texi=20=20=20=20=20=20=20=20=20=20=20=20|=20=206=20++--=0A=20= libavdevice/avfoundation.m=20|=2072=20= +++++++++++++++++++++++++++++---------=0A=202=20files=20changed,=2060=20= insertions(+),=2018=20deletions(-)=0A=0Adiff=20--git=20a/doc/indevs.texi=20= b/doc/indevs.texi=0Aindex=209d8020311a..858c0fa4e4=20100644=0A---=20= a/doc/indevs.texi=0A+++=20b/doc/indevs.texi=0A@@=20-114,7=20+114,7=20@@=20= The=20input=20filename=20has=20to=20be=20given=20in=20the=20following=20= syntax:=0A=20-i=20"[[VIDEO]:[AUDIO]]"=0A=20@end=20example=0A=20The=20= first=20entry=20selects=20the=20video=20input=20while=20the=20latter=20= selects=20the=20audio=20input.=0A-The=20stream=20has=20to=20be=20= specified=20by=20the=20device=20name=20or=20the=20device=20index=20as=20= shown=20by=20the=20device=20list.=0A+The=20stream=20has=20to=20be=20= specified=20by=20the=20device=20name,=20index=20or=20ID=20as=20shown=20= by=20the=20device=20list.=0A=20Alternatively,=20the=20video=20and/or=20= audio=20input=20device=20can=20be=20chosen=20by=20index=20using=20the=0A=20= @option{=0A=20=20=20=20=20-video_device_index=20=0A@@=20-127,7=20= +127,9=20@@=20and/or=0A=20device=20name=20or=20index=20given=20in=20the=20= input=20filename.=0A=20=0A=20All=20available=20devices=20can=20be=20= enumerated=20by=20using=20@option{-list_devices=20true},=20listing=0A= -all=20device=20names=20and=20corresponding=20indices.=0A+all=20device=20= names,=20corresponding=20indices=20and=20IDs,=20when=20available.=20= Device=20name=20can=20be=20=0A+tricky=20to=20use=20when=20localized=20= and=20device=20index=20can=20change=20when=20devices=20are=20plugged=20= or=20unplugged.=20A=20device=0A+hash,=20when=20available,=20uniquely=20= identifies=20a=20device=20and=20should=20not=20change=20over=20time.=0A=20= =0A=20There=20are=20two=20device=20name=20aliases:=0A=20@table=20@code=0A= diff=20--git=20a/libavdevice/avfoundation.m=20= b/libavdevice/avfoundation.m=0Aindex=20e6f64b35b8..5d013cc0eb=20100644=0A= ---=20a/libavdevice/avfoundation.m=0A+++=20b/libavdevice/avfoundation.m=0A= @@=20-39,6=20+39,8=20@@=0A=20#include=20"libavutil/imgutils.h"=0A=20= #include=20"avdevice.h"=0A=20=0A+#define=20CLEANUP_DEVICE_ID(s)=20[[s=20= stringByReplacingOccurrencesOfString:@":"=20withString:@"."]=20= UTF8String]=0A+=0A=20static=20void=20av_log_avfoundation(void=20*s,=20= int=20lvl,=20const=20char=20*str,=20OSStatus=20err)=20{=0A=20=20=20=20=20= NSAutoreleasePool=20*pool=20=3D=20[[NSAutoreleasePool=20alloc]=20init];=0A= =20=20=20=20=20av_log(s,=20lvl,=20"AVFoundation:=20%s,=20%s\n",=20str,=0A= @@=20-710,21=20+712,23=20@@=20static=20int=20= avf_read_header(AVFormatContext=20*s)=0A=20=20=20=20=20=20=20=20=20int=20= index=20=3D=200;=0A=20=20=20=20=20=20=20=20=20av_log(ctx,=20AV_LOG_INFO,=20= "AVFoundation=20video=20devices:\n");=0A=20=20=20=20=20=20=20=20=20for=20= (AVCaptureDevice=20*device=20in=20devices)=20{=0A-=20=20=20=20=20=20=20=20= =20=20=20=20const=20char=20*name=20=3D=20[[device=20localizedName]=20= UTF8String];=0A-=20=20=20=20=20=20=20=20=20=20=20=20index=20=20=20=20=20=20= =20=20=20=20=20=20=3D=20[devices=20indexOfObject:device];=0A-=20=20=20=20= =20=20=20=20=20=20=20=20av_log(ctx,=20AV_LOG_INFO,=20"[%d]=20%s\n",=20= index,=20name);=0A+=20=20=20=20=20=20=20=20=20=20=20=20const=20char=20= *name=20=20=20=20=20=3D=20[[device=20localizedName]=20UTF8String];=0A+=20= =20=20=20=20=20=20=20=20=20=20=20const=20char=20*uniqueId=20=3D=20= CLEANUP_DEVICE_ID([device=20uniqueID]);=0A+=20=20=20=20=20=20=20=20=20=20= =20=20index=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=3D=20= [devices=20indexOfObject:device];=0A+=20=20=20=20=20=20=20=20=20=20=20=20= av_log(ctx,=20AV_LOG_INFO,=20"[%d]=20%s=20(ID:=20%s)\n",=20index,=20= name,=20uniqueId);=0A=20=20=20=20=20=20=20=20=20}=0A=20=20=20=20=20=20=20= =20=20for=20(AVCaptureDevice=20*device=20in=20devices_muxed)=20{=0A-=20=20= =20=20=20=20=20=20=20=20=20=20const=20char=20*name=20=3D=20[[device=20= localizedName]=20UTF8String];=0A-=20=20=20=20=20=20=20=20=20=20=20=20= index=20=20=20=20=20=20=20=20=20=20=20=20=3D=20[devices=20count]=20+=20= [devices_muxed=20indexOfObject:device];=0A-=20=20=20=20=20=20=20=20=20=20= =20=20av_log(ctx,=20AV_LOG_INFO,=20"[%d]=20%s\n",=20index,=20name);=0A+=20= =20=20=20=20=20=20=20=20=20=20=20const=20char=20*name=20=20=20=20=20=3D=20= [[device=20localizedName]=20UTF8String];=0A+=20=20=20=20=20=20=20=20=20=20= =20=20const=20char=20*uniqueId=20=3D=20CLEANUP_DEVICE_ID([device=20= uniqueID]);=0A+=20=20=20=20=20=20=20=20=20=20=20=20index=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=3D=20[devices=20count]=20+=20= [devices_muxed=20indexOfObject:device];=0A+=20=20=20=20=20=20=20=20=20=20= =20=20av_log(ctx,=20AV_LOG_INFO,=20"[%d]=20%s=20(ID:=20%s)\n",=20index,=20= name,=20uniqueId);=0A=20=20=20=20=20=20=20=20=20}=0A=20#if=20= !TARGET_OS_IPHONE=20&&=20__MAC_OS_X_VERSION_MIN_REQUIRED=20>=3D=201070=0A= =20=20=20=20=20=20=20=20=20if=20(num_screens=20>=200)=20{=0A=20=20=20=20=20= =20=20=20=20=20=20=20=20CGDirectDisplayID=20screens[num_screens];=0A=20=20= =20=20=20=20=20=20=20=20=20=20=20CGGetActiveDisplayList(num_screens,=20= screens,=20&num_screens);=0A=20=20=20=20=20=20=20=20=20=20=20=20=20for=20= (int=20i=20=3D=200;=20i=20<=20num_screens;=20i++)=20{=0A-=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20av_log(ctx,=20AV_LOG_INFO,=20"[%d]=20= Capture=20screen=20%d\n",=20ctx->num_video_devices=20+=20i,=20i);=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20av_log(ctx,=20AV_LOG_INFO,=20= "[%d]=20Capture=20screen=20%d=20(ID:=20= AvfilterAvfoundationCaptureScreen%d)\n",=20ctx->num_video_devices=20+=20= i,=20i,=20screens[i]);=0A=20=20=20=20=20=20=20=20=20=20=20=20=20}=0A=20=20= =20=20=20=20=20=20=20}=0A=20#endif=0A@@=20-732,9=20+736,10=20@@=20static=20= int=20avf_read_header(AVFormatContext=20*s)=0A=20=20=20=20=20=20=20=20=20= av_log(ctx,=20AV_LOG_INFO,=20"AVFoundation=20audio=20devices:\n");=0A=20=20= =20=20=20=20=20=20=20devices=20=3D=20[AVCaptureDevice=20= devicesWithMediaType:AVMediaTypeAudio];=0A=20=20=20=20=20=20=20=20=20for=20= (AVCaptureDevice=20*device=20in=20devices)=20{=0A-=20=20=20=20=20=20=20=20= =20=20=20=20const=20char=20*name=20=3D=20[[device=20localizedName]=20= UTF8String];=0A-=20=20=20=20=20=20=20=20=20=20=20=20int=20index=20=20=3D=20= [devices=20indexOfObject:device];=0A-=20=20=20=20=20=20=20=20=20=20=20=20= av_log(ctx,=20AV_LOG_INFO,=20"[%d]=20%s\n",=20index,=20name);=0A+=20=20=20= =20=20=20=20=20=20=20=20=20const=20char=20*name=20=20=20=20=20=3D=20= [[device=20localizedName]=20UTF8String];=0A+=20=20=20=20=20=20=20=20=20=20= =20=20const=20char=20*uniqueId=20=3D=20CLEANUP_DEVICE_ID([device=20= uniqueID]);=0A+=20=20=20=20=20=20=20=20=20=20=20=20int=20index=20=20=20=20= =20=20=20=20=20=20=20=20=3D=20[devices=20indexOfObject:device];=0A+=20=20= =20=20=20=20=20=20=20=20=20=20av_log(ctx,=20AV_LOG_INFO,=20"[%d]=20%s=20= (ID:=20%s)\n",=20index,=20name,=20uniqueId);=0A=20=20=20=20=20=20=20=20=20= }=0A=20=20=20=20=20=20=20=20=20=20goto=20fail;=0A=20=20=20=20=20}=0A@@=20= -796,14=20+801,29=20@@=20static=20int=20avf_read_header(AVFormatContext=20= *s)=0A=20=20=20=20=20=20=20=20=20}=20else=20{=0A=20=20=20=20=20=20=20=20=20= //=20looking=20for=20video=20inputs=0A=20=20=20=20=20=20=20=20=20for=20= (AVCaptureDevice=20*device=20in=20devices)=20{=0A-=20=20=20=20=20=20=20=20= =20=20=20=20if=20(!strncmp(ctx->video_filename,=20[[device=20= localizedName]=20UTF8String],=20strlen(ctx->video_filename)))=20{=0A+=20=20= =20=20=20=20=20=20=20=20=20=20const=20char=20*name=20=3D=20[[device=20= localizedName]=20UTF8String];=0A+=20=20=20=20=20=20=20=20=20=20=20=20if=20= (!strncmp(ctx->video_filename,=20name,=20strlen(ctx->video_filename)))=20= {=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20video_device=20=3D=20= device;=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20break;=0A+=20=20= =20=20=20=20=20=20=20=20=20=20}=0A+=0A+=20=20=20=20=20=20=20=20=20=20=20=20= const=20char=20*uniqueId=20=3D=20CLEANUP_DEVICE_ID([device=20uniqueID]);=0A= +=20=20=20=20=20=20=20=20=20=20=20=20if=20(!strncmp(ctx->video_filename,=20= uniqueId,=20strlen(ctx->video_filename)))=20{=0A=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20video_device=20=3D=20device;=0A=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20break;=0A=20=20=20=20=20=20=20=20=20=20=20= =20=20}=0A=20=20=20=20=20=20=20=20=20}=0A=20=20=20=20=20=20=20=20=20//=20= looking=20for=20muxed=20inputs=0A=20=20=20=20=20=20=20=20=20for=20= (AVCaptureDevice=20*device=20in=20devices_muxed)=20{=0A-=20=20=20=20=20=20= =20=20=20=20=20=20if=20(!strncmp(ctx->video_filename,=20[[device=20= localizedName]=20UTF8String],=20strlen(ctx->video_filename)))=20{=0A+=20=20= =20=20=20=20=20=20=20=20=20=20const=20char=20*name=20=3D=20[[device=20= localizedName]=20UTF8String];=0A+=20=20=20=20=20=20=20=20=20=20=20=20if=20= (!strncmp(ctx->video_filename,=20name,=20strlen(ctx->video_filename)))=20= {=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20video_device=20=3D=20= device;=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= ctx->video_is_muxed=20=3D=201;=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20break;=0A+=20=20=20=20=20=20=20=20=20=20=20=20}=0A+=0A+=20=20=20= =20=20=20=20=20=20=20=20=20const=20char=20*uniqueId=20=3D=20= CLEANUP_DEVICE_ID([device=20uniqueID]);=0A+=20=20=20=20=20=20=20=20=20=20= =20=20if=20(!strncmp(ctx->video_filename,=20uniqueId,=20= strlen(ctx->video_filename)))=20{=0A=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20video_device=20=3D=20device;=0A=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20ctx->video_is_muxed=20=3D=201;=0A=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20break;=0A@@=20-814,10=20+834,23=20@@=20= static=20int=20avf_read_header(AVFormatContext=20*s)=0A=20=20=20=20=20=20= =20=20=20//=20looking=20for=20screen=20inputs=0A=20=20=20=20=20=20=20=20=20= if=20(!video_device)=20{=0A=20=20=20=20=20=20=20=20=20=20=20=20=20int=20= idx;=0A+=20=20=20=20=20=20=20=20=20=20=20=20CGDirectDisplayID=20= screens[num_screens];=0A+=20=20=20=20=20=20=20=20=20=20=20=20= CGGetActiveDisplayList(num_screens,=20screens,=20&num_screens);=0A+=20=20= =20=20=20=20=20=20=20=20=20=20AVCaptureScreenInput*=20= capture_screen_input=20=3D=20NULL;=0A+=0A=20=20=20=20=20=20=20=20=20=20=20= =20=20if(sscanf(ctx->video_filename,=20"Capture=20screen=20%d",=20&idx)=20= &&=20idx=20<=20num_screens)=20{=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20CGDirectDisplayID=20screens[num_screens];=0A-=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20CGGetActiveDisplayList(num_screens,=20= screens,=20&num_screens);=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20AVCaptureScreenInput*=20capture_screen_input=20=3D=20= [[[AVCaptureScreenInput=20alloc]=20initWithDisplayID:screens[idx]]=20= autorelease];=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= capture_screen_input=20=3D=20[[[AVCaptureScreenInput=20alloc]=20= initWithDisplayID:screens[idx]]=20autorelease];=0A+=20=20=20=20=20=20=20=20= =20=20=20=20}=0A+=0A+=20=20=20=20=20=20=20=20=20=20=20=20= if(sscanf(ctx->video_filename,=20"AvfilterAvfoundationCaptureScreen%d",=20= &idx))=20{=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20for=20(int=20= i=20=3D=200;=20i=20<=20num_screens;=20i++)=20{=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20if=20(screens[i]=20=3D=3D=20idx)=20{=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= capture_screen_input=20=3D=20[[[AVCaptureScreenInput=20alloc]=20= initWithDisplayID:idx]=20autorelease];=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20}=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20}=0A+=20=20=20=20=20=20=20=20=20=20=20=20}=0A+=0A+=20=20=20=20=20=20= =20=20=20=20=20=20if=20(capture_screen_input)=20{=0A=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20video_device=20=3D=20(AVCaptureDevice*)=20= capture_screen_input;=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= ctx->video_device_index=20=3D=20ctx->num_video_devices=20+=20idx;=0A=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20ctx->video_is_screen=20=3D=20= 1;=0A@@=20-868,7=20+901,14=20@@=20static=20int=20= avf_read_header(AVFormatContext=20*s)=0A=20=20=20=20=20=20=20=20=20= NSArray=20*devices=20=3D=20[AVCaptureDevice=20= devicesWithMediaType:AVMediaTypeAudio];=0A=20=0A=20=20=20=20=20=20=20=20=20= for=20(AVCaptureDevice=20*device=20in=20devices)=20{=0A-=20=20=20=20=20=20= =20=20=20=20=20=20if=20(!strncmp(ctx->audio_filename,=20[[device=20= localizedName]=20UTF8String],=20strlen(ctx->audio_filename)))=20{=0A+=20=20= =20=20=20=20=20=20=20=20=20=20const=20char=20*name=20=3D=20[[device=20= localizedName]=20UTF8String];=0A+=20=20=20=20=20=20=20=20=20=20=20=20if=20= (!strncmp(ctx->audio_filename,=20name,=20strlen(ctx->audio_filename)))=20= {=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20audio_device=20=3D=20= device;=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20break;=0A+=20=20= =20=20=20=20=20=20=20=20=20=20}=0A+=0A+=20=20=20=20=20=20=20=20=20=20=20=20= const=20char=20*uniqueId=20=3D=20CLEANUP_DEVICE_ID([device=20uniqueID]);=0A= +=20=20=20=20=20=20=20=20=20=20=20=20if=20(!strncmp(ctx->audio_filename,=20= uniqueId,=20strlen(ctx->audio_filename)))=20{=0A=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20audio_device=20=3D=20device;=0A=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20break;=0A=20=20=20=20=20=20=20=20=20=20=20= =20=20}=0A--=20=0A2.32.0=20(Apple=20Git-132)=0A=0A= --Apple-Mail=_D28B81D5-4D6B-4988-852C-8E3133B2507D Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". --Apple-Mail=_D28B81D5-4D6B-4988-852C-8E3133B2507D--