220 26296 <CANh-dXkYYpdDk7Xjegr7Byu1BpWE-ZiaCyyV_EMS-4=2nW1iDw@mail.gmail.com> article
Path: news.gmane.org!not-for-mail
From: "'Jeffrey Yasskin' via ISO C++ Standard - Future Proposals" <std-proposals@isocpp.org>
Newsgroups: gmane.comp.lang.c++.isocpp.proposals
Subject: Re: Any interest to adding audio support to the std library?
Date: Sun, 12 Jun 2016 05:20:36 -0700
Lines: 883
Approved: news@gmane.org
Message-ID: <CANh-dXkYYpdDk7Xjegr7Byu1BpWE-ZiaCyyV_EMS-4=2nW1iDw@mail.gmail.com>
References: <f490fd21-cf07-4d7b-8936-c71c97a1ab9d@isocpp.org>
	<CAFdMc-0Dj4BGW0v8ORrcgGM54D5_ZunT2At0OWFEDFr-3CYWBw@mail.gmail.com>
Reply-To: std-proposals@isocpp.org
NNTP-Posting-Host: plane.gmane.org
Mime-Version: 1.0
Content-Type: multipart/alternative; boundary=001a11490eb69953ee053513ccfb
X-Trace: ger.gmane.org 1465734043 28050 80.91.229.3 (12 Jun 2016 12:20:43 GMT)
X-Complaints-To: usenet@ger.gmane.org
NNTP-Posting-Date: Sun, 12 Jun 2016 12:20:43 +0000 (UTC)
To: std-proposals@isocpp.org
Original-X-From: std-proposals+bncBDDM34EO6QDRBFNH6W5AKGQEJR6ZHHY@isocpp.org Sun Jun 12 14:20:43 2016
Return-path: <std-proposals+bncBDDM34EO6QDRBFNH6W5AKGQEJR6ZHHY@isocpp.org>
Envelope-to: gclcip-std-proposals@m.gmane.org
Original-Received: from mail-io0-f199.google.com ([209.85.223.199])
	by plane.gmane.org with esmtp (Exim 4.69)
	(envelope-from <std-proposals+bncBDDM34EO6QDRBFNH6W5AKGQEJR6ZHHY@isocpp.org>)
	id 1bC4Nb-0005UM-OO
	for gclcip-std-proposals@m.gmane.org; Sun, 12 Jun 2016 14:20:40 +0200
Original-Received: by mail-io0-f199.google.com with SMTP id 5sf169876334ioy.2
        for <gclcip-std-proposals@m.gmane.org>; Sun, 12 Jun 2016 05:20:39 -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:date:message-id:subject:from: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=TC4qmHy+HZTFrKGL55lU7+LozgUoZEmFojymppfYubU=;
        b=zUSywk9nXyNM2r3fh8OH23mdkWURIWsqd8DcB1y5uuxWIZR0Pq71aAblY6yzwa8/gc
         ssFhIOpvFHigApv7gVwKx6dp1BzFFKWdxpkgb5t2Ai56wpIGCyIvfC7Jm5uo7fuRBEZc
         MQiDZXGHi1JNPbyGhC8HYB9cL2bpVcRG1VyFyxhvEw9a18Avv+iRNwAARRGUMeosE0k4
         jQxnN6H24dXAozKs42JFasrJt9qkbo5xH7q1dMJdH6nW0/OnU1clHTmA/tDnfjdKeySB
         fSdMUZmlvLmxJQdREFjr5SOz0QgzIIzPAoiTdEvbB+3moxciRAM6S2LmORHo/SYzXvuE
         8fEw==
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:date
         :message-id:subject:from: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=TC4qmHy+HZTFrKGL55lU7+LozgUoZEmFojymppfYubU=;
        b=ItejMCFAjnS0RddaK4w5oF/dpZ83+BwRf3M1ApDN2vNM0RuT7TVLXT8Lospw1jJbTq
         GbJKJeP4SPaoF+LAv0v5dTsCxk6DBhNHC0U2SLlXlVvksDluycOP9lMCS+rndOIgyp6a
         FwFOSudJ/xlTPV5ReFaQgKKVw2c7LNnWOJcyhkVP08Mo1A6/bZldn6LgiuUIvJ7p8vfF
         nx9CiqVbz2QYs3DfD54l/fO92kB0rQKzh8FF9XTy1rr4oQyATvYSgOqTJ33m7bXbk7FG
         a1h0kwo0PBNp9y+/KUb6Dz8euZDAoejVlnzJzWRG46k80kZgaBCPnoGhGDWgdapU1zm0
         SocA==
