220 26133 <CAOU91OOHbnRDM0u2mcp-U04y85WvW7wbLr7xvR4zGBNG=7wfUg@mail.gmail.com> article
Path: news.gmane.org!not-for-mail
From: =?UTF-8?Q?Klaim_=2D_Jo=C3=ABl_Lamotte?= <mjklaim@gmail.com>
Newsgroups: gmane.comp.lang.c++.isocpp.proposals
Subject: Re: Any interest to adding audio support to the std library?
Date: Fri, 3 Jun 2016 12:46:28 +0200
Lines: 821
Approved: news@gmane.org
Message-ID: <CAOU91OOHbnRDM0u2mcp-U04y85WvW7wbLr7xvR4zGBNG=7wfUg@mail.gmail.com>
References: <f490fd21-cf07-4d7b-8936-c71c97a1ab9d@isocpp.org>
Reply-To: std-proposals@isocpp.org
NNTP-Posting-Host: plane.gmane.org
Mime-Version: 1.0
Content-Type: multipart/alternative; boundary=001a11442370639c4a05345d6fb9
X-Trace: ger.gmane.org 1464950805 20322 80.91.229.3 (3 Jun 2016 10:46:45 GMT)
X-Complaints-To: usenet@ger.gmane.org
NNTP-Posting-Date: Fri, 3 Jun 2016 10:46:45 +0000 (UTC)
To: std-proposals@isocpp.org
Original-X-From: std-proposals+bncBD3NR2WQQ4IBBBWAYW5AKGQE5QCG4QA@isocpp.org Fri Jun 03 12:46:35 2016
Return-path: <std-proposals+bncBD3NR2WQQ4IBBBWAYW5AKGQE5QCG4QA@isocpp.org>
Envelope-to: gclcip-std-proposals@m.gmane.org
Original-Received: from mail-lf0-f69.google.com ([209.85.215.69])
	by plane.gmane.org with esmtp (Exim 4.69)
	(envelope-from <std-proposals+bncBD3NR2WQQ4IBBBWAYW5AKGQE5QCG4QA@isocpp.org>)
	id 1b8mca-00051e-Uv
	for gclcip-std-proposals@m.gmane.org; Fri, 03 Jun 2016 12:46:33 +0200
Original-Received: by mail-lf0-f69.google.com with SMTP id 132sf35907959lfz.3
        for <gclcip-std-proposals@m.gmane.org>; Fri, 03 Jun 2016 03:46:32 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=isocpp-org.20150623.gappssmtp.com; s=20150623;
        h=mime-version:in-reply-to:references:from:date:message-id:subject:to
         :x-original-sender:x-original-authentication-results:reply-to
         :precedence:mailing-list:list-id:x-spam-checked-in-group:list-post
         :list-help:list-archive:list-subscribe:list-unsubscribe;
        bh=nFd/CzgKknI2bzSW5it1IFSqMWGnFsK4zuHHzN/DM3A=;
        b=NS63dJ/7HoEGn8Satmo1StyRa0Ew2jA/Es/6BUxNPooUHNYohLC2CH16LOvuQCMOf8
         KICU06sbIIOKk/MXOCZkWPuTnulCd9xcfvP80yeYlcN1wO/MbDL0ev50zb+oxTM0Q/9A
         vbe/K+NKO/5kMFPtOiED46UqLjZXK1u1lIixY2NOwPLN4EZP+lS52xsM4k/mtBXbDNB4
         QXhhhpVOT8mPw6qvDNQoAKaRgZPFBvzkG+S3f756X3vGqNWnN++KV0Hmz9cDhOJEvzY8
         bpL/FiyfGmEJC7PKc8Jw+SXWRs/viXNGfEPQNYOU/pc+9J0Mg/B6QaUgx29/brXKcwGt
         OeBg==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=1e100.net; s=20130820;
        h=x-gm-message-state:mime-version:in-reply-to:references:from:date
         :message-id:subject:to:x-original-sender
         :x-original-authentication-results:reply-to:precedence:mailing-list
         :list-id:x-spam-checked-in-group:list-post:list-help:list-archive
         :list-subscribe:list-unsubscribe;
        bh=nFd/CzgKknI2bzSW5it1IFSqMWGnFsK4zuHHzN/DM3A=;
        b=WEBRWhDw87YBn9mQcjUl76paedLffgiISPkCHe8KfAht8dFHFAxS65kzR5wXhSl+2j
         cdmpSzC+Qj2Wu5qG5Tm6onzNWzyHwwYB5XUhOAJPTdtvMPvKTYJ5uoUCZn33jgfDtVDJ
         pMNIXNV9PC4rF+MqDuk/QyHuCwHSx8QbT8ocZqJ5DEyrCrTfhmq9nIiYbTWatRrzTzMZ
         PP+X22elB3K/OHl2s+LtEtWn/Ssxct0oZntqoxEzIl82509ynrNDXG4q/2WlgU2TLtkk
         BfCKdWwCGmQnXOr6TK8O3RUHjv77M8GO3pLM1xxWJCKHjz5cep4xtH01WyTqnlZlYb/H
         wEQA==
X-Gm-Message-State: ALyK8tLGjtvhUq5LCu59awVdCl+p9UR5obf3v2Q+o0uS3TVHHf00xGC3q+09kOZlXmVU2Q==
X-Received: by 10.46.1.156 with SMTP id f28mr439664lji.6.1464950792332;
        Fri, 03 Jun 2016 03:46:32 -0700 (PDT)
X-BeenThere: std-proposals@isocpp.org
Original-Received: by 10.28.29.209 with SMTP id d200ls284204wmd.20.gmail; Fri, 03 Jun
 2016 03:46:30 -0700 (PDT)
X-Received: by 10.194.104.102 with SMTP id gd6mr2779711wjb.170.1464950790275;
        Fri, 03 Jun 2016 03:46:30 -0700 (PDT)
Original-Received: from mail-wm0-x22d.google.com (mail-wm0-x22d.google.com. [2a00:1450:400c:c09::22d])
        by mx.google.com with ESMTPS id cb2si6795942wjc.188.2016.06.03.03.46.30
        for <std-proposals@isocpp.org>
        (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
        Fri, 03 Jun 2016 03:46:30 -0700 (PDT)
Received-SPF: pass (google.com: domain of mjklaim@gmail.com designates 2a00:1450:400c:c09::22d as permitted sender) client-ip=2a00:1450:400c:c09::22d;
Original-Received: by mail-wm0-x22d.google.com with SMTP id z87so103162252wmh.0
        for <std-proposals@isocpp.org>; Fri, 03 Jun 2016 03:46:30 -0700 (PDT)
X-Received: by 10.28.170.197 with SMTP id t188mr32429332wme.84.1464950788953;
 Fri, 03 Jun 2016 03:46:28 -0700 (PDT)
Original-Received: by 10.195.19.35 with HTTP; Fri, 3 Jun 2016 03:46:28 -0700 (PDT)
In-Reply-To: <f490fd21-cf07-4d7b-8936-c71c97a1ab9d@isocpp.org>
X-Original-Sender: mjklaim@gmail.com
X-Original-Authentication-Results: mx.google.com;       dkim=pass
 header.i=@gmail.com;       spf=pass (google.com: domain of mjklaim@gmail.com
 designates 2a00:1450:400c:c09::22d as permitted sender) smtp.mailfrom=mjklaim@gmail.com;
       dmarc=pass (p=NONE dis=NONE) header.from=gmail.com
Precedence: list
Mailing-list: list std-proposals@isocpp.org; contact std-proposals+owners@isocpp.org
List-ID: <std-proposals.isocpp.org>
X-Spam-Checked-In-Group: std-proposals@isocpp.org
X-Google-Group-Id: 399137483710
List-Post: <https://groups.google.com/a/isocpp.org/group/std-proposals/post>, <mailto:std-proposals@isocpp.org>
List-Help: <https://support.google.com/a/isocpp.org/bin/topic.py?topic=25838>, <mailto:std-proposals+help@isocpp.org>
List-Archive: <https://groups.google.com/a/isocpp.org/group/std-proposals/>
List-Subscribe: <https://groups.google.com/a/isocpp.org/group/std-proposals/subscribe>,
 <mailto:std-proposals+subscribe@isocpp.org>
List-Unsubscribe: <mailto:googlegroups-manage+399137483710+unsubscribe@googlegroups.com>,
 <https://groups.google.com/a/isocpp.org/group/std-proposals/subscribe>
Xref: news.gmane.org gmane.comp.lang.c++.isocpp.proposals:26133
Archived-At: <http://permalink.gmane.org/gmane.comp.lang.c++.isocpp.proposals/26133>

--001a11442370639c4a05345d6fb9
Content-Type: text/plain; charset=UTF-8

You might want to forward this at least to SG13 (HMI group).



On 3 June 2016 at 11:37, <alexander.zywicki@gmail.com> wrote:

> I have drafted some ideas on how I think the c++ std library could support
> audio functionality.
>
> I know that audio functionality is a very operating specific problem, but
> with the recent trend towards implementing a file-system library and
> possibly a graphics library I believe that audio would not be too much of a
> reach anymore.
>
> Here are some of the ideas I have so far. I have both some code examples
> of the intended usage as well as a list of the types needed to implement
> the given examples.
>
> Please keep in mind my drafts are still very rough.
>
>
> CODE EXAMPLES
>
> //std::audio example 1 "single process"
> void example_1(){
>     double sample_rate = 44100;
>     std::size_t frame_size =2;
>     std::size_t buffer_size=128;
>
>     std::audio_context<float> ctx{sample_rate,buffer_size,frame_size};//contruct
> from values
>
>     std::astream_process<float> proc(ctx,[](std::iastream const& input,
> std::oastream& output){
>         std::frame_buffer<float>& buff = ctx.borrow_buffer();//borrow a
> buffer from the context for usage
>         //prevents the need for dynamic allocation of a temporary buffer
>         input>>buff;//stream data into buffer for manipulation
>         for(auto&& frame: buff){
>             frame=0.0;//do something with audio
>         }
>         output<<buff;//stream to output
>     });//dsp object
>     //uses implied routing equivilent to
>     //std::aout<<proc<<std::ain;
>     //
>
>     proc.start();
>     //do other stuff
>     proc.stop();
> }
>
> //std::audio example 2 "process group"
> void example_2(){
>
>     std::audio_context<float> ctx;//default context created with
> std::default_* values
>
>     //version 1: capture context via lambda
>     std::astream_process<float> proc1(ctx,[&ctx](std::iastream const&
> input, std::oastream& output){
>         std::frame_buffer<float>& buff = ctx.borrow_buffer();
>         input>>buff;
>         for(auto&& frame: buff){
>             frame*=0.5;
>         }
>         output<<buff;
>     });//dsp object
>
>     //version 2: have context passed as argument
>     std::astream_process<float> proc2(ctx,[](std::iastream const& input,
> std::oastream& output,std::audio_context<float> const& context){
>         std::frame_buffer<float>& buff = ctx.borrow_buffer();
>         input>>buff;
>         for(auto&& frame: buff){
>             frame*=2.0;
>         }
>         output<<buff;
>     });
>
>     std::process_group<float> pgroup;//a group of processes that will
> happen consecutivley
>     pgroup.push(proc1);//add to group
>     pgroup.push(proc2);//add to group
>
>     //configure stream relationships in terms of std::ain / std:aout
> manually
>     //std::ain/std::aout are std::astream globals that refer to the
> default audio inputs and outputs supplied by the context in use
>     //std::ain/std::aout will route the audio to the enpoint specified by
> the context reference held by the process that is streaming the data
>     std::aout<<proc1<<proc2<<std::ain;//method 1
>     //std::ain>>proc2>>proc1>>std::aout;//method 2
>
>     pgroup.start();
>     //do other stuff
>     pgroup.stop();
>
> }
>
>
> //std::audio example 3 "audio files"
> void example_3(){
>
>     std::audio_context<float> ctx;
>
>     std::astream_process<float> proc(ctx,[](std::iafstream const& input,
> std::oafstream& output){
>         std::frame_buffer<float>& buff = ctx.borrow_buffer();
>         input>>buff;
>         for(auto&& frame: buff){
>             frame=0.0;
>         }
>         output<<buff;
>     });//dsp object
>
>     std::iafstream audio_file1(ctx,"filename1.extension");//an audio file
> handle
>     std::oafstream audio_file2(ctx,"filename2.extension");//an audio file
> handle
>
>     //routing
>     audio_file2<<proc<<audio_file1;//take input from file nad write to
> file
>     //audio_file1>>proc>>audio_file2;//equivilent syntax
>     proc.start();
>     //do other stuff
>     proc.stop();
> }
>
>
> //std::audio example 4 "combination routing"
> void example_3(){
>
>     std::audio_context<float> ctx;
>     //manually select hardware endpoints
>     std::size_t device_id = ctx.default_device_id();
>     std::iastream input_device = ctx.get_device<std::input_device>(
> device_id);
>     std::oastream output_device = ctx.get_device<std::output_device>(
> device_id);
>
>     std::astream_process<float> proc(ctx,[](std::iastream const& input,
>                                             std::oastream& output,
>                                             std::iafstream const&
> input_file,
>                                              std::oafstream& output_file){
>         std::frame_buffer<float>& buff = ctx.borrow_buffer();
>         (input + input_file)>>buff;//add streams to perform sum before
> writing to buffer
>         //or you could use seperate buffers
>         //like this
>         /*
>             std::frame_buffer<float> buff1;
>             std::frame_buffer<float> buff2;
>
>             input>>buff1;
>             input_file>>buff2;
>             buff1+=buff2;//buffer arithmatic
>         */
>         output<<buff;//send the contents of buff to the hardware out and
> the file out
>         output_file<<buff;
>     });
>
>     std::iafstream audio_file1(ctx,"filename1.extension");//the actual
> files to be used above
>     std::oafstream audio_file2(ctx,"filename2.extension");
>
>     //connect the files to the process
>     //connect the hardware device to the process
>     audio_file2<<proc<<audio_file1;//take input from file
>     output_device<<proc<<input_device;//also take from hardware
>     proc.start();
>     //do other stuff
>     proc.stop();
> }
>
>
>
> REQUIRED LIBRARY MEMBERS
>
>
> namespace std{
>     inline namespace audio{
>         //working context for audio flow
>         template<typename>
>         class audio_context;
>         /*
>         *The context in which all audio data is centered.
>         *Contains: sampling rate, buffer size, frame size, etc...
>         *The values of ain,aout,afin,afout refer to the endpoints defined
> by the context, when applied to routing on a porocess tied to the context
>         *think of a context as the program level driver object
>         */
>
>         //audio streams (think like std::fstream and its friends)
>         class astream;//audio stream
>         class oastream;//output audio stream
>         class iastream;//input audio stream
>         class oafstream;//output audio file stream
>         class iafstream;//input audio file stream
>
>
>         //stream endpoints
>         class ain;//audio input endpoint
>         class aout;//audio output endpoint
>         class afin;//audio file input endpoint
>         class afout//audio file output endpoint
>
>         //stream processing
>         template<typename>
>         class astream_process;//a dsp process applied to a stream
>
>         template<typename>
>         class process_group;//a group of processes that will act as one
>
>         //containers
>         template<typename>
>         class frame_buffer;//a sequence container that is resizeable at
> runtime, but only with explicit resize calls. contains frames(see below)
>         /*Implementation note on frame_buffer
>          *frame_buffer is intended to hold N number of frames which
> themselves can hold M number of samples
>          *meaning that the total size in samples if frame_buffer = N * M
>          *ideally frame_buffers representation of its sample data will be
> continuous in memory
>         */
>
>         template<typename>
>         class frame;//a container that holds samples, thin array wrapper
>
>
>         //hardware representation
>         class device;//an audio device as recognized by the OS
>         class input_device;//an input device
>         class output_device;//an output device
>
>         // audio file formats
>         enum class afformat{
>             raw,//raw headerless audio bytes, interpreted only by the
> settings of the context.
>             //best used for temporary storage within the life of a context
>             wav,
>             flac//etc...
>         }
>     }
> }
>
>
>
> --
> You received this message because you are subscribed to the Google Groups
> "ISO C++ Standard - Future Proposals" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to std-proposals+unsubscribe@isocpp.org.
> To post to this group, send email to std-proposals@isocpp.org.
> To view this discussion on the web visit
> https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/f490fd21-cf07-4d7b-8936-c71c97a1ab9d%40isocpp.org
> <https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/f490fd21-cf07-4d7b-8936-c71c97a1ab9d%40isocpp.org?utm_medium=email&utm_source=footer>
> .
>

-- 
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CAOU91OOHbnRDM0u2mcp-U04y85WvW7wbLr7xvR4zGBNG%3D7wfUg%40mail.gmail.com.

--001a11442370639c4a05345d6fb9
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr">You might want to forward this at least to SG13 (HMI group=
).<div><br></div><div><br></div></div><div class=3D"gmail_extra"><br><div c=
lass=3D"gmail_quote">On 3 June 2016 at 11:37,  <span dir=3D"ltr">&lt;<a hre=
f=3D"mailto:alexander.zywicki@gmail.com" target=3D"_blank">alexander.zywick=
i@gmail.com</a>&gt;</span> wrote:<br><blockquote class=3D"gmail_quote" styl=
e=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div di=
r=3D"ltr">I have drafted some ideas on how I think the c++ std library coul=
d support audio functionality. <br><br>I know that audio functionality is a=
 very operating specific problem, but with the recent trend towards impleme=