X-Gm-Message-State: ALyK8tKC8bwLblOH9BLd3KyCkGKxf1IncR1Dlxc44TuvN/L/hh1KVHAkOmi62ZHCFePcsw==
X-Received: by 10.36.50.75 with SMTP id j72mr6349170ita.4.1465734038365;
        Sun, 12 Jun 2016 05:20:38 -0700 (PDT)
X-BeenThere: std-proposals@isocpp.org
Original-Received: by 10.107.145.6 with SMTP id t6ls455714iod.24.gmail; Sun, 12 Jun
 2016 05:20:37 -0700 (PDT)
X-Received: by 10.107.144.134 with SMTP id s128mr15216160iod.165.1465734037280;
        Sun, 12 Jun 2016 05:20:37 -0700 (PDT)
Original-Received: from mail-io0-x231.google.com (mail-io0-x231.google.com. [2607:f8b0:4001:c06::231])
        by mx.google.com with ESMTPS id c18si7407233itc.77.2016.06.12.05.20.37
        for <std-proposals@isocpp.org>
        (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
        Sun, 12 Jun 2016 05:20:37 -0700 (PDT)
Received-SPF: pass (google.com: domain of jyasskin@google.com designates 2607:f8b0:4001:c06::231 as permitted sender) client-ip=2607:f8b0:4001:c06::231;
Original-Received: by mail-io0-x231.google.com with SMTP id d2so12737530iof.0
        for <std-proposals@isocpp.org>; Sun, 12 Jun 2016 05:20:37 -0700 (PDT)
X-Received: by 10.107.149.66 with SMTP id x63mr15426053iod.141.1465734036780;
 Sun, 12 Jun 2016 05:20:36 -0700 (PDT)
Original-Received: by 10.64.225.228 with HTTP; Sun, 12 Jun 2016 05:20:36 -0700 (PDT)
Original-Received: by 10.64.225.228 with HTTP; Sun, 12 Jun 2016 05:20:36 -0700 (PDT)
In-Reply-To: <CAFdMc-0Dj4BGW0v8ORrcgGM54D5_ZunT2At0OWFEDFr-3CYWBw@mail.gmail.com>
X-Original-Sender: jyasskin@google.com
X-Original-Authentication-Results: mx.google.com;       dkim=pass
 header.i=@google.com;       spf=pass (google.com: domain of
 jyasskin@google.com designates 2607:f8b0:4001:c06::231 as permitted sender)
 smtp.mailfrom=jyasskin@google.com;       dmarc=pass (p=REJECT dis=NONE) header.from=google.com
X-Original-From: Jeffrey Yasskin <jyasskin@google.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:26296
Archived-At: <http://permalink.gmane.org/gmane.comp.lang.c++.isocpp.proposals/26296>

--001a11490eb69953ee053513ccfb
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

It doesn't have to go through boost, but I would like to see a public
repository with a bunch of users.

On Jun 12, 2016 5:00 AM, "dgutson ." <danielgutson@gmail.com> wrote:

> Sorry top posting or if this has been already pointed.
> Is there any reason this hasn't been submitted to Boost and let it mature
> there for few years?
> El 3/6/2016 6:37, <alexander.zywicki@gmail.com> escribi=C3=B3:
>
>> 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, bu=
t
>> with the recent trend towards implementing a file-system library and
>> possibly a graphics library I believe that audio would not be too much o=
f 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 =3D 44100;
>>     std::size_t frame_size =3D2;
>>     std::size_t buffer_size=3D128;
>>
>>     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 =3D 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=3D0.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 =3D ctx.borrow_buffer();
>>         input>>buff;
>>         for(auto&& frame: buff){
>>             frame*=3D0.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 =3D ctx.borrow_buffer();
>>         input>>buff;
>>         for(auto&& frame: buff){
>>             frame*=3D2.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 =3D ctx.borrow_buffer();
>>         input>>buff;
>>         for(auto&& frame: buff){
>>             frame=3D0.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 =3D ctx.default_device_id();
>>     std::iastream input_device =3D ctx.get_device<std::input_device>(
>> device_id);
>>     std::oastream output_device =3D 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 =3D 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+=3Dbuff2;//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 define=
d
>> by the context, when applied to routing on a porocess tied to the contex=
t
>>         *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 =3D N *=
 M
>>          *ideally frame_buffers representation of its sample data will b=
e
>> 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 Group=
s
>> "ISO C++ Standard - Future Proposals" group.
>> To unsubscribe from this group and stop receiving emails from it, send a=
n
>> 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-cf=
07-4d7b-8936-c71c97a1ab9d%40isocpp.org
>> <https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/f490fd21-c=
f07-4d7b-8936-c71c97a1ab9d%40isocpp.org?utm_medium=3Demail&utm_source=3Dfoo=
ter>
>> .
>>
> --
> 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/CAFdMc-0Dj4B=
GW0v8ORrcgGM54D5_ZunT2At0OWFEDFr-3CYWBw%40mail.gmail.com
> <https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CAFdMc-0Dj4=
BGW0v8ORrcgGM54D5_ZunT2At0OWFEDFr-3CYWBw%40mail.gmail.com?utm_medium=3Demai=
l&utm_source=3Dfooter>
> .
>

--=20
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 e=
mail 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/CANh-dXkYYpdDk7Xjegr7Byu1BpWE-ZiaCyyV_EMS-4%3D2n=
W1iDw%40mail.gmail.com.

--001a11490eb69953ee053513ccfb
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<p dir=3D"ltr">It doesn&#39;t have to go through boost, but I would like to=
 see a public repository with a bunch of users.</p>
<div class=3D"gmail_extra"><br><div class=3D"gmail_quote">On Jun 12, 2016 5=
:00 AM, &quot;dgutson .&quot; &lt;<a href=3D"mailto:danielgutson@gmail.com"=
>danielgutson@gmail.com</a>&gt; wrote:<br type=3D"attribution"><blockquote =
class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid=
;padding-left:1ex"><p dir=3D"ltr">Sorry top posting or if this has been alr=
eady pointed.<br>
Is there any reason this hasn&#39;t been submitted to Boost and let it matu=
re there for few years?</p>
<div class=3D"gmail_quote">El 3/6/2016 6:37,  &lt;<a href=3D"mailto:alexand=
er.zywicki@gmail.com" target=3D"_blank">alexander.zywicki@gmail.com</a>&gt;=
 escribi=C3=B3:<br type=3D"attribution"><blockquote class=3D"gmail_quote" s=
tyle=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div=
 dir=3D"ltr">I have drafted some ideas on how I think the c++ std library c=
ould support audio functionality. <br><br>I know that audio functionality i=
s a very operating specific problem, but with the recent trend towards impl=
ementing a file-system library and possibly a graphics library I believe th=
at 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 usa=
ge as well as a list of the types needed to implement the given examples.<b=
r><br>Please keep in mind my drafts are still very rough.<br><br><br>CODE E=
XAMPLES<br><br><div style=3D"background-color: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:#800">//std::audio example 1 &quot;single =
process&quot;</span><span style=3D"color:#000"><br></span><span style=3D"co=
lor:#008">void</span><span style=3D"color:#000"> example_1</span><span styl=
e=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</sp=
an><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">4=
4100</span><span style=3D"color:#660">;</span><span style=3D"color:#000"><b=
r>=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</sp=
an><span style=3D"color:#066">2</span><span style=3D"color:#660">;</span><s=
pan 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 sty=
le=3D"color:#660">=3D</span><span style=3D"color:#066">128</span><span styl=
e=3D"color:#660">;</span><span style=3D"color:#000"><br><br>=C2=A0 =C2=A0 s=
td</span><span style=3D"color:#660">::</span><span style=3D"color:#000">aud=
io_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><br><br><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" 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>
</blockquote></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" 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/CAFdMc-0Dj4BGW0v8ORrcgGM54D5_ZunT2At0=
OWFEDFr-3CYWBw%40mail.gmail.com?utm_medium=3Demail&amp;utm_source=3Dfooter"=
 target=3D"_blank">https://groups.google.com/a/isocpp.org/d/msgid/std-propo=
sals/CAFdMc-0Dj4BGW0v8ORrcgGM54D5_ZunT2At0OWFEDFr-3CYWBw%40mail.gmail.com</=
a>.<br>
</blockquote></div></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/CANh-dXkYYpdDk7Xjegr7Byu1BpWE-ZiaCyyV=
_EMS-4%3D2nW1iDw%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfooter">h=
ttps://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CANh-dXkYYpdDk7=
Xjegr7Byu1BpWE-ZiaCyyV_EMS-4%3D2nW1iDw%40mail.gmail.com</a>.<br />

--001a11490eb69953ee053513ccfb--

.