nting a file-system library and possibly a graphics library I believe that =
audio would not be too much of a reach anymore.<br><br>Here are some of the=
 ideas I have so far. I have both some code examples of the intended usage =
as well as a list of the types needed to implement the given examples.<br><=
br>Please keep in mind my drafts are still very rough.<br><br><br>CODE EXAM=
PLES<br><br><div style=3D"background-color:rgb(250,250,250);border-color:rg=
b(187,187,187);border-style:solid;border-width:1px;word-wrap:break-word"><c=
ode><div><span style=3D"color:#800">//std::audio example 1 &quot;single pro=
cess&quot;</span><span style=3D"color:#000"><br></span><span style=3D"color=
:#008">void</span><span style=3D"color:#000"> example_1</span><span style=
=3D"color:#660">()</span><span style=3D"color:#660">{</span><span style=3D"=
color:#000"><br>=C2=A0 =C2=A0 </span><span style=3D"color:#008">double</spa=
n><span style=3D"color:#000"> sample_rate </span><span style=3D"color:#660"=
>=3D</span><span style=3D"color:#000"> </span><span style=3D"color:#066">44=
100</span><span style=3D"color:#660">;</span><span style=3D"color:#000"><br=
>=C2=A0 =C2=A0 std</span><span style=3D"color:#660">::</span><span style=3D=
"color:#000">size_t frame_size </span><span style=3D"color:#660">=3D</span>=
<span style=3D"color:#066">2</span><span style=3D"color:#660">;</span><span=
 style=3D"color:#000"><br>=C2=A0 =C2=A0 std</span><span style=3D"color:#660=
">::</span><span style=3D"color:#000">size_t buffer_size</span><span style=
=3D"color:#660">=3D</span><span style=3D"color:#066">128</span><span style=
=3D"color:#660">;</span><span style=3D"color:#000"><br><br>=C2=A0 =C2=A0 st=
d</span><span style=3D"color:#660">::</span><span style=3D"color:#000">audi=
o_context</span><span style=3D"color:#080">&lt;float&gt;</span><span style=
=3D"color:#000"> ctx</span><span style=3D"color:#660">{</span><span style=
=3D"color:#000">sample_rate</span><span style=3D"color:#660">,</span><span =
style=3D"color:#000">buffer_size</span><span style=3D"color:#660">,</span><=
span style=3D"color:#000">frame_size</span><span style=3D"color:#660">};</s=
pan><span style=3D"color:#800">//contruct from values</span><span style=3D"=
color:#000"><br><br>=C2=A0 =C2=A0 std</span><span style=3D"color:#660">::</=
span><span style=3D"color:#000">astream_process</span><span style=3D"color:=
#080">&lt;float&gt;</span><span style=3D"color:#000"> proc</span><span styl=
e=3D"color:#660">(</span><span style=3D"color:#000">ctx</span><span style=
=3D"color:#660">,[](</span><span style=3D"color:#000">std</span><span style=
=3D"color:#660">::</span><span style=3D"color:#000">iastream </span><span s=
tyle=3D"color:#008">const</span><span style=3D"color:#660">&amp;</span><spa=
n style=3D"color:#000"> input</span><span style=3D"color:#660">,</span><spa=
n style=3D"color:#000"> std</span><span style=3D"color:#660">::</span><span=
 style=3D"color:#000">oastream</span><span style=3D"color:#660">&amp;</span=
><span style=3D"color:#000"> output</span><span style=3D"color:#660">){</sp=
an><span style=3D"color:#000"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 std</span><sp=
an style=3D"color:#660">::</span><span style=3D"color:#000">frame_buffer</s=
pan><span style=3D"color:#080">&lt;float&gt;</span><span style=3D"color:#66=
0">&amp;</span><span style=3D"color:#000"> buff </span><span style=3D"color=
:#660">=3D</span><span style=3D"color:#000"> ctx</span><span style=3D"color=
:#660">.</span><span style=3D"color:#000">borrow_buffer</span><span style=
=3D"color:#660">();</span><span style=3D"color:#800">//borrow a buffer from=
 the context for usage</span><span style=3D"color:#000"><br>=C2=A0 =C2=A0 =
=C2=A0 =C2=A0 </span><span style=3D"color:#800">//prevents the need for dyn=
amic allocation of a temporary buffer</span><span style=3D"color:#000"><br>=
=C2=A0 =C2=A0 =C2=A0 =C2=A0 input</span><span style=3D"color:#660">&gt;&gt;=
</span><span style=3D"color:#000">buff</span><span style=3D"color:#660">;</=
span><span style=3D"color:#800">//stream data into buffer for manipulation<=
/span><span style=3D"color:#000"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 </span><sp=
an style=3D"color:#008">for</span><span style=3D"color:#660">(</span><span =
style=3D"color:#008">auto</span><span style=3D"color:#660">&amp;&amp;</span=
><span style=3D"color:#000"> frame</span><span style=3D"color:#660">:</span=
><span style=3D"color:#000"> buff</span><span style=3D"color:#660">){</span=
><span style=3D"color:#000"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 f=
rame</span><span style=3D"color:#660">=3D</span><span style=3D"color:#066">=
0.0</span><span style=3D"color:#660">;</span><span style=3D"color:#800">//d=
o something with audio</span><span style=3D"color:#000"><br>=C2=A0 =C2=A0 =
=C2=A0 =C2=A0 </span><span style=3D"color:#660">}</span><span style=3D"colo=
r:#000"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 output</span><span style=3D"color:#=
660">&lt;&lt;</span><span style=3D"color:#000">buff</span><span style=3D"co=
lor:#660">;</span><span style=3D"color:#800">//stream to output</span><span=
 style=3D"color:#000"><br>=C2=A0 =C2=A0 </span><span style=3D"color:#660">}=
);</span><span style=3D"color:#800">//dsp object</span><span style=3D"color=
:#000"><br>=C2=A0 =C2=A0 </span><span style=3D"color:#800">//uses implied r=
outing equivilent to</span><span style=3D"color:#000"><br>=C2=A0 =C2=A0 </s=
pan><span style=3D"color:#800">//std::aout&lt;&lt;proc&lt;&lt;std::ain;</sp=
an><span style=3D"color:#000"><br>=C2=A0 =C2=A0 </span><span style=3D"color=
:#800">//</span><span style=3D"color:#000"><br><br>=C2=A0 =C2=A0 proc</span=
><span style=3D"color:#660">.</span><span style=3D"color:#000">start</span>=
<span style=3D"color:#660">();</span><span style=3D"color:#000"><br>=C2=A0 =
=C2=A0 </span><span style=3D"color:#800">//do other stuff</span><span style=
=3D"color:#000"><br>=C2=A0 =C2=A0 proc</span><span style=3D"color:#660">.</=
span><span style=3D"color:#000">stop</span><span style=3D"color:#660">();</=
span><span style=3D"color:#000"><br></span><span style=3D"color:#660">}</sp=
an><span style=3D"color:#000"><br><br></span><span style=3D"color:#800">//s=
td::audio example 2 &quot;process group&quot;</span><span style=3D"color:#0=
00"><br></span><span style=3D"color:#008">void</span><span style=3D"color:#=
000"> example_2</span><code><span style=3D"color:#660">()</span><span style=
=3D"color:#660"></span></code><span style=3D"color:#660">{</span><span styl=
e=3D"color:#000"><br><br>=C2=A0 =C2=A0 std</span><span style=3D"color:#660"=
>::</span><span style=3D"color:#000">audio_context</span><span style=3D"col=
or:#080">&lt;float&gt;</span><span style=3D"color:#000"> ctx</span><span st=
yle=3D"color:#660">;</span><span style=3D"color:#800">//default context cre=
ated with std::default_* values</span><span style=3D"color:#000"><br><br>=
=C2=A0 =C2=A0 </span><span style=3D"color:#800">//version 1: capture contex=
t via lambda</span><span style=3D"color:#000"><br>=C2=A0 =C2=A0 std</span><=
span style=3D"color:#660">::</span><span style=3D"color:#000">astream_proce=
ss</span><span style=3D"color:#080">&lt;float&gt;</span><span style=3D"colo=
r:#000"> proc1</span><span style=3D"color:#660">(</span><span style=3D"colo=
r:#000">ctx</span><span style=3D"color:#660">,[&amp;</span><span style=3D"c=
olor:#000">ctx</span><span style=3D"color:#660">](</span><span style=3D"col=
or:#000">std</span><span style=3D"color:#660">::</span><span style=3D"color=
:#000">iastream </span><span style=3D"color:#008">const</span><span style=
=3D"color:#660">&amp;</span><span style=3D"color:#000"> input</span><span s=
tyle=3D"color:#660">,</span><span style=3D"color:#000"> std</span><span sty=
le=3D"color:#660">::</span><span style=3D"color:#000">oastream</span><span =
style=3D"color:#660">&amp;</span><span style=3D"color:#000"> output</span><=
span style=3D"color:#660">){</span><span style=3D"color:#000"><br>=C2=A0 =
=C2=A0 =C2=A0 =C2=A0 std</span><span style=3D"color:#660">::</span><span st=
yle=3D"color:#000">frame_buffer</span><span style=3D"color:#080">&lt;float&=
gt;</span><span style=3D"color:#660">&amp;</span><span style=3D"color:#000"=
> buff </span><span style=3D"color:#660">=3D</span><span style=3D"color:#00=
0"> ctx</span><span style=3D"color:#660">.</span><span style=3D"color:#000"=
>borrow_buffer</span><span style=3D"color:#660">();</span><span style=3D"co=
lor:#000"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 input</span><span style=3D"color:=
#660">&gt;&gt;</span><span style=3D"color:#000">buff</span><span style=3D"c=
olor:#660">;</span><span style=3D"color:#000"><br>=C2=A0 =C2=A0 =C2=A0 =C2=
=A0 </span><span style=3D"color:#008">for</span><span style=3D"color:#660">=
(</span><span style=3D"color:#008">auto</span><span style=3D"color:#660">&a=
mp;&amp;</span><span style=3D"color:#000"> frame</span><span style=3D"color=
:#660">:</span><span style=3D"color:#000"> buff</span><span style=3D"color:=
#660">){</span><span style=3D"color:#000"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 frame</span><span style=3D"color:#660">*=3D</span><span style=
=3D"color:#066">0.5</span><span style=3D"color:#660">;</span><span style=3D=
"color:#000"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 </span><span style=3D"color:#6=
60">}</span><span style=3D"color:#000"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 outp=
ut</span><span style=3D"color:#660">&lt;&lt;</span><span style=3D"color:#00=
0">buff</span><span style=3D"color:#660">;</span><span style=3D"color:#000"=
><br>=C2=A0 =C2=A0 </span><span style=3D"color:#660">});</span><span style=
=3D"color:#800">//dsp object</span><span style=3D"color:#000"><br><br>=C2=
=A0 =C2=A0 </span><span style=3D"color:#800">//version 2: have context pass=
ed as argument</span><span style=3D"color:#000"><br>=C2=A0 =C2=A0 std</span=
><span style=3D"color:#660">::</span><span style=3D"color:#000">astream_pro=
cess</span><span style=3D"color:#080">&lt;float&gt;</span><span style=3D"co=
lor:#000"> proc2</span><span style=3D"color:#660">(</span><span style=3D"co=
lor:#000">ctx</span><span style=3D"color:#660">,[](</span><span style=3D"co=
lor:#000">std</span><span style=3D"color:#660">::</span><span style=3D"colo=
r:#000">iastream </span><span style=3D"color:#008">const</span><span style=
=3D"color:#660">&amp;</span><span style=3D"color:#000"> input</span><span s=
tyle=3D"color:#660">,</span><span style=3D"color:#000"> std</span><span sty=
le=3D"color:#660">::</span><span style=3D"color:#000">oastream</span><span =
style=3D"color:#660">&amp;</span><span style=3D"color:#000"> output</span><=
span style=3D"color:#660">,</span><span style=3D"color:#000">std</span><spa=
n style=3D"color:#660">::</span><span style=3D"color:#000">audio_context</s=
pan><span style=3D"color:#080">&lt;float&gt;</span><span style=3D"color:#00=
0"> </span><span style=3D"color:#008">const</span><span style=3D"color:#660=
">&amp;</span><span style=3D"color:#000"> context</span><span style=3D"colo=
r:#660">){</span><span style=3D"color:#000"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0=
 std</span><span style=3D"color:#660">::</span><span style=3D"color:#000">f=
rame_buffer</span><span style=3D"color:#080">&lt;float&gt;</span><span styl=
e=3D"color:#660">&amp;</span><span style=3D"color:#000"> buff </span><span =
style=3D"color:#660">=3D</span><span style=3D"color:#000"> ctx</span><span =
style=3D"color:#660">.</span><span style=3D"color:#000">borrow_buffer</span=
><span style=3D"color:#660">();</span><span style=3D"color:#000"><br>=C2=A0=
 =C2=A0 =C2=A0 =C2=A0 input</span><span style=3D"color:#660">&gt;&gt;</span=
><span style=3D"color:#000">buff</span><span style=3D"color:#660">;</span><=
span style=3D"color:#000"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 </span><span styl=
e=3D"color:#008">for</span><span style=3D"color:#660">(</span><span style=
=3D"color:#008">auto</span><span style=3D"color:#660">&amp;&amp;</span><spa=
n style=3D"color:#000"> frame</span><span style=3D"color:#660">:</span><spa=
n style=3D"color:#000"> buff</span><span style=3D"color:#660">){</span><spa=
n style=3D"color:#000"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 frame<=
/span><span style=3D"color:#660">*=3D</span><span style=3D"color:#066">2.0<=
/span><span style=3D"color:#660">;</span><span style=3D"color:#000"><br>=C2=
=A0 =C2=A0 =C2=A0 =C2=A0 </span><span style=3D"color:#660">}</span><span st=
yle=3D"color:#000"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 output</span><span style=
=3D"color:#660">&lt;&lt;</span><span style=3D"color:#000">buff</span><span =
style=3D"color:#660">;</span><span style=3D"color:#000"><br>=C2=A0 =C2=A0 <=
/span><span style=3D"color:#660">});</span><span style=3D"color:#000"><br><=
br>=C2=A0 =C2=A0 std</span><span style=3D"color:#660">::</span><span style=
=3D"color:#000">process_group</span><span style=3D"color:#080">&lt;float&gt=
;</span><span style=3D"color:#000"> pgroup</span><span style=3D"color:#660"=
>;</span><span style=3D"color:#800">//a group of processes that will happen=
 consecutivley</span><span style=3D"color:#000"><br>=C2=A0 =C2=A0 pgroup</s=
pan><span style=3D"color:#660">.</span><span style=3D"color:#000">push</spa=
n><span style=3D"color:#660">(</span><span style=3D"color:#000">proc1</span=
><span style=3D"color:#660">);</span><span style=3D"color:#800">//add to gr=
oup</span><span style=3D"color:#000"><br>=C2=A0 =C2=A0 pgroup</span><span s=
tyle=3D"color:#660">.</span><span style=3D"color:#000">push</span><span sty=
le=3D"color:#660">(</span><span style=3D"color:#000">proc2</span><span styl=
e=3D"color:#660">);</span><span style=3D"color:#800">//add to group</span><=
span style=3D"color:#000"><br><br>=C2=A0 =C2=A0 </span><span style=3D"color=
:#800">//configure stream relationships in terms of std::ain / std:aout man=
ually</span><span style=3D"color:#000"><br>=C2=A0 =C2=A0 </span><span style=
=3D"color:#800">//std::ain/std::aout are std::astream globals that refer to=
 the default audio inputs and outputs supplied by the context in use</span>=
<span style=3D"color:#000"><br>=C2=A0 =C2=A0 </span><span style=3D"color:#8=
00">//std::ain/std::aout will route the audio to the enpoint specified by t=
he context reference held by the process that is streaming the data</span><=
span style=3D"color:#000"><br>=C2=A0 =C2=A0 std</span><span style=3D"color:=
#660">::</span><span style=3D"color:#000">aout</span><span style=3D"color:#=
660">&lt;&lt;</span><span style=3D"color:#000">proc1</span><span style=3D"c=
olor:#660">&lt;&lt;</span><span style=3D"color:#000">proc2</span><span styl=
e=3D"color:#660">&lt;&lt;</span><span style=3D"color:#000">std</span><span =
style=3D"color:#660">::</span><span style=3D"color:#000">ain</span><span st=
yle=3D"color:#660">;</span><span style=3D"color:#800">//method 1</span><spa=
n style=3D"color:#000"><br>=C2=A0 =C2=A0 </span><span style=3D"color:#800">=
//std::ain&gt;&gt;proc2&gt;&gt;proc1&gt;&gt;std::aout;//method 2</span><spa=
n style=3D"color:#000"><br><br>=C2=A0 =C2=A0 pgroup</span><span style=3D"co=
lor:#660">.</span><span style=3D"color:#000">start</span><span style=3D"col=
or:#660">();</span><span style=3D"color:#000"><br>=C2=A0 =C2=A0 </span><spa=
n style=3D"color:#800">//do other stuff</span><span style=3D"color:#000"><b=
r>=C2=A0 =C2=A0 pgroup</span><span style=3D"color:#660">.</span><span style=
=3D"color:#000">stop</span><span style=3D"color:#660">();</span><span style=
=3D"color:#000"><br><br></span><span style=3D"color:#660">}</span><span sty=
le=3D"color:#000"><br><br><br></span><span style=3D"color:#800">//std::audi=
o example 3 &quot;audio files&quot;</span><span style=3D"color:#000"><br></=
span><span style=3D"color:#008">void</span><span style=3D"color:#000"> exam=
ple_3</span><code><span style=3D"color:#660">()</span><span style=3D"color:=
#660"></span></code><span style=3D"color:#660">{</span><span style=3D"color=
:#000"><br><br>=C2=A0 =C2=A0 std</span><span style=3D"color:#660">::</span>=
<span style=3D"color:#000">audio_context</span><span style=3D"color:#080">&=
lt;float&gt;</span><span style=3D"color:#000"> ctx</span><span style=3D"col=
or:#660">;</span><span style=3D"color:#000"><br><br>=C2=A0 =C2=A0 std</span=
><span style=3D"color:#660">::</span><span style=3D"color:#000">astream_pro=
cess</span><span style=3D"color:#080">&lt;float&gt;</span><span style=3D"co=
lor:#000"> proc</span><span style=3D"color:#660">(</span><span style=3D"col=
or:#000">ctx</span><span style=3D"color:#660">,[](</span><span style=3D"col=
or:#000">std</span><span style=3D"color:#660">::</span><span style=3D"color=
:#000">iafstream </span><span style=3D"color:#008">const</span><span style=
=3D"color:#660">&amp;</span><span style=3D"color:#000"> input</span><span s=
tyle=3D"color:#660">,</span><span style=3D"color:#000"> std</span><span sty=
le=3D"color:#660">::</span><span style=3D"color:#000">oafstream</span><span=
 style=3D"color:#660">&amp;</span><span style=3D"color:#000"> output</span>=
<span style=3D"color:#660">){</span><span style=3D"color:#000"><br>=C2=A0 =
=C2=A0 =C2=A0 =C2=A0 std</span><span style=3D"color:#660">::</span><span st=
yle=3D"color:#000">frame_buffer</span><span style=3D"color:#080">&lt;float&=
gt;</span><span style=3D"color:#660">&amp;</span><span style=3D"color:#000"=
> buff </span><span style=3D"color:#660">=3D</span><span style=3D"color:#00=
0"> ctx</span><span style=3D"color:#660">.</span><span style=3D"color:#000"=
>borrow_buffer</span><span style=3D"color:#660">();</span><span style=3D"co=
lor:#000"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 input</span><span style=3D"color:=
#660">&gt;&gt;</span><span style=3D"color:#000">buff</span><span style=3D"c=
olor:#660">;</span><span style=3D"color:#000"><br>=C2=A0 =C2=A0 =C2=A0 =C2=
=A0 </span><span style=3D"color:#008">for</span><span style=3D"color:#660">=
(</span><span style=3D"color:#008">auto</span><span style=3D"color:#660">&a=
mp;&amp;</span><span style=3D"color:#000"> frame</span><span style=3D"color=
:#660">:</span><span style=3D"color:#000"> buff</span><span style=3D"color:=
#660">){</span><span style=3D"color:#000"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 frame</span><span style=3D"color:#660">=3D</span><span style=
=3D"color:#066">0.0</span><span style=3D"color:#660">;</span><span style=3D=
"color:#000"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 </span><span style=3D"color:#6=
60">}</span><span style=3D"color:#000"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 outp=
ut</span><span style=3D"color:#660">&lt;&lt;</span><span style=3D"color:#00=
0">buff</span><span style=3D"color:#660">;</span><span style=3D"color:#000"=
><br>=C2=A0 =C2=A0 </span><span style=3D"color:#660">});</span><span style=
=3D"color:#800">//dsp object</span><span style=3D"color:#000"><br><br>=C2=
=A0 =C2=A0 std</span><span style=3D"color:#660">::</span><span style=3D"col=
or:#000">iafstream audio_file1</span><span style=3D"color:#660">(</span><sp=
an style=3D"color:#000">ctx</span><span style=3D"color:#660">,</span><span =
style=3D"color:#080">&quot;filename1.extension&quot;</span><span style=3D"c=
olor:#660">);</span><span style=3D"color:#800">//an audio file handle</span=
><span style=3D"color:#000"><br>=C2=A0 =C2=A0 std</span><span style=3D"colo=
r:#660">::</span><span style=3D"color:#000">oafstream audio_file2</span><sp=
an style=3D"color:#660">(</span><span style=3D"color:#000">ctx</span><span =
style=3D"color:#660">,</span><span style=3D"color:#080">&quot;filename2.ext=
ension&quot;</span><span style=3D"color:#660">);</span><span style=3D"color=
:#800">//an audio file handle</span><span style=3D"color:#000"><br><br>=C2=
=A0 =C2=A0 </span><span style=3D"color:#800">//routing</span><span style=3D=
"color:#000"><br>=C2=A0 =C2=A0 audio_file2</span><span style=3D"color:#660"=
>&lt;&lt;</span><span style=3D"color:#000">proc</span><span style=3D"color:=
#660">&lt;&lt;</span><span style=3D"color:#000">audio_file1</span><span sty=
le=3D"color:#660">;</span><span style=3D"color:#800">//take input from file=
 nad write to file</span><span style=3D"color:#000"><br>=C2=A0 =C2=A0 </spa=
n><span style=3D"color:#800">//audio_file1&gt;&gt;proc&gt;&gt;audio_file2;/=
/equivilent syntax</span><span style=3D"color:#000"><br>=C2=A0 =C2=A0 proc<=
/span><span style=3D"color:#660">.</span><span style=3D"color:#000">start</=
span><span style=3D"color:#660">();</span><span style=3D"color:#000"><br>=
=C2=A0 =C2=A0 </span><span style=3D"color:#800">//do other stuff</span><spa=
n style=3D"color:#000"><br>=C2=A0 =C2=A0 proc</span><span style=3D"color:#6=
60">.</span><span style=3D"color:#000">stop</span><span style=3D"color:#660=
">();</span><span style=3D"color:#000"><br></span><span style=3D"color:#660=
">}</span><span style=3D"color:#000"><br><br><br></span><span style=3D"colo=
r:#800">//std::audio example 4 &quot;combination routing&quot;</span><span =
style=3D"color:#000"><br></span><span style=3D"color:#008">void</span><span=
 style=3D"color:#000"> example_3</span><span style=3D"color:#660"><code><sp=
an style=3D"color:#660">()</span><span style=3D"color:#660"></span></code>{=
</span><span style=3D"color:#000"><br><br>=C2=A0 =C2=A0 std</span><span sty=
le=3D"color:#660">::</span><span style=3D"color:#000">audio_context</span><=
span style=3D"color:#080">&lt;float&gt;</span><span style=3D"color:#000"> c=
tx</span><span style=3D"color:#660">;</span><span style=3D"color:#000"><br>=
=C2=A0 =C2=A0 </span><span style=3D"color:#800">//manually select hardware =
endpoints</span><span style=3D"color:#000"><br>=C2=A0 =C2=A0 std</span><spa=
n style=3D"color:#660">::</span><span style=3D"color:#000">size_t device_id=
 </span><span style=3D"color:#660">=3D</span><span style=3D"color:#000"> ct=
x</span><span style=3D"color:#660">.</span><span style=3D"color:#000">defau=
lt_device_id</span><span style=3D"color:#660">();</span><span style=3D"colo=
r:#000"><br>=C2=A0 =C2=A0 std</span><span style=3D"color:#660">::</span><sp=
an style=3D"color:#000">iastream input_device </span><span style=3D"color:#=
660">=3D</span><span style=3D"color:#000"> ctx</span><span style=3D"color:#=
660">.</span><span style=3D"color:#000">get_device</span><span style=3D"col=
or:#660">&lt;</span><span style=3D"color:#000">std</span><span style=3D"col=
or:#660">::</span><span style=3D"color:#000">input_device</span><span style=
=3D"color:#660">&gt;(</span><span style=3D"color:#000">device_id</span><spa=
n style=3D"color:#660">);</span><span style=3D"color:#000"><br>=C2=A0 =C2=
=A0 std</span><span style=3D"color:#660">::</span><span style=3D"color:#000=
">oastream output_device </span><span style=3D"color:#660">=3D</span><span =
style=3D"color:#000"> ctx</span><span style=3D"color:#660">.</span><span st=
yle=3D"color:#000">get_device</span><span style=3D"color:#660">&lt;</span><=
span style=3D"color:#000">std</span><span style=3D"color:#660">::</span><sp=
an style=3D"color:#000">output_device</span><span style=3D"color:#660">&gt;=
(</span><span style=3D"color:#000">device_id</span><span style=3D"color:#66=
0">);</span><span style=3D"color:#000"><br><br>=C2=A0 =C2=A0 std</span><spa=
n style=3D"color:#660">::</span><span style=3D"color:#000">astream_process<=
/span><span style=3D"color:#080">&lt;float&gt;</span><span style=3D"color:#=
000"> proc</span><span style=3D"color:#660">(</span><span style=3D"color:#0=
00">ctx</span><span style=3D"color:#660">,[](</span><span style=3D"color:#0=
00">std</span><span style=3D"color:#660">::</span><span style=3D"color:#000=
">iastream </span><span style=3D"color:#008">const</span><span style=3D"col=
or:#660">&amp;</span><span style=3D"color:#000"> input</span><span style=3D=
"color:#660">,</span><span style=3D"color:#000"><br>=C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 std</span><span=
 style=3D"color:#660">::</span><span style=3D"color:#000">oastream</span><s=
pan style=3D"color:#660">&amp;</span><span style=3D"color:#000"> output</sp=
an><span style=3D"color:#660">,</span><span style=3D"color:#000"><br>=C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 s=
td</span><span style=3D"color:#660">::</span><span style=3D"color:#000">iaf=
stream </span><span style=3D"color:#008">const</span><span style=3D"color:#=
660">&amp;</span><span style=3D"color:#000"> input_file</span><span style=
=3D"color:#660">,</span><span style=3D"color:#000"><br>=C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0std</span=
><span style=3D"color:#660">::</span><span style=3D"color:#000">oafstream</=
span><span style=3D"color:#660">&amp;</span><span style=3D"color:#000"> out=
put_file</span><span style=3D"color:#660">){</span><span style=3D"color:#00=
0"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 std</span><span style=3D"color:#660">::<=
/span><span style=3D"color:#000">frame_buffer</span><span style=3D"color:#0=
80">&lt;float&gt;</span><span style=3D"color:#660">&amp;</span><span style=
=3D"color:#000"> buff </span><span style=3D"color:#660">=3D</span><span sty=
le=3D"color:#000"> ctx</span><span style=3D"color:#660">.</span><span style=
=3D"color:#000">borrow_buffer</span><span style=3D"color:#660">();</span><s=
pan style=3D"color:#000"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 </span><span style=
=3D"color:#660">(</span><span style=3D"color:#000">input </span><span style=
=3D"color:#660">+</span><span style=3D"color:#000"> input_file</span><span =
style=3D"color:#660">)&gt;&gt;</span><span style=3D"color:#000">buff</span>=
<span style=3D"color:#660">;</span><span style=3D"color:#800">//add streams=
 to perform sum before writing to buffer</span><span style=3D"color:#000"><=
br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 </span><span style=3D"color:#800">//or you c=
ould use seperate buffers</span><span style=3D"color:#000"><br>=C2=A0 =C2=
=A0 =C2=A0 =C2=A0 </span><span style=3D"color:#800">//like this</span><span=
 style=3D"color:#000"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 </span><span style=3D=
"color:#800">/*<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 std::frame_buf=
fer&lt;float&gt; buff1;<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 std::f=
rame_buffer&lt;float&gt; buff2;<br><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 input&gt;&gt;buff1;<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 inp=
ut_file&gt;&gt;buff2;<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 buff1+=
=3Dbuff2;//buffer arithmatic<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 */</span><span =
style=3D"color:#000"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 output</span><span sty=
le=3D"color:#660">&lt;&lt;</span><span style=3D"color:#000">buff</span><spa=
n style=3D"color:#660">;</span><span style=3D"color:#800">//send the conten=
ts of buff to the hardware out and the file out</span><span style=3D"color:=
#000"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 output_file</span><span style=3D"colo=
r:#660">&lt;&lt;</span><span style=3D"color:#000">buff</span><span style=3D=
"color:#660">;</span><span style=3D"color:#000"><br>=C2=A0 =C2=A0 </span><s=
pan style=3D"color:#660">});</span><span style=3D"color:#000"><br><br>=C2=
=A0 =C2=A0 std</span><span style=3D"color:#660">::</span><span style=3D"col=
or:#000">iafstream audio_file1</span><span style=3D"color:#660">(</span><sp=
an style=3D"color:#000">ctx</span><span style=3D"color:#660">,</span><span =
style=3D"color:#080">&quot;filename1.extension&quot;</span><span style=3D"c=
olor:#660">);</span><span style=3D"color:#800">//the actual files to be use=
d above</span><span style=3D"color:#000"><br>=C2=A0 =C2=A0 std</span><span =
style=3D"color:#660">::</span><span style=3D"color:#000">oafstream audio_fi=
le2</span><span style=3D"color:#660">(</span><span style=3D"color:#000">ctx=
</span><span style=3D"color:#660">,</span><span style=3D"color:#080">&quot;=
filename2.extension&quot;</span><span style=3D"color:#660">);</span><span s=
tyle=3D"color:#000"><br><br>=C2=A0 =C2=A0 </span><span style=3D"color:#800"=
>//connect the files to the process</span><span style=3D"color:#000"><br>=
=C2=A0 =C2=A0 </span><span style=3D"color:#800">//connect the hardware devi=
ce to the process</span><span style=3D"color:#000"><br>=C2=A0 =C2=A0 audio_=
file2</span><span style=3D"color:#660">&lt;&lt;</span><span style=3D"color:=
#000">proc</span><span style=3D"color:#660">&lt;&lt;</span><span style=3D"c=
olor:#000">audio_file1</span><span style=3D"color:#660">;</span><span style=
=3D"color:#800">//take input from file</span><span style=3D"color:#000"><br=
>=C2=A0 =C2=A0 output_device</span><span style=3D"color:#660">&lt;&lt;</spa=
n><span style=3D"color:#000">proc</span><span style=3D"color:#660">&lt;&lt;=
</span><span style=3D"color:#000">input_device</span><span style=3D"color:#=
660">;</span><span style=3D"color:#800">//also take from hardware</span><sp=
an style=3D"color:#000"><br>=C2=A0 =C2=A0 proc</span><span style=3D"color:#=
660">.</span><span style=3D"color:#000">start</span><span style=3D"color:#6=
60">();</span><span style=3D"color:#000"><br>=C2=A0 =C2=A0 </span><span sty=
le=3D"color:#800">//do other stuff</span><span style=3D"color:#000"><br>=C2=
=A0 =C2=A0 proc</span><span style=3D"color:#660">.</span><span style=3D"col=
or:#000">stop</span><span style=3D"color:#660">();</span><span style=3D"col=
or:#000"><br></span><span style=3D"color:#660">}</span></div></code></div><=
br><br><br>REQUIRED LIBRARY MEMBERS<br><br><br><div style=3D"background-col=
or:rgb(250,250,250);border-color:rgb(187,187,187);border-style:solid;border=
-width:1px;word-wrap:break-word"><code><div><span style=3D"color:#008">name=
space</span><span style=3D"color:#000"> std</span><span style=3D"color:#660=
">{</span><span style=3D"color:#000"><br>=C2=A0 =C2=A0 </span><span style=
=3D"color:#008">inline</span><span style=3D"color:#000"> </span><span style=
=3D"color:#008">namespace</span><span style=3D"color:#000"> audio</span><sp=
an style=3D"color:#660">{</span><span style=3D"color:#000"><br>=C2=A0 =C2=
=A0 =C2=A0 =C2=A0 </span><span style=3D"color:#800">//working context for a=
udio flow</span><span style=3D"color:#000"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =
</span><span style=3D"color:#008">template</span><span style=3D"color:#080"=
>&lt;typename&gt;</span><span style=3D"color:#000"><br>=C2=A0 =C2=A0 =C2=A0=
 =C2=A0 </span><span style=3D"color:#008">class</span><span style=3D"color:=
#000"> audio_context</span><span style=3D"color:#660">;</span><span style=
=3D"color:#000"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 </span><span style=3D"color=
:#800">/*<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 *The context in which all audio da=
ta is centered.<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 *Contains: sampling rate, bu=
ffer size, frame size, etc...<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 *The values of=
 ain,aout,afin,afout refer to the endpoints defined by the context, when ap=
plied to routing on a porocess tied to the context<br>=C2=A0 =C2=A0 =C2=A0 =
=C2=A0 *think of a context as the program level driver object<br>=C2=A0 =C2=
=A0 =C2=A0 =C2=A0 */</span><span style=3D"color:#000"><br><br>=C2=A0 =C2=A0=
 =C2=A0 =C2=A0 </span><span style=3D"color:#800">//audio streams (think lik=
e std::fstream and its friends)</span><span style=3D"color:#000"><br>=C2=A0=
 =C2=A0 =C2=A0 =C2=A0 </span><span style=3D"color:#008">class</span><span s=
tyle=3D"color:#000"> astream</span><span style=3D"color:#660">;</span><span=
 style=3D"color:#800">//audio stream</span><span style=3D"color:#000"><br>=
=C2=A0 =C2=A0 =C2=A0 =C2=A0 </span><span style=3D"color:#008">class</span><=
span style=3D"color:#000"> oastream</span><span style=3D"color:#660">;</spa=
n><span style=3D"color:#800">//output audio stream</span><span style=3D"col=
or:#000"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 </span><span style=3D"color:#008">=
class</span><span style=3D"color:#000"> iastream</span><span style=3D"color=
:#660">;</span><span style=3D"color:#800">//input audio stream</span><span =
style=3D"color:#000"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 </span><span style=3D"=
color:#008">class</span><span style=3D"color:#000"> oafstream</span><span s=
tyle=3D"color:#660">;</span><span style=3D"color:#800">//output audio file =
stream</span><span style=3D"color:#000"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 </s=
pan><span style=3D"color:#008">class</span><span style=3D"color:#000"> iafs=
tream</span><span style=3D"color:#660">;</span><span style=3D"color:#800">/=
/input audio file stream</span><span style=3D"color:#000"><br><br><br>=C2=
=A0 =C2=A0 =C2=A0 =C2=A0 </span><span style=3D"color:#800">//stream endpoin=
ts</span><span style=3D"color:#000"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 </span>=
<span style=3D"color:#008">class</span><span style=3D"color:#000"> ain</spa=
n><span style=3D"color:#660">;</span><span style=3D"color:#800">//audio inp=
ut endpoint</span><span style=3D"color:#000"><br>=C2=A0 =C2=A0 =C2=A0 =C2=
=A0 </span><span style=3D"color:#008">class</span><span style=3D"color:#000=
"> aout</span><span style=3D"color:#660">;</span><span style=3D"color:#800"=
>//audio output endpoint</span><span style=3D"color:#000"><br>=C2=A0 =C2=A0=
 =C2=A0 =C2=A0 </span><span style=3D"color:#008">class</span><span style=3D=
"color:#000"> afin</span><span style=3D"color:#660">;</span><span style=3D"=
color:#800">//audio file input endpoint</span><span style=3D"color:#000"><b=
r>=C2=A0 =C2=A0 =C2=A0 =C2=A0 </span><span style=3D"color:#008">class</span=
><span style=3D"color:#000"> afout</span><span style=3D"color:#800">//audio=
 file output endpoint</span><span style=3D"color:#000"><br><br>=C2=A0 =C2=
=A0 =C2=A0 =C2=A0 </span><span style=3D"color:#800">//stream processing</sp=
an><span style=3D"color:#000"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 </span><span =
style=3D"color:#008">template</span><span style=3D"color:#080">&lt;typename=
&gt;</span><span style=3D"color:#000"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 </spa=
n><span style=3D"color:#008">class</span><span style=3D"color:#000"> astrea=
m_process</span><span style=3D"color:#660">;</span><span style=3D"color:#80=
0">//a dsp process applied to a stream</span><span style=3D"color:#000"><br=
><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 </span><span style=3D"color:#008">template=
</span><span style=3D"color:#080">&lt;typename&gt;</span><span style=3D"col=
or:#000"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 </span><span style=3D"color:#008">=
class</span><span style=3D"color:#000"> process_group</span><span style=3D"=
color:#660">;</span><span style=3D"color:#800">//a group of processes that =
will act as one</span><span style=3D"color:#000"><br><br>=C2=A0 =C2=A0 =C2=
=A0 =C2=A0 </span><span style=3D"color:#800">//containers</span><span style=
=3D"color:#000"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 </span><span style=3D"color=
:#008">template</span><span style=3D"color:#080">&lt;typename&gt;</span><sp=
an style=3D"color:#000"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 </span><span style=
=3D"color:#008">class</span><span style=3D"color:#000"> frame_buffer</span>=
<span style=3D"color:#660">;</span><span style=3D"color:#800">//a sequence =
container that is resizeable at runtime, but only with explicit resize call=
s. contains frames(see below)</span><span style=3D"color:#000"><br>=C2=A0 =
=C2=A0 =C2=A0 =C2=A0 </span><span style=3D"color:#800">/*Implementation not=
e on frame_buffer<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0*frame_buffer is int=
ended to hold N number of frames which themselves can hold M number of samp=
les<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0*meaning that the total size in sa=
mples if frame_buffer =3D N * M<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0*ideal=
ly frame_buffers representation of its sample data will be continuous in me=
mory<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 */</span><span style=3D"color:#000"><br=
><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 </span><span style=3D"color:#008">template=
</span><span style=3D"color:#080">&lt;typename&gt;</span><span style=3D"col=
or:#000"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 </span><span style=3D"color:#008">=
class</span><span style=3D"color:#000"> frame</span><span style=3D"color:#6=
60">;</span><span style=3D"color:#800">//a container that holds samples, th=
in array wrapper</span><span style=3D"color:#000"><br><br><br>=C2=A0 =C2=A0=
 =C2=A0 =C2=A0 </span><span style=3D"color:#800">//hardware representation<=
/span><span style=3D"color:#000"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 </span><sp=
an style=3D"color:#008">class</span><span style=3D"color:#000"> device</spa=
n><span style=3D"color:#660">;</span><span style=3D"color:#800">//an audio =
device as recognized by the OS</span><span style=3D"color:#000"><br>=C2=A0 =
=C2=A0 =C2=A0 =C2=A0 </span><span style=3D"color:#008">class</span><span st=
yle=3D"color:#000"> input_device</span><span style=3D"color:#660">;</span><=
span style=3D"color:#800">//an input device</span><span style=3D"color:#000=
"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 </span><span style=3D"color:#008">class</=
span><span style=3D"color:#000"> output_device</span><span style=3D"color:#=
660">;</span><span style=3D"color:#800">//an output device</span><span styl=
e=3D"color:#000"><br><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 </span><span style=3D"=
color:#800">// audio file formats</span><span style=3D"color:#000"><br>=C2=
=A0 =C2=A0 =C2=A0 =C2=A0 </span><span style=3D"color:#008">enum</span><span=
 style=3D"color:#000"> </span><span style=3D"color:#008">class</span><span =
style=3D"color:#000"> afformat</span><span style=3D"color:#660">{</span><sp=
an style=3D"color:#000"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 raw</=
span><span style=3D"color:#660">,</span><span style=3D"color:#800">//raw he=
aderless audio bytes, interpreted only by the settings of the context.</spa=
n><span style=3D"color:#000"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
</span><span style=3D"color:#800">//best used for temporary storage within =
the life of a context</span><span style=3D"color:#000"><br>=C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 wav</span><span style=3D"color:#660">,</span><s=
pan style=3D"color:#000"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 flac=
</span><span style=3D"color:#800">//etc...</span><span style=3D"color:#000"=
><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 </span><span style=3D"color:#660">}</span>=
<span style=3D"color:#000"><br>=C2=A0 =C2=A0 </span><span style=3D"color:#6=
60">}</span><span style=3D"color:#000"><br></span><span style=3D"color:#660=
">}</span></div></code></div><span class=3D"HOEnZb"><font color=3D"#888888"=
><br><br><br></font></span></div><span class=3D"HOEnZb"><font color=3D"#888=
888">

<p></p>

-- <br>
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals&quot; group.<br>
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org" target=3D"_=
blank">std-proposals+unsubscribe@isocpp.org</a>.<br>
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org" target=3D"_blank">std-proposals@isocpp.org</a>.<br>
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/f490fd21-cf07-4d7b-8936-c71c97a1ab9d%=
40isocpp.org?utm_medium=3Demail&amp;utm_source=3Dfooter" target=3D"_blank">=
https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/f490fd21-cf07-=
4d7b-8936-c71c97a1ab9d%40isocpp.org</a>.<br>
</font></span></blockquote></div><br></div>

<p></p>

-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals&quot; group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/CAOU91OOHbnRDM0u2mcp-U04y85WvW7wbLr7x=
vR4zGBNG%3D7wfUg%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfooter">h=
ttps://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CAOU91OOHbnRDM0=
u2mcp-U04y85WvW7wbLr7xvR4zGBNG%3D7wfUg%40mail.gmail.com</a>.<br />

--001a11442370639c4a05345d6fb9--

.
